跳到主要内容

《从零开发 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 实战课程」。

查看课程详情