云计算百科
云计算领域专业知识百科平台

【大模型实战篇】从Python函数到MCP服务器:完整转换示例

1. 项目背景

        本文展示如何将普通的Python函数转换为MCP(Model Context Protocol)服务器,并使用MCP Inspector进行测试的完整过程。这个过程展示了AI工具开发的标准化流程。

2. 起点:普通Python函数

        我们从最简单的Python函数开始:

# 原始的普通Python函数
def add(a: int, b: int) -> int:
"""两个数相加"""
return a + b

def multiply(a: float, b: float) -> float:
"""两个数相乘"""
return a * b

def calculate(expression: str) -> float:
"""计算数学表达式"""
return eval(expression)

# 本地测试
if __name__ == "__main__":
print(add(10, 5)) # 15
print(multiply(3.5, 2.0)) # 7.0
print(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 + b
return 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 * b
return 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 – b
return 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 / b
return 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 ** exponent
return 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.5
return 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: # 返回类型改为str
result = a + b
return 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

赞(0)
未经允许不得转载:网硕互联帮助中心 » 【大模型实战篇】从Python函数到MCP服务器:完整转换示例
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!