🚀 MCP 服務器模板
MCP 服務器模板為開發提供了基礎架構,涵蓋項目結構、依賴管理、服務器啟動等功能,能幫助開發者快速搭建 MCP 服務器。
🚀 快速開始
1. 安裝依賴
pip install -r requirements.txt
2. 啟動服務器
make dev
uvicorn run --host 0.0.0.0 --port 8000 mcp.server.fastmcp.cli:create_app
3. 使用示例
發送請求到 http://localhost:8000/process
:
{
"data": {
"input": "處理我的數據",
"parameters": {}
}
}
✨ 主要特性
- 提供完整的項目結構,包含項目構建、依賴管理和服務器啟動腳本。
- 支持提示模板管理和對話管理接口,方便開發相關功能。
- 所有接口均支持 JSON 格式請求和響應,便於集成。
📦 安裝指南
安裝依賴
pip install -r requirements.txt
注意事項
⚠️ 重要提示
安裝依賴前請確保已安裝 setuptools
和 wheel
。項目使用 Python 3.8+
,推薦使用虛擬環境。
💻 使用示例
基礎用法
發送請求到 http://localhost:8000/process
:
{
"data": {
"input": "處理我的數據",
"parameters": {}
}
}
📚 詳細文檔
API 文檔
瀏覽器打開 http://localhost:8000/docs。
提示模板管理
/prompts
路由提供提示模板的增刪改查功能。
對話管理
/dialogs
路由提供對話的增刪改查功能。
🔧 技術細節
項目結構
your-project-name/
├── Makefile # 項目構建和運行腳本
├── setup.py # 安裝依賴和可執行腳本
├── requirements.txt # 項目依賴列表
├── mcp/
│ ├── __init__.py # 包初始化文件
│ └── server/
│ ├── __init__.py # 包初始化文件
│ └── fastmcp/
│ ├── __init__.py # 包初始化文件
│ ├── prompts/ # 提示模板模塊
│ │ └── sample_prompts.py # 示例提示模板實現
│ └── dialogs/ # 對話管理模塊
│ └── sample_dialogs.py # 示例對話實現
支持的接口
提示模板管理接口
/prompts
:
- GET: 列出所有提示模板
- POST: 創建新提示模板
- PUT: 更新指定提示模板
- DELETE: 刪除指定提示模板
對話管理接口
/dialogs
:
- POST: 創建新對話
- GET: 獲取指定對話狀態
- PUT: 更新指定對話內容
- DELETE: 刪除指定對話
返回格式
{
"id": "string", # 唯一標識符
"status": "success" | "error",
"message": "操作成功" | "錯誤信息"
}
代碼片段
setup.py
from setuptools import setup, find_packages
setup(
name="your_project_name",
version="0.1.0",
packages=find_packages(),
install_requires=[
"fastapi",
"uvicorn",
"python-multipart",
"numpy",
"pandas",
"langchain",
"huggingface",
"tqdm"
],
entry_points={
"console_scripts": [
"mcp-server=mcp.server.fastmcp.cli:main",
],
},
)
Makefile
PROJECT_NAME = your-project-name
VENV := .venv
all: clean
setup:
pip install -r requirements.txt
dev:
python -m venv $(VENV)
source $(VENV)/bin/activate
set PYTHONPATH=$(PYTHONPATH):$(shell pwd)
install:
pip install -e .
clean:
find . -name "*.pyc" -delete
find . -name "__pycache__" -type d -delete
mcp/server/fastmcp/cli.py
import uvicorn
from fastapi import FastAPI
from mcp.server.fastmcp.routers import main_router
def create_app():
app = FastAPI()
app.include_router(main_router.router)
return app
if __name__ == "__main__":
uvicorn.run("mcp.server.fastmcp.cli:create_app", host="0.0.0.0", port=8000, reload=True)
mcp/server/fastmcp/routers/main.py
from fastapi import APIRouter
from fastapi.responses import JSONResponse
from typing import List, Dict
router = APIRouter()
@router.get("/", response_class=JSONResponse)
async def root():
return {"message": "MCP 服務器運行中"}
@router.post("/process", response_class=JSONResponse)
async def process(data: dict) -> dict:
return {"status": "success", "result": data}
mcp/server/fastmcp/prompts/base.py
class PromptTemplate:
def __init__(self, template_str: str):
self.template = template_str
def format(self, **kwargs) -> str:
return self.template.format(**kwargs)
mcp/server/fastmcp/dialogs/sample_dialogs.py
from typing import List, Dict, Any
from langchain.schema import Dialogue
from fastapi import APIRouter
dialog_router = APIRouter()
@dialog_router.post("/dialogs", response_class=JSONResponse)
async def create_dialog(request: dict) -> Dict[str, Any]:
dialog_id = str(uuid.uuid4())
return {"id": dialog_id}
@dialog_router.get("/dialogs/{dialog_id}", response_class=JSONResponse)
async def get_dialog(dialog_id: str) -> Dict[str, Any]:
pass
@dialog_router.put("/dialogs/{dialog_id}", response_class=JSONResponse)
async def update_dialog(dialog_id: str, data: dict) -> Dict[str, Any]:
pass
@dialog_router.delete("/dialogs/{dialog_id}", response_class=JSONResponse)
async def delete_dialog(dialog_id: str) -> Dict[str, Any]:
pass
mcp/server/fastmcp/prompts/sample_prompts.py
from typing import List, Dict, Any
from langchain.prompts import PromptTemplate as LangPromptTemplate
from fastapi import APIRouter
prompt_router = APIRouter()
@prompt_router.get("/prompts", response_class=JSONResponse)
async def list_prompts() -> List[Dict[str, str]]:
pass
@prompt_router.post("/prompts", response_class=JSONResponse)
async def create_prompt(request: dict) -> Dict[str, Any]:
pass
@prompt_router.get("/prompts/{prompt_id}", response_class=JSONResponse)
async def get_prompt(prompt_id: str) -> Dict[str, Any]:
pass
@prompt_router.put("/prompts/{prompt_id}", response_class=JSONResponse)
async def update_prompt(prompt_id: str, data: dict) -> Dict[str, Any]:
pass
@prompt_router.delete("/prompts/{prompt_id}", response_class=JSONResponse)
async def delete_prompt(prompt_id: str) -> Dict[str, Any]:
pass