<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: zhoutk</title>
    <description>The latest articles on DEV Community by zhoutk (@zhoutk).</description>
    <link>https://dev.to/zhoutk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4186310%2Fae14fd6a-d355-4651-8109-fe312b40d434.png</url>
      <title>DEV Community: zhoutk</title>
      <link>https://dev.to/zhoutk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zhoutk"/>
    <language>en</language>
    <item>
      <title>There is no official C++ SDK for MCP. So we wrote one — and ran it through the official conformance suite.</title>
      <dc:creator>zhoutk</dc:creator>
      <pubDate>Fri, 16 Oct 2026 01:47:55 +0000</pubDate>
      <link>https://dev.to/zhoutk/there-is-no-official-c-sdk-for-mcp-so-we-wrote-one-and-ran-it-through-the-official-conformance-3nkf</link>
      <guid>https://dev.to/zhoutk/there-is-no-official-c-sdk-for-mcp-so-we-wrote-one-and-ran-it-through-the-official-conformance-3nkf</guid>
      <description>&lt;p&gt;C++ is where the world's data infrastructure lives — databases, game engines,&lt;br&gt;
embedded devices, trading systems, HPC. Agents increasingly need to reach into&lt;br&gt;
those systems, and MCP is the protocol everyone is standardizing on. The&lt;br&gt;
official SDK roster lists ten languages: TypeScript, Python, C#, Go, Rust,&lt;br&gt;
Ruby, Java, Swift, PHP, Kotlin. C++ — the language those systems are written&lt;br&gt;
in — is not one of them.&lt;/p&gt;

&lt;p&gt;So we wrote &lt;a href="https://github.com/zhoutk/mcp-cpp" rel="noopener noreferrer"&gt;mcp-cpp&lt;/a&gt;: a C++17 SDK targeting&lt;br&gt;
the &lt;strong&gt;2026-07-28&lt;/strong&gt; specification. No async runtime. No OpenSSL either — the&lt;br&gt;
crypto (SHA-256/HMAC, CSPRNG) is in-tree. One bundled JSON header, one optional&lt;br&gt;
HTTP library. &lt;code&gt;find_package(mcp CONFIG)&lt;/code&gt; and it's in your build.&lt;/p&gt;

&lt;p&gt;This post is about what it is, what the official conformance suite taught us —&lt;br&gt;
and one bug we found in the harness itself.&lt;/p&gt;
&lt;h3&gt;
  
  
  What implementing the 2026-07-28 spec actually means
&lt;/h3&gt;

&lt;p&gt;The current revision is a big departure from the 2025-era model: no&lt;br&gt;
&lt;code&gt;initialize&lt;/code&gt; handshake, no session ids. Every request carries its protocol&lt;br&gt;
version and client capabilities in &lt;code&gt;params._meta&lt;/code&gt;; servers advertise&lt;br&gt;
themselves via &lt;code&gt;server/discover&lt;/code&gt;; the server &lt;strong&gt;never initiates a request&lt;/strong&gt; —&lt;br&gt;
when it needs more input it answers with an &lt;code&gt;input_required&lt;/code&gt; result and the&lt;br&gt;
client retries (MRTR); live updates flow through &lt;code&gt;subscriptions/listen&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;mcp-cpp implements all of it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server:&lt;/strong&gt; &lt;code&gt;Builder&lt;/code&gt; with tools/resources/prompts (including RFC 6570-style
URI templates), capability gating, MRTR with a &lt;strong&gt;signed &lt;code&gt;requestState&lt;/code&gt;
codec&lt;/strong&gt; (HMAC-SHA256, context-bound, TTL — in-tree SHA-256, no crypto
dependency), progress notifications, cancellation, CacheableResult.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client:&lt;/strong&gt; blocking and value-semantic, MRTR auto-fulfil
(&lt;code&gt;callToolWithInput&lt;/code&gt;), and a full &lt;strong&gt;OAuth 2.1 client&lt;/strong&gt; — protected-resource
metadata discovery (RFC 9728), AS metadata (RFC 8414 + OIDC), DCR (RFC 7591),
Client ID Metadata Documents (SEP-991), PKCE (S256) from a CSPRNG,
RFC 8707 resource, RFC 9207 iss validation, scope step-up, SEP-2352
migration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transports:&lt;/strong&gt; stdio and Streamable HTTP on both sides — mirrored headers
(&lt;code&gt;MCP-Protocol-Version&lt;/code&gt;, &lt;code&gt;Mcp-Method&lt;/code&gt;, &lt;code&gt;Mcp-Name&lt;/code&gt;, &lt;code&gt;Mcp-Param-*&lt;/code&gt;) validated
with &lt;code&gt;-32020&lt;/code&gt; enforcement, SSE responses, a GET listening stream for legacy
servers, &lt;code&gt;Last-Event-ID&lt;/code&gt; reconnect honoring the &lt;code&gt;retry:&lt;/code&gt; field.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation:&lt;/strong&gt; a JSON Schema 2020-12 validator (local &lt;code&gt;$ref&lt;/code&gt;, resource
bounds) enforcing &lt;code&gt;inputSchema&lt;/code&gt;/&lt;code&gt;outputSchema&lt;/code&gt; on every call.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A complete server in 15 lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;mcp/mcp.hpp&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Builder&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"my-server"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;R"({"name":"add","description":"adds two integers",
    "inputSchema":{"type":"object","properties":{"a":{"type":"integer"},
      "b":{"type":"integer"}},"required":["a","b"]}})"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;[](&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;McpResult&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Json&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;member&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int64_t&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;member&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;toInt64&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                          &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;member&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"b"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;toInt64&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Json&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;R"({})"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sum"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;structuredResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s"&gt;"sum = "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;StdioTransport&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;has_value&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The proof: the official conformance suite
