什么是 MCP?用一个“奶茶助手”做出你的第一个 MCP 服务
MCP 的全称是 Model Context Protocol,中文通常译为“模型上下文协议”。
它解决的问题很简单:大模型想查数据库、读文件、调用 API、运行工具时,过去每接一个系统都要单独开发;MCP 提供了一套统一的连接方式,让 AI 应用可以像插 USB-C 一样接入不同的工具和数据源。MCP 官方介绍
一句话理解:
Function Calling 是模型“提出调用工具的请求”,MCP 是让不同工具以统一方式被 AI 应用发现和调用的标准。
MCP 由谁组成?
一个典型 MCP 系统有三部分:
用户
→ AI 应用(Host)
→ MCP Client
→ MCP Server
→ 数据库、文件、业务 API
- Host:用户实际使用的 AI 应用,例如聊天助手、IDE 或 Agent;
- MCP Client:Host 内部负责和 MCP Server 通信的客户端;
- MCP Server:你开发的服务,向 AI 暴露特定能力。
MCP 通常基于 JSON-RPC 通信。连接建立后,客户端与服务端会先协商能力,再进入正常调用阶段。MCP 生命周期规范
MCP 服务可以提供什么?
MCP 服务主要可以暴露三类能力:
| 能力 | 作用 | 例子 |
|---|---|---|
| Resources | 提供可读取的上下文数据 | 文件、数据库结构、系统状态 |
| Prompts | 提供可复用的提示词模板 | “生成日报”“分析异常” |
| Tools | 提供可执行的函数 | 查库存、调用 API、创建工单 |
官方规范将它们分别定义为:资源、提示词和工具;其中工具可用于查询数据库、调用 API 或进行计算。MCP 功能概览 MCP Tools 规范
做一个好玩的例子:奶茶助手 MCP
假设你有一家虚拟奶茶店,想让 AI 能回答:
现在珍珠奶茶还有吗? 我今天加班很累,推荐喝什么? 帮我查一下芋泥波波的价格。
可以做一个 MCP Server,提供两个工具:
check_stock(drink_name) # 查询库存
recommend_drink(mood) # 按心情推荐饮品
用 Python 伪代码表示,核心逻辑大致如下:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("奶茶助手")
MENU = {
"珍珠奶茶": {"stock": 12, "price": 15},
"芋泥波波": {"stock": 0, "price": 18},
"柠檬茶": {"stock": 20, "price": 12}
}
@mcp.tool()
def check_stock(drink_name: str) -> dict:
"""查询某款饮品的库存和价格。"""
drink = MENU.get(drink_name)
if not drink:
return {"found": False, "message": "菜单中没有这款饮品"}
return {
"found": True,
"drink_name": drink_name,
"stock": drink["stock"],
"price": drink["price"]
}
@mcp.tool()
def recommend_drink(mood: str) -> str:
"""根据用户状态推荐饮品。"""
if mood in ["困", "加班", "疲惫"]:
return "推荐柠檬茶:清爽一些,适合提神。"
if mood in ["开心", "庆祝"]:
return "推荐珍珠奶茶:来点甜的庆祝一下。"
return "推荐少糖珍珠奶茶。"
if __name__ == "__main__":
mcp.run()
当 AI 应用连接这个 MCP Server 后,它会发现这里有两个工具。用户问“芋泥波波还有吗”时,模型会提出调用:
{
"name": "check_stock",
"arguments": {
"drink_name": "芋泥波波"
}
}
服务端返回库存为 0,模型再自然地回答:
芋泥波波目前缺货,暂时无法购买;可以考虑珍珠奶茶或柠檬茶。
这就是 MCP 的基本工作方式。
一个 MCP Server 的实现步骤
实现时可以按下面思路推进:
1. 确定 AI 需要什么能力
2. 把能力设计成小而明确的工具
3. 定义每个工具的输入参数和返回结果
4. 在工具内部连接真实数据库或 API
5. 配置客户端连接 MCP Server
6. 测试正常、异常和越权场景
例如,真正的企业场景中,你可以做:
- “查订单” MCP;
- “公司制度问答” MCP;
- “读取实验仪器状态” MCP;
- “查询销售数据并生成图表” MCP;
- “从 Git 仓库读取代码、创建 Issue” MCP。
MCP 和 RAG、Agent 有什么关系?
三者经常一起用,但职责不同:
RAG:从知识库中检索资料
MCP:标准化连接外部工具和数据
Agent:规划步骤、决定调用什么工具
例如用户说:
找出本月销售下降的原因,并生成报告。
Agent 会规划任务; 它可能通过 MCP 调用销售数据库、库存系统和报表服务; 也可能通过 RAG 检索促销方案、会议纪要和客户反馈; 最后由大模型生成报告。
所以,MCP 不是 RAG 的替代品,而是让 Agent 能更方便地连接 RAG、数据库、文件系统和业务 API 的“统一接口”。
做 MCP 时最重要的四个原则
工具要小,不要万能。
不要直接提供 run_any_sql(sql),而应提供 get_monthly_sales(month)、get_product_inventory(product_id) 这类明确工具。
模型没有最终权限。 模型可以提出调用请求,但服务端必须校验参数、用户身份和权限。查询工具可自动执行;删除数据、退款、发邮件等操作应要求用户确认。
不要让模型猜关键参数。 订单号、收件人、金额、客户 ID 不明确时,应追问用户或给出候选项,而不是自行猜测。
所有调用都应可追溯。 记录谁调用了什么工具、使用了哪些参数、结果是什么、是否失败或被拒绝。
结语
MCP 的价值不在于让模型“获得更多权限”,而在于让 AI 与外部世界的连接变得标准、可复用、可控。
从一个“奶茶助手”开始,你就已经能理解它的核心:把真实能力封装为规范工具,让 AI 在授权范围内发现、调用并利用这些能力。