<?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: Danny</title>
    <description>The latest articles on DEV Community by Danny (@wozaisuzhou).</description>
    <link>https://dev.to/wozaisuzhou</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%2F466528%2F453a34c9-1b6f-4494-aac9-db6fa09a130a.png</url>
      <title>DEV Community: Danny</title>
      <link>https://dev.to/wozaisuzhou</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wozaisuzhou"/>
    <language>en</language>
    <item>
      <title>Testing MCP Servers Used to Be a Pain. Here is How to Test Them with Zero Configuration.</title>
      <dc:creator>Danny</dc:creator>
      <pubDate>Mon, 10 Aug 2026 00:54:40 +0000</pubDate>
      <link>https://dev.to/wozaisuzhou/testing-mcp-servers-used-to-be-a-pain-here-is-how-to-test-them-with-zero-configuration-58j6</link>
      <guid>https://dev.to/wozaisuzhou/testing-mcp-servers-used-to-be-a-pain-here-is-how-to-test-them-with-zero-configuration-58j6</guid>
      <description>&lt;p&gt;When building Model Context Protocol (MCP) servers or AI agents that consume them, traditional API testing tools fall short. An MCP server isn't just a basic REST endpoint—it's a dynamic interface exposed to non-deterministic LLMs through stdio, HTTP, or SSE transports.&lt;/p&gt;

&lt;p&gt;Testing tool schemas, transient network failures, and agent behaviors usually requires writing a mountain of boilerplate.&lt;/p&gt;

&lt;p&gt;I built bubblemcp-test-kit to eliminate that friction: no backend accounts, no complex test setup, and zero instrumentation required.&lt;/p&gt;

&lt;p&gt;What is bubblemcp-test-kit?&lt;br&gt;
bubblemcp-test-kit is a lightweight, standalone testing toolkit designed specifically for MCP server developers and AI agent engineers.&lt;/p&gt;

&lt;p&gt;Key features include:&lt;/p&gt;

&lt;p&gt;Transport Agnostic: Work with stdio, HTTP, or SSE behind a unified API.&lt;/p&gt;

&lt;p&gt;Fluent Assertions: Native matchers tailored for MCP response structures and JSON Schemas.&lt;/p&gt;

&lt;p&gt;Mocking &amp;amp; Replay: Fabricate tool outputs locally or record real server runs to replay in offline CI environments.&lt;/p&gt;

&lt;p&gt;Agent Trace &amp;amp; Fault Injection: Test if your AI agent calls tools in the right order and handles errors properly.&lt;/p&gt;

&lt;p&gt;Quickstart Example&lt;br&gt;
You can run a complete mock test suite without spinning up a live server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;createMockMcpClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;expectMcp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;validateAgainstSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;withRecording&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;createReplayClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bubblemcp-test-kit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;// 1. Define your tool contract&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;healthCheckTool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;health_check&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Reports service health&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;inputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;outputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;enum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ok&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;degraded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;down&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;latencyMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;latencyMs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Set up a mock MCP client&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createMockMcpClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;healthCheckTool&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nx"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mockTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;health_check&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;resolves&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;weather&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ok&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;latencyMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nx"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mockTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;flaky_tool&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;rejects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rate limited&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Chain fluent assertions&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;health_check&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;weather&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nf"&gt;expectMcp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toBeValidMcpResponse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toBeError&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toContainText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;weather&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toMatchOutputSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;healthCheckTool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// 4. Validate schema violations locally&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;badPayload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;weather&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invalid-status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;latencyMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;slow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;validateAgainstSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;badPayload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;healthCheckTool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outputSchema&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Schema valid?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;validation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;

&lt;span class="c1"&gt;// 5. Record &amp;amp; Replay for CI&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FIXTURE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./fixtures/health-check.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;recording&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;withRecording&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;FIXTURE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;recording&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;health_check&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;weather&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Replay offline inside CI pipelines&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;replay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createReplayClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;FIXTURE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;replayed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;replay&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;health_check&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;weather&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nf"&gt;expectMcp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;replayed&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBeValidMcpResponse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instant CLI Smoke Testing&lt;br&gt;
If you just want to run an instant health check on an existing MCP server, use the CLI directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx bubblemcp-test-kit &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000/mcp &lt;span class="nt"&gt;--security&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It discovers your tools, validates outputs against declared JSON Schemas, scans for prompt poisoning or credential leaks, and outputs a formatted pass/fail report.&lt;/p&gt;

