Loading skill
Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build MCP (Model Context Protocol) servers that give Claude new capabilities. Use when user wants to create an MCP server, add tools to Claude, or integrate external services.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 16% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-22 | ✗→✓ | ▲ Improved | 137% | 0% |
| case-20 | ✓→✗ | ▼ Worse | 36% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 60% | 0% |
You now have expertise in building MCP (Model Context Protocol) servers. MCP enables Claude to interact with external services through a standardized protocol.
MCP servers expose:
bash# Create project mkdir my-mcp-server && cd my-mcp-server python3 -m venv venv && source venv/bin/activate # Install MCP SDK pip install mcp
python#!/usr/bin/env python3 """my_server.py - A simple MCP server""" from mcp.server import Server from mcp.server.stdio import stdio_server from mcp.types import Tool, TextContent # Create server instance server = Server("my-server") # Define a tool @server.tool() async def hello(name: str) -> str: """Say hello to someone. Args: name: The name to greet """ return f"Hello, {name}!" @server.tool() async def add_numbers(a: int, b: int) -> str: """Add two numbers together. Args: a: First number b: Second number """ return str(a + b) # Run server async def main(): async with stdio_server() as (read, write): await server.run(read, write) if __name__ == "__main__": import asyncio asyncio.run(main())
Add to ~/.claude/mcp.json:
json{ "mcpServers": { "my-server": { "command": "python3", "args": ["/path/to/my_server.py"] } } }
bashmkdir my-mcp-server && cd my-mcp-server npm init -y npm install @modelcontextprotocol/sdk
typescript// src/index.ts import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; const server = new Server({ name: "my-server", version: "1.0.0", }); // Define tools server.setRequestHandler("tools/list", async () => ({ tools: [ { name: "hello", description: "Say hello to someone", inputSchema: { type: "object", properties: { name: { type: "string", description: "Name to greet" }, }, required: ["name"], }, }, ], })); server.setRequestHandler("tools/call", async (request) => { if (request.params.name === "hello") { const name = request.params.arguments.name; return { content: [{ type: "text", text: `Hello, ${name}!` }] }; } throw new Error("Unknown tool"); }); // Start server const transport = new StdioServerTransport(); server.connect(transport);
pythonimport httpx from mcp.server import Server server = Server("weather-server") @server.tool() async def get_weather(city: str) -> str: """Get current weather for a city.""" async with httpx.AsyncClient() as client: resp = await client.get( f"https://api.weatherapi.com/v1/current.json", params={"key": "YOUR_API_KEY", "q": city} ) data = resp.json() return f"{city}: {data['current']['temp_c']}C, {data['current']['condition']['text']}"
pythonimport sqlite3 from mcp.server import Server server = Server("db-server") @server.tool() async def query_db(sql: str) -> str: """Execute a read-only SQL query.""" if not sql.strip().upper().startswith("SELECT"): return "Error: Only SELECT queries allowed" conn = sqlite3.connect("data.db") cursor = conn.execute(sql) rows = cursor.fetchall() conn.close() return str(rows)
python@server.resource("config://settings") async def get_settings() -> str: """Application settings.""" return open("settings.json").read() @server.resource("file://{path}") async def read_file(path: str) -> str: """Read a file from the workspace.""" return open(path).read()
bash# Test with MCP Inspector npx @anthropics/mcp-inspector python3 my_server.py # Or send test messages directly echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | python3 my_server.py
Other measured skills in the registry, with their headline benchmark lift.