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 CHANGED
@@ -1,4 +1,4 @@
1
- # NodeBench MCP
1
+ # NodeBench MCP
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/nodebench-mcp.svg)](https://www.npmjs.com/package/nodebench-mcp)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/nodebench-mcp.svg)](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** 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
- - **Power and admin presets** heavier research and operator lanes are still available, but no longer define the front door.
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
- | Preset | Surface | What it is for |
106
+ | Entry | Surface | What it is for |
107
107
  |---|---|---|
108
- | `default` | `9` visible tools | Workflow-first lane: `investigate`, `compare`, `track`, `summarize`, `search`, `report`, `ask_context`, `discover_tools`, `load_toolset` |
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
- # Windsurf / Cursor — add --preset to args in your MCP config when you want more than the default workflow surface
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", "--preset", "power"]
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`, `args` to `["-y", "nodebench-mcp"]`. Add `"--preset", "<name>"` to the args array for presets.
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 How Optional Toolsets Stay Off the Hot Path
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") ranked results from the full registry
243
- 2. load_toolset("ui_ux_dive") a specific toolset activates in your session
244
- 3. Use the newly loaded tools directly no proxy, native binding
245
- 4. Keep the default surface small only load what the workflow needs
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 "check" finds "verify", "validate" |
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 decision memos, delegation briefs, investigation reports. The output is the distribution.
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` findings persist across sessions. By session 9, the agent finds 2+ relevant prior findings before writing a single line of code.
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 start minimal, load on demand
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 Token Savings
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 never hardcoded or logged.
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"** Set `GEMINI_API_KEY`, `OPENAI_API_KEY`, or `PERPLEXITY_API_KEY`
408
+ **"No search provider available"** — Set `GEMINI_API_KEY`, `OPENAI_API_KEY`, or `PERPLEXITY_API_KEY`
395
409
 
396
- **"GitHub API error 403"** Set `GITHUB_TOKEN` for higher rate limits
410
+ **"GitHub API error 403"** — Set `GITHUB_TOKEN` for higher rate limits
397
411
 
398
- **"Cannot find module"** Run `npm run build` in the mcp-local directory
412
+ **"Cannot find module"** — Run `npm run build` in the mcp-local directory
399
413
 
400
- **MCP not connecting** Check path is absolute, run `claude --mcp-debug`, ensure Node.js >= 18
414
+ **MCP not connecting** — Check path is absolute, run `claude --mcp-debug`, ensure Node.js >= 18
401
415
 
402
- **Windsurf not finding tools** Verify `~/.codeium/windsurf/mcp_config.json` has correct JSON structure
416
+ **Windsurf not finding tools** — Verify `~/.codeium/windsurf/mcp_config.json` has correct JSON structure
403
417
 
404
- **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.
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** 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`.
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}NodeBench MCP v${NODEBENCH_VERSION} Health Check${X}`);
530
+ lines.push(`${B}${DISPLAY_NAME} v${NODEBENCH_VERSION} - Health Check${X}`);
531
531
  lines.push("");
532
- // 1. Tool count + preset load only the active preset for a fast health path
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
- ["xlsx", "Spreadsheet parsing"],
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}NodeBench MCP System Status${X}`);
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 ${errors1h.cnt} this 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}NodeBench MCP Diagnose & Heal${X}`);
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}NodeBench MCP Sync IDE Configs${X}`);
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} npx nodebench-mcp call <tool_name> [json_args]\n`);
1398
- console.log(` ${D}Example:${X} npx nodebench-mcp call founder_deep_context_gather '{"packetType":"weekly_reset"}'`);
1399
- console.log(` ${D}Example:${X} npx nodebench-mcp call discover_tools '{"query":"founder"}'`);
1400
- console.log(` ${D}Example:${X} npx nodebench-mcp call save_session_note '{"note":"test"}'\n`);
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: npx nodebench-mcp discover ${toolName}${X}\n`);
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}NodeBench MCP Quick Setup${X}`);
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 nodebench -- npx -y nodebench-mcp`);
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": { "nodebench": { "command": "npx", "args": ["-y", "nodebench-mcp"] } } }`);
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": { "nodebench": { "command": "npx", "args": ["-y", "nodebench-mcp"] } } }`);
1461
+ lines.push(` { "mcpServers": { "${SERVER_KEY}": { "command": "npx", "args": ["-y", "${NODEBENCH_NPX_PACKAGE}"] } } }`);
1462
1462
  lines.push("");
1463
- lines.push(` ${C}Verify:${X} npx nodebench-mcp call discover_tools '{"query":"founder"}'`);
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}Presets:${X} --preset default (core workflow) | --preset power | --preset admin`);
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"));