Skip to content

Add Model Context Protocol detectable by HTTP headers - #537

Open
cristianovisk wants to merge 1 commit into
enthec:mainfrom
cristianovisk:feat/model-context-protocol
Open

cristianovisk wants to merge 1 commit into
enthec:mainfrom
cristianovisk:feat/model-context-protocol

Conversation

@cristianovisk

Copy link
Copy Markdown
Contributor

Summary

Adds Model Context Protocol (cat 112 Artificial Intelligence, oss): https://modelcontextprotocol.io

MCP is an open protocol that connects AI applications to external tools and data sources. A remote MCP server exposes an HTTP endpoint, usually /mcp. A plain GET on that endpoint, without an MCP client, already returns signals defined by the MCP specification.

Patterns and sources

Field Pattern Source
headers.WWW-Authenticate resource_metadata="…/.well-known/oauth-protected-resource/mcp/?" MCP spec, Authorization: an MCP server returns 401 with WWW-Authenticate pointing at its RFC 9728 Protected Resource Metadata. The /mcp path suffix is the MCP resource.
headers.Access-Control-Allow-Headers / Access-Control-Expose-Headers \bmcp-(?:session-id|protocol-version)\b Mcp-Session-Id and MCP-Protocol-Version are header names defined by the MCP spec, Transports
headers.Mcp-Session-Id presence MCP spec, Transports (streamable HTTP session header)
text ^This URL can only be accessed with a MCP client\.$ The full response body of ReadMe-hosted MCP servers (docs.readme.com/mcp, docs.hudsonrock.com/mcp)

The two pattern warnings from pr_validator (no domain or brand name) are expected. A protocol has no vendor domain, so every pattern is anchored to an identifier from the MCP spec or to the exact full-body message instead:

  • The resource_metadata pattern requires the /mcp resource suffix. The root form (/.well-known/oauth-protected-resource alone) is generic RFC 9728 and was deliberately left out.
  • The text pattern is anchored to the whole body.

Sites using it (GET on the MCP endpoint)

URL Matched by
https://mcp.notion.com/mcp WWW-Authenticate
https://mcp.linear.app/mcp WWW-Authenticate
https://mcp.sentry.dev/mcp WWW-Authenticate
https://api.githubcopilot.com/mcp/ WWW-Authenticate
https://mcp.paypal.com/mcp WWW-Authenticate
https://mcp.supabase.com/mcp WWW-Authenticate
https://mcp.intercom.com/mcp WWW-Authenticate
https://mcp.webflow.com/mcp WWW-Authenticate
https://mcp.squareup.com/mcp WWW-Authenticate
https://mcp.monday.com/mcp WWW-Authenticate
https://mcp.canva.com/mcp WWW-Authenticate
https://mcp.neon.tech/mcp WWW-Authenticate
https://mcp.prisma.io/mcp WWW-Authenticate
https://mcp.wix.com/mcp WWW-Authenticate
https://mcp-tprm.safe-e.com/mcp WWW-Authenticate
https://docs.mcp.cloudflare.com/mcp Access-Control-Allow/Expose-Headers
https://mcp.context7.com/mcp Access-Control-Allow/Expose-Headers
https://mcp.apify.com/ Access-Control-Expose-Headers
https://docs.readme.com/mcp text
https://docs.hudsonrock.com/mcp text

Out of 32 public MCP endpoints probed, 20 match. The rest only expose generic signals, such as root-form resource_metadata or a bare JSON-RPC 405, which were left out on purpose.

False-positive check: OAuth-protected APIs that are not MCP match nothing: api.github.com, graph.microsoft.com, api.stripe.com, www.googleapis.com, api.linear.app, api.notion.com, slack.com/api, api.atlassian.com.

Other

  • Icon: the official MCP favicon SVG from modelcontextprotocol.io (1.3 KB, no scripts).
  • Checks: python3 scripts/check.py passes (0 errors, 2 warnings explained above).

🤖 Generated with Claude Code

https://claude.ai/code/session_01RxeXL9qpfwePxHkfXFEssF

Signals defined by the MCP specification and seen on public remote MCP
servers (GET on the endpoint, no client):

- WWW-Authenticate resource_metadata pointing at
  /.well-known/oauth-protected-resource/mcp (MCP authorization spec,
  RFC 9728 path-suffixed form for the /mcp resource)
- Mcp-Session-Id, MCP-Protocol-Version in CORS allow/expose headers
- Mcp-Session-Id response header (streamable HTTP transport)
- ReadMe-hosted MCP servers' plain-text reply to non-MCP clients

The root-form resource_metadata (no /mcp suffix) is left out because it
is generic RFC 9728 and not specific to MCP.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxeXL9qpfwePxHkfXFEssF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant