Skip to content

Commit a6176e6

Browse files
authored
Registry accuracy: curated records, duplicate specs, dead endpoints (#70)
* Fix registry accuracy: curated records, duplicate specs, alias pollution * Return per-kind connect targets from search * Give curated surfaces real spec URLs and canonical domains * Alias Gmail's API host to gmail.com * Probe MCP endpoints and drop the ones that do not exist
1 parent 5219a70 commit a6176e6

18 files changed

Lines changed: 6816 additions & 47 deletions

‎.gitignore‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ scripts/batch/scrape-cache/
1212
scripts/batch/kv-bulk.json
1313

1414
# Derived by `bun run normalize` (runs as part of every build) — not source.
15-
# output/tools/ and output/favicons.json stay tracked: they're slow network
16-
# caches (extract-tools / validate-favicons) that normalize only reads.
15+
# output/tools/, output/favicons.json and output/mcp-endpoints.json stay
16+
# tracked: they're slow network caches (extract-tools / validate-favicons /
17+
# verify-mcp-endpoints) that normalize only reads.
1718
output/cli.json
1819
output/graphql.json
1920
output/index.json

‎curated/github.json‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"slug": "github",
33
"name": "GitHub",
44
"tagline": "Repos, issues, PRs, and Actions in every format agents speak.",
5-
"description": "GitHub exposes more agent-callable surface area than almost any service: an official remote MCP server, a fully-specified REST API, a GraphQL API, and the `gh` CLI. Pick the format that fits your agent — they all reach the same data.",
5+
"description": "GitHub exposes more agent-callable surface area than almost any service: an official remote MCP server, a fully-specified REST API, a GraphQL API, and the `gh` CLI. Pick the format that fits your agent \u2014 they all reach the same data.",
66
"domain": "github.com",
77
"icon": "https://www.google.com/s2/favicons?domain=github.com&sz=64",
88
"categories": [
@@ -22,14 +22,14 @@
2222
"note": "Fine-grained PATs let you scope access per-repo and per-permission."
2323
}
2424
],
25-
"guide": "**Remote MCP (easiest):** point your client at `https://api.githubcopilot.com/mcp/`. Clients with OAuth support (VS Code 1.101+, Claude Code, Cursor) handle the consent flow automatically. For clients without OAuth, pass a PAT instead: `Authorization: Bearer <your-pat>`.\n\n**Personal access token:** create one under [Settings → Developer settings → Personal access tokens](https://github.com/settings/tokens). Prefer fine-grained tokens scoped to the repos and permissions your agent actually needs. Use it with REST and GraphQL:\n\n```bash\n# REST\ncurl https://api.github.com/user -H \"Authorization: Bearer $GITHUB_TOKEN\"\n\n# GraphQL\ncurl https://api.github.com/graphql \\\n -H \"Authorization: Bearer $GITHUB_TOKEN\" \\\n -d '{\"query\": \"{ viewer { login } }\"}'\n```\n\n**CLI:** `gh auth login` stores credentials in your keychain; agents running in your shell inherit them. This is often the lowest-friction path for coding agents.",
25+
"guide": "**Remote MCP (easiest):** point your client at `https://api.githubcopilot.com/mcp/`. Clients with OAuth support (VS Code 1.101+, Claude Code, Cursor) handle the consent flow automatically. For clients without OAuth, pass a PAT instead: `Authorization: Bearer <your-pat>`.\n\n**Personal access token:** create one under [Settings \u2192 Developer settings \u2192 Personal access tokens](https://github.com/settings/tokens). Prefer fine-grained tokens scoped to the repos and permissions your agent actually needs. Use it with REST and GraphQL:\n\n```bash\n# REST\ncurl https://api.github.com/user -H \"Authorization: Bearer $GITHUB_TOKEN\"\n\n# GraphQL\ncurl https://api.github.com/graphql \\\n -H \"Authorization: Bearer $GITHUB_TOKEN\" \\\n -d '{\"query\": \"{ viewer { login } }\"}'\n```\n\n**CLI:** `gh auth login` stores credentials in your keychain; agents running in your shell inherit them. This is often the lowest-friction path for coding agents.",
2626
"sources": [
2727
{
28-
"title": "github/github-mcp-server — remote server & PAT setup",
28+
"title": "github/github-mcp-server \u2014 remote server & PAT setup",
2929
"url": "https://github.com/github/github-mcp-server"
3030
},
3131
{
32-
"title": "GitHub REST API — authenticating",
32+
"title": "GitHub REST API \u2014 authenticating",
3333
"url": "https://docs.github.com/en/rest/authentication/authenticating-to-the-rest-api"
3434
}
3535
],
@@ -51,6 +51,7 @@
5151
"format": "openapi",
5252
"name": "GitHub REST API",
5353
"endpoint": "https://api.github.com",
54+
"spec": "https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json",
5455
"specUrl": "https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json",
5556
"auth": "token",
5657
"authHeader": "Authorization: Bearer {pat}",

