文章目录
- 一、Qt实现MCP是不是走偏门?
-
- [1.1 核心技术实现](#1.1 核心技术实现)
-
- [1. 服务器架构设计](#1. 服务器架构设计)
- [2. Qt HttpServer的使用](#2. Qt HttpServer的使用)
- [3. Qt Concurrent的并发处理](#3. Qt Concurrent的并发处理)
- [1.2. MCP协议实现](#1.2. MCP协议实现)
-
- [1. 核心方法实现](#1. 核心方法实现)
- [2. 工具函数注册机制](#2. 工具函数注册机制)
- [1.3 小回顾:Qt HttpServer+Concurrent好在哪](#1.3 小回顾:Qt HttpServer+Concurrent好在哪)
- 二、AI调用MCP的应用效果
- 三、总结
-
- [3.1 技术栈对比](#3.1 技术栈对比)
- [3.2 MCP本身的问题](#3.2 MCP本身的问题)
- [四 源码链接](#四 源码链接)
一、Qt实现MCP是不是走偏门?
现在,MCP服务器已经非常流行了,很多软件都通过MCP和Skills为AI暴露功能句柄,允许LLM在必要时调用功能,完成对软件工具的操作。纵观网上常见的MCP实现,鲜有Qt的案例。现在AI编程厉害了,前面用对话式AI推导公式,实现算法,现在看看能不能在Trae环境下直接理解调用传统Qt代码,生成MCP的封装。
实验箱目是从传统C++代码改造而来。MCP协议涉及到标准化的JSON结构握手和约定,本次实验,准备继续使用TRAE自动化编程技术。具体的来说:
- 使用提示词,让TRAE理解C++的代码。
- 在理解C++代码的基础上,Trae Solo模式实现MCP协议的封装。
- 人类调试并进行手工微调修改。
- 注册MCP,并测试。
最终效果:实现了基于Qt的MCP(Model Context Protocol)服务器。项目包含两个主要MCP服务:
- 地理计算MCP服务器(geocalc/mcp/server):提供各种地理坐标转换、距离计算等功能
- 地图服务器MCP(qplanetosm/mcp_mapserver):提供地图标记、路径绘制等功能
我们可以通过本文章看到,Qt具有成熟的HttpServer开发能力,可以轻松应对MCP Server的开发需求,并在使用自然语言求解6G天基互联网的基本覆盖问题上实现初步的问答应用。

1.1 核心技术实现
1. 服务器架构设计
MCP服务器采用三层架构:
- HTTP层:处理HTTP请求和响应
- MCP协议层:实现MCP协议的各种方法
- 工具函数层:提供具体的业务功能
2. Qt HttpServer的使用
Qt HttpServer 结合 Concurrent,可以支持极为灵活的线程池并发模型。
在Qt6.10里,HttpServer可以绑定到一个tcp端口,实现多个 httpServer 采用不同的 router ,共享1个端口。这种原理类似 nginx。
服务器初始化:
在main函数里,直接开启线程池,新建TCP端口,而后绑定服务器。
cpp
// 初始化线程池
QThreadPool * threadPool = new QThreadPool();
threadPool->setMaxThreadCount(16);
threadPool->setExpiryTimeout(3600*24*365);
// 创建TCP服务器
QTcpServer* tcpServer = new QTcpServer();
if (!tcpServer->listen(QHostAddress(addr), port)) {
// 错误处理
}
// 创建HTTP服务器
QHttpServer* svr = new QHttpServer(threadPool);
if (!svr->bind(tcpServer)) {
// 错误处理
}
上面的例子里,线程池、TCP服务器、Http服务器是一对一的。实际情况,他们可以是1对多的。
路由配置:
为server添加处理路由借点,把/mcp等虚拟路径路由到不同的逻辑处理。注意,在路由处理的逻辑里,直接使用的是QFuture返回值的异步请求。
cpp
// 添加OPTIONS端点
server->route(routePath, QHttpServerRequest::Method::Options, [this](QHttpServerResponder& response) {
QHttpServerResponse rp(QHttpServerResponder::StatusCode::NoContent);
rp.setHeaders(defautl_Header());
response.sendResponse(rp);
});
// 添加POST端点
server->route(routePath, QHttpServerRequest::Method::Post, [this, threadPool](const QHttpServerRequest& request) {
QByteArray array = request.body();
// 并发处理请求
return QtConcurrent::run(threadPool,[this, array]() {
// 处理请求
});
});
3. Qt Concurrent的并发处理
异步请求通过一个Lambda表达式,捕获局部变量和This指针,实现具体的信息提取和处理逻辑:
异步处理HTTP请求:
cpp
return QtConcurrent::run(threadPool,[this, array]() {
// 解析JSON请求
QJsonParseError parseError;
QJsonObject jsonObject = QJsonDocument::fromJson(array, &parseError).object();
if (parseError.error != QJsonParseError::NoError) {
return error_happened("", "JSON Error", -32700);
}
// 提取方法名并处理
QString method = jsonObject["method"].toString();
// 处理不同类型的请求...
});
1.2. MCP协议实现
1. 核心方法实现
- handle_initialize:响应客户端询问服务特性
- handle_ping:响应客户端保活请求
- handle_toolist:返回可用工具函数列表
- handle_tools_call:处理具体工具函数调用
cpp
QHttpServerResponse McpServer::handle_initialize(const QJsonObject& jsonObject) {
QJsonObject capabilities{
{"tools", QJsonObject({\n {"listChanged", true}\n })}
};
QJsonObject serverInfo{
{"name", "geocalc_mcp_server"},
{"version", "1.0"}
};
QJsonObject result{
{"capabilities", capabilities},
{"protocolVersion", "2025-03-26"},
{"serverInfo", serverInfo}
};
QJsonObject responseJson{
{"jsonrpc", "2.0"},
{"id", jsonObject["id"]},
{"result", result}
};
return send_response(responseJson);
}
2. 工具函数注册机制
为了让MCPServer类变得通用,我们设计了比较通用的功能注册和发布机制。原理是开发一个工具函数,并向MCP服务器注册,实现该函数的自动化发布和调用。
注册工具函数:
cpp
void McpServer::register_tool_func(QString name, QJsonObject desc,
std::function<QHttpServerResponse (McpServer* mcpServer, const QJsonObject& objreq) > func)
{
tool_func_desc_map[name] = desc;
tool_func_obj_map[name] = func;
}
注册示例:
cpp
// 注册工具函数
MCP_SERVER::register_toolfunc_lla2ecef(mcpServer);
MCP_SERVER::register_toolfunc_ecef2lla(mcpServer);
MCP_SERVER::register_toolfunc_enu_R_from_lla(mcpServer);
// 更多工具函数注册...
1.3 小回顾:Qt HttpServer+Concurrent好在哪
- 线程池管理:通过QThreadPool管理线程,避免线程频繁创建销毁的开销
- 异步处理:使用QtConcurrent::run实现请求的异步处理,提高并发能力
- 资源利用:合理设置线程池大小(16线程),充分利用系统资源
二、AI调用MCP的应用效果
下一代互联网,是天地一体的互联网,我们就以分析天基互联网卫星的地面覆盖区域和天线主瓣覆盖范围,可视化展示覆盖效果为例子,看看AI
能力如何。
示例对话:
用户:我有一个卫星,轨道高度901.33千米,星下点经度89.222度,纬度23.4847度。请求取地面覆盖区域,并绘制多边形。
AI:我将使用地理计算MCP服务计算卫星覆盖区域,然后使用地图MCP服务绘制多边形。
AI:调用工具 mcp_Geocalc_MCP_Server_contour_elevation
AI:计算得到72个覆盖区域边界点
AI:调用工具 mcp_mapserver_MCP_Server_update_polygon
AI:覆盖区域绘制成功!已将卫星地面覆盖区域添加到地图中。
可视化效果:
- 半透明蓝色填充的多边形,显示卫星全向覆盖范围
- 覆盖区域呈现不规则形状,最北点纬度约52.35度,最南点纬度约-5.41度

示例对话:
用户:这颗卫星上有一个定向天线,姿态角度:Heading为134度,Pitch为-45度,roll为0. 这个天线的方向图主瓣张角为16度,请求取主瓣在地面的覆盖范围。
AI:我将使用地理计算MCP服务计算天线主瓣覆盖范围,然后使用地图MCP服务绘制多边形。
AI:调用工具 mcp_Geocalc_MCP_Server_HPR_Polar_Alpha2LLAs
AI:计算得到73个覆盖区域边界点
AI:调用工具 mcp_mapserver_MCP_Server_update_polygon
AI:天线主瓣覆盖范围绘制成功!已添加到地图中。

可视化效果:
- 半透明红色填充的多边形,显示天线主瓣覆盖范围
- 覆盖区域呈现扇形,主要覆盖东南亚地区
- 与星下点标记(黄色圆形)配合,直观展示天线指向

三、总结
使用Qt的HttpServer和Concurrent模块实现MCP服务器,具有以下显著优势:
- 高性能:通过线程池和异步处理,实现高并发请求处理
- 易扩展:模块化设计和工具函数注册机制,便于功能扩展
- 可靠性:完善的错误处理和资源管理,确保服务稳定运行
- 标准兼容:完全实现MCP协议,与各种客户端兼容
- 开发效率:利用Qt的成熟组件,减少开发工作量
这种实现方式不仅适用于地理计算和地图服务,也可以推广到其他需要高性能RPC服务的场景。通过TRAE自动化编程技术,传统C++代码可以快速转型为现代化的服务架构,提升系统的可维护性和扩展性。
3.1 技术栈对比
| 技术方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Qt HttpServer + Concurrent | 高性能、跨平台、易于集成 | 依赖Qt框架 | 桌面应用、跨平台服务 |
| Node.js + Express | 轻量级、生态丰富 | 单线程性能受限 | Web应用、API服务 |
| Python + Flask/FastAPI | 开发效率高、库丰富 | 性能不如C++ | 原型开发、数据处理 |
| C++ + Boost.Asio | 性能极高、灵活 | 开发复杂度高 | 高性能服务、嵌入式系统 |
3.2 MCP本身的问题
从本实验来看,AI在没有行业背景的时候,对MCP的使用有如下短板:
- 对准确的单一功能调用描述,可以很好的识别。但如果笼统的给出需要连续调用4-5个函数的需求,很可能会跑偏。
- 输入输出效率差。全靠LLM,尤其是MCPServer返回大量JSON数组时,快速消耗Tokens,等了很久才出结果。
- 如果你本身很熟练,建议自己写C++函数来实现功能,说话说半天,有这时间他亚的早就自己撸完了。
因此,MCPServer 擅长:做一件很复杂的很大粒度的事情,比如"帮我炒一盘番茄炒蛋",而后MCPServer里面自己切菜、配料、打鸡蛋、翻炒,上盘。
MCPServer不适合:做小碎步,比如实现切菜、配料、打鸡蛋、翻炒,上盘这种精细的操作。如果你不提供菜谱,别指望它每次都能响应"帮我炒番茄炒蛋"的步骤。
四 源码链接
请参考 gitcode 服务器: