一个轻量级的C库,用于创建MCP(模型上下文协议)服务器,可以将现有的C函数转换为AI可访问的工具,并且只需进行少量代码更改。
EmbedMCP弥合了现有C代码库与现代AI系统之间的差距。无需重写经过验证的C函数,EmbedMCP允许您通过标准化的模型上下文协议(MCP)以最小的代码更改将其暴露给AI模型。
下载EmbedMCP
git clone https://github.com/AaronWander/EmbedMCP.git
cd EmbedMCP
复制到您的项目
cp -r embed_mcp/ your_project/
#include "embed_mcp/embed_mcp.h"
// 您的业务函数
double add_numbers(double a, double b) {
return a + b;
}
// 使用宏生成包装器
EMBED_MCP_WRAPPER(add_wrapper, add_numbers, DOUBLE, DOUBLE, a, DOUBLE, b)
int main() {
embed_mcp_config_t config = {
.name = "MathServer",
.version = "1.0.0",
.instructions = "简单的数学运算服务器",
.port = 8080
};
embed_mcp_server_t *server = embed_mcp_create(&config);
// 注册函数
const char* names[] = {"a", "b"};
const char* descs[] = {"第一个数字", "第二个数字"};
mcp_param_type_t types[] = {MCP_PARAM_DOUBLE, MCP_PARAM_DOUBLE};
embed_mcp_add_tool(server, "add", "加两个数",
names, descs, types, 2, MCP_RETURN_DOUBLE, add_wrapper, NULL);
embed_mcp_run(server, EMBED_MCP_TRANSPORT_STREAMABLE_HTTP);
embed_mcp_destroy(server);
return 0;
}
# 构建
make
# 运行流式HTTP服务器
./bin/mcp_server --transport streamable-http --port 8080
# 或运行STDIO服务器
./bin/mcp_server --transport stdio
EmbedMCP支持两种注册方法:
// 业务函数
double add_numbers(double a, double b) {
return a + b;
}
// 一行生成包装器
EMBED_MCP_WRAPPER(add_wrapper, add_numbers, DOUBLE, DOUBLE, a, DOUBLE, b)
// 注册
const char* names[] = {"a", "b"};
const char* descs[] = {"第一个数字", "第二个数字"};
mcp_param_type_t types[] = {MCP_PARAM_DOUBLE, MCP_PARAM_DOUBLE};
embed_mcp_add_tool(server, "add", "加两个数",
names, descs, types, 2, MCP_RETURN_DOUBLE, add_wrapper, NULL);
// 业务函数
double sum_numbers(double* numbers, size_t count) {
double sum = 0.0;
for (size_t i = 0; i < count; i++) {
sum += numbers[i];
}
return sum;
}
// 手动包装器(处理内存管理)
void* sum_wrapper(mcp_param_accessor_t* params, void* user_data) {
size_t count;
double* numbers = params->get_double_array(params, "numbers", &count);
double result_val = sum_numbers(numbers, count);
free(numbers); // 清理
double* result = malloc(sizeof(double));
*result = result_val;
return result;
}
// 注册带有数组参数
mcp_param_desc_t params[] = {
MCP_PARAM_ARRAY_DOUBLE_DEF("numbers", "数字数组", "一个数值", 1)
};
embed_mcp_add_tool(server, "sum", "求和", params, NULL, NULL, 1,
MCP_RETURN_DOUBLE, sum_wrapper, NULL);
EmbedMCP自动处理大部分内存管理:
您的责任:字符串返回值必须使用malloc():
char* get_weather(const char* city) {
char* result = malloc(200); // ✅ EmbedMCP会调用free()
sprintf(result, "天气:%s:晴朗", city);
return result;
}
./my_server --transport streamable-http --port 8080
Mcp-Session-Id头部Mcp-Protocol-Version头部适用于如Claude Desktop的MCP客户端:
./my_server --transport stdio
<table> <tr> <td width="50%">强大的宏用于复杂的参数定义
// 双精度数组
MCP_PARAM_ARRAY_DOUBLE_DEF(
"numbers",
"数字数组",
"一个数值",
1 // 必需
)
// 字符串数组
MCP_PARAM_ARRAY_STRING_DEF(
"items",
"项目列表",
"一个项目名称",
1 // 必需
)
</td>
<td width="50%">
// 双精度参数
MCP_PARAM_DOUBLE_DEF(
"temperature",
"摄氏温度",
1 // 必需
)
// 字符串参数
MCP_PARAM_STRING_DEF(
"city",
"城市名称",
0 // 可选
)
</td>
</tr>
</table>
包含的示例演示了所有EmbedMCP功能:
# 构建并运行示例
make && ./bin/mcp_server --transport stdio
| 工具 | 参数 | 描述 | 示例 |
|---|---|---|---|
add | a: number, b: number | 加两个数 | add(10, 20) → 30 |
sum_numbers | numbers: number[] | 求数组的和 | sum_numbers([1,2,3]) → 6 |
join_strings | strings: string[], separator: string | 连接字符串数组 | join_strings(["a","b"], ",") → "a,b" |
weather | city: string | 获取天气信息 | weather("济南") → 天气报告 |
calculate_score | base_points: int, grade: string, multiplier: number | 计算带奖励的分数 | calculate_score(80, "A", 1.2) → 120 |
./bin/mcp_server --transport streamable-http --port 8080http://localhost:8080/mcpEmbedMCP设计用于嵌入式系统的最大可移植性:
构建错误:
# 缺少依赖项
make deps
# 清洁构建
make clean && make
运行时错误:
# 启用调试日志
./bin/mcp_server --transport stdio --debug
# 检查内存使用情况
valgrind ./bin/mcp_server --transport stdio
连接问题:
我们欢迎贡献!请参阅我们的贡献指南:
git checkout -b feature/amazing-feature)git commit -m '添加惊人的功能')git push origin feature/amazing-feature)# 克隆仓库
git clone https://github.com/AaronWander/EmbedMCP.git
cd EmbedMCP
# 构建调试版本
make debug
# 运行测试
make test
此项目采用MIT许可证 - 详情请参阅LICENSE文件。