MCP官方教程(1)

1,613 阅读25分钟

light logo

introduction

MCP 是一个开放协议,旨在标准化应用程序如何为 LLMs 提供上下文。你可以将 MCP 想象为 AI 应用的 USB-C 接口。正如 USB-C 提供了一种标准化的方式来连接你的设备到各种外设和配件,MCP 提供了一种标准化的方式来连接 AI 模型到不同的数据源和工具。

为什么选择 MCP?

MCP 帮助你在 LLMs 之上构建代理和复杂的工作流。LLMs 经常需要与数据和工具集成,而 MCP 提供了:

  • 一个不断增长的预构建集成列表,你的 LLM 可以直接插入
  • 在不同 LLM 提供商和供应商之间切换的灵活性
  • 在你的基础设施内保护数据的最佳实践

通用架构

MCP 的核心遵循客户端-服务器架构,其中主机应用程序可以连接到多个服务器:

image.png

  • MCP 主机:如 Claude Desktop、IDE 或 AI 工具,希望通过 MCP 访问数据的程序
  • MCP 客户端:与服务器保持 1:1 连接的协议客户端
  • MCP 服务器:通过标准化的 Model Context Protocol 暴露特定功能的轻量级程序
  • 本地数据源:你的计算机文件、数据库和服务,MCP 服务器可以安全访问
  • 远程服务:通过互联网(例如通过 API)可用的外部系统,MCP 服务器可以连接

For Server Developers

在本教程中,我们将构建一个简单的MCP天气服务器,并将其连接到主机Claude for Desktop。我们将从基本设置开始,然后逐步深入到更复杂的用例。

我们将构建什么

许多LLM(包括Claude)目前还没有获取天气预报和恶劣天气警报的能力。让我们使用MCP来解决这个问题!

我们将构建一个暴露两个工具的服务器:get-alertsget-forecast。然后,我们将服务器连接到MCP主机(在本例中为Claude for Desktop):

image.png

image.png

注意:服务器可以连接到任何客户端。我们在这里选择Claude for Desktop是为了简单起见,但我们也有关于构建自己的客户端的指南,以及其他客户端的列表

核心MCP概念

MCP服务器可以提供三种主要类型的功能:

  1. 资源:客户端可以读取的类似文件的数据(如API响应或文件内容)
  2. 工具:LLM可以调用的函数(需要用户批准)
  3. Prompts:帮助用户完成特定任务的预写模板

本教程将主要关注工具。

开始构建我们的天气服务器

让我们开始构建我们的天气服务器!你可以在这里找到我们将要构建的完整代码。

先决知识

本快速入门假设你熟悉:

  • Python
  • 像Claude这样的LLM
系统要求
  • 已安装Python 3.10或更高版本。
  • 你必须使用Python MCP SDK 1.2.0或更高版本。
设置你的环境

首先,让我们安装uv并设置我们的Python项目和环境:

curl -LsSf https://astral.sh/uv/install.sh | sh

确保之后重新启动终端,以确保uv命令被正确识别。

现在,让我们创建并设置我们的项目:

# Create a new directory for our project
uv init weather
cd weather

# Create virtual environment and activate it
uv venv
.venv\Scripts\activate

# Install dependencies
uv add mcp[cli] httpx

# Create our server file
new-item weather.py

现在让我们深入构建你的服务器。

构建你的服务器

导入包并设置实例

将这些添加到你的weather.py文件的顶部:

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP

# Initialize FastMCP server
mcp = FastMCP("weather")

# Constants
NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"

FastMCP类使用Python类型提示和文档字符串自动生成工具定义,使得创建和维护MCP工具变得容易。

帮助函数

接下来,让我们添加用于查询和格式化来自国家气象局API数据的辅助函数:

async def make_nws_request(url: str) -> dict[str, Any] | None:
    """Make a request to the NWS API with proper error handling."""
    headers = {
        "User-Agent": USER_AGENT,
        "Accept": "application/geo+json"
    }
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, headers=headers, timeout=30.0)
            response.raise_for_status()
            return response.json()
        except Exception:
            return None

