MCP服务器评估:初学者指南
*了解AI代理如何使用工具以及为什么模型上下文协议(MCP)改变了一切的简单指南。*
______________________________________________________________________
目录
______________________________________________________________________
1.问题是什么?(在MCP之前)
AI代理需要工具来做真正的工作:
- 从计算机读取文件
- 搜索网页
- 查询数据库
但在MCP之前,每个工具都有 不同的规则没有共同的语言。这导致了四个严重的问题:
| 问题 | 这意味着什么 |
|---|---|
| 没有共享规则 | 每个工具都使用不同的API格式。人工智能必须为每种工具学习新规则。 |
| 假支票 | 测试人员只阅读AI的文本答案。他们没有检查工作是否真的完成了。 |
| 没有公平的比较 | 你无法公平地比较两个AI代理,因为每个测试都使用不同的工具和规则。 |
| 无成本跟踪 | 没有人仔细追踪人工智能浪费了多少钱或时间。 |
简言之: 在MCP之前,没有通用的插头。每个工具都有自己的插座。
______________________________________________________________________
2.什么是MCP?(MCP之后)
MCP=模型上下文协议
将MCP视为 USB-C线缆 AI工具。
- 之前:每部手机都有不同的充电器。
- 之后:一根电缆可以装很多手机。
MCP创建 一本规则手册 所有工具都可以遵循。
发生了什么变化?
| 问题 | MCP之前 | MCP之后 |
|---|---|---|
| 所有工具都使用相同的规则吗? | 没有 | 是 |
| 测试人员是否检查真实结果? | 通常没有 | 是 |
| AI可以同时使用多种工具吗? | 很少测试 | 是的,标准做法 |
| 他们追踪金钱和时间吗? | 不是真的 | 是 |
| 故障是否解释清楚? | 只有“通过”或“失败” | 详细的错误类型 |
简言之: 在MCP之后,我们使用一个规则手册来检查实际结果。
______________________________________________________________________
3.人工智能代理是如何分级的?
测试人员询问 三个基本问题 当他们评估MCP试剂时:
1.它完成工作了吗?
- AI是否完成了全部任务?
- 最终结果真的正确吗?
2.它选对工具了吗?
- 它选择了正确的工具吗?
- 它是否按照正确的顺序使用它们?
- 它是否传递了正确的参数和设置?
3.它便宜又快吗?
- 代币成本: 它在对话中使用了太多的单词(标记)吗?
- 时间成本: 完成的时间太长了吗?
- 资金成本: 它是否浪费了API调用预算?
所有其他指标都只是这三个问题的细节。
______________________________________________________________________
4.常见故障模式
当MCP代理失败时,它们通常会以三种方式之一失败:
| 故障类型 | 发生了什么 | 示例 |
|---|---|---|
| 内容错误 | 人工智能创造了一些东西,但里面的数据被破坏了。 | 它写了一个CSV文件,但有些电子邮件丢失或拼写错误。 |
| 中途卡住 | 人工智能开始了这项任务,但无法完成一个艰难的步骤。 | 它登录了一个网站,但被“机器人检查”卡住了 |
| 忘了最后一部分 | AI完成了90%的工作,但错过了最后一步。 | 它创建了一个数据库表和列,但忘记插入所需的行。 |
______________________________________________________________________
5.为什么人工智能会猜错或卡住?
在我们的代码演示中,您看到OpenAI有时会猜错数据库表或列。以下是发生这种情况的原因:
AI看不到你的电脑
AI生活在云端。它无法看到您的真实文件、表格或网站。它只读 文本说明 如果你的描述含糊不清,人工智能会 猜测.
例子: 在我们的演示中,OpenAI猜测了一个名为 smartphones,但真正的桌子是 products它还猜测了一个 category 不存在的列。
修复: 写出非常清晰的工具描述。提及确切的表名、列名和数据格式。
人工智能一步一个脚印地思考
在每一轮中,AI只决定 下一步行动它一开始没有计划整个旅程。这意味着它可以:
- 忘记最初的目标
- 早点停下来,以为已经完成了
- 尝试错误的SQL查询,需要多次尝试才能自行修复
AI有点随机
即使是同一个问题,人工智能每次的答案也可能不同。这是由控制的 温度更高的温度=更多的创造力和随机性。较低的温度=更多的重复性和可预测性。
AI无法分辨错误与空结果
看看这两个输出:
| 输出 | 含义 | AI会重试吗? |
|---|---|---|
DB error: no such column: rating | SQL错误 | 是 |
DB result: [] | SQL正常工作,但没有匹配项 | 不 |
当AI看到 错误,它知道自己犯了错误,并再次尝试。当它看到 [] (空列表),它认为“找到零结果”并停止。在我们的演示中,OpenAI搜索 WHERE name LIKE '%smartphone%',得到 [],并放弃了——尽管 iPhone 15 是一部智能手机。
______________________________________________________________________
6.MCP与HTTP
MCP和HTTP不是一回事。
超文本传输协议
HTTP=超文本传输协议。它是网络的通用语言。您的浏览器使用它来加载网站。API使用它来发送数据。它携带任何东西:网页、图像、视频、JSON数据。
主控程序
MCP=模型上下文协议。它是 专门用于AI代理它定义了:
- 如何描述工具
- 人工智能如何问:“你有什么工具?”
- AI如何说:“用参数Y调用工具X”
- 如何以标准格式发回结果
关系
MCP可以在HTTP之上运行,但它也可以在其他运输工具上运行。这样想:
| 协议 | 类比 |
|---|---|
| 超文本传输协议 A. 公共道路任何车辆都可以使用它 | |
主控程序 A. 供货合同。它定义了包裹必须如何标记、跟踪和交付。卡车可以在路上行驶(HTTP)或穿过私人走廊(stdio). |
在我们的 real_example/ 代码,我们使用 stdio (标准输入/输出)而不是HTTP。MCP服务器作为一个小程序在同一台计算机上运行,客户端通过文本管道与之通信。我们选择了 stdio 因为它更简单——没有端口,没有网络设置,没有防火墙问题。
摘要: HTTP是一条路。MCP是一组用于AI代理的流量规则。
______________________________________________________________________
7.服务器、工具和客户端如何连接
这是初学者最困惑的部分。以下是我们的确切流程 real_example/after_mcp_real.py 代码。
步骤1:创建服务器对象
mcp = FastMCP("SmartphoneHelper")这将构建一个服务器容器。起初它是空的。
第二步:注册工具
@mcp.tool()
def google_search(query: str) -> str:
...这将向服务器的内部注册表添加一个工具。这 mcp 对象现在会记住 google_search.
步骤3:启动服务器
mcp.run(transport='stdio')这将服务器作为实时进程启动。它在标准输入上监听JSON消息,并在标准输出上回复。
步骤4:客户端连接
async with stdio_client(server) as (read, write):
async with ClientSession(read, write) as session:
tools_response = await session.list_tools()客户端打开连接并询问服务器: “你有什么工具?”
步骤5:服务器回复
服务器读取其内部注册表(所有函数都用 @mcp.tool())并返回列表。然后,客户端可以通过标准协议调用任何工具。
可视化图表
┌─────────────────────────────────────────────────────────────┐
│ YOUR PYTHON SCRIPT │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ OpenAI Client │ │ MCP Client │ │
│ │ ( decides what │◄────────►│ ( talks to the │ │
│ │ to do next ) │ │ server ) │ │
│ └──────────────────┘ └────────┬─────────┘ │
└─────────────────────────────────────────┼───────────────────┘
│
│ stdio pipe
│ (text messages)
│
▼
┌─────────────────────────────────────────────────────────────┐
│ MCP SERVER PROCESS │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ mcp = FastMCP("...") │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌───────────┐ │ │
│ │ │ @mcp.tool() │ │ @mcp.tool() │ │ ... │ │ │
│ │ │ google_search│ │ query_db │ │ (more) │ │ │
│ │ └──────────────┘ └──────────────┘ └───────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘消息流示例
Step 1: Client asks for the menu
┌────────┐ ┌────────┐
│ Client │ ── list_tools() ─►│ Server │
└────────┘ └────────┘
│
▼
Reads @mcp.tool() registry
Step 2: Server replies with tools
┌────────┐ ┌────────┐
│ Client │ ◄── {google_search, query_db} ─│ Server │
└────────┘ └────────┘
Step 3: Client asks to run a tool
┌────────┐ ┌────────┐
│ Client │ ── call_tool("query_db") ─►│ Server │
└────────┘ └────────┘
│
▼
Runs Python function
Step 4: Server sends back result
┌────────┐ ┌────────┐
│ Client │ ◄── "DB result: [...]" ─│ Server │
└────────┘ └────────┘重点: @mcp.tool() 仅在内部注册该工具 mcp 对象。什么都不会发生,直到 mcp.run() 启动服务器,以及 stdio_client 装饰器、服务器和客户端是一个链中的三个环节。
______________________________________________________________________
8.代码示例
您可以在 real_example/ 文件夹:
| 文件 | 显示内容 |
|---|---|
before_mcp_real.py | 旧方法:手动工具定义、手动路由、硬编码JSON模式。 |
after_mcp_real.py | 新方法:FastMCP服务器、自动工具发现、标准协议调用。 |
demo_db_setup.py | 创建一个简单的SQLite数据库进行测试。 |
跑 before_mcp_real.py 和 after_mcp_real.py 并肩而立,感受差异。
______________________________________________________________________
9.快速检查表
当您测试或构建MCP代理时,请问以下六个问题:
- 它是否遵循MCP规则?
- 它真的完成了任务,还是只是说说而已?
- 它可以同时使用2个或3个工具吗?
- 如果它失败了,你确切地知道原因吗?
- 它又快又便宜吗?
- 这项任务感觉像是真正的人类工作吗?
______________________________________________________________________
10.接下来要学习什么
- 如何在演示中添加第三个工具
- GitHub和Notion MCP现实世界示例
- 如何阅读MCP基准测试论文
- 如何通过HTTP部署MCP服务器以供远程使用
注:
- 字体变化
- 没有训练数据,没有人会谈论它。
1.
