MCP教程-1

134 阅读5分钟

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… 内置了两种传输类型:

  1. 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的调试如下

转载于:mp.weixin.qq.com/s/L7NYXqdAS…