MCP是什么
MCP的是Model Context Protocol的缩写,翻译为中文是模型上下文的意思。是由Anthropic于2024年底提出的一项开放协议。 MCP是一套开源的标准,使用这套标准能让开发者构建安全、数据源和人工智能之间的双向连接的工具。MCP开发者可以通过发布 MCP Server 公开其数据,也可以构建连接到这些服务器的 AI 应用程序(MCP 客户端)。
如上图这是MCP开发的架构图。MCP 的核心架构采用客户端-服务器模式。带有 MCP Client 的应用程序(如 Claude Desktop、集成开发环境或 AI 工具)可连接至一个或多个 MCP Server,以访问功能服务或数据资源。
- MCP CLient:嵌入到本地应用程序中的协议客户端,负责与 MCP Server 建立 1:1 的长连接,并根据请求上下文发起功能调用。支持多服务器连接,可并发请求多个服务节点。
- MCP Server:轻量级、可插拔的服务进程,暴露一个或多个标准化功能模块(如模型推理、数据分析、文件检索等),通过统一的模型上下文协议进行交互。MCP Server 可根据需要部署多个实例,支持本地和远程部署。
- 本地数据源:MCP Server 可访问的本地资源,如文件系统、数据库、配置服务等。通过本地接口调用,保障数据访问的安全性和低延迟。
- 远程服务:指 MCP 服务器可通过互联网访问的外部系统,例如通过 API 调用的云服务。
该架构实现了将智能处理能力和数据访问能力以模块化、可扩展的方式集成到本地或远程的应用程序中。
从架构设计可以看出,MCP 为大语言模型(LLM)提供了一个标准化的工具和数据访问通道。我们可以将接入了 LLM 的工具封装为 MCP Server,并通过 MCP Client 与上层应用对接。
LLM 可通过 MCP Client 查询当前可用的工具与资源,并基于用户请求动态决定调用哪些 MCP 服务(如数据库检索、文档处理或本地函数执行等)。这种方式实现了 LLM 与底层能力的解耦与组合,使智能体能够灵活编排本地资源与外部服务,完成复杂任务。
不使用MCP也可以完成这些工作,但是MCP是一套anthropic提倡的标准协议,只要开发的AI智能工具按照标准开发,不论后端的LLM模型是什么,都可以使用任何你有权限使用的MCP Server的工具和资源。
anthropic为mcp提供了多种编程语言的SDK,本文就以python语言为例,介绍 MCP Server的开发。
MCP Server 例子
我们开发一个查询本地机器cpu和内存的MCP Server。该例子需要安装相关的mcp 和相关的组件。
requirement.txt
mcp==1.9.3
psutill==7.0.0
import psutil
from mcp.server.fastmcp import FastMCP
app = FastMCP('computer_monitor')
@app.tool()
def get_cpu_usage() -> str:
"""
获取CPU使用率信息
Returns:
CPU使用率详细信息
"""
# 获取CPU使用率
cpu_percent = psutil.cpu_percent(interval=1, percpu=True)
cpu_avg = psutil.cpu_percent(interval=1)
# 获取CPU核心数
cpu_count = psutil.cpu_count()
cpu_count_physical = psutil.cpu_count(logical=False)
result = [
f"CPU平均使用率: {cpu_avg}%",
f"物理CPU核心数: {cpu_count_physical}",
f"逻辑CPU核心数: {cpu_count}",
"\n各核心使用率:"
]
for i, percent in enumerate(cpu_percent):
result.append(f" 核心 {i}: {percent}%")
return "\n".join(result)
@app.tool()
def get_memory_usage() -> str:
"""
获取内存使用情况
Returns:
内存使用详细信息
"""
# 获取内存信息
memory = psutil.virtual_memory()
swap = psutil.swap_memory()
result = [
"内存使用情况:",
f"总内存: {memory.total / (1024**3):.2f} GB",
f"已使用: {memory.used / (1024**3):.2f} GB ({memory.percent}%)",
f"可用内存: {memory.available / (1024**3):.2f} GB",
f"空闲内存: {memory.free / (1024**3):.2f} GB",
"",
"交换分区:",
f"总交换空间: {swap.total / (1024**3):.2f} GB",
f"已使用交换: {swap.used / (1024**3):.2f} GB ({swap.percent}%)",
f"空闲交换: {swap.free / (1024**3):.2f} GB"
]
return "\n".join(result)
if __name__ == '__main__':
app.run(transport='stdio')
上面的代码我们使用mcp 的python SDK实现了两个工具:
get_cpu_usage:获取CPU使用率信息
get_memory_usage: 获取内存使用情况
注意代码:app.run(transport='stdio') ,这里我们指定了transport 方式为stdio方式,transport的下面会介绍到。
Anthropic 提供的Claude Desktop ,Claude Desktop内置了MCP Client 的实现,可以使用Claude Desktop对Mcp Server 进行验证。
- 下载Claude Desktop,安装打开后,依次点击Setting->Developer->Edit Config 会定位到Claude的配置文件。如图:
- 用文本文件打开claude_desktop_config.json,将我们的mcpserver 进行配置:``
{
"mcpServers": {
"cputer_usage": {
"command": "/Users/code/mcp/.conda/bin/python",
"args": [
"/Users/code/mcp/computer.py"
]
}
}
}
- 重启Claude Desktop,我们会看到我们的mcp serer已经能被Claude Desktop使用
- 问一个问题,“我的电脑cpu使用情况” ,得到的回答;
transport (传输协议)transport:模型上下文协议 (MCP) 中的传输协议为客户端和服务器之间的通信提供了基础。传输协议负责处理消息发送和接收的底层机制。mcp定义了传输消息的格式,具体参考(modelcontextprotocol.io/docs/concep… 内置了两种传输类型:
- stdio: 传输支持通过标准输入和输出流进行通信。这对于本地集成和命令行工具尤其有用.
在我们的例子中我们就使用了stdio 的方式,使用这种方式,我们配置的command 为macserver 启动的命令,在使用时,主程序会通过命令启动子进程,然后通过子进程的 stdin 和 stdout 与该组件通信。我们上边的例子就是这个格式。2.streamable-http:通常用于浏览器或支持 HTTP 流的前端与后端进行事件推送通信如果将上边的例子
app.run(transport='stdio')
改为
app.run(transport='streamable-http')
执行代码,那么默认就启动了一个http的服务,默认端口8000 Claude Desktop目前还不支持 远端http的mcp server 的添加,但是我使用的cursor 是可以使用的,cursor的使用如下。除了使用Claude Desktop、Cursor等来调试Mcp Server外,Anthropic还提供了MCP Inspector 1.下载并运行Inspecotor 我使用node.js的npx 命令安装运行 MCP Inspector
npx @modelcontextprotocol/inspector
2.对于transport为streamable-http 的调试如下图3.对于transport为stdio的inspecoor的调试如下