def format_alert(feature: dict) -> str:
    """Format an alert feature into a readable string."""
    props = feature["properties"]
    return f"""
Event: {props.get('event', 'Unknown')}
Area: {props.get('areaDesc', 'Unknown')}
Severity: {props.get('severity', 'Unknown')}
Description: {props.get('description', 'No description available')}
Instructions: {props.get('instruction', 'No specific instructions provided')}
"""
实现工具执行

工具执行处理程序负责实际执行每个工具的逻辑。让我们添加它:

@mcp.tool()
async def get_alerts(state: str) -> str:
    """Get weather alerts for a US state.

    Args:
        state: Two-letter US state code (e.g. CA, NY)
    """
    url = f"{NWS_API_BASE}/alerts/active/area/{state}"
    data = await make_nws_request(url)

    if not data or "features" not in data:
        return "Unable to fetch alerts or no alerts found."

    if not data["features"]:
        return "No active alerts for this state."

    alerts = [format_alert(feature) for feature in data["features"]]
    return "\n---\n".join(alerts)

@mcp.tool()
async def get_forecast(latitude: float, longitude: float) -> str:
    """Get weather forecast for a location.

    Args:
        latitude: Latitude of the location
        longitude: Longitude of the location
    """
    # First get the forecast grid endpoint
    points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"
    points_data = await make_nws_request(points_url)

    if not points_data:
        return "Unable to fetch forecast data for this location."

    # Get the forecast URL from the points response
    forecast_url = points_data["properties"]["forecast"]
    forecast_data = await make_nws_request(forecast_url)

    if not forecast_data:
        return "Unable to fetch detailed forecast."

    # Format the periods into a readable forecast
    periods = forecast_data["properties"]["periods"]
    forecasts = []
    for period in periods[:5]:  # Only show next 5 periods
        forecast = f"""
{period['name']}:
Temperature: {period['temperature']}°{period['temperatureUnit']}
Wind: {period['windSpeed']} {period['windDirection']}
Forecast: {period['detailedForecast']}
"""
        forecasts.append(forecast)

    return "\n---\n".join(forecasts)
运行服务器

最后,让我们初始化并运行服务器:

if __name__ == "__main__":
    # Initialize and run the server
    mcp.run(transport='stdio')

你的服务器已经完成!运行uv run weather.py以确认一切正常。

现在让我们从现有的MCP主机Claude for Desktop测试你的服务器。

使用Claude for Desktop测试你的服务器

首先,确保你已经安装了Claude for Desktop。你可以在这里安装最新版本。 如果你已经安装了Claude for Desktop,请确保它已更新到最新版本。

我们需要为你想使用的MCP服务器配置Claude for Desktop。为此,请在文本编辑器中打开你的Claude for Desktop应用程序配置~/Library/Application Support/Claude/claude_desktop_config.json。如果文件不存在,请创建它。

例如,如果你安装了VS Code

code ~/Library/Application Support/Claude/claude_desktop_config.json

然后,你将在mcpServers键中添加你的服务器。只有在至少正确配置了一个服务器时,MCP UI元素才会在Claude for Desktop中显示。

在本例中,我们将添加我们的单个天气服务器,如下所示:

{
    "mcpServers": {
        "weather": {
            "command": "uv",
            "args": [
                "--directory",
                "/ABSOLUTE/PATH/TO/PARENT/FOLDER/weather",
                "run",
                "weather.py"
            ]
        }
    }
}

警告:你可能需要在command字段中传递uv可执行文件的完整路径。你可以通过在MacOS/Linux上运行which uv或在Windows上运行where uv来获取此路径。

注意:确保你传递的是服务器的绝对路径。

这告诉Claude for Desktop:

  1. 有一个名为“weather”的MCP服务器
  2. 通过运行uv --directory /ABSOLUTE/PATH/TO/PARENT/FOLDER/weather run weather.py来启动它

保存文件,并重新启动Claude for Desktop

使用命令进行测试

让我们确保Claude for Desktop能够识别我们在weather服务器中暴露的两个工具。你可以通过查找锤子alt图标来做到这一点:

