MCP简介
MCP(Model Context Protocol)是Anthropic开发的一个开放协议,用于标准化应用程序如何向大语言模型(LLM)提供上下文。你可以将MCP想象成AI应用的”USB-C接口”,它提供了一种标准化的方式来连接AI模型与不同的数据源和工具。
MCP使用客户端-服务器架构:
- MCP Host:如Claude Desktop等应用程序,需要通过MCP访问数据
- MCP Client:维护与服务器的1:1连接的协议客户端
- MCP Server:通过标准化的MCP协议暴露特定功能的轻量级程序
开始构建Hello World MCP Server
我们将使用Python来构建一个简单的MCP Server,它将提供一个hello工具,可以返回”Hello, World!”或者向特定名称问好。
环境准备
首先,我们需要设置开发环境:
- 确保你已安装Python 3.10或更高版本
- 安装uv工具(Python包和虚拟环境管理工具)
# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# macOS/Linux
curl -sSf https://astral.sh/uv/install.sh | sh
- 创建并设置项目
# 创建项目目录
uv init hello-mcp
cd hello-mcp
# 创建并激活虚拟环境
uv venv
# Windows激活虚拟环境
.venv\Scripts\activate
# macOS/Linux激活虚拟环境
source .venv/bin/activate
# 安装依赖
uv add mcp[cli]
创建Hello World服务器
现在,让我们创建一个简单的MCP服务器。创建一个名为hello_server.py
的文件:
from typing import Optional
from mcp.server.fastmcp import FastMCP
# 初始化FastMCP服务器
mcp = FastMCP("hello-world")
@mcp.tool()
async def hello(name: Optional[str] = None) -> str:
"""
返回一个简单的问候语。
Args:
name: 要问候的名称(可选)
Returns:
str: 问候语
"""
if name:
return f"Hello, {name}!"
else:
return "Hello, World!"
if __name__ == "__main__":
# 初始化并运行服务器
mcp.run(transport='stdio')
FastMCP类使用Python类型提示和docstrings自动生成工具定义,使MCP工具的创建和维护变得简单。
测试服务器
创建完服务器后,我们可以运行它来测试:
uv run hello_server.py
这个命令将启动MCP服务器,但目前还没有任何客户端连接到它。
配置Claude Desktop以使用我们的服务器
为了让Claude Desktop使用我们创建的MCP服务器,我们需要修改Claude Desktop的配置文件:
打开Claude Desktop
打开Claude Desktop的配置文件:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:
%APPDATA%\Claude\claude_desktop_config.json
- macOS:
编辑配置文件,添加我们的服务器:
{
"mcpServers": {
"hello-world": {
"command": "uv",
"args": [
"--directory",
"/绝对路径/到你的/hello-mcp",
"run",
"hello_server.py"
]
}
}
}
请确保将/绝对路径/到你的/hello-mcp
替换为你实际的项目目录的绝对路径。
- 保存文件并重启Claude Desktop
重启后,你应该能在Claude Desktop的输入框下方看到锤子图标,点击它会显示可用工具,其中包括我们创建的”hello”工具。
测试我们的Hello World服务器
在Claude Desktop中,你可以通过以下方式测试我们的服务器:
- 输入:”你能用hello工具向我问好吗?”
- Claude应该会请求权限调用hello工具,然后返回”Hello, World!”
- 你也可以尝试:”你能用hello工具向’小明’问好吗?”
- Claude应该会返回”Hello, 小明!”
深入理解MCP的工作原理
通过这个简单的例子,我们可以理解MCP的一些核心概念:
1. MCP服务器结构
MCP服务器由以下部分组成:
- 服务器标识:我们定义了名为”hello-world”的服务器
- 工具定义:我们创建了”hello”工具
- 工具实现:我们实现了工具的功能
2. MCP交互流程
当你在Claude Desktop中请求使用工具时,发生了以下步骤:
- Claude分析你的请求并决定使用哪个工具
- Claude请求用户权限调用该工具
- 请求发送到MCP服务器
- 服务器执行工具功能并返回结果
- Claude接收结果并形成自然语言响应
3. MCP工具定义
FastMCP使用Python类型提示和docstrings自动生成工具定义:
- 函数名称成为工具名称
- 参数类型定义了输入架构
- 返回类型定义了输出格式
- Docstring提供了工具的描述
进阶扩展
现在你已经理解了基本概念,我们可以扩展这个Hello World服务器,添加更多功能:
添加更多工具
我们可以添加更多工具到我们的服务器,例如一个简单的计算器工具:
@mcp.tool()
async def calculate(expression: str) -> str:
"""
计算一个简单的数学表达式。
Args:
expression: 要计算的数学表达式(如"1 + 2")
Returns:
str: 计算结果
"""
try:
result = eval(expression)
return f"计算结果: {result}"
except Exception as e:
return f"计算错误: {str(e)}"
添加资源支持
MCP不仅支持工具,还支持资源。我们可以添加一个简单的资源:
import mcp.types as types
@mcp.list_resources()
async def list_resources() -> list[types.Resource]:
"""列出可用资源"""
return [
types.Resource(
uri="hello://example",
name="示例资源",
description="一个简单的示例资源"
)
]
@mcp.read_resource()
async def read_resource(uri: str) -> str:
"""读取资源内容"""
if uri == "hello://example":
return "这是一个示例资源的内容"
raise ValueError(f"未知资源: {uri}")
总结
通过这个Hello World级别的MCP服务器,我们学习了:
- MCP的核心概念(服务器、客户端、工具、资源)
- MCP服务器的基本结构和实现方法
- 如何连接MCP服务器到Claude Desktop
- MCP交互的基本流程
MCP是一个强大的协议,允许AI模型安全地访问外部数据和功能。通过创建自定义MCP服务器,你可以扩展AI助手的能力,使其能够与你的应用程序、数据和工具进行交互。
随着你对MCP的深入理解,你可以探索更复杂的使用场景,如数据库访问、API集成、文件系统操作等。MCP的模块化设计使得你可以根据需要选择和组合不同的功能,创建强大的AI集成解决方案。