一文搞懂 MCP Servers

什么是MCP

MCP概念

MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 提出并于 2024 年 11 月开源的一种通信协议,旨在解决大型语言模型(LLM)与外部数据源及工具之间无缝集成的需求。

它通过标准化 AI 系统与数据源的交互方式,帮助模型获取更丰富的上下文信息,从而生成更准确、更相关的响应。

主要功能

  • 上下文共享:应用程序可以通过 MCP 向模型提供所需的上下文信息(如文件内容、数据库记录等),增强模型的理解能力。
  • 工具暴露:MCP 允许应用程序将功能(如文件读写、API 调用)暴露给模型,模型可以调用这些工具完成复杂任务。
  • 可组合的工作流:开发者可以利用 MCP 集成多个服务和组件,构建灵活、可扩展的 AI 工作流。
  • 安全性:通过本地服务器运行,MCP 避免将敏感数据上传至第三方平台,确保数据隐私。

MCP架构

MCP 采用客户端-服务器架构:

  • MCP 客户端(Client):通常是 AI 应用程序(如 Claude Desktop 或其他 LLM 工具),负责发起请求并与服务器通信。
  • MCP 服务器(Server):轻量级程序,负责暴露特定的数据源或工具功能,并通过标准化协议与客户端交互。

通信格式:基于 JSON-RPC 2.0,支持请求、响应和通知三种消息类型,确保通信的标准化和一致性。

MCP Servers主要功能

MCP Servers 作为一个轻量级的本地服务,旨在为客户端提供数据访问和功能执行的接口。

1. 资源暴露(Resource Exposure)

资源是服务器提供给客户端的数据实体,可以是文件、数据库记录、内存中的对象等。

例如:

  • 文件资源:file:///home/user/report.txt
  • 内存资源:memo://recent-insights

2. 工具提供(Tool Provisioning)

工具是服务器暴露的可执行功能,客户端可以通过调用这些工具完成特定任务。

例如:

  • 查询数据库:query_database(参数:SQL 语句,返回:查询结果)
  • 文件写入:write_file(参数:文件路径、内容)

3. 动态通知(Dynamic Notification)

当资源发生变化时,服务器可以通过通知机制(如 notification 消息)主动推送更新到客户端。

4. 会话管理(Session Management)

处理客户端的连接初始化、能力协商和会话关闭。

自定义 MCP Servers

  1. 本地实现一个文件资源服务,创建 mcp_server.py 文件。
import json
import sys

# 处理客户端请求
def handle_request(request):
    method = request.get("method")
    params = request.get("params", {})
    request_id = request.get("id")

    if method == "initialize":
        return {
            "jsonrpc": "2.0",
            "result": {"version": "1.0", "capabilities": ["resources", "tools"]},
            "id": request_id
        }
    elif method == "read_resource":
        uri = params.get("uri")
        with open(uri.replace("file:///", ""), "r") as f:
            content = f.read()
        return {"jsonrpc": "2.0", "result": content, "id": request_id}
    elif method == "call_tool":
        tool_name = params.get("name")
        if tool_name == "echo":
            return {"jsonrpc": "2.0", "result": params.get("message"), "id": request_id}
    else:
        return {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": request_id}

# 主循环:通过 Stdio 通信
def main():
    while True:
        # 从 stdin 读取请求
        raw_input = sys.stdin.readline().strip()
        if not raw_input:
            break
        request = json.loads(raw_input)
        
        # 处理请求并返回响应
        response = handle_request(request)
        sys.stdout.write(json.dumps(response) + "\n")
        sys.stdout.flush()

if __name__ == "__main__":
    main()
  1. 通过 python 启动服务
python mcp_server.py
  1. 在相同的目录下创建 test.txt 文件。
Hello, this is a test file!
  1. 另外启动一个命令窗口,输入:
echo '{"jsonrpc": "2.0", "method": "read_resource", "params": {"uri": "file:///D:/path/to/test.txt"}, "id": 2}' | python mcp_server.py

{"jsonrpc": "2.0", "result": "Hello, this is a test file!", "id": 2}

注:此处使用的是 PowerShell,我们看到服务返回了文件的内容。

使用现有 MCP Servers

GitHub:在 GitHub 上查找 MCP servers:

  • https://github.com/modelcontextprotocol/servers
  • https://github.com/punkpeye/awesome-mcp-servers

网站:通过下面的网站查找 MCP servers:

  • https://mcpservers.org
  • https://mcp.so
  • https://glama.ai/mcp/servers
  • https://www.pulsemcp.com/

UI自动化相关的 MCP servers

  • playwright: https://github.com/executeautomation/mcp-playwright
  • browserbase: https://github.com/browserbase/mcp-server-browserbase
  • puppeteer https://github.com/modelcontextprotocol/servers/tree/HEAD/src/puppeteer

我们以 Playwright 项目为例子。

playwright 项目:https://github.com/AutoTestClass/playwright-mind

在项目里添加 playwright-mcp-server

git clone https://github.com/AutoTestClass/playwright-mind
cd playwright-mind
npm install -g @executeautomation/playwright-mcp-server # <--添加--

MCP Client

MCP client 一般选用 AI 应用程序(如 Claude Desktop、cline 或其他 LLM 工具),负责发起请求并与服务器通信。

我们这里选用 VSCode + cline 的组合,关于二者的使用,铺天盖地都是使用的文章,这里就不介绍了。

  1. 首先,在 VSCode 中打开 cline 插件,在 MCP servers 中搜索 playwright 插件安装。
    在这里插入图片描述

  2. 然后,配置 playwright mcp servers 的启动配置。
    在这里插入图片描述

{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": ["-y", "@executeautomation/playwright-mcp-server"]
    }
  }
}
  1. 最后,通过 LLM 大模型,描述需求(UI 自动化相关操作),LLM 大模型会通过 playwright MCP servers 启动浏览器完成一些 UI 自动化操作。
    在这里插入图片描述

