API Reference
Complete API documentation for MCP development.
The main Server class provides the foundation for building MCP servers. It handles tool registration, request routing, and response formatting.
from mcp import Server class MyServer(Server): def __init__(self): super().__init__() # Register tool handlers self.register_tool_handler("tool_name", self.tool_handler) async def list_tools(self, request: ListToolsRequest) -> ListToolsResult: """Return list of available tools""" return ListToolsResult(tools=[...]) async def tool_handler(self, request: CallToolRequest) -> CallToolResult: """Handle tool calls""" return CallToolResult(content=[...])
MCP defines several request types for different operations. Each request type has specific fields and validation rules.
from mcp.types import ( CallToolRequest, ListToolsRequest, GetPromptsRequest, GetPromptVariablesRequest, ListResourcesRequest, ReadResourceRequest, GetResourceRequest, ListActionsRequest, CallActionRequest ) # Tool-related requests call_request = CallToolRequest( name="tool_name", arguments={"key": "value"} ) list_tools_request = ListToolsRequest() # Resource-related requests list_resources_request = ListResourcesRequest( uri="file:///path/to/resource" ) read_resource_request = ReadResourceRequest( uri="file:///path/to/resource" )
Response types define the structure of data returned by MCP servers. Each response type corresponds to a specific request type.
from mcp.types import ( CallToolResult, ListToolsResult, GetPromptsResult, GetPromptVariablesResult, ListResourcesResult, ReadResourceResult, GetResourceResult, ListActionsResult, CallActionResult ) # Tool responses tool_result = CallToolResult( content=[ { "type": "text", "text": "Tool response content" } ], isError=False ) tools_list = ListToolsResult( tools=[ Tool( name="tool_name", description="Tool description", inputSchema={ "type": "object", "properties": { "input": {"type": "string"} } } ) ] )
The transport layer handles communication between MCP clients and servers. MCP supports multiple transport protocols.
from mcp import StdioServerTransport, StdioClientTransport # Server transport transport = StdioServerTransport() async def run_server(): server = MyServer() await transport.run(server) # Client transport client_transport = StdioClientTransport() async def run_client(): async with ClientSession(client_transport) as session: tools = await session.list_tools() result = await session.call_tool("tool_name", {"arg": "value"}) # HTTP transport (if supported) from mcp import HTTPServerTransport http_transport = HTTPServerTransport(port=8000)
Proper error handling is essential for robust MCP servers. Use structured error responses and appropriate error codes.
from mcp.types import CallToolResult async def handle_tool_call(self, request: CallToolRequest) -> CallToolResult: try: # Validate input if not request.arguments.get("required_field"): return CallToolResult( content=[{ "type": "text", "text": "Error: Missing required field" }], isError=True ) # Process request result = await self.process_request(request.arguments) return CallToolResult( content=[{ "type": "text", "text": f"Success: {result}" }] ) except ValueError as e: return CallToolResult( content=[{ "type": "text", "text": f"Validation error: {str(e)}" }], isError=True ) except Exception as e: return CallToolResult( content=[{ "type": "text", "text": "Internal server error" }], isError=True )
MCP servers can be configured through various methods including environment variables, configuration files, and command-line arguments.
import os import json from dataclasses import dataclass @dataclass class ServerConfig: host: str = "localhost" port: int = 8000 debug: bool = False api_keys: list = None @classmethod def from_env(cls): return cls( host=os.getenv("MCP_HOST", "localhost"), port=int(os.getenv("MCP_PORT", "8000")), debug=os.getenv("MCP_DEBUG", "false").lower() == "true", api_keys=os.getenv("MCP_API_KEYS", "").split(",") if os.getenv("MCP_API_KEYS") else [] ) @classmethod def from_file(cls, filepath: str): with open(filepath, 'r') as f: config_data = json.load(f) return cls(**config_data) # Usage config = ServerConfig.from_env() # or config = ServerConfig.from_file("config.json")
Server Development Guide
Building MCP servers
Best Practices
Development best practices