swagger-doc-explorer-mcp 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/dist/constants.d.ts +3 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +3 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/formatters.d.ts +27 -0
  8. package/dist/formatters.d.ts.map +1 -0
  9. package/dist/formatters.js +163 -0
  10. package/dist/formatters.js.map +1 -0
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +72 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/services/swagger-service.d.ts +21 -0
  16. package/dist/services/swagger-service.d.ts.map +1 -0
  17. package/dist/services/swagger-service.js +339 -0
  18. package/dist/services/swagger-service.js.map +1 -0
  19. package/dist/tools/info.d.ts +3 -0
  20. package/dist/tools/info.d.ts.map +1 -0
  21. package/dist/tools/info.js +161 -0
  22. package/dist/tools/info.js.map +1 -0
  23. package/dist/tools/load-spec.d.ts +3 -0
  24. package/dist/tools/load-spec.d.ts.map +1 -0
  25. package/dist/tools/load-spec.js +278 -0
  26. package/dist/tools/load-spec.js.map +1 -0
  27. package/dist/tools/paths.d.ts +3 -0
  28. package/dist/tools/paths.d.ts.map +1 -0
  29. package/dist/tools/paths.js +216 -0
  30. package/dist/tools/paths.js.map +1 -0
  31. package/dist/tools/schemas.d.ts +3 -0
  32. package/dist/tools/schemas.d.ts.map +1 -0
  33. package/dist/tools/schemas.js +142 -0
  34. package/dist/tools/schemas.js.map +1 -0
  35. package/dist/tools/search.d.ts +3 -0
  36. package/dist/tools/search.d.ts.map +1 -0
  37. package/dist/tools/search.js +100 -0
  38. package/dist/tools/search.js.map +1 -0
  39. package/dist/types.d.ts +139 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +2 -0
  42. package/dist/types.js.map +1 -0
  43. package/package.json +58 -0