image.png 点击锤子图标后,你应该看到列出的两个工具:

image.png 如果你的服务器没有被Claude for Desktop识别,请继续到故障排除部分以获取调试提示。

如果锤子图标已经显示,你现在可以通过在Claude for Desktop中运行以下命令来测试你的服务器:

  • 萨克拉门托的天气怎么样?
  • 德克萨斯州有哪些活跃的天气警报?

image.png

注意:由于这是美国国家气象局服务,查询仅适用于美国地点。

幕后发生了什么

当你提出问题时:

  1. 客户端将你的问题发送给Claude
  2. Claude分析可用的工具并决定使用哪个工具
  3. 客户端通过MCP服务器执行所选工具
  4. 结果被发送回Claude
  5. Claude制定自然语言响应
  6. 响应显示给你!

For Client Developers

在本教程中,您将学习如何构建一个连接MCP服务器的LLM驱动的聊天机器人客户端。建议您先完成Server quickstart教程,该教程将引导您完成构建第一个服务器的基本步骤。

您可以在此处找到本教程的完整代码。

系统要求

在开始之前,请确保您的系统满足以下要求:

  • Mac或Windows电脑
  • 已安装最新版本的Python
  • 已安装最新版本的uv

设置您的环境

首先,使用uv创建一个新的Python项目:

# Create project directory
uv init mcp-client
cd mcp-client

# Create virtual environment
uv venv

# Activate virtual environment
# On Windows:
.venv\Scripts\activate
# On Unix or MacOS:
source .venv/bin/activate

# Install required packages
uv add mcp anthropic python-dotenv

# Remove boilerplate files
rm hello.py

# Create our main file
touch client.py

设置您的API密钥

您需要从Anthropic Console获取一个Anthropic API密钥。

创建一个.env文件来存储它:

touch .env

将您的密钥添加到.env文件中:

ANTHROPIC_API_KEY=your_api_key_here

.env添加到您的.gitignore文件中:

echo ".env" >> .gitignore

注意: 请确保您的ANTHROPIC_API_KEY安全!

创建客户端

基本客户端结构

首先,设置我们的导入并创建基本的客户端类:

import asyncio
from typing import Optional
from contextlib import AsyncExitStack

from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

from anthropic import Anthropic
from dotenv import load_dotenv

load_dotenv()  # load environment variables from .env

class MCPClient:
    def __init__(self):
        # Initialize session and client objects
        self.session: Optional[ClientSession] = None
        self.exit_stack = AsyncExitStack()
        self.anthropic = Anthropic()
    # methods will go here

服务器连接管理

接下来,我们将实现连接到MCP服务器的方法:

async def connect_to_server(self, server_script_path: str):
    """Connect to an MCP server

    Args:
        server_script_path: Path to the server script (.py or .js)
    """
    is_python = server_script_path.endswith('.py')
    is_js = server_script_path.endswith('.js')
    if not (is_python or is_js):
        raise ValueError("Server script must be a .py or .js file")

    command = "python" if is_python else "node"
    server_params = StdioServerParameters(
        command=command,
        args=[server_script_path],
        env=None
    )

    stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params))
    self.stdio, self.write = stdio_transport
    self.session = await self.exit_stack.enter_async_context(ClientSession(self.stdio, self.write))

    await self.session.initialize()

    # List available tools
    response = await self.session.list_tools()
    tools = response.tools
    print("\nConnected to server with tools:", [tool.name for tool in tools])

查询处理逻辑

现在让我们添加处理查询和处理工具调用的核心功能:

async def process_query(self, query: str) -> str:
    """Process a query using Claude and available tools"""
    messages = [
        {
            "role": "user",
            "content": query
        }
    ]

    response = await self.session.list_tools()
    available_tools = [{
        "name": tool.name,
        "description": tool.description,
        "input_schema": tool.inputSchema
    } for tool in response.tools]

    # Initial Claude API call
    response = self.anthropic.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=1000,
        messages=messages,
        tools=available_tools
    )

    # Process response and handle tool calls
    final_text = []

    assistant_message_content = []
    for content in response.content:
        if content.type == 'text':
            final_text.append(content.text)
            assistant_message_content.append(content)
        elif content.type == 'tool_use':
            tool_name = content.name
            tool_args = content.input

            # Execute tool call
            result = await self.session.call_tool(tool_name, tool_args)
            final_text.append(f"[Calling tool {tool_name} with args {tool_args}]")

            assistant_message_content.append(content)
            messages.append({
                "role": "assistant",
                "content": assistant_message_content
            })
            messages.append({
                "role": "user",
                "content": [
                    {
                        "type": "tool_result",
                        "tool_use_id": content.id,
                        "content": result.content
                    }
                ]
            })

            # Get next response from Claude
            response = self.anthropic.messages.create(
                model="claude-3-5-sonnet-20241022",
                max_tokens=1000,
                messages=messages,
                tools=available_tools
            )

            final_text.append(response.content[0].text)

    return "\n".join(final_text)

交互式聊天界面

现在我们将添加聊天循环和清理功能:

async def chat_loop(self):
    """Run an interactive chat loop"""
    print("\nMCP Client Started!")
    print("Type your queries or 'quit' to exit.")

    while True:
        try:
            query = input("\nQuery: ").strip()

            if query.lower() == 'quit':
                break

            response = await self.process_query(query)
            print("\n" + response)

        except Exception as e:
            print(f"\nError: {str(e)}")

async def cleanup(self):
    """Clean up resources"""
    await self.exit_stack.aclose()

主入口点

最后,我们将添加主执行逻辑:

async def main():
    if len(sys.argv) < 2:
        print("Usage: python client.py <path_to_server_script>")
        sys.exit(1)

    client = MCPClient()
    try:
        await client.connect_to_server(sys.argv[1])
        await client.chat_loop()
    finally:
        await client.cleanup()

if __name__ == "__main__":
    import sys
    asyncio.run(main())

您可以在此处找到完整的client.py文件:完整代码

关键组件解释

1. 客户端初始化

  • MCPClient类初始化时会管理会话和API客户端
  • 使用AsyncExitStack进行资源管理
  • 配置Anthropic客户端以与Claude交互

2. 服务器连接

  • 支持Python和Node.js服务器
  • 验证服务器脚本类型
  • 设置正确的通信通道
  • 初始化会话并列出可用工具

3. 查询处理

  • 维护对话上下文
  • 处理Claude的响应和工具调用
  • 管理Claude和工具之间的消息流
  • 将结果组合成连贯的响应

4. 交互式界面

  • 提供简单的命令行界面
  • 处理用户输入并显示响应
  • 包括基本的错误处理
  • 允许优雅退出

5. 资源管理

  • 正确清理资源
  • 处理连接问题的错误处理
  • 优雅的关闭程序

常见自定义点

  1. 工具处理

    • 修改process_query()以处理特定工具类型
    • 添加工具调用的自定义错误处理
    • 实现工具特定的响应格式化
  2. 响应处理

    • 自定义工具结果的格式化方式
    • 添加响应过滤或转换
    • 实现自定义日志记录
  3. 用户界面

    • 添加GUI或Web界面
    • 实现丰富的控制台输出
    • 添加命令历史记录或自动完成功能

运行客户端

要使用任何MCP服务器运行您的客户端:

uv run client.py path/to/server.py # python server
uv run client.py path/to/build/index.js # node server

注意: 如果您正在继续服务器快速入门中的天气教程,您的命令可能如下所示:python client.py .../weather/src/weather/server.py

客户端将:

  1. 连接到指定的服务器
  2. 列出可用工具
  3. 启动一个交互式聊天会话,您可以在其中:
    • 输入查询
    • 查看工具执行
    • 从Claude获取响应

以下是连接到服务器快速入门中的天气服务器时的示例:

image.png

工作原理

当您提交查询时:

  1. 客户端从服务器获取可用工具列表
  2. 您的查询与工具描述一起发送给Claude
  3. Claude决定使用哪些工具(如果有)
  4. 客户端通过服务器执行任何请求的工具调用
  5. 结果发送回Claude
  6. Claude提供自然语言响应
  7. 响应显示给您

