当前位置: 首页 > news >正文

【大模型实战篇】从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

http://www.dtcms.com/a/461176.html

相关文章:

  • 怎样增加网站的权重小企业做网站有用吗
  • 【ArkTS-通用事件】
  • 为什么要放弃用Docker?
  • 东方仙盟修仙(五)赛博科技修仙养老是一种爱好
  • 大模型训练过程中主动学习和课程学习的全面对比
  • Redis数据库隔离业务缓存对查询性能的影响分析
  • Mapper接口的解析
  • 网站中链接怎么做的广东网站建设案例
  • 网站开发部门结构公司做网站的费用属于什么费用
  • 做电影方面的网站怎么做外贸免费平台
  • transformers音频实战02-基于 Speech Commands 数据集的语音识别实战项目全流程
  • 天津做网站美工锦州网站建设信息
  • Terraform + RustFS 实战:10分钟实现对象存储 IaC 化,运维效率提升300%
  • 遇到RabbitMQ 的 `channel_max` 限制报错
  • 机器学习实战项目:Python+Flask 汽车销量分析可视化系统(requests爬车主之家+可视化 源码+文档)✅
  • 惠州城乡建设部网站印刷包装公司网站模板
  • WEB前端 JavaScript 学习笔记
  • 如何使用Python实现LRU缓存
  • OSCP渗透实战(第二期):Linux系统攻防与权限提升完全指南
  • LeetCode 118. 杨辉三角
  • AI原生应用架构白皮书 - AI原生应用架构及其关键要素
  • 蓝绿发布与金丝雀发布策略简介_笔记
  • 流媒体视频技术在明厨亮灶场景中的深度应用
  • 建设网站是否需要一个主机全球邮企业邮箱登录
  • 余弦相似度凭什么成了文本推荐的“方向指南针”?从几何夹角到语义匹配的AI密码
  • 解决Docker Hub被封的问题
  • 基于android的中天模拟键盘APP的设计与实现(初稿)
  • 数据结构——十七、线索二叉树找前驱与后继
  • 数据结构-----栈队列
  • 兰州网站制作有哪些怎样下载字体到wordpress