Type something to search...
使用自动生成的 MCP 服务器的 C++ RESTful 网络服务与 LLM 连接

使用自动生成的 MCP 服务器的 C++ RESTful 网络服务与 LLM 连接

这是一个 5 分钟的教程,介绍如何将 MCP (Model Context Protocol) 服务器添加到您现有的 Oat++ 应用程序,以便 LLMs 可以查询您的 API。

前提条件

在开始之前,您需要一个使用 Oat++ 构建的有效 web 服务。

如果您还没有一个有效的 Oat++ web 服务,可以通过以下教程创建一个:C++ RESTful web service with Swagger-UI and auto-documented endpoints。或者,您可以使用 Oat++ 的示例项目之一。

在本教程中,我们将使用 example-crud 项目进行演示。

将 oatpp-mcp 添加到您的项目中

oatpp-mcp 模块实现了 Anthropic 的模型上下文协议 (MCP)。它允许您通过手动定义 工具提示资源 来创建独立的 MCP 服务器,这些内容将提供给 LLM。此外,它可以 从您的 ApiController 自动生成工具

步骤 1:克隆 oatpp-mcp

git clone https://github.com/oatpp/oatpp-mcp

步骤 2:构建并安装 oatpp-mcp

cd oatpp-mcp/
mkdir build && cd build/
cmake ..
sudo make install

第3步:将 oatpp-mcp 链接到您的应用程序

安装完成后,您可以将 oatpp-mcp 模块链接到您的应用程序。请按如下方式更新您的 example-crud/CMakeLists.txt

find_package(oatpp          1.4.0 REQUIRED)
find_package(oatpp-swagger  1.4.0 REQUIRED)
find_package(oatpp-mcp      1.4.0 REQUIRED) # <-- Add this
find_package(oatpp-sqlite   1.4.0 REQUIRED)

target_link_libraries(crud-lib
        # Oat++
        PUBLIC oatpp::oatpp
        PUBLIC oatpp::oatpp-swagger
        PUBLIC oatpp::oatpp-mcp             # <-- And this
        PUBLIC oatpp::oatpp-sqlite
)

通过 MCP 工具暴露您的 REST API

Oat++ MCP 服务器支持 HTTP-SSE(服务器推送事件)和 STDIO 传输。根据您使用的传输方式,MCP 服务器的工作方式和运行方式会有一些小的差异。

HTTP-SSE 传输

让我们从 SSE 传输开始。

在 HTTP-SSE 传输的情况下,MCP 在与您的 REST API 相同的端口上提供服务。MCP 服务器会向路由器添加两个端点:

  • GET {prefix}/sse — 用于服务器发送事件
  • POST {prefix}/sessions/{sessionId} — LLM 发送事件

修改您的 App.cpp(在我的例子中是 example-crud/src/App.cpp)…

步骤 1:创建 MCP 服务器

#include "oatpp-mcp/Server.hpp"

...

oatpp::mcp::Server mcpServer; //<-- create mcpServer instance

步骤 2:将 MCP 服务器的端点添加到路由器

router->addController(mcpServer.getSseController());

步骤 3:指定 MCP 服务器应提供哪些端点

mcpServer.addEndpoints(userController->getEndpoints());

就这样!现在 LLM 可以通过 MCP 连接到您的服务器及其 API。