最佳实践

  1. 错误处理

    • 始终将工具调用包装在try-catch块中
    • 提供有意义的错误消息
    • 优雅地处理连接问题
  2. 资源管理

    • 使用AsyncExitStack进行正确清理
    • 完成后关闭连接
    • 处理服务器断开连接
  3. 安全性

    • 将API密钥安全地存储在.env
    • 验证服务器响应
    • 谨慎处理工具权限

故障排除

服务器路径问题

  • 仔细检查您的服务器脚本路径是否正确
  • 如果相对路径不起作用,请使用绝对路径
  • 对于Windows用户,请确保在路径中使用正斜杠(/)或转义的反斜杠(\)
  • 验证服务器文件具有正确的扩展名(.py表示Python,.js表示Node.js)

正确路径使用示例:

python client.py /absolute/path/to/server.py

响应时间

  • 第一次响应可能需要长达30秒才能返回
  • 这是正常的,发生在以下情况:
    • 服务器初始化
    • Claude处理查询
    • 工具正在执行
  • 后续响应通常更快
  • 在此初始等待期间不要中断进程

常见错误消息

如果您看到:

  • FileNotFoundError:检查您的服务器路径
  • Connection refused:确保服务器正在运行且路径正确
  • Tool execution failed:验证工具所需的环境变量是否已设置
  • Timeout error:考虑增加客户端配置中的超时时间

示例客户端

本页面提供了支持Model Context Protocol (MCP)的应用程序概述。每个客户端可能支持不同的MCP功能,允许与MCP服务器进行不同级别的集成。

功能支持矩阵

客户端资源提示工具采样备注
Claude桌面应用支持所有MCP功能
5ire支持工具
BeeAI框架支持工具,用于代理工作流
Cline支持工具和资源
Continue支持所有MCP功能
Cursor支持工具
Emacs Mcp支持Emacs中的工具
Firebase Genkit⚠️通过工具支持资源列表和查找
GenAIScript支持工具
Goose支持工具
LibreChat支持代理的工具
mcp-agent⚠️支持工具、服务器连接管理和代理工作流
Roo Code支持工具和资源
Sourcegraph Cody通过OpenCTX支持资源
Superinterface支持工具
TheiaAI/TheiaIDE支持Theia AI和AI驱动的Theia IDE中的代理工具
Windsurf Editor支持AI Flow协作开发的工具
Zed提示显示为斜杠命令
SpinAI支持TypeScript AI代理的工具
OpenSumi支持OpenSumi中的工具
Daydreams代理支持将服务器嵌入到Daydreams代理中

客户端详情

Claude桌面应用

Claude桌面应用程序提供了对MCP的全面支持,能够与本地工具和数据源进行深度集成。

主要功能:

  • 完全支持资源,允许附加本地文件和数据
  • 支持提示模板
  • 工具集成,用于执行命令和脚本
  • 本地服务器连接,增强隐私和安全性

ⓘ 注意:Claude.ai网页应用目前不支持MCP。MCP功能仅在桌面应用中可用。

5ire

5ire 是一个开源的跨平台桌面AI助手,通过MCP服务器支持工具。

主要功能:

  • 内置的MCP服务器可以快速启用和禁用
  • 用户可以通过修改配置文件添加更多服务器
  • 开源且用户友好,适合初学者
  • 未来将持续改进对MCP的支持

BeeAI框架

BeeAI框架 是一个用于构建、部署和服务强大代理工作流的开源框架。该框架包括MCP工具,这是一个简化MCP服务器集成到代理工作流中的原生功能。

主要功能:

  • 无缝将MCP工具集成到代理工作流中
  • 快速实例化来自连接的MCP客户端的框架原生工具
  • 计划未来支持代理MCP功能

了解更多:

Cline

Cline 是VS Code中的自主编码代理,可以编辑文件、运行命令、使用浏览器等——在每一步都需要您的许可。

