react-docs-mcp 1.1.0 → 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 +19 -1
- package/dist/config.d.ts +6 -17
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -28
- 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 +51 -3
- package/dist/docsManager.js.map +1 -1
- package/dist/index.js +6 -0
- 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 +13 -7
- package/dist/markdownParser.js.map +1 -1
- package/dist/presets/reactDocs.d.ts.map +1 -1
- package/dist/presets/reactDocs.js +4 -10
- package/dist/presets/reactDocs.js.map +1 -1
- package/dist/presets/reactNativeDocs.d.ts +10 -8
- package/dist/presets/reactNativeDocs.d.ts.map +1 -1
- package/dist/presets/reactNativeDocs.js +41 -34
- package/dist/presets/reactNativeDocs.js.map +1 -1
- 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.map +1 -1
- package/dist/server.js +38 -36
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
AI-powered semantic search over React documentation for Claude, Cursor, and other MCP clients.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
> **📱 Also in this repo: [react-native-docs-mcp](https://www.npmjs.com/package/react-native-docs-mcp)** — the same engine, but for the official React Native docs (reactnative.dev). Source lives in [`packages/react-native-docs-mcp`](./packages/react-native-docs-mcp). Both packages share one search engine, so improvements land in both.
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
12
|
<img src="./demo.gif" width="100%" alt="React Docs MCP Demo">
|
|
@@ -56,6 +56,8 @@ Edit: `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
|
|
|
56
56
|
|
|
57
57
|
## Features
|
|
58
58
|
|
|
59
|
+
- **🔑 No API Key**: Unlike hosted docs services (Context7, GitMCP), everything runs on your machine — no account, no key, no rate limits
|
|
60
|
+
- **🔌 Works Offline**: Clones the official react.dev docs repo once, then searches locally — no network calls at query time
|
|
59
61
|
- **🔍 Semantic Search**: AI-powered search using embeddings for conceptual matches
|
|
60
62
|
- **⚡ Fast Results**: In-memory vector search with hybrid keyword+semantic ranking
|
|
61
63
|
- **📦 Zero Config**: Works with `npx` - no installation needed
|
|
@@ -127,6 +129,7 @@ Get a specific documentation page.
|
|
|
127
129
|
**Parameters**:
|
|
128
130
|
|
|
129
131
|
- `path` (required): Document path (e.g., "learn/hooks/useState")
|
|
132
|
+
- `full` (optional): Return the full raw page instead of the ~1500 char summary (default: false)
|
|
130
133
|
|
|
131
134
|
**Example**:
|
|
132
135
|
|
|
@@ -134,6 +137,13 @@ Get a specific documentation page.
|
|
|
134
137
|
Get the useState documentation
|
|
135
138
|
```
|
|
136
139
|
|
|
140
|
+
**Why `full`?** The default ~1500 char summary is enough for most API references, but it can cut off partway through longer pages — migration guides, upgrade walkthroughs, or anything with many sequential steps. If the summary seems to end mid-thought or you need every step of a guide, ask for the full page:
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
Get the full content of the React 19 upgrade guide, not just the summary
|
|
144
|
+
```
|
|
145
|
+
which calls `get_doc` with `{ "path": "learn/upgrading-to-react-19", "full": true }` and returns the complete raw page instead of the truncated summary.
|
|
146
|
+
|
|
137
147
|
#### `list_sections`
|
|
138
148
|
|
|
139
149
|
List all available documentation sections.
|
|
@@ -148,6 +158,14 @@ What sections are available?
|
|
|
148
158
|
|
|
149
159
|
Pull latest documentation from the Git repository.
|
|
150
160
|
|
|
161
|
+
### CLI
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
npx react-docs-mcp --version # print the installed package version and exit
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
(Version pinning via `--docs-version` is a [react-native-docs-mcp](./packages/react-native-docs-mcp) feature — react.dev has no versioned docs.)
|
|
168
|
+
|
|
151
169
|
**Example**:
|
|
152
170
|
|
|
153
171
|
```
|
package/dist/config.d.ts
CHANGED
|
@@ -39,33 +39,22 @@ export interface DocsMcpPreset {
|
|
|
39
39
|
docsLabel: string;
|
|
40
40
|
searchToolName: string;
|
|
41
41
|
searchToolDescription: string;
|
|
42
|
+
pathExample: string;
|
|
42
43
|
docUrl: DocUrlConfig;
|
|
43
44
|
sectionResourceOverrides?: Partial<Record<string, SectionResourceOverride>>;
|
|
44
45
|
}
|
|
45
46
|
/**
|
|
46
|
-
* Resolved runtime config
|
|
47
|
+
* Resolved runtime config: preset values with repo.localPath derived from the
|
|
48
|
+
* cache dir. Derived from DocsMcpPreset so new preset fields flow through.
|
|
47
49
|
*/
|
|
48
|
-
export
|
|
50
|
+
export type DocsMcpConfig = Omit<DocsMcpPreset, 'cacheDirName' | 'repoFolderName' | 'repo'> & {
|
|
49
51
|
repo: {
|
|
50
52
|
url: string;
|
|
51
|
-
localPath: string;
|
|
52
53
|
contentPath: string;
|
|
54
|
+
localPath: string;
|
|
53
55
|
};
|
|
54
|
-
|
|
55
|
-
server: {
|
|
56
|
-
name: string;
|
|
57
|
-
version: string;
|
|
58
|
-
};
|
|
59
|
-
sections: readonly string[];
|
|
60
|
-
resourceUriScheme: string;
|
|
61
|
-
docsLabel: string;
|
|
62
|
-
searchToolName: string;
|
|
63
|
-
searchToolDescription: string;
|
|
64
|
-
docUrl: DocUrlConfig;
|
|
65
|
-
sectionResourceOverrides?: Partial<Record<string, SectionResourceOverride>>;
|
|
66
|
-
}
|
|
56
|
+
};
|
|
67
57
|
declare let activeConfig: DocsMcpConfig;
|
|
68
58
|
export declare function configure(preset: DocsMcpPreset): void;
|
|
69
59
|
export { activeConfig as default };
|
|
70
|
-
export type Section = string;
|
|
71
60
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IAGb,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE;QACJ,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,wBAAwB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC,CAAC;CAC7E;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,cAAc,GAAG,gBAAgB,GAAG,MAAM,CAAC,GAAG;IAC5F,IAAI,EAAE;QACJ,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH,CAAC;AAiBF,QAAA,IAAI,YAAY,EAAE,aAAwC,CAAC;AAE3D,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAErD;AAGD,OAAO,EAAE,YAAY,IAAI,OAAO,EAAE,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { homedir } from 'os';
|
|
6
6
|
import { join } from 'path';
|
|
7
|
+
import { reactDocsPreset } from './presets/reactDocs.js';
|
|
7
8
|
// Determine cache directory based on OS
|
|
8
9
|
const getCacheDir = (cacheDirName) => {
|
|
9
10
|
const platform = process.platform;
|
|
@@ -30,35 +31,9 @@ function resolve(preset) {
|
|
|
30
31
|
},
|
|
31
32
|
};
|
|
32
33
|
}
|
|
33
|
-
const defaultPreset = {
|
|
34
|
-
cacheDirName: 'react-docs-mcp',
|
|
35
|
-
repoFolderName: 'react-dev-repo',
|
|
36
|
-
repo: {
|
|
37
|
-
url: 'https://github.com/reactjs/react.dev.git',
|
|
38
|
-
contentPath: 'src/content',
|
|
39
|
-
},
|
|
40
|
-
search: {
|
|
41
|
-
defaultLimit: 10,
|
|
42
|
-
maxLimit: 50,
|
|
43
|
-
minScore: 0.1,
|
|
44
|
-
semanticSearchEnabled: true,
|
|
45
|
-
semanticMinSimilarity: 0.3,
|
|
46
|
-
hybridKeywordWeight: 0.3,
|
|
47
|
-
hybridSemanticWeight: 0.7,
|
|
48
|
-
},
|
|
49
|
-
server: {
|
|
50
|
-
name: 'react-docs-mcp',
|
|
51
|
-
version: '1.0.0',
|
|
52
|
-
},
|
|
53
|
-
sections: ['learn', 'reference', 'blog', 'community'],
|
|
54
|
-
resourceUriScheme: 'react-docs',
|
|
55
|
-
docsLabel: 'React',
|
|
56
|
-
searchToolName: 'search_react_docs',
|
|
57
|
-
searchToolDescription: 'Search across React documentation. Returns relevant documentation pages with snippets.',
|
|
58
|
-
docUrl: { base: 'https://react.dev', useFrontmatterId: false },
|
|
59
|
-
};
|
|
60
34
|
// Module-level active config; swappable via configure() before the server starts.
|
|
61
|
-
|
|
35
|
+
// Seeded from the react.dev preset (single source of truth — no duplicate defaults).
|
|
36
|
+
let activeConfig = resolve(reactDocsPreset);
|
|
62
37
|
export function configure(preset) {
|
|
63
38
|
activeConfig = resolve(preset);
|
|
64
39
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,wCAAwC;AACxC,MAAM,WAAW,GAAG,CAAC,YAAoB,EAAU,EAAE;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClD,gCAAgC;QAChC,OAAO,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC5C,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,8BAA8B;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC;IACxF,CAAC;IAED,+BAA+B;IAC/B,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,YAAY,EAAE,CAAC,CAAC;AACxC,CAAC,CAAC;AA6DF,SAAS,OAAO,CAAC,MAAqB;IACpC,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAE/D,OAAO;QACL,GAAG,IAAI;QACP,IAAI,EAAE;YACJ,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,cAAc,CAAC;SAC3D;KACF,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,qFAAqF;AACrF,IAAI,YAAY,GAAkB,OAAO,CAAC,eAAe,CAAC,CAAC;AAE3D,MAAM,UAAU,SAAS,CAAC,MAAqB;IAC7C,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,wFAAwF;AACxF,OAAO,EAAE,YAAY,IAAI,OAAO,EAAE,CAAC"}
|
package/dist/docsManager.d.ts
CHANGED
|
@@ -19,7 +19,10 @@ export declare class DocsManager {
|
|
|
19
19
|
*/
|
|
20
20
|
private checkRepoExists;
|
|
21
21
|
/**
|
|
22
|
-
* Clone the repository
|
|
22
|
+
* Clone the repository.
|
|
23
|
+
* Clones into a temp directory and renames into place so that two
|
|
24
|
+
* processes starting on a fresh machine (e.g. two MCP servers sharing one
|
|
25
|
+
* cache) don't corrupt each other; the loser discards its redundant copy.
|
|
23
26
|
*/
|
|
24
27
|
private cloneRepo;
|
|
25
28
|
/**
|
|
@@ -42,6 +45,13 @@ export declare class DocsManager {
|
|
|
42
45
|
* @returns Array of file paths relative to content root
|
|
43
46
|
*/
|
|
44
47
|
getAllDocs(): Promise<string[]>;
|
|
48
|
+
/**
|
|
49
|
+
* Filter a list of section names down to those whose directory actually
|
|
50
|
+
* exists under the content root. Lets the server avoid advertising
|
|
51
|
+
* sections that are empty in the checked-out docs (e.g. a versioned
|
|
52
|
+
* snapshot that predates a section).
|
|
53
|
+
*/
|
|
54
|
+
getExistingSections(sections: readonly string[]): Promise<string[]>;
|
|
45
55
|
/**
|
|
46
56
|
* Read file content
|
|
47
57
|
* @param relativePath - Path relative to content root
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docsManager.d.ts","sourceRoot":"","sources":["../src/docsManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAoC;;IAQrD;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"docsManager.d.ts","sourceRoot":"","sources":["../src/docsManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAoC;;IAQrD;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBjC;;OAEG;YACW,eAAe;IAS7B;;;;;OAKG;YACW,SAAS;IAiCvB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAsBtC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAgCpC;;;;OAIG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA6B1D;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBrC;;;;;OAKG;IACG,mBAAmB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAezE;;;;OAIG;IACG,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYpD;;;OAGG;IACG,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAUxD"}
|
package/dist/docsManager.js
CHANGED
|
@@ -24,13 +24,22 @@ export class DocsManager {
|
|
|
24
24
|
async initialize() {
|
|
25
25
|
const repoExists = await this.checkRepoExists();
|
|
26
26
|
if (!repoExists) {
|
|
27
|
-
console.log('Cloning
|
|
27
|
+
console.log('Cloning documentation repository...');
|
|
28
28
|
await this.cloneRepo();
|
|
29
29
|
console.log('Repository cloned successfully');
|
|
30
30
|
}
|
|
31
31
|
else {
|
|
32
32
|
console.log('Repository already exists');
|
|
33
33
|
}
|
|
34
|
+
// Fail loudly instead of serving an empty index when the configured
|
|
35
|
+
// content path is missing (e.g. an invalid --docs-version value)
|
|
36
|
+
try {
|
|
37
|
+
await fs.access(this.contentPath);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
throw new Error(`Docs content path not found: ${this.contentPath}. ` +
|
|
41
|
+
'The cloned repository has no such folder — if you passed --docs-version, check that this docs version exists.');
|
|
42
|
+
}
|
|
34
43
|
}
|
|
35
44
|
/**
|
|
36
45
|
* Check if repository exists locally
|
|
@@ -45,17 +54,38 @@ export class DocsManager {
|
|
|
45
54
|
}
|
|
46
55
|
}
|
|
47
56
|
/**
|
|
48
|
-
* Clone the repository
|
|
57
|
+
* Clone the repository.
|
|
58
|
+
* Clones into a temp directory and renames into place so that two
|
|
59
|
+
* processes starting on a fresh machine (e.g. two MCP servers sharing one
|
|
60
|
+
* cache) don't corrupt each other; the loser discards its redundant copy.
|
|
49
61
|
*/
|
|
50
62
|
async cloneRepo() {
|
|
63
|
+
const tempPath = `${this.repoPath}.cloning-${process.pid}`;
|
|
51
64
|
try {
|
|
52
65
|
// Ensure parent directory exists
|
|
53
66
|
await fs.mkdir(path.dirname(this.repoPath), { recursive: true });
|
|
54
|
-
await this.git.clone(CONFIG.repo.url,
|
|
67
|
+
await this.git.clone(CONFIG.repo.url, tempPath, {
|
|
55
68
|
'--depth': 1, // Shallow clone for faster download
|
|
56
69
|
});
|
|
70
|
+
try {
|
|
71
|
+
await fs.rename(tempPath, this.repoPath);
|
|
72
|
+
}
|
|
73
|
+
catch (renameError) {
|
|
74
|
+
if (await this.checkRepoExists()) {
|
|
75
|
+
// Another process finished the clone first — ours is redundant
|
|
76
|
+
await fs.rm(tempPath, { recursive: true, force: true });
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
throw renameError;
|
|
80
|
+
}
|
|
57
81
|
}
|
|
58
82
|
catch (error) {
|
|
83
|
+
try {
|
|
84
|
+
await fs.rm(tempPath, { recursive: true, force: true });
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// best-effort cleanup of the temp clone
|
|
88
|
+
}
|
|
59
89
|
throw new Error(`Failed to clone repository: ${error instanceof Error ? error.message : String(error)}`);
|
|
60
90
|
}
|
|
61
91
|
}
|
|
@@ -155,6 +185,24 @@ export class DocsManager {
|
|
|
155
185
|
this.fileCache.set(cacheKey, files);
|
|
156
186
|
return files;
|
|
157
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* Filter a list of section names down to those whose directory actually
|
|
190
|
+
* exists under the content root. Lets the server avoid advertising
|
|
191
|
+
* sections that are empty in the checked-out docs (e.g. a versioned
|
|
192
|
+
* snapshot that predates a section).
|
|
193
|
+
*/
|
|
194
|
+
async getExistingSections(sections) {
|
|
195
|
+
const checks = await Promise.all(sections.map(async (section) => {
|
|
196
|
+
try {
|
|
197
|
+
await fs.access(path.join(this.contentPath, section));
|
|
198
|
+
return section;
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
}));
|
|
204
|
+
return checks.filter((section) => section !== null);
|
|
205
|
+
}
|
|
158
206
|
/**
|
|
159
207
|
* Read file content
|
|
160
208
|
* @param relativePath - Path relative to content root
|
package/dist/docsManager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docsManager.js","sourceRoot":"","sources":["../src/docsManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAa,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,MAAM,OAAO,WAAW;IACd,GAAG,CAAY;IACf,QAAQ,CAAS;IACjB,WAAW,CAAS;IACpB,SAAS,GAA0B,IAAI,GAAG,EAAE,CAAC;IAErD;QACE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,GAAG,SAAS,EAAE,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAEhD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"docsManager.js","sourceRoot":"","sources":["../src/docsManager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,12 @@
|
|
|
7
7
|
import { configure } from './config.js';
|
|
8
8
|
import { reactDocsPreset } from './presets/reactDocs.js';
|
|
9
9
|
import { createServer } from './server.js';
|
|
10
|
+
// package.json's postinstall runs `node dist/index.js --version`; without this
|
|
11
|
+
// guard that would start the server and clone the docs repo during npm install.
|
|
12
|
+
if (process.argv.includes('--version') || process.argv.includes('-v')) {
|
|
13
|
+
console.log(reactDocsPreset.server.version);
|
|
14
|
+
process.exit(0);
|
|
15
|
+
}
|
|
10
16
|
configure(reactDocsPreset);
|
|
11
17
|
createServer().catch(error => {
|
|
12
18
|
console.error('Failed to start server:', error);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,SAAS,CAAC,eAAe,CAAC,CAAC;AAE3B,YAAY,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,+EAA+E;AAC/E,gFAAgF;AAChF,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,CAAC,eAAe,CAAC,CAAC;AAE3B,YAAY,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/markdownParser.d.ts
CHANGED
|
@@ -22,4 +22,13 @@ export declare function markdownToPlainText(markdown: string): Promise<string>;
|
|
|
22
22
|
* E.g., "learn/hooks/useState.md" -> "learn"
|
|
23
23
|
*/
|
|
24
24
|
export declare function extractSection(path: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Normalize path (forward slashes, no leading slash, no .md extension for display)
|
|
27
|
+
*/
|
|
28
|
+
export declare function normalizePath(filePath: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Convert a kebab-case or snake_case slug to Title Case
|
|
31
|
+
* E.g., "the-new-architecture" -> "The New Architecture"
|
|
32
|
+
*/
|
|
33
|
+
export declare function titleCase(slug: string): string;
|
|
25
34
|
//# sourceMappingURL=markdownParser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdownParser.d.ts","sourceRoot":"","sources":["../src/markdownParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,SAAS,CAAC,CA2BpB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ3E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAInD"}
|
|
1
|
+
{"version":3,"file":"markdownParser.d.ts","sourceRoot":"","sources":["../src/markdownParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,SAAS,CAAC,CA2BpB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ3E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAInD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9C"}
|
package/dist/markdownParser.js
CHANGED
|
@@ -61,12 +61,23 @@ export function extractSection(path) {
|
|
|
61
61
|
/**
|
|
62
62
|
* Normalize path (forward slashes, no leading slash, no .md extension for display)
|
|
63
63
|
*/
|
|
64
|
-
function normalizePath(filePath) {
|
|
64
|
+
export function normalizePath(filePath) {
|
|
65
65
|
return filePath
|
|
66
66
|
.replace(/\\/g, '/') // Convert backslashes to forward slashes
|
|
67
67
|
.replace(/^\/+/, '') // Remove leading slashes
|
|
68
68
|
.replace(/\.mdx?$/, ''); // Remove .md/.mdx extension for cleaner paths
|
|
69
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Convert a kebab-case or snake_case slug to Title Case
|
|
72
|
+
* E.g., "the-new-architecture" -> "The New Architecture"
|
|
73
|
+
*/
|
|
74
|
+
export function titleCase(slug) {
|
|
75
|
+
return slug
|
|
76
|
+
.replace(/[-_]/g, ' ')
|
|
77
|
+
.split(' ')
|
|
78
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
|
79
|
+
.join(' ');
|
|
80
|
+
}
|
|
70
81
|
/**
|
|
71
82
|
* Extract title from path if not in frontmatter
|
|
72
83
|
* E.g., "learn/hooks/useState" -> "useState"
|
|
@@ -75,11 +86,6 @@ function extractTitleFromPath(filePath) {
|
|
|
75
86
|
const normalized = normalizePath(filePath);
|
|
76
87
|
const parts = normalized.split('/');
|
|
77
88
|
const filename = parts[parts.length - 1] || 'Untitled';
|
|
78
|
-
|
|
79
|
-
return filename
|
|
80
|
-
.replace(/[-_]/g, ' ')
|
|
81
|
-
.split(' ')
|
|
82
|
-
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
|
83
|
-
.join(' ');
|
|
89
|
+
return titleCase(filename);
|
|
84
90
|
}
|
|
85
91
|
//# sourceMappingURL=markdownParser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdownParser.js","sourceRoot":"","sources":["../src/markdownParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAG3C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,IAAY;IAEZ,oBAAoB;IACpB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAE3D,mBAAmB;IACnB,MAAM,QAAQ,GAAgB;QAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,oBAAoB,CAAC,IAAI,CAAC;QAC/C,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,IAAI;KACR,CAAC;IAEF,mCAAmC;IACnC,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,eAAe,CAAC,CAAC;IAE7D,4BAA4B;IAC5B,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAErC,OAAO;QACL,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC;QACzB,OAAO;QACP,QAAQ;QACR,OAAO,EAAE,eAAe;QACxB,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACxD,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE;SAC1B,GAAG,CAAC,aAAa,CAAC;SAClB,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErB,OAAO,MAAM,CAAC,MAAM,CAAC;SAClB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,uBAAuB;SAC5C,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"markdownParser.js","sourceRoot":"","sources":["../src/markdownParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAG3C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,IAAY;IAEZ,oBAAoB;IACpB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAE3D,mBAAmB;IACnB,MAAM,QAAQ,GAAgB;QAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,oBAAoB,CAAC,IAAI,CAAC;QAC/C,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,IAAI;KACR,CAAC;IAEF,mCAAmC;IACnC,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,eAAe,CAAC,CAAC;IAE7D,4BAA4B;IAC5B,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAErC,OAAO;QACL,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC;QACzB,OAAO;QACP,QAAQ;QACR,OAAO,EAAE,eAAe;QACxB,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACxD,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE;SAC1B,GAAG,CAAC,aAAa,CAAC;SAClB,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErB,OAAO,MAAM,CAAC,MAAM,CAAC;SAClB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,uBAAuB;SAC5C,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,QAAQ;SACZ,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,yCAAyC;SAC7D,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,yBAAyB;SAC7C,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,8CAA8C;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI;SACR,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACzD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC;IAEvD,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactDocs.d.ts","sourceRoot":"","sources":["../../src/presets/reactDocs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"reactDocs.d.ts","sourceRoot":"","sources":["../../src/presets/reactDocs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,eAAO,MAAM,eAAe,EAAE,aAqC7B,CAAC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* reactDocs.ts
|
|
3
3
|
* Preset for the default react-docs-mcp package: github.com/reactjs/react.dev.git
|
|
4
4
|
*/
|
|
5
|
+
import { DEFAULT_SEARCH } from './searchDefaults.js';
|
|
5
6
|
export const reactDocsPreset = {
|
|
6
7
|
cacheDirName: 'react-docs-mcp',
|
|
7
8
|
repoFolderName: 'react-dev-repo',
|
|
@@ -9,24 +10,17 @@ export const reactDocsPreset = {
|
|
|
9
10
|
url: 'https://github.com/reactjs/react.dev.git',
|
|
10
11
|
contentPath: 'src/content',
|
|
11
12
|
},
|
|
12
|
-
search: {
|
|
13
|
-
defaultLimit: 10,
|
|
14
|
-
maxLimit: 50,
|
|
15
|
-
minScore: 0.1,
|
|
16
|
-
semanticSearchEnabled: true,
|
|
17
|
-
semanticMinSimilarity: 0.3,
|
|
18
|
-
hybridKeywordWeight: 0.3,
|
|
19
|
-
hybridSemanticWeight: 0.7,
|
|
20
|
-
},
|
|
13
|
+
search: { ...DEFAULT_SEARCH },
|
|
21
14
|
server: {
|
|
22
15
|
name: 'react-docs-mcp',
|
|
23
|
-
version: '1.
|
|
16
|
+
version: '1.2.0',
|
|
24
17
|
},
|
|
25
18
|
sections: ['learn', 'reference', 'blog', 'community'],
|
|
26
19
|
resourceUriScheme: 'react-docs',
|
|
27
20
|
docsLabel: 'React',
|
|
28
21
|
searchToolName: 'search_react_docs',
|
|
29
22
|
searchToolDescription: 'Search across React documentation. Returns relevant documentation pages with snippets.',
|
|
23
|
+
pathExample: 'reference/react/useState',
|
|
30
24
|
docUrl: { base: 'https://react.dev', useFrontmatterId: false },
|
|
31
25
|
sectionResourceOverrides: {
|
|
32
26
|
learn: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactDocs.js","sourceRoot":"","sources":["../../src/presets/reactDocs.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"reactDocs.js","sourceRoot":"","sources":["../../src/presets/reactDocs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,eAAe,GAAkB;IAC5C,YAAY,EAAE,gBAAgB;IAC9B,cAAc,EAAE,gBAAgB;IAChC,IAAI,EAAE;QACJ,GAAG,EAAE,0CAA0C;QAC/C,WAAW,EAAE,aAAa;KAC3B;IACD,MAAM,EAAE,EAAE,GAAG,cAAc,EAAE;IAC7B,MAAM,EAAE;QACN,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,OAAO;KACjB;IACD,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC;IACrD,iBAAiB,EAAE,YAAY;IAC/B,SAAS,EAAE,OAAO;IAClB,cAAc,EAAE,mBAAmB;IACnC,qBAAqB,EAAE,wFAAwF;IAC/G,WAAW,EAAE,0BAA0B;IACvC,MAAM,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,KAAK,EAAE;IAC9D,wBAAwB,EAAE;QACxB,KAAK,EAAE;YACL,IAAI,EAAE,2BAA2B;YACjC,WAAW,EAAE,mDAAmD;SACjE;QACD,SAAS,EAAE;YACT,IAAI,EAAE,qBAAqB;YAC3B,WAAW,EAAE,4CAA4C;SAC1D;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,yCAAyC;SACvD;QACD,SAAS,EAAE;YACT,IAAI,EAAE,+BAA+B;YACrC,WAAW,EAAE,wDAAwD;SACtE;KACF;CACF,CAAC"}
|
|
@@ -5,15 +5,17 @@
|
|
|
5
5
|
* Structure verified directly against the repo (Docusaurus-based):
|
|
6
6
|
* - Docs live at root `docs/` (not under `website/`), 230 .md + 9 .mdx files.
|
|
7
7
|
* - 213 of 241 files sit flat at `docs/` root with no section; only
|
|
8
|
-
* `the-new-architecture/`, `legacy/`, and `releases/` are real subfolders
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* -
|
|
13
|
-
*
|
|
14
|
-
*
|
|
8
|
+
* `the-new-architecture/`, `legacy/`, and `releases/` are real subfolders
|
|
9
|
+
* (older versioned snapshots may lack some — the server filters advertised
|
|
10
|
+
* sections to those that exist on disk at runtime).
|
|
11
|
+
* - "latest" targets the unversioned root `docs/` folder; pinned versions
|
|
12
|
+
* target `website/versioned_docs/version-X.YY/` inside the same clone.
|
|
13
|
+
* - Docusaurus routes by frontmatter `id` when present (in all versions), so
|
|
14
|
+
* the engine resolves ids into canonical doc paths/slugs at index time
|
|
15
|
+
* (docUrl.useFrontmatterId).
|
|
15
16
|
* - website/blog/ is a separate content root and is out of scope for v1.
|
|
16
17
|
*/
|
|
17
18
|
import type { DocsMcpPreset } from '../config.js';
|
|
18
|
-
export declare const
|
|
19
|
+
export declare const LATEST_VERSION = "latest";
|
|
20
|
+
export declare function resolveReactNativeDocsPreset(version?: string): DocsMcpPreset;
|
|
19
21
|
//# sourceMappingURL=reactNativeDocs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactNativeDocs.d.ts","sourceRoot":"","sources":["../../src/presets/reactNativeDocs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"reactNativeDocs.d.ts","sourceRoot":"","sources":["../../src/presets/reactNativeDocs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,eAAO,MAAM,cAAc,WAAW,CAAC;AAEvC,wBAAgB,4BAA4B,CAAC,OAAO,GAAE,MAAuB,GAAG,aAAa,CAkC5F"}
|
|
@@ -5,40 +5,47 @@
|
|
|
5
5
|
* Structure verified directly against the repo (Docusaurus-based):
|
|
6
6
|
* - Docs live at root `docs/` (not under `website/`), 230 .md + 9 .mdx files.
|
|
7
7
|
* - 213 of 241 files sit flat at `docs/` root with no section; only
|
|
8
|
-
* `the-new-architecture/`, `legacy/`, and `releases/` are real subfolders
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* -
|
|
13
|
-
*
|
|
14
|
-
*
|
|
8
|
+
* `the-new-architecture/`, `legacy/`, and `releases/` are real subfolders
|
|
9
|
+
* (older versioned snapshots may lack some — the server filters advertised
|
|
10
|
+
* sections to those that exist on disk at runtime).
|
|
11
|
+
* - "latest" targets the unversioned root `docs/` folder; pinned versions
|
|
12
|
+
* target `website/versioned_docs/version-X.YY/` inside the same clone.
|
|
13
|
+
* - Docusaurus routes by frontmatter `id` when present (in all versions), so
|
|
14
|
+
* the engine resolves ids into canonical doc paths/slugs at index time
|
|
15
|
+
* (docUrl.useFrontmatterId).
|
|
15
16
|
* - website/blog/ is a separate content root and is out of scope for v1.
|
|
16
17
|
*/
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
18
|
+
import { DEFAULT_SEARCH } from './searchDefaults.js';
|
|
19
|
+
export const LATEST_VERSION = 'latest';
|
|
20
|
+
export function resolveReactNativeDocsPreset(version = LATEST_VERSION) {
|
|
21
|
+
const isLatest = version === LATEST_VERSION;
|
|
22
|
+
if (!isLatest && !/^\d+\.\d+$/.test(version)) {
|
|
23
|
+
throw new Error(`Invalid React Native docs version "${version}". Expected a release like "0.77" or "${LATEST_VERSION}".`);
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
cacheDirName: 'react-native-docs-mcp',
|
|
27
|
+
repoFolderName: 'react-native-website-repo',
|
|
28
|
+
repo: {
|
|
29
|
+
url: 'https://github.com/facebook/react-native-website.git',
|
|
30
|
+
contentPath: isLatest ? 'docs' : `website/versioned_docs/version-${version}`,
|
|
31
|
+
},
|
|
32
|
+
search: { ...DEFAULT_SEARCH },
|
|
33
|
+
server: {
|
|
34
|
+
name: 'react-native-docs-mcp',
|
|
35
|
+
version: '0.2.0',
|
|
36
|
+
},
|
|
37
|
+
sections: ['the-new-architecture', 'legacy', 'releases'],
|
|
38
|
+
resourceUriScheme: 'react-native-docs',
|
|
39
|
+
docsLabel: 'React Native',
|
|
40
|
+
searchToolName: 'search_react_native_docs',
|
|
41
|
+
searchToolDescription: 'Search across React Native documentation. Returns relevant documentation pages with snippets.',
|
|
42
|
+
pathExample: 'the-new-architecture/using-codegen',
|
|
43
|
+
docUrl: {
|
|
44
|
+
base: isLatest ? 'https://reactnative.dev/docs' : `https://reactnative.dev/docs/${version}`,
|
|
45
|
+
// Frontmatter-id routing is a property of the Docusaurus content format,
|
|
46
|
+
// not of the version — versioned snapshots carry the same id overrides
|
|
47
|
+
useFrontmatterId: true,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
44
51
|
//# sourceMappingURL=reactNativeDocs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactNativeDocs.js","sourceRoot":"","sources":["../../src/presets/reactNativeDocs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"reactNativeDocs.js","sourceRoot":"","sources":["../../src/presets/reactNativeDocs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC;AAEvC,MAAM,UAAU,4BAA4B,CAAC,UAAkB,cAAc;IAC3E,MAAM,QAAQ,GAAG,OAAO,KAAK,cAAc,CAAC;IAE5C,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACb,sCAAsC,OAAO,yCAAyC,cAAc,IAAI,CACzG,CAAC;IACJ,CAAC;IAED,OAAO;QACL,YAAY,EAAE,uBAAuB;QACrC,cAAc,EAAE,2BAA2B;QAC3C,IAAI,EAAE;YACJ,GAAG,EAAE,sDAAsD;YAC3D,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,kCAAkC,OAAO,EAAE;SAC7E;QACD,MAAM,EAAE,EAAE,GAAG,cAAc,EAAE;QAC7B,MAAM,EAAE;YACN,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,OAAO;SACjB;QACD,QAAQ,EAAE,CAAC,sBAAsB,EAAE,QAAQ,EAAE,UAAU,CAAC;QACxD,iBAAiB,EAAE,mBAAmB;QACtC,SAAS,EAAE,cAAc;QACzB,cAAc,EAAE,0BAA0B;QAC1C,qBAAqB,EAAE,+FAA+F;QACtH,WAAW,EAAE,oCAAoC;QACjD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,gCAAgC,OAAO,EAAE;YAC3F,yEAAyE;YACzE,uEAAuE;YACvE,gBAAgB,EAAE,IAAI;SACvB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* searchDefaults.ts
|
|
3
|
+
* Shared search tuning used by all presets — single source of truth so a
|
|
4
|
+
* ranking change can't silently apply to one published server but not the other.
|
|
5
|
+
* (Type-only import from config.js keeps this module free of runtime cycles.)
|
|
6
|
+
*/
|
|
7
|
+
import type { SearchConfig } from '../config.js';
|
|
8
|
+
export declare const DEFAULT_SEARCH: SearchConfig;
|
|
9
|
+
//# sourceMappingURL=searchDefaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchDefaults.d.ts","sourceRoot":"","sources":["../../src/presets/searchDefaults.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,eAAO,MAAM,cAAc,EAAE,YAQ5B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* searchDefaults.ts
|
|
3
|
+
* Shared search tuning used by all presets — single source of truth so a
|
|
4
|
+
* ranking change can't silently apply to one published server but not the other.
|
|
5
|
+
* (Type-only import from config.js keeps this module free of runtime cycles.)
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_SEARCH = {
|
|
8
|
+
defaultLimit: 10,
|
|
9
|
+
maxLimit: 50,
|
|
10
|
+
minScore: 0.1,
|
|
11
|
+
semanticSearchEnabled: true,
|
|
12
|
+
semanticMinSimilarity: 0.3,
|
|
13
|
+
hybridKeywordWeight: 0.3,
|
|
14
|
+
hybridSemanticWeight: 0.7,
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=searchDefaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchDefaults.js","sourceRoot":"","sources":["../../src/presets/searchDefaults.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,GAAG;IACb,qBAAqB,EAAE,IAAI;IAC3B,qBAAqB,EAAE,GAAG;IAC1B,mBAAmB,EAAE,GAAG;IACxB,oBAAoB,EAAE,GAAG;CAC1B,CAAC"}
|
package/dist/searchEngine.d.ts
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { DocsManager } from './docsManager.js';
|
|
6
6
|
import type { ParsedDoc, SearchOptions, SearchResult } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the canonical slug for a doc: Docusaurus-style sites route by
|
|
9
|
+
* frontmatter `id` when present, overriding the file-path-derived slug.
|
|
10
|
+
* Returns the path unchanged for missing/non-string ids.
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolveDocSlug(path: string, id: unknown): string;
|
|
7
13
|
export declare class SearchEngine {
|
|
8
14
|
private docsManager;
|
|
9
15
|
private embeddingService;
|
|
@@ -54,10 +60,6 @@ export declare class SearchEngine {
|
|
|
54
60
|
* @returns Parsed document or null if not found
|
|
55
61
|
*/
|
|
56
62
|
getDocByPath(path: string): Promise<ParsedDoc | null>;
|
|
57
|
-
/**
|
|
58
|
-
* List all available sections
|
|
59
|
-
*/
|
|
60
|
-
getSections(): string[];
|
|
61
63
|
/**
|
|
62
64
|
* Get all documents in a section
|
|
63
65
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchEngine.d.ts","sourceRoot":"","sources":["../src/searchEngine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAI/C,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzE,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,aAAa,CAAqC;IAC1D,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,mBAAmB,CAAkB;IAE7C;;;OAGG;gBACS,WAAW,EAAE,WAAW;IAKpC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"searchEngine.d.ts","sourceRoot":"","sources":["../src/searchEngine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAI/C,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,MAAM,CAYhE;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,aAAa,CAAqC;IAC1D,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,mBAAmB,CAAkB;IAE7C;;;OAGG;gBACS,WAAW,EAAE,WAAW;IAKpC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BrC;;;OAGG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BzC;;;;;OAKG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC;IAsB1B;;OAEG;YACW,aAAa;IAsC3B;;OAEG;YACW,cAAc;IA0D5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAkCrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAkCvB;;;;OAIG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAS3D;;OAEG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAiB9D"}
|
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(/\.mdx?$/, '');
|
|
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.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
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
CHANGED
|
@@ -10,33 +10,19 @@ import { z } from 'zod';
|
|
|
10
10
|
import { DocsManager } from './docsManager.js';
|
|
11
11
|
import { SearchEngine } from './searchEngine.js';
|
|
12
12
|
import { summarizeContent, extractStructure } from './summarizer.js';
|
|
13
|
+
import { titleCase } from './markdownParser.js';
|
|
13
14
|
import CONFIG from './config.js';
|
|
14
|
-
function
|
|
15
|
-
return
|
|
16
|
-
.split(/[-_]/)
|
|
17
|
-
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
|
18
|
-
.join(' ');
|
|
15
|
+
function escapeRegExp(literal) {
|
|
16
|
+
return literal.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
19
17
|
}
|
|
20
18
|
/**
|
|
21
|
-
* Build the public doc URL for a parsed document.
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
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.
|
|
25
23
|
*/
|
|
26
24
|
function buildDocUrl(doc) {
|
|
27
|
-
|
|
28
|
-
const id = doc.metadata.id;
|
|
29
|
-
if (CONFIG.docUrl.useFrontmatterId && id) {
|
|
30
|
-
if (id.includes('/')) {
|
|
31
|
-
slug = id;
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
const parts = doc.path.split('/');
|
|
35
|
-
parts[parts.length - 1] = id;
|
|
36
|
-
slug = parts.join('/');
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return `${CONFIG.docUrl.base}/${slug}`;
|
|
25
|
+
return `${CONFIG.docUrl.base}/${doc.path}`;
|
|
40
26
|
}
|
|
41
27
|
export async function createServer() {
|
|
42
28
|
// Initialize components
|
|
@@ -55,17 +41,27 @@ export async function createServer() {
|
|
|
55
41
|
// Tool input schemas
|
|
56
42
|
const searchDocsSchema = z.object({
|
|
57
43
|
query: z.string().describe('Search query string'),
|
|
58
|
-
section: z
|
|
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(', ')})`),
|
|
59
51
|
limit: z.number().min(1).max(CONFIG.search.maxLimit).optional().describe('Maximum number of results'),
|
|
60
52
|
});
|
|
61
53
|
const getDocSchema = z.object({
|
|
62
|
-
path: z.string().describe(
|
|
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'),
|
|
63
56
|
});
|
|
64
|
-
const resourceUriRegex = new RegExp(`^${CONFIG.resourceUriScheme}:\\/\\/(.+)$`);
|
|
57
|
+
const resourceUriRegex = new RegExp(`^${escapeRegExp(CONFIG.resourceUriScheme)}:\\/\\/(.+)$`);
|
|
65
58
|
// Register list resources handler
|
|
66
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);
|
|
67
63
|
return {
|
|
68
|
-
resources:
|
|
64
|
+
resources: existingSections.map(section => {
|
|
69
65
|
const override = CONFIG.sectionResourceOverrides?.[section];
|
|
70
66
|
return {
|
|
71
67
|
uri: `${CONFIG.resourceUriScheme}://${section}`,
|
|
@@ -155,13 +151,17 @@ export async function createServer() {
|
|
|
155
151
|
},
|
|
156
152
|
{
|
|
157
153
|
name: 'get_doc',
|
|
158
|
-
description: `Get a concise summary of a documentation page (~1500 chars). Use ${CONFIG.searchToolName} first - only call this if you need more detail than the search snippet provides.`,
|
|
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.`,
|
|
159
155
|
inputSchema: {
|
|
160
156
|
type: 'object',
|
|
161
157
|
properties: {
|
|
162
158
|
path: {
|
|
163
159
|
type: 'string',
|
|
164
|
-
description:
|
|
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
165
|
},
|
|
166
166
|
},
|
|
167
167
|
required: ['path'],
|
|
@@ -202,7 +202,7 @@ export async function createServer() {
|
|
|
202
202
|
};
|
|
203
203
|
}
|
|
204
204
|
case 'list_sections': {
|
|
205
|
-
const sections =
|
|
205
|
+
const sections = await docsManager.getExistingSections(CONFIG.sections);
|
|
206
206
|
return {
|
|
207
207
|
content: [
|
|
208
208
|
{
|
|
@@ -213,14 +213,18 @@ export async function createServer() {
|
|
|
213
213
|
};
|
|
214
214
|
}
|
|
215
215
|
case 'get_doc': {
|
|
216
|
-
const { path } = getDocSchema.parse(args);
|
|
216
|
+
const { path, full } = getDocSchema.parse(args);
|
|
217
217
|
const doc = await searchEngine.getDocByPath(path);
|
|
218
218
|
if (!doc) {
|
|
219
219
|
throw new Error(`Document not found: ${path}`);
|
|
220
220
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
+
};
|
|
224
228
|
return {
|
|
225
229
|
content: [
|
|
226
230
|
{
|
|
@@ -230,10 +234,8 @@ export async function createServer() {
|
|
|
230
234
|
section: doc.section,
|
|
231
235
|
title: doc.metadata.title,
|
|
232
236
|
description: doc.metadata.description,
|
|
233
|
-
|
|
234
|
-
structure,
|
|
237
|
+
...body,
|
|
235
238
|
url: buildDocUrl(doc),
|
|
236
|
-
note: 'This is a summary. Visit the URL for full documentation.',
|
|
237
239
|
}, null, 2),
|
|
238
240
|
},
|
|
239
241
|
],
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,SAAS,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|