Choose a connection
Local stdio inherits process and OS boundaries. Remote HTTP needs HTTPS, a trusted issuer, and per-request authorization.
Get the mental model, security boundaries, and operational decisions you need before opening the protocol specification.
MCP standardizes messages between a host-managed client and a server. It does not grant authority, secure tools, or make server-provided content trustworthy.
Local stdio inherits process and OS boundaries. Remote HTTP needs HTTPS, a trusted issuer, and per-request authorization.
Tools, prompts, schemas, and returned content are server-supplied input. Review changes, validate arguments, and keep approvals explicit.
A tools/call names an operation; it does not grant permission. Enforce scope, role, tenant, tool, arguments, and downstream ACLs.
Use this reference after the essentials. MCP 2026-07-28 defines three core server primitives; current requests declare version and client capabilities in params._meta.
The server exposes context and actions; the client discovers them and decides how they enter the host experience.
Schema-described functions that let a model retrieve information or perform an action. “Model-controlled” describes the interaction pattern, not permission: the host should expose calls for approval, and the server must still authorize every action.
tools/call → inventory.lookup({ sku: "MCP-2048" })
Discover: tools/list Use: tools/call
URI-addressed data such as files, records, schemas, or API responses. The application chooses what to read, subscribe to, display, or place into model context; resource templates parameterize URIs rather than forming another primitive.
resources/read → inventory://catalog/MCP-2048
Discover: resources/list Use: resources/read
Server-authored, reusable message templates with optional arguments. “User-controlled” means the user explicitly selects one, often through a slash command or menu; the host should identify the supplying server and preview the resulting messages.
prompts/get → review-stock({ region: "east" })
Discover: prompts/list Use: prompts/get
The client declares supported input capabilities on every request. Current servers request that input through a multi round-trip result rather than initiating a new request.
Sampling let a server ask the client to run an LLM generation without owning model credentials. It is deprecated in 2026-07-28; new servers should integrate directly with a model provider. Compatible clients should still gate legacy sampling and let users review prompts and results.
sampling/createMessage → "Summarize these stock changes"
2025 capability: sampling Current status: deprecated
Roots let a client suggest relevant filesystem locations. They never granted access or replaced operating-system permissions. Roots are deprecated in 2026-07-28; current designs should pass files or directories through tool arguments, resource URIs, or server configuration.
roots/list → file:///workspaces/inventory-app
2025 capability: roots Current status: deprecated
Lets a server request user input while handling a prompt, resource read, or tool call. Current MCP returns input_required; the client collects input and retries. Form mode excludes secrets, while URL mode supports sensitive out-of-band interactions.
resultType: "input_required" → elicitation/create
Capability: elicitation Pattern: MRTR
Official MCP sources: 2026-07-28 overview, server primitives, base protocol and _meta, MRTR, and the deprecation registry.
MCP does not define one universal installation manifest. Configuration shape and location are host-specific; JSON-RPC methods, per-request metadata, discovery, message patterns, and transport behavior are protocol-standard.
Verify provenance, pin the release, allowlist origins and redirect URIs, assign least privilege, and review tool metadata.
Authorize each request, validate arguments, set timeouts and limits, isolate side effects, and request approval for sensitive actions.
Audit decisions without secrets, monitor capability changes, rotate credentials, update deliberately, and keep a tested disable path.
server/discover, select a version, and review capabilities/tools.File names such as mcp.json, settings keys, storage locations, secret references, and approval controls differ across Copilot, VS Code, Claude, and custom hosts.
server/discover, required per-request _meta, JSON-RPC methods, message patterns, and stdio or HTTP transport semantics are interoperable MCP concerns.
Generic example only—the exact schema and file location differ by host.
nametype / transportcommand, args, cwd, envurl/mcp, or legacy SSE/message endpoints when the host supports them.auth, tokenProvider, scopestimeoutenabled / approval policyversion / capabilitiesserver/discover, and clients repeat version/capabilities in params._meta.env entries as references to a secret store or inherited variables, never raw credentials._meta, tool arguments, or persistent application state.MCP standardizes JSON-RPC exchanges between a host-managed client and one server. It is not an agent framework, model API, security sandbox, identity provider, or authorization policy.
How to read the flow: Begin with the required path, then inspect identity choices, internal policy, and optional operations. The 13 details are grouped by phase; they are not one mandatory sequence of network calls.
Authorization is optional in MCP and applies to HTTP transports. When Entra protects a remote server, use delegated identity for a signed-in user or application identity for a confidential service, and validate before MCP dispatch.
A public desktop or browser client uses MSAL Authorization Code + PKCE for a signed-in user.
A confidential host uses an Entra workload identity rather than pretending to be a user.
rolesAuthorization carries a bearer access token on every Streamable HTTP request.scp or roles.WWW-Authenticate challenge.scp) or application permission (roles) is absent._meta, tool arguments, model context, or logs. A tools/call names an operation—it does not grant permission.An attack surface is every place untrusted data, identity, code, or authority crosses a boundary. Expand a risk to compare an unsafe pattern with a safer design and a practical verification check.
Identify where identity, tool metadata, arguments, content, packages, or results enter a more trusted component.
Ask what the caller can access, what the model can influence, and which downstream side effects are possible.
Test the denied path—not only the happy path—and confirm the decision is visible without leaking secrets.
Secure does not mean risk-free. The safer examples reduce exposure through least privilege, explicit validation, isolation, and auditable decisions; they still require threat modeling. Category names follow the official OWASP MCP Top 10:2025 beta snapshot and may change before final publication.