构建 MCP 服务器:将 Claude 和 VSCode 连接到外部工具
Source: Dev.to
介绍
模型上下文协议(MCP)是 Anthropic 开发的一个开放协议,允许像 Claude 这样的 AI 助手连接外部数据源和工具。本文将手把手教你构建自己的 MCP 服务器,供 Claude Desktop、VSCode 以及其他兼容客户端使用。
什么是 MCP?
MCP 为 AI 助手与外部系统交互提供了标准化的方式。可以把它看作一个通用适配器,使 Claude 能够:
- 访问数据库和 API
- 读取和写入文件
- 执行命令
- 与 Web 服务交互
该协议定义了客户端‑服务器架构,其中:
- MCP 客户端(如 Claude Desktop 或 VSCode)连接到服务器。
- MCP 服务器暴露特定的能力(资源、工具和提示)。
- 通信通过 JSON‑RPC 2.0 在 stdio 或 HTTP 上进行。
架构概览
MCP 服务器由三个主要组件组成:
资源
资源是服务器可以向客户端提供的数据来源。可以是:
- 文件系统中的文件
- 数据库记录
- API 响应
- 实时数据流
工具
工具是客户端可以通过服务器调用的功能:
- 执行系统命令
- 进行计算
- 与外部 API 交互
- 操作数据
提示
提示是预定义的模板,帮助结构化交互:
- 查询模板
- 命令模式
- 工作流指令
构建你的第一个 MCP 服务器
让我们一步步构建一个简单的 MCP 服务器。示例使用 Python,但 MCP 服务器可以用任何语言实现。
前置条件
pip install mcp
服务器基本结构
from mcp.server import Server
from mcp.types import Resource, Tool
import asyncio
app = Server("my-mcp-server")
@app.list_resources()
async def list_resources() -> list[Resource]:
return [
Resource(
uri="file:///example.txt",
name="Archivo de Ejemplo",
mimeType="text/plain"
)
]
@app.read_resource()
async def read_resource(uri: str) -> str:
if uri == "file:///example.txt":
return "¡Hola desde el Servidor MCP!"
raise ValueError(f"Recurso desconocido: {uri}")
@app.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="saludar",
description="Saludar a alguien por su nombre",
inputSchema={
"type": "object",
"properties": {
"nombre": {"type": "string"}
},
"required": ["nombre"]
}
)
]
@app.call_tool()
async def call_tool(name: str, arguments: dict) -> str:
if name == "saludar":
return f"¡Hola, {arguments['nombre']}!"
raise ValueError(f"Herramienta desconocida: {name}")
if __name__ == "__main__":
asyncio.run(app.run())
连接 Claude Desktop
要在 Claude Desktop 中使用你的 MCP 服务器,在 Claude 设置的 Developer 部分进行配置:
{
"mcpServers": {
"mi-servidor": {
"command": "python",
"args": ["ruta/a/tu/servidor.py"]
}
}
}
重启 Claude Desktop 后,你的服务器提供的工具和资源就会出现在 Claude 中。
连接 VSCode
在 VSCode 中集成 MCP,使用 MCP 扩展:
- 从 Marketplace 安装 MCP 扩展。
- 在
.vscode/mcp.json中配置你的服务器:
{
"servers": [
{
"name": "mi-servidor",
"command": "python",
"args": ["ruta/a/tu/servidor.py"]
}
]
}
真实场景用例
访问数据库
创建一个服务器,让 Claude 安全地查询数据库:
@app.list_tools()
async def list_tools():
return [Tool(name="consultar_bd", description="Ejecutar consultas SQL")]
文件系统操作
构建一个服务器来管理项目文件:
@app.list_resources()
async def list_resources():
return [Resource(uri=f"file:///{archivo}") for archivo in os.listdir()]
与 API 集成
将 Claude 连接到外部 API:
@app.call_tool()
async def call_tool(name, args):
if name == "obtener_datos":
response = await http_client.get(args['url'])
return response.json()
最佳实践
- 安全第一:验证输入并对输出进行清理。
- 错误处理:提供清晰的错误信息。
- 文档:详尽记录你的工具和资源。
- 性能:使用
async/await处理 I/O 操作。 - 测试:在不同客户端上测试你的服务器。
示例仓库
你可以在我的 GitHub 仓库中找到完整可运行的示例:
仓库:
该仓库包含:
- 基础 MCP 服务器实现
- Claude 与 VSCode 的配置示例
- 文档和配置说明
- 示例用例
结论
构建 MCP 服务器为扩展 AI 助手的能力打开了无限可能。无论是连接数据库、文件系统还是外部 API,MCP 都提供了一种标准且强大的方式,让你的数据和工具对 AI 可用。
模型上下文协议仍在持续演进,生态系统也在快速成长。通过创建自己的 MCP 服务器,你可以定制 Claude 以及其他兼容客户端,以满足特定需求和工作流。