nodebench-mcp 3.1.0 → 3.1.2
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 +49 -33
- package/dist/index.js +18 -18
- package/dist/index.js.map +1 -1
- package/dist/tools/documentationTools.js +6 -6
- package/dist/tools/documentationTools.js.map +1 -1
- package/dist/tools/localFileCsvTools.js +16 -46
- package/dist/tools/localFileCsvTools.js.map +1 -1
- package/dist/tools/localFileHelpers.d.ts +4 -2
- package/dist/tools/localFileHelpers.js +74 -17
- package/dist/tools/localFileHelpers.js.map +1 -1
- package/dist/tools/metaTools.js +5 -5
- package/dist/tools/metaTools.js.map +1 -1
- package/dist/tools/webTools.d.ts +1 -1
- package/dist/tools/webTools.js +44 -36
- package/dist/tools/webTools.js.map +1 -1
- package/package.json +12 -6
- package/server.json +2 -2
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# NodeBench MCP
|
|
1
|
+
# NodeBench MCP
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/nodebench-mcp)
|
|
4
4
|
[](https://www.npmjs.com/package/nodebench-mcp)
|
|
@@ -25,10 +25,10 @@ claude mcp add nodebench-admin -- npx -y nodebench-mcp-admin
|
|
|
25
25
|
|
|
26
26
|
### What's New
|
|
27
27
|
|
|
28
|
-
- **v3 default surface**
|
|
29
|
-
- **Admin-only runtime gates**
|
|
30
|
-
- **Faster health path**
|
|
31
|
-
- **
|
|
28
|
+
- **v3 default surface** - the default preset is now a workflow-first facade instead of a tool warehouse.
|
|
29
|
+
- **Admin-only runtime gates** - dashboards and the observability watchdog no longer start on the default hot path. Use `--admin`, `--dashboards`, or `--watchdog` explicitly.
|
|
30
|
+
- **Faster health path** - `--health` now loads only the active preset instead of eagerly loading every domain.
|
|
31
|
+
- **Separate install lanes** - `nodebench-mcp-power` and `nodebench-mcp-admin` are now published companion packages, while `--preset power` and `--preset admin` remain compatible paths on the core package.
|
|
32
32
|
|
|
33
33
|
> **New here?** Read **[AGENT_LOGIC.md](./AGENT_LOGIC.md)** for the complete guide to how NodeBench thinks.
|
|
34
34
|
|
|
@@ -101,13 +101,13 @@ Production companion spec: [`docs/architecture/UNIFIED_WEB_MCP_PRODUCTION_SPEC.m
|
|
|
101
101
|
|
|
102
102
|
NodeBench is now a workflow-first MCP. The default install proves one concrete job quickly, and the heavier surfaces are still available when you explicitly ask for them.
|
|
103
103
|
|
|
104
|
-
### Presets
|
|
104
|
+
### Install Lanes And Presets
|
|
105
105
|
|
|
106
|
-
|
|
|
106
|
+
| Entry | Surface | What it is for |
|
|
107
107
|
|---|---|---|
|
|
108
|
-
| `
|
|
109
|
-
| `power` | expanded workflow surface | Founder, recon, packets, and web-heavy workflows without admin runtime |
|
|
110
|
-
| `admin` | operator surface | Profiling, observability, dashboards, eval, and debug-oriented lanes |
|
|
108
|
+
| `nodebench-mcp` | `9` visible tools | Workflow-first lane: `investigate`, `compare`, `track`, `summarize`, `search`, `report`, `ask_context`, `discover_tools`, `load_toolset` |
|
|
109
|
+
| `nodebench-mcp-power` | expanded workflow surface | Founder, recon, packets, and web-heavy workflows without admin runtime |
|
|
110
|
+
| `nodebench-mcp-admin` | operator surface | Profiling, observability, dashboards, eval, and debug-oriented lanes |
|
|
111
111
|
| `core` | full methodology lane | Verification, eval, learning, recon, execution trace, and mission harness |
|
|
112
112
|
| `founder` | compatibility preset | Legacy founder-facing pack kept for existing setups |
|
|
113
113
|
| `full` | all loaded domains | Maximum coverage when you explicitly want the warehouse |
|
|
@@ -121,10 +121,16 @@ ASK -> CHECK -> WRITE -> SAVE
|
|
|
121
121
|
The default preset is optimized for that loop. It does not start local dashboards or the observability watchdog unless you pass admin flags explicitly.
|
|
122
122
|
|
|
123
123
|
```bash
|
|
124
|
-
# Claude Code
|
|
124
|
+
# Claude Code core lane
|
|
125
125
|
claude mcp add nodebench -- npx -y nodebench-mcp
|
|
126
126
|
|
|
127
|
-
#
|
|
127
|
+
# Claude Code power lane
|
|
128
|
+
claude mcp add nodebench-power -- npx -y nodebench-mcp-power
|
|
129
|
+
|
|
130
|
+
# Claude Code admin lane
|
|
131
|
+
claude mcp add nodebench-admin -- npx -y nodebench-mcp-admin
|
|
132
|
+
|
|
133
|
+
# Windsurf / Cursor - add --preset to args only when you want a compatibility preset on the core package
|
|
128
134
|
```
|
|
129
135
|
|
|
130
136
|
---
|
|
@@ -135,6 +141,8 @@ claude mcp add nodebench -- npx -y nodebench-mcp
|
|
|
135
141
|
|
|
136
142
|
```bash
|
|
137
143
|
claude mcp add nodebench -- npx -y nodebench-mcp
|
|
144
|
+
claude mcp add nodebench-power -- npx -y nodebench-mcp-power
|
|
145
|
+
claude mcp add nodebench-admin -- npx -y nodebench-mcp-admin
|
|
138
146
|
```
|
|
139
147
|
|
|
140
148
|
Or add to `~/.claude/settings.json` or `.mcp.json` in your project root:
|
|
@@ -172,9 +180,9 @@ Add to `.windsurf/mcp.json` (or Settings > MCP > View raw config):
|
|
|
172
180
|
```json
|
|
173
181
|
{
|
|
174
182
|
"mcpServers": {
|
|
175
|
-
"nodebench": {
|
|
183
|
+
"nodebench-power": {
|
|
176
184
|
"command": "npx",
|
|
177
|
-
"args": ["-y", "nodebench-mcp
|
|
185
|
+
"args": ["-y", "nodebench-mcp-power"]
|
|
178
186
|
}
|
|
179
187
|
}
|
|
180
188
|
}
|
|
@@ -182,7 +190,13 @@ Add to `.windsurf/mcp.json` (or Settings > MCP > View raw config):
|
|
|
182
190
|
|
|
183
191
|
### Other MCP Clients
|
|
184
192
|
|
|
185
|
-
Any MCP-compatible client works. Point `command` to `npx
|
|
193
|
+
Any MCP-compatible client works. Point `command` to `npx` and choose the package that matches the lane you want:
|
|
194
|
+
|
|
195
|
+
- `["-y", "nodebench-mcp"]` for the tiny default workflow lane
|
|
196
|
+
- `["-y", "nodebench-mcp-power"]` for the expanded founder/research lane
|
|
197
|
+
- `["-y", "nodebench-mcp-admin"]` for the operator lane
|
|
198
|
+
|
|
199
|
+
Add `"--preset", "<name>"` only when you want a compatibility preset on the core package.
|
|
186
200
|
|
|
187
201
|
### First Prompts to Try
|
|
188
202
|
|
|
@@ -232,17 +246,17 @@ Set these as environment variables, or add them to the `env` block in your MCP c
|
|
|
232
246
|
|
|
233
247
|
---
|
|
234
248
|
|
|
235
|
-
## Progressive Discovery
|
|
249
|
+
## Progressive Discovery — How Optional Toolsets Stay Off the Hot Path
|
|
236
250
|
|
|
237
251
|
The default preset exposes `9` tools. Everything else stays off the hot path until you deliberately load a specific toolset.
|
|
238
252
|
|
|
239
253
|
### How it works
|
|
240
254
|
|
|
241
255
|
```
|
|
242
|
-
1. discover_tools("your task description")
|
|
243
|
-
2. load_toolset("ui_ux_dive")
|
|
244
|
-
3. Use the newly loaded tools directly
|
|
245
|
-
4. Keep the default surface small
|
|
256
|
+
1. discover_tools("your task description") → ranked results from the full registry
|
|
257
|
+
2. load_toolset("ui_ux_dive") → a specific toolset activates in your session
|
|
258
|
+
3. Use the newly loaded tools directly → no proxy, native binding
|
|
259
|
+
4. Keep the default surface small → only load what the workflow needs
|
|
246
260
|
```
|
|
247
261
|
|
|
248
262
|
### Multi-modal search engine
|
|
@@ -253,7 +267,7 @@ The default preset exposes `9` tools. Everything else stays off the hot path unt
|
|
|
253
267
|
|---|---|
|
|
254
268
|
| Keyword + TF-IDF | Exact matching, rare tags score higher |
|
|
255
269
|
| Fuzzy (Levenshtein) | Tolerates typos |
|
|
256
|
-
| Semantic (synonyms) | 30 word families
|
|
270
|
+
| Semantic (synonyms) | 30 word families — "check" finds "verify", "validate" |
|
|
257
271
|
| N-gram + Bigram | Partial words and phrases |
|
|
258
272
|
| Dense (TF-IDF cosine) | Vector-like ranking |
|
|
259
273
|
| Embedding (neural) | Agent-as-a-Graph bipartite search |
|
|
@@ -284,7 +298,7 @@ Track actions, paths, and state across sessions. Important-change review surface
|
|
|
284
298
|
|
|
285
299
|
### Artifact Packets
|
|
286
300
|
|
|
287
|
-
Every analysis produces a shareable artifact
|
|
301
|
+
Every analysis produces a shareable artifact — decision memos, delegation briefs, investigation reports. The output is the distribution.
|
|
288
302
|
|
|
289
303
|
### Founder Tools
|
|
290
304
|
|
|
@@ -292,7 +306,7 @@ Weekly reset, pre-delegation briefing, company tracking, important-change review
|
|
|
292
306
|
|
|
293
307
|
### Knowledge Compounding
|
|
294
308
|
|
|
295
|
-
`record_learning` + `search_all_knowledge`
|
|
309
|
+
`record_learning` + `search_all_knowledge` — findings persist across sessions. By session 9, the agent finds 2+ relevant prior findings before writing a single line of code.
|
|
296
310
|
|
|
297
311
|
---
|
|
298
312
|
|
|
@@ -332,7 +346,7 @@ npx nodebench-mcp --toolsets deep_sim,recon,learning
|
|
|
332
346
|
# Exclude heavy toolsets
|
|
333
347
|
npx nodebench-mcp --exclude vision,ui_capture,parallel
|
|
334
348
|
|
|
335
|
-
# Dynamic loading
|
|
349
|
+
# Dynamic loading — start minimal, load on demand
|
|
336
350
|
npx nodebench-mcp --dynamic
|
|
337
351
|
|
|
338
352
|
# Smart preset recommendation based on your project
|
|
@@ -348,7 +362,7 @@ npx nodebench-mcp --list-presets
|
|
|
348
362
|
npx nodebench-mcp --help
|
|
349
363
|
```
|
|
350
364
|
|
|
351
|
-
### TOON Format
|
|
365
|
+
### TOON Format — Token Savings
|
|
352
366
|
|
|
353
367
|
TOON (Token-Oriented Object Notation) is on by default. Every tool response is TOON-encoded for ~40% fewer tokens vs JSON. Disable with `--no-toon`.
|
|
354
368
|
|
|
@@ -361,7 +375,7 @@ NodeBench MCP runs locally on your machine.
|
|
|
361
375
|
- All persistent data stored in `~/.nodebench/` (SQLite). No data sent to external servers unless you provide API keys and use tools that call external APIs.
|
|
362
376
|
- Analytics data never leaves your machine.
|
|
363
377
|
- The `local_file` toolset can read files anywhere your Node.js process has permission. Use the `default` preset to keep local-file tools off the hot path.
|
|
364
|
-
- All API keys read from environment variables
|
|
378
|
+
- All API keys read from environment variables — never hardcoded or logged.
|
|
365
379
|
- All database queries use parameterized statements.
|
|
366
380
|
|
|
367
381
|
---
|
|
@@ -391,22 +405,24 @@ Then use absolute path:
|
|
|
391
405
|
|
|
392
406
|
## Troubleshooting
|
|
393
407
|
|
|
394
|
-
**"No search provider available"**
|
|
408
|
+
**"No search provider available"** — Set `GEMINI_API_KEY`, `OPENAI_API_KEY`, or `PERPLEXITY_API_KEY`
|
|
395
409
|
|
|
396
|
-
**"GitHub API error 403"**
|
|
410
|
+
**"GitHub API error 403"** — Set `GITHUB_TOKEN` for higher rate limits
|
|
397
411
|
|
|
398
|
-
**"Cannot find module"**
|
|
412
|
+
**"Cannot find module"** — Run `npm run build` in the mcp-local directory
|
|
399
413
|
|
|
400
|
-
**MCP not connecting**
|
|
414
|
+
**MCP not connecting** — Check path is absolute, run `claude --mcp-debug`, ensure Node.js >= 18
|
|
401
415
|
|
|
402
|
-
**Windsurf not finding tools**
|
|
416
|
+
**Windsurf not finding tools** — Verify `~/.codeium/windsurf/mcp_config.json` has correct JSON structure
|
|
403
417
|
|
|
404
|
-
**Cursor tools not loading**
|
|
418
|
+
**Cursor tools not loading** — Ensure `.cursor/mcp.json` exists in project root. Use `--preset cursor` to stay within the tool cap. Restart Cursor after config changes.
|
|
405
419
|
|
|
406
|
-
**Dynamic loading not working**
|
|
420
|
+
**Dynamic loading not working** — Claude Code and GitHub Copilot support native dynamic loading. For Windsurf/Cursor, prefer `--preset cursor` or `--preset power` if your client does not refresh tools reliably after `load_toolset`.
|
|
407
421
|
|
|
408
422
|
---
|
|
409
423
|
|
|
410
424
|
## License
|
|
411
425
|
|
|
412
426
|
MIT
|
|
427
|
+
|
|
428
|
+
|
package/dist/index.js
CHANGED
|
@@ -527,9 +527,9 @@ if (healthFlag) {
|
|
|
527
527
|
const warn = `${Y}WARN${X}`;
|
|
528
528
|
const fail = `${R}FAIL${X}`;
|
|
529
529
|
const lines = [];
|
|
530
|
-
lines.push(`${B}
|
|
530
|
+
lines.push(`${B}${DISPLAY_NAME} v${NODEBENCH_VERSION} - Health Check${X}`);
|
|
531
531
|
lines.push("");
|
|
532
|
-
// 1. Tool count + preset
|
|
532
|
+
// 1. Tool count + preset - load only the active preset for a fast health path
|
|
533
533
|
const activePreset = requestedPreset;
|
|
534
534
|
const presetToolsets = PRESETS[activePreset];
|
|
535
535
|
if (presetToolsets) {
|
|
@@ -609,7 +609,7 @@ if (healthFlag) {
|
|
|
609
609
|
["tesseract.js", "OCR text extraction"],
|
|
610
610
|
["pdf-parse", "PDF parsing"],
|
|
611
611
|
["mammoth", "DOCX parsing"],
|
|
612
|
-
["
|
|
612
|
+
["read-excel-file", "Spreadsheet parsing"],
|
|
613
613
|
];
|
|
614
614
|
for (const [pkg, desc] of pkgChecks) {
|
|
615
615
|
const installed = _isInstalled(pkg);
|
|
@@ -694,7 +694,7 @@ if (statusFlag) {
|
|
|
694
694
|
const Database = (await import("better-sqlite3")).default;
|
|
695
695
|
const db = new Database(dbPath, { readonly: true });
|
|
696
696
|
const lines = [];
|
|
697
|
-
lines.push(`${B}
|
|
697
|
+
lines.push(`${B}${DISPLAY_NAME} - System Status${X}`);
|
|
698
698
|
lines.push("");
|
|
699
699
|
// Uptime info from DB (last tool call as proxy for when server was active)
|
|
700
700
|
try {
|
|
@@ -726,7 +726,7 @@ if (statusFlag) {
|
|
|
726
726
|
// Error trend
|
|
727
727
|
const errPrevHour = db.prepare(`SELECT COUNT(*) as cnt FROM tool_call_log WHERE result_status='error' AND created_at > datetime('now', '-2 hours') AND created_at <= datetime('now', '-1 hour')`).get();
|
|
728
728
|
const direction = errors1h.cnt > errPrevHour.cnt ? `${R}increasing${X}` : errors1h.cnt < errPrevHour.cnt ? `${G}decreasing${X}` : `${G}stable${X}`;
|
|
729
|
-
lines.push(`${C}Error Trend${X} ${direction} (${errPrevHour.cnt} prev hour
|
|
729
|
+
lines.push(`${C}Error Trend${X} ${direction} (${errPrevHour.cnt} prev hour -> ${errors1h.cnt} this hour)`);
|
|
730
730
|
// Active verification cycles
|
|
731
731
|
const activeCycles = db.prepare(`SELECT COUNT(*) as cnt FROM verification_cycles WHERE status IN ('active', 'in_progress')`).get();
|
|
732
732
|
if (activeCycles.cnt > 0) {
|
|
@@ -761,7 +761,7 @@ if (diagnoseFlag) {
|
|
|
761
761
|
const Database = (await import("better-sqlite3")).default;
|
|
762
762
|
const db = new Database(dbPath);
|
|
763
763
|
const lines = [];
|
|
764
|
-
lines.push(`${B}
|
|
764
|
+
lines.push(`${B}${DISPLAY_NAME} - Diagnose & Heal${X}`);
|
|
765
765
|
lines.push("");
|
|
766
766
|
let issueCount = 0;
|
|
767
767
|
let healedCount = 0;
|
|
@@ -966,7 +966,7 @@ if (syncConfigsFlag) {
|
|
|
966
966
|
return { action: hadExisting ? "updated" : "created", path: filePath };
|
|
967
967
|
}
|
|
968
968
|
const lines = [];
|
|
969
|
-
lines.push(`${B}
|
|
969
|
+
lines.push(`${B}${DISPLAY_NAME} - Sync IDE Configs${X}`);
|
|
970
970
|
lines.push("");
|
|
971
971
|
const results = [];
|
|
972
972
|
// 1. Claude Code: ~/.claude/claude_desktop_config.json
|
|
@@ -1394,10 +1394,10 @@ if (subCmd === "call") {
|
|
|
1394
1394
|
const D = USE_COLOR ? "\x1b[2m" : "";
|
|
1395
1395
|
const X = USE_COLOR ? "\x1b[0m" : "";
|
|
1396
1396
|
if (!toolName) {
|
|
1397
|
-
console.log(`\n ${B}Usage:${X}
|
|
1398
|
-
console.log(` ${D}Example:${X}
|
|
1399
|
-
console.log(` ${D}Example:${X}
|
|
1400
|
-
console.log(` ${D}Example:${X}
|
|
1397
|
+
console.log(`\n ${B}Usage:${X} ${NPX_COMMAND} call <tool_name> [json_args]\n`);
|
|
1398
|
+
console.log(` ${D}Example:${X} ${NPX_COMMAND} call founder_deep_context_gather '{"packetType":"weekly_reset"}'`);
|
|
1399
|
+
console.log(` ${D}Example:${X} ${NPX_COMMAND} call discover_tools '{"query":"founder"}'`);
|
|
1400
|
+
console.log(` ${D}Example:${X} ${NPX_COMMAND} call save_session_note '{"note":"test"}'\n`);
|
|
1401
1401
|
process.exit(0);
|
|
1402
1402
|
}
|
|
1403
1403
|
// Find tool in all toolsets — meta/discovery tools are created later,
|
|
@@ -1409,7 +1409,7 @@ if (subCmd === "call") {
|
|
|
1409
1409
|
const tool = allCallable.find(t => t.name === toolName);
|
|
1410
1410
|
if (!tool) {
|
|
1411
1411
|
console.log(`\n ${R}Tool not found:${X} ${toolName}`);
|
|
1412
|
-
console.log(` ${D}Run:
|
|
1412
|
+
console.log(` ${D}Run: ${NPX_COMMAND} discover ${toolName}${X}\n`);
|
|
1413
1413
|
process.exit(1);
|
|
1414
1414
|
}
|
|
1415
1415
|
let parsedArgs;
|
|
@@ -1449,22 +1449,22 @@ if (subCmd === "setup") {
|
|
|
1449
1449
|
const X = USE_COLOR ? "\x1b[0m" : "";
|
|
1450
1450
|
const lines = [];
|
|
1451
1451
|
lines.push("");
|
|
1452
|
-
lines.push(` ${B}
|
|
1452
|
+
lines.push(` ${B}${DISPLAY_NAME} - Quick Setup${X}`);
|
|
1453
1453
|
lines.push("");
|
|
1454
1454
|
lines.push(` ${G}1.${X} ${B}Claude Code${X}`);
|
|
1455
|
-
lines.push(` claude mcp add
|
|
1455
|
+
lines.push(` claude mcp add ${SERVER_KEY} -- ${NPX_Y_COMMAND}`);
|
|
1456
1456
|
lines.push("");
|
|
1457
1457
|
lines.push(` ${G}2.${X} ${B}Cursor${X} ${D}(.cursor/mcp.json)${X}`);
|
|
1458
|
-
lines.push(` { "mcpServers": { "
|
|
1458
|
+
lines.push(` { "mcpServers": { "${SERVER_KEY}": { "command": "npx", "args": ["-y", "${NODEBENCH_NPX_PACKAGE}"] } } }`);
|
|
1459
1459
|
lines.push("");
|
|
1460
1460
|
lines.push(` ${G}3.${X} ${B}Windsurf${X} ${D}(.windsurf/mcp.json)${X}`);
|
|
1461
|
-
lines.push(` { "mcpServers": { "
|
|
1461
|
+
lines.push(` { "mcpServers": { "${SERVER_KEY}": { "command": "npx", "args": ["-y", "${NODEBENCH_NPX_PACKAGE}"] } } }`);
|
|
1462
1462
|
lines.push("");
|
|
1463
|
-
lines.push(` ${C}Verify:${X}
|
|
1463
|
+
lines.push(` ${C}Verify:${X} ${NPX_COMMAND} call discover_tools '{"query":"founder"}'`);
|
|
1464
1464
|
lines.push(` ${C}Dashboard:${X} https://www.nodebenchai.com/founder`);
|
|
1465
1465
|
lines.push(` ${C}Agent setup:${X} https://www.nodebenchai.com/agent-setup.txt`);
|
|
1466
1466
|
lines.push("");
|
|
1467
|
-
lines.push(` ${Y}
|
|
1467
|
+
lines.push(` ${Y}Compatibility presets on core package:${X} --preset default | --preset power | --preset admin`);
|
|
1468
1468
|
lines.push(` ${Y}Founder tools:${X} founder_deep_context_gather, founder_packet_validate, founder_packet_diff`);
|
|
1469
1469
|
lines.push("");
|
|
1470
1470
|
console.log(lines.join("\n"));
|