@index9/mcp 5.3.0 → 6.0.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/dist/cli.js +83 -104
- package/manifest.json +1 -1
- package/package.json +3 -3
package/dist/cli.js
CHANGED
|
@@ -235,184 +235,167 @@ var SITE = {
|
|
|
235
235
|
},
|
|
236
236
|
hero: {
|
|
237
237
|
titleLine1: "Pick the right AI model",
|
|
238
|
-
titleLine2: "
|
|
239
|
-
subtitle: "Index9 is an MCP server. Your
|
|
240
|
-
proof: ["Live OpenRouter data
|
|
238
|
+
titleLine2: "from chat",
|
|
239
|
+
subtitle: "Index9 is an MCP server. Your coding assistant uses it to search, compare, and live-test 300+ models on the task you're working on, so it recommends the best fit.",
|
|
240
|
+
proof: ["Live OpenRouter data \xB7 300+ models \xB7 refreshed every 30 min"],
|
|
241
241
|
pricingNote: "Free. You only pay OpenRouter for live model calls.",
|
|
242
242
|
getStarted: "Add index9 to your editor",
|
|
243
243
|
seeHowItWorks: "See a real session",
|
|
244
244
|
updatedBadge: "OpenRouter data \xB7 refreshed "
|
|
245
245
|
},
|
|
246
|
+
problem: {
|
|
247
|
+
label: "Why this exists",
|
|
248
|
+
heading: "Your assistant's model knowledge is stale",
|
|
249
|
+
body: [
|
|
250
|
+
'New models ship every week. Pricing changes. "Use GPT-4" or "use Claude 3.5" is usually months behind reality.',
|
|
251
|
+
"Without live data, your assistant defaults to whatever it learned in training \u2014 often a model that's been superseded by something cheaper or better-suited to your task.",
|
|
252
|
+
"Index9 gives it the data and the tools to actually compare."
|
|
253
|
+
]
|
|
254
|
+
},
|
|
246
255
|
howItWorks: {
|
|
247
256
|
label: "How it works",
|
|
248
|
-
heading: "
|
|
249
|
-
subtitle: "Index9 adds
|
|
257
|
+
heading: "How it works",
|
|
258
|
+
subtitle: "Index9 adds 5 tools to your editor. Your assistant calls them when you ask about models.",
|
|
250
259
|
steps: [
|
|
251
260
|
{
|
|
252
261
|
number: "1",
|
|
253
|
-
title: "You ask
|
|
254
|
-
body: '"Pick the cheapest model that can
|
|
262
|
+
title: "You ask in chat",
|
|
263
|
+
body: '"Pick the cheapest model that can review TypeScript PRs well."'
|
|
255
264
|
},
|
|
256
265
|
{
|
|
257
266
|
number: "2",
|
|
258
267
|
title: "Your assistant calls index9",
|
|
259
|
-
body: "It
|
|
268
|
+
body: "It searches live model data, compares finalists, and runs your prompt against the top candidates."
|
|
260
269
|
},
|
|
261
270
|
{
|
|
262
271
|
number: "3",
|
|
263
|
-
title: "You get a measured
|
|
264
|
-
body: "
|
|
272
|
+
title: "You get a measured pick",
|
|
273
|
+
body: "Backed by real cost numbers and real outputs \u2014 not training-data memory."
|
|
265
274
|
}
|
|
266
275
|
]
|
|
267
276
|
},
|
|
268
277
|
caseStudy: {
|
|
269
278
|
label: "Case study",
|
|
270
|
-
heading: "A real session, not a
|
|
271
|
-
subheading: "A Claude Code session picking a TypeScript code-review model.
|
|
279
|
+
heading: "A real session, not a mockup",
|
|
280
|
+
subheading: "A Claude Code session picking a TypeScript code-review model. Real tool calls, real verdict.",
|
|
272
281
|
prompt: {
|
|
273
282
|
title: "The prompt",
|
|
274
|
-
body: "Pick
|
|
283
|
+
body: "Pick a model for a TypeScript code-review bot that runs on every PR. I want real quality without paying frontier rates on routine reviews. Test against this sample diff."
|
|
275
284
|
},
|
|
276
285
|
toolCalls: {
|
|
277
|
-
title: "
|
|
286
|
+
title: "What the assistant did",
|
|
278
287
|
subtitle: "in order",
|
|
279
288
|
calls: [
|
|
289
|
+
{ tool: "find_models", params: "newest first", note: "skip stale training picks" },
|
|
280
290
|
{
|
|
281
291
|
tool: "find_models",
|
|
282
|
-
params: "
|
|
283
|
-
note: "recent releases"
|
|
284
|
-
},
|
|
285
|
-
{
|
|
286
|
-
tool: "find_models",
|
|
287
|
-
params: 'q="code review reasoning", structured_output',
|
|
292
|
+
params: "code review + structured output",
|
|
288
293
|
note: "task fit"
|
|
289
294
|
},
|
|
290
|
-
{
|
|
291
|
-
|
|
292
|
-
params: 'q="not frontier price", maxPrice=6',
|
|
293
|
-
note: "budget filter"
|
|
294
|
-
},
|
|
295
|
-
{ tool: "get_models", params: "\xD7 12 candidates", note: "metadata lookup" },
|
|
295
|
+
{ tool: "find_models", params: "max $2/M, every-PR budget", note: "rule out frontier" },
|
|
296
|
+
{ tool: "get_models", params: "8 candidates", note: "metadata lookup" },
|
|
296
297
|
{
|
|
297
298
|
tool: "compare_models",
|
|
298
|
-
params: "
|
|
299
|
-
note: "
|
|
299
|
+
params: "4 finalists, ~3000 token PR diff",
|
|
300
|
+
note: "per-PR cost projection"
|
|
300
301
|
},
|
|
301
|
-
{ tool: "test_model", params: "
|
|
302
|
+
{ tool: "test_model", params: "dry-run \xD7 4", note: "cost estimate" },
|
|
302
303
|
{
|
|
303
304
|
tool: "test_model",
|
|
304
|
-
params: "live \xD7
|
|
305
|
-
note: "real
|
|
305
|
+
params: "live \xD7 4, JSON output",
|
|
306
|
+
note: "real bug-catch test"
|
|
306
307
|
}
|
|
307
308
|
]
|
|
308
309
|
},
|
|
309
|
-
consideredTitle: "
|
|
310
|
-
consideredSubtitle: "
|
|
310
|
+
consideredTitle: "Recent models, evaluated",
|
|
311
|
+
consideredSubtitle: "A trimmed view of the candidates the assistant ruled in and out. Each row pairs a decision with the reason behind it.",
|
|
311
312
|
consideredRows: [
|
|
312
|
-
{
|
|
313
|
-
id: "openai/gpt-5.5-pro",
|
|
314
|
-
age: "6h ago",
|
|
315
|
-
decision: "skip",
|
|
316
|
-
reason: "too expensive for every PR"
|
|
317
|
-
},
|
|
318
313
|
{
|
|
319
314
|
id: "openai/gpt-5.5",
|
|
320
|
-
age: "
|
|
315
|
+
age: "1d ago",
|
|
321
316
|
decision: "skip",
|
|
322
|
-
reason: "
|
|
317
|
+
reason: "~$0.027 per PR, 5\xD7 the pick for the same outcome"
|
|
323
318
|
},
|
|
324
319
|
{
|
|
325
|
-
id: "
|
|
326
|
-
age: "
|
|
320
|
+
id: "xiaomi/mimo-v2.5-pro",
|
|
321
|
+
age: "3d ago",
|
|
327
322
|
decision: "tested",
|
|
328
|
-
reason: "
|
|
323
|
+
reason: "good structure, missed the precision edge case"
|
|
329
324
|
},
|
|
330
325
|
{
|
|
331
326
|
id: "deepseek/deepseek-v4-flash",
|
|
332
|
-
age: "14h ago",
|
|
333
|
-
decision: "skip",
|
|
334
|
-
reason: "cheaper sibling, lower quality expected"
|
|
335
|
-
},
|
|
336
|
-
{
|
|
337
|
-
id: "xiaomi/mimo-v2.5-pro",
|
|
338
|
-
age: "2d ago",
|
|
339
|
-
decision: "shortlisted",
|
|
340
|
-
reason: "recent + reasoning + structured output"
|
|
341
|
-
},
|
|
342
|
-
{
|
|
343
|
-
id: "inclusionai/ling-2.6-1t:free",
|
|
344
327
|
age: "1d ago",
|
|
345
|
-
decision: "
|
|
346
|
-
reason: "
|
|
328
|
+
decision: "tested",
|
|
329
|
+
reason: "7\xD7 cheaper than the pick, but missed both bugs"
|
|
347
330
|
},
|
|
348
331
|
{
|
|
349
|
-
id: "
|
|
350
|
-
age: "
|
|
351
|
-
decision: "
|
|
352
|
-
reason: "
|
|
332
|
+
id: "z-ai/glm-5.1",
|
|
333
|
+
age: "2w ago",
|
|
334
|
+
decision: "shortlisted",
|
|
335
|
+
reason: "caught both bugs at ~$0.005 per PR"
|
|
353
336
|
}
|
|
354
337
|
],
|
|
355
338
|
verdict: {
|
|
356
|
-
title: "The
|
|
357
|
-
model: "
|
|
358
|
-
body: "
|
|
339
|
+
title: "The pick",
|
|
340
|
+
model: "z-ai/glm-5.1",
|
|
341
|
+
body: "Open-weight, $1.05 per million input tokens. Caught both bugs in the sample diff at roughly $0.005 per PR, about 5\xD7 cheaper than running gpt-5.5 on every commit."
|
|
359
342
|
},
|
|
360
343
|
quote: {
|
|
361
|
-
body: "The
|
|
362
|
-
attribution: "index9 session trace
|
|
344
|
+
body: "The frontier model would have caught both bugs, at 5\xD7 the cost. The cheapest candidate missed them entirely. Only the live test surfaced the model that did both.",
|
|
345
|
+
attribution: "index9 session trace"
|
|
363
346
|
}
|
|
364
347
|
},
|
|
365
348
|
toolsSection: {
|
|
366
349
|
label: "Tools",
|
|
367
|
-
heading: "
|
|
368
|
-
subheading: "
|
|
369
|
-
openRouterKey: "OpenRouter API key
|
|
370
|
-
noKeyRequired: "No
|
|
350
|
+
heading: "The 5 tools",
|
|
351
|
+
subheading: "Your assistant chains these together. You don't call them directly.",
|
|
352
|
+
openRouterKey: "OpenRouter API key",
|
|
353
|
+
noKeyRequired: "No key required",
|
|
371
354
|
requiresLabel: "Requires ",
|
|
372
355
|
cards: [
|
|
373
356
|
{
|
|
374
357
|
name: "list_facets",
|
|
375
|
-
action: "
|
|
358
|
+
action: "list_facets",
|
|
376
359
|
displayName: "list_facets",
|
|
377
360
|
fullName: null,
|
|
378
|
-
description: "
|
|
361
|
+
description: "Lists available providers, capabilities, and modalities to filter by.",
|
|
379
362
|
badge: null,
|
|
380
363
|
requiresKey: false
|
|
381
364
|
},
|
|
382
365
|
{
|
|
383
366
|
name: "find_models",
|
|
384
|
-
action: "
|
|
367
|
+
action: "find_models",
|
|
385
368
|
displayName: "find_models",
|
|
386
369
|
fullName: null,
|
|
387
|
-
description: `
|
|
370
|
+
description: `Searches ${MODEL_COUNT} models by price, context size, capabilities, or natural language.`,
|
|
388
371
|
badge: null,
|
|
389
372
|
requiresKey: false
|
|
390
373
|
},
|
|
391
374
|
{
|
|
392
375
|
name: "get_models",
|
|
393
|
-
action: "
|
|
376
|
+
action: "get_models",
|
|
394
377
|
displayName: "get_models",
|
|
395
378
|
fullName: null,
|
|
396
|
-
description: "
|
|
379
|
+
description: "Pulls full specs and current pricing for any model.",
|
|
397
380
|
badge: null,
|
|
398
381
|
requiresKey: false
|
|
399
382
|
},
|
|
400
383
|
{
|
|
401
384
|
name: "compare_models",
|
|
402
|
-
action: "
|
|
385
|
+
action: "compare_models",
|
|
403
386
|
displayName: "compare_models",
|
|
404
387
|
fullName: null,
|
|
405
|
-
description: "
|
|
388
|
+
description: "Diffs 2\u201310 finalists side-by-side. Flags the cheapest pick for your expected token mix.",
|
|
406
389
|
badge: null,
|
|
407
390
|
requiresKey: false
|
|
408
391
|
},
|
|
409
392
|
{
|
|
410
393
|
name: "test_model",
|
|
411
|
-
action: "
|
|
394
|
+
action: "test_model",
|
|
412
395
|
displayName: "test_model",
|
|
413
396
|
fullName: null,
|
|
414
|
-
description: "
|
|
415
|
-
badge: "Live
|
|
397
|
+
description: "Runs your prompt across models. Returns output, latency, and real cost. Or dry-run for cost only.",
|
|
398
|
+
badge: "Live",
|
|
416
399
|
requiresKey: true
|
|
417
400
|
}
|
|
418
401
|
]
|
|
@@ -423,7 +406,7 @@ var SITE = {
|
|
|
423
406
|
items: [
|
|
424
407
|
{
|
|
425
408
|
question: "What is MCP?",
|
|
426
|
-
answer: "
|
|
409
|
+
answer: "A protocol that lets AI assistants call external tools. Index9 is one of those tools.",
|
|
427
410
|
link: {
|
|
428
411
|
label: "Learn more about MCP",
|
|
429
412
|
url: "https://modelcontextprotocol.io"
|
|
@@ -431,45 +414,40 @@ var SITE = {
|
|
|
431
414
|
},
|
|
432
415
|
{
|
|
433
416
|
question: "Who is index9 for?",
|
|
434
|
-
answer: "Developers using
|
|
417
|
+
answer: "Developers using Claude Code, Cursor, VS Code, or Codex who want their assistant to pick models from current data instead of training-data memory.",
|
|
435
418
|
link: null
|
|
436
419
|
},
|
|
437
420
|
{
|
|
438
|
-
question: "
|
|
439
|
-
answer:
|
|
421
|
+
question: "Does it pick the model for me?",
|
|
422
|
+
answer: "No \u2014 it gives your assistant the data (search results, specs, cost diffs, live test outputs). Your assistant makes the call.",
|
|
440
423
|
link: null
|
|
441
424
|
},
|
|
442
425
|
{
|
|
443
|
-
question: "
|
|
444
|
-
answer:
|
|
426
|
+
question: "How does live testing work?",
|
|
427
|
+
answer: `test_model sends your prompt to up to ${LIMITS.testModelsMax} models via OpenRouter and returns output, latency, tokens, and cost. Dry-run mode estimates cost without running inference.`,
|
|
445
428
|
link: null
|
|
446
429
|
},
|
|
447
430
|
{
|
|
448
|
-
question: "
|
|
449
|
-
answer:
|
|
431
|
+
question: "Which models?",
|
|
432
|
+
answer: `${MODEL_COUNT} from OpenRouter \u2014 OpenAI, Anthropic, Google, Meta, Mistral, DeepSeek, and more. Metadata refreshes every 30 minutes.`,
|
|
450
433
|
link: null
|
|
451
434
|
},
|
|
452
435
|
{
|
|
453
|
-
question: "
|
|
454
|
-
answer:
|
|
436
|
+
question: "Do you store my prompts or keys?",
|
|
437
|
+
answer: "No. Index9 doesn't store prompts, outputs, or API keys. Live tests are proxied straight to OpenRouter.",
|
|
455
438
|
link: null
|
|
456
439
|
},
|
|
457
440
|
{
|
|
458
441
|
question: "What's the project status?",
|
|
459
|
-
answer: "
|
|
460
|
-
link: null
|
|
461
|
-
},
|
|
462
|
-
{
|
|
463
|
-
question: "Is my data stored?",
|
|
464
|
-
answer: "No. index9 does not store prompts, outputs, or API keys. Live tests are proxied to OpenRouter.",
|
|
442
|
+
answer: "Stable and in active use. Issues and feature requests welcome on GitHub.",
|
|
465
443
|
link: null
|
|
466
444
|
}
|
|
467
445
|
]
|
|
468
446
|
},
|
|
469
447
|
install: {
|
|
470
448
|
label: "Setup",
|
|
471
|
-
heading: "
|
|
472
|
-
subheading: "
|
|
449
|
+
heading: "Install",
|
|
450
|
+
subheading: "Pick your editor and paste the config.",
|
|
473
451
|
configs: [
|
|
474
452
|
{
|
|
475
453
|
id: "cursor",
|
|
@@ -501,14 +479,14 @@ var SITE = {
|
|
|
501
479
|
{
|
|
502
480
|
id: "claude-code",
|
|
503
481
|
label: "Claude Code",
|
|
504
|
-
paths: [
|
|
482
|
+
paths: [],
|
|
505
483
|
config: `claude mcp add --transport stdio index9 -- npx -y @index9/mcp@latest`,
|
|
506
484
|
copyHint: "# Run in terminal (adds to ~/.claude.json)"
|
|
507
485
|
},
|
|
508
486
|
{
|
|
509
487
|
id: "codex",
|
|
510
488
|
label: "Codex",
|
|
511
|
-
paths: [
|
|
489
|
+
paths: [],
|
|
512
490
|
config: `codex mcp add index9 -- npx -y @index9/mcp@latest`,
|
|
513
491
|
copyHint: "# Run in terminal (adds to ~/.codex/config.toml)"
|
|
514
492
|
}
|
|
@@ -516,8 +494,9 @@ var SITE = {
|
|
|
516
494
|
copyButton: "Copy",
|
|
517
495
|
copiedButton: "Copied",
|
|
518
496
|
copyAriaLabel: "Copy configuration",
|
|
519
|
-
|
|
520
|
-
|
|
497
|
+
copiedAnnouncement: "Configuration copied to clipboard",
|
|
498
|
+
setupNote: "Want live tests?",
|
|
499
|
+
setupLink: "Add an OpenRouter key",
|
|
521
500
|
setupUrl: "https://github.com/index9-org/mcp#openrouter-api-key"
|
|
522
501
|
},
|
|
523
502
|
footer: {
|
package/manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@index9/mcp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
24
|
-
"zod": "^4.3
|
|
24
|
+
"zod": "^4.4.3"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@types/node": "^25.6.
|
|
27
|
+
"@types/node": "^25.6.1",
|
|
28
28
|
"tsup": "^8.5.1",
|
|
29
29
|
"typescript": "6.0.3",
|
|
30
30
|
"vitest": "^4.1.5",
|