&lt;p&gt;Check out the full repository and let me know what you think in the comments!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/bubblemcp-test-kit" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/bubblemcp-test-kit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/BubbleMCP/bubblemcp-test-kit" rel="noopener noreferrer"&gt;https://github.com/BubbleMCP/bubblemcp-test-kit&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>mcp</category>
      <category>testing</category>
    </item>
    <item>
      <title>Stop Writing Boilerplate for MCP Servers — Focus on Building AI Tools Instead</title>
      <dc:creator>Danny</dc:creator>
      <pubDate>Tue, 14 Jul 2026 06:50:57 +0000</pubDate>
      <link>https://dev.to/wozaisuzhou/stop-writing-boilerplate-for-mcp-servers-focus-on-building-ai-tools-instead-460n</link>
      <guid>https://dev.to/wozaisuzhou/stop-writing-boilerplate-for-mcp-servers-focus-on-building-ai-tools-instead-460n</guid>
      <description>&lt;p&gt;If you've started experimenting with the Model Context Protocol (MCP), you've probably discovered that building the tool itself is only half of the work.&lt;/p&gt;

&lt;p&gt;Between deployment, authentication, configuration, monitoring, and updates, there's a surprising amount of infrastructure that has nothing to do with your actual idea.&lt;/p&gt;

&lt;p&gt;After building several MCP projects, I kept asking myself:&lt;/p&gt;

&lt;p&gt;Why isn't there a platform that makes deploying an MCP server as easy as deploying a web application?&lt;/p&gt;

&lt;p&gt;That question eventually led me to build BubbleMCP.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://www.bubblemcp.com" rel="noopener noreferrer"&gt;https://www.bubblemcp.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Problem&lt;/p&gt;

&lt;p&gt;Most tutorials teach you how to create an MCP server.&lt;/p&gt;

&lt;p&gt;Very few explain how to:&lt;/p&gt;

&lt;p&gt;Deploy it reliably&lt;br&gt;
Manage multiple servers&lt;br&gt;
Share it with your team&lt;br&gt;
Handle configuration&lt;br&gt;
Scale as usage grows&lt;br&gt;
Monitor health and availability&lt;br&gt;
Keep deployments simple&lt;/p&gt;

&lt;p&gt;Developers end up spending more time on infrastructure than on building useful AI tools.&lt;/p&gt;

&lt;p&gt;What BubbleMCP Tries to Solve&lt;/p&gt;

&lt;p&gt;BubbleMCP is designed to simplify the operational side of MCP development.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;p&gt;Spend your time building MCP tools—not managing servers.&lt;/p&gt;

&lt;p&gt;The platform is focused on making it easier to:&lt;/p&gt;

&lt;p&gt;🚀 Deploy MCP servers&lt;br&gt;
⚙️ Manage configurations&lt;br&gt;
🔄 Update deployments&lt;br&gt;
📊 Monitor server status&lt;br&gt;
🔒 Build with security in mind&lt;br&gt;
📦 Organize multiple MCP projects&lt;/p&gt;

&lt;p&gt;Instead of piecing together deployment scripts and infrastructure, you can focus on building the capabilities that matter.&lt;/p&gt;

&lt;p&gt;Why This Matters&lt;/p&gt;

&lt;p&gt;The AI ecosystem is evolving quickly.&lt;/p&gt;

&lt;p&gt;Just as GitHub became the standard place to host code and Vercel simplified frontend deployment, I believe MCP developers will benefit from platforms purpose-built for hosting and managing MCP servers.&lt;/p&gt;

&lt;p&gt;The goal isn't to replace your existing workflow—it's to reduce the friction between writing code and making it available.&lt;/p&gt;

&lt;p&gt;Roadmap&lt;/p&gt;

&lt;p&gt;I'm actively working on features including:&lt;/p&gt;

&lt;p&gt;One-click deployments&lt;br&gt;
Version management&lt;br&gt;
Authentication improvements&lt;br&gt;
Better developer experience&lt;br&gt;
Monitoring dashboards&lt;br&gt;
Project templates&lt;br&gt;
Team collaboration&lt;br&gt;
More integrations&lt;/p&gt;

&lt;p&gt;Community feedback is helping shape what comes next.&lt;/p&gt;

&lt;p&gt;I'd Love Your Feedback&lt;/p&gt;

&lt;p&gt;BubbleMCP is still evolving, and I'd really appreciate input from developers building with MCP.&lt;/p&gt;

&lt;p&gt;Questions I'm especially interested in:&lt;/p&gt;

&lt;p&gt;What is the biggest pain point when deploying MCP servers?&lt;br&gt;
What features would save you the most time?&lt;br&gt;
What integrations would you like to see first?&lt;/p&gt;

&lt;p&gt;You can explore the project here:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://www.bubblemcp.com" rel="noopener noreferrer"&gt;https://www.bubblemcp.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm always happy to discuss ideas, hear feature requests, or learn how you're using MCP in your own projects.&lt;/p&gt;

