【大模型实战篇】从Python函数到MCP服务器:完整转换示例
1. 项目背景
本文展示如何将普通的Python函数转换为MCP(Model Context Protocol)服务器,并使用MCP Inspector进行测试的完整过程。这个过程展示了AI工具开发的标准化流程。
2. 起点:普通Python函数
我们从最简单的Python函数开始:
# 原始的普通Python函数
def add(a: int, b: int) -> int:"""两个数相加"""return a + bdef multiply(a: float, b: float) -> float:"""两个数相乘"""return a * bdef calculate(expression: str) -> float:"""计算数学表达式"""return eval(expression)# 本地测试
if __name__ == "__main__":print(add(10, 5)) # 15print(multiply(3.5, 2.0)) # 7.0print(calculate("2+3*4")) # 14
问题:这些函数只能在本地使用,无法被AI应用调用。
转换目标:MCP服务器
我们的目标是将这些函数转换为:
- 可以被AI应用调用的MCP工具
- 支持网络访问的服务器
- 具有标准化接口的服务
3. 转换过程
3.1 第一步:环境准备
# 创建项目目录
mkdir python-to-mcp
cd python-to-mcp# 创建虚拟环境(避免系统包冲突)
python3 -m venv mcp_env
source mcp_env/bin/activate# 安装MCP库
pip install mcp
3.2 第二步:基础MCP服务器转换
将普通函数转换为MCP工具(mcp_demo_sse_server.py):
"""
MCP 演示服务器 - SSE版本(支持前端调用)
基于 MCP 教程实现的SSE协议MCP服务器
"""from mcp.server import FastMCP# 创建 FastMCP 应用,指定端口
app = FastMCP('demo-calculator', port=9000)@app.tool()
async def add(a: int, b: int) -> str:"""两个整数相加Args:a: 第一个整数b: 第二个整数Returns:计算结果"""try:result = a + breturn f"计算结果: {a} + {b} = {result}"except Exception as e:return f"计算错误: {str(e)}"@app.tool()
async def multiply(a: float, b: float) -> str:"""两个数字相乘Args:a: 第一个数字b: 第二个数字Returns:计算结果"""try:result = a * breturn f"计算结果: {a} × {b} = {result}"except Exception as e:return f"计算错误: {str(e)}"@app.tool()
async def subtract(a: float, b: float) -> str:"""两个数字相减Args:a: 被减数b: 减数Returns:计算结果"""try:result = a - breturn f"计算结果: {a} - {b} = {result}"except Exception as e:return f"计算错误: {str(e)}"@app.tool()
async def divide(a: float, b: float) -> str:"""两个数字相除Args:a: 被除数b: 除数Returns:计算结果"""try:if b == 0:return "错误: 除数不能为零"result = a / breturn f"计算结果: {a} ÷ {b} = {result}"except Exception as e:return f"计算错误: {str(e)}"@app.tool()
async def calculate(expression: str) -> str:"""计算数学表达式Args:expression: 要计算的数学表达式,如 '2+3*4'Returns:计算结果"""try:if not expression:return "错误: 请提供有效的数学表达式"# 为了安全,只允许基本的数学运算allowed_chars = set('0123456789+-*/.()')if not all(c in allowed_chars or c.isspace() for c in expression):return "错误: 表达式只能包含数字、运算符(+,-,*,/)和括号"result = eval(expression)return f"计算结果: {expression} = {result}"except ZeroDivisionError:return "错误: 除数不能为零"except Exception as e:return f"计算错误: {str(e)}"@app.tool()
async def power(base: float, exponent: float) -> str:"""计算幂运算Args:base: 底数exponent: 指数Returns:计算结果"""try:result = base ** exponentreturn f"计算结果: {base} ^ {exponent} = {result}"except Exception as e:return f"计算错误: {str(e)}"@app.tool()
async def sqrt(number: float) -> str:"""计算平方根Args:number: 要计算平方根的数字Returns:计算结果"""try:if number < 0:return "错误: 不能计算负数的平方根"result = number ** 0.5return f"计算结果: √{number} = {result}"except Exception as e:return f"计算错误: {str(e)}"if __name__ == "__main__":# 运行SSE服务器print("启动MCP计算器服务器...")print("服务地址: http://localhost:9000/sse")print("可用工具: add, multiply, subtract, divide, calculate, power, sqrt")app.run(transport='sse')
关键转换要点说明
关键变化:
- 添加`@app.tool()`装饰器
- 函数变为`async`异步函数
- 返回类型改为`str`(MCP工具通常返回文本)
- 返回值包含描述性信息
# 原始函数
def add(a: int, b: int) -> int:return a + b# MCP工具
@app.tool()
async def add(a: int, b: int) -> str: # 返回类型改为strresult = a + breturn f"计算结果: {a} + {b} = {result}" # 返回描述性文本
4. 启动测试
启动SSE服务器(支持前端调用):
python3 mcp_demo_sse_server.py
使用MCP Inspector 对MCP server进行调试,MCP Inspector 是一个用于调试和测试 MCP 服务器的工具。
使用 npx 直接运行 MCP Inspector:
在终端中输入以下命令:
npx @modelcontextprotocol/inspector
接下来我们点击connect,并且点击list tools:
可以看到,我们已经连接到我们的mcp server服务,并且已经拿到了一系列工具,接下来随便选一个函数进行执行验证结果:
结果正确,这样我们就完成了一个简单的mcp server的开发。后续就是需要集成到相应的大模型客户端进行使用。
5. 参考材料
【1】https://github.com/liaokongVFX/MCP-Chinese-Getting-Started-Guide