主要功能:

  • 通过自然语言创建和添加工具(例如“添加一个可以搜索网络的工具”)
  • 通过~/Documents/Cline/MCP目录与他人分享Cline创建的自定义MCP服务器
  • 显示配置的MCP服务器及其工具、资源和任何错误日志

Continue

Continue 是一个开源的AI代码助手,内置支持所有MCP功能。

主要功能:

  • 输入“@”提及MCP资源
  • 提示模板显示为斜杠命令
  • 在聊天中直接使用内置和MCP工具
  • 支持VS Code和JetBrains IDE,兼容任何LLM

Cursor

Cursor 是一个AI代码编辑器。

主要功能:

  • 支持Cursor Composer中的MCP工具
  • 支持STDIO和SSE

Emacs Mcp

Emacs Mcp 是一个设计用于与MCP服务器接口的Emacs客户端,能够实现无缝连接和交互。它为AI插件(如gptelllm)提供MCP工具调用支持,遵循Emacs的标准工具调用格式。此集成增强了Emacs生态系统中AI工具的功能。

主要功能:

  • 为Emacs提供MCP工具支持

Firebase Genkit

Genkit 是Firebase的SDK,用于构建和集成GenAI功能到应用程序中。genkitx-mcp 插件支持作为客户端消费MCP服务器或从Genkit工具和提示创建MCP服务器。

主要功能:

  • 客户端支持工具和提示(部分支持资源)
  • 在Genkit的Dev UI游乐场中支持丰富的发现
  • 与Genkit现有工具和提示的无缝互操作性
  • 兼容来自顶级提供商的各种GenAI模型

GenAIScript

使用GenAIScript(在JavaScript中)以编程方式组装LLM的提示。在JavaScript中编排LLM、工具和数据。

主要功能:

  • 用于处理提示的JavaScript工具箱
  • 抽象化使其易于使用且高效
  • 无缝的Visual Studio Code集成

Goose

Goose 是一个开源的AI代理,通过自动化编码任务来增强您的软件开发。

主要功能:

  • 通过工具向Goose暴露MCP功能
  • MCP可以通过扩展目录、CLI或UI直接安装
  • Goose允许您通过构建自己的MCP服务器扩展其功能
  • 包括用于开发、网络抓取、自动化、内存以及JetBrains和Google Drive集成的内置工具

LibreChat

LibreChat 是一个开源的、可定制的AI聊天UI,支持多个AI提供商,现在包括MCP集成。

主要功能:

  • 通过MCP服务器扩展当前工具生态系统,包括代码解释器和图像生成工具
  • 将工具添加到可定制的代理中,使用来自顶级提供商的各种LLM
  • 开源且可自托管,支持安全的多用户
  • 未来路线图包括扩展MCP功能支持

mcp-agent

mcp-agent 是一个简单、可组合的框架,用于使用Model Context Protocol构建代理。

主要功能:

  • 自动管理MCP服务器的连接
  • 向LLM暴露来自多个服务器的工具
  • 实现了构建有效代理中定义的每种模式
  • 支持工作流暂停/恢复信号,例如等待人类反馈

Roo Code

Roo Code 通过MCP提供AI编码辅助。

主要功能:

  • 支持MCP工具和资源
  • 与开发工作流集成
  • 可扩展的AI功能

Sourcegraph Cody

Cody 是Sourcegraph的AI编码助手,通过OpenCTX实现MCP。

主要功能:

  • 支持MCP资源
  • 与Sourcegraph的代码智能集成
  • 使用OpenCTX作为抽象层
  • 计划未来支持更多MCP功能

SpinAI

SpinAI 是一个用于构建可观察AI代理的开源TypeScript框架。该框架提供原生MCP兼容性,允许代理无缝集成MCP服务器和工具。

主要功能:

  • 为AI代理提供内置的MCP兼容性
  • 开源TypeScript框架
  • 可观察的代理架构
  • 原生支持MCP工具集成

Superinterface

Superinterface 是一个AI基础设施和开发者平台,用于构建支持MCP的应用内AI助手、交互组件、客户端函数调用等。