‎curated/notion.json‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
"slug": "notion",
33
"name": "Notion",
44
"tagline": "Pages, databases, and comments as agent-editable workspace memory.",
5-
"description": "Notion's hosted MCP server lets agents search, create, and reorganize workspace content. The REST API underneath uses internal integrations with explicit page-level sharing — a natural permission boundary for agents.",
6-
"domain": "notion.so",
5+
"description": "Notion's hosted MCP server lets agents search, create, and reorganize workspace content. The REST API underneath uses internal integrations with explicit page-level sharing \u2014 a natural permission boundary for agents.",
6+
"domain": "notion.com",
77
"icon": "https://www.notion.so/images/notion-logo-block-main.svg",
88
"categories": [
99
"productivity",
@@ -22,10 +22,10 @@
2222
"note": "For personal/workspace automations; pages must be explicitly shared with the integration."
2323
}
2424
],
25-
"guide": "**MCP with OAuth (easiest):** add `https://mcp.notion.com/mcp` in an OAuth-capable client and approve access.\n\n```bash\nclaude mcp add --transport http notion https://mcp.notion.com/mcp\n```\n\n**Internal integration (REST):** create one at [notion.so/profile/integrations](https://www.notion.so/profile/integrations) and copy the secret (`ntn_…`). Crucially, **integrations see nothing by default** — open each page or database the agent should access and share it via *⋯ → Connections → your integration*:\n\n```bash\ncurl https://api.notion.com/v1/search \\\n -H \"Authorization: Bearer $NOTION_TOKEN\" \\\n -H \"Notion-Version: 2022-06-28\" \\\n -X POST\n```\n\nThe `Notion-Version` header is required on every request. The page-sharing model doubles as your agent's permission scope: share only what it should touch.",
25+
"guide": "**MCP with OAuth (easiest):** add `https://mcp.notion.com/mcp` in an OAuth-capable client and approve access.\n\n```bash\nclaude mcp add --transport http notion https://mcp.notion.com/mcp\n```\n\n**Internal integration (REST):** create one at [notion.so/profile/integrations](https://www.notion.so/profile/integrations) and copy the secret (`ntn_\u2026`). Crucially, **integrations see nothing by default** \u2014 open each page or database the agent should access and share it via *\u22ef \u2192 Connections \u2192 your integration*:\n\n```bash\ncurl https://api.notion.com/v1/search \\\n -H \"Authorization: Bearer $NOTION_TOKEN\" \\\n -H \"Notion-Version: 2022-06-28\" \\\n -X POST\n```\n\nThe `Notion-Version` header is required on every request. The page-sharing model doubles as your agent's permission scope: share only what it should touch.",
2626
"sources": [
2727
{
28-
"title": "Notion Developers — Authorization",
28+
"title": "Notion Developers \u2014 Authorization",
2929
"url": "https://developers.notion.com/docs/authorization"
3030
}
3131
],
@@ -45,6 +45,7 @@
4545
"format": "openapi",
4646
"name": "Notion REST API",
4747
"endpoint": "https://api.notion.com/v1",
48+
"spec": "https://raw.githubusercontent.com/makenotion/notion-mcp-server/main/scripts/notion-openapi.json",
4849
"auth": "api_key",
4950
"authHeader": "Authorization: Bearer {ntn_token}",
5051
"docs": "https://developers.notion.com/reference",

