{
  "markdown": "# framework-mcp\n\nA dependency currency-check layer for coding agents: a remote MCP server that\ngives coding agents (Claude Code, Cursor, etc.) verified, version-pinned\nanswers about fast-moving frameworks - Expo, Next.js, Supabase, Prisma, and\ngrowing.\n\nWhy: LLM training data goes stale faster than framework release cycles. Agents\nkeep re-guessing the same version-specific questions instead of checking a\nverified, version-pinned source. This server is that source - not a\nsingle-framework tool, but a general layer any coding agent can query before\ntrusting what it \"remembers\" about a dependency's current behavior.\n\n## Stack\n\nNode 24 + TypeScript, `@modelcontextprotocol/sdk` over **Streamable HTTP**\ntransport (stateful, session-per-connection), Express, Postgres (`pg`),\nAPI-key auth via the SDK's own `requireBearerAuth` middleware.\n\nHosting: [Railway](https://railway.com) (compute, ~$5/mo Hobby plan) +\n[Neon](https://neon.tech) (Postgres, free tier, branchable).\n\n## Local setup\n\n1. Create a free [Neon](https://neon.tech) account and project. Copy the\n   connection string for a `dev` branch.\n2. `cp .env.example .env` and fill in `DATABASE_URL` (from Neon) and\n   `API_KEY_PEPPER` (any long random string - generate one with\n   `node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"`).\n3. Install, migrate, seed, build:\n   ```bash\n   npm install\n   npm run db:migrate\n   npm run db:seed\n   npm run build\n   ```\n4. Create yourself an API key:\n   ```bash\n   npm run create-api-key -- \"my laptop\"\n   ```\n   This prints the raw key **once** - save it, it's not recoverable.\n5. Run locally:\n   ```bash\n   npm run dev\n   ```\n   `curl http://localhost:3000/health` should return `ok`.\n\n## Verify with MCP Inspector\n\n```bash\nnpx @modelcontextprotocol/inspector\n```\nConnect to `http://localhost:3000/mcp` with transport \"Streamable HTTP\" and\nset an `Authorization: Bearer <your-api-key>` header in the connection\nsettings. Confirm all 3 tools (`ping`, `query_framework_doc`,\n`report_outcome`) list and are callable.\n\n## Deploy to Railway\n\n1. `curl -fsSL agents.railway.com | sh` then `railway login`.\n2. From this repo: `railway init` (or `railway link` if a project already\n   exists).\n3. Set env vars (dashboard, or `railway variable set KEY=value`):\n   `DATABASE_URL` (your Neon **production** branch connection string,\n   separate from your dev branch), `API_KEY_PEPPER`, `NODE_ENV=production`.\n4. `railway up`.\n5. In the Railway dashboard: Settings → Networking → Generate Domain. Set\n   `PUBLIC_HOSTNAME` to that domain (needed for the SDK's DNS-rebinding host\n   check to allow real traffic).\n6. Run `npm run db:migrate && npm run db:seed` once against the production\n   `DATABASE_URL` (from your machine, pointed at the prod connection string).\n7. Create a production API key with `npm run create-api-key`, pointed at the\n   prod `DATABASE_URL`.\n\n## Get an API key\n\nSelf-service: visit **https://framework-mcp-production.up.railway.app/**, enter\nan email, get a key instantly (one active key per email, rate-limited).\n\nMaintainer/local fallback: `npm run create-api-key -- \"label\"`.\n\n## Connect a remote client\n\nIn a Claude Code `.mcp.json`:\n```json\n{\n  \"mcpServers\": {\n    \"framework-mcp\": {\n      \"type\": \"http\",\n      \"url\": \"https://<your-railway-domain>/mcp\",\n      \"headers\": { \"Authorization\": \"Bearer <your-api-key>\" }\n    }\n  }\n}\n```\n\n## Tools\n\n- `ping(message)` - health check\n- `list_frameworks()` - lists every framework/version covered, with entry counts - call this first if you don't know the exact slug/version to pass below\n- `query_framework_doc(framework, version, question)` - look up a verified answer, returns `query_id`\n- `report_outcome(query_id, worked, note?)` - log whether the returned answer actually worked\n\n## Coverage\n\n| Framework | Version | Entries | Source |\n|---|---|---|---|\n| Expo SDK | 54.0.0 | 20 | expo.dev/changelog/sdk-54 |\n| Next.js | 16.3.2 | 20 | nextjs.org/blog, nextjs.org/docs upgrade guide |\n| Supabase (supabase-js) | 2.112.3 | 20 | supabase.com/changelog, GitHub releases |\n| Prisma ORM | 7.9.1 | 20 | prisma.io/docs upgrade guide, prisma.io/changelog |\n| Vercel AI SDK | 7.0.77 | 20 | ai-sdk.dev migration guides, vercel.com/blog |\n| Nuxt | 4.5.2 | 20 | nuxt.com/docs upgrade guide, nuxt.com/blog |\n\nAll entries verified 2026-08-22 against the official sources cited in each\nseed file under `db/seed/`. To add a framework: create a new\n`db/seed/<slug>.json` following the existing files' shape, then `npm run\ndb:seed` (it picks up every `*.json` in that folder automatically).\n\n## Status\n\nSelf-service signup live at `/` (email -> instant API key, one per email,\nIP rate-limited). Published to the official MCP Registry\n(registry.modelcontextprotocol.io) and submitted to mcpservers.org and Glama\n(both pending review). Not on Smithery (their OAuth-discovery scanner doesn't\nsupport simple static bearer-key auth) or mcp.so (no free listing tier).\n\nDeferred (Stage B, not built yet): Stripe billing, `plan_tier` /\n`credit_balance` / rate-limit-enforcement-per-key on `api_keys`,\nscoring/ranking on feedback.\n",
  "bytes": 5093,
  "sha": "11e05a5a8987e22397819f0bf9d3da1a76d2eef39d7c24689fd059f390b99f11",
  "repo_slug": "81labsapps-ops/framework-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_81labsapps_ops_framework_mcp_fa5b1136/readme"
}