使用说明
MCP服务器
用于构建与外部服务集成的模型上下文协议(MCP)服务器的最小、干净的模板。此模板演示了核心模式和结构,而没有实际服务连接的复杂性。
🎯 目的
此模板显示:
- MCP服务器结构:如何组织MCP服务器
- 工具创建:如何使用适当的文档构建MCP工具
- 集成模式:外部服务集成的标准方法
- 错误处理:强大的错误处理和日志记录
- 配置:如何管理服务配置
📁 包含什么
mcp_server.py-使用一个示例工具完成MCP服务器- 身份验证流程示例 (模拟)
- 正确的错误处理和验证
- 结构化日志记录
- 清晰的文件和评论
🚀 快速开始
先决条件
pip install fastmcp
运行服务器
python mcp_server.py
🔧 定制
1.更新配置
用您的服务详细信息替换示例配置:
SERVICE_CONFIG = {
"api_url": "https://your-actual-service.com/api",
"username": "your_username",
"api_key": "your_api_key",
"timeout": 30
}
2.实施身份验证
用实际的身份验证逻辑替换模拟身份验证:
async def authenticate_service():
try:
# Replace with actual API call
response = requests.post(f"{SERVICE_CONFIG['api_url']}/auth", {
"username": SERVICE_CONFIG["username"],
"api_key": SERVICE_CONFIG["api_key"]
})
if response.status_code == 200:
return {
"success": True,
"token": response.json()["access_token"]
}
else:
return {"success": False, "error": "Auth failed"}
except Exception as e:
return {"success": False, "error": str(e)}
3.更换示例工具
修改 search_resources() 或为您的用例创建新工具:
@mcp.tool()
async def your_custom_tool(param1: str, param2: int = 10) -> Dict[str, Any]:
"""
Your custom tool description.
Args:
param1 (str): Description of parameter
param2 (int): Description with default value
Returns:
Dict[str, Any]: Description of return value
"""
try:
# Your implementation here
# 1. Authenticate if needed
# 2. Validate parameters
# 3. Make API calls
# 4. Process results
# 5. Return structured response
return {"success": True, "data": "your_results"}
except Exception as e:
return {"error": str(e)}
4.添加多个工具
您可以根据需要添加任意数量的工具:
@mcp.tool()
async def create_resource(name: str, data: Dict[str, Any]) -> Dict[str, Any]:
"""Create a new resource."""
# Implementation here
pass
@mcp.tool()
async def update_resource(resource_id: str, updates: Dict[str, Any]) -> Dict[str, Any]:
"""Update an existing resource."""
# Implementation here
pass
@mcp.tool()
async def delete_resource(resource_id: str) -> Dict[str, Any]:
"""Delete a resource."""
# Implementation here
pass
🏗️ 集成示例
REST API集成
import requests
async def call_api(endpoint: str, method: str = "GET", data: Dict = None):
headers = {"Authorization": f"Bearer {token}"}
response = requests.request(
method,
f"{SERVICE_CONFIG['api_url']}{endpoint}",
headers=headers,
json=data
)
return response.json()
数据库集成
import asyncpg
async def query_database(query: str, params: list = None):
conn = await asyncpg.connect(DATABASE_URL)
try:
result = await conn.fetch(query, *params if params else [])
return [dict(row) for row in result]
finally:
await conn.close()
GraphQL集成
import httpx
async def graphql_query(query: str, variables: Dict = None):
async with httpx.AsyncClient() as client:
response = await client.post(
f"{SERVICE_CONFIG['api_url']}/graphql",
json={"query": query, "variables": variables},
headers={"Authorization": f"Bearer {token}"}
)
return response.json()
📋 最佳实践
错误处理
try:
# Your operation
result = await external_service_call()
return {"success": True, "data": result}
except ServiceAuthError:
return {"error": "Authentication failed"}
except ServiceTimeoutError:
return {"error": "Service timeout"}
except Exception as e:
logger.error(f"Unexpected error: {e}")
return {"error": "Internal server error"}
输入验证
if not query or not query.strip():
return {"error": "Query parameter is required"}
if limit <= 0 or limit > 1000:
return {"error": "Limit must be between 1 and 1000"}
# Validate format
import re
if not re.match(r'^[a-zA-Z0-9\s]+$', query):
return {"error": "Invalid query format"}
日志记录
import logging
logger = logging.getLogger(__name__)
# Log important operations
logger.info(f"Processing request: {operation}")
logger.warning(f"Rate limit approaching: {current_usage}")
logger.error(f"Operation failed: {error_details}")
🧪 测试您的实现
基本测试
import asyncio
async def test_tool():
result = await search_resources("test query", limit=5)
print(f"Result: {result}")
if __name__ == "__main__":
asyncio.run(test_tool())
集成测试
async def test_integration():
# Test authentication
auth = await authenticate_service()
assert auth["success"], f"Auth failed: {auth.get('error')}"
# Test tool
result = await search_resources("integration test")
assert "error" not in result, f"Tool failed: {result.get('error')}"
print("All tests passed!")
🔒 安全考虑
- 安全地存储凭据(环境变量、密钥库)
- 验证所有输入参数
- 对所有外部通信使用HTTPS
- 必要时实施限速
- 适当记录安全事件
- 小心处理敏感数据
📚 后续步骤
- 复制此模板 开始你的项目
- 更新配置 提供您的服务详细信息
- 实施身份验证 为您的特定服务
- 更换示例工具 根据您的业务逻辑
- 添加错误处理 针对您的服务
- 彻底测试 有真实数据
- 添加日志记录 用于监控和调试
此模板为任何MCP服务器集成提供了坚实的基础。专注于您的业务逻辑,同时遵循既定的可靠性和可维护性模式。
