Aiyana Greyhorse 8 min readAn AI model can draft an itinerary, diagnose a software error, or summarize a contract. Yet acting on those conclusions requires access to calendars, repositories, databases, files, and business systems. Until recently, developers connected each model to each system through bespoke integration code. Every connection carried its own schemas, authentication assumptions, error handling, and maintenance burden.
Model Context Protocol, commonly abbreviated MCP, proposes a shared interface between AI applications and the systems around them. The important idea is not that every service must expose an identical API. It is that an AI host can interact with many services through a consistent protocol while each service preserves its underlying implementation.
This is often described as a universal connector for AI. That metaphor is useful but incomplete. MCP does not make tools interchangeable, determine whether their outputs are trustworthy, or grant a model sound judgment. It creates a structured boundary across which capabilities and context can be discovered, requested, and returned. Understanding that boundary reveals both the opportunity and the risk.
The architectural split beneath the protocol
MCP separates an AI experience into three principal roles. A host is the application in which the user works, such as a coding environment or assistant. The host creates one or more clients, which maintain protocol connections. Each client communicates with an MCP server that exposes a particular set of capabilities.
The word server can suggest a remote cloud service, but an MCP server may run locally as a process on the user’s machine. A local server could expose files from an approved directory. A remote server could mediate access to a hosted business platform. The protocol describes communication; it does not mandate deployment topology.
| Component | Primary responsibility | What it should not assume |
|---|---|---|
| Host | Manages the user experience, permissions, and model interaction | That every offered capability is safe to invoke |
| Client | Negotiates and maintains one server connection | That another server shares the same trust boundary |
| Server | Publishes context or operations through MCP | That a request reflects informed user intent |
| Underlying system | Stores data or performs the actual business operation | That protocol-level authentication replaces its own controls |
This separation matters because it contains integrations. A host need not absorb custom code for every database or service. Conversely, a server need not know which model powers the host. The abstraction permits either side to evolve, provided both continue to honor the negotiated protocol.
How a connection becomes usable
An MCP session begins with initialization rather than an immediate tool call. Client and server exchange protocol information and declare capabilities. This allows each side to learn which features the other supports instead of assuming a fixed implementation.
After initialization, the client can discover what the server exposes. Three primitives define much of the practical surface:
- Resources provide addressable context, such as a file, database record, or generated representation of system state.
- Tools represent callable operations with named inputs, descriptions, and structured schemas.
- Prompts provide reusable interaction templates that a user or host can select and parameterize.
These primitives do different jobs. Reading a resource is conceptually distinct from invoking an operation that changes state. A prompt is not a hidden command; it is a packaged way to assemble an interaction. Keeping those distinctions visible helps a host present appropriate controls.
Communication uses structured messages based on JSON-RPC conventions. The transport can differ by implementation and environment. A local integration may communicate through standard input and output, allowing the host to launch and supervise the server process. Networked deployments use an HTTP-based transport. The semantic protocol remains recognizable across both, but their threat models do not: a local child process, an enterprise endpoint, and a public internet service require different authentication and containment decisions.
A tool call, followed step by step
Consider an assistant asked to create an issue for a reproducible software defect. An MCP server connected to an issue tracker advertises a tool named create_issue. Its schema requires a repository identifier, title, and body; it may also accept labels.
- The host obtains the server’s tool list and makes relevant definitions available to the model.
- The model produces a proposed call containing arguments that match the advertised schema.
- The host evaluates policy and may show the proposed action to the user for approval.
- The MCP client sends the tool request to the server.
- The server validates inputs, applies its credentials and authorization rules, then calls the tracker’s native API.
- The server returns structured or textual results. The host supplies those results to the model, which explains the outcome to the user.
The model never needs to know the tracker’s raw endpoint structure. It reasons over the tool description and schema. The server translates the standardized protocol request into the service-specific operation.
Now introduce a failure: the repository identifier is valid, but the server’s credential cannot create issues there. MCP can carry an error back through the stack, but it cannot make that error inherently useful. The server must preserve enough detail for diagnosis without leaking secrets. The host must distinguish an operational failure from a malformed model request. Good integration still depends on deliberate error design.
Why schemas help, and why they are insufficient
A tool schema narrows the space of possible calls. If priority accepts only enumerated values, the model can be guided away from arbitrary text. Required fields prevent structurally incomplete requests. Descriptions can clarify when a tool should be used.
Yet syntactic validity is not semantic validity. A model can submit a perfectly formed request to delete the wrong record. It can interpret “archive the old campaign” differently from the user. It can call a read-only-looking tool whose implementation triggers expensive computation. Schema validation proves that an argument has an expected shape, not that the action is prudent.
Tool descriptions also become part of the model’s decision environment. A vague description can cause accidental selection. A malicious description can attempt to manipulate behavior. Hosts therefore need to treat server-provided metadata as untrusted input, not neutral documentation.
The security boundary moves into the host
MCP standardizes access, which can reduce integration chaos while simultaneously concentrating authority. A capable host may connect to source code, communications, customer records, and financial operations. If the model can combine context from one server with actions on another, an instruction embedded in retrieved content may influence a consequential tool call.
This is the essence of indirect prompt injection. Imagine a support ticket containing text that instructs the assistant to export internal files. The ticket is data to the user, but it may appear as an instruction to the model. Protocol compliance does not resolve that ambiguity.
A defensible host should apply controls outside the model’s judgment:
- Grant each server only the underlying permissions it requires.
- Separate reading from state-changing operations where possible.
- Require explicit confirmation for consequential or irreversible calls.
- Show the actual target and arguments, not merely a friendly action label.
- Keep credentials outside prompts and model-visible tool results.
- Record calls, approvals, results, and server identity for later review.
- Constrain local servers with operating-system permissions and carefully reviewed installation paths.
Confirmation is not a universal remedy. Repeated prompts produce habituation, and users may approve opaque operations simply to continue. The better pattern is risk-sensitive friction: routine bounded actions can proceed under policy, while unusual destinations, broad scopes, or destructive operations receive stronger scrutiny.
What interoperability does not mean
MCP makes capabilities discoverable through a shared grammar, but it does not establish a shared ontology. Two calendar servers might expose create_event with different assumptions about time zones, attendees, recurrence, and notifications. A host can parse both schemas without understanding their behavioral equivalence.
Nor does the protocol guarantee quality. Servers can return stale resources, misleading descriptions, incomplete errors, or outputs too large for a model’s context window. Authentication also remains an architectural responsibility rather than a magical property of connection. The identity of the user, host, server, and downstream account must be aligned intentionally.
There is also a discovery cost. Exposing hundreds of tools may degrade selection because the model must discriminate among overlapping descriptions. Hosts may need registries, semantic routing, or staged disclosure: first identify the relevant server, then reveal a smaller capability set. More connectivity is not automatically more usable agency.
The open design questions
The most consequential work now sits above the wire format. How should a host communicate provenance when an answer combines several servers? What portable policy language could express that a tool may read one project but modify none? How should servers declare side effects, data residency, latency, or reversibility in machine-readable form?
Capability identity is another unresolved layer. A familiar tool name may change behavior after a server update. Hosts need ways to detect material schema or policy changes and reconsider previously granted trust. Version negotiation helps with protocol compatibility, but behavioral assurance requires stronger lifecycle discipline.
There is also tension between composability and accountability. Chaining tools allows an assistant to retrieve a customer request, modify code, open a review, and notify a team. When the chain fails halfway, responsibility is distributed across model reasoning, host policy, server implementation, and downstream systems. Reliable agents will need transaction-aware designs: previews, idempotent operations, compensating actions, and explicit checkpoints.
The deeper opportunity
MCP’s near-term value is practical: integrations can be built once and used by multiple compatible hosts. Its larger significance is architectural. It turns model access from application-specific plumbing into an inspectable layer with named capabilities, schemas, and session boundaries.
That layer can support an ecosystem, but the durable advantage will not belong merely to whoever exposes the most tools. It will belong to systems that make authority legible: what the model can see, what it can change, why a call was selected, which identity authorized it, and how an error can be reversed.
The protocol supplies a common doorway. The frontier lies in designing the locks, signs, corridors, and records that make entering consequential systems safe enough to become ordinary.
This post was drafted with AI assistance and reviewed against our editorial policy before publication. Corrections are made at the source, on the page, with the date shown.
Rate this article
Discussion
Comments are moderated. Read our editorial policy.