Model Context Protocol 允许 AI 助手以标准方式与外部工具交互。教程演示用 FastMCP(Python)构建带 get_notes 和 add_note 两个工具的笔记服务器,通过 LocalTunnel 暴露 HTTPS,再接入 Claude 作为自定义连接器。
Model Context Protocol(MCP)使 AI 助手能够以标准化的方式与外部工具和数据源进行交互。
本教程中,我们将使用 FastMCP 构建一个简单的 MCP 服务器,通过 LocalTunnel 将其暴露为 HTTPS,并将其作为自定义连接器连接到 Claude。
我们的示例是一个简单的笔记服务器,包含两个工具:
get_notes — 获取已保存的笔记add_note — 添加新笔记到本教程结束时,Claude 将能够从我们的 MCP 服务器读取数据并向其写入数据。
Claude
│
│ MCP
▼
HTTPS Tunnel
│
▼
FastMCP Server
│
▼
Mock Database
为简单起见,我们将使用一个内存中的列表作为数据库。在实际应用中,你可以将其替换为 PostgreSQL、SQLite、MongoDB 或其他数据库。
首先创建一个 Python 虚拟环境:
python3 -m venv venv
在 macOS/Linux 上激活它:
source venv/bin/activate
使用 pip 安装 FastMCP:
pip install fastmcp
FastMCP 让使用 Python 创建 MCP 服务器变得非常简单,无需自己实现 MCP 协议。
创建一个名为 main.py 的文件。
首先导入 FastMCP 并创建一个 MCP 服务器:
from fastmcp import FastMCP
mcp = FastMCP("Simple Note Taker")
对于本教程,我们将使用一个简单的 Python 列表作为临时数据库:
notes = [
{
"id": 0,
"text": "Remember to deploy server"
},
{
"id": 1,
"text": "Eat Apple at 5 PM"
}
]
现在我们有了两条初始笔记。
FastMCP 允许我们使用 @mcp.tool 装饰器将普通 Python 函数转换为 MCP 工具。
@mcp.tool
def get_notes() -> str:
output = ""
for note in notes:
output += f"Note #{note['id']}: {note['text']}\n"
return output
这个函数遍历我们的笔记并将它们作为字符串返回。
接下来,让我们创建一个允许 Claude 添加新笔记的工具。
@mcp.tool
def add_note(text: str) -> str:
new_id = len(notes)
notes.append({
"id": new_id,
"text": text
})
return f"Successfully saved note #{new_id}"
该函数接受笔记文本,生成一个新 ID,存储笔记,然后返回一条成功消息。
现在我们的 MCP 服务器暴露了两个工具:
我们希望 MCP 服务器在 8000 端口上通过 HTTP 运行。
将以下内容添加到 main.py 的底部:
if __name__ == "__main__":
mcp.run(
transport="http",
host="0.0.0.0",
port=8000
)
完整的 main.py 如下:
from fastmcp import FastMCP
mcp = FastMCP("Simple Note Taker")
notes = [
{
"id": 0,
"text": "Remember to deploy server"
},
{
"id": 1,
"text": "Eat Apple at 5 PM"
}
]
@mcp.tool
def get_notes() -> str:
output = ""
for note in notes:
output += f"Note #{note['id']}: {note['text']}\n"
return output
@mcp.tool
def add_note(text: str) -> str:
new_id = len(notes)
notes.append({
"id": new_id,
"text": text
})
return f"Successfully saved note #{new_id}"
if __name__ == "__main__":
mcp.run(
transport="http",
host="0.0.0.0",
port=8000
)
python3 main.py
FastMCP 应该开始在 8000 端口上监听。
我们的 MCP 服务器现在在本地运行。
但是 Claude 无法直接访问 localhost:8000,因此我们需要通过 HTTPS URL 将其暴露出去。
本教程中我们将使用 LocalTunnel。
npm install -g localtunnel
然后创建指向 8000 端口的隧道:
lt --port 8000
LocalTunnel 会提供一个类似于以下内容的 HTTPS URL:
https://your-generated-url.loca.lt
在使用 MCP 服务器期间,保持 LocalTunnel 进程运行。
注意:LocalTunnel 适用于开发和教程。对于生产环境,请使用带有适当身份验证和安全控制的正确托管 HTTPS 端点。
现在让我们将 MCP 服务器连接到 Claude。
Customize → Connectors
添加自定义连接器
为连接器命名,例如:
Custom Todo
对于远程服务器 URL,输入你的 LocalTunnel URL 并加上 MCP 端点:
https://your-generated-url.loca.lt/mcp
Claude 将尝试连接到你的 MCP 服务器。
如果连接成功,Claude 应该能发现这两个工具:
add_note
get_notes
批准这些工具以便 Claude 可以使用它们。
回到 Claude 聊天并询问:
Show me my notes.
Claude 应该会调用 get_notes MCP 工具。
你应该会收到类似于以下内容的响应:
Note #0: Remember to deploy server
Note #1: Eat Apple at 5 PM
重要的一点是,Claude 实际上是在调用我们的 MCP 服务器来获取此信息。
现在让我们添加一条新笔记。
Add a new note: Research MCP authentication.
Claude 应该会识别出 add_note 是合适的 MCP 工具,并使用提供的文本调用它。
服务器会将笔记添加到内存数据库中。
Show me my notes.
Note #0: Remember to deploy server
Note #1: Eat Apple at 5 PM
Note #2: Research MCP authentication.
我们已成功创建了一个 MCP 服务器并将其连接到 Claude。
以下是你让 Claude 添加笔记时发生的情况:
You
│
│ "Add a new note..."
▼
Claude
│
│ MCP tool call
▼
HTTPS LocalTunnel URL
│
▼
FastMCP Server
│
│ add_note()
▼
Mock Database
│
│ result
▼
Claude
这就是 MCP 的核心思想:AI 助手可以通过标准化协议发现并与外部工具进行交互。
我们的示例使用了一个 Python 列表:
notes = [...]
这对于学习来说没问题,但当服务器重启时数据会丢失。
真实的应用程序可以使用持久化数据库,例如 PostgreSQL 或 SQLite:
FastMCP Server
│
├── get_notes()
│ │
│ ▼
│ Database
│
└── add_note()
│
▼
Database
你也可以添加更多工具:
到了这一步,你就有了 proper AI 驱动的任务或笔记管理系统的基础。
LocalTunnel 设置非常适合实验,但在将 MCP 服务器部署到生产环境之前,你应该采取额外的预防措施。
当 AI 助手有代表你执行操作的权限时,这一点尤为重要。
本教程中,我们使用 FastMCP 构建了一个简单的 MCP 服务器,并将其连接到 Claude。
get_notes 和 add_note 工具这个示例是故意简化的,但相同的模式可用于向 AI 助手暴露 API、数据库、内部服务、自动化工作流和其他能力。
这就是 MCP 的强大之处:你可以给 AI 模型提供能力,而不仅仅是信息。
如果你正在尝试 MCP,从小处着手。构建一个有用的工具,将其连接到 MCP 客户端,然后根据你的用例发展扩展服务器。