&lt;/h3&gt;

&lt;p&gt;We didn't self-certify parity — we ran it against&lt;br&gt;
&lt;a href="https://github.com/modelcontextprotocol/conformance" rel="noopener noreferrer"&gt;&lt;code&gt;modelcontextprotocol/conformance&lt;/code&gt;&lt;/a&gt;&lt;br&gt;
(v0.2.0-alpha.12), the same suite the official SDKs use, for &lt;strong&gt;both spec&lt;br&gt;
revisions and both roles&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;2026-07-28&lt;/th&gt;
&lt;th&gt;2025-11-25&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;42/42 checks · 20/20 scenarios (100%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;26/30 (see below)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Client&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;32/32 scenarios · 399/399 checks (100%)&lt;/strong&gt;, including all 25 &lt;code&gt;auth/*&lt;/code&gt; OAuth 2.1 + CIMD scenarios&lt;/td&gt;
&lt;td&gt;17/18 (see below)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every check that doesn't pass is &lt;a href="https://github.com/zhoutk/mcp-cpp/blob/master/conformance/expected-failures.yaml" rel="noopener noreferrer"&gt;baselined with an explanation&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The four 2025 server failures (&lt;code&gt;tools-call-sampling&lt;/code&gt;, &lt;code&gt;tools-call-elicitation&lt;/code&gt;,
&lt;code&gt;elicitation-sep1034-defaults&lt;/code&gt;, &lt;code&gt;elicitation-sep1330-enums&lt;/code&gt;) all require the
server to send a request to the client mid-call — the mechanism 2026-07-28
&lt;strong&gt;replaced with MRTR&lt;/strong&gt;. Implementing a removed mechanism for a 2025-only
scenario is a deliberate non-goal.&lt;/li&gt;
&lt;li&gt;The one 2025 client failure is a harness bug — see next section.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What the suite caught (the honest part)
&lt;/h3&gt;

&lt;p&gt;Running the official harness against a C++ SDK found five real bugs in days.&lt;br&gt;
Each is in the &lt;a href="https://github.com/zhoutk/mcp-cpp/commits/master" rel="noopener noreferrer"&gt;commit history&lt;/a&gt;&lt;br&gt;
with a named spec clause:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Notifications emitted during a request were silently dropped over HTTP&lt;/strong&gt; —
the transport kept only the last line of the response. Progress and logging
on Streamable HTTP didn't exist. Fix: stream multi-message responses as SSE.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;resultType&lt;/code&gt; was injected on legacy responses&lt;/strong&gt; — pre-2026 schemas &lt;em&gt;reject
unknown fields&lt;/em&gt;. A 2026-correct response was a 2025 violation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON-RPC 2.0 allows &lt;code&gt;"id": null&lt;/code&gt; on error responses&lt;/strong&gt; — 2025-era peers
send it; our strict parser rejected it and the client hung until timeout
instead of surfacing the error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The &lt;code&gt;Mcp-Session-Id&lt;/code&gt; from &lt;code&gt;initialize&lt;/code&gt; raced the next request&lt;/strong&gt; — stateful
2025 servers answered &lt;code&gt;400 Invalid or missing session ID&lt;/code&gt;. The response is
now held until the id is captured.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An empty string is a valid mirrored header value&lt;/strong&gt; — &lt;code&gt;Mcp-Param-X:&lt;/code&gt; must
be &lt;em&gt;sent&lt;/em&gt;, not deleted. Our &lt;code&gt;setHeader(name, "")&lt;/code&gt; semantics were wrong, and
the suite's &lt;code&gt;http-custom-headers&lt;/code&gt; scenario (18 checks) proved it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Plus one we found in &lt;strong&gt;their&lt;/strong&gt; mock: the &lt;code&gt;elicitation-sep1034-client-defaults&lt;/code&gt;&lt;br&gt;
scenario's mock never delivers the server→client elicitation — its GET stream&lt;br&gt;
only answers keepalives, and the tool call never completes. We didn't shrug:&lt;br&gt;
we built the &lt;strong&gt;official rust-sdk reference client&lt;/strong&gt; in the same environment and&lt;br&gt;
ran the same scenario — it fails identically (0/5, and crashes with&lt;br&gt;
&lt;code&gt;0xC0000005&lt;/code&gt;). A mock defect, not an SDK defect. We &lt;a href="https://github.com/modelcontextprotocol/conformance/issues/557" rel="noopener noreferrer"&gt;filed it upstream (conformance#557)&lt;/a&gt;&lt;br&gt;
and &lt;a href="https://github.com/zhoutk/mcp-cpp/blob/master/conformance/expected-failures.yaml" rel="noopener noreferrer"&gt;baseline it with that evidence&lt;/a&gt;&lt;br&gt;
until it's fixed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design notes (C++ flavor)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;C++17, not 20/23.&lt;/strong&gt; The audience is existing C++ infrastructure, and GCC 9
and MSVC v142 are everywhere. Conditional &lt;code&gt;std::expected&lt;/code&gt; aliasing gives
modern compilers the standard types without splitting the build matrix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value-semantic, exception-free protocol layer.&lt;/strong&gt; &lt;code&gt;McpResult&amp;lt;T&amp;gt;&lt;/code&gt;,
&lt;code&gt;[[nodiscard]]&lt;/code&gt;, nothing throws between transport and handler.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero crypto dependency.&lt;/strong&gt; HMAC-SHA256 and the CSPRNG (PKCE verifiers,
OAuth state) are in-tree — &lt;code&gt;RtlGenRandom&lt;/code&gt; on Windows, &lt;code&gt;/dev/urandom&lt;/code&gt; on
POSIX.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single-threaded, stateless dispatch&lt;/strong&gt; — one connection, one server, no
locks except the subscription fan-out. For an ORM/database MCP server this is
the right shape: handlers are the slow part, not the loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs bilingual by default&lt;/strong&gt; — English primary, full &lt;code&gt;zh-CN&lt;/code&gt; siblings.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Who's using it
&lt;/h3&gt;

&lt;p&gt;This SDK is the protocol layer behind&lt;br&gt;
&lt;a href="https://github.com/zhoutk/zorm-mcp" rel="noopener noreferrer"&gt;zorm-mcp&lt;/a&gt; — a production MCP server&lt;br&gt;
exposing 13 structured database tools over sqlite3/jsonfile/mysql/postgres/dm8&lt;br&gt;
through one dialect-free surface — and its ORM,&lt;br&gt;
&lt;a href="https://github.com/zhoutk/zorm" rel="noopener noreferrer"&gt;zorm&lt;/a&gt;. Real users, five backends, one bug&lt;br&gt;
tracker.&lt;/p&gt;

&lt;h3&gt;
  
  
  Roadmap and the ask
&lt;/h3&gt;

&lt;p&gt;Next up: OAuth server-side enforcement, the logging helper, a zero-copy parse&lt;br&gt;
pass (raw parse is currently slower than serde_json and we say so in the&lt;br&gt;
README), vcpkg/Conan ports, Doxygen.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Try it:&lt;/strong&gt; &lt;code&gt;git clone&lt;/code&gt; + &lt;code&gt;cmake --preset clang-rlz&lt;/code&gt; — or &lt;code&gt;find_package(mcp)&lt;/code&gt;
after &lt;code&gt;cmake --install&lt;/code&gt;. The CI matrix covers Linux/macOS/Windows ×
gcc/clang/MSVC plus ASan/UBSan and conformance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File issues.&lt;/strong&gt; Even "the docs are wrong about X".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you agree C++ belongs on the official MCP SDK roster&lt;/strong&gt;, say so where it
counts — the &lt;a href="https://modelcontextprotocol.io/community/sdk/charter" rel="noopener noreferrer"&gt;MCP SDK Working Group&lt;/a&gt;
decides the roster, and our proposal to it is the next step in this plan.
Conformance scores, a CI-green repo, real users and a dependency policy are
ready.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/zhoutk/mcp-cpp" rel="noopener noreferrer"&gt;https://github.com/zhoutk/mcp-cpp&lt;/a&gt; · MIT · conformance reports in-tree&lt;br&gt;
(&lt;a href="https://github.com/zhoutk/mcp-cpp/blob/master/conformance/report-2026-07-28.json" rel="noopener noreferrer"&gt;2026-07-28 server&lt;/a&gt;).&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>opensource</category>
      <category>ai</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
