{"slug": "the-model-context-protocol-mcp-what-it-is-and-how-to-build-a-server", "title": "The Model Context Protocol (MCP): what it is and how to build a server", "summary": "Anthropic's Model Context Protocol (MCP) standardizes how LLM-powered applications connect to data sources, replacing custom integrations with a single interface. The protocol uses JSON-RPC 2.0 and supports resources, tools, and prompts, with the Python SDK at version 1.27.2. A developer demonstrates building an MCP server using the FastMCP API.", "body_md": "Your team's LLM-powered application talks to a search index through one custom integration, a code repository through another, a Postgres database through a chain of LangChain tools, and a file system through raw Python I/O calls. Every new data source means writing a new integration. Every integration uses a different authentication model and returns data in a different shape. The LLM application is tightly coupled to every backend it touches, and swapping one out requires changing the application code directly.\n\nThe Model Context Protocol (MCP) exists to replace this bespoke plumbing with a single, standardized interface. Think of it as a USB-C port for LLM applications: one connector shape, one protocol, and any compatible server can plug into any compatible client without custom wiring.\n\nLLM-powered tools have exploded in capability over the past two years, but the integration story has not kept up. Each AI application (IDE assistant, chat client, agent framework) historically built its own connectors for databases, APIs, document stores, and code repositories. There was no shared contract. If you wanted to use a specific code search tool with two different AI assistants, you needed two separate integrations.\n\nMCP borrows its design philosophy from the Language Server Protocol (LSP), which standardized how code editors talk to language analyzers. Before LSP, each editor had its own plugin for each language. After LSP, one language server worked with every editor. MCP aims to do the same for AI tools and the data sources they need.\n\nThe protocol is an open standard, originally created at Anthropic and published under the MIT license. The specification reached stable at version 2025-11-25, and the Python SDK (`mcp`\n\non PyPI) is at **1.27.2** as of May 2026. A 2.0.0 alpha was published in June 2026 with an updated transport layer.\n\nMCP uses **JSON-RPC 2.0** as its message format. A client (the AI application) connects to a server (a service that provides context) over one of three transport types:\n\nHere is the conceptual architecture:\n\n```\nflowchart LR\n    subgraph Client[\"Client (AI App)\"]\n        A[\"Host<br/>IDE / Chat / Agent\"]\n        B[\"MCP Client<br/>Protocol handler\"]\n    end\n    subgraph Server[\"MCP Server\"]\n        C[\"MCP Server<br/>Protocol handler\"]\n        D[\"Resources<br/>context data\"]\n        E[\"Tools<br/>executable functions\"]\n        F[\"Prompts<br/>templated workflows\"]\n    end\n    A <--> B\n    B <-->|JSON-RPC 2.0<br/>stdio / SSE / HTTP| C\n    C --> D\n    C --> E\n    C --> F\n```\n\nEvery MCP session begins with a **capability negotiation** handshake. The client announces what features it supports (sampling, roots, elicitation). The server announces what features it offers (resources, tools, prompts). Both sides agree on a feature set before any data exchange happens.\n\nServers offer three main categories of functionality:\n\n**Resources** expose data to the LLM. Think of them as GET endpoints in a REST API. A resource has a URI and returns content in a structured format. Example: `file:///logs/2026-06-01.txt`\n\nreturns the content of that log file. Resources are how the LLM loads context.\n\n**Tools** are functions the LLM can invoke. Think of them as POST endpoints. A tool has a name, a description, and an input schema (JSON Schema). The LLM can call a tool to execute code, query a database, or trigger an external action. Unlike resources, tools are invoked on demand.\n\n**Prompts** are reusable templates for LLM interactions. A prompt defines a message template with parameter slots. The client can populate the template and present the result to the user as a pre-built interaction.\n\nClients can also offer features to servers:\n\nThe `mcp`\n\npackage (v1.27.2) provides a high-level API called **FastMCP** that makes building a server straightforward. Here is a complete server that exposes a weather tool and a greeting resource:\n\n``` python\nfrom mcp.server.fastmcp import FastMCP\n\n# Create an MCP server\nmcp = FastMCP(\"Weather Demo\")\n\n# Add a tool: get weather for a city\n@mcp.tool()\ndef get_weather(city: str, units: str = \"celsius\") -> str:\n    \"\"\"Get the current weather for a city.\"\"\"\n    # In production, call a real weather API here\n    return f\"Weather in {city}: 22 degrees {units}, partly cloudy\"\n\n# Add a resource: city data by URI\n@mcp.resource(\"city://{name}\")\ndef city_info(name: str) -> str:\n    \"\"\"Get information about a city.\"\"\"\n    cities = {\n        \"dubai\": \"Dubai, UAE. Population: 3.6M. Timezone: UTC+4.\",\n        \"london\": \"London, UK. Population: 8.9M. Timezone: UTC+0.\",\n        \"tokyo\": \"Tokyo, Japan. Population: 14M. Timezone: UTC+9.\",\n    }\n    return cities.get(name.lower(), f\"City '{name}' not found.\")\n\n# Add a prompt template\n@mcp.prompt()\ndef travel_planning(city: str) -> str:\n    \"\"\"Generate a travel planning prompt for a destination.\"\"\"\n    return (\n        f\"You are a travel assistant helping someone plan a trip to {city}. \"\n        f\"Provide practical advice on weather, transportation, and attractions.\"\n    )\n\n# Run with stdio transport (default)\nif __name__ == \"__main__\":\n    mcp.run()\n```\n\nInstall it and run:\n\n```\npip install \"mcp[cli]\"\npython weather_server.py\n```\n\nThe server starts on stdio by default. For HTTP transport, change the last line:\n\n```\nmcp.run(transport=\"streamable-http\")\n```\n\nThe official MCP Inspector is a browser-based tool for testing servers:\n\n```\nnpx -y @modelcontextprotocol/inspector\n```\n\nPoint it at your server endpoint (or stdio command) and you can browse resources, invoke tools, and inspect messages without writing a client.\n\n| Feature | MCP | Custom API / REST | LangChain Tools | OpenAI function calling |\n|---|---|---|---|---|\n| Standardized protocol | Yes | No | No (framework-specific) | No (API-specific) |\n| Primitive types | Resources, Tools, Prompts | Endpoints only | Tools only | Functions only |\n| Transport options | stdio, SSE, Streamable HTTP | HTTP only | In-process only | HTTP only |\n| Bidirectional | Yes (sampling, roots) | Request-response only | Request-response only | Request-response only |\n| Auth model | OAuth 2.1 (spec), pluggable | Custom per API | Custom per integration | API key |\n| Client independence | Any MCP client | One client per API | LangChain only | OpenAI only |\n\nThe main differentiator is **client independence**. A server written for MCP works with any MCP-compatible client: Claude Code, Claude Desktop, the Continue.dev VS Code extension, or a custom agent framework. Custom APIs and framework-specific tools lock you into one ecosystem.\n\n**Thinking tools are free.** Tools execute arbitrary code on your server. Every tool invocation consumes compute and may have side effects. The LLM cannot distinguish between a cheap operation (reading a config file) and an expensive one (running a 100-row batch query). Set usage limits or implement a permission layer for destructive operations.\n\n**Resource URIs must be meaningful.** A resource URI is not just a label -- it is the identifier the LLM uses to request data. Using opaque URIs (`resource://abc123`\n\n) makes it impossible for the LLM to discover resources. Use hierarchical, descriptive URIs that hint at the content structure, like `docs://project/api/reference`\n\nor `db://customers/orders?status=pending`\n\n.\n\n**Forgetting the capability handshake.** If you add a new tool to an existing server and your client does not re-negotiate capabilities, the client will not know the tool exists. The capability exchange happens at connection time. Restart both sides after changing what a server offers.\n\n**Overloading a server.** An MCP server that exposes 50 tools and 200 resources becomes as hard to navigate as a REST API with 50 endpoints. Group related functionality into separate servers and let the client connect to multiple servers. Claude Desktop and other hosts already support multi-server setups.\n\n**Assuming tools are always available to the LLM.** Tool invocation requires user consent in most host applications. The user must approve each tool call. Design your tools to be meaningful in a single invocation, because multi-step approval flows create a poor user experience.\n\nMCP is the wrong choice if:\n\n`requests`\n\ndirectly.`mcp`\n\n(v1.27.2) provides FastMCP, a decorator-based API for building servers in a few lines of code.`npx @modelcontextprotocol/inspector`\n\n) to test servers without writing a client.Next post: building a multi-server MCP setup that connects a code search service, a documentation index, and a database gateway into a single AI assistant, with practical trade-offs on transport selection and auth.", "url": "https://wpnews.pro/news/the-model-context-protocol-mcp-what-it-is-and-how-to-build-a-server", "canonical_source": "https://dev.to/tech_nuggets/the-model-context-protocol-mcp-what-it-is-and-how-to-build-a-server-4fbi", "published_at": "2026-06-15 01:13:04+00:00", "updated_at": "2026-06-15 01:41:05.255587+00:00", "lang": "en", "topics": ["large-language-models", "developer-tools", "ai-infrastructure", "ai-agents"], "entities": ["Anthropic", "Model Context Protocol", "MCP", "JSON-RPC 2.0", "FastMCP", "Python SDK", "Language Server Protocol", "PyPI"], "alternates": {"html": "https://wpnews.pro/news/the-model-context-protocol-mcp-what-it-is-and-how-to-build-a-server", "markdown": "https://wpnews.pro/news/the-model-context-protocol-mcp-what-it-is-and-how-to-build-a-server.md", "text": "https://wpnews.pro/news/the-model-context-protocol-mcp-what-it-is-and-how-to-build-a-server.txt", "jsonld": "https://wpnews.pro/news/the-model-context-protocol-mcp-what-it-is-and-how-to-build-a-server.jsonld"}}