返回市场
MCP控制台

MCP控制台

作者:servoagents2 星标更新:2025-11-18

项目介绍

mcp-c

一个小巧且可移植的C语言实现的MCP风格的JSON-RPC服务器,具有可插拔的传输接口。它包括:

  • 核心服务器,带有处理器注册表和最小的JSON字段提取
  • 使用BSD套接字的HTTP传输
  • 针对Linux和Zephyr的示例

该项目是探索AI代理在物联网/工业物联网和机器人(如运行Zephyr的ESP32边缘设备)中的应用的一部分,因此它是一个嵌入式目标的学习/参考实现。它专注于一个足够小的子集来测试外部客户端,但尚未准备好用于生产环境。

概述

该库干净地分离了JSON-RPC协议逻辑与网络,因此只需少量更改即可在Linux和Zephyr上运行:

  • 核心:最小的JSON-RPC解析(仅提取“id”和“method”)。
  • 传输:可插拔的mcp_transport_t(初始化、轮询、发送、关闭),由简单的循环驱动。
  • 服务器:小型处理器注册表(例如,“initialize”,“tools/list”,“tools/call”),通过传输分派请求并写入响应。

目前,HTTP传输:

  • 监听TCP端口8080(可通过MCP_HTTP_PORT覆盖)。
  • 接受HTTP/1.1 POST请求,并将正文视为JSON-RPC(路径不强制;//mcp均可工作)。
  • 每个连接一个请求;回复后关闭套接字。

有关架构和传输实现的更多细节,请参阅docs/architecture.md

构建

Linux

需求:CMake和C编译器

mkdir -p build && cd build
cmake .. -DMCP_ENABLE_EXAMPLES=ON
cmake --build . --config Release
./examples/linux/mcp_server/mcp-linux-mcp_server

服务器监听http://0.0.0.0:8080。请参阅下面的“使用curl进行测试(Linux和Zephyr)”。

Zephyr

ESP32(WiFi)

# 设置
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

# 构建和刷写
./scripts/build-zephyr.sh --init
./scripts/build-zephyr.sh -b esp32_devkitc/esp32/procpu --wifi-ssid "SSID" --wifi-pass "PASS"
cd examples/zephyr/mcp_server
west flash && west espressif monitor

native_sim(本地测试)

# 构建和运行
./scripts/build-zephyr.sh -b native_sim
./examples/zephyr/mcp_server/build/zephyr/zephyr.exe

使用localhost:8080和本地卸载套接字。

详情请参阅examples/zephyr/mcp_server/README.md

使用curl进行测试(Linux和Zephyr)

# 初始化会话并获取功能/协议版本
curl -s -X POST http://HOST:8080 -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":"1","method":"initialize","params":{}}'

# 列出服务器公开的可用工具
curl -s -X POST http://HOST:8080 -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":"2","method":"tools/list","params":{}}'

# 调用“echo”工具;此演示返回固定的问候语
curl -s -X POST http://HOST:8080 -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":"3","method":"tools/call","params":{"name":"echo","arguments":{"text":"hi"}}}'

将HOST替换为localhost(Linux/native_sim)或Zephyr设备IP(ESP32)。

传输

所有传输都符合相同的最小接口(mcp_transport_t:初始化、轮询、发送、关闭)。当前和计划支持的传输:

传输状态备注
HTTP已实现简单的POST -> JSON-RPC,每个连接一个请求(尚无SSE)
MQTT计划中主题模型(例如mcp/<server>/reqmcp/<client>/resp)用于发布/订阅边缘设备
CoAP计划中轻量级UDP用于受限设备;将JSON-RPC映射到确认/非确认消息
Zenoh计划中超低延迟分布式键值;类似于MQTT的最小发布/订阅模式

规范参考(MCP):定义了标准I/O和流式HTTP(可选SSE)。当前实现仅涵盖HTTP的POST部分。未来工作:SSE流式传输、标准I/O传输以及上述计划的协议。

库API(快速浏览)

  • mcp_server_initmcp_server_runmcp_server_register
  • mcp_transport_http() 返回HTTP传输
  • 处理程序签名: int handler(mcp_session_t *session, const mcp_message_t *req, char *resp_buf, size_t resp_buf_sz)

处理程序必须用有效的JSON-RPC响应对象填充resp_buf

注意事项和限制

  • 最小的JSON字段提取(id/method)以保持占用空间小;不完全解析参数。
  • 仅支持HTTP;尚无TLS。可以通过实现mcp_transport_t添加额外的传输(CoAP,MQTT-SN)和TLS。
  • 当前HTTP传输接受任何URL路径,并处理每个连接的一个请求。
  • 当前响应示例中硬编码了id;实际代码中应使用请求的id

文档

渲染文档(Just the Docs主题):https://servoagents.github.io/mcp-c/

本地预览:

docker run --rm -it -p 4000:4000 -v "$PWD/docs":/site -w /site ruby:3.2 bash -lc 'gem install bundler && bundle install && bundle exec jekyll serve -H 0.0.0.0'

然后打开http://localhost:4000/mcp-c/

贡献

欢迎贡献。

如果不确定方向(例如新的传输),首先打开一个问题进行对齐。

  1. 分叉仓库并创建功能分支:git checkout -b feature/xyz
  2. 构建并运行示例(Linux和/或Zephyr)以验证更改。
  3. 保持更改最小;避免引入重依赖。保持传输简单。
  4. 遵循现有的C风格(见.clang-format)。
  5. 如果更改公共行为,请在docs/中添加或更新文档。
  6. 打开PR描述理由、测试步骤及任何限制。

许可证

MIT许可证 - 详见LICENSE.txt