‎curated/posthog.json‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
"note": "Scoped keys created per-use; used by both the MCP server and REST API."
1818
}
1919
],
20-
"guide": "Create a personal API key under [Settings → Personal API keys](https://app.posthog.com/settings/user-api-keys) (`phx_…`). Choose the **MCP Server** preset when creating it — that grants exactly the scopes the MCP tools need.\n\n**MCP (hosted):**\n\n```bash\nclaude mcp add --transport http posthog https://mcp.posthog.com/mcp \\\n --header \"Authorization: Bearer phx_your_key\"\n```\n\n**REST API:** the same key works against the private API:\n\n```bash\ncurl https://us.posthog.com/api/projects/ \\\n -H \"Authorization: Bearer $POSTHOG_API_KEY\"\n```\n\nNote the **region split**: US Cloud uses `us.posthog.com`, EU Cloud uses `eu.posthog.com` — match your instance or you'll get auth errors with a valid key. Project API keys (`phc_…`) are for event *capture* only and won't work here.",
20+
"guide": "Create a personal API key under [Settings \u2192 Personal API keys](https://app.posthog.com/settings/user-api-keys) (`phx_\u2026`). Choose the **MCP Server** preset when creating it \u2014 that grants exactly the scopes the MCP tools need.\n\n**MCP (hosted):**\n\n```bash\nclaude mcp add --transport http posthog https://mcp.posthog.com/mcp \\\n --header \"Authorization: Bearer phx_your_key\"\n```\n\n**REST API:** the same key works against the private API:\n\n```bash\ncurl https://us.posthog.com/api/projects/ \\\n -H \"Authorization: Bearer $POSTHOG_API_KEY\"\n```\n\nNote the **region split**: US Cloud uses `us.posthog.com`, EU Cloud uses `eu.posthog.com` \u2014 match your instance or you'll get auth errors with a valid key. Project API keys (`phc_\u2026`) are for event *capture* only and won't work here.",
2121
"sources": [
2222
{
23-
"title": "PostHog Docs — MCP server",
23+
"title": "PostHog Docs \u2014 MCP server",
2424
"url": "https://posthog.com/docs/model-context-protocol"
2525
},
2626
{
27-
"title": "PostHog Docs — Personal API keys",
27+
"title": "PostHog Docs \u2014 Personal API keys",
2828
"url": "https://posthog.com/docs/api"
2929
}
3030
],
@@ -45,6 +45,7 @@
4545
"format": "openapi",
4646
"name": "PostHog REST API",
4747
"endpoint": "https://us.posthog.com/api",
48+
"spec": "https://us.posthog.com/api/schema/",
4849
"auth": "api_key",
4950
"authHeader": "Authorization: Bearer {phx_key}",
5051
"docs": "https://posthog.com/docs/api",

‎curated/resend.json‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@
1818
"note": "One key, sent as a bearer header. Scoped keys can restrict to sending-only."
1919
}
2020
],
21-
"guide": "Create an API key at [resend.com/api-keys](https://resend.com/api-keys) (`re_…`). Keys can be **full access** or restricted to **sending access** only — prefer the latter for agents that just send mail.\n\n```bash\ncurl https://api.resend.com/emails \\\n -H \"Authorization: Bearer $RESEND_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"from\": \"you@yourdomain.com\", \"to\": [\"them@example.com\"], \"subject\": \"Hi\", \"text\": \"Hello from an agent.\"}'\n```\n\n**MCP (stdio):** the official server runs locally with the same key:\n\n```bash\nclaude mcp add resend -e RESEND_API_KEY=re_xxxxxxxxx -- npx -y resend-mcp\n```\n\nYou'll need a verified sending domain before production sends — set one up under [Domains](https://resend.com/domains).",
21+
"guide": "Create an API key at [resend.com/api-keys](https://resend.com/api-keys) (`re_\u2026`). Keys can be **full access** or restricted to **sending access** only \u2014 prefer the latter for agents that just send mail.\n\n```bash\ncurl https://api.resend.com/emails \\\n -H \"Authorization: Bearer $RESEND_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"from\": \"you@yourdomain.com\", \"to\": [\"them@example.com\"], \"subject\": \"Hi\", \"text\": \"Hello from an agent.\"}'\n```\n\n**MCP (stdio):** the official server runs locally with the same key:\n\n```bash\nclaude mcp add resend -e RESEND_API_KEY=re_xxxxxxxxx -- npx -y resend-mcp\n```\n\nYou'll need a verified sending domain before production sends \u2014 set one up under [Domains](https://resend.com/domains).",
2222
"sources": [
2323
{
24-
"title": "Resend Docs — API keys & authentication",
24+
"title": "Resend Docs \u2014 API keys & authentication",
2525
"url": "https://resend.com/docs/api-reference/introduction"
2626
},
2727
{
28-
"title": "Resend Docs — MCP server",
28+
"title": "Resend Docs \u2014 MCP server",
2929
"url": "https://resend.com/docs/mcp-server"
3030
}
3131
],
@@ -46,6 +46,7 @@
4646
"format": "openapi",
4747
"name": "Resend REST API",
4848
"endpoint": "https://api.resend.com",
49+
"spec": "https://raw.githubusercontent.com/resend/resend-openapi/main/resend.yaml",
4950
"auth": "api_key",
5051
"authHeader": "Authorization: Bearer {re_key}",
5152
"docs": "https://resend.com/docs/api-reference",

