Skip to content

Commit 8ef3ec1

Browse files
committed
Docs: stable-sort properties
1 parent 8cabd57 commit 8ef3ec1

1 file changed

Lines changed: 16 additions & 4 deletions

File tree

cmd/openapi-mcp/doc.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)