MCP Servers的作用

最后,我们再来总结 MCP Servers 的作用。懒得画图了,下面是我网上找的一张图。结合前面的操作流程,相信你已经知道 MCP Servers 可以做什么了。
在这里插入图片描述
MCP Servers 真正的价值不在于我们传统的 UI 自动化测试,因为它是通过文字描述操作浏览器去完成一些工作。并没有自动化的脚本沉淀,当然,如果你把 Prompt 沉淀下来当作自动化脚本也是可以的,这确实颠覆了我们写自动化脚本的形式。
当然,MCP Servers 更多的价值不是浏览器自动化,而是利用 LLM 操作本地资源,例如,本地文件,数据库、git 等。想想 你不需要写复杂的 SQL 语句,通过自然语言描述就可以轻松完成本地数据库的操作。 这种效率的提升是非常明显。
在这里插入图片描述

MCP2515是一款常用的CAN控制器芯片,用于控制CAN总线的通信。位修改指令是MCP2515提供的一种特殊的指令,用于在不影响其他位的情况下修改寄存器中的特定位。 为了使用位修改指令,你需要了解MCP2515的寄存器映射以及位修改指令的格式。MCP2515的寄存器可以通过SPI接口进行读写操作。以下是位修改指令的一般格式: 1. 发送读寄存器命令(0x03)以及要修改的寄存器地址。 2. 发送待修改位的屏蔽字节(Mask Byte)以及相应的数据字节(Data Byte)。 屏蔽字节是用来指定哪些位需要被修改,相应的数据字节则是指定要写入的新值。屏蔽字节中置位(1)的位表示对应的位可以被修改,而清零(0)的位表示对应的位保持不变。 下面是一个示例来说明位修改指令的使用: 假设要将MCP2515的CANCTRL寄存器(地址为0x0F)中的REQOP位(位6-4)设置为二进制值011,而不影响其他位。 首先,发送读寄存器命令(0x03)以及CANCTRL寄存器地址(0x0F)。 然后,发送屏蔽字节为0xE7(二进制11100111)和数据字节为0x18(二进制00011000)。 屏蔽字节0xE7的二进制表示为:11100111 数据字节0x18的二进制表示为:00011000 根据屏蔽字节和数据字节的对应关系,可以看出只有REQOP位(位6-4)会被修改。屏蔽字节中置位的位对应的位可以进行修改,而清零的位则表示对应的位保持不变。 最后,MCP2515将根据指定的屏蔽字节和数据字节将CANCTRL寄存器中的REQOP位设置为011,同时保持其他位不变。 请注意,具体的寄存器和位的映射关系,以及屏蔽字节和数据字节的设置会根据具体的MCP2515芯片和应用场景而有所不同。确保参考相关文档和手册以获取准确的指令格式和使用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虫师2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值