‎curated/sentry.json‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"slug": "sentry",
33
"name": "Sentry",
44
"tagline": "Errors, traces, and root-cause analysis for debugging agents.",
5-
"description": "Sentry's hosted MCP server gives agents direct access to issues, events, releases, and Seer root-cause runs — the context a coding agent needs to fix what's actually broken in production.",
5+
"description": "Sentry's hosted MCP server gives agents direct access to issues, events, releases, and Seer root-cause runs \u2014 the context a coding agent needs to fix what's actually broken in production.",
66
"domain": "sentry.io",
77
"icon": "https://www.google.com/s2/favicons?domain=sentry.dev&sz=64",
88
"categories": [
@@ -22,14 +22,14 @@
2222
"note": "Organization or personal tokens for the REST API and CI."
2323
}
2424
],
25-
"guide": "**MCP with OAuth (easiest):** add `https://mcp.sentry.dev/mcp` in an OAuth-capable client and approve access to your org.\n\n```bash\nclaude mcp add --transport http sentry https://mcp.sentry.dev/mcp\n```\n\n**Auth tokens (REST):** create an organization token under [Settings → Auth Tokens](https://sentry.io/orgredirect/organizations/:orgslug/settings/auth-tokens/) — or a personal token under User settings — and send it as a bearer header:\n\n```bash\ncurl https://sentry.io/api/0/projects/ \\\n -H \"Authorization: Bearer $SENTRY_AUTH_TOKEN\"\n```\n\nOrganization tokens are scoped at creation; give debugging agents read-only event/issue scopes unless they need to resolve or assign.",
25+
"guide": "**MCP with OAuth (easiest):** add `https://mcp.sentry.dev/mcp` in an OAuth-capable client and approve access to your org.\n\n```bash\nclaude mcp add --transport http sentry https://mcp.sentry.dev/mcp\n```\n\n**Auth tokens (REST):** create an organization token under [Settings \u2192 Auth Tokens](https://sentry.io/orgredirect/organizations/:orgslug/settings/auth-tokens/) \u2014 or a personal token under User settings \u2014 and send it as a bearer header:\n\n```bash\ncurl https://sentry.io/api/0/projects/ \\\n -H \"Authorization: Bearer $SENTRY_AUTH_TOKEN\"\n```\n\nOrganization tokens are scoped at creation; give debugging agents read-only event/issue scopes unless they need to resolve or assign.",
2626
"sources": [
2727
{
28-
"title": "Sentry Docs — MCP server",
28+
"title": "Sentry Docs \u2014 MCP server",
2929
"url": "https://docs.sentry.io/product/sentry-mcp/"
3030
},
3131
{
32-
"title": "Sentry Docs — Auth tokens",
32+
"title": "Sentry Docs \u2014 Auth tokens",
3333
"url": "https://docs.sentry.io/account/auth-tokens/"
3434
}
3535
],
@@ -49,6 +49,7 @@
4949
"format": "openapi",
5050
"name": "Sentry Web API",
5151
"endpoint": "https://sentry.io/api/0",
52+
"spec": "https://raw.githubusercontent.com/getsentry/sentry-api-schema/main/openapi-derefed.json",
5253
"auth": "token",
5354
"authHeader": "Authorization: Bearer {auth_token}",
5455
"docs": "https://docs.sentry.io/api/",

0 commit comments

Comments
 (0)