Scanner

What a server's metadata says, measured every night

The scanner reads the public authorization metadata an MCP server publishes for every client and judges the 12 requirements of MCP Authorization 2026-07-28 that metadata can answer. Nothing else is sent: no token, no authorization flow, no request to the endpoint itself. Results land in the atlas as observations, by pull request.

Servers listed
39
Scanned
0
Checks per server
12
Newest scan
none yet

How it works

What it reads

  1. The protected resource metadata (RFC 9728) at the path-aware well-known location derived from the server URL, then at the root.
  2. For the first authorization server the metadata names: its metadata at the three well-known locations the MCP specification lists (RFC 8414 and OpenID Connect Discovery, path-inserted and path-appended).

At most five GET requests over HTTPS, no credentials, redirects followed only on the same host. It identifies itself as letsauth-scanner/0.1.0 (+https://letsauth.eu/scanner/).

What a status means

Supported and unsupported are written only when a document was fetched and the deciding field is present or absent.Unknown means the scanner could not tell: the document could not be fetched, no authorization server was named, or nothing was advertised to judge. A fetch failure is never written as a failure of the server.

Every observation starts with the URL that decided it and names the field and value, so a reviewer can open it.

How the grade is derived

  1. F when a MUST-level check is unsupported or partial.
  2. Withheld (no letter) when a MUST-level check is unknown: the scanner could not establish it.
  3. C when every MUST-level check is supported and a SHOULD-level check is unsupported or partial.
  4. B when every MUST-level check is supported, no SHOULD-level check fails, and a SHOULD-level check is unknown.
  5. A when every MUST-level and SHOULD-level check is supported.
  6. MAY-level and deprecated requirements are listed and never change the grade.

The grade is a property of one report at one time, derived from the statuses shown. The atlas never sorts or ranks servers by it.

Latest report per listed server

Alphabetical. A server without a scanner observation reads "not scanned": the nightly run has not yet been able to read its metadata, or has not run since it was listed.

ServerGradeNewest scanUnknownReport
Airtablehttps://mcp.airtable.com/mcpNot scanned––Report · JSON
Asanahttps://mcp.asana.com/sseNot scanned––Report · JSON
Atlassianhttps://mcp.atlassian.com/v1/sseNot scanned––Report · JSON
Attiohttps://mcp.attio.com/mcpNot scanned––Report · JSON
AWS Knowledgehttps://knowledge-mcp.global.api.awsNot scanned––Report · JSON
Boxhttps://mcp.box.comNot scanned––Report · JSON
Buildkitehttps://mcp.buildkite.com/mcpNot scanned––Report · JSON
Canvahttps://mcp.canva.com/mcpNot scanned––Report · JSON
ClickUphttps://mcp.clickup.com/mcpNot scanned––Report · JSON
Cloudflare Workershttps://bindings.mcp.cloudflare.com/sseNot scanned––Report · JSON
Cloudinaryhttps://asset-management.mcp.cloudinary.com/sseNot scanned––Report · JSON
DeepWikihttps://mcp.deepwiki.com/sseNot scanned––Report · JSON
Figmahttps://mcp.figma.com/mcpNot scanned––Report · JSON
GitHubhttps://api.githubcopilot.com/mcpNot scanned––Report · JSON
HubSpothttps://app.hubspot.com/mcp/v1/httpNot scanned––Report · JSON
Hugging Facehttps://hf.co/mcpNot scanned––Report · JSON
Intercomhttps://mcp.intercom.com/sseNot scanned––Report · JSON
Linearhttps://mcp.linear.app/sseNot scanned––Report · JSON
Mirohttps://mcp.miro.com/Not scanned––Report · JSON
monday.comhttps://mcp.monday.com/sseNot scanned––Report · JSON
Neonhttps://mcp.neon.tech/mcpNot scanned––Report · JSON
Netlifyhttps://netlify-mcp.netlify.app/mcpNot scanned––Report · JSON
Notionhttps://mcp.notion.com/sseNot scanned––Report · JSON
PayPalhttps://mcp.paypal.com/sseNot scanned––Report · JSON
Plaidhttps://api.dashboard.plaid.com/mcp/sseNot scanned––Report · JSON
Prisma Postgreshttps://mcp.prisma.io/mcpNot scanned––Report · JSON
Ramphttps://ramp-mcp-remote.ramp.com/mcpNot scanned––Report · JSON
Sentryhttps://mcp.sentry.dev/sseNot scanned––Report · JSON
Slackhttps://mcp.slack.com/mcpNot scanned––Report · JSON
Squarehttps://mcp.squareup.com/sseNot scanned––Report · JSON
Stack Overflowhttps://mcp.stackoverflow.comNot scanned––Report · JSON
Stripehttps://mcp.stripe.com/Not scanned––Report · JSON
Supabasehttps://mcp.supabase.com/mcpNot scanned––Report · JSON
Todoisthttps://ai.todoist.net/mcpNot scanned––Report · JSON
Vercelhttps://mcp.vercel.com/Not scanned––Report · JSON
Webflowhttps://mcp.webflow.com/sseNot scanned––Report · JSON
Wixhttps://mcp.wix.com/sseNot scanned––Report · JSON
Zapierhttps://mcp.zapier.com/api/mcp/mcpNot scanned––Report · JSON
Zoomhttps://mcp.zoom.us/mcp/zoom/streamableNot scanned––Report · JSON

Run it yourself

The same command runs the nightly job and your terminal:

pnpm scan https://mcp.example.com/mcp   # any server, nothing written
pnpm scan notion                        # a listed server by id
pnpm scan notion --write                # append what the nightly rule would

--write appends observations to data/observations/<id>.yamlfollowing the same append rule as the nightly run; open a pull request with the result. See docs/scanner.md.

What it does not check

11 server-side requirements need a request to the endpoint or a reading of the implementation and stay out of a passive scan: for exampleresource_metadata in the 401 challenge, Documented pre-registration path, 403 insufficient_scope for step-up. Their cells come from documentation and manual checks until active probes exist for verified owners.

Opting out

If you run a listed server and do not want it scanned, withdraw it from the atlas; a withdrawn server is never contacted again. The scanner only reads documents a server publishes for every client.