@@ -5,8 +5,10 @@ import (
55 "encoding/json"
66 "fmt"
77 "io"
8+ "maps"
89 "os"
910 "os/exec"
11+ "slices"
1012 "strings"
1113
1214 openapi2mcp "github.com/evcc-io/openapi-mcp"
@@ -71,6 +73,7 @@ func writeMarkdownDocFromSummaries(path string, summaries []map[string]any, doc
7173 return err
7274 }
7375 defer f .Close ()
76+
7477 f .WriteString ("# MCP Tools Documentation\n \n " )
7578 if doc .Info != nil {
7679 f .WriteString (fmt .Sprintf ("**API Title:** %s\n \n " , doc .Info .Title ))
@@ -79,39 +82,47 @@ func writeMarkdownDocFromSummaries(path string, summaries []map[string]any, doc
7982 f .WriteString (doc .Info .Description + "\n \n " )
8083 }
8184 }
85+
8286 for _ , m := range summaries {
8387 name , _ := m ["name" ].(string )
8488 desc , _ := m ["description" ].(string )
8589 tags , _ := m ["tags" ].([]any )
8690 inputSchema , _ := m ["inputSchema" ].(map [string ]any )
91+
8792 f .WriteString (fmt .Sprintf ("## %s\n \n " , name ))
8893 if desc != "" {
8994 f .WriteString (desc + "\n \n " )
9095 }
96+
97+ // Tags
9198 if len (tags ) > 0 {
9299 tagStrs := make ([]string , len (tags ))
93100 for i , t := range tags {
94101 tagStrs [i ], _ = t .(string )
95102 }
96103 f .WriteString (fmt .Sprintf ("**Tags:** %s\n \n " , strings .Join (tagStrs , ", " )))
97104 }
105+
98106 // Arguments
99107 props , _ := inputSchema ["properties" ].(map [string ]any )
108+ propsOrder := slices .Sorted (maps .Keys (props ))
109+
100110 if len (props ) > 0 {
101111 f .WriteString ("**Arguments:**\n \n " )
102112 f .WriteString ("| Name | Type | Description |\n |------|------|-------------|\n " )
103- for name , v := range props {
104- vmap , _ := v .(map [string ]any )
113+ for _ , name := range propsOrder {
114+ vmap , _ := props [ name ] .(map [string ]any )
105115 typeStr , _ := vmap ["type" ].(string )
106116 desc , _ := vmap ["description" ].(string )
107117 f .WriteString (fmt .Sprintf ("| %s | %s | %s |\n " , name , typeStr , desc ))
108118 }
109119 f .WriteString ("\n " )
110120 }
121+
111122 // Example call (best effort)
112123 example := map [string ]any {}
113- for name , v := range props {
114- vmap , _ := v .(map [string ]any )
124+ for _ , name := range propsOrder {
125+ vmap , _ := props [ name ] .(map [string ]any )
115126 typeStr , _ := vmap ["type" ].(string )
116127 descStr , _ := vmap ["description" ].(string )
117128 if typeStr == "string" && strings .Contains (strings .ToLower (descStr ), "integer" ) {
@@ -131,6 +142,7 @@ func writeMarkdownDocFromSummaries(path string, summaries []map[string]any, doc
131142 example [name ] = "..."
132143 }
133144 }
145+
134146 if len (example ) > 0 {
135147 exampleJSON , _ := json .MarshalIndent (example , "" , " " )
136148 f .WriteString ("**Example call:**\n \n " )
0 commit comments