@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 CHANGED
@@ -235,184 +235,167 @@ var SITE = {
235
235
  },
236
236
  hero: {
237
237
  titleLine1: "Pick the right AI model",
238
- titleLine2: "without leaving your editor",
239
- subtitle: "Index9 is an MCP server. Your AI assistant searches, compares, and live-tests 300+ models on your prompt, so picks are measured, not guessed.",
240
- proof: ["Live OpenRouter data", "300+ models, refreshed every 30 min"],
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: "Your assistant does the model-picking. You stay in the chat.",
249
- subtitle: "Index9 adds five MCP tools to your editor. When you ask about models, your assistant calls them, and gets live data back.",
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 your assistant",
254
- body: '"Pick the cheapest model that can summarize this document well." Just chat. No new UI to learn.'
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 pulls live OpenRouter data: search results, full specs, cost diffs, and test outputs on your prompt."
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 recommendation",
264
- body: "The assistant compares actual outputs and recommends the model that fits your constraints. Evidence, not guesswork."
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 mock",
271
- subheading: "A Claude Code session picking a TypeScript code-review model. Actual tool calls, decisions, and final pick. Captured 2026-04-24.",
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 3 models for a TypeScript code-review bot. Test them on a sample PR diff and recommend the best one. Quality matters more than price."
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: "Selection path",
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: "sortBy=created, limit=10",
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
- tool: "find_models",
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: "ids=[3 finalists], expectedPromptTokens=6000",
299
- note: "workload-cost flip"
299
+ params: "4 finalists, ~3000 token PR diff",
300
+ note: "per-PR cost projection"
300
301
  },
301
- { tool: "test_model", params: "dryRun \xD7 2", note: "cost estimate" },
302
+ { tool: "test_model", params: "dry-run \xD7 4", note: "cost estimate" },
302
303
  {
303
304
  tool: "test_model",
304
- params: "live \xD7 2, enforceJson=true",
305
- note: "real inference"
305
+ params: "live \xD7 4, JSON output",
306
+ note: "real bug-catch test"
306
307
  }
307
308
  ]
308
309
  },
309
- consideredTitle: "Every recent model, evaluated",
310
- consideredSubtitle: "Recent releases were checked with explicit accept, test, or skip decisions.",
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: "6h ago",
315
+ age: "1d ago",
321
316
  decision: "skip",
322
- reason: "frontier-priced vs Codex"
317
+ reason: "~$0.027 per PR, 5\xD7 the pick for the same outcome"
323
318
  },
324
319
  {
325
- id: "deepseek/deepseek-v4-pro",
326
- age: "14h ago",
320
+ id: "xiaomi/mimo-v2.5-pro",
321
+ age: "3d ago",
327
322
  decision: "tested",
328
- reason: "live test hit upstream 429 twice"
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: "skip",
346
- reason: "no reasoning capability flag"
328
+ decision: "tested",
329
+ reason: "7\xD7 cheaper than the pick, but missed both bugs"
347
330
  },
348
331
  {
349
- id: "arcee-ai/trinity-large-thinking",
350
- age: "3w ago",
351
- decision: "skip",
352
- reason: "MiMo Pro had stronger positioning"
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 final pick",
357
- model: "openai/gpt-5.3-codex",
358
- body: "The only tested model that caught both sample bugs. About $0.015 per PR: higher than budget models, far below frontier rates."
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 cheapest candidate ran 4\xD7 cheaper than Codex, and missed both bugs in the sample diff. The only way to know was a live test.",
362
- attribution: "index9 session trace, 2026-04-24"
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: "Five MCP tools, composable in any client",
368
- subheading: "Discover, shortlist, compare, cost-model, and live-test. Your assistant chains them together to make a measured pick.",
369
- openRouterKey: "OpenRouter API key (live tests only)",
370
- noKeyRequired: "No API key required",
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: "Discover",
358
+ action: "list_facets",
376
359
  displayName: "list_facets",
377
360
  fullName: null,
378
- description: "List the live filter vocabulary (providers, capabilities, modalities) before constructing a search.",
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: "Shortlist",
367
+ action: "find_models",
385
368
  displayName: "find_models",
386
369
  fullName: null,
387
- description: `Filter ${MODEL_COUNT} models by price, context, and capabilities. Natural-language search refines the ranking.`,
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: "Inspect",
376
+ action: "get_models",
394
377
  displayName: "get_models",
395
378
  fullName: null,
396
- description: "Inspect current pricing, limits, and capabilities for any model.",
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: "Compare",
385
+ action: "compare_models",
403
386
  displayName: "compare_models",
404
387
  fullName: null,
405
- description: "Side-by-side spec, capability, and workload-cost diff for 2\u201310 finalists.",
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: "Run live tests",
394
+ action: "test_model",
412
395
  displayName: "test_model",
413
396
  fullName: null,
414
- description: "Run one prompt across models and compare output, latency, and cost.",
415
- badge: "Live Testing",
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: "MCP (Model Context Protocol) lets AI assistants call external tools. index9 adds five composable tools (list_facets, find_models, get_models, compare_models, test_model) to any MCP-compatible client.",
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 AI coding assistants (Claude Code, Cursor, Codex, VS Code) who want their assistant to pick models based on live cost and quality data, not training-data guesses.",
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: "How does live testing work?",
439
- answer: `test_model sends your prompt to 1\u2013${LIMITS.testModelsMax} models via OpenRouter and returns output, latency, token usage, and cost. Live tests require an OpenRouter key; dryRun=true only estimates cost (pass expectedPromptTokens to model larger workloads without pasting filler).`,
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: "Does index9 recommend which model to use?",
444
- answer: "index9 returns outputs, latency, cost, and specs. Your assistant uses those results to make the recommendation.",
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: "How is compare_models different from calling get_models on each candidate?",
449
- answer: "compare_models returns a diff matrix (which fields are equal, which differ), plus convenience picks: cheapestForPromptPerMillion, largestContext, and (when you pass expectedPromptTokens + expectedCompletionTokens) cheapestForRealisticWorkload accounting for prompt:completion ratio differences. One call instead of N parallel get_models calls plus manual diffing.",
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: "What models are available?",
454
- answer: `index9 covers ${MODEL_COUNT} OpenRouter models, including OpenAI, Anthropic, Google, Meta, Mistral, and others. Metadata refreshes every 30 minutes.`,
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: "The hosted API and MCP server are stable and in active use. Issues and feature requests welcome on GitHub.",
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: "Add index9 to your editor",
472
- subheading: "Choose your client and copy the config.",
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: ["Terminal command"],
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: ["Terminal command"],
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
- setupNote: "Need live tests or custom setup?",
520
- setupLink: "Set up live testing",
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": "0.3",
3
3
  "name": "index9",
4
- "version": "5.2.0",
4
+ "version": "5.3.0",
5
5
  "description": "Discover, shortlist, compare, cost-model, and live-test 300+ AI models from your editor",
6
6
  "author": {
7
7
  "name": "Index9"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@index9/mcp",
3
- "version": "5.3.0",
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.6"
24
+ "zod": "^4.4.3"
25
25
  },
26
26
  "devDependencies": {
27
- "@types/node": "^25.6.0",
27
+ "@types/node": "^25.6.1",
28
28
  "tsup": "^8.5.1",
29
29
  "typescript": "6.0.3",
30
30
  "vitest": "^4.1.5",