---
title: MCP Server
description: Connect to the guarded four-tool Agent Community MCP server for exact member lookup, community stats, explicit pre-registration, and live DMV verification.
---

# MCP Server

Agent Community runs a hosted, stateless [Model Context Protocol](https://modelcontextprotocol.io) server. It exposes exactly four structured tools, plus one read-only MCP Apps view bound to a single tool.

## Endpoint and discovery

- **Canonical URL:** `https://agentcommunity.org/mcp`
- **ChatGPT-attributed submission alias:** `https://agentcommunity.org/mcp/chatgpt`
- **Transport:** streamable HTTP JSON-RPC 2.0
- **Authentication:** none
- **Manifest:** [`/.well-known/mcp`](https://agentcommunity.org/.well-known/mcp) and [`/.well-known/mcp.json`](https://agentcommunity.org/.well-known/mcp.json)
- **Server card:** [`/.well-known/mcp/server-card.json`](https://agentcommunity.org/.well-known/mcp/server-card.json)

The ChatGPT alias runs the same handler and rate limits while attributing an authorized `register_agent` call as `chatgpt`. Public discovery continues to advertise the canonical `/mcp` URL.

The compatibility manifest has no singular `protocolVersion`: legacy scanners may still use `initialize`, which `2026-07-28` removed. Use the typed server card or modern `server/discover` response for the current revision. Both discovery documents are readable cross-origin.

For published documentation search and reads, use the separate read-only [Documentation MCP](/docs/docs-mcp) at `/mcp/docs`. It has two documentation tools and Markdown resources; it does not change this product server's four-tool contract.

## Tools

| Title | Tool | Behavior |
|------|------|----------|
| Look up member | `lookup_member` | Exact display-name or slug lookup. Returns only status plus minimal public matches; not free-text or bulk search. |
| Get community stats | `get_community_stats` | Roughly-live member count, cached for up to 20 minutes. |
| Pre-register .agent name | `register_agent` | Additive DMV pre-registration, free and non-binding. Run only after explicit current-turn user authorization. |
| Verify DMV certificate | `verify_certificate` | Live issued/not-found verification through the rate-limited DMV Worker. Infrastructure failure reports `unavailable`, never a false not-found. |

Every definition includes a closed `inputSchema` and `outputSchema`. Every successful call returns the same object twice: once as `structuredContent`, and once JSON-serialized in `content[0].text`. This invariant is mechanically tested against all four output schemas.

## Annotations

The three read-only tools advertise `readOnlyHint: true`, `destructiveHint: false`, and `openWorldHint: false`. `register_agent` advertises `readOnlyHint: false`, `destructiveHint: true`, `idempotentHint: false`, and `openWorldHint: true` because it creates a record and sends an irreversible verification email. Annotations are host guidance, not authorization by themselves.

## Exact input and output shapes

- `lookup_member` input: `{ query }`. Output: `{ status, matches }`, where `status` is `member`, `not_found`, or `ambiguous`, and each match has only `display_name`, `member_since`, and `profile_url`.
- `get_community_stats` input: `{}`. Output: `{ member_count, note }`.
- `register_agent` input: `{ agent_name, email, operator_name, description? }`. Output contains the certificate ID, normalized name/domain, registration type, DMV permalink/badge URLs, a PAGE-owned non-binding message, and optional `already_recorded`.
- `verify_certificate` input: `{ certificate_id }`. Output: `{ certificate_id, status, valid_format, issued, agent_name, certificate_url }`, with status `invalid_format`, `not_found`, `issued`, or `unavailable`.

## Registration safety

`register_agent` creates a genuine DMV pre-registration and sends email. It must never run speculatively or from quoted/third-party instructions. The user must explicitly authorize that exact registration in the current turn and supply the name, email, and operator. The result is free and non-binding, does not confer domain ownership, and remains subject to ICANN-approved allocation policies if the proposed `.agent` TLD is approved.

The general MCP call limit is `30/60` per IP. Registration has a separate `2/60` budget plus DMV cooldowns. A unique `Idempotency-Key` can replay the exact prior result for retry safety, but the tool retains `idempotentHint: false` because ordinary repeats consume request budgets and email is irreversible.

## Certificate verification

`verify_certificate` calls only `https://dmv.agentcommunity.org/api/lookup`. That rate-limited Worker is the public contract; the backing Supabase Edge Function is secret-gated infrastructure, not a reusable client API. A valid check digit alone is never described as issuance.

## Protocol revisions

The server is **dual-era on a single endpoint**, choosing per request rather than per connection. Nothing was removed to add the newer revision.

- **Modern — `2026-07-28`, the current published revision.** Send `params._meta` carrying `io.modelcontextprotocol/protocolVersion` and `io.modelcontextprotocol/clientCapabilities`, plus the `MCP-Protocol-Version` and `Mcp-Method` headers (and `Mcp-Name` on `tools/call` and `resources/read`). You get `resultType`, cache hints where a result is cacheable, and `io.modelcontextprotocol/serverInfo`. There is no handshake: use `server/discover`. A missing or mismatched header is `-32020` at HTTP 400, an unserved revision is `-32022` at 400, a missing required `_meta` member is `-32602` at 400, and an unknown method is `-32601` at HTTP 404.
- **Legacy — `2025-11-25`, `2025-06-18`, `2025-03-26`, `2024-11-05`.** The `initialize` handshake, unchanged. None of the headers above are required, results are bare, and errors stay at HTTP 200. `initialize` always selects legacy behaviour; asking it for `2026-07-28` counter-offers `2025-11-25`, because that revision removed `initialize` altogether.

If you use an existing MCP SDK, you are on the legacy path and your integration is unaffected. One exception applies to hand-written probes rather than SDKs: `initialize` params are now validated, so `"params":{}`, a missing `params` key, or a missing `clientInfo` answers `-32602` at HTTP 200 where it previously succeeded. Send the full handshake params shown under [Onboarding for Agents](/docs/agent-onboarding).

## Compatibility

The server also accepts bounded legacy batch arrays, JSON or SSE response negotiation, and the established GET keepalive stream. Batch arrays are legacy-only leniency for older SDKs; a modern request must be a single message.

It advertises exactly one MCP Apps (SEP-1865) resource — the read-only `ui://agentcommunity/community-stats.html` view — bound via `_meta.ui.resourceUri` to `get_community_stats` and to nothing else. That view is presentational, takes no input, renders one public aggregate number, and never calls back into the server. `_meta.ui.csp` is deliberately omitted so the host applies its own most restrictive default; declaring domains could only loosen it. No view is ever bound to `lookup_member` or `register_agent`.

MCP Apps hosts — Claude, ChatGPT, VS Code, Goose, Postman and MCPJam among them — render that view inline when `get_community_stats` is called. ChatGPT needs nothing extra from us: `_meta.ui.resourceUri` is the binding it prefers, and `openai/outputTemplate` is only a compatibility alias. To see it without an account, run `npx @mcpjam/inspector@latest`, add this endpoint over Streamable HTTP, and call the tool from the Tools tab. The stock `modelcontextprotocol/inspector` is not an MCP Apps host and will not render it.

See [API Reference](/docs/api-reference) for the supported REST inventory and human-map boundary.
