Anthropic published Building Agents That Reach Production Systems with MCP this week. It is a solid description of what a production MCP server should look like -- remote transport, intent-grouped tools, rich semantics, standardised auth.
Forge does all of it. Not because we followed the article -- the article didn't exist when these decisions were made. But because the problem was clear before anyone published the spec.
Here is how each recommendation maps to what is already in Forge.
1. Build remote servers, not local/stdio
Anthropic's recommendation: deploy servers that run remotely. Local stdio-only servers cannot reach web, mobile, or cloud-hosted agents. Distribution requires HTTP.
Forge ships with HTTP+SSE transport. The MCP server runs as a standard HTTP server -- no subprocess spawning, no local-only constraints. An agent running anywhere can connect to a Forge instance over the network using a bearer token.
2. Group tools around intent, not raw endpoints
Anthropic's recommendation: design fewer tools focused on what users want to accomplish, not mirrored one-to-one from your API surface. A create_issue_from_thread tool outperforms asking an agent to sequence get_thread + parse_messages + create_issue + link_attachment.
Forge generates tools grouped around content lifecycle intent. For a Story type you get create_story, update_story, publish_story, archive_story, list_storys, get_story. These map to what a content operator wants to do -- not to what the underlying database tables look like.
The agent does not need to know about routes, database rows, or state transitions. It calls publish_story and the framework handles everything that implies: lifecycle validation, 404 enforcement for non-published content, sitemap update.
3. Ship rich tool semantics
Anthropic's recommendation: use MCP's richer features to give agents better context about what tools do and what fields mean.
Forge adds semantics at the struct level via two struct tags:
type Story struct {
forge.Node
Title string `forge:"required,min=3" forge_description:"The headline of the story"`
Excerpt string `forge:"required" forge_description:"1-2 sentences used in listing and as meta description"`
Body string `forge:"required" forge_format:"markdown"`
}
forge_description tells the agent what a field is for. forge_format tells the agent what format the content should be in. These are not prompting instructions -- they are baked into the MCP schema that gets generated from the struct. Every tool the agent calls carries this context automatically.
An agent writing a story body knows it is markdown. An agent writing an excerpt knows it is used as a meta description. No extra system prompt needed.
4. Standardised authentication
Anthropic's recommendation: implement standardised auth -- specifically CIMD (Client ID Metadata Documents) for OAuth flows -- to avoid unexpected re-authentication and enable fast first-time setup.
Forge uses BearerHMAC tokens stored in a TokenStore. Every MCP call is authenticated with a signed bearer token. Token management itself is available via MCP tools (create_token, revoke_token, list_tokens) -- an agent with the right role can provision access for other agents.
One honest note: CIMD OAuth is not yet implemented. Forge's current auth is token-based, not OAuth-flow-based. CIMD is on the roadmap. For most self-hosted deployments the current model is straightforward -- you issue a token, you're done -- but for setups that need delegated OAuth flows, this is a gap we are aware of.
What this means
Forge was not built to satisfy a checklist. It was built because the requirements for running content with AI agents were obvious before the specs existed: you need remote transport, lifecycle enforcement, typed tools, and semantics the agent can rely on.
The Anthropic article is a useful confirmation that these were the right calls. It also gives us a clear reference point for anyone evaluating MCP server implementations -- Forge holds up against the protocol authors' own recommendations.
The one gap (CIMD OAuth) is real and will be addressed. Everything else is already there.