In depth
An MCP server is the capability provider in the Model Context Protocol architecture. It runs as a separate process — locally via stdio or remotely via HTTP/SSE — and implements the MCP protocol to expose three kinds of features: tools (callable functions), resources (readable data), and prompts (reusable templates).
MCP servers are language-agnostic. You can write one in TypeScript with `@modelcontextprotocol/sdk`, Python with `mcp`, Rust, Kotlin, or C#. A server typically wraps an existing API or system — e.g. the GitHub MCP server wraps the GitHub REST API, exposing `create_issue`, `list_pulls`, etc. as MCP tools.
Servers declare their capabilities during initialization, so the client knows what's available. They can emit progress notifications for long-running tasks, request user permission via sampling, and access filesystem roots the client has granted.
MCP servers are typically reusable across clients — the same GitHub server works with Claude Code, Cursor, and Claude Desktop without modification.