general/mcp-server-guide
MCP Server Development Guide
multichainguide✅ Verifiedconfidence highhealth 100%
v1.0.0·by Anthropic·Updated 3/20/2026
Overview
MCP (Model Context Protocol) is an open protocol by Anthropic for connecting AI assistants to external tools, data sources, and services. An MCP Server exposes Tools (callable functions), Resources (data/files), and Prompts (reusable templates) to any MCP-compatible client (Claude Desktop, Cursor, etc.).
Core Concepts
- Tools: Functions the LLM can call (e.g., search_web, query_db)
- Resources: Files or data the LLM can read (e.g., file://, db://)
- Prompts: Reusable prompt templates with parameters
- Transport: stdio (local) or HTTP+SSE (remote)
Minimal MCP Server (TypeScript)
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
import { z } from 'zod'
const server = new McpServer({
name: 'my-mcp-server',
version: '1.0.0',
})
// Register a Tool
server.tool(
'get_weather',
'Get current weather for a city',
{ city: z.string().describe('City name') },
async ({ city }) => {
// Your implementation here
const weather = await fetchWeather(city)
return {
content: [{ type: 'text', text: `Weather in ${city}: ${weather.description}, ${weather.temp}°C` }],
}
}
)
// Register a Resource
server.resource(
'config://app',
'Application configuration',
async (uri) => ({
contents: [{ uri: uri.href, text: JSON.stringify({ version: '1.0' }), mimeType: 'application/json' }],
})
)
// Start server
const transport = new StdioServerTransport()
await server.connect(transport)
Tool with Multiple Parameters
server.tool(
'search_database',
'Search records in the database',
{
query: z.string().describe('Search query'),
limit: z.number().optional().default(10).describe('Max results'),
table: z.enum(['users', 'products', 'orders']).describe('Table to search'),
},
async ({ query, limit, table }) => {
const results = await db.search(table, query, limit)
return {
content: [{
type: 'text',
text: JSON.stringify(results, null, 2),
}],
}
}
)
Claude Desktop Config
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"my-server": {
"command": "node",
"args": ["/path/to/your/server/dist/index.js"],
"env": {
"API_KEY": "your-api-key"
}
}
}
}
HTTP Transport (Remote Server)
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'
import express from 'express'
const app = express()
app.use(express.json())
app.post('/mcp', async (req, res) => {
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined })
await server.connect(transport)
await transport.handleRequest(req, res, req.body)
})
app.listen(3000)
Error Handling
server.tool('risky_op', 'Might fail', { id: z.string() }, async ({ id }) => {
try {
const result = await riskyOperation(id)
return { content: [{ type: 'text', text: result }] }
} catch (err) {
return {
content: [{ type: 'text', text: `Error: ${err.message}` }],
isError: true,
}
}
})
Installation
npm install @modelcontextprotocol/sdk zod