react-docs-mcp 1.0.6 → 1.2.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/README.md +20 -0
- package/dist/config.d.ts +47 -15
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +25 -31
- package/dist/config.js.map +1 -1
- package/dist/docsManager.d.ts +11 -1
- package/dist/docsManager.d.ts.map +1 -1
- package/dist/docsManager.js +55 -5
- package/dist/docsManager.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -266
- package/dist/index.js.map +1 -1
- package/dist/markdownParser.d.ts +9 -0
- package/dist/markdownParser.d.ts.map +1 -1
- package/dist/markdownParser.js +14 -8
- package/dist/markdownParser.js.map +1 -1
- package/dist/presets/reactDocs.d.ts +7 -0
- package/dist/presets/reactDocs.d.ts.map +1 -0
- package/dist/presets/reactDocs.js +44 -0
- package/dist/presets/reactDocs.js.map +1 -0
- package/dist/presets/reactNativeDocs.d.ts +21 -0
- package/dist/presets/reactNativeDocs.d.ts.map +1 -0
- package/dist/presets/reactNativeDocs.js +51 -0
- package/dist/presets/reactNativeDocs.js.map +1 -0
- package/dist/presets/searchDefaults.d.ts +9 -0
- package/dist/presets/searchDefaults.d.ts.map +1 -0
- package/dist/presets/searchDefaults.js +16 -0
- package/dist/presets/searchDefaults.js.map +1 -0
- package/dist/searchEngine.d.ts +6 -4
- package/dist/searchEngine.d.ts.map +1 -1
- package/dist/searchEngine.js +25 -10
- package/dist/searchEngine.js.map +1 -1
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +283 -0
- package/dist/server.js.map +1 -0
- package/package.json +1 -1
package/dist/searchEngine.js
CHANGED
|
@@ -2,9 +2,25 @@
|
|
|
2
2
|
* searchEngine.ts
|
|
3
3
|
* Implement search functionality over documentation
|
|
4
4
|
*/
|
|
5
|
-
import { parseMarkdown } from './markdownParser.js';
|
|
5
|
+
import { parseMarkdown, normalizePath } from './markdownParser.js';
|
|
6
6
|
import { EmbeddingService } from './embeddingService.js';
|
|
7
7
|
import CONFIG from './config.js';
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the canonical slug for a doc: Docusaurus-style sites route by
|
|
10
|
+
* frontmatter `id` when present, overriding the file-path-derived slug.
|
|
11
|
+
* Returns the path unchanged for missing/non-string ids.
|
|
12
|
+
*/
|
|
13
|
+
export function resolveDocSlug(path, id) {
|
|
14
|
+
if (typeof id !== 'string' || id.length === 0) {
|
|
15
|
+
return path;
|
|
16
|
+
}
|
|
17
|
+
if (id.includes('/')) {
|
|
18
|
+
return id;
|
|
19
|
+
}
|
|
20
|
+
const parts = path.split('/');
|
|
21
|
+
parts[parts.length - 1] = id;
|
|
22
|
+
return parts.join('/');
|
|
23
|
+
}
|
|
8
24
|
export class SearchEngine {
|
|
9
25
|
docsManager;
|
|
10
26
|
embeddingService;
|
|
@@ -31,6 +47,11 @@ export class SearchEngine {
|
|
|
31
47
|
try {
|
|
32
48
|
const content = await this.docsManager.readDoc(docPath);
|
|
33
49
|
const parsedDoc = await parseMarkdown(content, docPath);
|
|
50
|
+
// For Docusaurus-style docs, the frontmatter id IS the live URL slug —
|
|
51
|
+
// key the index by it so paths, URLs, and get_doc lookups all agree
|
|
52
|
+
if (CONFIG.docUrl.useFrontmatterId) {
|
|
53
|
+
parsedDoc.path = resolveDocSlug(parsedDoc.path, parsedDoc.metadata.id);
|
|
54
|
+
}
|
|
34
55
|
this.documentIndex.set(parsedDoc.path, parsedDoc);
|
|
35
56
|
}
|
|
36
57
|
catch (error) {
|
|
@@ -38,6 +59,8 @@ export class SearchEngine {
|
|
|
38
59
|
}
|
|
39
60
|
}
|
|
40
61
|
this.indexed = true;
|
|
62
|
+
// Rebuilt ParsedDocs have no .embedding — force regeneration on next semantic search
|
|
63
|
+
this.embeddingsGenerated = false;
|
|
41
64
|
console.log(`Indexed ${this.documentIndex.size} documents`);
|
|
42
65
|
}
|
|
43
66
|
/**
|
|
@@ -230,15 +253,7 @@ export class SearchEngine {
|
|
|
230
253
|
if (!this.indexed) {
|
|
231
254
|
await this.indexDocuments();
|
|
232
255
|
}
|
|
233
|
-
|
|
234
|
-
const normalizedPath = path.replace(/\.md$/, '');
|
|
235
|
-
return this.documentIndex.get(normalizedPath) || null;
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* List all available sections
|
|
239
|
-
*/
|
|
240
|
-
getSections() {
|
|
241
|
-
return [...CONFIG.sections];
|
|
256
|
+
return this.documentIndex.get(normalizePath(path)) || null;
|
|
242
257
|
}
|
|
243
258
|
/**
|
|
244
259
|
* Get all documents in a section
|
package/dist/searchEngine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchEngine.js","sourceRoot":"","sources":["../src/searchEngine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"searchEngine.js","sourceRoot":"","sources":["../src/searchEngine.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgCH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA8SlD"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* server.ts
|
|
3
|
+
* Builds and runs the MCP server against the currently active CONFIG.
|
|
4
|
+
* Call configure() with the desired preset before createServer().
|
|
5
|
+
*/
|
|
6
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
7
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
8
|
+
import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { DocsManager } from './docsManager.js';
|
|
11
|
+
import { SearchEngine } from './searchEngine.js';
|
|
12
|
+
import { summarizeContent, extractStructure } from './summarizer.js';
|
|
13
|
+
import { titleCase } from './markdownParser.js';
|
|
14
|
+
import CONFIG from './config.js';
|
|
15
|
+
function escapeRegExp(literal) {
|
|
16
|
+
return literal.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Build the public doc URL for a parsed document. doc.path is already the
|
|
20
|
+
* canonical slug: for useFrontmatterId presets, SearchEngine resolves the
|
|
21
|
+
* frontmatter id into the path at index time, so URLs, paths, and get_doc
|
|
22
|
+
* lookups all agree.
|
|
23
|
+
*/
|
|
24
|
+
function buildDocUrl(doc) {
|
|
25
|
+
return `${CONFIG.docUrl.base}/${doc.path}`;
|
|
26
|
+
}
|
|
27
|
+
export async function createServer() {
|
|
28
|
+
// Initialize components
|
|
29
|
+
const docsManager = new DocsManager();
|
|
30
|
+
const searchEngine = new SearchEngine(docsManager);
|
|
31
|
+
// Create MCP server
|
|
32
|
+
const server = new Server({
|
|
33
|
+
name: CONFIG.server.name,
|
|
34
|
+
version: CONFIG.server.version,
|
|
35
|
+
}, {
|
|
36
|
+
capabilities: {
|
|
37
|
+
resources: {},
|
|
38
|
+
tools: {},
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
// Tool input schemas
|
|
42
|
+
const searchDocsSchema = z.object({
|
|
43
|
+
query: z.string().describe('Search query string'),
|
|
44
|
+
section: z
|
|
45
|
+
.string()
|
|
46
|
+
.optional()
|
|
47
|
+
.refine(section => section === undefined || CONFIG.sections.includes(section), {
|
|
48
|
+
message: `Unknown section. Valid sections: ${CONFIG.sections.join(', ')}`,
|
|
49
|
+
})
|
|
50
|
+
.describe(`Filter by section (${CONFIG.sections.join(', ')})`),
|
|
51
|
+
limit: z.number().min(1).max(CONFIG.search.maxLimit).optional().describe('Maximum number of results'),
|
|
52
|
+
});
|
|
53
|
+
const getDocSchema = z.object({
|
|
54
|
+
path: z.string().describe(`Document path (e.g., "${CONFIG.pathExample}")`),
|
|
55
|
+
full: z.boolean().optional().describe('Return the full raw page content instead of a ~1500 char summary'),
|
|
56
|
+
});
|
|
57
|
+
const resourceUriRegex = new RegExp(`^${escapeRegExp(CONFIG.resourceUriScheme)}:\\/\\/(.+)$`);
|
|
58
|
+
// Register list resources handler
|
|
59
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
60
|
+
// Only advertise sections that exist in the checked-out docs — e.g. older
|
|
61
|
+
// versioned snapshots may predate a section like releases/
|
|
62
|
+
const existingSections = await docsManager.getExistingSections(CONFIG.sections);
|
|
63
|
+
return {
|
|
64
|
+
resources: existingSections.map(section => {
|
|
65
|
+
const override = CONFIG.sectionResourceOverrides?.[section];
|
|
66
|
+
return {
|
|
67
|
+
uri: `${CONFIG.resourceUriScheme}://${section}`,
|
|
68
|
+
name: override?.name ?? `${CONFIG.docsLabel} ${titleCase(section)} Documentation`,
|
|
69
|
+
description: override?.description ?? `${CONFIG.docsLabel} documentation for the ${section} section`,
|
|
70
|
+
mimeType: 'text/plain',
|
|
71
|
+
};
|
|
72
|
+
}),
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
// Register read resource handler
|
|
76
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
77
|
+
const uri = request.params.uri.toString();
|
|
78
|
+
// Parse URI: {resourceUriScheme}://{section}/{path}
|
|
79
|
+
const match = uri.match(resourceUriRegex);
|
|
80
|
+
if (!match) {
|
|
81
|
+
throw new Error(`Invalid resource URI: ${uri}`);
|
|
82
|
+
}
|
|
83
|
+
const resourcePath = match[1];
|
|
84
|
+
// If requesting just a section, list docs in that section
|
|
85
|
+
if (CONFIG.sections.includes(resourcePath)) {
|
|
86
|
+
const docs = await searchEngine.getDocsBySection(resourcePath);
|
|
87
|
+
const docList = docs
|
|
88
|
+
.map(doc => `- ${doc.metadata.title} (${doc.path})`)
|
|
89
|
+
.join('\n');
|
|
90
|
+
return {
|
|
91
|
+
contents: [
|
|
92
|
+
{
|
|
93
|
+
uri,
|
|
94
|
+
mimeType: 'text/plain',
|
|
95
|
+
text: `# ${resourcePath} Documentation\n\nAvailable documents:\n\n${docList}`,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// Otherwise, fetch specific document
|
|
101
|
+
const doc = await searchEngine.getDocByPath(resourcePath);
|
|
102
|
+
if (!doc) {
|
|
103
|
+
throw new Error(`Document not found: ${resourcePath}`);
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
contents: [
|
|
107
|
+
{
|
|
108
|
+
uri,
|
|
109
|
+
mimeType: 'text/markdown',
|
|
110
|
+
text: `# ${doc.metadata.title}\n\n${doc.content}`,
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
// Register list tools handler
|
|
116
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
117
|
+
return {
|
|
118
|
+
tools: [
|
|
119
|
+
{
|
|
120
|
+
name: CONFIG.searchToolName,
|
|
121
|
+
description: CONFIG.searchToolDescription,
|
|
122
|
+
inputSchema: {
|
|
123
|
+
type: 'object',
|
|
124
|
+
properties: {
|
|
125
|
+
query: {
|
|
126
|
+
type: 'string',
|
|
127
|
+
description: 'Search query string',
|
|
128
|
+
},
|
|
129
|
+
section: {
|
|
130
|
+
type: 'string',
|
|
131
|
+
description: `Filter by section (${CONFIG.sections.join(', ')})`,
|
|
132
|
+
enum: [...CONFIG.sections],
|
|
133
|
+
},
|
|
134
|
+
limit: {
|
|
135
|
+
type: 'number',
|
|
136
|
+
description: 'Maximum number of results',
|
|
137
|
+
minimum: 1,
|
|
138
|
+
maximum: CONFIG.search.maxLimit,
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
required: ['query'],
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
name: 'list_sections',
|
|
146
|
+
description: 'List all available documentation sections',
|
|
147
|
+
inputSchema: {
|
|
148
|
+
type: 'object',
|
|
149
|
+
properties: {},
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: 'get_doc',
|
|
154
|
+
description: `Get a concise summary of a documentation page (~1500 chars), or the full raw page with full:true. Use ${CONFIG.searchToolName} first - only call this if you need more detail than the search snippet provides.`,
|
|
155
|
+
inputSchema: {
|
|
156
|
+
type: 'object',
|
|
157
|
+
properties: {
|
|
158
|
+
path: {
|
|
159
|
+
type: 'string',
|
|
160
|
+
description: `Document path (e.g., "${CONFIG.pathExample}")`,
|
|
161
|
+
},
|
|
162
|
+
full: {
|
|
163
|
+
type: 'boolean',
|
|
164
|
+
description: 'Return the full raw page content instead of a ~1500 char summary',
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
required: ['path'],
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
name: 'update_docs',
|
|
172
|
+
description: 'Pull latest documentation from Git repository',
|
|
173
|
+
inputSchema: {
|
|
174
|
+
type: 'object',
|
|
175
|
+
properties: {},
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
};
|
|
180
|
+
});
|
|
181
|
+
// Register call tool handler
|
|
182
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
183
|
+
const { name, arguments: args } = request.params;
|
|
184
|
+
try {
|
|
185
|
+
switch (name) {
|
|
186
|
+
case CONFIG.searchToolName: {
|
|
187
|
+
const { query, section, limit } = searchDocsSchema.parse(args);
|
|
188
|
+
const results = await searchEngine.search(query, { section, limit });
|
|
189
|
+
return {
|
|
190
|
+
content: [
|
|
191
|
+
{
|
|
192
|
+
type: 'text',
|
|
193
|
+
text: JSON.stringify(results.map(r => ({
|
|
194
|
+
path: r.doc.path,
|
|
195
|
+
title: r.doc.metadata.title,
|
|
196
|
+
snippet: r.snippet,
|
|
197
|
+
score: r.score,
|
|
198
|
+
url: buildDocUrl(r.doc),
|
|
199
|
+
})), null, 2),
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
case 'list_sections': {
|
|
205
|
+
const sections = await docsManager.getExistingSections(CONFIG.sections);
|
|
206
|
+
return {
|
|
207
|
+
content: [
|
|
208
|
+
{
|
|
209
|
+
type: 'text',
|
|
210
|
+
text: JSON.stringify(sections, null, 2),
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
case 'get_doc': {
|
|
216
|
+
const { path, full } = getDocSchema.parse(args);
|
|
217
|
+
const doc = await searchEngine.getDocByPath(path);
|
|
218
|
+
if (!doc) {
|
|
219
|
+
throw new Error(`Document not found: ${path}`);
|
|
220
|
+
}
|
|
221
|
+
const body = full
|
|
222
|
+
? { content: doc.content, note: 'Full page content.' }
|
|
223
|
+
: {
|
|
224
|
+
summary: summarizeContent(doc.content, 1500),
|
|
225
|
+
structure: extractStructure(doc.content),
|
|
226
|
+
note: 'This is a summary. Pass full:true for the complete page, or visit the URL.',
|
|
227
|
+
};
|
|
228
|
+
return {
|
|
229
|
+
content: [
|
|
230
|
+
{
|
|
231
|
+
type: 'text',
|
|
232
|
+
text: JSON.stringify({
|
|
233
|
+
path: doc.path,
|
|
234
|
+
section: doc.section,
|
|
235
|
+
title: doc.metadata.title,
|
|
236
|
+
description: doc.metadata.description,
|
|
237
|
+
...body,
|
|
238
|
+
url: buildDocUrl(doc),
|
|
239
|
+
}, null, 2),
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
case 'update_docs': {
|
|
245
|
+
const updated = await docsManager.updateRepo();
|
|
246
|
+
if (updated) {
|
|
247
|
+
// Re-index documents after update
|
|
248
|
+
await searchEngine.indexDocuments();
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
content: [
|
|
252
|
+
{
|
|
253
|
+
type: 'text',
|
|
254
|
+
text: JSON.stringify({
|
|
255
|
+
updated,
|
|
256
|
+
message: updated
|
|
257
|
+
? 'Documentation updated successfully'
|
|
258
|
+
: 'Documentation already up to date',
|
|
259
|
+
}, null, 2),
|
|
260
|
+
},
|
|
261
|
+
],
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
default:
|
|
265
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
if (error instanceof z.ZodError) {
|
|
270
|
+
throw new Error(`Invalid arguments: ${error.message}`);
|
|
271
|
+
}
|
|
272
|
+
throw error;
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
console.error(`Initializing ${CONFIG.docsLabel} Docs MCP Server...`);
|
|
276
|
+
// Initialize repository
|
|
277
|
+
await docsManager.initialize();
|
|
278
|
+
// Start server with stdio transport
|
|
279
|
+
const transport = new StdioServerTransport();
|
|
280
|
+
await server.connect(transport);
|
|
281
|
+
console.error(`${CONFIG.docsLabel} Docs MCP Server running`);
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|