{"_id":"open-dashboard-mcp","_rev":"18-35b0f59342fff13495248a65ed262cb1","name":"open-dashboard-mcp","dist-tags":{"latest":"1.1.5"},"versions":{"0.1.0":{"name":"open-dashboard-mcp","version":"0.1.0","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@0.1.0","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"fc7b06ef0bee9221764ed191c43a27edfa83e6e2","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-0.1.0.tgz","fileCount":66,"integrity":"sha512-+zrFqz5rGtyBq8eL1i0yC2IIH5tU8sKAw1tE+rdGjFn+7pdH/axq7gc/QISGoayzu6yVdKLZTxuPeCP8zIgyhw==","signatures":[{"sig":"MEYCIQDOZf/tyiQnBiOSXZjK8moEk65liClAQHlYKSBY7zGL2AIhAL5tH4/8jG7EWo9bQLAh+A+4617QnqncECwXWZWsRXqB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":815007},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"gitHead":"7b902f3f646d467e4e673e1c5fa45b8e9a702231","scripts":{"test":"tsx --test","build":"tsc -p tsconfig.json && npm run typecheck:harness","test:watch":"tsx --test --watch","verify:stdio":"tsx scripts/verify-stdio.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run build && npm test","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"Read-only MCP server that compares AI models across OpenRouter, Groq and Cerebras on price, discounts, context, modality and retirement risk — so a router can pick the cheapest capable model instead of a hardcoded slug.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_0.1.0_1787850027379_0.7479865487030619","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"open-dashboard-mcp","version":"0.2.0","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@0.2.0","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"3f1cca6f84d4f78674d0df59d4552d1d5aa48333","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-0.2.0.tgz","fileCount":66,"integrity":"sha512-uvEULFgRGarg7zb1cuhws9VQpdjhH2XNzhOVSgTW4h87GgzpZQ6Ac7oxjTtVBC6m0Lb5Enk94YdGTXearnK62Q==","signatures":[{"sig":"MEYCIQDLmc2TzQRtl9mvbx+ZXI6jo84JBDgWYvNm1r33fapkLQIhAPJadub8XObVtzwknhhqEIJSob0lLjCsO/2eMByLJWsd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD3LvlUAzTB6fBKmo1hRjr//O9R/zL0CTEoUXL7cxafhQIhAPwl+tbOIYlHjbJLv9L8LRoBzjNc4sW3LUcUUwBqUuEv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":834644},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"gitHead":"d1a0a6b0982f3b26337997ba1a903b16b3040070","scripts":{"test":"tsx --test","build":"tsc -p tsconfig.json && npm run typecheck:harness","test:watch":"tsx --test --watch","verify:stdio":"tsx scripts/verify-stdio.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run build && npm test","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"Read-only MCP server that compares AI models across OpenRouter, Groq and Cerebras on price, published discounts, capability and retirement risk -- and reports models that quietly stopped being free.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_0.2.0_1787860241528_0.48257423400118116","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"open-dashboard-mcp","version":"0.3.0","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@0.3.0","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"04f86f9d4f932354bef0bea4b3753a9e8bd750ef","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-0.3.0.tgz","fileCount":69,"integrity":"sha512-C7m1RSeKuZs3iNNMl3WZjpE2MeVwiyMiIkPOB62BtmphfF1IKQ46MdhnprG7TsTGQ2cqWqFSmOEzRMpqFsHwlg==","signatures":[{"sig":"MEUCIAIASSRA2FxousmRSAddYGc9sNxwHlyA1Z48fehDyxVeAiEAm5Zwd/AAZAmYxkcUtUdUQkoOEyOxVVZUsLKPX+wAQHc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDx9PbXftkF9aatbkjpayGKvl1AxkftnGr2dxAvEpPVEAiAMd3IprRaXJ14sZsenmlgJpdFLkOYI7nd3U1+lwra92g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":857486},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"gitHead":"a957c640aaa263b70e0f15c4bd047e227588c3a7","scripts":{"test":"tsx --test","build":"tsc -p tsconfig.json && npm run typecheck:harness","test:watch":"tsx --test --watch","verify:stdio":"tsx scripts/verify-stdio.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run build && npm test","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"Read-only MCP server that compares AI models across OpenRouter, Groq and Cerebras on price, published discounts, capability and retirement risk -- and reports models that quietly stopped being free.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_0.3.0_1787862324964_0.7304451670399712","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"open-dashboard-mcp","version":"0.4.0","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@0.4.0","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"6186a21d902c23b6591c9ec890c9abd1f73f64e7","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-0.4.0.tgz","fileCount":72,"integrity":"sha512-G5TlTihLU+DKOJeNl6+txhXhD/q7S34JRQ8CK5rtANDiMPYr6ow1qSzLJhNTvfyFGzr0IGBc8xQK90DILMe9eA==","signatures":[{"sig":"MEUCIAU6WtZ2WcD3DOxUu7cQiwQ62kDe9bsI3oAcA1XXwAcNAiEAkyb2z/im0/9lGhF3ebqBxl2S2SI7K64+mJEc6UQn0dA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD3DB0gctL5UByOnW/Rhdhd1vT/V8/ClbUL8KKcjmU5EgIhAK3OoEC8st39g8YtKcXXrHagBCEliHyL0zPCar4lZxtk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":886098},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"gitHead":"25bd5c265bb5f13e32c8f55b4cc79e82736094f2","scripts":{"test":"tsx --test","build":"tsc -p tsconfig.json && npm run typecheck:harness","test:watch":"tsx --test --watch","verify:stdio":"tsx scripts/verify-stdio.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run build && npm test","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"Read-only MCP server that compares AI models across OpenRouter, Groq and Cerebras on price, published discounts, capability and retirement risk -- and reports models that quietly stopped being free.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_0.4.0_1787869760568_0.14548430676995938","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"open-dashboard-mcp","version":"0.5.0","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@0.5.0","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"homepage":"https://sdforest.site/web/open-overview/mcp/","bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"2c4bc7f30c494a70ebae3d825f6bd93ac4bd4752","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-0.5.0.tgz","fileCount":72,"integrity":"sha512-9RXBgzvwjopTQeHsv0xXHphYEhdt3I+xI7R4Wi/HEP6Ur/8pVVMLAGptfuB7rSD+sReZM0MUZkLn9dU/WmNqJA==","signatures":[{"sig":"MEYCIQDsU7/VBi5I+jNHst4khDzj0SxcENBAyFSmObwVEm1LdAIhAOE0IuYvCfzFX5pNHg4txd6xTt4dkjtZ3CZwOxurVHA4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDO7sUlY1WeDl6GQzEwxlebCcq/eO38DvkDpcAtbH8+WQIhAImYtUHGpZXWs6Uo3G0Dr6LAhzhf8AO81uKlGsVVbUy3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":900861},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"gitHead":"3cea193b5394539ab298618bba2f71bf1130e2b3","scripts":{"test":"tsx --test","build":"tsc -p tsconfig.json && npm run typecheck:harness","test:watch":"tsx --test --watch","verify:stdio":"tsx scripts/verify-stdio.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run build && npm test","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"Read-only MCP server that compares AI models across OpenRouter, Groq, Cerebras and Sail on price, published discounts, capability and retirement risk -- reports models that quietly stopped being free, and refuses to quote Sail prices when its pinned prici","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_0.5.0_1788426944733_0.6084574003270049","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"open-dashboard-mcp","version":"0.5.1","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@0.5.1","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"homepage":"https://sdforest.site/web/open-overview/mcp/","bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"a13ddad16619007d524da19d81ad1a788acfb0d5","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-0.5.1.tgz","fileCount":72,"integrity":"sha512-Ga6y2tklkGiNDbgdRs67LCRlYe0Gqm9WI0lw9BrayAsrm9NMjKyuikwXsq7/x4Q54aRmuLv//9Oht3Lz7GQ9FQ==","signatures":[{"sig":"MEYCIQD30+fSnZSeeT004ibg9vFDkeGVoLjhLHfjqMPpLkmxdgIhAKOzzchpU29DIxn3ZWbv6Y98CHOuU09W3dmmr3fK/oSn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFvsEiqDzakW5SfJI4pYygIATGSamLvZ0rrCHy6wI/mWAiEAqu+Lx/4PdqzumgWPX1bFZ36mjQ0WzudrAp9leevFEAU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":900838},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"gitHead":"3cea193b5394539ab298618bba2f71bf1130e2b3","scripts":{"test":"tsx --test","build":"tsc -p tsconfig.json && npm run typecheck:harness","test:watch":"tsx --test --watch","verify:stdio":"tsx scripts/verify-stdio.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run build && npm test","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"Read-only MCP server comparing models on OpenRouter, Groq, Cerebras and Sail by price, discounts, capability and retirement risk. Reports models that quietly stopped being free, and refuses to quote Sail prices when its pinned pricing document changes.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_0.5.1_1788428373572_0.6502324156275505","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"open-dashboard-mcp","version":"0.6.0","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude","github-trending","trending"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@0.6.0","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"homepage":"https://sdforest.site/web/open-overview/mcp/","bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"d9183e04d2ca95751659ea95705f2f6a2ee29eaf","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-0.6.0.tgz","fileCount":78,"integrity":"sha512-TuD5V1k8CoSoZCNwALwFR8M3ue6mO80L9VbDsBqgAY46n1pYzljQTHgZfWnh0ghRG+LNy2M1QqAGLuLsNQiA6A==","signatures":[{"sig":"MEUCIQDTW5JFgf63exZFmbh87qBAOdiurC0b1e3rufB5jvmCrwIgP9jmgM6xxNxPKSo1WBzt5H8uIjPDdKurabId6VYM8T0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAIAcqP4A5Mbjq0tXb+g2CMb+00KKtiFSElZh27l2budAiEAq6KMOHxZjpQUTCzbb6ad2kx01GjVDl5LjlT00Ea70ms=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":922064},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"gitHead":"63584befdaeaa06b7697474c3e21fb7ff2ffe1bf","scripts":{"test":"tsx --test","build":"tsc -p tsconfig.json && npm run typecheck:harness","test:watch":"tsx --test --watch","verify:stdio":"tsx scripts/verify-stdio.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run build && npm test","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"Read-only MCP server comparing models on OpenRouter, Groq, Cerebras and Sail by price, discounts, capability and retirement risk, plus GitHub trending dated by collection time. It refuses to quote Sail prices when its pinned document changes.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_0.6.0_1788498249982_0.5420402685274441","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"open-dashboard-mcp","version":"0.6.1","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude","github-trending","trending"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@0.6.1","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"homepage":"https://sdforest.site/web/open-dashboard/mcp/","bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"1c570ce5ca27fa8ad209352b00e949a0fc08be2f","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-0.6.1.tgz","fileCount":78,"integrity":"sha512-JW8e0KHYm3mG6k99Qg/irKT0Zp/e0eHGY3F3lEZxweoXVm8+ACXzK0TZRkX5xzC4Qjcx5a9GEHbxooOqkJVICA==","signatures":[{"sig":"MEQCIBcno439VX2+TJGKy27s1V5Db1dBlDN1GBBJuXwOu0O3AiAqSp3sAxtGO+fjpqJOyD2ZtUKBgKX4IYzz133a/mnALQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIADtcpGJe5QpXEr0lR6q+9sqEiPmOWLJSyoU+se1z4dmAiEA+pnxl3J76oQq2pYJrjDMiZdYQYZA/UDRWfuwgcoQdOQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":926561},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"gitHead":"7f3f31e759800910affecd33501e5533a3fcf3d5","scripts":{"test":"tsx --test","build":"tsc -p tsconfig.json && npm run typecheck:harness","test:watch":"tsx --test --watch","verify:stdio":"tsx scripts/verify-stdio.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run build && npm test","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"Read-only MCP server comparing models on OpenRouter, Groq, Cerebras and Sail by price, discounts, capability and retirement risk, plus GitHub trending dated by collection time. It refuses to quote Sail prices when its pinned document changes.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_0.6.1_1788511804041_0.4551098347598934","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"open-dashboard-mcp","version":"0.7.0","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude","github-trending","trending"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@0.7.0","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"homepage":"https://sdforest.site/web/open-dashboard/mcp/","bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"7933665aca117debf7b95cf2c575a02bb9b02c9b","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-0.7.0.tgz","fileCount":84,"integrity":"sha512-s+PNy/cisvvdEi3AIxePWwrfMJ91uMY7/74D7V+LzQ2g8MrqetJCoXh1MSl9+T/GCKaivtR/I4B4melDb8/hZQ==","signatures":[{"sig":"MEUCIE4wnlFaoCL4jp/1mhBfuP1mKF0MPwEB+CtA5WVbKWekAiEAhUS9QehjvhuVadlYpSqqCz1cBJ0JX5FlI1hHytpbuD0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCm3+Xoy2z0ZlQnoqdOaghwpq/yaFtH2FyQJuTHXACdIwIhAKHBb7kT7KwPJHxRW+7uM8sIV6RhFl1isEV4vOxAtN+p","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":975897},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"gitHead":"aa734d12a3025bfa4bbe1ea3cf1f309b87c9a144","scripts":{"test":"tsx --test","build":"tsc -p tsconfig.json && npm run typecheck:harness","test:watch":"tsx --test --watch","verify:stdio":"tsx scripts/verify-stdio.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run build && npm test","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"Read-only MCP server comparing models on OpenRouter, Groq, Cerebras and Sail by price, discounts, capability and retirement risk, plus GitHub trending dated by collection time. It refuses to quote Sail prices when its pinned document changes.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_0.7.0_1788856452252_0.3454916412489706","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"open-dashboard-mcp","version":"0.8.0","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude","github-trending","trending"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@0.8.0","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"homepage":"https://sdforest.site/web/open-dashboard/mcp/","bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"1415e779821c0caf63d8ab854d7cafea827a8bd7","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-0.8.0.tgz","fileCount":87,"integrity":"sha512-P871XGicO1MmBnoXW0hE7eIGgkiZODjufuj4oGb3zdXlv50FvyeuDnMk2ptjytatLlnqJ1J0TCNt0ldBju62Eg==","signatures":[{"sig":"MEUCIF8nuPDMuDUK5PZAvne7Zr5FHwPJVSmclmpIiQxhwNMfAiEArW4mGke6p/xL/YNkvWHtfVh0B/lPDv15m4v89c98sVA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCB0H1smmyN7ZLIjliMEJm0vov975nrQ3IpNnuxayKp5AIgLMYYfvvKWz7bodOEDELMFfZK/Xx2trNG+Vfm/KrbchE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1003585},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"gitHead":"91ef8598ed425452ff8cb20064ecd06e8e54ce1d","scripts":{"test":"tsx --test","build":"tsc -p tsconfig.json && npm run typecheck:harness","test:watch":"tsx --test --watch","verify:stdio":"tsx scripts/verify-stdio.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run build && npm test","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"Read-only MCP comparing models on OpenRouter, Groq, Cerebras, Sail, QwenCloud, DeepInfra, Novita, SambaNova and Chutes by price, capability and retirement risk, plus GitHub trending; it refuses to quote Sail prices when its pinned document changes.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_0.8.0_1788868715502_0.2101190528693826","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"open-dashboard-mcp","version":"1.0.0","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude","github-trending","trending"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@1.0.0","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"homepage":"https://sdforest.site/web/open-dashboard/mcp/","bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"b4dd31b21489eb98855b6921768f3a1815310fc4","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-1.0.0.tgz","fileCount":136,"integrity":"sha512-MdH2eF596KnR/20phFvbrcl5E+W8pHSKBM3+AuaDgc21UYj7JINWipaU6QCe91xwYdZ8IxpEMAJ4XZj7juWjUQ==","signatures":[{"sig":"MEQCIBMAwt2/FIeIhGG6O/HM/HYiKKAtHXYeM/1vyJigvRxNAiBXXcc0GK4cWClAQ6bTcqRdyRhPPkDAzz6fQuJvIk9qpA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDtWLt8fs1ODPcE2WvhWzz8tQvL3I8pk8TrsOWLu8cQxAiEAs7P8qBLu/ifSz3EkCYtM/ahoRBvbt2BpuvZcISESG+I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1450468},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"exports":{".":"./build/index.js","./contract-vocabulary.json":"./build/contract-vocabulary.json"},"gitHead":"7237287b3e4bd706dcdda043961a61ef4a9c75e8","scripts":{"test":"tsx --test","build":"tsc -p tsconfig.json && npm run typecheck:harness && npm run docs:generate","docs:check":"tsx scripts/generate-docs.ts --check","test:watch":"tsx --test --watch","verify:stdio":"tsx scripts/verify-stdio.ts","docs:generate":"tsx scripts/generate-docs.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run docs:check && npm run build && npm test","verify:catalogue":"tsx scripts/verify-catalogue-stdio.ts","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"Read-only MCP: OpenRouter, Groq, Cerebras, Sail, QwenCloud, DeepInfra, Novita, SambaNova, Chutes, WaveSpeedAI, fal, Crazyrouter; media and token prices, caveats, GitHub trending. It refuses to quote Sail prices if its document changes.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_1.0.0_1788961536026_0.062123654290771047","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"open-dashboard-mcp","version":"1.0.1","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude","github-trending","trending"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@1.0.1","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"homepage":"https://sdforest.site/web/open-dashboard/mcp/","bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"69434bdb22cd426c6d49feee9aa796c80e7348d6","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-1.0.1.tgz","fileCount":136,"integrity":"sha512-Wl5gmp2TO0AfOatwfQfwKZxy9aHGxt+kPuIzQiX31Ubm+o+SNfqqV2eUSI9OsYVd2bvf/DqvnfA1/r9iRjlgUA==","signatures":[{"sig":"MEQCID0alToEGf6f/eyFig/NGQyUoHDeQN9Eiju8h8YOFhg8AiBWrTB1FeOo6DfhT3yJgzK6afOmnwMwPH3f53RHAji7bw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCp+0ZeN+xX1RhJeCEJ3lqX8e+TXraZt8eLqwdnfYHogwIhAPJiR+qe6YHtsWicRuLxMPCFaRrKc1nOXXDaD/3HV7eA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1450509},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"exports":{".":"./build/index.js","./package.json":"./package.json","./contract-vocabulary.json":"./build/contract-vocabulary.json"},"gitHead":"315447d26e375816376d87fbd6453cb3e318626d","scripts":{"test":"tsx --test","build":"tsc -p tsconfig.json && npm run typecheck:harness && npm run docs:generate","docs:check":"tsx scripts/generate-docs.ts --check","test:watch":"tsx --test --watch","verify:stdio":"tsx scripts/verify-stdio.ts","docs:generate":"tsx scripts/generate-docs.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run docs:check && npm run build && npm test","verify:catalogue":"tsx scripts/verify-catalogue-stdio.ts","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"Read-only MCP: OpenRouter, Groq, Cerebras, Sail, QwenCloud, DeepInfra, Novita, SambaNova, Chutes, WaveSpeedAI, fal, Crazyrouter; media and token prices, caveats, GitHub trending. It refuses to quote Sail prices if its document changes.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_1.0.1_1788977896999_0.16168662547280288","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"open-dashboard-mcp","version":"1.0.2","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude","github-trending","trending"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@1.0.2","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"homepage":"https://sdforest.site/web/open-dashboard/mcp/","bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"e9fdcbe13cd1a430020263cafb66456664d695d4","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-1.0.2.tgz","fileCount":136,"integrity":"sha512-uDxClFM0tKrRHE3Nrt1DJ+RNGCt86s/Nrx5tm7nJ5zDuK5qKbxuPe0B0CuMEo+izImzobbm4chCdlOeHjLVN5w==","signatures":[{"sig":"MEUCIAj/AiK86rwOoFgMUXnCT4QTm1GApj4IIPHgFuo2KW82AiEAnEjsdqZMOZXxP8LU6FoYKDYjFCeYaMip7Vohj7EG1l4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCr8wZYerko24N5QA+o3KesHkaXCB7zIrNmh35sQs+/XgIgNR1Gs33Z2+fKVAT9lUxOdqL828wKgDH/TlOjH1zysAk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1453196},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"exports":{".":"./build/index.js","./package.json":"./package.json","./contract-vocabulary.json":"./build/contract-vocabulary.json"},"gitHead":"b716e597b5d8bf46b9cc9c33803f110e16354ab0","scripts":{"test":"tsx --test","build":"tsc -p tsconfig.json && npm run typecheck:harness && npm run docs:generate","docs:check":"tsx scripts/generate-docs.ts --check","test:watch":"tsx --test --watch","verify:stdio":"tsx scripts/verify-stdio.ts","docs:generate":"tsx scripts/generate-docs.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run docs:check && npm run build && npm test","verify:catalogue":"tsx scripts/verify-catalogue-stdio.ts","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"Read-only MCP: OpenRouter, Groq, Cerebras, Sail, QwenCloud, DeepInfra, Novita, SambaNova, Chutes, WaveSpeedAI, fal, Crazyrouter; media and token prices, caveats, GitHub trending. It refuses to quote Sail prices if its document changes.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_1.0.2_1788982336185_0.05503872046905234","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"open-dashboard-mcp","version":"1.1.0","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude","github-trending","trending"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@1.1.0","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"homepage":"https://www.sdforest.site/web/open-dashboard/","bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"1d055906419c2d0865293156047126704494ed2f","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-1.1.0.tgz","fileCount":142,"integrity":"sha512-s5lfwOrvw1cUR2M6Mdev6T0mxTIoAlSSL2RpwlijUEgLb9l43Rqo0pYQksEV4VHai0H0Ug5hKJvHc2cibpDhGA==","signatures":[{"sig":"MEQCICrm8E3cZC0XJ7Hf8Hc7L3jChyqkWzh3ZBNZJTnQLnBNAiB5xrmsee1tMeKUF8KMMBQa9Ga0RHtdNEolDJn4NbU6RQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDfswp14Cbd43/oAkBWtI38EpLw+GkNry8J2iZgnzV2iAiASukxWavRCaaxGY4JNpsS/Q/ThY5QP1UbdJvcMS/P08w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1551598},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"exports":{".":"./build/index.js","./package.json":"./package.json","./contract-vocabulary.json":"./build/contract-vocabulary.json"},"scripts":{"test":"tsx --test --test-concurrency=1","build":"tsc -p tsconfig.json && npm run typecheck:harness && npm run docs:generate","docs:check":"tsx scripts/generate-docs.ts --check","test:watch":"tsx --test --test-concurrency=1 --watch","verify:stdio":"tsx scripts/verify-stdio.ts","docs:generate":"tsx scripts/generate-docs.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run docs:check && npm run build && npm test","verify:catalogue":"tsx scripts/verify-catalogue-stdio.ts","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"MCP: OpenRouter, Groq, Cerebras, Sail, Nous Research, QwenCloud, DeepInfra, Novita, SambaNova, Chutes, WaveSpeedAI, fal, Crazyrouter. Refuses to quote Sail prices; catalogue arithmetic is not generation cost. GitHub trending.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_1.1.0_1789167672952_0.03697709767699786","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"open-dashboard-mcp","version":"1.1.2","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude","github-trending","trending"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@1.1.2","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"homepage":"https://www.sdforest.site/web/open-dashboard/","bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"43b5d561b25226b6ba540b6e92fd4d5f48073a84","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-1.1.2.tgz","fileCount":142,"integrity":"sha512-1ZKndrHW944Fx7qTlxH5WeAdJKlZqZ9kTs+1SyuoH0VHDhZkF8UP46V6Kyirjzx1C+jfv4BU7vHu+0Is7h4APA==","signatures":[{"sig":"MEUCIApWmOHgiOYjvXEL6mQAsK9zDH4pNf+cBd1Xy9aLzXocAiEA3f0H69an5dl9/tPZPerIVD1e6Y1Hw3oV1ZIcR/iWeOM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCfI9JSbGvaFsBizOvlUMmt2B7b0kdGFsQ9sSvHnwzSwgIhALO+6alZi48I/Rkv/zkNmwd+ZsEGvbq2Wbux/JkxGlJY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1551644},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"exports":{".":"./build/index.js","./package.json":"./package.json","./contract-vocabulary.json":"./build/contract-vocabulary.json"},"scripts":{"test":"tsx --test --test-concurrency=1","build":"tsc -p tsconfig.json && npm run typecheck:harness && npm run docs:generate","docs:check":"tsx scripts/generate-docs.ts --check","test:watch":"tsx --test --test-concurrency=1 --watch","verify:stdio":"tsx scripts/verify-stdio.ts","docs:generate":"tsx scripts/generate-docs.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run docs:check && npm run build && npm test","verify:catalogue":"tsx scripts/verify-catalogue-stdio.ts","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"MCP: OpenRouter, Groq, Cerebras, Sail, Nous Research, QwenCloud, DeepInfra, Novita, SambaNova, Chutes, WaveSpeedAI, fal, Crazyrouter. Refuses to quote Sail prices; catalogue arithmetic is not generation cost. GitHub trending.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_1.1.2_1789170023218_0.30234612391404636","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"open-dashboard-mcp","version":"1.1.3","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude","github-trending","trending"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@1.1.3","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"homepage":"https://www.sdforest.site/web/open-dashboard/","bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"93cea90d12070cafe9d02a8a5d3f5233df83e24a","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-1.1.3.tgz","fileCount":142,"integrity":"sha512-ZZAIACaRdrQ5sNEkm8cLK3qP/LDNw8EWBtraUIWTAsrT9l7GdGCbIekW+aZNFddO+VBV8/6KknekptK5YPtZPQ==","signatures":[{"sig":"MEQCIFgb38dTKOQK86aqtPDXGtO+aCDNHIr4qkSa2mF8vCyYAiAosxxtOYlvWPODkELMZCxEsu4th18Pw4CFrnlCMzfL2g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIC3bUltdyi9FWvyA+g7nWyqwh6rQnlHxbDXDDGljcvDxAiEAjTD+2VU5aiFbDo70Ixqm975bFeXf1c9lD7nFrcVykbU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1551629},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"exports":{".":"./build/index.js","./package.json":"./package.json","./contract-vocabulary.json":"./build/contract-vocabulary.json"},"scripts":{"test":"tsx --test --test-concurrency=1","build":"tsc -p tsconfig.json && npm run typecheck:harness && npm run docs:generate","docs:check":"tsx scripts/generate-docs.ts --check","test:watch":"tsx --test --test-concurrency=1 --watch","verify:stdio":"tsx scripts/verify-stdio.ts","docs:generate":"tsx scripts/generate-docs.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run docs:check && npm run build && npm test","verify:catalogue":"tsx scripts/verify-catalogue-stdio.ts","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"MCP: OpenRouter, Groq, Cerebras, Sail, Nous Research, QwenCloud, DeepInfra, Novita, SambaNova, Chutes, WaveSpeedAI, fal, Crazyrouter. Refuses to quote Sail prices; catalogue arithmetic is not generation cost. GitHub trending.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_1.1.3_1789194279070_0.48663830922428786","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"open-dashboard-mcp","version":"1.1.4","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude","github-trending","trending"],"author":{"name":"Ivan Gegov"},"license":"MIT","_id":"open-dashboard-mcp@1.1.4","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"homepage":"https://www.sdforest.site/web/open-dashboard/","bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"185945baeaf4e8631cb8ac2bb35f4731213117b7","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-1.1.4.tgz","fileCount":142,"integrity":"sha512-hYbW1zIy3DLsgiWkz2CUmUHjpxe5k4h5xRNBi/tEjh+UFvN1AGMuLtqIoWqLp11Y2/MRwfzMAHAlhJaDSHlMzw==","signatures":[{"sig":"MEYCIQC5TDK25skTLexRfVfXlqRjTjtJh+9YVHgmMT+tdNGq2QIhAO9q7v2atV1h4uCQl8dPsKmBLJ9Eg4uk5WM2GRXNWfmT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCi4k3jYeSEsylDrbl5Wo/SGRQ9Xqiwxh1VKFVK2WZVSwIhAKyvBXkN+zBbngSvlJWEbf8BFLIuvyH9XaP0H1/Csf6O","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1563001},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=20"},"exports":{".":"./build/index.js","./package.json":"./package.json","./contract-vocabulary.json":"./build/contract-vocabulary.json"},"scripts":{"test":"tsx --test --test-concurrency=1","build":"tsc -p tsconfig.json && npm run typecheck:harness && npm run docs:generate","docs:check":"tsx scripts/generate-docs.ts --check","test:watch":"tsx --test --test-concurrency=1 --watch","verify:stdio":"tsx scripts/verify-stdio.ts","docs:generate":"tsx scripts/generate-docs.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run docs:check && npm run build && npm test","verify:catalogue":"tsx scripts/verify-catalogue-stdio.ts","typecheck:harness":"tsc -p tsconfig.harness.json"},"_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"_npmVersion":"11.16.0","description":"MCP: OpenRouter, Groq, Cerebras, Sail, Nous Research, QwenCloud, DeepInfra, Novita, SambaNova, Chutes, WaveSpeedAI, fal, Crazyrouter. Refuses to quote Sail prices; catalogue arithmetic is not generation cost. GitHub trending.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/open-dashboard-mcp_1.1.4_1789213844276_0.11720107348699704","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"_id":"open-dashboard-mcp@1.1.5","bin":{"open-dashboard-mcp":"build/index.js"},"dist":{"shasum":"99c9d04b98ed7345a0895715189db8169d997a5d","tarball":"https://registry.npmjs.org/open-dashboard-mcp/-/open-dashboard-mcp-1.1.5.tgz","fileCount":152,"integrity":"sha512-OnDTcLK+wf5TWQnaoM2rm4DsFABEG5/el56Ov4NiDiMvdN1bBvbHUuN1XhbtneYNC5zw148h/NdoI8+TvlaAMA==","signatures":[{"sig":"MEYCIQCdZoBJ4cHx5BOTHUwNRagwi8ZxVE3aTtduDzIHyDkSCgIhAPQia119wns2vDxWZ5Ws1STXgXlcNIDh2hL1pz79NyFE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD+CpkUS+EDZ5BPpwI4M/jpFfslyF9zsWl3GrWIU28iPwIhAM2lzN6AYp4Piqmq2gitsxvginjoRq3cw+N/sD9u4u0A"}],"unpackedSize":1797067},"main":"./build/index.js","name":"open-dashboard-mcp","type":"module","types":"./build/index.d.ts","author":{"name":"Ivan Gegov"},"engines":{"node":">=20"},"exports":{".":"./build/index.js","./package.json":"./package.json","./contract-vocabulary.json":"./build/contract-vocabulary.json"},"license":"MIT","scripts":{"test":"tsx --test --test-concurrency=1 \"test/**/*.test.ts\" \"src/providers/provider-openness.test.ts\"","build":"tsc -p tsconfig.json && npm run typecheck:harness && npm run docs:generate","docs:check":"tsx scripts/generate-docs.ts --check","test:watch":"tsx --test --test-concurrency=1 --watch \"test/**/*.test.ts\" \"src/providers/provider-openness.test.ts\"","verify:stdio":"tsx scripts/verify-stdio.ts","docs:generate":"tsx scripts/generate-docs.ts","verify:stdout":"tsx scripts/verify-stdout.ts","prepublishOnly":"npm run docs:check && npm run build && npm test","verify:catalogue":"tsx scripts/verify-catalogue-stdio.ts","typecheck:harness":"tsc -p tsconfig.harness.json","smoke:capability-state":"tsx scripts/smoke-capability-state.ts"},"version":"1.1.5","_npmUser":{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"},"homepage":"https://www.sdforest.site/web/open-dashboard/","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude","github-trending","trending"],"_npmVersion":"11.16.0","description":"MCP: OpenRouter, Groq, Cerebras, Sail, Nous Research, QwenCloud, DeepInfra, Novita, SambaNova, Chutes, WaveSpeedAI, fal, Crazyrouter. Refuses to quote Sail prices; catalogue arithmetic is not generation cost. GitHub trending.","directories":{},"maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.0.0","@modelcontextprotocol/client":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/open-dashboard-mcp_1.1.5_1790014672137_0.2702942323252395"}}},"time":{"created":"2026-08-27T17:00:27.228Z","modified":"2026-09-21T18:17:52.433Z","0.1.0":"2026-08-27T17:00:27.551Z","0.2.0":"2026-08-27T19:50:41.615Z","0.3.0":"2026-08-27T20:25:25.068Z","0.4.0":"2026-08-27T22:29:20.727Z","0.5.0":"2026-09-03T09:15:44.817Z","0.5.1":"2026-09-03T09:39:33.657Z","0.6.0":"2026-09-04T05:04:10.096Z","0.6.1":"2026-09-04T08:50:04.133Z","0.7.0":"2026-09-08T08:34:12.364Z","0.8.0":"2026-09-08T11:58:35.599Z","1.0.0":"2026-09-09T13:45:36.109Z","1.0.1":"2026-09-09T18:18:17.100Z","1.0.2":"2026-09-09T19:32:16.298Z","1.1.0":"2026-09-11T23:01:13.048Z","1.1.2":"2026-09-11T23:40:23.307Z","1.1.3":"2026-09-12T06:24:39.148Z","1.1.4":"2026-09-12T11:50:44.384Z","1.1.5":"2026-09-21T18:17:52.224Z"},"author":{"name":"Ivan Gegov"},"license":"MIT","homepage":"https://www.sdforest.site/web/open-dashboard/","keywords":["mcp","model-context-protocol","openrouter","groq","cerebras","llm","model-routing","pricing","llm-pricing","claude","github-trending","trending"],"description":"MCP: OpenRouter, Groq, Cerebras, Sail, Nous Research, QwenCloud, DeepInfra, Novita, SambaNova, Chutes, WaveSpeedAI, fal, Crazyrouter. Refuses to quote Sail prices; catalogue arithmetic is not generation cost. GitHub trending.","maintainers":[{"name":"ivanzg.dve","email":"ivangegov.dve@gmail.com"}],"readme":"# Open Dashboard MCP\r\n\r\nAgents need live model IDs and price provenance because stale slugs break prompts.\r\n\r\nRead-only MCP access to live model catalogues, published media generation models and prices, and daily trending GitHub repos.\r\n\r\nopen-dashboard-mcp gives an agent live model IDs and published prices across OpenRouter, Sail, Nous Research, Groq, Cerebras, QwenCloud, DeepInfra, Novita, SambaNova, Chutes, Crazyrouter, fal, and WaveSpeedAI. The catalogue covers text, image, video, and audio, and each figure carries its source and check date so a published rate is not mistaken for measured request cost.\r\n\r\nRead-only, free, no account. Choose only the tools and providers you need.\r\n\r\n# Use it\r\n\r\n## Install\r\n\r\n### Claude Code\r\n\r\nTo register the MCP with Claude Code:\r\n\r\n```bash\r\nclaude mcp add open-dashboard -- npx -y open-dashboard-mcp\r\n```\r\n\r\nClaude Code starts the server when it needs it and connects over MCP.\r\n\r\n### Installing only the tools you want\r\n\r\nAll seventeen tools are enabled by default. To install a subset, set\r\n`OPEN_DASHBOARD_TOOLS` to a comma-separated allowlist in the server's environment.\r\nDeselected tools are **absent from `tools/list` entirely** — not present and failing —\r\nso a client never sees a tool it cannot use:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"open-dashboard\": {\r\n      \"command\": \"npx\",\r\n      \"args\": [\"-y\", \"open-dashboard-mcp\"],\r\n      \"env\": {\r\n        \"OPEN_DASHBOARD_TOOLS\": \"dashboard_catalogue,dashboard_price_comparison,dashboard_contract\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n`OPEN_DASHBOARD_PROVIDERS` lets an installation allowlist providers: deselected ones are\r\nomitted from provider-bearing responses, reducing unnecessary context. Leave it unset to\r\nget everything.\r\n\r\nFor Claude Desktop, add this to `claude_desktop_config.json`:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"open-dashboard\": {\r\n      \"command\": \"npx\",\r\n      \"args\": [\"-y\", \"open-dashboard-mcp\"]\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n### Run directly\r\n\r\nFor manual testing or another MCP client, run:\r\n\r\n```bash\r\nnpx -y open-dashboard-mcp\r\n```\r\n\r\nThis starts the MCP server and waits for an MCP client over stdin/stdout. An\r\napparently idle terminal is expected: the command is not an interactive CLI and\r\ndoes not register the MCP with Claude or another agent. `npx -y` uses npx's\r\npackage handling and does not perform a permanent global install.\r\n\r\nWithout `@version`, npx resolves the latest published release. That is the point:\r\nthe catalogue this package reports on changes underneath you, so an unpinned\r\ncommand keeps reading the current one instead of freezing to a snapshot.\r\n\r\nRequires Node.js 20 or newer. No API key is needed for any tool except the optional key inventory.\r\n\r\n### Where the data comes from\r\n\r\nDashboard-backed tools read a **public, zero-credential HTTP API** that collects provider catalogues and GitHub daily and republishes the result. The catalogue tool additionally reads public provider sources; optional key inventory has its own opt-in credential path. QwenCloud's native catalogue requires a credential held by the collector; MCP users read the public archived result. The MCP also reads Sail's pinned pricing document directly. By default the dashboard is `https://openrouter-github-dashboard.vercel.app`, a deployment run by this project's author on a hobby-tier host. It is public and needs no credentials, but it is **not a service with an uptime guarantee**, and every user of this package reads from the same instance.\r\n\r\nPoint it at your own compatible deployment with `DASHBOARD_BASE_URL`:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"open-dashboard\": {\r\n      \"command\": \"npx\",\r\n      \"args\": [\"-y\", \"open-dashboard-mcp\"],\r\n      \"env\": { \"DASHBOARD_BASE_URL\": \"https://your-deployment.example.com\" }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nWhen a source is unavailable the tools say so as structured data — `unavailable`, `partial`, `stale` — rather than failing or inventing a value. That is the intended behaviour, not an error.\r\n\r\n## Build and run\r\n\r\nRequires Node.js 20 or newer.\r\n\r\n```powershell\r\nnpm install\r\nnpm run build\r\nnode .\\build\\index.js\r\n```\r\n\r\nThe compiled executable remains `build/index.js`. By default it reads the public dashboard at `https://openrouter-github-dashboard.vercel.app` with zero credentials. To point the child at another compatible deployment, set only `DASHBOARD_BASE_URL` to an absolute HTTP(S) URL without URL credentials.\r\n\r\nThe server speaks MCP newline-delimited JSON over stdin/stdout. Stdout is protocol-only; application diagnostics belong on stderr.\r\n\r\nThe summary, provider declarations, pitches, caveats and tool table are generated from the package registry and a real in-memory `tools/list` handshake. `npm run build` regenerates them; `npm run docs:check` fails if committed README facts differ. `npm run docs:generate` refreshes the marked `generated-do-not-edit` blocks. The companion site pins the same package export to an immutable source commit so its release candidate documentation can be reviewed before npm publication.\r\n\r\n## Embedding in Electron\r\n\r\nAn Electron host should spawn the compiled absolute `build/index.js` path with the Node executable, optionally set only `DASHBOARD_BASE_URL`, speak MCP over the child's stdin/stdout, and consume stderr separately. Treat structured unavailable, partial, stale, and endpoint-specific error results as normal tool outcomes; do not kill the child when an upstream source is unavailable.\r\n\r\nThe key inventory must stay **off** in a distributed build: leave `OPEN_DASHBOARD_KEY_SOURCES` unset and it reports `unconfigured`. The zero-credential default is what makes embedding possible at all — OpenRouter's own MCP server mints a real API key over OAuth and therefore cannot ship inside a distributed desktop app.\r\n\r\n# What it covers\r\n\r\n<!-- summary:begin generated-do-not-edit -->\r\n\r\nRead-only MCP access to public model and GitHub evidence, covering **OpenRouter, Groq, Cerebras, Sail, Nous Research, QwenCloud, DeepInfra, Novita, SambaNova, Chutes, WaveSpeedAI, fal, Crazyrouter**. Version **1.1.5** registers **13 providers** and exposes eighteen bounded tools over stdio. Results use the same machine-readable value in `structuredContent` and JSON text content.\r\n\r\n<!-- summary:end -->\r\n\r\n**What you actually get:**\r\n\r\n- **One catalogue across thirteen named providers** — OpenRouter, Groq, Cerebras, Sail,\r\n  Nous Research, QwenCloud, DeepInfra, Novita, SambaNova, Chutes, WaveSpeedAI, fal and\r\n  Crazyrouter.\r\n- **Prices you can compare, or a refusal.** Two prices are compared only when they share a\r\n  unit *and* a condition. Otherwise you get `not_comparable` and the reason — never a\r\n  number that looks right and is not.\r\n- **Every figure carries its provenance** — the page it was read from, the timestamp, and\r\n  whether it was published, derived, or parsed out of prose.\r\n- **Generation cost stays auditable.** Numeric per-generation cost is shown only when the\r\n  provider returns an authoritative field. OpenRouter observations retain `usage.cost`;\r\n  Nous Research and Sail remain `BLOCKED` when no such field exists, and short samples\r\n  remain `INSUFFICIENT EVIDENCE` rather than becoming a single-looking estimate.\r\n- **Unknown stays unknown.** A price nobody publishes is not zero, and a rate this package\r\n  cannot source is not printed as a number.\r\n- **No credentials needed to start.** It reads public endpoints by default; keys only\r\n  widen what it can see.\r\n\r\n**What it is not:** not a proxy, not a router, not a billing dashboard. It answers\r\nquestions about models and prices. It never sends inference traffic, and it never writes\r\nanything anywhere.\r\n\r\n## Tools\r\n\r\n<!-- tools:begin generated-do-not-edit -->\r\n\r\n**18 read-only tools**, read from the server's actual MCP `tools/list` registration graph without calling any tool.\r\n\r\n| Tool | Purpose |\r\n|---|---|\r\n| `dashboard_benchmarks` | Dashboard benchmark observations |\r\n| `dashboard_capability_state` | Capability state for deterministic model selection |\r\n| `dashboard_catalogue` | Provider model catalogue and comparable media prices |\r\n| `dashboard_contract` | MCP schema and deprecation contract |\r\n| `dashboard_free_models` | Dashboard usable free models |\r\n| `dashboard_generation_costs` | Measured generation costs |\r\n| `dashboard_github_movers` | Dashboard public GitHub momentum movers |\r\n| `dashboard_github_trending` | GitHub trending repositories |\r\n| `dashboard_key_inventory` | Open Dashboard key inventory |\r\n| `dashboard_matrix` | Dashboard app-model matrix |\r\n| `dashboard_model_economics` | Open Dashboard model economics |\r\n| `dashboard_model_status` | Dashboard model status |\r\n| `dashboard_price_comparison` | Shared-model aggregator price comparison |\r\n| `dashboard_resolve_model` | Dashboard resolve model |\r\n| `dashboard_source_health` | Dashboard source health |\r\n| `dashboard_speed` | Provider speed claims and probe protocol |\r\n| `dashboard_usage_leaders` | Dashboard public ecosystem usage leaders |\r\n| `dashboard_whats_changed` | Dashboard changes |\r\n\r\n<!-- tools:end -->\r\n\r\nEvery tool is read-only, non-destructive, and open-world. Results preserve exact integer/decimal strings, provenance, stale markers, caps, and explicit unavailable/partial states. A tool-level upstream failure is returned as structured data and does not terminate the MCP connection.\r\n\r\n### Deterministic capability state\r\n\r\n`dashboard_capability_state` is the machine-readable state object for a selection agent. It returns one row per available live model slug, provider coverage, and the same two decisions over that one table: the literal cheapest paid model and the cheapest functional model. Every decision field has its own `checked_at`, `observed_at`, `expires_at`, and `age_seconds`; expired values are cleared and labelled `expired`, never reused as current values. The row carries `billing_class`, `context_window`, `catalogue_price`, measured `generation_cost` (including input/output token counts), `routed_provider`, three-state `reachability`, input/output modalities, `supports_tool_calling`, explicit `model_family` and `base_weights_lineage`, and the cached functionality ledger (`resolves`, `structured_output_ok`, `p50_latency`, `p95_latency`, `last_functionally_tested`, plus the external semantic-quality hook). Unknown is a value, not an omission.\r\n\r\nThe two policies are deliberately different: `queries.public_council` is eligible on current paid classification plus authoritative per-generation cost only, while `queries.private_council` additionally requires live reachability, tool-calling support, the re-testable mechanical functionality gates, the 60-second p95 bound, and a separate semantic judgment. Catalogue price is never substituted for generation cost. Vendor identity is never used as model-family or base-weight lineage. By default the live-model cursor is exhausted; `max_rows` is an explicit degraded read, and `pagination.capped`, `scope.completeness`, `considered_rows`, `candidate_rows`, and `elimination_breakdown` expose the denominator and every measured gate. Family collision is explicitly reported as not evaluated until the caller supplies the already-seated council roster. See [`docs/jev-routing-example.json`](docs/jev-routing-example.json) for a full-scan Jev projection: with the currently deployed source it deterministically returns `block` after the complete live set is considered because `/api/public/v2/generation-costs` and the three dated ledgers are not published, so `billing_class`, `generation_cost`, and the private-only fields remain explicit UNKNOWN.\r\n\r\nThe response also carries the locked `basket-v1` weekly measurement manifest. It names the eight model/provider rows, the exact workload, three vantage points, the published-price lower-bound cost estimate, and the signed-result snapshot fields. The current plan uses `n=8`: p50 and `max of 8` are publishable, while p95 is explicitly withheld until a larger sample exists. No Vercel job is allowed to claim a Bulgarian, European KVM, or US Oracle vantage point, and no missing snapshot is silently pooled.\r\n\r\n`/api/public/v2/live-models` — the cross-provider catalogue — is deployed and serving as of 2026-08-27. If the dashboard stops publishing it, model resolution, exact model status, and usable-free-model queries return an explicit capability decline pointing at `dashboard_source_health` instead of fabricating catalogue data.\r\n\r\n## Providers\r\n\r\n<!-- providers:begin generated-do-not-edit -->\r\n\r\nGenerated from the package registry: **13 providers** in **open-dashboard-mcp 1.1.5**. Publication declarations describe the named connector; they are not fresh measurements or a full provider inventory.\r\n\r\n| Provider | Sources | Pricing | Context | Modality | Lifecycle | Discounts | Spend visibility |\r\n|---|---|---|---|---|---|---|---|\r\n| <span data-provider-id=\"openrouter\">OpenRouter</span><br>Multi-provider aggregator | [Catalogue](https://openrouter.ai/api/v1/models) · [Documentation](https://openrouter.ai/docs/api/api-reference/models/get-models) | Some collected models | All collected models | All collected models | All collected models | Some collected models | Billing API |\r\n| <span data-provider-id=\"groq\">Groq</span> | [Catalogue](https://api.groq.com/openai/v1/models) · [Documentation](https://console.groq.com/docs/api-reference#models-list) | Some collected models | All collected models | All collected models | Not published in this connector | Not published in this connector | No billing API |\r\n| <span data-provider-id=\"cerebras\">Cerebras</span> | [Catalogue](https://api.cerebras.ai/v1/models) · [Documentation](https://inference-docs.cerebras.ai/api-reference/models) | Some collected models | Not published in this connector | Not published in this connector | Not published in this connector | Not published in this connector | No billing API |\r\n| <span data-provider-id=\"sail\">Sail</span> | [Catalogue](https://api.sailresearch.com/v1/models) · [Documentation](https://docs.sailresearch.com/pricing.md) | Some collected models | Not published in this connector | Not published in this connector | Not published in this connector | Not published in this connector | Not established |\r\n| <span data-provider-id=\"nous\">Nous Research</span><br>Model provider | [Catalogue](https://nousresearch.com/) · [Documentation](https://nousresearch.com/) | Some collected models | Not established | Not established | Not established | Not established | Not established |\r\n| <span data-provider-id=\"qwencloud\">QwenCloud</span> | [Catalogue](https://dashscope-intl.aliyuncs.com/api/v1/models) · [Documentation](https://dashscope-intl.aliyuncs.com/api/v1/models) | Some collected models | Some collected models | Some collected models | Not published in this connector | Not published in this connector | No billing API |\r\n| <span data-provider-id=\"deepinfra\">DeepInfra</span> | [Catalogue](https://api.deepinfra.com/models/list) · [Documentation](https://deepinfra.com/models) | All collected models | Some collected models | Not published in this connector | Some collected models | Not published in this connector | No billing API |\r\n| <span data-provider-id=\"novita\">Novita</span> | [Catalogue](https://api.novita.ai/v3/openai/models) · [Documentation](https://novita.ai/docs/api-reference/model-apis-llm-list-models) | Some collected models | All collected models | All collected models | Not published in this connector | Some collected models | No billing API |\r\n| <span data-provider-id=\"sambanova\">SambaNova</span> | [Catalogue](https://api.sambanova.ai/v1/models) · [Documentation](https://docs.sambanova.ai/cloud/api-reference/endpoints/models) | All collected models | All collected models | Not published in this connector | Not published in this connector | Not published in this connector | No billing API |\r\n| <span data-provider-id=\"chutes\">Chutes</span> | [Catalogue](https://llm.chutes.ai/v1/models) · [Documentation](https://chutes.ai/app/api) | All collected models | All collected models | All collected models | Not published in this connector | Not published in this connector | No billing API |\r\n| <span data-provider-id=\"wavespeed\">WaveSpeedAI</span><br>Media generation platform | [Catalogue](https://wavespeed.ai/api/models) · [Documentation](https://wavespeed.ai/) | Some collected models | Not published in this connector | Some collected models | Not published in this connector | Not published in this connector | Not established |\r\n| <span data-provider-id=\"fal\">fal</span><br>Media generation platform | [Catalogue](https://api.fal.ai/v1/models) · [Documentation](https://fal.ai/docs/documentation) | Some collected models | Not published in this connector | Some collected models | Not published in this connector | Not published in this connector | Not established |\r\n| <span data-provider-id=\"crazyrouter\">Crazyrouter</span><br>Multi-provider aggregator | [Catalogue](https://api.crazyrouter.com/v1/models) · [Documentation](https://docs.crazyrouter.com/en/chat/openai/models) | Some collected models | Not established | Some collected models | Not established | Some collected models | Not established |\r\n\r\n### Provider pitches and structured caveats\r\n\r\nQuotations are the providers' words. Caveats record published limits, including scope and units; they do not claim measured inference speed or a caller's current quota. An absent caveat is accompanied by its research status, never a null placeholder.\r\n\r\n**OpenRouter**\r\n\r\n> “The Unified Interface For Every Model” — [OpenRouter](https://openrouter.ai/), observed 2026-09-08.\r\n\r\n- **rate_limit: 20 requests/minute.** Free model variants (IDs ending in :free), regardless of account status; paid variants are outside this limit. This is the published platform quota, not the caller's remaining allowance. [Provider source](https://openrouter.ai/docs/api_reference/limits), observed 2026-09-08; basis: `provider_published`.\r\n\r\n**Groq**\r\n\r\n> “Groq makes inference work at scale.” — [Groq](https://groq.com/), observed 2026-09-08.\r\n\r\n- **rate_limit: 8000 tokens/minute.** Free Plan summary, openai/gpt-oss-120b, organization-level combined token quota. Cached tokens are excluded. Exact organization limits can differ; this is not tokens per second or an inference-speed ceiling. [Provider source](https://console.groq.com/docs/rate-limits), observed 2026-09-08; basis: `provider_published`.\r\n\r\n**Cerebras**\r\n\r\n> “Build Products that Others Can't” — [Cerebras](https://www.cerebras.ai/), observed 2026-09-08.\r\n\r\n- **trial_expiry: 30 days.** Free Trial credits expire 30 days after they are granted. This is the published trial policy, not this caller's credit balance or expiry date. [Provider source](https://inference-docs.cerebras.ai/support/rate-limits), observed 2026-09-08; basis: `provider_published`.\r\n\r\n**Sail**\r\n\r\n> “Sail is the most cost-efficient API for the best open-source models.” — [Sail Research](https://www.sailresearch.com/), observed 2026-09-08.\r\n\r\nCaveats: Not found in checked sources. No numeric operating limit was established from this checked platform page. This limited check does not establish that the provider publishes none elsewhere. [Source](https://www.sailresearch.com/); checked 2026-09-08.\r\n\r\n**Nous Research**\r\n\r\n> “Published API rate: $0.072/M” — [Nous Research published pricing claim](https://nousresearch.com/), observed 2026-09-11.\r\n\r\nCaveats: Not found in checked sources. No numeric operating limit was established from this checked platform page. This limited check does not establish that the provider publishes none elsewhere. [Source](https://nousresearch.com/); checked 2026-09-11.\r\n\r\n**QwenCloud**\r\n\r\n> “Foundation for AI Innovation” — [Alibaba Cloud Model Studio](https://modelstudio.alibabacloud.com/), observed 2026-09-08.\r\n\r\nCaveats: Not found in checked sources. No numeric operating limit was established from this checked platform page. This limited check does not establish that the provider publishes none elsewhere. [Source](https://modelstudio.alibabacloud.com/); checked 2026-09-08.\r\n\r\n**DeepInfra**\r\n\r\n> “Accelerate your AI with developer-friendly APIs designed for performance and cost-efficiency.” — [DeepInfra](https://deepinfra.com/), observed 2026-09-08.\r\n\r\n- **concurrency_limit: 200 concurrent_requests.** Default account limit per model; not requests per minute. An account can request a higher limit, and a busy model can still return 429 below the default. [Provider source](https://docs.deepinfra.com/account/rate-limits), observed 2026-09-08; basis: `provider_published`.\r\n\r\n**Novita**\r\n\r\n> “Run models, scale GPUs, and build AI agents, all on one platform.” — [Novita AI](https://novita.ai/), observed 2026-09-08.\r\n\r\nCaveats: Not found in checked sources. No numeric operating limit was established from this checked platform page. This limited check does not establish that the provider publishes none elsewhere. [Source](https://novita.ai/); checked 2026-09-08.\r\n\r\n**SambaNova**\r\n\r\n> “The fastest AI inference on the largest models” — [SambaNova, SambaCloud](https://sambanova.ai/products/sambacloud), observed 2026-09-08.\r\n\r\nCaveats: Not found in checked sources. No numeric operating limit was established from this checked platform page. This limited check does not establish that the provider publishes none elsewhere. [Source](https://sambanova.ai/products/sambacloud); checked 2026-09-08.\r\n\r\n**Chutes**\r\n\r\n> “Breakthrough Serverless Compute for AI, at Scale.” — [Chutes](https://chutes.ai/), observed 2026-09-08.\r\n\r\nCaveats: Not found in checked sources. No numeric operating limit was established from this checked platform page. This limited check does not establish that the provider publishes none elsewhere. [Source](https://chutes.ai/); checked 2026-09-08.\r\n\r\n**WaveSpeedAI**\r\n\r\n> “WaveSpeedAI is the ultimate AI media generation platform — easy to use, affordable, scalable, and fast.” — [WaveSpeedAI](https://wavespeed.ai/), observed 2026-09-08.\r\n\r\nCaveats: Not found in checked sources. No numeric operating limit was established from this checked platform page. This limited check does not establish that the provider publishes none elsewhere. [Source](https://wavespeed.ai/); checked 2026-09-08.\r\n\r\n**fal**\r\n\r\n> “The generative media platform powering the world’s top AI apps.” — [fal](https://fal.ai/docs/documentation), observed 2026-09-08.\r\n\r\nCaveats: Not found in checked sources. No numeric operating limit was established from this checked platform page. This limited check does not establish that the provider publishes none elsewhere. [Source](https://fal.ai/docs/documentation); checked 2026-09-08.\r\n\r\n**Crazyrouter**\r\n\r\n> “Same OpenAI-style workflow. More models. Lower pricing. Easier experimentation.” — [Crazyrouter](https://crazyrouter.com/tools/), observed 2026-09-08.\r\n\r\nCaveats: Not found in checked sources. No numeric operating limit was established from this checked platform page. This limited check does not establish that the provider publishes none elsewhere. [Source](https://crazyrouter.com/tools/); checked 2026-09-08.\r\n\r\n<!-- providers:end -->\r\n\r\nDeepInfra, Novita, SambaNova and Chutes publish their collected catalogues without a credential. QwenCloud requires the collector's region-bound international key. Both paths produce public dashboard data that this MCP reads without credentials. Mistral, xAI, Together, Fireworks, Nebius, Hyperbolic and Parasail returned 401 in the earlier catalogue probes; that observation describes those endpoints, not what the providers publish elsewhere.\r\n\r\n**QwenCloud's native `/api/v1/models` catalogue is paginated.** The collection completed at 2026-09-08 13:47:21 UTC with **255 identities: 249 native and six compatibility-only supplements**. The old catalogue shares 159 of its 165 ids with the native source; retaining the other six prevents false disappearance when switching endpoints. Of the 249 native models, **242 have price blocks**: 306 outer blocks contain 893 inner price entries. Native metadata adds 59 comparable prompt/completion price pairs, 134 usable context values, 247 nonempty response-modality lists and 72 explicit reasoning capabilities. The 893 entries comprise 738 per-token entries and **155 non-token price entries**: 94 per second, 38 per image, 20 per 10,000 characters and 3 per voice. Those 155 entries are excluded from token comparisons and counted in collection metadata; no model identities are dropped for having media prices. Media-only models, the seven native models without price blocks and the six identity-only supplements remain `paid_or_unknown`.\r\n\r\nThe raw archive preserves all native prices, token ranges and time bands; **the current API does not publish the bands**. Flat rates are deliberately withheld for 39 models: 37 with multiple ranges and two with distinct peak/offpeak bands. Entries contain 782 standard, 99 unset, six peak and six offpeak bands. Flat prompt/completion prices are exposed only for an unambiguous default general input/output rate requiring no range or band selection. Other rates remain null with a selection-required `missingFields` marker, rather than silently quoting one band. The 72 explicit Reasoning capabilities become `reasoningEfforts: []`, meaning support without named effort levels; numeric reasoning limits remain in the raw archive, and absent positive capability evidence stays null.\r\n\r\nThe token catalogue observations below were measured on 2026-09-08. **DeepInfra** priced on eight different axes and only 219 of its 372 models were priced per token; other axes were excluded from token comparisons. The media catalogue now reports their native axes separately and normalizes comparable image/video prices. Its `deprecated` field is a *retirement date*, not a flag, and 114 of the 219 already carry one -- a concrete retirement date and successor are stronger evidence than a missing field. **Novita**'s flat price field is not a consistent tier: it is the cheapest band on one model and the dearest on another, and two tiered models publish no flat price at all, so prices here are the first tier with the full bands retained. The catalogues disagree about almost everything, and **normalising them is the work** — the API calls are the easy part.\r\n\r\n**Cerebras's current `/v1/models` connector** supplies only ids and owners. A separate public native source returned richer metadata for three of three models on 2026-09-08; integrating it is pending, so those values are not yet returned here. The current connector's gaps do not establish provider-wide absence.\r\n\r\n**Sail publishes [prices](https://docs.sailresearch.com/pricing.md) and [model context information](https://docs.sailresearch.com/models).** This MCP quotes prices only after verifying its pinned document and does not collect the documented context values. Sail also documents [usage and billing routes](https://docs.sailresearch.com/usage-endpoints.md); this integration has not probed or read them, so its registry reports spend visibility as unknown. See [Sail pricing](#sail-pricing-a-pinned-document-not-an-api) for the existing document verification.\r\n\r\nFour rules follow from that table, and the tools enforce all four:\r\n\r\n- **An unpriced model is cost-unknown, never free.** A missing comparable token price can reflect a connector gap, absent upstream pricing, a media billing unit or a required range/band choice. Rows satisfying the requested capability filters keep their place with `priceComparable: false` and a stated `unrankableReason`, listed after the ranked rows rather than dropped.\r\n- **No lifecycle signal is not the same as no risk.** OpenRouter and DeepInfra carry lifecycle declarations; coverage varies by connector. Groq, Cerebras and Sail models report `retirementRisk: \"not_published_by_provider\"`, because `\"none\"` would be a false reassurance. For those three, a model vanishing from the list is the only retirement notice there is — so `availability: \"disappeared\"` is treated as imminent.\r\n- **Every null has source context.** [`src/providers/registry.ts`](src/providers/registry.ts) describes the known sources and connector limits with `always`, `partial` or `never`; an unfamiliar provider receives `unknown`. A null does not establish that a provider withheld information.\r\n- **A price read from a document is only as good as the document.** Sail's prices come from a pinned pricing page rather than an API, so the server verifies the document before quoting from it and declines rather than guessing when it has changed.\r\n\r\n## Full catalogue and comparable media prices\r\n\r\n`dashboard_catalogue` keeps acquired model identities even when no comparable price is available. DeepInfra, WaveSpeedAI and Chutes use public native sources. fal uses authenticated model/pricing sources when `FAL_API_KEY` is supplied, and public catalogue/summary pricing otherwise. Crazyrouter uses key-visible identities when `CRAZYROUTER_API_KEY` is supplied, and public pricing identities otherwise. Other providers retain their dashboard archive. All requests are read-only metadata requests.\r\n\r\nFor example, request WaveSpeed video detail with:\r\n\r\n```json\r\n{\r\n  \"providers\": [\"wavespeed\"],\r\n  \"mediaKind\": \"video\",\r\n  \"modelIds\": [\"wavespeed-ai/wan-2.2/t2v-720p\"],\r\n  \"offset\": 0,\r\n  \"limit\": 20\r\n}\r\n```\r\n\r\n| Input | Meaning |\r\n|---|---|\r\n| `providers` | Optional list of provider IDs, at most 30; defaults to the package registry. |\r\n| `mediaKind` | Optional `image`, `video`, `text`, `audio`, `other` or `unknown` filter. |\r\n| `modelIds` | Optional exact model IDs, at most 20. Also requests WaveSpeed pricing detail for those IDs. |\r\n| `offset` | Offset into matching acquired rows, default 0, maximum 1,000,000. |\r\n| `limit` | Rows per answer, default 100, maximum 500. Follow `population.nextOffset` until null. |\r\n\r\nFiltering happens after acquisition, in stable provider/id order. `population` reports acquired, matched and returned counts, exclusions by media kind and model ID, and rows omitted by pagination. Each provider separately reports `listed`, `received`, `retained`, `excluded`, `exclusionRules`, `completeness` and the applied `requestParameters`. A missing native denominator stays null with an explanation; unavailable and unknown populations never become zero. These counters describe the rows actually acquired, not a claim that every provider's entire global inventory was observed.\r\n\r\nPricing state is separate from the points: `published` requires at least one point, while `not_published` and `unknown` carry an empty list and an explanatory `pricingNote`. A missing or non-comparable price is never represented as zero. Every normalized summary figure uses `{ value, unit, assumption, derived_from }`; an assumption cannot be omitted.\r\n\r\nToken prices retain token units; compute rental, character, voice and other unsupported billing axes remain native data rather than being relabelled as image or video generation prices. Structured provider pitches and scoped caveats accompany the response in `providerMetadata`.\r\n\r\nCoverage has specific limits. The dashboard's legacy archive does not expose every native population denominator. WaveSpeed enriches its default four video IDs plus up to 20 requested IDs; list-only prices whose formula or output quantity is unknown remain unavailable. Isolated detail failures are recorded and do not prevent later requested model lookups; shared service or access failures stop the batch. Authenticated fal pricing is requested in batches of 50 under a fixed request/time budget; a 429 stops the batch without retry. Native price units can describe compute time, so generic seconds do not become output-video seconds without explicit evidence. Its public fallback checks only the summary pricing table. Crazyrouter preserves its native billing formulas; unsupported tiered or media formulas stay unpriced for comparison. The exact GPT-4o, GPT-4o mini and GPT-4.1 default-group figures that are exactly 0.65x OpenAI list prices carry derived provenance and are excluded from competition comparisons. A failed source read is distinct from a successfully checked missing row, and neither means provider-wide nonpublication. Complete identity counts remain intact when price coverage is partial. Chutes compute rental prices are not generation prices.\r\n\r\n## Shared-model price comparison\r\n\r\n`dashboard_price_comparison` joins Crazyrouter aliases to OpenRouter using exact IDs and explicit native author evidence. It retains unmatched and unpriced Crazyrouter identities, records each source's population, and reports filters and pagination separately. Optional `modelIds` selects up to 20 exact Crazyrouter IDs; `offset` defaults to 0 and `limit` to 50 (maximum 500).\r\n\r\n```json\r\n{\"modelIds\":[\"gpt-4o\",\"gpt-4o-mini\",\"gpt-4.1\"],\"limit\":20}\r\n```\r\n\r\nThe response presents every compatible input/output price point and condition side by side and computes savings with exact decimal fractions. If units or conditions do not match, that leg is `not_comparable` with a reason; it never picks one rate silently. Crazyrouter quotes are its public default pricing group; the caller's billing group and settled charges are unverified. Per-model discount badges are retained as `derived` points with their model-specific factor and source text; there is no global `0.65` assumption. OpenRouter quotes are collected during the call for rows that remain eligible. Available direct-provider references are explicitly dated published-price observations, not live account prices. Exact API aliases do not establish that two services resolve to the same immutable model snapshot.\r\n\r\nCrazyrouter's dated claim is attributed and checked only where an independently comparable direct-provider reference exists. Derived rate-card matches are retained as evidence but excluded from that assessment; a quote outside the claimed range is reported as a discrepancy, and absent direct prices remain unknown. A few compared aliases do not prove a statement about most models. The tool makes no inference request and measures no latency or model quality.\r\n\r\nSupply optional `FAL_API_KEY` and `CRAZYROUTER_API_KEY` through the host's environment. Startup and tool discovery remain credential-free. This package does not read Secret Manager itself, write keys, or modify an account. Account spend remains unread by these collectors.\r\n\r\nInstall-time selection of tools and providers belongs to 1.0. Set `OPEN_DASHBOARD_TOOLS` and/or `OPEN_DASHBOARD_PROVIDERS` to comma-separated allowlists before startup. Deselected tools are absent from `tools/list`; provider-bearing tools omit deselected providers, and the price comparison tool is omitted unless both `openrouter` and `crazyrouter` are selected. Request filters still select output within the installed surface.\r\n\r\n## Discounts\r\n\r\n**Discount coverage varies by connector.** OpenRouter publishes endpoint discounts and Novita publishes effective versus original prices. The original Groq, Cerebras and Sail token connectors report `not_published_by_provider`; this is scoped to their collected data. Use the generated registry table for current publication declarations.\r\n\r\nOpenRouter publishes discounts as a **provider-endpoint** fact rather than a model fact — measured 2026-08-19, zero of 550 models carry a `discount` key while 272 of 272 provider endpoints do. `dashboard_model_economics` therefore reads `/api/public/v2/models/{id}/providers` per model and reports the best published discount with the provider named, so the number is checkable. Groq, Cerebras and Sail rows report `not_published_by_provider` and cost no upstream request.\r\n\r\nFour distinctions the tool refuses to collapse:\r\n\r\n- **`discounted`** — a non-zero published discount was found.\r\n- **`no_discount`** — endpoints were read and every one published nothing or zero. The only value that means full price.\r\n- **`unavailable`** — the dashboard holds no endpoint observation for that model. Upstream observes endpoints under a daily request budget, so most of the catalogue is unobserved at any moment. Unknown, never full price.\r\n- **`not_published_by_provider`** — this provider has no discount concept at all. Nothing to look up.\r\n- **`not_checked`** — the per-call enrichment bound was reached. Also unknown.\r\n\r\n**A missing expiry does not mean a permanent discount.** The original OpenRouter endpoint integration exposes a discount ratio and no end date; the original Groq, Cerebras and Sail connectors expose no discount expiry. These rows carry `expiresAt: null` with `expiryPublished: false`. Current connector declarations remain in the registry rather than a manually maintained provider count here.\r\n\r\nThere is no public route listing all discounted models, so discovery is per model and bounded by `discountEnrichment`.\r\n\r\n## GitHub trending\r\n\r\n`dashboard_github_trending` reads `/api/public/v2/github/trending`, which scrapes `github.com/trending` because GitHub publishes no API for it.\r\n\r\nGitHub's trending board turns over through the day, so **a list without a collection time is not interpretable**: a fresh one and a three-day-old one look identical. Every answer therefore carries:\r\n\r\n- `collectedAt` — when the upstream page was actually retrieved, taken from the origin's `Date` header. **Not** when the tool ran, and not when the response was assembled; the underlying fetch is cached, so those would overstate freshness by up to three hours.\r\n- `ageHours` and `stale` — computed against a six-hour window, well inside one turnover. An unparseable timestamp reads as maximally stale rather than fresh.\r\n- `source` — `direct` or `firecrawl`, recorded rather than inferred.\r\n- `fallbackReason` — why the free direct scrape was abandoned, when it was. Null on the happy path.\r\n\r\nThe direct scrape is the primary path and carries production traffic. A paid Firecrawl fallback exists for the day GitHub blocks the scrape or changes its markup; when it serves, the tool says so unprompted, because a fallback nobody is told about is how you end up on the paid path for months without knowing the free one died.\r\n\r\n## Models that stopped being free\r\n\r\nA free model does not announce itself when it starts charging. Its id does not change, it stays listed, and nothing else in a catalogue moves. The bill is the notification.\r\n\r\n`dashboard_whats_changed` compares the two most recent archived catalogue runs and reports price movement, with models that **left free** in their own bucket:\r\n\r\n```json\r\n\"priceChanges\": {\r\n  \"status\": \"available\",\r\n  \"becamePaid\": [\r\n    {\r\n      \"modelId\": \"vendor/was-free\",\r\n      \"transition\": \"became_paid\",\r\n      \"basePromptPrice\": \"0\", \"headPromptPrice\": \"0.0000004\",\r\n      \"wasFree\": true, \"isFree\": false,\r\n      \"note\": \"vendor/was-free was free and now charges 0.0000004 per prompt\r\n               token. Nothing about its id changed, so a pinned config keeps\r\n               calling it and starts paying.\"\r\n    }\r\n  ],\r\n  \"otherChanges\": [],\r\n  \"headPublishedOn\": \"2026-08-26\",\r\n  \"coverage\": {\r\n    \"status\": \"indeterminate\",\r\n    \"reason\": \"The producer identifies this comparison by run id and publishes no\r\n               date for either run, so how far back it reaches is not published.\r\n               Whether it covers 2026-08-18 to 2026-08-25 cannot be determined\r\n               from this response, so an empty result is not evidence that\r\n               nothing started charging.\"\r\n  },\r\n  \"comparison\": { \"baseRunId\": \"…\", \"headRunId\": \"…\" }\r\n}\r\n```\r\n\r\nThe comparison is the archive's own run chain, not a date you choose, so the answer is always \"since the last collection\" and cannot straddle a missed run and present a stale delta as fresh. Prices are compared as exact decimals — never floats — because a rounding error in a price comparison would invent or hide a change. Zero is recognised semantically, so `0`, `0.0` and `0.00000000000000000000` are all free; a **null price is not free**, it means no comparable price is available in that field.\r\n\r\n### The window you asked for is not the window prices were compared over\r\n\r\nEvery other section of `dashboard_whats_changed` honours the `since` you pass. Price movement cannot: the public route takes no window parameter and always compares the two most recent archived runs. An empty `becamePaid` inside a month-wide response would otherwise read as a month-wide all-clear it never was.\r\n\r\n**And the comparison's span is not published.** The route identifies its two runs by id and carries no date for either. The response envelope does have a `window`, but that is the *head publication date*, not the span — measured against production on 2026-08-27, `window.start === window.end === 2026-08-26` while `baseRunId !== headRunId` on a daily collection cadence, so the real comparison covers at least two days and the envelope calls it one. Reading it as the span understates the comparison and invents a coverage answer.\r\n\r\nSo the section reports only what the payload supports:\r\n\r\n- **`headPublishedOn`** — the newest catalogue state examined, named for what it is.\r\n- **`coverage.status`** is `incomplete` or `indeterminate`, and **never `complete`.** Complete coverage would require the base run's date, which is not published. `incomplete` is the one verdict the response does support: nothing after the head run was examined, so a `headPublishedOn` earlier than the report's `through` proves the tail of your window went unchecked — the lagging-collector case, and the days a reader most assumes are covered.\r\n- **`coverage.reason`** says which of the two it is and why, and the same sentence is pushed into the response `warnings` every time, because a field nobody reads is not a disclosure.\r\n\r\n`indeterminate` is not a softer way of saying fine. It means an empty result is not evidence about your window.\r\n\r\n**So `dashboard_whats_changed` does not return `\"ok\"`.** While the route stays undated, an available price section can never establish that it covered what you asked about, and a status of `ok` beside `Nothing changed` would claim it did. The tool returns `partial`, and the summary carries the caveat rather than leaving it to a warning — because the summary is the line a caller relays:\r\n\r\n> 5 changes found in scanned evidence since 2026-08-18; the comparison is incomplete. **Price movement could not be shown to cover 2026-08-18 to 2026-08-25, so this is not an all-clear on models that started charging.**\r\n\r\nMeasured against production, 2026-08-27.\r\n\r\nTo be exact about what that costs: **`ok` is unreachable in this version.** A readable price section can never establish coverage, and an unreadable one is degraded — either way a *successful* report is `partial`. Do not write a branch waiting for `ok`. Making it reachable would need the producer to publish dates for the runs it compares *and* this client to read them; neither exists today, and this README will not guess at the shape of either.\r\n\r\nThis is about successful reports only. A read that fails outright — bad input, or a manifest that cannot be fetched — still returns `status: \"error\"` with the safe error attached. Handle three: `partial`, `error`, and `ok` for completeness even though nothing produces it.\r\n\r\n**An inverted window is an outcome, not a warning.** `since` is yours and `through` is derived from the newest complete bucket, so the two can cross. Every window-scoped section would then report nothing — which is exactly what a satisfied query looks like. A warning beside a normal summary does not fix that, because the summary is the line a caller relays and it would read *Nothing changed since 2027-01-01*. So an inverted range returns `status: \"partial\"` with the window-scoped sections `unavailable` and a summary that names the inversion. Price movement is independent of your window, so it still reports.\r\n\r\n**The summary can no longer read as an all-clear while prices moved.** It leads with the money — `1 model stopped being free in the comparison ending 2026-08-26` — and price movement with no free-to-paid row still gets its own sentence rather than passing unmentioned. Where the summary used to say *no changes* and *nothing changed*, it says *no other changes* and *nothing else changed* whenever the price section reports movement.\r\n\r\n**The two counts are never added together.** Price rows come from the producer's comparison, not from your window, so a single total would state a number for a window some of the counted items sit outside. Each sentence carries its own count and its own comparison instead.\r\n\r\n**A capped price page is a floor, not a total.** `/price-changes` paginates and the section reads one page of 100 mixed rows, so when `cap.capped` is true **both** counts are qualified, because an unread row can be either kind — `At least 2 models stopped being free …, alongside at least 3 other price moves; the price comparison was capped at 100 rows with more unread`. A capped page also may not rule the transition *out*: where an uncapped page says `none of them a model leaving free`, a capped one says `None of the rows read was a model leaving free, but … an unread row still could be`. The categorical zero is the expensive claim here, and only a complete read earns it.\r\n\r\n**A price section that failed to read degrades the report.** A `whats_changed` whose price section is `unavailable` or `unsupported_by_public_api` returns `status: \"partial\"`, never `\"ok\"`, and the summary says the failure is not evidence that nothing started charging.\r\n\r\n**Three failure states, none of which is an empty list.** An empty `becamePaid` means nothing left free in what was compared. If the deployment does not serve the endpoint, you get `unsupported_by_public_api`; if it could not be read, `unavailable` with the reason. Returning an empty list on failure would read as *nothing started charging you*, which is the most expensive wrong answer this server could give.\r\n\r\nOnly models present in **both** runs are compared. A model that appeared or vanished is a different question, answered by the appearance and disappearance sections — folding it in here would report a brand-new model as having started charging.\r\n\r\n## Key inventory\r\n\r\n`dashboard_key_inventory` is the only tool that touches a credential, and it is opt-in so the zero-credential default survives for everything else. Unconfigured, it returns `unconfigured`, which is a normal outcome rather than an error.\r\n\r\nSet `OPEN_DASHBOARD_KEY_SOURCES` to comma-separated `provider:secretManagerName=ENV_VAR` triples and provide each named environment variable:\r\n\r\n```\r\nOPEN_DASHBOARD_KEY_SOURCES=openrouter:my-openrouter-key=OPENROUTER_API_KEY,groq:my-groq-key=GROQ_API_KEY,cerebras:my-cerebras-key=CEREBRAS_API_KEY\r\n```\r\n\r\nOnly the Secret Manager names are ever reported. Key values are never returned, logged, or written to evidence — a test asserts the serialized result contains no key material. The tool issues GET requests only and contains no code path that can mint, modify, or revoke a key. Keep provisioning with a separate, privileged key that this server never sees.\r\n\r\n**Spend is not uniformly readable, and the tool says so rather than leaving a blank.** OpenRouter exposes per-key usage and ceiling. Groq and Cerebras retain the registry's `no_billing_api` classification. Sail documents billing routes that this integration does not read: its keys report `spendReadability: \"unread\"`, its registry reports spend visibility `unknown`, and `usdSpent` remains null. No billing request is added. A blank money field must not read as zero.\r\n\r\n`usdLimit: null` with `uncapped: true` is the finding worth acting on: a key with no spend ceiling can spend without bound if it leaks.\r\n\r\n### Edge block versus dead key\r\n\r\nA `401`/`403` carrying Cloudflare code **1010** means the request was rejected at the edge before reaching the provider — usually for sending no User-Agent — and says nothing about whether the key is valid. Reported as `edge_blocked` with `alive: null`, distinct from `rejected`, because treating it as a dead key has caused wrong rotations before. Every probe sends a User-Agent for this reason.\r\n\r\nVerified 2026-08-27 from a Windows host: Groq answers `401 invalid_api_key` and Cerebras `403 {\"detail\":\"Not authenticated\"}`, with and without a User-Agent — ordinary credential errors, no 1010. The 1010 case is real but host-specific, so it is detected from the body rather than assumed from the status.\r\n\r\n## Auditing pinned model slugs\r\n\r\nPass `ids` to `dashboard_model_economics` with the slugs a config hardcodes, across any provider. Ids absent from **every** provider catalogue come back in `missingIds` — the 404 a config is about to hit, observed before it happens — and surviving ids carry current price, discount and `retirementRisk`.\r\n\r\n# Caveats\r\n\r\n## Freshness, and what happens when the source is slow\r\n\r\nDashboard-backed tools read a **public, zero-credential HTTP API** at query time. That host is a hobby-tier deployment with no uptime obligation, and dashboard-backed answers depend on it. Two things follow, and both are visible in the response rather than assumed.\r\n\r\n**Responses are cached, and every answer carries its own age.** A single `dashboard_model_economics` call can make two dozen upstream requests; reading live every time would put avoidable load on that host. Each `evidence[]` entry carries `freshness`:\r\n\r\n```json\r\n\"freshness\": {\r\n  \"state\": \"cached\",\r\n  \"fetchedAt\": \"2026-08-27T20:21:52.494Z\",\r\n  \"ageSeconds\": 30,\r\n  \"expiresAt\": \"2026-08-27T20:26:52.494Z\"\r\n}\r\n```\r\n\r\n`state` is `live` (fetched during this call), `cached` (inside its expiry), or `expired`. Default TTL is five minutes; pass `cache: { ttlMs: 0 }` to read live every time, or `cache: false` to disable it.\r\n\r\n**When the host is slow or down, you get an honest answer, never a silent fallback.** With nothing cached, the upstream failure is returned as structured data — `unavailable` with a reason. With an expired entry in hand, the last-known value *is* returned, but marked:\r\n\r\n```json\r\n\"freshness\": {\r\n  \"state\": \"expired\",\r\n  \"fetchedAt\": \"2026-08-27T20:21:52.494Z\",\r\n  \"ageSeconds\": 3600,\r\n  \"note\": \"Upstream could not be reached, so this is the last known value,\r\n           measured 2026-08-27T20:21:52.494Z (3600s ago). It is not current.\"\r\n}\r\n```\r\n\r\nStale pricing is the exact harm this tool exists to prevent, so a number is never handed back as current when it is not. **Unmeasured is not zero, and stale is not fresh** — the age arrives with the answer so a caller can refuse it.\r\n\r\n## Free versus rate-limited free\r\n\r\n`freeKind` separates `concrete_free` (a real zero-priced model) from `free_router` (a rate-limited free routing tier, usable for a probe but not a workload) from `paid_or_unknown` (which includes every provider that publishes no price — unknown, and never treated as free). `genuinelyFree` is true only for `concrete_free`.\r\n\r\n`emitsText` is `true`, `false`, or `null` where the provider publishes no modality. Without it the cheapest free model is a music generator. `includeUnknownCapability` (default true) decides whether rows with unpublished capability take part; set it false when a hard guarantee is needed, at the cost of excluding Cerebras entirely.\r\n\r\n## Sail pricing: a pinned document, not an API\r\n\r\nSail's catalogue API returns model ids and nothing else — no price, no context length, no modality. Its prices live in a human-readable pricing page, `https://docs.sailresearch.com/pricing.md`.\r\n\r\nA page is not an API. It can be restructured, reworded or repriced without warning, and a parser that keeps reading it regardless will keep returning numbers that look exactly as confident as they did when they were right. So the server hashes the document and compares it to a pinned digest before quoting anything from it:\r\n\r\n- **Digest matches** — prices are parsed and Sail models join the ranking.\r\n- **Digest differs** — Sail models are **omitted**, and the answer carries `PRICES ARE STALE`, naming both digests. It does not fall back to the last known prices, because a price that was true last week is not a price.\r\n\r\nThe trade is deliberate: the tool goes quiet about Sail rather than quoting a number it cannot stand behind. What it costs is availability — every legitimate upstream change also silences Sail until the pin is reconciled against the live document.\r\n\r\nThat is not hypothetical. Between two captures the document grew about 10% and Sail's catalogue gained a model (`google/gemma-4-12B-it`, 9 → 10) while `zai-org/GLM-5.3` held at $1.40 / $4.40 per million. **A digest that changes tells you the document moved. It cannot tell you whether the prices did.**\r\n\r\nThe fixture used in tests is byte-identical to the live document and is marked `-text` in `.gitattributes`, because `core.autocrlf` will otherwise rewrite its line endings on checkout and change the hash — which looks precisely like an upstream price change and is not one.\r\n\r\n## Gaps in the version numbers\r\n\r\n**There is no 0.9.0 on npm and there never was.** It was built and verified in the repository and never published, so the 0.8.0 → 1.0.0 jump is not a release you missed; the breaking changes in that jump are in [the 1.0.0 release notes](docs/release-1.0.0.md). **There is no 1.1.1 either.** If you track version numbers, these gaps are bookkeeping, not releases that came and went.\r\n\r\nOpenRouter ships its own MCP server. It is single-vendor by construction, which makes it unable to answer the question this one exists for: *of the providers I actually hold keys with, which is the cheapest capable option right now.*\r\n\r\n## Verification\r\n\r\nBuild first, then run the real compiled child through the official SDK client:\r\n\r\n```powershell\r\nnpm run verify:stdio -- --mode live\r\nnpm run verify:stdio -- --mode fixture\r\nnpm run verify:stdio -- --mode offline\r\nnpm run verify:stdio -- --mode html\r\nnpm run verify:stdout\r\nnpm run verify:stdio -- --mode alien-cwd\r\n```\r\n\r\nThe original six harness modes passed on 2026-08-27. That historical fixture asserts that its original OpenRouter, Groq, Cerebras and Sail rows survive into one answer, that a priced Groq model ranks while an unpriced Cerebras model is kept and explained, that Sail is injected only when its pinned document verifies, and that no discount expiry is invented.\r\n\r\n`live` and `alien-cwd` use the public zero-credential default. `fixture`, `offline`, `html`, and `verify:stdout` use loopback-only test infrastructure. Evidence is written under ignored `verification/raw/` only after validation. The raw verifier is separate because the official stdio transport does not expose child stdout and therefore cannot prove byte purity on its own.\r\n\r\nThe ten independent archived-date evaluation cases are in `evals/dashboard-intelligence.xml`. The latest checked payloads and timings are recorded in `docs/verification-report.md`.\r\n\r\n# Semantics\r\n\r\n## How prices and speed are modelled\r\n\r\nEverything above rests on these definitions. Read this when a number surprises you.\r\n\r\n<!-- contract:begin generated-do-not-edit -->\r\n\r\nA model does not have *a* price. It has a **set** of price points, each valid only under a stated condition, and the set is the unit this package publishes.\r\n\r\nA point is `{ amount, unit, condition, source: { url, readAt }, provenance }`. Amounts are exact decimal strings, never floats, so a sub-cent per-token rate survives a round trip. `source` names the page it was read from and when; a price whose read time cannot be established is not emitted at all.\r\n\r\n**Units** (10): `token_in`, `token_out`, `token_cached`, `token_cache_create`, `image`, `megapixel`, `video_second`, `video`, `request`, `gpu_hour`.\r\n\r\n**Condition kinds** (five): `latency_window`, `time_band`, `tier`, `rate_class`, `price_scope`. A rate is never detached from the choice that produced it: a latency window, a time of day, a volume tier, a rate class, or whose price it is. `price_scope` distinguishes a rate quoted to an authenticated account from a public list rate -- without it the two look identical and compare as though they were the same quantity.\r\n\r\n**Provenance**: `published`, `derived`, `parsed_from_prose`, `unknown`. A `derived` point names `derivedFrom`; a `parsed_from_prose` point retains the `sourceText` it was read out of. `unknown` is a real answer and is never rounded to a number.\r\n\r\n**The refusal rule.** A comparison returns every compatible pair or it refuses. Two points compare only under the same unit AND the same condition; mismatched units, mismatched conditions, or a zero baseline refuse, always with a reason. The refusal surfaces under two names, one per layer: the price-set primitive returns `status: \"refused\"`, and a tool response carries that through as a comparison leg with `status: \"not_comparable\"` and the same reason. Nothing is coerced to make a comparison possible, because a comparison across conditions is not a weaker answer, it is a wrong one.\r\n\r\n**Speed carries its own conditions.** `dashboard_speed` observations are `measured`, `published`, `unknown`. A rate names `token_basis` (`visible_output`, `billed_total`, `unknown`) because a reasoning model emits tokens that never reach content, so a visible-output rate and a billed rate differ by multiples. Every observation carries a `vantagePoint`: latency is a property of a provider *and* where it was measured from, so a figure without one flatters whoever is nearest the benchmark host. A claim this package cannot source is published as `unknown`, not as a number.\r\n\r\n**Measured generation cost is a separate evidence stream.** A provider-reported `costUsd` carries `MEASURED` provenance, its own `observedAt`, `checkedAt`, and `expiresAt`; `UNKNOWN`, `LAG`, and `EXPIRED` remain explicit states. Every ledger observation also carries `measurementSource` (`fixture`, `live_provider_read`, or `unknown`), and every decidable council selection renders the corresponding `measured_cost_source`. A fixture-backed decision therefore cannot look like a live billing observation. Every real call may append a newer observation, while catalogue prices remain a different field and never backfill measured cost. A provider-reported zero is valid for a local zero-cost model; a zero balance delta is billing lag.\r\n\r\n**Deprecations.** `dashboard_contract` returns `schema_version`, the installed `package_version`, and every field or tool announced for removal. A notice names `replaced_by`, or gives a plain `reason` when the capability is gone with no replacement. From 1.0.0 onward a removal is announced before the release that performs it; the 1.0.0 notices are retrospective because no earlier published release carried this mechanism.\r\n\r\n<!-- contract:end -->\r\n\r\n## Speed claims and measurement\r\n\r\n`dashboard_speed` keeps publisher claims and measurements in separate observations. The fixed probe protocol is a streaming prompt with `maxTokens: 700`, four runs, the first discarded, and median/min/max over the remaining three. A measured observation records provider, model, timestamp (or explicit `unknown`), vantage point, prompt hash, token count, TTFT and sustained tokens per second. A published claim has provider attribution and source URL but no fabricated measurement. The current metadata includes Cerebras's published approximately 3,000 tokens/second claim alongside the retained 2026-08-28 measured 867/1,022/1,108 tokens/second record, and Groq's published 8,000-token/minute ceiling; the units and states remain distinct. Missing observations are `unknown`.\r\n\r\n## Contract versioning and deprecations\r\n\r\n`dashboard_contract` is the explicit MCP contract endpoint. It returns `schema_version`, the installed `package_version`, and `deprecations[]`. Each notice names the field or tool being retired, the release that removes it, its replacement (or a plain reason when there is none), and the date the notice first appeared. A known future removal with no reliable release date uses `removed_in: \"unknown\"`; it is never guessed.\r\n\r\nVersion 1.0 introduces this notice mechanism. Therefore it could not preannounce the 0.9-to-1.0 removals: the 1.0 release notes state that exception once, and those notices are necessarily retrospective. Future removals will be announced in an earlier release; a field is not repurposed under an old name.\r\n","readmeFilename":"README.md"}