<< All versions
Skill v1.0.0
currentAutomated scan100/100shareai-lab/learn-claude-code/mcp-builder
──Details
PublishedJune 16, 2026 at 09:43 PM
Content Hashsha256:1f0d78f420282374...
Git SHA20e7cbb72c66
──Files
Files (1 file, 4.8 KB)
SKILL.md4.8 KBactive
SKILL.md · 215 lines · 4.8 KB
version: "1.0.0" name: mcp-builder description: 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.
MCP Server Building Skill
You now have expertise in building MCP (Model Context Protocol) servers. MCP enables Claude to interact with external services through a standardized protocol.
What is MCP?
MCP servers expose:
- Tools: Functions Claude can call (like API endpoints)
- Resources: Data Claude can read (like files or database records)
- Prompts: Pre-built prompt templates
Quick Start: Python MCP Server
1. Project Setup
bash
# Create projectmkdir my-mcp-server && cd my-mcp-serverpython3 -m venv venv && source venv/bin/activate# Install MCP SDKpip install mcp
2. Basic Server Template
python
#!/usr/bin/env python3"""my_server.py - A simple MCP server"""from mcp.server import Serverfrom mcp.server.stdio import stdio_serverfrom mcp.types import Tool, TextContent# Create server instanceserver = 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 numberb: Second number"""return str(a + b)# Run serverasync def main():async with stdio_server() as (read, write):await server.run(read, write)if __name__ == "__main__":import asyncioasyncio.run(main())
3. Register with Claude
Add to ~/.claude/mcp.json:
json
{"mcpServers": {"my-server": {"command": "python3","args": ["/path/to/my_server.py"]}}}
TypeScript MCP Server
1. Setup
bash
mkdir my-mcp-server && cd my-mcp-servernpm init -ynpm install @modelcontextprotocol/sdk
2. Template
typescript
// src/index.tsimport { 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 toolsserver.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 serverconst transport = new StdioServerTransport();server.connect(transport);
Advanced Patterns
External API Integration
python
import httpxfrom mcp.server import Serverserver = 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']}"
Database Access
python
import sqlite3from mcp.server import Serverserver = 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)
Resources (Read-only Data)
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()
Testing
bash
# Test with MCP Inspectornpx @anthropics/mcp-inspector python3 my_server.py# Or send test messages directlyecho '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | python3 my_server.py
Best Practices
- Clear tool descriptions: Claude uses these to decide when to call tools
- Input validation: Always validate and sanitize inputs
- Error handling: Return meaningful error messages
- Async by default: Use async/await for I/O operations
- Security: Never expose sensitive operations without auth
- Idempotency: Tools should be safe to retry