&lt;h1&gt;
  
  
  AI #OpenAI #Claude #MCP #ModelContextProtocol #DeveloperTools #TypeScript #NextJS #WebDevelopment #LLM #MachineLearning
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>infrastructure</category>
      <category>mcp</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I am building a wrapper tool for various API backend system to MCP server in a week.</title>
      <dc:creator>Danny</dc:creator>
      <pubDate>Sun, 05 Jul 2026 04:57:13 +0000</pubDate>
      <link>https://dev.to/wozaisuzhou/i-am-building-a-wrapper-tool-for-various-api-backend-system-to-mcp-server-in-a-week-2726</link>
      <guid>https://dev.to/wozaisuzhou/i-am-building-a-wrapper-tool-for-various-api-backend-system-to-mcp-server-in-a-week-2726</guid>
      <description>&lt;p&gt;But I am looking for a good tool to debugging the MCP and team collobration.  Anyone can introduce one ? &lt;/p&gt;

</description>
      <category>mcp</category>
      <category>api</category>
      <category>playwright</category>
      <category>devbugsmash</category>
    </item>
    <item>
      <title>Algorithms Challenge (2) Combination Coin Change - Different coins added up to a given amount</title>
      <dc:creator>Danny</dc:creator>
      <pubDate>Mon, 19 Sep 2022 01:29:22 +0000</pubDate>
      <link>https://dev.to/wozaisuzhou/algorithms-challenge-2-combination-coin-change-different-coins-added-up-to-a-given-amount-2icd</link>
      <guid>https://dev.to/wozaisuzhou/algorithms-challenge-2-combination-coin-change-different-coins-added-up-to-a-given-amount-2icd</guid>
      <description>&lt;p&gt;Question : &lt;br&gt;
There are {1, 2 , 5} dollar types coins for selection. Use different combinations of these types coins to adding up to the given amount 50. &lt;/p&gt;

&lt;p&gt;Answer:&lt;br&gt;
We can use different types of dynamic programming methods to solve this problem.  In this article , we choose to use Dynamic programming -  Bottom up method. &lt;/p&gt;

&lt;p&gt;The implementation logic is simple like this : &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set combinations as an array , its size is "amount +1" &lt;/li&gt;
&lt;li&gt;combinations[0] = 1 ,  it means the first combination ways number is 1 &lt;/li&gt;
&lt;li&gt;We can loop the coins into the combinations array. When 
the amount(the value in the position of the combinations array) is greater than coin , then we can use the formular : 
combinations[amount] += combinations[amount - coin];&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Code: &lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

public class coinsCombinationWays {

    static int getTotalWays(int[] coins, int amount){
         int[] combinations = new int[amount + 1];
         combinations[0] = 1;

         for(int coin: coins) {
            for(int j=1; j&amp;lt;combinations.length; j++){
              if(j&amp;gt;=coin)
               combinations[j] += combinations[j-coin];
           }
         }
        return combinations[amount];
   } 

   public static void main(String[] args) {
       int[] coins = {1, 2, 5};
       int amount= 50; 

       int totalWays += getTotalWays(coins, amount);
       System.out.println(totalWays);
    }

}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>java</category>
      <category>algorithms</category>
      <category>dynamicprogramming</category>
      <category>bottonup</category>
    </item>
    <item>
      <title>Algorithms Challenge (1) How to print out Fibonacci series in two lines code</title>
      <dc:creator>Danny</dc:creator>
      <pubDate>Fri, 16 Sep 2022 20:26:00 +0000</pubDate>
      <link>https://dev.to/wozaisuzhou/algorithms-challenge-1-how-to-print-out-fibonacci-series-in-two-lines-code-16dl</link>
      <guid>https://dev.to/wozaisuzhou/algorithms-challenge-1-how-to-print-out-fibonacci-series-in-two-lines-code-16dl</guid>
      <description>&lt;p&gt;Print out Fibonacci numbers in range 0 - 100 &lt;/p&gt;

&lt;p&gt;Concept :  print out two numbers every time&lt;/p&gt;

&lt;p&gt;Code in java:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class fibonacci {
   public static void main(String[] args) {
         for(int a = 0, b=1; a &amp;lt; 100 ; a+=b, b+=a)
             System.out.println(a + "," + (b&amp;lt;100 ? b + ",": ""));
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result : &lt;br&gt;
0,1,&lt;br&gt;
1,2,&lt;br&gt;
3,5,&lt;br&gt;
8,13,&lt;br&gt;
21,34,&lt;br&gt;
55,89,&lt;/p&gt;

</description>
      <category>fibonacci</category>
      <category>java</category>
      <category>algorithms</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
