Hosts, Clients, and Servers
MCP's architecture separates concerns across three distinct components—hosts, clients, and servers—each with specific responsibilities that work together to enable secure and controlled LLM interactions with external systems.

Host/Client
The host is the application users interact with—like Claude Desktop, IDEs, or browser extensions. Hosts create MCP client instances to connect with servers. Together, hosts and clients handle:
Access control: Determining which servers can be accessed and what operations they can perform
Protocol negotiation: Establishing compatible versions and capabilities with each server during initialization
Context aggregation: Combining tools, resources, and prompts from multiple connected servers
User consent: Ensuring users approve sensitive operations, especially those that modify data
Session management: Maintaining connection state and handling disconnections gracefully
Implementation considerations:
Validate all messages according to JSON-RPC 2.0 specification
Provide clear feedback about which servers are active
Handle server failures without affecting other connections
Distinguish between transport, protocol, and application-level errors
Server
A server is a lightweight process that exposes resources, tools, and/or prompts to MCP clients. Servers can run locally or remotely and form the core of MCP's extensibility. One server implementation works with all compatible clients. Servers declare which features they support during initialization
Development considerations:
Start with a focused set of capabilities rather than trying to expose everything
Consider context window limitations when designing tool schemas
Implement proper error handling that provides actionable feedback
Use progress notifications for long-running operations
Design with composability in mind—servers can work together