为了进行快速测试,我们可以使用 MCP Inspector

  • 在传输下拉菜单中选择“SSE
  • 在**“URL”下输入“SSE”**端点(应该是 http://localhost:<port>/sse)。
  • 连接并转到**“工具”**选项卡。

有关如何运行 MCP Inspector 的详细信息,请参阅 MCP Inspector GitHub 仓库

STDIO 传输

在 STDIO 传输的情况下,MCP 服务器不会向路由器添加任何端点。相反,它监听 STDIO 流并将 API 调用转发到 ApiController。此外,我们需要通过将日志重定向到文件来静音所有日志,以避免干扰 STDIO 流。

修改你的 App.cpp(在我的情况下是 example-crud/src/App.cpp)…

步骤 1:创建 MCP 服务器

#include "oatpp-mcp/Server.hpp"

...

oatpp::mcp::Server mcpServer; //<-- create mcpServer instance

步骤 2:指定 MCP 服务器应该提供哪些端点

mcpServer.addEndpoints(userController->getEndpoints());

步骤 3:在与 HTTP 服务器线程并行运行的线程中监听 STDIO 流。

  std::thread http([&server, connectionProvider]{
    OATPP_LOGd("Server", "Running on port {}...", connectionProvider->getProperty("port").toString())
    server.run();
  });

  std::thread mcp([&mcpServer]{
    OATPP_LOGd("MCP Server", "Serving via STDIO {}...")
    mcpServer.stdioListen();
  });

  http.join();
  mcp.join();

步骤 4:将日志重定向到文件

class FileLogger : public oatpp::Logger {
private:
  std::mutex m_mutex;
public:

  void log(v_uint32 priority, const std::string& tag, const std::string& message) override {
    std::lock_guard<std::mutex> lock(m_mutex);
    std::ofstream fout(LOG_FILE);
    fout << tag << ": " << message << std::endl;
  }

};

...

oatpp::Environment::init(
  std::make_shared<FileLogger>()
);

就这样!我们可以像之前使用 MCP Inspector 一样测试它,或者我们可以使用 Claude Desktop 来查看 LLM 如何与我们的服务互动。

与 Claude 的桌面测试

步骤 1:将您的 MCP 服务器添加到 Claude 配置中

在 Mac 上 (对于其他平台,请参考 Claude 的文档):

vi ~/Library/Application\ Support/Claude/claude_desktop_config.json

添加您的服务器可执行文件(在我的情况下是 crud-exe示例-crud 服务):

{
  "mcpServers": {
    "test-tool": {
      "command": "/path/to/server/executable"
    }
  }
}

步骤 2:重新启动 Claude 应用程序并请求 LLM 查询您的服务。

正如您所看到的,Claude 已成功通过 MCP 服务器执行所有基本 CRUD 操作。我们所需要做的只是添加几行代码,其余的由 Oat++ 框架生成。

有关完整示例,请克隆 示例-crud 项目(add_mcp_server 分支)。

git clone -b add_mcp_server https://github.com/oatpp/example-crud

有用的链接

Related Posts

使用 ChatGPT 搜索网络功能的 10 种创意方法

使用 ChatGPT 搜索网络功能的 10 种创意方法

例如,提示和输出 你知道可以使用 ChatGPT 的“搜索网络”功能来完成许多任务,而不仅仅是基本的网络搜索吗? 对于那些不知道的人,ChatGPT 新的“搜索网络”功能提供实时信息。 截至撰写此帖时,该功能仅对使用 ChatGPT 4o 和 4o-mini 的付费会员开放。 ![](https://images.weserv.nl/?url=https://cdn-im

阅读更多
在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和科技这样一个动态的行业中,保持领先意味着不断提升你的技能。无论你是希望深入了解人工智能模型性能、掌握数据分析,还是希望通过人工智能转变传统领域如法律,这些课程都是你成功的捷径。以下是一个精心策划的高价值课程列表,可以助力你的职业发展,并让你始终处于创新的前沿。 1. 生成性人工智能简介课程: [生成性人工智能简介](https://genai.works

阅读更多
10 个强大的 Perplexity AI 提示,让您的营销任务自动化

10 个强大的 Perplexity AI 提示,让您的营销任务自动化

在当今快速变化的数字世界中,营销人员总是在寻找更智能的方法来简化他们的工作。想象一下,有一个个人助理可以为您创建受众档案,建议营销策略,甚至为您撰写广告文案。这听起来像是一个梦想? 多亏了像 Perplexity 这样的 AI 工具,这个梦想现在成为现实。通过正确的提示,您可以将 AI 转变为您的 个人营销助理。在本文中,我将分享 10 个强大的提示,帮助您自动

阅读更多
10+ 面向 UI/UX 设计师的顶级 ChatGPT 提示

10+ 面向 UI/UX 设计师的顶级 ChatGPT 提示

人工智能技术,如机器学习、自然语言处理和数据分析,正在重新定义传统设计方法。从自动化重复任务到实现个性化用户体验,人工智能使设计师能够更加专注于战略思维和创造力。随着这一趋势的不断增长,UI/UX 设计师越来越多地采用 AI 驱动的工具来促进他们的工作。利用人工智能不仅能提供基于数据的洞察,还为满足多样化用户需求的创新设计解决方案开辟了机会。 1. 用户角色开发 目的

阅读更多
在几分钟内完成数月工作的 100 种人工智能工具

在几分钟内完成数月工作的 100 种人工智能工具

人工智能(AI)的快速发展改变了企业的运作方式,使人们能够在短短几分钟内完成曾经需要几周或几个月的任务。从内容创作到网站设计,AI工具帮助专业人士节省时间,提高生产力,专注于创造力。以下是按功能分类的100个AI工具的全面列表,以及它们在现实世界中的使用实例。 1. 研究工具 研究可能耗时,但人工智能工具使查找、分析和组织数据变得更加容易。**ChatGPT, Cop

阅读更多
你从未知道的 17 个令人惊叹的 GitHub 仓库

你从未知道的 17 个令人惊叹的 GitHub 仓库

Github 隐藏的宝石!! 立即收藏的代码库 学习编程相对简单,但掌握编写更好代码的艺术要困难得多。GitHub 是开发者的宝藏,那里“金子”是其他人分享的精心编写的代码。通过探索 GitHub,您可以发现如何编写更清晰的代码,理解高质量代码的样子,并学习成为更熟练开发者的基本步骤。 1. notwaldorf/emoji-translate *谁需

阅读更多