MCP server authoring standards
An MCP (Model Context Protocol) server connects Claude to your tools, data, or systems. The server exposes resources Claude can read and tools Claude can invoke inside conversations. Configs ship standalone at mcp/<name>.json or plugin-bundled at plugins/<plugin>/.mcp.json.
This page is two layers: Anthropic’s official guidance, then the RBA tailoring on top.
Anthropic’s best practices
Section titled “Anthropic’s best practices”Source: Claude Code — MCP and the Model Context Protocol spec.
Transports
Section titled “Transports”MCP servers connect over one of three transports:
- stdio — a local process Claude Code launches (
command+args). Best for local tools and the default for bundled servers. - SSE — a remote server over server-sent events (
url). - HTTP — a remote streamable-HTTP server (
url).
Scopes
Section titled “Scopes”Anthropic defines three configuration scopes; pick deliberately:
- local — just you, just this project (not committed).
- project — committed
.mcp.json, shared with everyone on the repo. - user — you, across all your projects.
The catalog ships project-scope-shaped configs (a committed .mcp.json / mcp/<name>.json).
.mcp.json shape
Section titled “.mcp.json shape”{ "mcpServers": { "<server-name>": { "command": "<executable>", "args": ["..."], "env": { "VAR": "value" } } }}A remote server uses "type": "sse" | "http" and "url" instead of command/args.
Resources vs. tools vs. prompts
Section titled “Resources vs. tools vs. prompts”MCP servers can expose three primitives. Anthropic’s guidance:
- Resources — addressable, read-only data Claude can pull in (
@server:protocol://resource). Idempotent reads. - Tools — model-invoked actions, possibly with side effects.
- Prompts — reusable prompt templates surfaced as slash commands.
Security
Section titled “Security”Anthropic explicitly warns: use third-party MCP servers at your own risk and confirm you trust them. Servers that fetch external content can carry prompt-injection risk. Use OAuth where the server supports it, and supply credentials via environment variables rather than embedding them.
How RBA tailors this
Section titled “How RBA tailors this”Pick the right primitive (RBA decision rule)
Section titled “Pick the right primitive (RBA decision rule)”| Use a resource when… | Use a tool when… |
|---|---|
| Claude needs to read state | Claude needs to do something |
| The data is addressable by ID/URL | The action takes parameters |
| Re-fetching is cheap and idempotent | The action has side effects |
| e.g. a project record, a schema, a doc | e.g. trigger a deploy, run a query |
A well-designed server exposes both — resources first (what does this system contain?), tools second (what can Claude do to it?).
Standalone shape (RBA wrapper)
Section titled “Standalone shape (RBA wrapper)”The bundled .mcp.json is exactly Anthropic’s shape. The standalone shape wraps one server in catalog metadata:
{ "name": "<server-name>", "description": "<one sentence>", "primitive": false, "platforms": [], "disciplines": [], "lifecycle": [], "tags": [], "outcomes": [], "server": { "command": "<executable>", "args": ["..."], "env": { "VAR": "value" } }}Required: name, description, server. Optional: primitive: true for cross-cutting foundation servers, plus any facets (platforms, disciplines, lifecycle, tags, outcomes) that describe it. Plugin-bundled servers add an RBA-convention description field per server (the catalog page reads it) and inherit primitive from rba-meta.json. See plugin standards for the facet model.
Naming (RBA)
Section titled “Naming (RBA)”- Server name:
kebab-case,<system>-<purpose>—sitecore-graphql,linear-tickets. - Resource URIs: stable, hierarchical —
<scheme>://<system>/<type>/<id>. - Tool names:
verb_objectsnake_case —create_issue,trigger_deploy.
Security baseline (RBA tightens Anthropic’s warning into rules)
Section titled “Security baseline (RBA tightens Anthropic’s warning into rules)”- Default-deny: the server starts read-only against a single scoped namespace.
- Explicit scope grants: the user opts into specific projects/repos in their config.
- No production writes by default: any mutating tool against production requires an explicit confirmation env var.
- Secrets via env vars or keychain only — never embedded in the committed config (Anthropic’s guidance, made a hard rule).
- Audit trail: log every tool invocation (timestamp, tool, args) to a local file the user can inspect.
Documentation requirement (RBA)
Section titled “Documentation requirement (RBA)”The README / catalog page must cover: what the server does, resources exposed (URI patterns), tools exposed (params + side effects), required configuration, security notes (what it needs, what it can’t do), and failure modes (auth/network/rate-limit).
Quality checklist
Section titled “Quality checklist”- Transport and scope are chosen deliberately (Anthropic).
- Resources outnumber tools — read access broad, write access narrow (Anthropic + RBA).
- Config has
name,description,server; optionalprimitive: trueand facets describe it (standalone) (RBA). - Server name is
<system>-<purpose>kebab-case (RBA). - Every tool documents its side effects.
- Default config is read-only against one scoped namespace (RBA security baseline).
- No credentials in the committed config (Anthropic + RBA).
- The server passes a smoke test against a non-production endpoint.
Anti-patterns
Section titled “Anti-patterns”- Tools that take a free-form
queryparameter with no schema constraints - Default config that grants production write access
- Credentials embedded in
.mcp.jsonormcp/<name>.json(Anthropic security warning) - Server name matching the company name with no purpose suffix
- One mega-tool that does many things — split into focused tools
- Trusting external-content responses without treating them as untrusted input