@@ -0,0 +1,339 @@
1
+ import axios, { AxiosError } from "axios";
2
+ import { readFile } from "fs/promises";
3
+ import { resolve } from "path";
4
+ import { HTTP_METHODS } from "../constants.js";
5
+ const specStore = new Map();
6
+ const METHOD_PRIORITY = {
7
+ get: 0,
8
+ post: 1,
9
+ put: 2,
10
+ patch: 3,
11
+ delete: 4,
12
+ options: 5,
13
+ head: 6,
14
+ };
15
+ function generateSpecName(title, version) {
16
+ const base = `${title} v${version}`;
17
+ let name = base;
18
+ let counter = 2;
19
+ while (specStore.has(name)) {
20
+ name = `${base} (${counter++})`;
21
+ }
22
+ return name;
23
+ }
24
+ export function isLoaded(name) {
25
+ return specStore.has(name);
26
+ }
27
+ export function getLoadedUrls() {
28
+ return Array.from(specStore.keys());
29
+ }
30
+ export function getSpecKeys() {
31
+ return Array.from(specStore.keys());
32
+ }
33
+ export function getSpec(name) {
34
+ return specStore.get(name);
35
+ }
36
+ export function removeSpec(name) {
37
+ return specStore.delete(name);
38
+ }
39
+ export async function loadSpecFromFile(filePath) {
40
+ const resolvedPath = resolve(filePath);
41
+ try {
42
+ const raw = await readFile(resolvedPath, "utf-8");
43
+ let data;
44
+ try {
45
+ data = JSON.parse(raw);
46
+ }
47
+ catch {
48
+ throw new Error(`Failed to parse "${resolvedPath}" as JSON. Ensure the file contains a valid JSON-formatted OpenAPI/Swagger spec.`);
49
+ }
50
+ if (!data.openapi && !data.swagger) {
51
+ throw new Error(`"${resolvedPath}" does not appear to be a valid OpenAPI/Swagger spec. The JSON must contain an 'openapi' or 'swagger' field.`);
52
+ }
53
+ const spec = data;
54
+ if (!spec.info) {
55
+ throw new Error("Invalid OpenAPI spec: missing 'info' field with title and version.");
56
+ }
57
+ spec.info.title = spec.info.title || "Untitled API";
58
+ spec.info.version = spec.info.version || "0.0.0";
59
+ spec.paths = spec.paths || {};
60
+ const name = generateSpecName(spec.info.title, spec.info.version);
61
+ const store = {
62
+ spec,
63
+ name,
64
+ source: resolvedPath,
65
+ loadedAt: new Date().toISOString(),
66
+ };
67
+ specStore.set(name, store);
68
+ return store;
69
+ }
70
+ catch (error) {
71
+ if (error instanceof Error && error.message.startsWith("ENOENT")) {
72
+ throw new Error(`File not found: "${resolvedPath}". Check that the path is correct.`);
73
+ }
74
+ throw error;
75
+ }
76
+ }
77
+ export async function loadSpec(url, authHeader) {
78
+ try {
79
+ const headers = {
80
+ Accept: "application/json, application/yaml, text/yaml, text/plain",
81
+ };
82
+ if (authHeader) {
83
+ headers["Authorization"] = authHeader;
84
+ }
85
+ const response = await axios.get(url, {
86
+ headers,
87
+ timeout: 30000,
88
+ responseType: "text",
89
+ });
90
+ let data;
91
+ const contentType = String(response.headers["content-type"] || "");
92
+ const raw = response.data;
93
+ if (contentType.includes("yaml") || contentType.includes("x-yaml") || typeof raw === "string" && (raw.trim().startsWith("openapi:") || raw.trim().startsWith("swagger:"))) {
94
+ throw new Error("YAML content detected but not supported. Please provide a JSON-formatted OpenAPI spec.");
95
+ }
96
+ if (typeof raw === "string") {
97
+ try {
98
+ data = JSON.parse(raw);
99
+ }
100
+ catch {
101
+ data = raw;
102
+ }
103
+ }
104
+ else {
105
+ data = raw;
106
+ }
107
+ if (!data.openapi && !data.swagger) {
108
+ throw new Error("The document does not appear to be a valid OpenAPI/Swagger spec. Ensure the URL returns a JSON document with 'openapi' or 'swagger' field.");
109
+ }
110
+ const spec = data;
111
+ if (!spec.info) {
112
+ throw new Error("Invalid OpenAPI spec: missing 'info' field with title and version.");
113
+ }
114
+ spec.info.title = spec.info.title || "Untitled API";
115
+ spec.info.version = spec.info.version || "0.0.0";
116
+ spec.paths = spec.paths || {};
117
+ const name = generateSpecName(spec.info.title, spec.info.version);
118
+ const store = {
119
+ spec,
120
+ name,
121
+ source: url,
122
+ loadedAt: new Date().toISOString(),
123
+ };
124
+ specStore.set(name, store);
125
+ return store;
126
+ }
127
+ catch (error) {
128
+ if (error instanceof AxiosError) {
129
+ if (error.code === "ECONNREFUSED") {
130
+ throw new Error(`Failed to connect to ${url}. Ensure the URL is correct and the server is accessible.`);
131
+ }
132
+ if (error.code === "ENOTFOUND") {
133
+ throw new Error(`DNS lookup failed for ${url}. Check the URL is spelled correctly.`);
134
+ }
135
+ if (error.response) {
136
+ const status = error.response.status;
137
+ if (status === 404) {
138
+ throw new Error(`Spec not found at ${url} (404). Verify the URL points to an existing OpenAPI JSON document.`);
139
+ }
140
+ if (status === 403) {
141
+ throw new Error(`Access denied to ${url} (403). You may need to provide an auth header.`);
142
+ }
143
+ throw new Error(`Failed to fetch spec from ${url}: HTTP ${status}`);
144
+ }
145
+ if (error.code === "ECONNABORTED") {
146
+ throw new Error(`Request to ${url} timed out. The server may be slow or unreachable.`);
147
+ }
148
+ }
149
+ if (error instanceof Error) {
150
+ throw error;
151
+ }
152
+ throw new Error(`Unexpected error loading spec from ${url}`);
153
+ }
154
+ }
155
+ export function getEndpoints(name, tag) {
156
+ const store = specStore.get(name);
157
+ if (!store)
158
+ return [];
159
+ const endpoints = [];
160
+ for (const [path, pathItem] of Object.entries(store.spec.paths)) {
161
+ for (const method of HTTP_METHODS) {
162
+ const operation = pathItem[method];
163
+ if (!operation)
164
+ continue;
165
+ if (tag && (!operation.tags || !operation.tags.includes(tag)))
166
+ continue;
167
+ endpoints.push({
168
+ path,
169
+ method: method,
170
+ summary: operation.summary || operation.operationId || `${method.toUpperCase()} ${path}`,
171
+ operationId: operation.operationId,
172
+ tags: operation.tags || [],
173
+ deprecated: operation.deprecated || false,
174
+ });
175
+ }
176
+ }
177
+ endpoints.sort((a, b) => {
178
+ if (a.path !== b.path)
179
+ return a.path.localeCompare(b.path);
180
+ return (METHOD_PRIORITY[a.method] ?? 99) - (METHOD_PRIORITY[b.method] ?? 99);
181
+ });
182
+ return endpoints;
183
+ }
184
+ export function getEndpointDetail(name, path, method) {
185
+ const store = specStore.get(name);
186
+ if (!store)
187
+ return null;
188
+ const pathItem = store.spec.paths[path];
189
+ if (!pathItem)
190
+ return null;
191
+ const operation = pathItem[method];
192
+ return operation || null;
193
+ }
194
+ export function getPathParameterNames(path) {
195
+ const matches = path.match(/\{(\w+)\}/g);
196
+ if (!matches)
197
+ return [];
198
+ return matches.map((m) => m.slice(1, -1));
199
+ }
200
+ export function getSchemas(name) {
201
+ const store = specStore.get(name);
202
+ if (!store)
203
+ return [];
204
+ const schemas = store.spec.components?.schemas || store.spec.definitions || {};
205
+ const result = [];
206
+ for (const [name, schema] of Object.entries(schemas)) {
207
+ const props = schema.properties ? Object.keys(schema.properties).length : 0;
208
+ result.push({
209
+ name,
210
+ type: schema.type || "object",
211
+ description: schema.description || schema.title,
212
+ properties: props,
213
+ });
214
+ }
215
+ result.sort((a, b) => a.name.localeCompare(b.name));
216
+ return result;
217
+ }
218
+ export function getSchemaDetail(name, schemaName) {
219
+ const store = specStore.get(name);
220
+ if (!store)
221
+ return null;
222
+ const schemas = store.spec.components?.schemas || store.spec.definitions || {};
223
+ return schemas[schemaName] || null;
224
+ }
225
+ export function getTags(name) {
226
+ const store = specStore.get(name);
227
+ if (!store)
228
+ return [];
229
+ const tagCounts = new Map();
230
+ for (const pathItem of Object.values(store.spec.paths)) {
231
+ for (const method of HTTP_METHODS) {
232
+ const operation = pathItem[method];
233
+ if (!operation?.tags)
234
+ continue;
235
+ for (const tag of operation.tags) {
236
+ tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);
237
+ }
238
+ }
239
+ }
240
+ return Array.from(tagCounts.entries())
241
+ .map(([name, count]) => ({ name, count }))
242
+ .sort((a, b) => a.name.localeCompare(b.name));
243
+ }
244
+ export function searchSpec(name, query) {
245
+ const store = specStore.get(name);
246
+ if (!store)
247
+ return [];
248
+ const results = [];
249
+ const lowerQuery = query.toLowerCase();
250
+ const schemas = store.spec.components?.schemas || store.spec.definitions || {};
251
+ for (const [path, pathItem] of Object.entries(store.spec.paths)) {
252
+ for (const method of HTTP_METHODS) {
253
+ const operation = pathItem[method];
254
+ if (!operation)
255
+ continue;
256
+ const searchText = [
257
+ path,
258
+ method,
259
+ operation.summary,
260
+ operation.operationId,
261
+ operation.description,
262
+ ...(operation.tags || []),
263
+ ]
264
+ .filter(Boolean)
265
+ .join(" ")
266
+ .toLowerCase();
267
+ if (searchText.includes(lowerQuery)) {
268
+ results.push({
269
+ type: "endpoint",
270
+ path,
271
+ method: method,
272
+ match: `${method.toUpperCase()} ${path}`,
273
+ summary: operation.summary || operation.operationId,
274
+ });
275
+ }
276
+ }
277
+ }
278
+ for (const [name, schema] of Object.entries(schemas)) {
279
+ const schemaSearchText = [name, schema.description, schema.title].filter(Boolean).join(" ").toLowerCase();
280
+ if (schemaSearchText.includes(lowerQuery)) {
281
+ results.push({
282
+ type: "schema",
283
+ schemaName: name,
284
+ match: `Schema: ${name}`,
285
+ summary: schema.description,
286
+ });
287
+ }
288
+ if (schema.properties) {
289
+ for (const [propName, propSchema] of Object.entries(schema.properties)) {
290
+ const propSearchText = [propName, propSchema.description].filter(Boolean).join(" ").toLowerCase();
291
+ if (propSearchText.includes(lowerQuery)) {
292
+ results.push({
293
+ type: "property",
294
+ schemaName: name,
295
+ propertyName: propName,
296
+ match: `Schema ${name} > ${propName}`,
297
+ summary: propSchema.description,
298
+ });
299
+ }
300
+ }
301
+ }
302
+ }
303
+ return results;
304
+ }
305
+ export function resolveRef(ref, name) {
306
+ const store = specStore.get(name);
307
+ if (!store)
308
+ return null;
309
+ const parts = ref.replace(/^#\//, "").split("/");
310
+ let current = store.spec;
311
+ for (const part of parts) {
312
+ if (current && typeof current === "object" && part in current) {
313
+ current = current[part];
314
+ }
315
+ else {
316
+ return null;
317
+ }
318
+ }
319
+ return current;
320
+ }
321
+ export function getServerUrl(name) {
322
+ const store = specStore.get(name);
323
+ if (!store)
324
+ return "";
325
+ const spec = store.spec;
326
+ if (spec.servers && spec.servers.length > 0) {
327
+ let baseUrl = spec.servers[0].url;
328
+ if (baseUrl.endsWith("/"))
329
+ baseUrl = baseUrl.slice(0, -1);
330
+ return baseUrl;
331
+ }
332
+ if (spec.host) {
333
+ const scheme = spec.schemes?.[0] || "https";
334
+ const basePath = spec.basePath || "";
335
+ return `${scheme}://${spec.host}${basePath}`;
336
+ }
337
+ return "";
338
+ }
339
+ //# sourceMappingURL=swagger-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger-service.js","sourceRoot":"","sources":["../../src/services/swagger-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerInfoTools(server: McpServer): void;
3
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/tools/info.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,QA0KlD"}
@@ -0,0 +1,161 @@
1
+ import { z } from "zod";
2
+ import { isLoaded, getSpec, getEndpoints, getSchemas, getTags, getServerUrl } from "../services/swagger-service.js";
3
+ export function registerInfoTools(server) {
4
+ server.registerTool("swagger_get_info", {
5
+ title: "Get API Info",
6
+ description: `Get general information about a loaded OpenAPI/Swagger specification, including title, version, description, server URL, contact info, and license.
7
+
8
+ Use this tool to get a high-level summary of an API spec.
9
+
10
+ Args:
11
+ - spec_name (string): Name of the previously loaded spec (use swagger_list_loaded to see available names)
12
+
13
+ Returns:
14
+ {
15
+ "title": string, // API title
16
+ "version": string, // API version
17
+ "description": string, // API description
18
+ "server_url": string, // Base server URL
19
+ "endpoints": number, // Total endpoint count
20
+ "schemas": number, // Total schema count
21
+ "tags": number, // Total tag count
22
+ "openapi_version": string // OpenAPI spec version
23
+ }
24
+
25
+ Examples:
26
+ - Use when: "Tell me about this API" -> params with spec_name="<name>"
27
+ - Use when: "What's the base URL for this API?" -> params with spec_name="<name>"
28
+
29
+ Error Handling:
30
+ - Returns error if the spec name has not been loaded`,
31
+ inputSchema: z.object({
32
+ spec_name: z.string().min(1).describe("Name of the previously loaded OpenAPI/Swagger spec (use swagger_list_loaded to see available names)"),
33
+ }).strict(),
34
+ annotations: {
35
+ readOnlyHint: true,
36
+ destructiveHint: false,
37
+ idempotentHint: true,
38
+ openWorldHint: false,
39
+ },
40
+ }, async (params) => {
41
+ try {
42
+ if (!isLoaded(params.spec_name)) {
43
+ return { content: [{ type: "text", text: `Error: Spec '${params.spec_name}' has not been loaded yet. Use swagger_load_spec to load it first.` }] };
44
+ }
45
+ const store = getSpec(params.spec_name);
46
+ if (!store)
47
+ return { content: [{ type: "text", text: "Error: Spec data not found in memory." }] };
48
+ const spec = store.spec;
49
+ const endpoints = getEndpoints(params.spec_name);
50
+ const schemas = getSchemas(params.spec_name);
51
+ const tags = getTags(params.spec_name);
52
+ const serverUrl = getServerUrl(params.spec_name);
53
+ const specVersion = spec.openapi || spec.swagger || "unknown";
54
+ const output = {
55
+ title: spec.info.title, version: spec.info.version,
56
+ description: spec.info.description || "", server_url: serverUrl,
57
+ endpoints: endpoints.length, schemas: schemas.length, tags: tags.length,
58
+ openapi_version: specVersion,
59
+ contact: spec.info.contact || null,
60
+ license: spec.info.license || null,
61
+ };
62
+ const lines = [
63
+ `# ${spec.info.title}`,
64
+ "",
65
+ `**Version**: ${spec.info.version}`,
66
+ `**OpenAPI Version**: ${specVersion}`,
67
+ `**Server**: \`${serverUrl || "Not specified"}\``,
68
+ "",
69
+ spec.info.description || "",
70
+ "",
71
+ "## Summary",
72
+ `- **Endpoints**: ${endpoints.length}`,
73
+ `- **Schemas**: ${schemas.length}`,
74
+ `- **Tags**: ${tags.length}`,
75
+ ];
76
+ const contact = spec.info.contact;
77
+ if (contact) {
78
+ lines.push("", "## Contact");
79
+ if (contact.name)
80
+ lines.push(`- **Name**: ${contact.name}`);
81
+ if (contact.email)
82
+ lines.push(`- **Email**: ${contact.email}`);
83
+ if (contact.url)
84
+ lines.push(`- **URL**: ${contact.url}`);
85
+ }
86
+ const license = spec.info.license;
87
+ if (license) {
88
+ lines.push("", "## License");
89
+ lines.push(`- **Name**: ${license.name}`);
90
+ if (license.url)
91
+ lines.push(`- **URL**: ${license.url}`);
92
+ }
93
+ return {
94
+ content: [{ type: "text", text: lines.join("\n") }],
95
+ structuredContent: output,
96
+ };
97
+ }
98
+ catch (error) {
99
+ return { content: [{ type: "text", text: error instanceof Error ? error.message : String(error) }] };
100
+ }
101
+ });
102
+ server.registerTool("swagger_list_tags", {
103
+ title: "List API Tags",
104
+ description: `List all API tags/groups and their associated endpoint counts from a loaded OpenAPI spec.
105
+
106
+ Tags are used to group related endpoints. This tool helps with progressive exploration by showing available filter categories.
107
+
108
+ Args:
109
+ - spec_name (string): Name of the previously loaded spec
110
+
111
+ Returns:
112
+ {
113
+ "tags": [{ "name": string, "count": number }]
114
+ }
115
+
116
+ Examples:
117
+ - Use when: "What tags/groups are available?" -> params with spec_name="<name>"
118
+ - Use when: "How are the endpoints organized?" -> params with spec_name="<name>"
119
+
120
+ Error Handling:
121
+ - Returns error if the spec name has not been loaded`,
122
+ inputSchema: z.object({
123
+ spec_name: z.string().min(1).describe("Name of the previously loaded OpenAPI/Swagger spec (use swagger_list_loaded to see available names)"),
124
+ }).strict(),
125
+ annotations: {
126
+ readOnlyHint: true,
127
+ destructiveHint: false,
128
+ idempotentHint: true,
129
+ openWorldHint: false,
130
+ },
131
+ }, async (params) => {
132
+ try {
133
+ if (!isLoaded(params.spec_name)) {
134
+ return { content: [{ type: "text", text: `Error: Spec '${params.spec_name}' has not been loaded yet. Use swagger_load_spec to load it first.` }] };
135
+ }
136
+ const tags = getTags(params.spec_name);
137
+ const store = getSpec(params.spec_name);
138
+ if (tags.length === 0) {
139
+ return { content: [{ type: "text", text: "No tags found in this spec. Endpoints may be untagged." }] };
140
+ }
141
+ const lines = [
142
+ `# ${store?.spec.info.title || "API"} - Tags`,
143
+ "",
144
+ "| Tag | Endpoints |",
145
+ "|-----|-----------|",
146
+ ];
147
+ for (const tag of tags) {
148
+ lines.push(`| \`${tag.name}\` | ${tag.count} |`);
149
+ }
150
+ lines.push("", "Use `swagger_list_paths` with a `tag` parameter to filter by group.");
151
+ return {
152
+ content: [{ type: "text", text: lines.join("\n") }],
153
+ structuredContent: { tags },
154
+ };
155
+ }
156
+ catch (error) {
157
+ return { content: [{ type: "text", text: error instanceof Error ? error.message : String(error) }] };
158
+ }
159
+ });
160
+ }
161
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/tools/info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerLoadSpecTools(server: McpServer): void;
3
+ //# sourceMappingURL=load-spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-spec.d.ts","sourceRoot":"","sources":["../../src/tools/load-spec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAyStD"}