主要功能:

  • 在通过React组件或脚本标签嵌入的助手中使用MCP服务器的工具
  • 支持SSE传输
  • 使用来自任何AI提供商(OpenAI、Anthropic、Ollama等)的任何AI模型

TheiaAI/TheiaIDE

Theia AI 是一个用于构建AI增强工具和IDE的框架。AI驱动的Theia IDE 是一个基于Theia AI构建的开放且灵活的开发环境。

主要功能:

  • 工具集成:Theia AI使AI代理(包括Theia IDE中的代理)能够利用MCP服务器进行无缝工具交互
  • 可定制的提示:Theia IDE允许用户定义和调整提示,动态集成MCP服务器以定制工作流
  • 自定义代理:Theia IDE支持创建利用MCP功能的自定义代理,使用户能够设计专用工作流

Theia AI和Theia IDE的MCP集成为用户提供了灵活性,使其成为探索和适应MCP的强大平台。

了解更多:

Windsurf Editor

Windsurf Editor 是一个将AI助手与开发者工作流结合的代理IDE。它采用创新的AI Flow系统,支持协作和独立的AI交互,同时保持开发者控制。

主要功能:

  • 革命性的AI Flow范式,用于人机协作
  • 智能代码生成和理解
  • 丰富的开发工具,支持多模型

Zed

Zed 是一个高性能代码编辑器,内置MCP支持,专注于提示模板和工具集成。

主要功能:

  • 提示模板显示为编辑器中的斜杠命令
  • 工具集成,增强编码工作流
  • 与编辑器功能和工作区上下文紧密集成
  • 不支持MCP资源

OpenSumi

OpenSumi 是一个帮助您快速构建AI原生IDE产品的框架。

主要功能:

  • 支持OpenSumi中的MCP工具
  • 支持内置IDE MCP服务器和自定义MCP服务器

Daydreams

Daydreams 是一个用于在链上执行任何操作的生成代理框架。

主要功能:

  • 支持配置中的MCP服务器
  • 暴露MCP客户端

为您的应用程序添加MCP支持

如果您已经为您的应用程序添加了MCP支持,我们鼓励您提交拉取请求将其添加到此列表中。MCP集成可以为您的用户提供强大的上下文AI功能,并使您的应用程序成为不断增长的MCP生态系统的一部分。

添加MCP支持的好处:

  • 允许用户带来自己的上下文和工具
  • 加入不断增长的互操作AI应用程序生态系统
  • 为用户提供灵活的集成选项
  • 支持本地优先的AI工作流

要开始在您的应用程序中实现MCP,请查看我们的PythonTypeScript SDK文档

示例server

本页面展示了各种Model Context Protocol (MCP)服务器,展示了该协议的功能和多样性。这些服务器使大型语言模型(LLMs)能够安全地访问工具和数据源。

参考实现

这些官方参考服务器展示了MCP的核心功能和SDK的使用:

数据和文件系统

  • Filesystem - 具有可配置访问控制的安全文件操作
  • PostgreSQL - 具有模式检查功能的只读数据库访问
  • SQLite - 数据库交互和商业智能功能
  • Google Drive - Google Drive的文件访问和搜索功能

开发工具

  • Git - 读取、搜索和操作Git仓库的工具
  • GitHub - 仓库管理、文件操作和GitHub API集成
  • GitLab - GitLab API集成,支持项目管理
  • Sentry - 从Sentry.io检索和分析问题

网页和浏览器自动化

  • Brave Search - 使用Brave的Search API进行网页和本地搜索
  • Fetch - 为LLM使用优化的网页内容抓取和转换
  • Puppeteer - 浏览器自动化和网页抓取功能

生产力和通信

  • Slack - 频道管理和消息功能
  • Google Maps - 位置服务、路线和地点详情
  • Memory - 基于知识图谱的持久记忆系统

AI和专用工具

官方集成

