《从零开发 Python MCP Server:打造自己的 AI智能体 Health Tracker 插件》
第一章:为什么我要开发自己的 MCP Server?
1.1 从一个真实需求开始
最近我在减肥,每天都需要记录自己吃了什么、摄入了多少热量。
一开始,我尝试直接使用 AI 智能体。
比如,我告诉它:
今天早餐吃了一根香蕉,中午吃了一碗米饭和一根鸡腿,帮我计算一下热量。
AI 智能体 很快就能给出答案。
它不仅能识别食物,还能根据常见份量估算热量、蛋白质、碳水化合物和脂肪。
这让我产生了一个想法:
既然 AI 智能体 已经具备食物识别和营养估算能力,为什么还要自己开发一套复杂的食物识别系统?
我真正需要解决的,其实是另一个问题:如何把这些数据长期保存下来?
今天记录的饮食,明天还能查询;一个月后,可以统计体重变化和热量摄入情况;如果发现记录有误,还能修改或删除。
我希望最终实现这样的效果。
记录饮食:
今天早上 8 点半吃了一根香蕉,帮我记录。
查询数据:
我昨天一共摄入了多少热量?
修改记录:
昨天中午的米饭不是 200 克,而是 100 克,帮我修改。
删除记录:
删除刚才那条测试饮食记录。
这些操作都通过 AI 智能体 的自然语言界面完成,而数据保存在我自己的数据库中。
1.2 为什么不直接使用 AI 智能体 的记忆功能?
可能有人会问:AI 智能体 本身不是有记忆功能吗?为什么还要开发数据库?
因为聊天记忆与结构化数据存储是两回事。
AI 智能体 的记忆功能主要用于保留与用户有关的长期背景和偏好,并不是专门设计的饮食记录数据库。
例如,我们需要统计:
- 最近 7 天每天摄入多少热量。
- 某一天早餐吃了什么。
- 最近一个月体重变化了多少。
- 删除或修改某条具体的饮食记录。
这些操作需要准确的数据查询和管理能力。
如果将饮食记录保存在 SQLite 中,就可以使用 SQL 精确查询,而不必依赖 AI 智能体 从历史对话中寻找和回忆。
所以,我决定把整个系统拆成两个部分。
AI 智能体 负责理解和分析,Python 程序负责保存和管理数据。
接下来的问题就是:如何让 AI 智能体 调用我们自己编写的 Python 程序?
这就引出了 MCP。
1.3 MCP 到底是什么?
MCP 的全称是 Model Context Protocol,中文通常称为模型上下文协议。
第一次看到这个名字,可能会觉得有些抽象。
我们先不研究协议的技术细节,而是从一个简单的例子理解它。
假设我编写了一个 Python 函数:
def record_food(food_name: str, calories: float):
print(f"记录食物:{food_name},热量:{calories} kcal")
这个函数可以记录食物名称和热量。
但是,AI 智能体 并不能因为这个函数存在,就自动调用它。
原因很简单:AI 智能体 不知道这个函数在哪里,也不知道它接收什么参数,更没有直接执行我电脑上 Python 代码的权限。
我们需要建立一个标准接口,让 AI 智能体 能够发现并调用这个函数。
MCP 就提供了这样一套标准化的通信机制。
我们可以使用 MCP SDK 将 Python 函数注册为工具。
例如:
@mcp.tool()
def record_food(food_name: str, calories: float):
"""记录用户摄入的食物及热量。"""
...
当 AI 智能体 连接到我们的 MCP Server 后,就有机会发现这个工具,理解它的用途,并在适当的时候调用它。
需要注意,MCP 并不会让 AI 智能体 获得任意执行本地代码的权限。模型只能通过客户端提供并授权的工具接口完成操作。
1.4 MCP Server 和 AI 智能体 分别负责什么?
在 Health Tracker 项目中,我希望明确划分职责。
| AI 智能体 | MCP Server |
|---|---|
| 理解自然语言 | 提供可调用的工具 |
| 识别食物名称和数量 | 接收结构化参数 |
| 估算热量和营养成分 | 验证参数 |
| 理解用户的查询需求 | 查询 SQLite 数据库 |
| 分析历史饮食数据 | 新增、修改和删除记录 |
| 用自然语言回答用户 | 返回实际执行结果 |
例如,我告诉 AI 智能体:
今天早餐吃了一根中等大小的香蕉,记录一下。
AI 智能体 可以利用自身的营养知识,估算一根中等大小香蕉的可食重量约为 118 克,热量约为 105 kcal,并进一步估算蛋白质、碳水和脂肪。
随后,它调用我们提供的 record_food 工具。
工具接收到的参数可能类似:
{
"food_name": "香蕉",
"calories": 105,
"weight_g": 118,
"protein_g": 1.3,
"carbs_g": 27,
"fat_g": 0.4,
"meal_type": "breakfast"
}
这些数值属于基于常见份量的估算,并非实际称重或实验室检测结果。
MCP Server 接收参数后,执行数据库写入操作。
保存成功,再将记录 ID 返回给 AI 智能体。
AI 智能体 最后告诉我:
已记录早餐:香蕉 1 根,估计热量 105 kcal。
整个过程中,我们没有调用 OpenAI API 来开发自己的 AI 应用,也没有在 Python 中实现食物识别模型。
我们是让 AI 智能体 调用自己开发的 MCP 工具。
这也是本课程与传统大模型 API 开发课程最大的区别。
1.5 本课程要开发什么?
接下来,我们将使用 Python 开发一个名为 Health Tracker 的 MCP Server,并将它接入 AI 智能体。
系统主要包含四类健康数据:
| 数据类型 | 功能 |
|---|---|
| 饮食记录 | 保存食物、热量、蛋白质、碳水和脂肪 |
| 运动记录 | 保存运动类型、时长和消耗热量 |
| 体重记录 | 记录每天的体重 |
| 断食记录 | 保存断食开始和结束时间 |
在此基础上,我们还会开发数据查询、修改和删除工具。
技术选型如下:
| 技术 | 用途 |
|---|---|
| Python | 编写 MCP Server |
| MCP SDK 2.x | 注册和运行 MCP 工具 |
| SQLite | 持久化存储健康数据 |
| uv | 管理 Python 项目和依赖 |
| MCP Inspector | 本地调试 MCP 工具 |
| OpenAI Tunnel | 将本地 MCP Server 连接到 AI 智能体 |
| Docker | 后续部署到云服务器 |
这里需要特别说明:我们不需要使用 FastAPI,也不需要开发传统 Web 前端。
MCP SDK 本身就可以运行支持 Streamable HTTP 的 MCP Server。
而 AI 智能体 就是我们现成的交互界面。
1.6 本章总结
回顾一下,我们最初只是想解决一个简单的问题:记录每天吃了什么。
但随着需求增加,我们发现,AI 智能体 虽然能够识别食物、估算营养和分析数据,却不能代替一个能够精确查询、修改和持久化记录的数据库系统。
因此,我们决定开发自己的 MCP Server。
它不负责实现 AI 推理,而是向 AI 智能体 提供操作 SQLite 数据库的能力。
最终,我们希望建立这样的关系:
AI 智能体 是智能交互入口,MCP Server 是工具服务,SQLite 是数据存储。
下一章,我们就正式开始动手。
想系统学习这门课程?
你已阅读完本文。需要更完整的知识体系,可以继续了解「Vibe Coding 实战课程」。
查看课程详情