@speakeasy-api/docs-mcp-server 0.1.0
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.
- package/LICENSE +661 -0
- package/README.md +46 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +283 -0
- package/dist/bin.js.map +1 -0
- package/dist/http.d.ts +13 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +191 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/schema.d.ts +4 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +53 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +156 -0
- package/dist/server.js.map +1 -0
- package/dist/stdio.d.ts +7 -0
- package/dist/stdio.d.ts.map +1 -0
- package/dist/stdio.js +31 -0
- package/dist/stdio.js.map +1 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,QAAwB;IAC5D,MAAM,UAAU,GAA4B;QAC1C,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,+DAA+D;SAC7E;QACD,KAAK,EAAE;YACL,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,qDAAqD;YAClE,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE;SACZ;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,mFAAmF;SACtF;KACF,CAAC;IAEF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,UAAU,CAAC,GAAG,CAAC,GAAG;YAChB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,qBAAqB,GAAG,GAAG;YAC7D,IAAI,EAAE,KAAK,CAAC,MAAM;SACnB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,oBAAoB,EAAE,KAAK;QAC3B,UAAU;QACV,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,oBAAoB,EAAE,KAAK;QAC3B,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,iHAAiH;aACpH;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,SAAS;gBACf,WAAW,EACT,uFAAuF;gBACzF,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;aACX;SACF;QACD,QAAQ,EAAE,CAAC,UAAU,CAAC;KACvB,CAAC;AACJ,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CorpusMetadata, RrfWeights, SearchEngine } from "@speakeasy-api/docs-mcp-core";
|
|
2
|
+
import type { CallToolResult, ToolDefinition } from "./types.js";
|
|
3
|
+
export interface McpDocsServerOptions {
|
|
4
|
+
index: SearchEngine;
|
|
5
|
+
metadata: CorpusMetadata;
|
|
6
|
+
toolPrefix?: string;
|
|
7
|
+
rrfWeights?: RrfWeights;
|
|
8
|
+
}
|
|
9
|
+
export declare class McpDocsServer {
|
|
10
|
+
private readonly index;
|
|
11
|
+
private readonly metadata;
|
|
12
|
+
private readonly rrfWeights;
|
|
13
|
+
private readonly searchToolName;
|
|
14
|
+
private readonly getDocToolName;
|
|
15
|
+
constructor(options: McpDocsServerOptions);
|
|
16
|
+
getTools(): ToolDefinition[];
|
|
17
|
+
callTool(name: string, args: unknown): Promise<CallToolResult>;
|
|
18
|
+
private handleSearchDocs;
|
|
19
|
+
private handleGetDoc;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,YAAY,EAGb,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,OAAO,EAAE,oBAAoB;IASzC,QAAQ,IAAI,cAAc,EAAE;IAgBtB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;YAYtD,gBAAgB;YAahB,YAAY;CAY3B"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { buildGetDocSchema, buildSearchDocsSchema } from "./schema.js";
|
|
2
|
+
export class McpDocsServer {
|
|
3
|
+
index;
|
|
4
|
+
metadata;
|
|
5
|
+
rrfWeights;
|
|
6
|
+
searchToolName;
|
|
7
|
+
getDocToolName;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.index = options.index;
|
|
10
|
+
this.metadata = options.metadata;
|
|
11
|
+
this.rrfWeights = options.rrfWeights;
|
|
12
|
+
const prefix = options.toolPrefix;
|
|
13
|
+
this.searchToolName = prefix ? `${prefix}_search_docs` : "search_docs";
|
|
14
|
+
this.getDocToolName = prefix ? `${prefix}_get_doc` : "get_doc";
|
|
15
|
+
}
|
|
16
|
+
getTools() {
|
|
17
|
+
return [
|
|
18
|
+
{
|
|
19
|
+
name: this.searchToolName,
|
|
20
|
+
description: `Search ${this.metadata.corpus_description} with one hybrid query. Exact identifiers match lexically; conceptual phrasing matches semantically. Apply any known schema-enum filters for precision.`,
|
|
21
|
+
inputSchema: buildSearchDocsSchema(this.metadata)
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: this.getDocToolName,
|
|
25
|
+
description: "Retrieve the full content of a specific documentation chunk using its chunk_id. You can optionally request surrounding context within the same file.",
|
|
26
|
+
inputSchema: buildGetDocSchema()
|
|
27
|
+
}
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
async callTool(name, args) {
|
|
31
|
+
if (name === this.searchToolName) {
|
|
32
|
+
return this.handleSearchDocs(args);
|
|
33
|
+
}
|
|
34
|
+
if (name === this.getDocToolName) {
|
|
35
|
+
return this.handleGetDoc(args);
|
|
36
|
+
}
|
|
37
|
+
return errorResult(`Unknown tool '${name}'.`);
|
|
38
|
+
}
|
|
39
|
+
async handleSearchDocs(args) {
|
|
40
|
+
try {
|
|
41
|
+
const request = parseSearchRequest(args, this.metadata, this.rrfWeights);
|
|
42
|
+
const result = await this.index.search(request);
|
|
43
|
+
return {
|
|
44
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
45
|
+
isError: false
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
return errorResult(error instanceof Error ? error.message : "search_docs failed");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async handleGetDoc(args) {
|
|
53
|
+
try {
|
|
54
|
+
const request = parseGetDocRequest(args);
|
|
55
|
+
const result = await this.index.getDoc(request);
|
|
56
|
+
return {
|
|
57
|
+
content: [{ type: "text", text: result.text }],
|
|
58
|
+
isError: false
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return errorResult(error instanceof Error ? error.message : "get_doc failed");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function parseSearchRequest(args, metadata, rrfWeights) {
|
|
67
|
+
if (!args || typeof args !== "object") {
|
|
68
|
+
throw new Error("search_docs input must be an object");
|
|
69
|
+
}
|
|
70
|
+
const input = args;
|
|
71
|
+
const taxonomyKeys = Object.keys(metadata.taxonomy);
|
|
72
|
+
assertAllowedKeys(input, ["query", "limit", "cursor", ...taxonomyKeys]);
|
|
73
|
+
const query = expectString(input.query, "query");
|
|
74
|
+
let limit = 10;
|
|
75
|
+
if (input.limit !== undefined) {
|
|
76
|
+
if (!Number.isInteger(input.limit)) {
|
|
77
|
+
throw new Error("limit must be an integer");
|
|
78
|
+
}
|
|
79
|
+
const parsedLimit = input.limit;
|
|
80
|
+
if (parsedLimit < 1 || parsedLimit > 50) {
|
|
81
|
+
throw new Error("limit must be between 1 and 50");
|
|
82
|
+
}
|
|
83
|
+
limit = parsedLimit;
|
|
84
|
+
}
|
|
85
|
+
const cursor = input.cursor === undefined ? undefined : expectString(input.cursor, "cursor");
|
|
86
|
+
const filters = {};
|
|
87
|
+
for (const key of taxonomyKeys) {
|
|
88
|
+
const value = input[key];
|
|
89
|
+
if (value === undefined) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const normalized = expectString(value, key);
|
|
93
|
+
const allowed = metadata.taxonomy[key]?.values ?? [];
|
|
94
|
+
if (!allowed.includes(normalized)) {
|
|
95
|
+
throw new Error(`Invalid taxonomy value for '${key}': '${normalized}'. Allowed values: ${allowed.join(", ")}`);
|
|
96
|
+
}
|
|
97
|
+
filters[key] = normalized;
|
|
98
|
+
}
|
|
99
|
+
const request = {
|
|
100
|
+
query,
|
|
101
|
+
limit,
|
|
102
|
+
filters,
|
|
103
|
+
taxonomy_keys: taxonomyKeys
|
|
104
|
+
};
|
|
105
|
+
if (cursor !== undefined) {
|
|
106
|
+
request.cursor = cursor;
|
|
107
|
+
}
|
|
108
|
+
if (rrfWeights) {
|
|
109
|
+
request.rrf_weights = rrfWeights;
|
|
110
|
+
}
|
|
111
|
+
return request;
|
|
112
|
+
}
|
|
113
|
+
function parseGetDocRequest(args) {
|
|
114
|
+
if (!args || typeof args !== "object") {
|
|
115
|
+
throw new Error("get_doc input must be an object");
|
|
116
|
+
}
|
|
117
|
+
const input = args;
|
|
118
|
+
assertAllowedKeys(input, ["chunk_id", "context"]);
|
|
119
|
+
const chunkId = expectString(input.chunk_id, "chunk_id");
|
|
120
|
+
let context = 0;
|
|
121
|
+
if (input.context !== undefined) {
|
|
122
|
+
if (!Number.isInteger(input.context)) {
|
|
123
|
+
throw new Error("context must be an integer");
|
|
124
|
+
}
|
|
125
|
+
const parsedContext = input.context;
|
|
126
|
+
if (parsedContext < 0 || parsedContext > 5) {
|
|
127
|
+
throw new Error("context must be between 0 and 5");
|
|
128
|
+
}
|
|
129
|
+
context = parsedContext;
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
chunk_id: chunkId,
|
|
133
|
+
context
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function expectString(value, fieldName) {
|
|
137
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
138
|
+
throw new Error(`${fieldName} must be a non-empty string`);
|
|
139
|
+
}
|
|
140
|
+
return value.trim();
|
|
141
|
+
}
|
|
142
|
+
function assertAllowedKeys(input, allowedKeys) {
|
|
143
|
+
const allowed = new Set(allowedKeys);
|
|
144
|
+
for (const key of Object.keys(input)) {
|
|
145
|
+
if (!allowed.has(key)) {
|
|
146
|
+
throw new Error(`Unexpected field '${key}'`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function errorResult(message) {
|
|
151
|
+
return {
|
|
152
|
+
content: [{ type: "text", text: message }],
|
|
153
|
+
isError: true
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/stdio.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { McpDocsServer } from "./server.js";
|
|
2
|
+
export interface StartStdioServerOptions {
|
|
3
|
+
name?: string;
|
|
4
|
+
version?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function startStdioServer(app: McpDocsServer, options?: StartStdioServerOptions): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=stdio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,aAAa,EAClB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
|
package/dist/stdio.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
const { version: PKG_VERSION } = require("../package.json");
|
|
7
|
+
export async function startStdioServer(app, options = {}) {
|
|
8
|
+
const server = new Server({
|
|
9
|
+
name: options.name ?? "@speakeasy-api/docs-mcp-server",
|
|
10
|
+
version: options.version ?? PKG_VERSION
|
|
11
|
+
}, {
|
|
12
|
+
capabilities: {
|
|
13
|
+
tools: {}
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
17
|
+
const tools = app.getTools().map((tool) => ({
|
|
18
|
+
name: tool.name,
|
|
19
|
+
description: tool.description,
|
|
20
|
+
inputSchema: tool.inputSchema
|
|
21
|
+
}));
|
|
22
|
+
return { tools };
|
|
23
|
+
});
|
|
24
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
25
|
+
const result = await app.callTool(request.params.name, request.params.arguments ?? {});
|
|
26
|
+
return result;
|
|
27
|
+
});
|
|
28
|
+
const transport = new StdioServerTransport();
|
|
29
|
+
await server.connect(transport);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EAGvB,MAAM,oCAAoC,CAAC;AAG5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAOnF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAkB,EAClB,UAAmC,EAAE;IAErC,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,gCAAgC;QACtD,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,WAAW;KACxC,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAA8D;SACjF,CAAC,CAAC,CAAC;QAEJ,OAAO,EAAE,KAAK,EAA4B,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QACvF,OAAO,MAAwB,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ToolDefinition {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
export interface TextContent {
|
|
7
|
+
type: "text";
|
|
8
|
+
text: string;
|
|
9
|
+
}
|
|
10
|
+
export interface CallToolResult {
|
|
11
|
+
content: TextContent[];
|
|
12
|
+
isError: boolean;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@speakeasy-api/docs-mcp-server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server runtime exposing hybrid search over documentation via HTTP and stdio transports",
|
|
5
|
+
"license": "AGPL-3.0-only",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"author": "Speakeasy <info@speakeasy.com> (https://speakeasy.com)",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/speakeasy-api/docs-mcp.git",
|
|
11
|
+
"directory": "packages/server"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://github.com/speakeasy-api/docs-mcp",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/speakeasy-api/docs-mcp/issues"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"bin": {
|
|
21
|
+
"docs-mcp-server": "dist/bin.js"
|
|
22
|
+
},
|
|
23
|
+
"main": "dist/index.js",
|
|
24
|
+
"types": "dist/index.d.ts",
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"import": "./dist/index.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=22.0.0"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
36
|
+
"commander": "^13.1.0",
|
|
37
|
+
"zod": "^4.3.6",
|
|
38
|
+
"@speakeasy-api/docs-mcp-core": "0.1.0"
|
|
39
|
+
},
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "tsc -p tsconfig.json",
|
|
42
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
43
|
+
"test": "vitest run",
|
|
44
|
+
"lint": "eslint src test"
|
|
45
|
+
}
|
|
46
|
+
}
|