The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Framework MCP listing page.
A dependency currency-check layer for coding agents: a remote MCP server that gives coding agents (Claude Code, Cursor, etc.) verified, version-pinned answers about fast-moving frameworks - Expo, Next.js, Supabase, Prisma, and growing.
Why: LLM training data goes stale faster than framework release cycles. Agents keep re-guessing the same version-specific questions instead of checking a verified, version-pinned source. This server is that source - not a single-framework tool, but a general layer any coding agent can query before trusting what it "remembers" about a dependency's current behavior.
Node 24 + TypeScript, @modelcontextprotocol/sdk over Streamable HTTP
transport (stateful, session-per-connection), Express, Postgres (pg),
API-key auth via the SDK's own requireBearerAuth middleware.
Hosting: Railway (compute, ~$5/mo Hobby plan) + Neon (Postgres, free tier, branchable).
dev branch.cp .env.example .env and fill in DATABASE_URL (from Neon) and
API_KEY_PEPPER (any long random string - generate one with
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))").curl http://localhost:3000/health should return ok.Connect to http://localhost:3000/mcp with transport "Streamable HTTP" and
set an Authorization: Bearer <your-api-key> header in the connection
settings. Confirm all 3 tools (ping, query_framework_doc,
report_outcome) list and are callable.
curl -fsSL agents.railway.com | sh then railway login.railway init (or railway link if a project already
exists).railway variable set KEY=value):
DATABASE_URL (your Neon production branch connection string,
separate from your dev branch), API_KEY_PEPPER, NODE_ENV=production.railway up.PUBLIC_HOSTNAME to that domain (needed for the SDK's DNS-rebinding host
check to allow real traffic).npm run db:migrate && npm run db:seed once against the production
DATABASE_URL (from your machine, pointed at the prod connection string).npm run create-api-key, pointed at the
prod DATABASE_URL.Self-service: visit https://framework-mcp-production.up.railway.app/, enter an email, get a key instantly (one active key per email, rate-limited).
Maintainer/local fallback: npm run create-api-key -- "label".
In a Claude Code .mcp.json:
ping(message) - health checklist_frameworks() - lists every framework/version covered, with entry counts - call this first if you don't know the exact slug/version to pass belowquery_framework_doc(framework, version, question) - look up a verified answer, returns query_idreport_outcome(query_id, worked, note?) - log whether the returned answer actually worked| Framework | Version | Entries | Source |
|---|---|---|---|
| Expo SDK | 54.0.0 | 20 | expo.dev/changelog/sdk-54 |
| Next.js | 16.3.2 | 20 | nextjs.org/blog, nextjs.org/docs upgrade guide |
| Supabase (supabase-js) | 2.112.3 | 20 | supabase.com/changelog, GitHub releases |
| Prisma ORM | 7.9.1 | 20 | prisma.io/docs upgrade guide, prisma.io/changelog |
| Vercel AI SDK | 7.0.77 | 20 | ai-sdk.dev migration guides, vercel.com/blog |
| Nuxt | 4.5.2 | 20 | nuxt.com/docs upgrade guide, nuxt.com/blog |
All entries verified 2026-08-22 against the official sources cited in each
seed file under db/seed/. To add a framework: create a new
db/seed/<slug>.json following the existing files' shape, then npm run db:seed (it picks up every *.json in that folder automatically).
Self-service signup live at / (email -> instant API key, one per email,
IP rate-limited). Published to the official MCP Registry
(registry.modelcontextprotocol.io) and submitted to mcpservers.org and Glama
(both pending review). Not on Smithery (their OAuth-discovery scanner doesn't
support simple static bearer-key auth) or mcp.so (no free listing tier).
Deferred (Stage B, not built yet): Stripe billing, plan_tier /
credit_balance / rate-limit-enforcement-per-key on api_keys,
scoring/ranking on feedback.