{
  "markdown": "# x402-repohealth-mcp\n\nA free MCP (Model Context Protocol) server that computes a **GitHub repo\nmaintenance/abandonment health score** from live GitHub data: is a repo\nactively maintained, slowing down, likely abandoned, or archived? No API\nkey, no payment, no rate-limit games — just an MCP tool any MCP client can\ncall.\n\nThis is the **open funnel twin** of a paid, x402-gated HTTP API:\n\n**[x402-repohealth-poc.theliminalguy.workers.dev](https://x402-repohealth-poc.theliminalguy.workers.dev)**\n— `GET /repo-health/:owner/:repo`, $0.01 USDC on Base per call via the\n[x402 payment protocol](https://x402.org), for production/high-volume or\nnon-MCP (plain HTTP) / agent-automated use. Same scoring logic, same\noutput, just billed per call instead of free-via-MCP.\n\n## Why this exists\n\nAgents that pick dependencies, tools, or libraries need to know whether a\nrepo is safe to depend on — actively maintained vs. slowing down vs.\neffectively dead — and GitHub's own API only gives raw signals (commits,\nissues, releases), not the *decision* computed from them. This MCP server\nis the free/local half of filling that gap — try it for nothing via MCP;\nreach for the paid HTTP endpoint when you need it at volume or outside an\nMCP client.\n\n## What it does\n\nOne tool, `check_repo_health`, takes a GitHub `owner` + `repo` and computes\na **0-100 health score** across four weighted dimensions (commit recency,\ncommit activity, issue/PR responsiveness, release cadence, each 0-25\npoints), plus a verdict:\n\n- `archived` — GitHub's own `archived` flag is true (overrides the score)\n- `actively maintained` — score >= 75\n- `slowing down` — score 45-74\n- `likely abandoned` — score < 45\n\nThe response includes the full score breakdown, computed metrics (days\nsince last commit, commits in last 90 days, issue close ratio, etc.), and a\nhuman-readable `reasoning` array built from the actual numbers — nothing is\nhardcoded per-repo, it's fetched from GitHub's real public REST API and\nscored at call time.\n\n## Install & run\n\n```bash\nnpx x402-repohealth-mcp\n```\n\nOr add it to an MCP client config (e.g. Claude Desktop's\n`claude_desktop_config.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"repohealth\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"x402-repohealth-mcp\"]\n    }\n  }\n}\n```\n\n## Tool: `check_repo_health`\n\nInput:\n\n```jsonc\n{\n  \"owner\": \"facebook\",\n  \"repo\": \"react\"\n}\n```\n\nOutput (MCP tool text content, JSON-stringified):\n\n```jsonc\n{\n  \"owner\": \"facebook\",\n  \"repo\": \"react\",\n  \"fetchedAt\": \"2026-08-01T22:00:00.000Z\",\n  \"repoMeta\": { \"fullName\": \"facebook/react\", \"archived\": false, \"stargazersCount\": 230000, \"...\": \"...\" },\n  \"metrics\": { \"daysSinceLastCommit\": 1, \"commitsLast90Days\": 100, \"...\": \"...\" },\n  \"scoreBreakdown\": { \"commitRecency\": 25, \"commitActivity\": 25, \"issueResponsiveness\": 17, \"releaseCadence\": 17 },\n  \"score\": 84,\n  \"verdict\": \"actively maintained\",\n  \"reasoning\": [\n    \"Last commit 1 day ago (2026-07-31T...).\",\n    \"100+ commits in the last 90 days.\",\n    \"...\"\n  ]\n}\n```\n\n## Scoring detail\n\n| Dimension | Points | Logic |\n|---|---|---|\n| Commit recency | 0-25 | Days since last commit: <=14d->25, <=30d->21, <=90d->15, <=180d->9, <=365d->4, else 0 |\n| Commit activity | 0-25 | Commits in trailing 90 days: 0->0, 1-2->6, 3-9->13, 10-29->20, 30+->25 |\n| Issue/PR responsiveness | 0-25 | Of issues/PRs updated in the last 90 days: closed-ratio >=0.6 & median close <=14d->25, >=0.4->17, >=0.15->9, else->3. No recent activity -> neutral 14 |\n| Release cadence | 0-25 | Days since latest tagged release: <=180d->25, <=365d->17, <=730d->9, else 3. No releases ever -> neutral 12 |\n\n`archived: true` from GitHub overrides the score-derived verdict entirely —\nan archived repo is confirmed dead by the maintainer's own action, not\nmerely \"likely abandoned.\"\n\n## What's real vs. limited\n\n- **Real:** every GitHub API call, the scoring math, and the MCP tool\n  response are computed live at call time from that repo's actual GitHub\n  data — nothing is hardcoded or mocked.\n- **No auth against GitHub:** uses GitHub's unauthenticated public REST API\n  (60 requests/hour/IP shared across whoever runs this MCP server locally).\n  A `check_repo_health` call costs ~3-4 GitHub requests. Fine for\n  free/local/low-volume MCP use; the paid Worker adds a `GITHUB_TOKEN`\n  (5,000 req/hr) server-side.\n- **No caching:** every call re-fetches GitHub live.\n\n## Local development\n\n```bash\nnpm install\nnpm run dev              # runs src/index.ts directly on stdio via tsx\nnpm run build             # compiles to dist/ for the published npm package\nnpm run test:health       # calls getRepoHealth() directly against real repos, no MCP transport\n```\n\n`src/github.ts`, `src/score.ts`, `src/health.ts`, and `src/types.ts` are\nthe same GitHub-fetch + scoring logic as the paid Worker — this MCP server\nis a thin `src/index.ts` wrapper around `getRepoHealth()`.\n\n## When to use the paid HTTP twin instead\n\nUse [`GET /repo-health/:owner/:repo`](https://x402-repohealth-poc.theliminalguy.workers.dev)\non the paid Worker instead of this MCP server when:\n\n- You're calling from outside an MCP client (plain HTTP, any language).\n- You need production/high-volume use and want to pay per call rather than\n  share this MCP server's unauthenticated 60 req/hr GitHub budget.\n- Your agent already speaks x402 (e.g. via `x402-fetch` / `x402-axios`) and\n  can pay $0.01 USDC on Base per request.\n\nBoth routes call the exact same scoring function — output is identical.\n\n## License\n\nMIT\n",
  "bytes": 5470,
  "sha": "0c97be57938ce05a17eae9233ae38c7f93a8c5bcd86abf660c4e7cc1d79cb174",
  "repo_slug": "liminalpepe/x402-repohealth-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_liminalpepe_x402_repohealth_mc_e7d728a7/readme"
}