mne-docs-mcp 1.0.22 → 1.0.23
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 +13 -7
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/index.js +31 -3
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +56 -181
- package/dist/server.js.map +1 -1
- package/dist/tools/annotations.d.ts +12 -0
- package/dist/tools/annotations.d.ts.map +1 -0
- package/dist/tools/annotations.js +12 -0
- package/dist/tools/annotations.js.map +1 -0
- package/dist/tools/findMneSymbol.d.ts +41 -0
- package/dist/tools/findMneSymbol.d.ts.map +1 -1
- package/dist/tools/findMneSymbol.js +22 -0
- package/dist/tools/findMneSymbol.js.map +1 -1
- package/dist/tools/getMneChangelog.d.ts +19 -0
- package/dist/tools/getMneChangelog.d.ts.map +1 -1
- package/dist/tools/getMneChangelog.js +15 -1
- package/dist/tools/getMneChangelog.js.map +1 -1
- package/dist/tools/getMneDoc.d.ts +19 -0
- package/dist/tools/getMneDoc.d.ts.map +1 -1
- package/dist/tools/getMneDoc.js +14 -0
- package/dist/tools/getMneDoc.js.map +1 -1
- package/dist/tools/getMneExample.d.ts +22 -0
- package/dist/tools/getMneExample.d.ts.map +1 -1
- package/dist/tools/getMneExample.js +18 -1
- package/dist/tools/getMneExample.js.map +1 -1
- package/dist/tools/getMneFile.d.ts +22 -0
- package/dist/tools/getMneFile.d.ts.map +1 -1
- package/dist/tools/getMneFile.js +18 -1
- package/dist/tools/getMneFile.js.map +1 -1
- package/dist/tools/getMneForumTopic.d.ts +19 -0
- package/dist/tools/getMneForumTopic.d.ts.map +1 -1
- package/dist/tools/getMneForumTopic.js +14 -0
- package/dist/tools/getMneForumTopic.js.map +1 -1
- package/dist/tools/getMneIssue.d.ts +18 -0
- package/dist/tools/getMneIssue.d.ts.map +1 -1
- package/dist/tools/getMneIssue.js +14 -1
- package/dist/tools/getMneIssue.js.map +1 -1
- package/dist/tools/getMneIssueComments.d.ts +18 -0
- package/dist/tools/getMneIssueComments.d.ts.map +1 -1
- package/dist/tools/getMneIssueComments.js +14 -1
- package/dist/tools/getMneIssueComments.js.map +1 -1
- package/dist/tools/getRelatedSymbols.d.ts +19 -0
- package/dist/tools/getRelatedSymbols.d.ts.map +1 -1
- package/dist/tools/getRelatedSymbols.js +14 -0
- package/dist/tools/getRelatedSymbols.js.map +1 -1
- package/dist/tools/getSymbolReferences.d.ts +19 -0
- package/dist/tools/getSymbolReferences.d.ts.map +1 -1
- package/dist/tools/getSymbolReferences.js +14 -0
- package/dist/tools/getSymbolReferences.js.map +1 -1
- package/dist/tools/index.d.ts +16 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +16 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/listMneVersions.d.ts +71 -0
- package/dist/tools/listMneVersions.d.ts.map +1 -1
- package/dist/tools/listMneVersions.js +19 -1
- package/dist/tools/listMneVersions.js.map +1 -1
- package/dist/tools/lookupMneError.d.ts +19 -1
- package/dist/tools/lookupMneError.d.ts.map +1 -1
- package/dist/tools/lookupMneError.js +14 -0
- package/dist/tools/lookupMneError.js.map +1 -1
- package/dist/tools/searchMneDocs.d.ts +20 -0
- package/dist/tools/searchMneDocs.d.ts.map +1 -1
- package/dist/tools/searchMneDocs.js +16 -1
- package/dist/tools/searchMneDocs.js.map +1 -1
- package/dist/tools/searchMneForum.d.ts +18 -0
- package/dist/tools/searchMneForum.d.ts.map +1 -1
- package/dist/tools/searchMneForum.js +13 -0
- package/dist/tools/searchMneForum.js.map +1 -1
- package/dist/tools/searchMneIssues.d.ts +22 -1
- package/dist/tools/searchMneIssues.d.ts.map +1 -1
- package/dist/tools/searchMneIssues.js +18 -1
- package/dist/tools/searchMneIssues.js.map +1 -1
- package/package.json +1 -2
- package/python/requirements.txt +0 -2
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@ $env:MNE_GITHUB_TOKEN="ghp_your_token_here" # Windows PowerShell
|
|
|
18
18
|
npm start
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
Server runs on `http://
|
|
21
|
+
Server runs on `http://127.0.0.1:8000` by default. Verify with `curl http://localhost:8000/health`.
|
|
22
22
|
|
|
23
23
|
> **Prerequisites:** Node.js ≥ 20 and Python 3 (used for AST parsing — no pip packages required).
|
|
24
24
|
|
|
@@ -78,7 +78,7 @@ MNE_TRANSPORT=http npm start
|
|
|
78
78
|
| Endpoint | Description |
|
|
79
79
|
|----------|-------------|
|
|
80
80
|
| `POST /mcp` | MCP protocol (JSON-RPC) |
|
|
81
|
-
| `GET /health` | Health check — returns `{"status":"
|
|
81
|
+
| `GET /health` | Health check — returns `{"status":"healthy"}` |
|
|
82
82
|
| `GET /metrics` | Runtime metrics (request counts, cache hit rate, GitHub rate limit) |
|
|
83
83
|
|
|
84
84
|
### Docker
|
|
@@ -141,7 +141,9 @@ All tools support a `package` parameter to query across the MNE ecosystem: `mne-
|
|
|
141
141
|
|----------|-------------|---------|
|
|
142
142
|
| `MNE_GITHUB_TOKEN` | GitHub PAT (**required**) | — |
|
|
143
143
|
| `MNE_PORT` | Server port (HTTP mode) | `8000` |
|
|
144
|
+
| `MNE_HOST` | Bind address (use `0.0.0.0` in Docker) | `127.0.0.1` |
|
|
144
145
|
| `MNE_TRANSPORT` | `http` or `stdio` | `http` |
|
|
146
|
+
| `MNE_ALLOWED_ORIGINS` | Comma-separated origins for CORS (use `*` to allow all) | `*` |
|
|
145
147
|
| `MNE_DEFAULT_PACKAGE` | Default MNE package | `mne-python` |
|
|
146
148
|
| `MNE_PYTHON_PATH` | Python executable path | `python` (Win) / `python3` (Unix) |
|
|
147
149
|
| `MNE_LOG_LEVEL` | `debug` / `info` / `warn` / `error` | `info` |
|
|
@@ -154,18 +156,20 @@ See `.env.example` for advanced options: cache TTLs (`MNE_CACHE_TTL_MINUTES`, `M
|
|
|
154
156
|
```
|
|
155
157
|
┌─────────────────────────────────────────────────────────┐
|
|
156
158
|
│ TypeScript Server (Node.js) │
|
|
157
|
-
│ ├─ MCP Tools (McpServer API, SDK v1.18+)
|
|
158
|
-
│
|
|
159
|
+
│ ├─ MCP Tools (McpServer API, SDK v1.18+) │
|
|
160
|
+
│ │ · Tool annotations (readOnly, idempotent, etc.) │
|
|
161
|
+
│ │ · Structured output + resource_link content │
|
|
162
|
+
│ ├─ GitHub Client (rate limiting, caching) │
|
|
159
163
|
│ └─ Python Parser Bridge ──┐ │
|
|
160
164
|
└────────────────────────────┼────────────────────────────┘
|
|
161
165
|
▼
|
|
162
166
|
┌─────────────────┐
|
|
163
|
-
│ Python Parser
|
|
167
|
+
│ Python Parser │
|
|
164
168
|
│ (AST, stdlib) │
|
|
165
169
|
└─────────────────┘
|
|
166
170
|
```
|
|
167
171
|
|
|
168
|
-
Built with the official [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk).
|
|
172
|
+
Built with the official [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk). This server conforms to the [Model Context Protocol specification 2025-06-18](https://modelcontextprotocol.io/specification/2025-06-18) (tool annotations, structured output, resource links, Origin validation, Streamable HTTP).
|
|
169
173
|
|
|
170
174
|
## Development
|
|
171
175
|
|
|
@@ -236,12 +240,14 @@ OIDC is used for MCP Registry authentication (no extra secret needed).
|
|
|
236
240
|
|
|
237
241
|
- **Rate limits:** Ensure `MNE_GITHUB_TOKEN` is set
|
|
238
242
|
- **Parser fails:** Check Python 3 is installed (path auto-detected per platform)
|
|
239
|
-
- **Test setup:** Run `
|
|
243
|
+
- **Test setup:** Run `node run-tests.mjs` to verify (requires the server running on `localhost:8000`)
|
|
240
244
|
|
|
241
245
|
## Security
|
|
242
246
|
|
|
243
247
|
- GitHub token needs only `public_repo` scope — never commit tokens to version control
|
|
244
248
|
- Python parser uses `ast.parse()` only (no code execution)
|
|
249
|
+
- HTTP mode validates the `Origin` header when `MNE_ALLOWED_ORIGINS` is set (comma-separated list); use `*` to allow all (default)
|
|
250
|
+
- By default the server binds to `127.0.0.1`; set `MNE_HOST=0.0.0.0` only when needed (e.g. in Docker)
|
|
245
251
|
- For production: restrict outbound to `api.github.com` and `mne.discourse.group`, don't expose to public internet
|
|
246
252
|
|
|
247
253
|
## License
|
package/dist/config.d.ts
CHANGED
|
@@ -14,13 +14,16 @@ export interface MnePackageInfo {
|
|
|
14
14
|
export declare const MNE_PACKAGES: Record<string, MnePackageInfo>;
|
|
15
15
|
export declare const MNE_PACKAGE_NAMES: string[];
|
|
16
16
|
export declare const DEFAULT_PACKAGE = "mne-python";
|
|
17
|
+
export declare const packageSchema: z.ZodOptional<z.ZodEnum<[string, ...string[]]>>;
|
|
17
18
|
/**
|
|
18
19
|
* Get package info by name, with fallback to default.
|
|
19
20
|
*/
|
|
20
21
|
export declare function getPackageInfo(packageName?: string): MnePackageInfo;
|
|
21
22
|
export declare const ConfigSchema: z.ZodObject<{
|
|
22
23
|
port: z.ZodDefault<z.ZodNumber>;
|
|
24
|
+
host: z.ZodDefault<z.ZodString>;
|
|
23
25
|
transport: z.ZodDefault<z.ZodEnum<["http", "stdio"]>>;
|
|
26
|
+
allowedOrigins: z.ZodDefault<z.ZodString>;
|
|
24
27
|
githubToken: z.ZodString;
|
|
25
28
|
githubApiBase: z.ZodDefault<z.ZodString>;
|
|
26
29
|
defaultPackage: z.ZodDefault<z.ZodString>;
|
|
@@ -39,7 +42,9 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
39
42
|
logJson: z.ZodDefault<z.ZodBoolean>;
|
|
40
43
|
}, "strip", z.ZodTypeAny, {
|
|
41
44
|
port: number;
|
|
45
|
+
host: string;
|
|
42
46
|
transport: "http" | "stdio";
|
|
47
|
+
allowedOrigins: string;
|
|
43
48
|
githubToken: string;
|
|
44
49
|
githubApiBase: string;
|
|
45
50
|
defaultPackage: string;
|
|
@@ -59,7 +64,9 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
59
64
|
}, {
|
|
60
65
|
githubToken: string;
|
|
61
66
|
port?: number | undefined;
|
|
67
|
+
host?: string | undefined;
|
|
62
68
|
transport?: "http" | "stdio" | undefined;
|
|
69
|
+
allowedOrigins?: string | undefined;
|
|
63
70
|
githubApiBase?: string | undefined;
|
|
64
71
|
defaultPackage?: string | undefined;
|
|
65
72
|
githubTimeout?: number | undefined;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAmDvD,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAA4B,CAAC;AAC3D,eAAO,MAAM,eAAe,eAAe,CAAC;AAE5C;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc,CAOnE;AAED,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAmDvD,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAA4B,CAAC;AAC3D,eAAO,MAAM,eAAe,eAAe,CAAC;AAE5C,eAAO,MAAM,aAAa,iDAC4E,CAAC;AAEvG;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc,CAOnE;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,wBAAgB,UAAU,IAAI,MAAM,CAsCnC"}
|
package/dist/config.js
CHANGED
|
@@ -56,6 +56,8 @@ export const MNE_PACKAGES = {
|
|
|
56
56
|
};
|
|
57
57
|
export const MNE_PACKAGE_NAMES = Object.keys(MNE_PACKAGES);
|
|
58
58
|
export const DEFAULT_PACKAGE = 'mne-python';
|
|
59
|
+
export const packageSchema = z.enum(MNE_PACKAGE_NAMES).optional()
|
|
60
|
+
.describe('MNE package to search (default: mne-python). Options: ' + MNE_PACKAGE_NAMES.join(', '));
|
|
59
61
|
/**
|
|
60
62
|
* Get package info by name, with fallback to default.
|
|
61
63
|
*/
|
|
@@ -69,7 +71,9 @@ export function getPackageInfo(packageName) {
|
|
|
69
71
|
}
|
|
70
72
|
export const ConfigSchema = z.object({
|
|
71
73
|
port: z.coerce.number().default(8000),
|
|
74
|
+
host: z.string().default('127.0.0.1'),
|
|
72
75
|
transport: z.enum(['http', 'stdio']).default('http'),
|
|
76
|
+
allowedOrigins: z.string().default('*'),
|
|
73
77
|
githubToken: z.string().min(1),
|
|
74
78
|
githubApiBase: z.string().default('https://api.github.com'),
|
|
75
79
|
defaultPackage: z.string().default(DEFAULT_PACKAGE),
|
|
@@ -90,7 +94,9 @@ export const ConfigSchema = z.object({
|
|
|
90
94
|
export function loadConfig() {
|
|
91
95
|
const config = {
|
|
92
96
|
port: process.env.MNE_PORT,
|
|
97
|
+
host: process.env.MNE_HOST,
|
|
93
98
|
transport: process.env.MNE_TRANSPORT,
|
|
99
|
+
allowedOrigins: process.env.MNE_ALLOWED_ORIGINS,
|
|
94
100
|
githubToken: process.env.MNE_GITHUB_TOKEN,
|
|
95
101
|
githubApiBase: process.env.MNE_GITHUB_API_BASE,
|
|
96
102
|
defaultPackage: process.env.MNE_DEFAULT_PACKAGE,
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -38,6 +38,34 @@ async function main() {
|
|
|
38
38
|
app.get('/metrics', (req, res) => {
|
|
39
39
|
res.json(metrics.getMetrics());
|
|
40
40
|
});
|
|
41
|
+
// CORS and Origin validation (MCP spec: validate Origin to prevent DNS rebinding)
|
|
42
|
+
const allowedOriginsList = config.allowedOrigins === '*' ? ['*'] : config.allowedOrigins.split(',').map(s => s.trim()).filter(Boolean);
|
|
43
|
+
app.use('/mcp', (req, res, next) => {
|
|
44
|
+
const origin = req.headers.origin;
|
|
45
|
+
if (origin) {
|
|
46
|
+
if (allowedOriginsList.includes('*')) {
|
|
47
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
48
|
+
}
|
|
49
|
+
else if (allowedOriginsList.includes(origin)) {
|
|
50
|
+
res.setHeader('Access-Control-Allow-Origin', origin);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
res.status(403).json({ error: 'Origin not allowed' });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
59
|
+
}
|
|
60
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
|
|
61
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Accept, Mcp-Session-Id');
|
|
62
|
+
res.setHeader('Access-Control-Expose-Headers', 'Mcp-Session-Id');
|
|
63
|
+
if (req.method === 'OPTIONS') {
|
|
64
|
+
res.status(204).end();
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
next();
|
|
68
|
+
});
|
|
41
69
|
// Session management for Streamable HTTP
|
|
42
70
|
const sessions = new Map();
|
|
43
71
|
// Streamable HTTP endpoint - handles POST, GET, DELETE
|
|
@@ -89,9 +117,9 @@ async function main() {
|
|
|
89
117
|
res.status(405).json({ error: 'Method not allowed' });
|
|
90
118
|
}
|
|
91
119
|
});
|
|
92
|
-
app.listen(config.port, () => {
|
|
93
|
-
logger.info(`Server listening on
|
|
94
|
-
logger.info(`MCP endpoint: http
|
|
120
|
+
app.listen(config.port, config.host, () => {
|
|
121
|
+
logger.info(`Server listening on ${config.host}:${config.port}`);
|
|
122
|
+
logger.info(`MCP endpoint: http://${config.host === '0.0.0.0' ? 'localhost' : config.host}:${config.port}/mcp`);
|
|
95
123
|
});
|
|
96
124
|
}
|
|
97
125
|
else {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.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,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAgDrC,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,sBAwDhD"}
|
package/dist/server.js
CHANGED
|
@@ -1,60 +1,79 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { MNE_PACKAGE_NAMES } from './config.js';
|
|
4
2
|
import { getLogger } from './utils/logger.js';
|
|
5
3
|
import { metrics } from './utils/metrics.js';
|
|
6
4
|
import { GitHubClient } from './github/client.js';
|
|
7
5
|
import { CacheManager } from './cache/manager.js';
|
|
8
|
-
import { listMneVersions } from './tools/listMneVersions.js';
|
|
9
|
-
import { getMneFile } from './tools/getMneFile.js';
|
|
10
|
-
import { getMneDoc } from './tools/getMneDoc.js';
|
|
11
|
-
import { findMneSymbol } from './tools/findMneSymbol.js';
|
|
12
|
-
import { searchMneDocs } from './tools/searchMneDocs.js';
|
|
13
|
-
import { searchMneIssues } from './tools/searchMneIssues.js';
|
|
14
|
-
import { getMneIssue } from './tools/getMneIssue.js';
|
|
15
|
-
import { getMneIssueComments } from './tools/getMneIssueComments.js';
|
|
16
|
-
import { searchMneForum } from './tools/searchMneForum.js';
|
|
17
|
-
import { getSymbolReferences } from './tools/getSymbolReferences.js';
|
|
18
|
-
import { getMneForumTopic } from './tools/getMneForumTopic.js';
|
|
19
|
-
import { getMneChangelog } from './tools/getMneChangelog.js';
|
|
20
|
-
import { getMneExample } from './tools/getMneExample.js';
|
|
21
|
-
import { getRelatedSymbols } from './tools/getRelatedSymbols.js';
|
|
22
|
-
import { lookupMneError } from './tools/lookupMneError.js';
|
|
23
6
|
import { PythonParserBridge } from './parser/bridge.js';
|
|
24
7
|
import { ForumClient } from './forum/client.js';
|
|
25
8
|
import { McpError } from './types.js';
|
|
26
9
|
import { getVersion } from './version.js';
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
10
|
+
import * as allTools from './tools/index.js';
|
|
11
|
+
const URL_KEYS = ['sourceUrl', 'docsUrl', 'htmlUrl', 'url'];
|
|
12
|
+
const RESOURCE_LINK_NAMES = { sourceUrl: 'Source', docsUrl: 'Docs', htmlUrl: 'Link', url: 'Link' };
|
|
13
|
+
function isHttpUrl(s) {
|
|
14
|
+
return typeof s === 'string' && (s.startsWith('http://') || s.startsWith('https://'));
|
|
15
|
+
}
|
|
16
|
+
function extractResourceLinks(result) {
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
const links = [];
|
|
19
|
+
function collect(obj) {
|
|
20
|
+
if (!obj || typeof obj !== 'object')
|
|
21
|
+
return;
|
|
22
|
+
if (Array.isArray(obj)) {
|
|
23
|
+
obj.forEach(collect);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
for (const key of URL_KEYS) {
|
|
27
|
+
const val = obj[key];
|
|
28
|
+
if (isHttpUrl(val) && !seen.has(val)) {
|
|
29
|
+
seen.add(val);
|
|
30
|
+
links.push({
|
|
31
|
+
type: 'resource_link',
|
|
32
|
+
uri: val,
|
|
33
|
+
name: RESOURCE_LINK_NAMES[key] ?? 'Link',
|
|
34
|
+
annotations: { audience: ['user', 'assistant'], priority: 0.9 },
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
for (const v of Object.values(obj)) {
|
|
39
|
+
if (Array.isArray(v))
|
|
40
|
+
v.forEach(collect);
|
|
41
|
+
else if (v && typeof v === 'object')
|
|
42
|
+
collect(v);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
collect(result);
|
|
46
|
+
return links;
|
|
47
|
+
}
|
|
30
48
|
export async function createServer(config) {
|
|
31
49
|
const logger = getLogger();
|
|
32
50
|
logger.info('Initializing MNE Docs MCP Server...');
|
|
33
|
-
// Initialize components
|
|
34
|
-
const githubClient = new GitHubClient(config);
|
|
35
|
-
const cacheManager = new CacheManager(config);
|
|
36
|
-
const parserBridge = new PythonParserBridge(config);
|
|
37
|
-
const forumClient = new ForumClient(config.forumBaseUrl, config.forumTimeout);
|
|
38
|
-
// Tool context
|
|
39
51
|
const toolContext = {
|
|
40
|
-
github:
|
|
41
|
-
cache:
|
|
42
|
-
parser:
|
|
43
|
-
forum:
|
|
52
|
+
github: new GitHubClient(config),
|
|
53
|
+
cache: new CacheManager(config),
|
|
54
|
+
parser: new PythonParserBridge(config),
|
|
55
|
+
forum: new ForumClient(config.forumBaseUrl, config.forumTimeout),
|
|
44
56
|
};
|
|
45
57
|
const server = new McpServer({
|
|
46
58
|
name: 'mne-docs-mcp',
|
|
47
59
|
version: getVersion(),
|
|
48
60
|
});
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
61
|
+
for (const tool of Object.values(allTools)) {
|
|
62
|
+
const { name, title, description, inputSchema, annotations, outputSchema } = tool.definition;
|
|
63
|
+
server.registerTool(name, { title, description, inputSchema, ...(annotations && { annotations }), ...(outputSchema && { outputSchema }) }, async (args) => {
|
|
52
64
|
logger.info(`Tool call: ${name}`, args);
|
|
53
65
|
metrics.recordToolCall(name);
|
|
54
66
|
try {
|
|
55
|
-
const result = await handler(args);
|
|
67
|
+
const result = await tool.handler(args, toolContext);
|
|
56
68
|
const text = typeof result === 'string' ? result : JSON.stringify(result, null, 2);
|
|
57
|
-
|
|
69
|
+
const content = [
|
|
70
|
+
{ type: 'text', text, annotations: { audience: ['assistant'], priority: 1 } },
|
|
71
|
+
...(typeof result === 'object' && result !== null ? extractResourceLinks(result) : []),
|
|
72
|
+
];
|
|
73
|
+
if (outputSchema && typeof result === 'object' && result !== null) {
|
|
74
|
+
return { content, structuredContent: result };
|
|
75
|
+
}
|
|
76
|
+
return { content };
|
|
58
77
|
}
|
|
59
78
|
catch (error) {
|
|
60
79
|
if (error instanceof McpError) {
|
|
@@ -71,152 +90,8 @@ export async function createServer(config) {
|
|
|
71
90
|
isError: true,
|
|
72
91
|
};
|
|
73
92
|
}
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
// Register tools
|
|
77
|
-
server.registerTool('list_mne_versions', {
|
|
78
|
-
title: 'List MNE Versions',
|
|
79
|
-
description: 'List available release versions for MNE-Python or related packages (mne-bids, mne-connectivity, etc.). Use to find valid version numbers before querying docs or code.',
|
|
80
|
-
inputSchema: {
|
|
81
|
-
limit: z.number().optional().describe('Max versions to return (default: 20)'),
|
|
82
|
-
stableOnly: z.boolean().optional().describe('Only return stable releases, excluding alpha/beta/rc/dev tags (default: false)'),
|
|
83
|
-
package: packageSchema,
|
|
84
|
-
},
|
|
85
|
-
}, wrapTool('list_mne_versions', (args) => listMneVersions(args, toolContext)));
|
|
86
|
-
server.registerTool('get_mne_file', {
|
|
87
|
-
title: 'Get MNE File',
|
|
88
|
-
description: 'Fetch raw source code from MNE-Python or related package repositories. Use when you need to see the actual implementation of a function or class.',
|
|
89
|
-
inputSchema: {
|
|
90
|
-
path: z.string().describe('File path in repo, e.g. "mne/epochs.py" or "mne_bids/write.py"'),
|
|
91
|
-
version: z.string().optional().describe('Version tag, e.g. "1.6.0" (default: latest)'),
|
|
92
|
-
maxLines: z.number().optional().describe('Truncate output to N lines'),
|
|
93
|
-
startLine: z.number().optional().describe('Start from this line number'),
|
|
94
|
-
endLine: z.number().optional().describe('End at this line number'),
|
|
95
|
-
package: packageSchema,
|
|
96
|
-
},
|
|
97
|
-
}, wrapTool('get_mne_file', (args) => getMneFile(args, toolContext)));
|
|
98
|
-
server.registerTool('get_mne_doc', {
|
|
99
|
-
title: 'Get MNE Documentation',
|
|
100
|
-
description: 'Get the docstring and API documentation for an MNE-Python class, function, or method. Returns signature, parameters, examples, and links to official docs. Use when users ask "how do I use X?" or "what does X do?"',
|
|
101
|
-
inputSchema: {
|
|
102
|
-
symbol: z.string().describe('Fully qualified name, e.g. "mne.Epochs", "mne.io.read_raw_fif", "mne.preprocessing.ICA"'),
|
|
103
|
-
version: z.string().optional().describe('Version tag (default: latest)'),
|
|
104
|
-
brief: z.boolean().optional().describe('Return only summary and signature to save tokens (default: false)'),
|
|
105
|
-
},
|
|
106
|
-
}, wrapTool('get_mne_doc', (args) => getMneDoc(args, toolContext)));
|
|
107
|
-
server.registerTool('find_mne_symbol', {
|
|
108
|
-
title: 'Find MNE Symbol',
|
|
109
|
-
description: 'Search for classes, functions, or methods in MNE-Python by name. Use when you know part of a name but not the full path, e.g. "filter" finds mne.filter.filter_data, mne.io.Raw.filter, etc.',
|
|
110
|
-
inputSchema: {
|
|
111
|
-
query: z.string().describe('Search term, e.g. "filter", "epoch", "ica"'),
|
|
112
|
-
version: z.string().optional().describe('Version tag (default: latest)'),
|
|
113
|
-
maxResults: z.number().optional().describe('Max results to return (default: 10)'),
|
|
114
|
-
includePrivate: z.boolean().optional().describe('Include private (_name) symbols (default: false)'),
|
|
115
|
-
},
|
|
116
|
-
}, wrapTool('find_mne_symbol', (args) => findMneSymbol(args, toolContext)));
|
|
117
|
-
server.registerTool('search_mne_docs', {
|
|
118
|
-
title: 'Search MNE Docs',
|
|
119
|
-
description: 'Full-text search across MNE documentation, source code, GitHub issues, and community forum. Use for broad queries like "how to remove artifacts" or "memory error when loading".',
|
|
120
|
-
inputSchema: {
|
|
121
|
-
query: z.string().describe('Search query, e.g. "artifact rejection", "ICA tutorial", "memory leak"'),
|
|
122
|
-
version: z.string().optional().describe('Version tag (default: latest)'),
|
|
123
|
-
maxResultsPerSource: z.number().optional().describe('Max results per source type (default: 5)'),
|
|
124
|
-
package: packageSchema,
|
|
125
|
-
},
|
|
126
|
-
}, wrapTool('search_mne_docs', (args) => searchMneDocs(args, toolContext)));
|
|
127
|
-
server.registerTool('search_mne_issues', {
|
|
128
|
-
title: 'Search MNE Issues',
|
|
129
|
-
description: 'Search GitHub issues for MNE packages. Use to find bug reports, feature requests, or known problems. Helpful when users encounter errors or unexpected behavior.',
|
|
130
|
-
inputSchema: {
|
|
131
|
-
query: z.string().describe('Search query, e.g. "memory leak", "segmentation fault", "deprecation warning"'),
|
|
132
|
-
state: z.enum(['open', 'closed', 'all']).optional().describe('Filter by issue state (default: all)'),
|
|
133
|
-
labels: z.array(z.string()).optional().describe('Filter by labels, e.g. ["bug", "help wanted"]'),
|
|
134
|
-
maxResults: z.number().optional().describe('Max results (default: 10)'),
|
|
135
|
-
sort: z.enum(['relevance', 'updated', 'created', 'comments']).optional().describe('Sort order (default: relevance). Use "updated" for most recently active issues.'),
|
|
136
|
-
package: packageSchema,
|
|
137
|
-
},
|
|
138
|
-
}, wrapTool('search_mne_issues', (args) => searchMneIssues(args, toolContext)));
|
|
139
|
-
server.registerTool('get_mne_issue', {
|
|
140
|
-
title: 'Get MNE Issue',
|
|
141
|
-
description: 'Get full details of a specific GitHub issue by number. Use after search_mne_issues to read the complete issue description and context.',
|
|
142
|
-
inputSchema: {
|
|
143
|
-
issueNumber: z.number().describe('GitHub issue number, e.g. 12345'),
|
|
144
|
-
package: packageSchema,
|
|
145
|
-
},
|
|
146
|
-
}, wrapTool('get_mne_issue', (args) => getMneIssue(args, toolContext)));
|
|
147
|
-
server.registerTool('get_mne_issue_comments', {
|
|
148
|
-
title: 'Get MNE Issue Comments',
|
|
149
|
-
description: 'Get all comments on a GitHub issue. Use to see the discussion, workarounds, and resolution for a bug or feature request.',
|
|
150
|
-
inputSchema: {
|
|
151
|
-
issueNumber: z.number().describe('GitHub issue number'),
|
|
152
|
-
package: packageSchema,
|
|
153
|
-
},
|
|
154
|
-
}, wrapTool('get_mne_issue_comments', (args) => getMneIssueComments(args, toolContext)));
|
|
155
|
-
server.registerTool('search_mne_forum', {
|
|
156
|
-
title: 'Search MNE Forum',
|
|
157
|
-
description: 'Search the MNE community Discourse forum for user questions and answers. Great for "how do I..." questions, troubleshooting, and best practices from the community.',
|
|
158
|
-
inputSchema: {
|
|
159
|
-
query: z.string().describe('Search query, e.g. "ICA artifact removal", "source localization", "EEG preprocessing"'),
|
|
160
|
-
maxResults: z.number().optional().describe('Max results (default: 5)'),
|
|
161
|
-
},
|
|
162
|
-
}, wrapTool('search_mne_forum', (args) => searchMneForum(args, toolContext)));
|
|
163
|
-
server.registerTool('get_symbol_references', {
|
|
164
|
-
title: 'Get Symbol References',
|
|
165
|
-
description: 'Find what functions a symbol calls (callees) and what calls it (callers). Use to understand code dependencies or find related functionality.',
|
|
166
|
-
inputSchema: {
|
|
167
|
-
symbol: z.string().describe('Fully qualified name, e.g. "mne.filter.filter_data"'),
|
|
168
|
-
version: z.string().optional().describe('Version tag (default: latest)'),
|
|
169
|
-
crossFile: z.boolean().optional().describe('Also search for callers in other files via GitHub code search (default: false, costs extra API calls)'),
|
|
170
|
-
},
|
|
171
|
-
}, wrapTool('get_symbol_references', (args) => getSymbolReferences(args, toolContext)));
|
|
172
|
-
server.registerTool('get_mne_forum_topic', {
|
|
173
|
-
title: 'Get MNE Forum Topic',
|
|
174
|
-
description: 'Get the full content of a forum discussion including all posts. Use after search_mne_forum to read complete answers and solutions.',
|
|
175
|
-
inputSchema: {
|
|
176
|
-
topicId: z.number().describe('Forum topic ID (from search_mne_forum results URL)'),
|
|
177
|
-
maxPosts: z.number().optional().describe('Max posts to return (default: all)'),
|
|
178
|
-
maxContentLength: z.number().optional().describe('Truncate each post to N chars (default: 2000)'),
|
|
179
|
-
},
|
|
180
|
-
}, wrapTool('get_mne_forum_topic', (args) => getMneForumTopic(args, toolContext)));
|
|
181
|
-
server.registerTool('get_mne_changelog', {
|
|
182
|
-
title: 'Get MNE Changelog',
|
|
183
|
-
description: 'Get release notes for a specific MNE version. Use to find what changed between versions, new features, bug fixes, and deprecations.',
|
|
184
|
-
inputSchema: {
|
|
185
|
-
version: z.string().describe('Version number, e.g. "1.6.0"'),
|
|
186
|
-
section: z.enum(['all', 'new', 'changes', 'deprecations', 'bugfixes']).optional().describe('Filter to specific section (default: all)'),
|
|
187
|
-
package: packageSchema,
|
|
188
|
-
},
|
|
189
|
-
}, wrapTool('get_mne_changelog', (args) => getMneChangelog(args, toolContext)));
|
|
190
|
-
server.registerTool('get_mne_example', {
|
|
191
|
-
title: 'Get MNE Example',
|
|
192
|
-
description: 'Get tutorial and example code from the MNE gallery. Use when users want to see working code for a specific task like "ICA", "source localization", or "time-frequency analysis".',
|
|
193
|
-
inputSchema: {
|
|
194
|
-
query: z.string().describe('Topic to search, e.g. "epochs", "ICA", "evoked", "source estimation"'),
|
|
195
|
-
maxResults: z.number().optional().describe('Max examples to return (default: 3)'),
|
|
196
|
-
version: z.string().optional().describe('Version tag (default: latest)'),
|
|
197
|
-
summaryOnly: z.boolean().optional().describe('Return only titles and descriptions, no code (default: false)'),
|
|
198
|
-
maxCodeLines: z.number().optional().describe('Truncate code to N lines (default: 100)'),
|
|
199
|
-
package: packageSchema,
|
|
200
|
-
},
|
|
201
|
-
}, wrapTool('get_mne_example', (args) => getMneExample(args, toolContext)));
|
|
202
|
-
server.registerTool('get_related_symbols', {
|
|
203
|
-
title: 'Get Related Symbols',
|
|
204
|
-
description: 'Find functions and classes related to a given symbol — same module, referenced in "See Also", or similar names. Use to discover alternative approaches or related functionality.',
|
|
205
|
-
inputSchema: {
|
|
206
|
-
symbol: z.string().describe('Fully qualified name, e.g. "mne.Epochs"'),
|
|
207
|
-
version: z.string().optional().describe('Version tag (default: latest)'),
|
|
208
|
-
maxResults: z.number().optional().describe('Max results (default: 10)'),
|
|
209
|
-
},
|
|
210
|
-
}, wrapTool('get_related_symbols', (args) => getRelatedSymbols(args, toolContext)));
|
|
211
|
-
server.registerTool('lookup_mne_error', {
|
|
212
|
-
title: 'Lookup MNE Error',
|
|
213
|
-
description: 'Diagnose MNE error messages and get solutions. Searches known issues, forum posts, and provides common fixes. Use when users paste an error traceback or ask why something failed.',
|
|
214
|
-
inputSchema: {
|
|
215
|
-
errorMessage: z.string().describe('The error message or traceback, e.g. "ValueError: No events found"'),
|
|
216
|
-
context: z.string().optional().describe('Code that caused the error (helps find better solutions)'),
|
|
217
|
-
brief: z.boolean().optional().describe('Return only descriptions, no code examples (default: false)'),
|
|
218
|
-
},
|
|
219
|
-
}, wrapTool('lookup_mne_error', (args) => lookupMneError(args, toolContext)));
|
|
93
|
+
});
|
|
94
|
+
}
|
|
220
95
|
return server;
|
|
221
96
|
}
|
|
222
97
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default annotations for all MNE Docs MCP tools.
|
|
3
|
+
* All tools are read-only (fetch from GitHub/Discourse), non-destructive, idempotent, and call external APIs.
|
|
4
|
+
* Matches MCP ToolAnnotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint).
|
|
5
|
+
*/
|
|
6
|
+
export declare const READ_ONLY_TOOL_ANNOTATIONS: {
|
|
7
|
+
readonly readOnlyHint: true;
|
|
8
|
+
readonly destructiveHint: false;
|
|
9
|
+
readonly idempotentHint: true;
|
|
10
|
+
readonly openWorldHint: true;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=annotations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/tools/annotations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;;;;;CAK7B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default annotations for all MNE Docs MCP tools.
|
|
3
|
+
* All tools are read-only (fetch from GitHub/Discourse), non-destructive, idempotent, and call external APIs.
|
|
4
|
+
* Matches MCP ToolAnnotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint).
|
|
5
|
+
*/
|
|
6
|
+
export const READ_ONLY_TOOL_ANNOTATIONS = {
|
|
7
|
+
readOnlyHint: true,
|
|
8
|
+
destructiveHint: false,
|
|
9
|
+
idempotentHint: true,
|
|
10
|
+
openWorldHint: true,
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=annotations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/tools/annotations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACtC,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;CACb,CAAC"}
|