这些MCP服务器由公司为其平台维护:

  • Axiom - 使用自然语言查询和分析日志、跟踪和事件数据
  • Browserbase - 在云端自动化浏览器交互
  • Cloudflare - 在Cloudflare开发者平台上部署和管理资源
  • E2B - 在安全的云沙箱中执行代码
  • Neon - 与Neon无服务器Postgres平台交互
  • Obsidian Markdown Notes - 在Obsidian库中读取和搜索Markdown笔记
  • Qdrant - 使用Qdrant向量搜索引擎实现语义记忆
  • Raygun - 访问崩溃报告和监控数据
  • Search1API - 用于搜索、爬取和站点地图的统一API
  • Stripe - 与Stripe API交互
  • Tinybird - 与Tinybird无服务器ClickHouse平台交互

社区亮点

不断增长的社区开发服务器生态系统扩展了MCP的功能:

  • Docker - 管理容器、镜像、卷和网络
  • Kubernetes - 管理Pod、部署和服务
  • Linear - 项目管理和问题跟踪
  • Snowflake - 与Snowflake数据库交互
  • Spotify - 控制Spotify播放和管理播放列表
  • Todoist - 任务管理集成

注意: 社区服务器未经测试,使用风险自负。它们与Anthropic无关,也不受其认可。

有关社区服务器的完整列表,请访问MCP Servers Repository

入门指南

使用参考服务器

基于TypeScript的服务器可以直接使用npx

npx -y @modelcontextprotocol/server-memory

基于Python的服务器可以使用uvx(推荐)或pip

# 使用uvx
uvx mcp-server-git

# 使用pip
pip install mcp-server-git
python -m mcp_server_git

配置Claude

要将MCP服务器与Claude一起使用,请将其添加到您的配置中:

{
  "mcpServers": {
    "memory": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-memory"]
    },
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allowed/files"]
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>"
      }
    }
  }
}

其他资源

访问我们的GitHub Discussions与MCP社区互动。

用大模型帮助搭建MCP

本指南将帮助你使用LLMs(大型语言模型)来构建自定义的Model Context Protocol(MCP)服务器和客户端。本教程将重点介绍Claude,但你可以使用任何前沿的LLM来完成此任务。

准备文档

在开始之前,收集必要的文档以帮助Claude理解MCP:

  1. 访问 modelcontextprotocol.io/llms-full.t… 并复制完整的文档文本
  2. 导航到 MCP TypeScript SDKPython SDK 仓库
  3. 复制README文件和其他相关文档
  4. 将这些文档粘贴到你与Claude的对话中

描述你的服务器

在提供文档后,向Claude清楚地描述你想要构建的服务器类型。具体说明:

  • 你的服务器将暴露哪些资源
  • 它将提供哪些工具
  • 它应该提供哪些提示
  • 它需要与哪些外部系统交互

例如:

Build an MCP server that:
- Connects to my company's PostgreSQL database
- Exposes table schemas as resources
- Provides tools for running read-only SQL queries
- Includes prompts for common data analysis tasks

与Claude合作

在与Claude合作构建MCP服务器时:

  1. 首先从核心功能开始,然后逐步添加更多功能
  2. 要求Claude解释你不理解的代码部分
  3. 根据需要请求修改或改进
  4. 让Claude帮助你测试服务器并处理边缘情况

Claude可以帮助实现所有关键的MCP功能:

  • 资源管理和暴露
  • 工具定义和实现
  • 提示模板和处理程序
  • 错误处理和日志记录
  • 连接和传输设置

最佳实践

在使用Claude构建MCP服务器时:

  • 将复杂的服务器分解为较小的部分
  • 在继续之前彻底测试每个组件
  • 注意安全性——验证输入并适当限制访问
  • 为未来的维护做好代码文档
  • 仔细遵循MCP协议规范

下一步

在Claude帮助你构建服务器后:

  1. 仔细检查生成的代码
  2. 使用MCP Inspector工具测试服务器
  3. 将其连接到Claude.app或其他MCP客户端
  4. 根据实际使用情况和反馈进行迭代

请记住,Claude可以帮助你根据需求的变化修改和改进你的服务器。

需要更多指导?只需向Claude提出关于实现MCP功能或解决出现的问题的具体问题。