跳转到内容

MCP 实战:从开发到部署

这一节把 MCP Server 的开发和安全加固整合成一个完整的部署方案。

一键启动脚本

python
import asyncio
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
import pandas as pd

app = Server("pandas-server", version="1.0.0")

@app.list_tools()
async def list_tools():
    return [
        Tool(name="head", description="查看数据前 N 行",
             inputSchema={"type":"object","properties":{
                 "path":{"type":"string"},"n":{"type":"number","default":5}}}),
        Tool(name="stats", description="统计摘要 + 缺失值报告"),
        Tool(name="top_n", description="按某列取 Top N",
             inputSchema={"type":"object","properties":{
                 "path":{"type":"string"},
                 "col":{"type":"string"},
                 "n":{"type":"number","default":10}}}),
    ]

@app.call_tool()
async def call_tool(name, args):
    try:
        df = pd.read_csv(args["path"])
        if name == "head":
            return [TextContent(text=df.head(int(args.get("n", 5))).to_string())]
        elif name == "stats":
            info = f"Shape: {df.shape}\n"
            info += f"Memory: {df.memory_usage(deep=True).sum()/1024**2:.1f} MB\n"
            info += f"Missing:\n{df.isna().sum().to_string()}\n"
            if len(df.select_dtypes('number').columns) > 0:
                info += f"\n{df.describe().to_string()}"
            return [TextContent(text=info)]
        elif name == "top_n":
            col = args["col"]
            n = int(args.get("n", 10))
            top = df.nlargest(n, col)
            return [TextContent(text=top[[col]].head(n).to_string())]
    except Exception as e:
        return [TextContent(text=f"Error: {e}")]

if __name__ == "__main__":
    asyncio.run(stdio_server(app))

Claude Desktop 配置

~/Library/Application Support/Claude/claude_desktop_config.json 中添加:

json
{
  "mcpServers": {
    "pandas-data": {
      "command": "python3",
      "args": ["/path/to/pandas_mcp_server.py"],
      "env": {"DATA_DIR": "/Users/you/data"}
    }
  }
}

重启 Claude Desktop 后,你就可以在对话中说"帮我看看 data 目录下最新 CSV 的前 10 行和统计摘要",Claude 会自动调用你的 MCP Server 来完成查询。

基于 MIT 许可发布