如何从头构建 MCP 服务器和客户端
什么是 MCP
可以将 MCP 视为笔记本电脑上的 USB C 端口。有了它,您可以为笔记本电脑充电、进行数据传输、连接其他显示器,以及为其他支持 Type C 的设备充电。
同样,模型上下文协议 (MCP) 为 AI 系统提供了一个标准、安全、实时、双向的通信接口,用于连接外部工具、API 服务和数据源。
这意味着,与需要单独的代码、文档、身份验证方法和维护的传统 API 集成不同,MCP 可以为 AI 模型与外部系统交互提供单一、标准化的方式,即您只需编写一次代码,所有 AI 系统都可以使用它。
MCP 与传统 API 之间的主要区别包括:
特征 | 微胶囊钙 | 传统 API |
---|---|---|
整合努力 | 单一、标准化的集成 | 每个 API 单独集成 |
实时通信 | ✅ 是的 | ❌ 不 |
动态发现 | ✅ 是的 | ❌ 不 |
可扩展性 | 简单(即插即用) | 需要额外的集成 |
安全与控制 | 跨工具保持一致 | 因 API 而异 |
MCP 支持双向通信,允许 AI 模型检索信息并动态触发操作。这使得它非常适合创建更智能、更具备情境感知能力的应用程序。
那么这一切是如何运作的呢?
MCP 组件
MCP 架构由几个关键组件组成,它们协同工作以实现无缝集成:
- MCP 主机:这些是需要访问外部数据或工具的应用程序(例如 Claude Desktop 或 AI 驱动的 IDE)
- MCP 客户端:它们与 MCP 服务器保持专用的一对一连接。
- MCP 服务器:通过 MCP 公开特定功能、连接到本地或远程数据源的轻量级服务器。
- 本地数据源:MCP 服务器安全访问的文件、数据库或服务
- 远程服务:基于互联网的外部 API 或 MCP 服务器访问的服务
这种关注点分离使得 MCP 服务器高度模块化且易于维护。
那么这一切是如何联系起来的呢?
组件如何协同工作
让我们通过一个实际的例子来理解这一点:
假设您正在使用 Cursor(MCP 托管平台)来管理项目预算。您需要在 Google 表格中更新预算报告,并通过 Slack 将预算变更摘要发送给您的团队。
- Cursor(MCP 主机)向其 MCP 客户端发起请求,以更新 Google 表格中的预算报告并发送 Slack 通知。
- MCP 客户端连接到两个 MCP 服务器:一个用于 Google Sheets,一个用于 Slack。
- Google Sheets MCP 服务器与 Google Sheets API(远程服务)交互以更新预算报告。
- Slack MCP 服务器与 Slack API(远程服务)交互以发送通知。
- MCP 服务器将响应发送回 MCP 客户端。
- MCP 客户端将这些响应转发给 Cursor,Cursor 将结果显示给用户。
该过程无缝进行,允许 Cursor 通过标准化界面与多种服务集成。
但是如果不能建造,理解基础知识也是没有用的,所以让我们开始建造吧!
如何构建 MCP 服务器
构建 MCP 服务器有两种方法:使用 Python SDK 或 JavaScript SDK。为了简单起见,我将坚持使用 Python SDK。
因此,像任何其他优秀的开发人员一样,让我们创建一个单独的工作环境来保持隔离。
1. 工作环境设置
我们首先创建一个项目目录。
导航到您的工作文件夹并创建一个名为mcp的文件夹,或者您可以使用终端命令:
mkdir mcp
cd mcp
接下来使用以下命令创建虚拟环境:
# windows
python -m venv dotenv
# linux/mac
python -m venv --help
sudo apt-get install python3-venv #install venv - optional
python3 -m venv dev-env
现在使用以下命令激活环境:
# activates env
dotenv\Scripts\activate
# linux/mac
dotenv\Scripts\activate
确保在终端 cwd 路径前面看到 (dotenv)。
最后安装 2 个库 - MCP SDK、MCP CLI:
# install libraries
pip install mcp mcp[cli]
它可能会询问您是否允许安装,按y键,安装完成后,我们就完成了环境设置
2.编写服务器代码
在您喜欢的任何编辑器中打开该文件夹,创建一个名为calculator.py的新文件,然后编写以下代码:
# basic import
from mcp.server.fastmcp import FastMCP
import math
# instantiate an MCP server client
mcp = FastMCP("Hello World")
# DEFINE TOOLS
#addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return int(a + b)
# subtraction tool
@mcp.tool()
def subtract(a: int, b: int) -> int:
"""Subtract two numbers"""
return int(a - b)
# multiplication tool
@mcp.tool()
def multiply(a: int, b: int) -> int:
"""Multiply two numbers"""
return int(a * b)
# division tool
@mcp.tool()
def divide(a: int, b: int) -> float:
"""Divide two numbers"""
return float(a / b)
# power tool
@mcp.tool()
def power(a: int, b: int) -> int:
"""Power of two numbers"""
return int(a ** b)
# square root tool
@mcp.tool()
def sqrt(a: int) -> float:
"""Square root of a number"""
return float(a ** 0.5)
# cube root tool
@mcp.tool()
def cbrt(a: int) -> float:
"""Cube root of a number"""
return float(a ** (1/3))
# factorial tool
@mcp.tool()
def factorial(a: int) -> int:
"""factorial of a number"""
return int(math.factorial(a))
# log tool
@mcp.tool()
def log(a: int) -> float:
"""log of a number"""
return float(math.log(a))
# remainder tool
@mcp.tool()
def remainder(a: int, b: int) -> int:
"""remainder of two numbers divison"""
return int(a % b)
# sin tool
@mcp.tool()
def sin(a: int) -> float:
"""sin of a number"""
return float(math.sin(a))
# cos tool
@mcp.tool()
def cos(a: int) -> float:
"""cos of a number"""
return float(math.cos(a))
# tan tool
@mcp.tool()
def tan(a: int) -> float:
"""tan of a number"""
return float(math.tan(a))
# DEFINE RESOURCES
# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
# execute and return the stdio output
if __name__ == "__main__":
mcp.run(transport="stdio")
好的,让我们花点时间来了解代码中发生了什么。
- 首先,我们从 MCP 包和模块中导入了服务器。FastMCP服务器负责管理连接、遵循 MCP 协议并路由消息。
FastMCP
math
- 接下来我们创建一个MCP服务器客户端,并将其命名为“Hello World” 😂。
- 然后,我们添加了使用的工具
@mcp.tool()
和使用资源@mcp.resource()
。这些工具帮助服务器执行操作,资源提供个性化问候。(谈论将您的数据暴露给 LLM* ) * - 最后,我们使用 启动 mcp-server
@mcp.run()
,并且设置允许通过标准输入/输出 (stdio
) 进行通信。
希望您能清楚地了解代码现在的作用!
现在让我们使用 MCP Inspector 进行测试
3. 本地运行并测试服务器
MCP Inspector 是一款便捷的 GUI 工具,可让您测试自定义 MCP 服务器,而无需将其与 LLM / AI 代理集成。让我们开始设置吧。
按照步骤在本地使用 mcp 服务器运行和调试程序。
- 打开终端并确保您处于工作环境中。
- 跑步
mcp dev calculator.py
。 - 如果出现提示,请按“y”安装 CLI 或手动执行,然后重新运行该命令。
- 打开显示的 URL(大多数是 localhost)并在 MCP Inspector 中按“连接”。
- 如果发生错误,请重新启动电脑并重新运行该命令。
- 单击“列出模板”,选择一个,添加您的姓名,然后单击“阅读资源”。
- 检查显示的输出。
- 单击导航栏中的“工具”。
- 单击“列出工具”,选择一个,输入值,然后按“运行工具”。
注意:如果出现 Pydantic 错误,请删除两个值并输入新的值。
因此,至此,我们的测试就完成了。
然而,MCP 的真正强大之处在于 IDE/代理的集成。让我们看看如何连接它们?
将自定义服务器连接到光标
我将使用 Cursor 进行演示,因为集成过程简单直接。请按照以下步骤进行集成
- 在 Cursor 中打开当前工作目录 (cwd)。
- 激活虚拟环境(可选但推荐)。
- 前往
File → Preferences → Cursor Settings → MCP → Add New Server
。 -
填写服务器详细信息:
- 名称:选择一个名称(例如“计算器”)。
- 类型:设置为
command
。 - 命令:提供运行服务器的完整命令:
/path/to/your/venv/bin/python /path/to/your/file.py
-
运行配置并检查🟢计算器指示器。
-
如果指示器是🟠,请验证并更正文件路径。
-
打开编写器,选择“Agent”,然后输入:
Can you add two numbers 3, 6
-
检查
mcp_add()
工具是否自动检索。 -
测试 Cursor 中的服务器工具是否支持该功能。
到目前为止,一切都很好,但这些只是一些简单的示例。如果您需要开发一些高级项目并使用多个不同的服务器/工具,该怎么办?您需要为多个工具编写多行代码,对吗?
让我们看一个更简单的替代方案以及它的单行集成如何简化工作流程。
进入Composio!
Composio 简介
Composio 是终极集成平台,使开发人员仅用一行代码即可将 AI 代理与外部工具、服务器和 API 无缝连接。
借助完全托管的 MCP 服务器,开发者可以快速构建强大的 AI 应用程序,无需管理复杂的集成。我们负责基础架构,让您专注于创新。
让我们深入了解如何轻松地将 Composite-mcp 集成到您的工作流程中!
Composio MCP 集成
与 Composio MCP 集成非常简单,只需五个步骤即可完成:
- 访问 Composio MCP 目录页面
- 选择您需要的工具,请留意以下内容:名称:工具/服务器名称描述:工具的功能图像:兼容性(截至目前,Windsurf 不适用于 Windows)
- 前往下一页的“安装步骤”部分,然后点击“生成”。复制生成的 URL(隐私信息)。请务必阅读“可用操作”部分中所有可用的功能。
- 打开光标并转到文件 → 首选项 → 光标设置 → MCP → 添加新服务器
- 选择类型为“sse”并将复制的 URL 粘贴到服务器 URL 中。您就完成了!
要测试集成,请转到 Composer,启动连接,并要求它按照上一节中的提示执行操作。
让我们看一个高级集成来看看 composio-mcp 的优势在哪里。
使用 Slack Collabation 进行线性票证管理。
Composio 可以轻松处理高级用例。让我们演示一下 Composio 如何无缝解决以下挑战:
开发团队经常难以管理与产品相关的问题,因为这需要在 IDE 和团队 Slack 频道之间不断来回沟通。
开发一个代理程序,通过 IDE 处理所有操作。这样,团队就可以保持同步,无需不必要的上下文切换,从而显著提高生产力。
让我们使用 composio-mcp 来实现这个!
我们将创建一个线性票证用于演示目的并将其发送到我们的 Slack 团队频道。
按照以下步骤操作:
- 前往MCP 代码库,选择 Linear 和 Slack 集成。如果未找到,请使用搜索控制台。
- 生成 SSE 密钥并复制它。
- 打开游标并将其与上一节介绍的方法相结合。
在 Cursor 中集成 Linear 和 Slack。
好的,现在让我们看看它是否按预期工作。
- 前往光标聊天并选择代理。
- 通过写入“与 Slack 创建连接”来启动 OAuth 连接。
- 对 Linear Head 生成的 URL 执行相同操作并进行身份验证。
- 完成后,返回光标并询问连接是否处于活动状态。
请务必检查一次权限!
一旦一切就绪,您就可以开始使用 MCP 集成。
- 前往光标聊天并选择 代理。
- 通过写入“创建与 Slack 的连接”来发起 OAuth 连接。Linear 也执行同样的操作
- 前往生成的 URL 并进行身份验证。请务必检查权限!slack-oauth.mp4
- 完成后,返回光标并询问连接是否处于活动状态。
- 一旦一切就绪,您就可以开始使用 MCP 集成。
结论
随着人工智能改变软件开发,MCP 将在创造无缝、集成的体验方面发挥越来越重要的作用。
无论您是构建自定义 MCP 服务器还是利用 Composio MCP 等预构建解决方案,该协议都提供了一种通过外部工具和数据源增强 AI 功能的强大方法。
人工智能的未来不仅仅在于更智能的模型,更在于创建一个生态系统,让人工智能能够与我们日常使用的工具无缝交互。MCP 是迈向这一未来的关键一步。
希望你拥有一段愉快的学习经历——祝你使用 Composio 构建愉快!🚀
文章来源:https://dev.to/composiodev/how-to-build-mcp-servers-and-clients-from-scratch-4o2f