本项目借助 FastAPI 和 FastAPI-MCP 构建 MCP 服务器框架,可在多个云平台协调管理计算任务,提供丰富 API 接口,支持多协议与集成方案,适用于复杂云环境。
要开始使用 FastAPI 和 FastAPI-MCP 创建一个基本的 MCP 服务器,请按照以下步骤操作:
安装必要的依赖项:
pip install fastapi fastapi_mcp uvicorn
创建主应用文件 (main.py):
from fastapi import FastAPI
from fastapi_mcp import FastApiMCP
app = FastAPI()
# 定义一个标准的 FastAPI 端点
@app.post("/predict", operation_id="predict_sentiment")
async def predict_sentiment(text: str):
return {"sentiment": "positive", "confidence": 0.92}
# 创建并挂载 MCP 服务,自动将上面的端点转换为 MCP 工具
mcp = FastApiMCP(
app,
name="sentiment-analysis",
description="情感分析服务",
base_url="http://localhost:5000",
include_operations=["predict_sentiment"]
)
# 挂载 MCP 服务到指定路径
mcp.mount(mount_path="/mcp")
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
运行应用:
python main.py
访问服务:
http://localhost:5000/predicthttp://localhost:5000/mcp克隆项目仓库:
git clone https://github.com/yourusername/mcp-server.git
cd mcp-server
创建虚拟环境并安装依赖:
python -m venv .venv
source .venv/bin/activate # 在 macOS/Linux 下
pip install -r requirements.txt
配置项目:
config.py 中的云服务提供商凭证和 API 端点。启动服务器:
uvicorn main:app --host 0.0.0.0 --port 8000
pip install mcp-server
创建 config.yaml 文件,如下所示:
cloud_providers:
- name: AWS
region: us-east-2
access_key: YOUR_AWS_KEY
secret_key: YOUR_AWS_SECRET
- name: GCP
region: europe-west1
project_id: your-gcp-project
key_path: path/to/service-account.json
- name: Azure
region: eastus
subscription_id: your_azure_subscription_id
client_id: your_azure_client_id
client_secret: your_azure_client_secret
python3 -m mcp_server.run --config config.yaml
# app/endpoints/sentiment_endpoints.py
from fastapi import APIRouter, Depends
from app.services.sentiment_service import SentimentService
router = APIRouter()
@router.post("/sentiment")
async def analyze_sentiment(text: str, service: SentimentService = Depends(SentimentService)):
sentiment = await service.analyze(text)
return {"sentiment": sentiment}
# app/endpoints/parking_endpoints.py
from fastapi import APIRouter, Depends
from app.services.parking_service import ParkingService
router = APIRouter()
@router.get("/parking/nearby")
async def find_nearby_parkings(latitude: float, longitude: float, radius: int,
service: ParkingService = Depends(ParkingService)):
result = await service.find_nearby_parkings(latitude, longitude, radius)
return {"data": result}
# app/endpoints/recommendation_endpoints.py
from fastapi import APIRouter, Depends
from app.services.recommendation_service import RecommendationService
router = APIRouter()
@router.post("/recommendations")
async def get_recommendations(user_id: int, service: RecommendationService = Depends(RecommendationService)):
recommendations = await service.get Recommendations(user_id)
return {"recommendations": recommendations}
from mcp_server.transaction import TransactionManager
tm = TransactionManager()
with tm.context():
# 执行跨云操作
pass
class SmartRouter:
def route_request(self, request):
# 返回目标云服务提供商和区域
pass
# Kubernetes Horizontal Pod Autoscaler 配置
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: mcp-server-hpa
spec:
scaleRef:
kind: Deployment
name: mcp-server-deployment
apiVersion: apps/v1
minReplicas: 2
maxReplicas: 5
targetCPUUtilizationPercentage: 80
一个典型的 MCP 服务器项目可能包含以下文件和目录:
mcp_server/
├── main.py # 主应用文件
├── app/ # FastAPI 应用模块
│ ├── models.py # 数据模型定义
│ ├── services/ # 服务类(如数据库连接、业务逻辑)
│ └── endpoints/ # API 端点实现
├── config/ # 配置管理
│ ├── settings.py # 应用设置
│ └── environment.py # 环境变量管理
└── tests/ # 测试用例
├── test_endpoints.py # 单元测试
└── integration_tests.py # 集成测试
# app/services/parking_service.py
class ParkingService:
def __init__(self, db):
self.db = db
async def find_nearby_parkings(self, latitude: float, longitude: float, radius: int) -> list:
# 查询数据库以获取附近的停车场
pass
# app/endpoints/parking_endpoints.py
from fastapi import APIRouter, Depends
from app.services.parking_service import ParkingService
from config.environment import get_db
router = APIRouter()
@router.get("/parking/nearby")
async def find_nearby_parkings(latitude: float, longitude: float, radius: int,
service: ParkingService = Depends(ParkingService)):
db = next(get_db())
result = await service.find_nearby_parkings(latitude, longitude, radius)
return {"data": result}
# config/settings.py
class Settings:
def __init__(self):
self.debug = True # 调试模式,默认为真
@property
def database_url(self) -> str:
return "sqlite:///./test.db"
@property
def secret_key(self) -> str:
return "your-secret-key-here"
FastAPI 的依赖注入机制非常强大,可以用于管理各种依赖项。
# config/database.py
def get_db():
db = connect_to_db()
try:
yield db
finally:
db.close()
@app.get("/items/")
async def get_items(db=Depends(get_db)):
return db.query(Item).all()
# app/services/database_service.py
class DatabaseService:
def __init__(self, settings):
self.settings = settings
self.db = connect_to_db(settings.database_url)
async def query(self, sql: str) -> list:
pass
集成日志库(如 logging)和监控工具(如 Prometheus、Grafana)可以提供更详细的运行时信息。
# app/endpoints/sentiment_endpoints.py
from fastapi import APIRouter, Depends
from app.services.sentiment_service import SentimentService
router = APIRouter()
@router.post("/sentiment")
async def analyze_sentiment(text: str, service: SentimentService = Depends(SentimentService)):
sentiment = await service.analyze(text)
return {"sentiment": sentiment}
# app/endpoints/parking_endpoints.py
from fastapi import APIRouter, Depends
from app.services.parking_service import ParkingService
router = APIRouter()
@router.get("/parking/nearby")
async def find_nearby_parkings(latitude: float, longitude: float, radius: int,
service: ParkingService = Depends(ParkingService)):
result = await service.find_nearby_parkings(latitude, longitude, radius)
return {"data": result}
# app/endpoints/recommendation_endpoints.py
from fastapi import APIRouter, Depends
from app.services.recommendation_service import RecommendationService
router = APIRouter()
@router.post("/recommendations")
async def get_recommendations(user_id: int, service: RecommendationService = Depends(RecommendationService)):
recommendations = await service.get Recommendations(user_id)
return {"recommendations": recommendations}
fastapi-limiter 和 python-jose 来实现这些功能。# config/caching.py
from fastapi import Request
from typing import Any
from fastapi.responses import Response
class CacheInterceptor:
def __init__(self, cache):
self.cache = cache
async def intercept_request(self, request: Request) -> Any:
key = f"{request.method}_{request.url}"
value = await self.cache.get(key)
if value is not None:
return Response(value)
async def intercept_response(self, response: Response) -> None:
key = f"{response.request.method}_{response.request.url}"
value = str(response.body(), encoding="utf-8")
await self.cache.set(key, value)
# config/transaction.py
from fastapi import Depends
from typing import Any
import asyncio
class TransactionManager:
def __init__(self):
pass
async def begin(self):
pass
async def commit(self):
await asyncio.sleep(1) # 示例事务提交时间
async def rollback(self):
pass
# config/monitoring.py
import logging
from fastapi import FastAPI
from prometheus_fastapi_instrumentator import Instrumentator
app = FastAPI()
Instrumentator.instrument(app)
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
创建 Dockerfile:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "--host", "0.0.0.0", "--port", "8000", "main:app"]
构建镜像并运行:
docker build -t mcp-server .
docker run -p 8000:8000 mcp-server
创建 Deployment 和 Service 文件:
# deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcp-server-deployment
spec:
replicas: 3
selector:
matchLabels:
app: mcp-server
template:
metadata:
labels:
app: mcp-server
spec:
containers:
- name: mcp-server
image: mcp-server:latest
ports:
- containerPort: 8000
# service.yml
apiVersion: v1
kind: Service
metadata:
name: mcp-server-service
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8000
selector:
app: mcp-server
应用配置:
kubectl apply -f deployment.yml -f service.yml
配置 Prometheus 监控 Kubernetes 集群中的 MCP Server:
# prometheus.yml
scrape_configs:
- job_name: 'mcp-server'
static_configs:
- targets: [':80' ]
创建 Dashboard 来展示监控数据,集成不同的图表和警报规则。
atom 或 orchestrator 等工具,确保跨云服务的事务一致性。文档中未提及相关许可证信息。
poetry 或 pipenv 管理 Python 依赖,确保环境一致性。logging 或 sentry,便于调试和分析问题。通过以上步骤,您可以构建一个高效可靠的 MCP Server。从模块化的 API 设计到性能优化和扩展,每个细节都至关重要。使用 Docker 和 Kubernetes 进行容器化部署,并结合 Prometheus 和 Grafana 进行监控和可视化,将使您的服务更加稳定和易于管理。