<?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: Rupa Tiwari</title>
    <description>The latest articles on DEV Community by Rupa Tiwari (@rupa_tiwari_dd308948d710f).</description>
    <link>https://dev.to/rupa_tiwari_dd308948d710f</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%2F3785046%2Fc76f5af2-6cfc-4e91-9f5d-7064cb5ec772.png</url>
      <title>DEV Community: Rupa Tiwari</title>
      <link>https://dev.to/rupa_tiwari_dd308948d710f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rupa_tiwari_dd308948d710f"/>
    <language>en</language>
    <item>
      <title>How to let AI run your social media: Claude, Codex, Cursor &amp; more (Full MCP Setup)</title>
      <dc:creator>Rupa Tiwari</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:20:54 +0000</pubDate>
      <link>https://dev.to/rupa_tiwari_dd308948d710f/how-to-let-ai-run-your-social-media-claude-codex-cursor-more-full-mcp-setup-23gl</link>
      <guid>https://dev.to/rupa_tiwari_dd308948d710f/how-to-let-ai-run-your-social-media-claude-codex-cursor-more-full-mcp-setup-23gl</guid>
      <description>&lt;p&gt;Your AI assistant can already write your posts.&lt;/p&gt;

&lt;p&gt;It just can't post them. So you copy, paste, open 6 tabs, upload the same image 6 times, and fix the character count for X by hand.&lt;/p&gt;

&lt;p&gt;We built Autoadify's MCP server to kill that copy-paste step. It went live this week.&lt;/p&gt;

&lt;p&gt;Here's what it gets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude, Codex, Cursor, Gemini CLI or VS Code posts to Instagram, Facebook, LinkedIn, X, TikTok, YouTube, Reddit, Bluesky and Threads&lt;/li&gt;
&lt;li&gt;Different text per platform, from one request&lt;/li&gt;
&lt;li&gt;Your media library, searchable by what's actually in each image&lt;/li&gt;
&lt;li&gt;Everything lands in your Autoadify calendar, so you can still see and edit it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's get into it.&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Get a key (2 minutes)
&lt;/h1&gt;

&lt;p&gt;In Autoadify, go to &lt;strong&gt;Settings → API &amp;amp; MCP&lt;/strong&gt; and click &lt;strong&gt;Create key&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Give it &lt;strong&gt;Read&lt;/strong&gt; and &lt;strong&gt;Publish&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pro tip: limit the key to the channels you want the assistant to touch. Start with one test channel. Publishing is real, so it goes out on your actual accounts.&lt;/p&gt;

&lt;p&gt;The key starts with &lt;code&gt;aak_live_&lt;/code&gt;. You only see it once. Put it in your password manager.&lt;/p&gt;

&lt;p&gt;(API &amp;amp; MCP are on paid plans, from Pro at $29/mo.)&lt;/p&gt;

&lt;h1&gt;
  
  
  2. Connect your assistant
&lt;/h1&gt;

&lt;p&gt;One server URL for everything:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://mcp.autoadify.com/mcp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; (one line):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http autoadify https://mcp.autoadify.com/mcp &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer aak_live_..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cursor:&lt;/strong&gt; add it to &lt;code&gt;~/.cursor/mcp.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"autoadify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.autoadify.com/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer aak_live_..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Codex&lt;/strong&gt; (OpenAI's coding agent). Put your key in an env var, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AUTOADIFY_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"aak_live_..."&lt;/span&gt;
codex mcp add autoadify &lt;span class="nt"&gt;--url&lt;/span&gt; https://mcp.autoadify.com/mcp &lt;span class="nt"&gt;--bearer-token-env-var&lt;/span&gt; AUTOADIFY_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Gemini CLI:&lt;/strong&gt; add it to &lt;code&gt;~/.gemini/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"autoadify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"httpUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.autoadify.com/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer aak_live_..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;VS Code, Claude Desktop and any other client that supports remote MCP with a custom header work too. The exact config for each is in the docs (link at the end).&lt;/p&gt;

&lt;p&gt;(Using the ChatGPT app? It can't send an API key header to a custom server yet, so use Codex for now.) [CHECK BEFORE POSTING]&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Ask it what it can see
&lt;/h1&gt;

&lt;p&gt;Before you post anything, run this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What channels do I have connected, and what does each one need before I can post to it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This calls &lt;code&gt;list_channels&lt;/code&gt;. You get every account plus its rules: Instagram needs an image or video, X caps your characters, Reddit needs a subreddit.&lt;/p&gt;

&lt;p&gt;Now your assistant knows the rules &lt;em&gt;before&lt;/em&gt; it writes a single word.&lt;/p&gt;

&lt;p&gt;That alone fixes half the "why did this fail" moments.&lt;/p&gt;

&lt;h1&gt;
  
  
  4. Write once, post everywhere (properly)
&lt;/h1&gt;

&lt;p&gt;This is where it clicks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here's our announcement: [paste it].&lt;br&gt;
Schedule it to LinkedIn and X for Tuesday 9am IST.&lt;br&gt;
Keep the full version for LinkedIn. Write a punchier version under 280 characters for X.&lt;br&gt;
Show me both versions and the time before you schedule anything.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One post, two versions, one request. Under the hood it's a single post with per-platform text, so it shows up as one item in your calendar.&lt;/p&gt;

&lt;p&gt;The "show me before you schedule" line matters. Good assistants confirm first anyway, but say it out loud.&lt;/p&gt;

&lt;h1&gt;
  
  
  5. Let it find the image for you
&lt;/h1&gt;

&lt;p&gt;Most media libraries are a pile of &lt;code&gt;IMG_4471.JPG&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ours describes what's actually in each file, so the assistant can search by content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Find a photo from our library that shows the product on a desk, and use it for an Instagram post tomorrow at 6pm about our new feature.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don't have the image in the library yet? Give it a link:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Import this image and post it to Instagram tomorrow morning: [URL]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you're in Claude Code, it can even upload a file straight from your computer.&lt;/p&gt;

&lt;h1&gt;
  
  
  6. Run your week from one chat
&lt;/h1&gt;

&lt;p&gt;Once it's connected, the calendar is a conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompts I use every Monday:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What's scheduled for next week?&lt;/p&gt;

&lt;p&gt;Move Friday's post to Monday, same time.&lt;/p&gt;

&lt;p&gt;Did yesterday's posts go out? If any failed, tell me why.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That last one is underrated. Every post comes back with its status per platform, the live link, and the exact error if something failed (like a connection that needs reconnecting).&lt;/p&gt;

&lt;p&gt;And the errors are written so the assistant can actually fix the request, not just say "400".&lt;/p&gt;

&lt;h1&gt;
  
  
  7. Guardrails (read this)
&lt;/h1&gt;

&lt;p&gt;It's your real accounts, so:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scope the key.&lt;/strong&gt; A read-only key gives the assistant zero tools that change anything. Great for a reporting agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limit channels.&lt;/strong&gt; Give a test key one channel until you trust the flow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same rules as the app.&lt;/strong&gt; Platform requirements, plan limits and our content policy all still apply.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  That's it
&lt;/h1&gt;

&lt;p&gt;No more copy-paste between 6 tabs.&lt;/p&gt;

&lt;p&gt;You write (or the AI writes), and the AI schedules it.&lt;/p&gt;

&lt;p&gt;Docs + every tool: &lt;a href="https://docs.autoadify.com/mcp/overview" rel="noopener noreferrer"&gt;https://docs.autoadify.com/mcp/overview&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>mcp</category>
      <category>socialmedia</category>
    </item>
    <item>
      <title>6 things that broke when we built an AI pipeline that posts to 9 social networks</title>
      <dc:creator>Rupa Tiwari</dc:creator>
      <pubDate>Wed, 07 Oct 2026 13:17:31 +0000</pubDate>
      <link>https://dev.to/rupa_tiwari_dd308948d710f/6-things-that-broke-when-we-built-an-ai-pipeline-that-posts-to-9-social-networks-2nmf</link>
      <guid>https://dev.to/rupa_tiwari_dd308948d710f/6-things-that-broke-when-we-built-an-ai-pipeline-that-posts-to-9-social-networks-2nmf</guid>
      <description>&lt;p&gt;At &lt;a href="https://autoadify.com" rel="noopener noreferrer"&gt;Autoadify&lt;/a&gt; we build &lt;strong&gt;Workflows&lt;/strong&gt;: a schedule, a new Shopify/WooCommerce product, or a post that's taking off fires a pipeline that writes the copy, generates the image/video/voiceover/music, and publishes to Instagram, TikTok, YouTube, Facebook, LinkedIn, X, Threads, Bluesky and Reddit. No human in the loop.&lt;/p&gt;

&lt;p&gt;"Call an LLM, then call a posting API" is a weekend project. Making it run unattended every day is not. Here's what broke, and what we changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shape
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;trigger ─▶ content steps ─▶ transform steps ─▶ publish
            ai_text            add_hashtags       9 networks
            ai_image           rewrite_tone
            ai_edit            translate
            ai_video / ai_animate
            ai_voiceover / ai_music
            library_media
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Triggers:&lt;/strong&gt; &lt;code&gt;schedule&lt;/code&gt; (daily/weekly/biweekly/monthly, timezone-aware), &lt;code&gt;shopify&lt;/code&gt; / &lt;code&gt;woocommerce&lt;/code&gt; (product webhooks, HMAC-verified), &lt;code&gt;monitor_post&lt;/code&gt; (fires when a post's likes/comments/shares/impressions/reach/clicks grow past a threshold), plus manual run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Models:&lt;/strong&gt; every step has its own model picker over a 60+ model catalog — GPT-5.6, Claude Opus 4.8 / Sonnet 5, Gemini 3.1, Grok, DeepSeek V4, Qwen, Kimi for text; Nano Banana, GPT Image 2, Seedream, Recraft, Krea for images; Veo 3.1, Kling 3.0, Seedance 2.0, Runway Gen-4.5, Hailuo, Wan 3.0 for video; ElevenLabs for voice and music.&lt;/p&gt;

&lt;p&gt;Each step's output lands in a context map keyed by step ID, and later steps interpolate it: &lt;code&gt;{{trigger.product.name}}&lt;/code&gt;, &lt;code&gt;{{trigger.recent_posts}}&lt;/code&gt;, the previous step's text, the previous step's media.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The video prompt became the Instagram caption
&lt;/h2&gt;

&lt;p&gt;To keep script and caption consistent, one AI Text step writes both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[VIDEO PROMPT] Slow push-in on a ceramic mug, steam rising, morning light, 35mm
[CAPTION] Mornings, slower. ☕ New in the shop.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first version published the "most recent text output" as-is. So a live Instagram caption read &lt;em&gt;"[VIDEO PROMPT] Slow push-in on a ceramic mug…"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Fix: a tiny labelled-section parser. Each consumer reads the section meant for it:&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="c1"&gt;// The part of a text output that is meant to be posted.&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;postCopy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;preamble&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sections&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseSections&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;           &lt;span class="c1"&gt;// not sectioned — leave it alone&lt;/span&gt;
  &lt;span class="k"&gt;for &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;label&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CAPTION&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="s2"&gt;POST&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="s2"&gt;COPY&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;caption&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;caption&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;caption&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;         &lt;span class="c1"&gt;// a caption section wins outright&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// otherwise: drop prompt sections, keep the rest&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The edge case worth a test: a real caption that starts with &lt;code&gt;[NEW] Spring drop…&lt;/code&gt; is &lt;em&gt;not&lt;/em&gt; a sectioned output. Only return untouched text when there's no caption or prompt label.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. "Pick a random photo" re-posted the same photo
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;library_media&lt;/code&gt; step picks from the user's uploads. Random-with-replacement means a 30-photo library repeats within days, and followers notice.&lt;/p&gt;

&lt;p&gt;Fix: pick only from media &lt;strong&gt;never published&lt;/strong&gt; by any post. When the pool is empty, the step &lt;strong&gt;fails&lt;/strong&gt; — it doesn't fall back to a used photo. In an unattended system, a loud failure is better than quietly degraded output.&lt;/p&gt;

&lt;p&gt;Second problem: uploads are named &lt;code&gt;IMG_4471.jpg&lt;/code&gt;. The caption step had nothing to work with. Every upload now gets a vision pass that stores a description ("a ceramic mug on a linen tablecloth, morning light"), and the library step hands that to the next text step.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The daily post said the same thing every day
&lt;/h2&gt;

&lt;p&gt;A scheduled "daily tip" with a fixed prompt is a fixed point: the model converges on the same five tips. Scheduled runs now inject &lt;code&gt;{{trigger.date}}&lt;/code&gt;, &lt;code&gt;{{trigger.weekday}}&lt;/code&gt; and &lt;code&gt;{{trigger.recent_posts}}&lt;/code&gt; — the workflow's own last posts — into the first AI Text step. The model sees what it already said, and rotates.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The credit estimate lied
&lt;/h2&gt;

&lt;p&gt;The builder shows "this run costs N credits" before you activate. The first version priced a video step at the length the user picked. But some models snap to their own durations (Grok Imagine renders 6s regardless), so the bill differed from the estimate.&lt;/p&gt;

&lt;p&gt;Fix: the estimator uses the &lt;strong&gt;same&lt;/strong&gt; &lt;code&gt;creditsForGeneration&lt;/code&gt; function the executor charges with, and replicates the executor's model-fallback rules. Invariant: the estimate is never lower than a full successful run. A failed step refunds.&lt;/p&gt;

&lt;p&gt;Related: we charge before calling the provider, so a process killed mid-generation would skip the refund &lt;code&gt;catch&lt;/code&gt;. A reaper job refunds generations stuck in &lt;code&gt;PENDING&lt;/code&gt; for 45+ minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Every platform has a silent failure mode
&lt;/h2&gt;

&lt;p&gt;Things that returned success and still produced a broken post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn&lt;/strong&gt;: commentary uses "little text format". An unescaped &lt;code&gt;(&lt;/code&gt; silently truncates the post from that point. API returns 201.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bluesky&lt;/strong&gt;: link facets use UTF-8 &lt;strong&gt;byte&lt;/strong&gt; offsets. Use JS string indices and links render as dead text. The 300 limit is &lt;strong&gt;graphemes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;X&lt;/strong&gt;: refresh tokens are single-use. Two concurrent jobs refreshing the same account → one wins, the other kills the connection. We serialize refresh behind a Postgres advisory lock.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threads&lt;/strong&gt;: a 60-day token that dies permanently if not refreshed in time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these throw. You only find them by reading your own published posts.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Safety has to sit on the pipeline, not the editor
&lt;/h2&gt;

&lt;p&gt;We had moderation in the editor UI. Workflows don't use the editor. In fact our four generation entry points (studio, agent, storyboard, workflow executor) shared &lt;strong&gt;no&lt;/strong&gt; common call path, so a control added to one reached none of the others.&lt;/p&gt;

&lt;p&gt;Now there's a pre-generation gate (&lt;code&gt;assertGenerationAllowed&lt;/code&gt;) in all four, and a pre-publish check on the publish path. Unattended content gets checked twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just use n8n?
&lt;/h2&gt;

&lt;p&gt;We get this a lot, and for a lot of teams n8n &lt;em&gt;is&lt;/em&gt; the answer — it's fair-code, free to self-host, and connects to everything. If social posting is one branch of a larger automation, use it.&lt;/p&gt;

&lt;p&gt;But every section above is something you'd rebuild inside n8n for a social pipeline:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem above&lt;/th&gt;
&lt;th&gt;In n8n&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Publishing to TikTok, Threads, Bluesky&lt;/td&gt;
&lt;td&gt;No official core nodes — community node, a paid posting API, or HTTP Request nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long-running video&lt;/td&gt;
&lt;td&gt;Submit → Wait → poll loop → download → re-upload to a public URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;[VIDEO PROMPT]&lt;/code&gt; vs &lt;code&gt;[CAPTION]&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A Code node with your own parser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Never-repeat media pool&lt;/td&gt;
&lt;td&gt;A database table + a query node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Captions for &lt;code&gt;IMG_4471.jpg&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;An extra vision API call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;recent_posts&lt;/code&gt; so daily posts rotate&lt;/td&gt;
&lt;td&gt;Query your own post history, pass it in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credit estimate = actual bill&lt;/td&gt;
&lt;td&gt;Separate bills per AI vendor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LinkedIn &lt;code&gt;(&lt;/code&gt;, Bluesky bytes/graphemes, X token rotation&lt;/td&gt;
&lt;td&gt;Discover each one in production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moderation on every path&lt;/td&gt;
&lt;td&gt;Add a moderation node to every workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;None of that is hard alone. Together it's the product. That's the trade: n8n gives you a general engine and you build the social layer; Autoadify &lt;em&gt;is&lt;/em&gt; the social layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fail loud.&lt;/strong&gt; An empty pool, a dead token, a timed-out render — fail the run and notify. Never "fall back" to something worse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estimate with the billing code&lt;/strong&gt;, not a parallel approximation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read your own outputs.&lt;/strong&gt; The platform said 201. The post was still wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put controls where every path passes&lt;/strong&gt;, not where the UI is.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you'd rather use this than build it: &lt;a href="https://autoadify.com" rel="noopener noreferrer"&gt;Autoadify Workflows&lt;/a&gt; — start from a template, the step builder, or just describe the workflow in plain English. Happy to answer questions about any of the above in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>MCP AI Agent Readiness: Will Agents Pick Your Tools? (2026)</title>
      <dc:creator>Rupa Tiwari</dc:creator>
      <pubDate>Wed, 30 Sep 2026 18:06:56 +0000</pubDate>
      <link>https://dev.to/rupa_tiwari_dd308948d710f/mcp-ai-agent-readiness-will-agents-pick-your-tools-2026-26np</link>
      <guid>https://dev.to/rupa_tiwari_dd308948d710f/mcp-ai-agent-readiness-will-agents-pick-your-tools-2026-26np</guid>
      <description>&lt;p&gt;&lt;strong&gt;📖 TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;An agent picks your tools from their names, descriptions and schemas.&lt;/strong&gt; Nothing else. If those are vague, it picks wrong.&lt;/li&gt;
&lt;li&gt;  A normal MCP test can't see this. &lt;strong&gt;Every call returns 200 whether the model chose well or not.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;AI Readiness&lt;/strong&gt; is a new MCP Playground workspace that measures &lt;em&gt;MCP AI agent readiness&lt;/em&gt;: free structure checks, then an AI review.&lt;/li&gt;
&lt;li&gt;  The &lt;strong&gt;AI Agent Readiness Review&lt;/strong&gt; gives a 0–100 score, a question bank of up to 120 real user questions, ready-to-paste tool rewrites and a list of missing capabilities.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Then it proves it.&lt;/strong&gt; One click runs the questions against a real model and checks which tool it actually called first.&lt;/li&gt;
&lt;li&gt;  50 credits per review. &lt;strong&gt;Every organisation gets one free preview.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My MCP server passed every test I threw at it. Every tool listed. Every call returned clean JSON.&lt;/p&gt;

&lt;p&gt;Then I connected it to an agent. &lt;strong&gt;It called the wrong tool on the second question.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nothing was broken. The server did exactly what I built. The agent just couldn't tell my tools apart.&lt;/p&gt;

&lt;p&gt;That gap has a name: &lt;strong&gt;&lt;em&gt;MCP AI agent readiness&lt;/em&gt;&lt;/strong&gt;. It's whether a model, reading only your tool definitions, picks the right tool and calls it correctly.&lt;/p&gt;

&lt;p&gt;It's also the part almost nobody tests. &lt;strong&gt;A green test run tells you the server works, not that an agent can use it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I built a workspace for it. It's called &lt;strong&gt;AI Readiness&lt;/strong&gt;, and it lives in the &lt;a href="https://mcpplaygroundonline.com" rel="noopener noreferrer"&gt;MCP Playground&lt;/a&gt; dashboard.&lt;/p&gt;

&lt;p&gt;In this post I'll cover the seven problems that break tool selection, why your current tests can't see them, and exactly what the new checks do.&lt;/p&gt;

&lt;p&gt;If you ship an MCP server that agents are meant to use, &lt;strong&gt;this is the test you're probably missing.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is MCP AI Agent Readiness?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MCP AI agent readiness is how reliably a model chooses and calls your tools, using only what your server tells it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When an agent connects, it calls &lt;code&gt;tools/list&lt;/code&gt;. It gets back names, descriptions and input schemas. That's the entire picture it has of your server.&lt;/p&gt;

&lt;p&gt;It never sees your code, your database or your docs site. &lt;strong&gt;If a description is vague, the model guesses.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The research backs this up. A February 2026 study, &lt;a href="https://arxiv.org/abs/2602.14878" rel="noopener noreferrer"&gt;"MCP Tool Descriptions Are Smelly!"&lt;/a&gt;, looked at 856 tools across 103 servers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;97.1% of tool descriptions had at least one defect.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;56% never clearly stated what the tool does.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  Rewriting them raised task success by a median of 5.85 points, but also increased execution steps by 67.46%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters. &lt;strong&gt;Longer descriptions aren't automatically better.&lt;/strong&gt; I covered the study in detail in &lt;a href="https://mcpplaygroundonline.com/blog/mcp-tool-description-quality" rel="noopener noreferrer"&gt;why most MCP tool descriptions are broken&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Readiness isn't about writing more. &lt;strong&gt;It's about writing what lets a model decide.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven Problems That Break MCP Tool Selection
&lt;/h2&gt;

&lt;p&gt;Here's what I see again and again when agents struggle with an MCP server. &lt;strong&gt;None of these throw an error.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Vague descriptions
&lt;/h3&gt;

&lt;p&gt;"Returns user information." Which user? Which fields? What happens without auth?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model fills the gaps with guesses&lt;/strong&gt;, and guesses change between runs.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Overlapping tools
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;search&lt;/code&gt; tool and a &lt;code&gt;docs&lt;/code&gt; tool that both "find information". The model has no rule for choosing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overlap is the most common cause of wrong-tool calls&lt;/strong&gt; I see in eval runs.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Missing &lt;code&gt;required&lt;/code&gt; lists and untyped parameters
&lt;/h3&gt;

&lt;p&gt;Without a &lt;code&gt;required&lt;/code&gt; array, the model can't tell mandatory arguments from optional ones. Without types, it guesses the shape.&lt;/p&gt;

&lt;p&gt;You get &lt;a href="https://mcpplaygroundonline.com/blog/mcp-error-32602" rel="noopener noreferrer"&gt;-32602 invalid params errors&lt;/a&gt;, or worse, &lt;strong&gt;calls that succeed with the wrong arguments.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. No tool annotations
&lt;/h3&gt;

&lt;p&gt;The spec defines &lt;a href="https://modelcontextprotocol.io/specification/2025-11-25/server/tools" rel="noopener noreferrer"&gt;tool annotations&lt;/a&gt; like &lt;code&gt;readOnlyHint&lt;/code&gt; and &lt;code&gt;destructiveHint&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Without them, &lt;strong&gt;a client can't tell a safe lookup from a delete.&lt;/strong&gt; It either asks the user every time or doesn't ask at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Context-token bloat
&lt;/h3&gt;

&lt;p&gt;Every tool definition is re-sent on every request. &lt;strong&gt;Seven popular servers can eat 67,300 tokens&lt;/strong&gt; before the user types anything.&lt;/p&gt;

&lt;p&gt;Bloated schemas crowd out the model's working context. I wrote about the fix in &lt;a href="https://mcpplaygroundonline.com/blog/mcp-context-bloat-tool-search" rel="noopener noreferrer"&gt;MCP context bloat and tool search&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Out-of-scope misuse
&lt;/h3&gt;

&lt;p&gt;A user asks your account server to "delete my account". You have no delete tool.&lt;/p&gt;

&lt;p&gt;A good agent says so. &lt;strong&gt;A confused one calls &lt;code&gt;get_user&lt;/code&gt; and pretends to help.&lt;/strong&gt; Your descriptions never said what the server can't do.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Two spec versions in the wild
&lt;/h3&gt;

&lt;p&gt;Servers now speak either the stateful &lt;strong&gt;2025-11-25&lt;/strong&gt; protocol or the stateless &lt;a href="https://modelcontextprotocol.io/specification/2026-07-28/changelog" rel="noopener noreferrer"&gt;2026-07-28&lt;/a&gt; revision.&lt;/p&gt;

&lt;p&gt;The same server can behave differently depending on which one a client negotiates. &lt;strong&gt;You need to test the version your users' clients actually use.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Normal MCP Testing Misses Readiness Problems
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Functional tests check that a tool works when you call it.&lt;/strong&gt; Readiness is about whether a model calls it in the first place.&lt;/p&gt;

&lt;p&gt;When you test a tool by hand, you already know which one to pick. The model doesn't.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Functional test&lt;/th&gt;
&lt;th&gt;Readiness check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool returns valid JSON&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model picks the right tool&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model tells overlapping tools apart&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model declines what you can't do&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You know what users will ask next&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You still need functional testing. &lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free →&lt;/a&gt; first, then check readiness on top.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free Structure Checks: What a Lint Can and Can't Tell You
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;AI Readiness&lt;/strong&gt; from the dashboard sidebar, under Build &amp;amp; Secure. Add your server and the free &lt;strong&gt;structure checks&lt;/strong&gt; run straight away.&lt;/p&gt;

&lt;p&gt;They look at what a model sees and flag concrete problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Missing or very short descriptions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Parameters with no description or no type&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;No &lt;code&gt;required&lt;/code&gt; list&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  Vague tool names like &lt;code&gt;get_data&lt;/code&gt; or &lt;code&gt;run&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Schemas over roughly 2,000 tokens&lt;/li&gt;
&lt;li&gt;  Missing &lt;code&gt;readOnlyHint&lt;/code&gt; / &lt;code&gt;destructiveHint&lt;/code&gt; annotations and no &lt;code&gt;outputSchema&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You also get the &lt;strong&gt;total context cost&lt;/strong&gt; of your tool definitions, in tokens, on every request.&lt;/p&gt;

&lt;p&gt;Here's a choice I made on purpose. &lt;strong&gt;Structure checks show issue counts, not a score.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A lint can tell you a field is missing. &lt;strong&gt;It can't tell you whether a model will pick the right tool.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A tidy schema with a misleading description passes every lint.&lt;/p&gt;

&lt;p&gt;Putting "90/100 ready" on a lint result would be dishonest. So the only readiness score in the product comes from the review.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Agent Readiness Review: What You Get
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The review reads your tool definitions the way a model does, then tells you where agents will fail.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's one pass over your names, descriptions, schemas and annotations. It never calls your tools, so &lt;strong&gt;it can't change any data on your server.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;AI score (0–100)&lt;/strong&gt; — Excellent 85+, Good 70+, Fair 50+, Needs work below.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Biggest issue&lt;/strong&gt; — a 2–3 sentence verdict that leads with what to fix first.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Strengths &amp;amp; risks&lt;/strong&gt; — what works for agents, what will fail, with the tools named.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Question bank&lt;/strong&gt; — up to 120 real user questions, each mapped to the right tool.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Tool rewrites&lt;/strong&gt; — clarity and distinctness scores plus a description ready to paste.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Missing capabilities&lt;/strong&gt; — what users will ask for that no tool can do yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxon0q3hx8zaoitc26882.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxon0q3hx8zaoitc26882.jpg" alt="The AI Agent Readiness Review header showing a score of 58 out of 100 rated Fair, summary figures, the biggest issue and strengths and risks" width="800" height="321"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The review header: score, rating, key figures and the biggest issue to fix first. Sample server.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The score bands come with plain meaning. &lt;strong&gt;"Needs work" means agents are likely to pick the wrong tool or misuse it.&lt;/strong&gt; "Excellent" means they should pick and call reliably.&lt;/p&gt;

&lt;p&gt;Every tool name in the report is clickable. &lt;strong&gt;One click opens that tool in the MCP Tester&lt;/strong&gt;, so you can call it and check.&lt;/p&gt;
&lt;h2&gt;
  
  
  The MCP Question Bank: What the Questions Are For
&lt;/h2&gt;

&lt;p&gt;This is the part people ask about most. &lt;strong&gt;Each question is a test prompt a real user might type&lt;/strong&gt; to an assistant with your server connected.&lt;/p&gt;

&lt;p&gt;Each one names the tool an agent should call first. You get about 50 questions for a one-tool server, 80 for two or three, and &lt;strong&gt;120 for four or more.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They're split into five kinds, because each kind catches a different failure:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;What it catches&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Direct&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"What's the status of ticket 4812?"&lt;/td&gt;
&lt;td&gt;The agent can't find the obvious tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chained&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Who owns the oldest open bug in billing?"&lt;/td&gt;
&lt;td&gt;One tool's output doesn't feed the next&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ambiguous&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Find anything about the login outage."&lt;/td&gt;
&lt;td&gt;Two tools look right; descriptions don't decide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Edge case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Show me all 5,000 tickets from last year."&lt;/td&gt;
&lt;td&gt;Limits, pagination, empty results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Out of scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Refund this customer."&lt;/td&gt;
&lt;td&gt;The agent misuses a tool instead of declining&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4pzcidi5ajjemmvf7143.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4pzcidi5ajjemmvf7143.jpg" alt="The MCP question bank filtered by Direct, Chained, Ambiguous, Edge case and Out of scope, each question mapped to its expected tool" width="799" height="322"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The question bank: every question mapped to the tool an agent should call first. Sample server.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ambiguous and out-of-scope questions are where servers fail most.&lt;/strong&gt; They're also the ones nobody writes by hand.&lt;/p&gt;

&lt;p&gt;You can filter by type, search, and page through the bank. &lt;strong&gt;Export it as CSV or JSON&lt;/strong&gt; and use it as a test set anywhere.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tool Rewrites and Missing Capabilities
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Tool rewrites you can paste
&lt;/h3&gt;

&lt;p&gt;Every tool gets two scores out of 10:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Clarity:&lt;/strong&gt; can a model tell what it does, when to use it and what it returns?&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Distinctness:&lt;/strong&gt; could it be confused with another tool?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You get the specific problems found, then a &lt;strong&gt;rewritten description ready to paste&lt;/strong&gt;. The worst tools come first.&lt;/p&gt;

&lt;p&gt;The rewrites keep the facts from your original. &lt;strong&gt;They never invent capabilities your tool doesn't have.&lt;/strong&gt; They stay under 600 characters, because shorter and specific beats long.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdjrbpuy6ilsumjyxfyn7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdjrbpuy6ilsumjyxfyn7.jpg" alt="Per-tool clarity and distinctness scores with the problems found and a rewritten description ready to paste" width="799" height="346"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Tool rewrites: worst tools first, with a description you can paste straight into your server. Sample server.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Missing capabilities
&lt;/h3&gt;

&lt;p&gt;This section answers a different question: &lt;strong&gt;what will users ask for that your server can't do yet?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For an account server, that might be "change a password" or "look up another user". Each item comes with a concrete suggestion for a tool to add.&lt;/p&gt;

&lt;p&gt;Each also links to the questions that hit it. &lt;strong&gt;Click one and the question bank jumps to it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Documentation fixes don't belong here. They're already in the rewrites, so the review filters them out. &lt;strong&gt;This list is purely what to build next.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Prove It: Run the Questions as Routing Evals
&lt;/h2&gt;

&lt;p&gt;Here's the honest limit of any review. &lt;strong&gt;It predicts what an agent will do. It doesn't prove it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So the report ends with one button: run the questions as evals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A real model gets your tools and one question at a time.&lt;/strong&gt; I record which tool it actually calls first.&lt;/p&gt;

&lt;p&gt;Pass or fail comes straight from the transcript:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Direct, chained, ambiguous and edge-case questions pass&lt;/strong&gt; when the first tool call is the expected tool and the model answers within budget.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Out-of-scope questions pass&lt;/strong&gt; when the model declines without calling any tool.&lt;/li&gt;
&lt;li&gt;  Calling a different tool first is a &lt;strong&gt;Wrong tool&lt;/strong&gt; result, with a plain explanation of which tool it chose instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because the result is read from what the model did, &lt;strong&gt;there's no AI judge in the loop&lt;/strong&gt; and no judge fee.&lt;/p&gt;

&lt;p&gt;There's no writing fee either. The review already wrote the questions.&lt;/p&gt;

&lt;p&gt;By default it runs a &lt;strong&gt;20-question sample&lt;/strong&gt;. Ambiguous questions go first, since they're most likely to fail. You can run the whole bank too.&lt;/p&gt;

&lt;p&gt;You choose the model. &lt;strong&gt;GPT-6 Luna Pro is the default&lt;/strong&gt;, because a strong model forgives vague descriptions. If even it picks the wrong tool, the description genuinely needs work.&lt;/p&gt;

&lt;p&gt;Want to see how your server does on cheaper models? Pick one. Comparing models is what &lt;a href="https://mcpplaygroundonline.com/blog/best-ai-model-for-mcp-tool-calling" rel="noopener noreferrer"&gt;the best AI model for MCP tool calling&lt;/a&gt; is about.&lt;/p&gt;

&lt;p&gt;Results show the top failures inline. &lt;strong&gt;Full transcripts open in Evals&lt;/strong&gt;: every tool call, its arguments, the result and the final answer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fym8drsf2nz3za8i97h5z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fym8drsf2nz3za8i97h5z.jpg" alt="Routing eval results showing 16 of 20 questions routed correctly with Wrong tool and Too many calls failures" width="800" height="344"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Routing evals: which questions a real model routed to the wrong tool, and why. Sample server.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;New to evals? &lt;a href="https://mcpplaygroundonline.com/blog/what-is-an-mcp-eval" rel="noopener noreferrer"&gt;What is an MCP eval&lt;/a&gt; explains the idea in five minutes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The loop that actually works:&lt;/strong&gt; run the review, paste the rewrites into your server, then re-run the evals.&lt;/p&gt;

&lt;p&gt;If "Wrong tool" results drop, the fix worked. If they don't, you've learned something a lint never would.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  How to Run an MCP Readiness Check in 5 Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Open AI Readiness.&lt;/strong&gt; It's in the dashboard sidebar under Build &amp;amp; Secure.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Add your server.&lt;/strong&gt; Paste the URL and any auth headers: Bearer, Basic or custom like &lt;code&gt;X-API-Key&lt;/code&gt;. Pick HTTP or SSE.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Pick the spec version.&lt;/strong&gt; Auto tries 2026-07-28 first and falls back to 2025-11-25. You can pin either.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Read the structure checks&lt;/strong&gt;, then run the AI Agent Readiness Review. It takes a minute or two.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Run the questions as evals&lt;/strong&gt;, fix what fails, and re-run to confirm.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Testing a local server? Calls run from MCP Playground's servers, so they can't reach &lt;code&gt;localhost&lt;/code&gt;. &lt;strong&gt;Expose it with a tunnel&lt;/strong&gt; and paste the public URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cloudflared tunnel &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Servers you add here are shared with the &lt;strong&gt;MCP Tester&lt;/strong&gt;, so you can call any tool by hand in one click.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://mcpplaygroundonline.com/dashboard/ai-readiness" rel="noopener noreferrer"&gt;Check your server's AI readiness →&lt;/a&gt;&lt;/strong&gt; Free structure checks, plus one free review preview per organisation.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Readiness Pricing, Limits and Privacy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Structure checks are free&lt;/strong&gt;, always.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;An AI Agent Readiness Review costs 50 credits.&lt;/strong&gt; You're only charged if it completes.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Every organisation gets one free preview.&lt;/strong&gt; You see the score, verdict, strengths and risks in full, plus a sample of the rest. Unlocking the full report costs 50 credits, with no second model call.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Routing evals are billed per tool call&lt;/strong&gt;, at the rate of the model you pick. You see the price before you run.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Each organisation can review up to 5 different servers&lt;/strong&gt; for now. Re-running a server you've already reviewed is always allowed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On privacy: &lt;strong&gt;auth headers are encrypted at rest&lt;/strong&gt; and never sent back to your browser. Private and loopback addresses are blocked on every call.&lt;/p&gt;

&lt;p&gt;The review only reads your tool definitions. &lt;strong&gt;It never calls a tool.&lt;/strong&gt; Only the evals you choose to run make real calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;A working MCP server and an agent-ready one aren't the same thing. &lt;strong&gt;Agents choose from your descriptions alone&lt;/strong&gt;, and most descriptions don't give them enough.&lt;/p&gt;

&lt;p&gt;AI Readiness gives you free structure checks, an AI review with rewrites you can paste, and routing evals that prove whether the fixes worked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run it before your users find the gaps for you.&lt;/strong&gt; &lt;a href="https://mcpplaygroundonline.com/dashboard/ai-readiness" rel="noopener noreferrer"&gt;Check your server's AI readiness →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want the fundamentals first? Start with &lt;a href="https://mcpplaygroundonline.com/blog/what-is-model-context-protocol" rel="noopener noreferrer"&gt;what the Model Context Protocol is&lt;/a&gt;, or &lt;a href="https://mcpplaygroundonline.com/blog/testing-mcp-servers-with-real-ai-models" rel="noopener noreferrer"&gt;testing MCP servers with real AI models&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is MCP AI agent readiness?
&lt;/h3&gt;

&lt;p&gt;It is how reliably an AI model picks and calls the right tool on your MCP server, using only the tool names, descriptions and schemas your server returns from tools/list. A server can work perfectly and still score low if its tools are vague or overlap.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the AI Agent Readiness Review call my tools?
&lt;/h3&gt;

&lt;p&gt;No. The review reads your tool definitions only, so it cannot change data on your server. Real tool calls happen only if you choose to run the questions as routing evals.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why don't the free structure checks give a score?
&lt;/h3&gt;

&lt;p&gt;A lint can find missing fields, but it cannot tell whether a model will choose the right tool. A tidy schema with a misleading description passes every lint, so a score there would overstate readiness. The only score comes from the AI review.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do routing evals decide pass or fail?
&lt;/h3&gt;

&lt;p&gt;From the transcript, with no judge model. A question passes when the model's first tool call is the expected tool and it answers within budget. An out-of-scope question passes when the model declines without calling any tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  How much does an AI readiness review cost?
&lt;/h3&gt;

&lt;p&gt;Structure checks are free. A full AI Agent Readiness Review costs 50 credits, and every organisation gets one free preview. Routing evals are billed per tool call at the chosen model's rate, and the price is shown before you run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I test a localhost MCP server?
&lt;/h3&gt;

&lt;p&gt;Not directly, because calls run from MCP Playground's servers. Expose your local server with a tunnel such as cloudflared or ngrok and add the public URL instead.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mcpplaygroundonline.com/blog/mcp-ai-agent-readiness" rel="noopener noreferrer"&gt;MCP Playground&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>agents</category>
      <category>testing</category>
    </item>
    <item>
      <title>MCP Observability: How to Trace Every Tool Call in Production</title>
      <dc:creator>Rupa Tiwari</dc:creator>
      <pubDate>Thu, 24 Sep 2026 18:33:49 +0000</pubDate>
      <link>https://dev.to/rupa_tiwari_dd308948d710f/mcp-observability-how-to-trace-every-tool-call-in-production-21cp</link>
      <guid>https://dev.to/rupa_tiwari_dd308948d710f/mcp-observability-how-to-trace-every-tool-call-in-production-21cp</guid>
      <description>&lt;p&gt;&lt;strong&gt;📖 TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;MCP observability&lt;/strong&gt; means seeing the full path from a prompt, through the model's tool choice, into your server, and back.&lt;/li&gt;
&lt;li&gt;  The &lt;strong&gt;2026-07-28 spec deprecated protocol-level Logging&lt;/strong&gt;, along with Roots, Sampling and HTTP+SSE, on a twelve-month clock.&lt;/li&gt;
&lt;li&gt;  OpenTelemetry's GenAI semantic conventions now include a &lt;strong&gt;dedicated MCP section&lt;/strong&gt; with defined spans, attributes and metrics.&lt;/li&gt;
&lt;li&gt;  Trace context travels in &lt;code&gt;params._meta&lt;/code&gt; using unprefixed &lt;code&gt;traceparent&lt;/code&gt;, &lt;code&gt;tracestate&lt;/code&gt; and &lt;code&gt;baggage&lt;/code&gt; keys.&lt;/li&gt;
&lt;li&gt;  The MCP &lt;strong&gt;client span is the parent of the server span&lt;/strong&gt;, regardless of transport. That is what repairs a broken trace.&lt;/li&gt;
&lt;li&gt;  The conventions are &lt;strong&gt;not stable yet&lt;/strong&gt;. Pin your instrumentation version and expect attribute renames.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A tool call failed in production last week. The agent said "I wasn't able to retrieve that."&lt;/p&gt;

&lt;p&gt;That was the entire signal. No stack trace, no timing, no tool name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is the MCP observability gap, and almost every team building agents hits it around month three.&lt;/strong&gt; Your app has traces. Your MCP server has logs. Neither knows the other exists.&lt;/p&gt;

&lt;p&gt;The worst part is not the outage. It is the failure that &lt;em&gt;looks&lt;/em&gt; like success — a confident, wrong, expensive answer that nobody flags for a week.&lt;/p&gt;

&lt;p&gt;Two things changed in 2026 that make this fixable. The &lt;code&gt;2026-07-28&lt;/code&gt; MCP specification &lt;strong&gt;deprecated protocol-level Logging&lt;/strong&gt;. And OpenTelemetry's GenAI semantic conventions grew a proper &lt;strong&gt;MCP section&lt;/strong&gt; with defined span names, attributes and metrics.&lt;/p&gt;

&lt;p&gt;So there is now one vendor-neutral vocabulary for agent, tool and MCP spans.&lt;/p&gt;

&lt;p&gt;I'll walk through the exact field names, how trace context survives a stateless request, what to alert on, and the five mistakes that quietly produce useless traces.&lt;/p&gt;

&lt;p&gt;If you are new to the protocol itself, start with my &lt;a href="https://mcpplaygroundonline.com/blog/what-is-model-context-protocol" rel="noopener noreferrer"&gt;introduction to the Model Context Protocol&lt;/a&gt; first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is MCP Observability, Exactly?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;MCP observability&lt;/em&gt; is the ability to answer "what did the agent actually do" from telemetry alone.&lt;/p&gt;

&lt;p&gt;That means three linked questions, not one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which tool did the model pick, and why that one?&lt;/strong&gt; Model-side. Lives in your LLM spans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What did the server do with that call?&lt;/strong&gt; Server-side. Latency, downstream calls, errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did the result actually help?&lt;/strong&gt; Outcome-side. Did the agent retry, give up, or hallucinate around a bad result?&lt;/p&gt;

&lt;p&gt;Traditional APM answers the middle question well and the other two not at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An MCP tool call is a distributed transaction that crosses a model, a client, a transport and your backend.&lt;/strong&gt; Treat it like one.&lt;/p&gt;

&lt;p&gt;The three signals map cleanly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Traces&lt;/strong&gt; — the causal path of one request across client and server.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Metrics&lt;/strong&gt; — call rate, duration percentiles, error rate per tool.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Logs&lt;/strong&gt; — the detail you attach to a span, not a separate stream.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is the one that changed this year.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 2026-07-28 Spec Deprecated Logging — Here Is What Replaced It
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;2026-07-28&lt;/code&gt; specification deprecated four things at once: &lt;strong&gt;Roots, Sampling, Logging, and the legacy HTTP+SSE transport.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each gets a minimum twelve-month support window. These were the first deprecations to follow MCP's new formal feature lifecycle policy.&lt;/p&gt;

&lt;p&gt;Logging is the one that matters here. &lt;strong&gt;MCP servers were inventing their own log formats and shipping them over the protocol.&lt;/strong&gt; That never aggregated well.&lt;/p&gt;

&lt;p&gt;The replacement is not another MCP feature. It is OpenTelemetry.&lt;/p&gt;

&lt;p&gt;The spec also documented &lt;a href="https://www.w3.org/TR/trace-context/" rel="noopener noreferrer"&gt;W3C Trace Context&lt;/a&gt; propagation with fixed keys — &lt;code&gt;traceparent&lt;/code&gt;, &lt;code&gt;tracestate&lt;/code&gt; and &lt;code&gt;baggage&lt;/code&gt;. Distributed traces now correlate across SDKs and render as one span tree in your backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Practical read on the deadline&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you built on &lt;code&gt;notifications/message&lt;/code&gt; logging, you have until roughly mid-2027. Do not rewrite in a panic, but do not build anything new on it either.&lt;/p&gt;

&lt;p&gt;The rest of the release pushed the same direction. &lt;strong&gt;Stateless core, header-based routing via &lt;code&gt;Mcp-Method&lt;/code&gt; and &lt;code&gt;Mcp-Name&lt;/code&gt;, and cacheable list results carrying &lt;code&gt;ttlMs&lt;/code&gt; and &lt;code&gt;cacheScope&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All of that assumes you can see across many short-lived requests rather than one long session. Which is exactly what tracing gives you.&lt;/p&gt;

&lt;p&gt;If you have not made that move yet, my &lt;a href="https://mcpplaygroundonline.com/blog/migrate-mcp-server-2026-07-28-stateless" rel="noopener noreferrer"&gt;guide to migrating to the 2026-07-28 stateless spec&lt;/a&gt; covers the breaking changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Your Agent Traces Break at the MCP Boundary
&lt;/h2&gt;

&lt;p&gt;Here is the failure, concretely.&lt;/p&gt;

&lt;p&gt;Your agent framework emits a span for the LLM call. Good. It emits a child span for "tool use". Still good.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then the request crosses into your MCP server and a brand-new, parentless trace begins.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You now have two traces for one logical operation. Neither is searchable by the other's ID.&lt;/p&gt;

&lt;p&gt;Ask "why did the checkout agent take 40 seconds" and you get an agent trace showing 40 seconds of "tool call" and a server trace showing 38 seconds of &lt;em&gt;something&lt;/em&gt;. Joining them is manual archaeology.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The root cause is that JSON-RPC over HTTP has nowhere obvious to put trace headers.&lt;/strong&gt; MCP is a protocol on top of a transport, and the transport headers are not always yours to control — gateways rewrite them, stdio has none at all.&lt;/p&gt;

&lt;p&gt;This got worse with the stateless spec, not better. &lt;strong&gt;Without &lt;code&gt;Mcp-Session-Id&lt;/code&gt;, you lost the one accidental correlation key many teams were quietly relying on.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every request now travels alone, carrying its own protocol version, client identity and capabilities in &lt;code&gt;_meta&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Which turns out to be the hint. &lt;code&gt;_meta&lt;/code&gt; is also where the trace context goes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The OpenTelemetry MCP Semantic Conventions, Field by Field
&lt;/h2&gt;

&lt;p&gt;OpenTelemetry's GenAI Special Interest Group formed in April 2024 and has since expanded to cover agent orchestration, MCP tool calling, content capture and quality evaluation.&lt;/p&gt;

&lt;p&gt;The MCP conventions live in the &lt;a href="https://github.com/open-telemetry/semantic-conventions-genai" rel="noopener noreferrer"&gt;semantic-conventions-genai&lt;/a&gt; repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The headline rule: when instrumenting MCP calls, follow the MCP conventions rather than the generic RPC conventions.&lt;/strong&gt; MCP spans record things RPC spans cannot — tool identity, protocol version, message exchanges inside streaming calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Span names and kinds
&lt;/h3&gt;

&lt;p&gt;Both sides use the same name format: &lt;strong&gt;&lt;code&gt;{mcp.method.name} {target}&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The target matches &lt;code&gt;gen_ai.tool.name&lt;/code&gt; or &lt;code&gt;gen_ai.prompt.name&lt;/code&gt; where one applies. So a tool call becomes &lt;code&gt;tools/call get_invoice&lt;/code&gt;, not a generic &lt;code&gt;POST /mcp&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Client span&lt;/strong&gt; — kind &lt;code&gt;CLIENT&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Server span&lt;/strong&gt; — kind &lt;code&gt;SERVER&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That naming alone fixes most dashboards. &lt;strong&gt;You can group by tool without parsing a request body.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The attributes that matter
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;What it carries&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mcp.method.name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;The request or notification method.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jsonrpc.request.id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Conditional&lt;/td&gt;
&lt;td&gt;When the client executes a request, as a string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mcp.resource.uri&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Conditional&lt;/td&gt;
&lt;td&gt;When the request carries a resource URI.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;error.type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Conditional&lt;/td&gt;
&lt;td&gt;If the operation fails.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rpc.response.status_code&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Conditional&lt;/td&gt;
&lt;td&gt;If the response carries an error code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gen_ai.operation.name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Recommended&lt;/td&gt;
&lt;td&gt;Set to &lt;code&gt;execute_tool&lt;/code&gt; for tool calls.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mcp.protocol.version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Recommended&lt;/td&gt;
&lt;td&gt;Which spec revision this request speaks.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mcp.session.id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Recommended&lt;/td&gt;
&lt;td&gt;Where a session concept still applies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;network.transport&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Recommended&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;tcp&lt;/code&gt;, &lt;code&gt;quic&lt;/code&gt;, or &lt;code&gt;pipe&lt;/code&gt; for stdio.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gen_ai.tool.call.arguments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opt-in&lt;/td&gt;
&lt;td&gt;The parameters passed in. Off by default.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gen_ai.tool.call.result&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opt-in&lt;/td&gt;
&lt;td&gt;What came back. Off by default.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Those opt-in attributes are opt-in for a reason.&lt;/strong&gt; Tool arguments routinely carry customer records, tokens and internal IDs. Turn them on in staging, sample them hard in production, and scrub before export.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mcp.protocol.version&lt;/code&gt; deserves a callout. &lt;strong&gt;Once you support two spec revisions, it becomes the single most useful attribute you have&lt;/strong&gt; — it tells you which clients are still on the old path.&lt;/p&gt;

&lt;h3&gt;
  
  
  The four metrics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;mcp.client.operation.duration&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;mcp.server.operation.duration&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;mcp.client.session.duration&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;mcp.server.session.duration&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Client and server duration are split on purpose. &lt;strong&gt;The gap between them is your transport, gateway and queueing cost&lt;/strong&gt; — and it is usually where the surprise lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Context Propagation Works Through params._meta
&lt;/h2&gt;

&lt;p&gt;This is the mechanism that stitches the trace back together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instrumentations inject trace context into the MCP request's &lt;code&gt;params._meta&lt;/code&gt; property bag using the configured OpenTelemetry propagators.&lt;/strong&gt; The keys are unprefixed: &lt;code&gt;traceparent&lt;/code&gt;, &lt;code&gt;tracestate&lt;/code&gt;, &lt;code&gt;baggage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So a &lt;code&gt;tools/call&lt;/code&gt; on the wire carries something like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JSON-RPC request frame&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tools/call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_invoice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"invoice_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inv_123"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"_meta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"traceparent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the receiving side the rule is explicit. &lt;strong&gt;Server instrumentation should use the context extracted from &lt;code&gt;params._meta&lt;/code&gt; as the parent for the server span&lt;/strong&gt;, and should &lt;em&gt;link&lt;/em&gt; the ambient context if one is present.&lt;/p&gt;

&lt;p&gt;Read that twice, because the ordering is the whole trick.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The MCP client span becomes the parent of the MCP server span regardless of transport.&lt;/strong&gt; Span links then record the transport context separately, where one exists.&lt;/p&gt;

&lt;p&gt;Why parent from &lt;code&gt;_meta&lt;/code&gt; rather than from HTTP headers? Because &lt;code&gt;_meta&lt;/code&gt; rides inside the protocol. &lt;strong&gt;It survives stdio, gateways that rewrite headers, and the stateless routing layer.&lt;/strong&gt; HTTP headers do not.&lt;/p&gt;

&lt;p&gt;That is also why this works for local stdio servers, where there is no HTTP request to hang a header on at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Instrument an MCP Server With OpenTelemetry
&lt;/h2&gt;

&lt;p&gt;The order matters. Do it in this sequence and you get a usable trace on the first try.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Install the SDK and set a real service name.&lt;/strong&gt; The &lt;code&gt;service.name&lt;/code&gt; value shows up as the box in every trace diagram. &lt;code&gt;unknown_service&lt;/code&gt; helps nobody.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Wrap the request handler, not the transport.&lt;/strong&gt; You want one &lt;code&gt;SERVER&lt;/code&gt; span per JSON-RPC request. Name it &lt;code&gt;{mcp.method.name} {target}&lt;/code&gt; and set the kind explicitly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Extract the parent from &lt;code&gt;params._meta&lt;/code&gt; before you create the span.&lt;/strong&gt; Pull &lt;code&gt;traceparent&lt;/code&gt; out and pass it to your propagator's extract call. If it is missing, start a fresh root span rather than throwing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Set &lt;code&gt;mcp.method.name&lt;/code&gt; on every span.&lt;/strong&gt; It is the one required attribute. Everything downstream groups by it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Add &lt;code&gt;gen_ai.operation.name&lt;/code&gt; set to &lt;code&gt;execute_tool&lt;/code&gt; on tool calls.&lt;/strong&gt; This is what makes your MCP spans join the wider GenAI span tree instead of sitting off to the side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Record errors as &lt;code&gt;error.type&lt;/code&gt;, and set &lt;code&gt;rpc.response.status_code&lt;/code&gt; when the JSON-RPC response carries an error code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The single most common gap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A JSON-RPC error is still an HTTP 200. If you only alert on HTTP status, your error rate reads as zero while the agent fails every call. This is the same class of problem behind &lt;a href="https://mcpplaygroundonline.com/blog/mcp-error-32602" rel="noopener noreferrer"&gt;MCP error -32602&lt;/a&gt;, which returns a perfectly healthy 200.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Propagate outward.&lt;/strong&gt; If your tool calls a database or a third-party API, those become child spans automatically once the context is active.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Keep payload capture opt-in.&lt;/strong&gt; Gate &lt;code&gt;gen_ai.tool.call.arguments&lt;/code&gt; behind an environment variable. Default it off.&lt;/p&gt;

&lt;p&gt;One caution before you wire this into a build pipeline: &lt;strong&gt;the GenAI conventions are still under active development and not stable.&lt;/strong&gt; Pin your instrumentation library version and read the changelog on upgrade. Attribute names have moved before.&lt;/p&gt;

&lt;p&gt;Coding agents including VS Code Copilot, OpenAI Codex and Claude Code already emit OTel GenAI traces, so the client half is increasingly free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is &lt;code&gt;_meta&lt;/code&gt; actually populated on the wire?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do not trust the library. Connect to your server in the browser and read the raw JSON-RPC frames your instrumentation is really sending.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free →&lt;/a&gt; &lt;a href="https://mcpplaygroundonline.com/mcp-security-scanner" rel="noopener noreferrer"&gt;Scan your MCP server&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Actually Alert On
&lt;/h2&gt;

&lt;p&gt;Dashboards are easy. Useful alerts are not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alert on tool-level error rate, not server-level.&lt;/strong&gt; One broken tool out of thirty will never move an aggregate. Group by &lt;code&gt;mcp.method.name&lt;/code&gt; plus &lt;code&gt;gen_ai.tool.name&lt;/code&gt; and alert per tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alert on the client-server duration gap.&lt;/strong&gt; If client duration p95 runs far above server duration p95, your server is fine and your gateway is not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alert on p95, never on mean.&lt;/strong&gt; Agent latency distributions are brutally long-tailed. One tool doing a cold database connect will hide entirely in an average.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alert on retry storms.&lt;/strong&gt; Same tool name, same arguments, three or more calls inside one trace means the agent is stuck in a loop and burning tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alert on protocol version drift.&lt;/strong&gt; A sudden rise in old &lt;code&gt;mcp.protocol.version&lt;/code&gt; values means a client rolled back, or a new one connected on the deprecated path.&lt;/p&gt;

&lt;p&gt;What &lt;em&gt;not&lt;/em&gt; to page on: &lt;code&gt;tools/list&lt;/code&gt; volume. &lt;strong&gt;Cacheable list results arrived in the 2026-07-28 spec with &lt;code&gt;ttlMs&lt;/code&gt; and &lt;code&gt;cacheScope&lt;/code&gt;, so list traffic now varies with client cache behaviour, not with demand.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One thing tracing will not tell you: whether the answer was correct. &lt;strong&gt;Latency and error rate say nothing about quality&lt;/strong&gt; — that gap is what &lt;a href="https://mcpplaygroundonline.com/blog/what-is-an-mcp-eval" rel="noopener noreferrer"&gt;MCP evals&lt;/a&gt; exist to close. Run both.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Test MCP Observability Before You Ship
&lt;/h2&gt;

&lt;p&gt;Instrumentation that emits nothing fails silently. That is the whole problem with it.&lt;/p&gt;

&lt;p&gt;Check these four before you call it done.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Does a real client call produce two spans, not one?&lt;/strong&gt; A client span and a server span, with the server span's parent set to the client span.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Does &lt;code&gt;_meta&lt;/code&gt; actually carry &lt;code&gt;traceparent&lt;/code&gt; on the wire?&lt;/strong&gt; Read the raw frame.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Does a deliberately failing tool set &lt;code&gt;error.type&lt;/code&gt;?&lt;/strong&gt; Force a bad argument and look.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Does a stdio server still correlate?&lt;/strong&gt; &lt;code&gt;network.transport&lt;/code&gt; should read &lt;code&gt;pipe&lt;/code&gt; and the parent should still resolve.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fastest way to check all four is to drive the server with a real client and watch the JSON-RPC traffic. For the wider checklist, my &lt;a href="https://mcpplaygroundonline.com/blog/how-to-test-mcp-servers-step-by-step" rel="noopener noreferrer"&gt;step-by-step guide to testing MCP servers&lt;/a&gt; covers the functional side.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five MCP Observability Mistakes I Keep Seeing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Treating a JSON-RPC error as a success.&lt;/strong&gt; The transport returns 200. The call failed. If your error rate comes from HTTP status codes alone, it is wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Using RPC semantic conventions instead of MCP ones.&lt;/strong&gt; You get a span called &lt;code&gt;POST&lt;/code&gt; with no tool name. Technically valid, operationally useless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Logging tool arguments by default.&lt;/strong&gt; &lt;code&gt;gen_ai.tool.call.arguments&lt;/code&gt; is opt-in because arguments carry customer data and credentials. Shipping it to a third-party backend by default is a data-handling incident waiting to happen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Instrumenting the transport instead of the handler.&lt;/strong&gt; A span per HTTP request looks fine until one request carries a batch, or the transport is stdio and there is no HTTP request at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Assuming the conventions are frozen.&lt;/strong&gt; They are not stable. An unpinned instrumentation library can rename an attribute in a patch release and quietly break every dashboard that depends on it.&lt;/p&gt;

&lt;p&gt;If you are auditing what your server exposes more broadly, my &lt;a href="https://mcpplaygroundonline.com/blog/mcp-server-security-complete-guide-2026" rel="noopener noreferrer"&gt;complete MCP server security guide&lt;/a&gt; covers the data-handling side of mistake three.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instrument One Tool First
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MCP observability comes down to three moves.&lt;/strong&gt; Emit MCP-specific spans rather than generic RPC ones, propagate trace context through &lt;code&gt;params._meta&lt;/code&gt;, and alert per tool instead of per server.&lt;/p&gt;

&lt;p&gt;The spec deprecating Logging was not a loss. It pushed MCP onto a vocabulary that every observability backend already speaks.&lt;/p&gt;

&lt;p&gt;Start with one tool. Confirm the client span actually parents the server span. Then expand.&lt;/p&gt;

&lt;p&gt;And if you run several servers behind one entry point, the gateway itself becomes a span worth watching — my &lt;a href="https://mcpplaygroundonline.com/blog/mcp-gateway-guide" rel="noopener noreferrer"&gt;MCP gateway guide&lt;/a&gt; covers that routing layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is MCP logging removed?
&lt;/h3&gt;

&lt;p&gt;Deprecated, not removed. The 2026-07-28 specification deprecated Logging alongside Roots, Sampling and the legacy HTTP+SSE transport, each with a minimum twelve-month support window. Existing code keeps working through that period, but new work should emit OpenTelemetry data instead of protocol-level log notifications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need OpenTelemetry to run an MCP server?
&lt;/h3&gt;

&lt;p&gt;No, it is optional. A single-user local server does fine without it. But once more than one team calls your server, or once it runs behind a gateway or load balancer, correlating a failure without distributed tracing becomes guesswork across two unrelated log streams.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does tracing work for stdio MCP servers with no HTTP headers?
&lt;/h3&gt;

&lt;p&gt;Trace context travels inside the params._meta property bag of the JSON-RPC request, not in transport headers, so stdio works identically to HTTP. Set network.transport to pipe on the span. This is precisely why the OpenTelemetry MCP conventions propagate through _meta rather than relying on the transport layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the stateless 2026-07-28 spec break tracing?
&lt;/h3&gt;

&lt;p&gt;The opposite. Losing Mcp-Session-Id removed an accidental correlation key that many teams were relying on, and _meta-based trace propagation is the deliberate replacement. It survives load balancers, header-rewriting gateways and round-robin routing in a way session IDs never did.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which observability backend should I send MCP traces to?
&lt;/h3&gt;

&lt;p&gt;Any OTLP-compatible backend. That is the point of a vendor-neutral semantic convention: the span shape is identical whether it lands in Jaeger, Grafana Tempo, Datadog, Honeycomb or a self-hosted collector. Choose on cost and retention rather than on MCP support, since the conventions do the compatibility work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is my MCP error rate showing zero when calls are failing?
&lt;/h3&gt;

&lt;p&gt;Because a JSON-RPC error is returned inside a successful HTTP 200 response. If your monitoring derives error rate from HTTP status codes alone, every failed tool call looks healthy. Set error.type on the span and populate rpc.response.status_code when the JSON-RPC response carries an error code.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mcpplaygroundonline.com/blog/mcp-observability-opentelemetry" rel="noopener noreferrer"&gt;MCP Playground&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>mcp</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>MCP Agent Use Cases: 8 AI Agents You Can Build by Role</title>
      <dc:creator>Rupa Tiwari</dc:creator>
      <pubDate>Tue, 15 Sep 2026 08:25:22 +0000</pubDate>
      <link>https://dev.to/rupa_tiwari_dd308948d710f/mcp-agent-use-cases-8-ai-agents-you-can-build-by-role-4c91</link>
      <guid>https://dev.to/rupa_tiwari_dd308948d710f/mcp-agent-use-cases-8-ai-agents-you-can-build-by-role-4c91</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📖 TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;An MCP agent is four things&lt;/strong&gt;: a model, two or three MCP servers, a system prompt, and a guardrail on writes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sales&lt;/strong&gt; → HubSpot or Salesforce + Slack + Calendar. &lt;strong&gt;Marketing&lt;/strong&gt; → Ahrefs or Semrush + Exa + Notion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social media&lt;/strong&gt; → X and TikTok have official ad MCP servers. Organic posting still needs Zapier or your own server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support&lt;/strong&gt; → Stripe + Slack + Linear. &lt;strong&gt;Data&lt;/strong&gt; → PostHog or Amplitude + your warehouse. &lt;strong&gt;Engineering&lt;/strong&gt; → GitHub + Sentry + Linear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three servers is the ceiling&lt;/strong&gt; for most agents. Past that, tool-selection accuracy falls off a cliff.&lt;/li&gt;
&lt;li&gt;Model choice is a cost decision, not a quality one. &lt;strong&gt;Haiku for routing, Sonnet for reasoning, Opus for long chains.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every team I talk to wants the same thing from MCP. Not a protocol tour — &lt;strong&gt;an agent that does their actual job&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The sales lead wants call prep. The marketer wants a content brief that cites real keyword data. The support lead wants refund triage.&lt;/p&gt;

&lt;p&gt;These are all the same build. Only the servers change.&lt;/p&gt;

&lt;p&gt;So this post is organised the way you actually think about it: &lt;strong&gt;by role&lt;/strong&gt;. For each one I list the MCP servers worth connecting, the hosted URLs, a model recommendation, and example prompts that work on day one.&lt;/p&gt;

&lt;p&gt;I have kept every URL genuine. Where a service has no official hosted MCP server, I say so instead of inventing one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anatomy of an MCP Agent (Four Parts, No More)
&lt;/h2&gt;

&lt;p&gt;Strip away the frameworks and every MCP agent is the same four things.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;What it decides&lt;/th&gt;
&lt;th&gt;Where teams get it wrong&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How well it picks the right tool&lt;/td&gt;
&lt;td&gt;Paying for a frontier model to do lookups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP servers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What the agent can actually reach&lt;/td&gt;
&lt;td&gt;Connecting eight when three would do&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;System prompt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The job, the tone, the limits&lt;/td&gt;
&lt;td&gt;Vague role text with no stop rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Write guardrail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What it may change without asking&lt;/td&gt;
&lt;td&gt;Skipped entirely until something breaks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The fourth row is the one people skip.&lt;/strong&gt; An agent with a Stripe token can issue refunds. An agent with a CRM token can overwrite deal stages.&lt;/p&gt;

&lt;p&gt;I put one line in every system prompt I write: &lt;em&gt;propose writes, never execute them, until I say go&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Pick MCP Servers for Any Agent
&lt;/h2&gt;

&lt;p&gt;The instinct is to connect everything. &lt;strong&gt;Resist it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every connected server injects its full tool schema into the model's context on every single request. A large server like GitHub runs to roughly 18,000 tokens on its own.&lt;/p&gt;

&lt;p&gt;Connect six of those and you have burned your context window before the user types a word. Worse, tool-selection accuracy drops as near-identical tool descriptions pile up.&lt;/p&gt;

&lt;p&gt;I use a &lt;strong&gt;three-server rule&lt;/strong&gt;, and each server plays a distinct part:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;System of record&lt;/strong&gt; — where the truth lives. HubSpot, GitHub, Stripe, your warehouse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context source&lt;/strong&gt; — what fills the gaps. Exa for the web, Notion for internal docs, Calendar for timing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delivery channel&lt;/strong&gt; — where the output lands. Slack, Notion, Linear.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Record, context, channel. &lt;strong&gt;Almost every useful agent below is that shape.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Sales Agent: CRM Hygiene and Call Prep
&lt;/h2&gt;

&lt;p&gt;Sales reps lose hours to two chores. &lt;strong&gt;Researching a prospect before a call, and updating the CRM after it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both are pure context assembly. That is exactly what an MCP agent is good at.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MCP server&lt;/th&gt;
&lt;th&gt;Hosted URL&lt;/th&gt;
&lt;th&gt;What it unlocks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HubSpot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.hubspot.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deals, contacts, pipeline stages, notes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Salesforce&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-org URL from your instance&lt;/td&gt;
&lt;td&gt;Opportunities, accounts, custom objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Clay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.clay.earth/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enrichment, firmographics, contact finding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exa&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.exa.ai/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live web research on the account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Calendar&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://calendarmcp.googleapis.com/mcp/v1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Who you are meeting, and when&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Slack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.slack.com/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delivery channel for the brief&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;My recommended build:&lt;/strong&gt; Calendar + HubSpot + Exa. The agent reads tomorrow's meetings, pulls each account's CRM history, and researches recent news.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; Claude Sonnet 5. Call prep involves synthesis across three sources, which is where cheaper models start dropping details.&lt;/p&gt;

&lt;p&gt;Prompts that work immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prep me for tomorrow's calls. For each one, pull the deal stage, last contact date, and anything newsworthy about the company.&lt;/li&gt;
&lt;li&gt;Which deals have had no activity in 21 days and are still marked as open?&lt;/li&gt;
&lt;li&gt;Draft a follow-up email for the Acme deal referencing what we discussed last time.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Watch the write scope.&lt;/strong&gt; A HubSpot token with write access lets the agent change deal stages. Start read-only, and add writes once you trust its judgement.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. The Marketing Agent: Briefs Backed by Real Data
&lt;/h2&gt;

&lt;p&gt;Most AI content workflows fail for one reason. &lt;strong&gt;The model has no idea what people actually search for.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It guesses at keywords, invents volumes, and produces a brief that reads well and ranks nowhere.&lt;/p&gt;

&lt;p&gt;Connecting a real SEO data source fixes that in one step.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MCP server&lt;/th&gt;
&lt;th&gt;Hosted URL&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ahrefs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://api.ahrefs.com/mcp/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Backlinks, keyword difficulty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Semrush&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.semrush.com/v1/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Competitor gaps, position tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DataForSEO&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.dataforseo.com/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Raw SERP data, cheapest per call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenSEO&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://app.openseo.so/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;AI-search visibility tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Firecrawl&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.firecrawl.dev/v2/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scraping competitor pages to markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.notion.com/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Where the finished brief lands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Webflow&lt;/strong&gt; / &lt;strong&gt;Sanity&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;https://mcp.webflow.com/mcp&lt;/code&gt; / &lt;code&gt;https://mcp.sanity.io&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Publishing straight to the CMS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Canva&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.canva.com/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generating on-brand visuals&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;My recommended build:&lt;/strong&gt; Ahrefs + Exa + Notion. Keyword truth, live SERP context, and a place to file the output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; Sonnet 5, or a stronger reasoning model when the brief spans a dozen competitor pages.&lt;/p&gt;

&lt;p&gt;Prompts worth stealing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Find five keywords we rank on page two for, with difficulty under 30, and outline a post for the best one.&lt;/li&gt;
&lt;li&gt;Compare the top five results for this keyword and list every heading they cover that we do not.&lt;/li&gt;
&lt;li&gt;Which of our published posts have lost positions in the last 90 days?&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Before you hand an SEO server real API credits&lt;/strong&gt;, connect it in the browser and read its tool list. Ahrefs and Semrush both meter by call, and a chatty agent burns quota fast.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. The Social Media Agent: Where MCP Helps and Where It Does Not
&lt;/h2&gt;

&lt;p&gt;This is the role with the biggest gap between expectation and reality, so let me be blunt about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paid social has excellent official MCP coverage. Organic posting mostly does not.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;X and TikTok both ship real hosted MCP servers, and both are aimed at advertising. There is no official hosted MCP server for scheduling an Instagram carousel or a LinkedIn post.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;MCP URL&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;X (Twitter)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://api.x.com/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Official, ads and API surface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TikTok for Business&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://business-api.tiktok.com/open_mcp/tt-ads-mcp-flat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Official, campaign management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Meta Ads (Pipeboard)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://meta-ads.mcp.pipeboard.co/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Third-party, Facebook and Instagram ads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Apify&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.apify.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scraping public profiles and competitor feeds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Canva&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.canva.com/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generating post creative from a brand template&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zapier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-account URL you generate&lt;/td&gt;
&lt;td&gt;The practical bridge to organic posting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Zapier is the honest answer for scheduling.&lt;/strong&gt; You pick the actions you want exposed, Zapier generates a private MCP endpoint, and the agent calls those actions as tools.&lt;/p&gt;

&lt;p&gt;It is not elegant. It works today, and it covers the platforms nobody else does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; Sonnet-class for ad analysis. A cheap model is plenty if the agent only drafts copy and reads metrics.&lt;/p&gt;

&lt;p&gt;Prompts to start with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which three ad sets had the worst ROAS last week, and what do the winning ones have in common?&lt;/li&gt;
&lt;li&gt;Pull our last 20 posts and tell me which format gets the most saves.&lt;/li&gt;
&lt;li&gt;Draft five hooks for this week's launch, each under 200 characters, in our usual voice.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. The Customer Support Agent: Triage Before a Human Reads It
&lt;/h2&gt;

&lt;p&gt;Support tickets arrive with no context. &lt;strong&gt;The agent's job is to attach it before a human opens the thread.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Who is this customer? What plan are they on? Did they just get charged twice? Is this a known bug?&lt;/p&gt;

&lt;p&gt;Three servers answer all four questions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stripe&lt;/strong&gt; — &lt;code&gt;https://mcp.stripe.com/&lt;/code&gt; for subscription state, invoices and failed payments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack&lt;/strong&gt; — &lt;code&gt;https://mcp.slack.com/mcp&lt;/code&gt; to read the support channel and post the summary back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linear&lt;/strong&gt; — &lt;code&gt;https://mcp.linear.app/sse&lt;/code&gt; to check whether the bug is already filed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; Claude Haiku 4.5. Triage is high-volume and low-ambiguity, which is the cheapest model's sweet spot.&lt;/p&gt;

&lt;p&gt;This is also the role where read-only really matters. A support agent should never issue a refund on its own initiative.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Prompt injection is a live risk here.&lt;/strong&gt; Ticket text is untrusted input written by strangers. An agent that reads tickets and holds a Stripe write token is one crafted message away from a bad day. Keep the refund tool out of its reach.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-security-scanner" rel="noopener noreferrer"&gt;Scan your MCP server →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. The Data and Analytics Agent: Answers Without a Ticket
&lt;/h2&gt;

&lt;p&gt;Every analytics team has the same queue. &lt;strong&gt;Twenty people asking questions that are one SQL query away from an answer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An MCP agent with warehouse access clears most of that queue, as long as you keep it read-only.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Servers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Product analytics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PostHog &lt;code&gt;https://mcp.posthog.com/mcp&lt;/code&gt;, Amplitude &lt;code&gt;https://mcp.amplitude.com/mcp&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Warehouses&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BigQuery &lt;code&gt;https://bigquery.googleapis.com/mcp&lt;/code&gt;; Snowflake and ClickHouse run locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App databases&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Neon &lt;code&gt;https://mcp.neon.tech/sse&lt;/code&gt;, MongoDB via its local server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notebooks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hex &lt;code&gt;https://app.hex.tech/mcp&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;My recommended build:&lt;/strong&gt; one analytics source, one warehouse, Slack for delivery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; a strong reasoning model. SQL generation against an unfamiliar schema is where the cheaper tiers start guessing at column names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-negotiable:&lt;/strong&gt; connect with a read-only role. Not a role you promise to use carefully — one the database will not let write.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The Engineering Agent: The Best-Served Role in MCP
&lt;/h2&gt;

&lt;p&gt;Engineering has the deepest MCP coverage of any function. Almost every developer tool shipped a server first.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;th&gt;Agent job&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://api.githubcopilot.com/mcp/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PR review, release notes, stale-branch sweeps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sentry&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.sentry.dev/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Error triage, regression spotting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Linear&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.linear.app/sse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sprint state, ticket creation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vercel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.vercel.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deploy status, build log reading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.cloudflare.com/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Workers, DNS, edge config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Figma&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.figma.com/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Design-to-code handoff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.context7.com/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Current library docs, no auth needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Datadog&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.datadoghq.com/api/unstable/mcp-server/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live metrics and logs during an incident&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PagerDuty&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://mcp.pagerduty.com/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;On-call context and incident timelines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three builds cover most of what engineering teams ask for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Engineering lead&lt;/strong&gt; — GitHub + Linear + Slack. Sprint status without the standup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full-stack shipper&lt;/strong&gt; — GitHub + Vercel + Sentry. Ship, watch, roll back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post-incident review&lt;/strong&gt; — Sentry + Linear + Slack. A timeline written while it is still fresh.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; the top tier. Code reasoning across a diff is the one place a frontier model consistently earns its cost.&lt;/p&gt;

&lt;p&gt;Only the GitHub server is free to connect with no key. Context7 is the other one, which makes the pair a good first test.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. The Project Ops Agent: Meetings In, Tasks Out
&lt;/h2&gt;

&lt;p&gt;Project managers spend their week converting one format into another. &lt;strong&gt;Meeting notes into tickets. Tickets into status updates.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is mechanical work, and it is the easiest agent on this list to get right.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Asana&lt;/strong&gt; — &lt;code&gt;https://mcp.asana.com/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monday.com&lt;/strong&gt; — &lt;code&gt;https://mcp.monday.com/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jira and Confluence&lt;/strong&gt; — &lt;code&gt;https://mcp.atlassian.com/v1/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Airtable&lt;/strong&gt; — &lt;code&gt;https://mcp.airtable.com/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Calendar&lt;/strong&gt; — &lt;code&gt;https://calendarmcp.googleapis.com/mcp/v1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;My recommended build:&lt;/strong&gt; Calendar + Notion + Slack. It reads yesterday's meetings, finds the notes, and drafts the action items.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; Haiku 4.5. Summarising and restructuring text does not need a reasoning model, and this agent runs daily.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. The Finance and RevOps Agent: Revenue Questions, Answered Live
&lt;/h2&gt;

&lt;p&gt;Finance questions are usually simple and always urgent. &lt;strong&gt;Which subscriptions failed to renew this week?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Payment platforms have solid MCP coverage, so this one is quick to stand up.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stripe&lt;/strong&gt; — &lt;code&gt;https://mcp.stripe.com/&lt;/code&gt; for subscriptions, invoices, disputes and payouts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PayPal&lt;/strong&gt; — &lt;code&gt;https://mcp.paypal.com/mcp&lt;/code&gt; for orders and refunds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cashfree&lt;/strong&gt; — &lt;code&gt;https://mcp.cashfree.com/mcp&lt;/code&gt; for India-first payment flows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Join Stripe to Linear and Slack, and a spike in failed payments becomes a tracked issue rather than a Slack message nobody actions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; Sonnet-class. Money questions deserve a model that checks its arithmetic against the tool output rather than guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which Model for Which Agent?
&lt;/h2&gt;

&lt;p&gt;Teams overthink this. &lt;strong&gt;Model choice is a cost decision far more often than a quality one.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A triage agent reading tickets does not need frontier reasoning. A code-review agent across a 900-line diff does.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Use it for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nano / Flash&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One-tool lookups, routing, Zapier actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Haiku 4.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Support triage, standups, daily digests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Sonnet 5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The default. Sales, marketing, finance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Sonnet 4.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Three servers, long tool chains, SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Opus 5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Code review, incident analysis, hard chains&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Start one tier below what you think you need.&lt;/strong&gt; If the agent picks the wrong tool or drops a step, move up one and compare.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Before You Trust: Four Checks That Take Five Minutes
&lt;/h2&gt;

&lt;p&gt;Here is the failure mode I see most. Someone wires four servers into an agent, it behaves strangely, and they blame the model.&lt;/p&gt;

&lt;p&gt;Nine times out of ten the server was the problem. &lt;strong&gt;It exposed three tools instead of the twelve the docs promised&lt;/strong&gt;, or its auth silently failed.&lt;/p&gt;

&lt;p&gt;So before any URL above goes into an agent, run it through four checks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Does it connect at all?&lt;/strong&gt; Paste the URL into a tester and watch the handshake.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What tools does it really expose?&lt;/strong&gt; Read the list. Compare it to what you assumed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does a real call return real data?&lt;/strong&gt; A tools list that loads is not proof the tool works. Invoke one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How big is the schema?&lt;/strong&gt; A server with 40 verbose tools will crowd out everything else you connect.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;This runs in the browser with no install.&lt;/strong&gt; Paste any remote MCP URL, complete the OAuth flow or add a bearer token, and inspect the tool list and raw JSON-RPC responses before you commit.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free →&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-security-scanner" rel="noopener noreferrer"&gt;Scan your MCP server →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Five Mistakes That Ruin Otherwise Good Agents
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Connecting every server you can find.&lt;/strong&gt; Three is the working ceiling. Each extra one costs context and accuracy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Giving write access on day one.&lt;/strong&gt; Run read-only for a week. Read the transcripts. Then decide which writes it has earned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Using one generic system prompt for every agent.&lt;/strong&gt; A sales agent and a support agent need different stop rules, not the same helpful-assistant boilerplate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Skipping the token scope review.&lt;/strong&gt; A GitHub token with repo scope reaches every private repository you can. Scope it down before it goes in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Never evaluating the thing.&lt;/strong&gt; If you cannot say whether last week's version was better, you are guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start With One Role, Not a Platform
&lt;/h2&gt;

&lt;p&gt;The pattern repeats across every role here. &lt;strong&gt;One system of record, one context source, one delivery channel, and a model matched to the difficulty.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sales gets a CRM and a calendar. Marketing gets keyword data. Support gets billing state. Engineering gets the repo and the error tracker.&lt;/p&gt;

&lt;p&gt;Pick the role that loses the most hours this week and build that one. &lt;strong&gt;Test every server in the browser before you trust it with a token.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Guides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What Is the Model Context Protocol (MCP)? A Developer's Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/ai-agent-mcp-explained" rel="noopener noreferrer"&gt;AI Agent + MCP Explained: What Every Developer Needs to Know&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/what-is-mcp-agent-tool-calling" rel="noopener noreferrer"&gt;What Is an MCP Agent? Tool Calling Explained&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/best-ai-model-for-mcp-tool-calling" rel="noopener noreferrer"&gt;The Best AI Model for MCP Tool Calling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/mcp-context-bloat-tool-search" rel="noopener noreferrer"&gt;MCP Context Bloat and Tool Search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/build-first-mcp-agent-no-code" rel="noopener noreferrer"&gt;Build Your First MCP Agent With No Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/what-is-an-mcp-eval" rel="noopener noreferrer"&gt;What Is an MCP Eval, and Why You Need One&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/specification/latest" rel="noopener noreferrer"&gt;Official: MCP Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://registry.modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Official: MCP Server Registry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/github/github-mcp-server" rel="noopener noreferrer"&gt;GitHub MCP Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.stripe.com/mcp" rel="noopener noreferrer"&gt;Stripe: Model Context Protocol docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linear.app/docs/mcp" rel="noopener noreferrer"&gt;Linear: MCP server docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zapier.com/mcp" rel="noopener noreferrer"&gt;Zapier MCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/engineering/building-effective-agents" rel="noopener noreferrer"&gt;Anthropic: Building effective agents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mcpplaygroundonline.com/blog/mcp-agent-use-cases" rel="noopener noreferrer"&gt;MCP Playground&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>agents</category>
      <category>llm</category>
    </item>
    <item>
      <title>Agent Skills vs MCP vs Function Calling vs A2A: When to Use Each</title>
      <dc:creator>Rupa Tiwari</dc:creator>
      <pubDate>Wed, 02 Sep 2026 11:47:01 +0000</pubDate>
      <link>https://dev.to/rupa_tiwari_dd308948d710f/agent-skills-vs-mcp-vs-function-calling-vs-a2a-when-to-use-each-1p99</link>
      <guid>https://dev.to/rupa_tiwari_dd308948d710f/agent-skills-vs-mcp-vs-function-calling-vs-a2a-when-to-use-each-1p99</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📖 TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent Skills&lt;/strong&gt; teach an agent &lt;em&gt;how&lt;/em&gt; to do something. A folder with a &lt;code&gt;SKILL.md&lt;/code&gt; file. No server, no auth, no runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; gives an agent &lt;em&gt;access&lt;/em&gt; to something. A live JSON-RPC server exposing tools, resources and prompts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Function calling&lt;/strong&gt; is the model-level primitive underneath both. Provider-specific JSON schemas, no discovery, no transport.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A2A&lt;/strong&gt; connects one agent to &lt;em&gt;another agent&lt;/em&gt;. A horizontal link, where MCP is the vertical one.&lt;/li&gt;
&lt;li&gt;Rule of thumb: &lt;strong&gt;knowledge → Skill. Connectivity → MCP. One provider, one app → function calling. Cross-agent delegation → A2A.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;They compose. The MCP working group is now standardising &lt;strong&gt;Skills over MCP&lt;/strong&gt;, which merges the top two.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every week someone asks me whether Agent Skills replace MCP. The question is wrong, and picking the wrong one is expensive.&lt;/p&gt;

&lt;p&gt;Wrap procedural knowledge in an MCP server and you burn context on every session. Wrap live database access in a Skill and it simply cannot reach the database.&lt;/p&gt;

&lt;p&gt;I have shipped both. &lt;strong&gt;Agent Skills vs MCP is not a versus at all&lt;/strong&gt; — they sit at different layers, alongside function calling and A2A.&lt;/p&gt;

&lt;p&gt;This post gives you the one-sentence distinction for each, a decision table you can paste into a design doc, and the five mistakes I keep seeing.&lt;/p&gt;

&lt;p&gt;I also cover &lt;em&gt;Skills over MCP&lt;/em&gt;, the MCP working group effort that merges the two standards. It changed how I plan agent architecture in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four Layers, Not Four Choices
&lt;/h2&gt;

&lt;p&gt;Here is the whole argument in one table. Each row answers a different question, which is why teams end up shipping all four.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Answers&lt;/th&gt;
&lt;th&gt;Shape&lt;/th&gt;
&lt;th&gt;Runtime?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agent Skills&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How do I do this task?&lt;/td&gt;
&lt;td&gt;Folder with &lt;code&gt;SKILL.md&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What can I reach?&lt;/td&gt;
&lt;td&gt;JSON-RPC client/server&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Function calling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How does the model ask?&lt;/td&gt;
&lt;td&gt;JSON schema in the API call&lt;/td&gt;
&lt;td&gt;Your code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A2A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Who else can do this?&lt;/td&gt;
&lt;td&gt;Agent-to-agent HTTP protocol&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Function calling is the floor.&lt;/strong&gt; MCP standardises what sits on top of it. Skills sit above MCP as instructions. A2A sits beside all three.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are Agent Skills?
&lt;/h2&gt;

&lt;p&gt;An &lt;em&gt;Agent Skill&lt;/em&gt; is a folder containing a &lt;code&gt;SKILL.md&lt;/code&gt; file. That is the entire required surface area.&lt;/p&gt;

&lt;p&gt;Anthropic shipped Skills in Claude in October 2025 and &lt;strong&gt;released the format as an open standard on 18 December 2025&lt;/strong&gt; at &lt;a href="https://agentskills.io/" rel="noopener noreferrer"&gt;agentskills.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The frontmatter needs exactly two fields. Everything else is optional.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-skill/
├── SKILL.md          # required: metadata + instructions
├── scripts/          # optional: executable code
├── references/       # optional: docs loaded on demand
└── assets/           # optional: templates, schemas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;incident-postmortem&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Write a blameless postmortem from an incident timeline.&lt;/span&gt;
  &lt;span class="s"&gt;Use when the user mentions an outage, incident review, or RCA.&lt;/span&gt;
&lt;span class="na"&gt;license&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Apache-2.0&lt;/span&gt;
&lt;span class="na"&gt;allowed-tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bash(git:*) Read&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gu"&gt;## Steps&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; Pull the incident timeline from the linked doc.
&lt;span class="p"&gt;2.&lt;/span&gt; Separate trigger, contributing factors and detection gap.
&lt;span class="p"&gt;3.&lt;/span&gt; Never name individuals. Name systems and processes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rules are tight. &lt;strong&gt;&lt;code&gt;name&lt;/code&gt; is max 64 characters&lt;/strong&gt;, lowercase alphanumerics and single hyphens, and must match the directory name.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;description&lt;/code&gt; is max 1024 characters and does the real work. It is the only thing the agent sees until the skill fires.&lt;/p&gt;

&lt;p&gt;Optional fields are &lt;code&gt;license&lt;/code&gt;, &lt;code&gt;compatibility&lt;/code&gt;, &lt;code&gt;metadata&lt;/code&gt;, and the experimental &lt;code&gt;allowed-tools&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Progressive disclosure is the whole trick
&lt;/h3&gt;

&lt;p&gt;Skills load in three stages, and this is why they are cheap.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Discovery&lt;/strong&gt; — only &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;description&lt;/code&gt; load at startup, roughly 100 tokens per skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activation&lt;/strong&gt; — the full &lt;code&gt;SKILL.md&lt;/code&gt; body loads when a task matches. Keep it under 5,000 tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution&lt;/strong&gt; — bundled scripts and reference files load only if the instructions reach for them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;You can install fifty skills and pay almost nothing until one fires.&lt;/strong&gt; Try that with fifty MCP servers and your context window is gone before the first message.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Portability check:&lt;/strong&gt; the same &lt;code&gt;SKILL.md&lt;/code&gt; folder is read by Claude Code, ChatGPT and Codex, Cursor, GitHub Copilot, VS Code, Gemini CLI, JetBrains Junie, AWS Kiro, Block Goose and OpenCode. Write once, run in any of them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Is MCP?
&lt;/h2&gt;

&lt;p&gt;The &lt;em&gt;Model Context Protocol&lt;/em&gt; is a live client-server protocol. It gives an agent access to systems it does not already have.&lt;/p&gt;

&lt;p&gt;MCP uses &lt;strong&gt;JSON-RPC 2.0 between hosts, clients and servers&lt;/strong&gt;. Servers expose three primitives: tools, resources and prompts.&lt;/p&gt;

&lt;p&gt;The current revision is &lt;strong&gt;2026-07-28&lt;/strong&gt;, which moved the base protocol to stateless, self-contained requests with per-request capability negotiation.&lt;/p&gt;

&lt;p&gt;That matters for deployment. Stateless servers scale horizontally without sticky sessions, which the older session-bound transport required.&lt;/p&gt;

&lt;p&gt;The critical property: &lt;strong&gt;an MCP server does something.&lt;/strong&gt; It queries Postgres, hits the Stripe API, reads a file. A Skill cannot do any of that on its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  The context cost nobody warns you about
&lt;/h3&gt;

&lt;p&gt;Most MCP clients load &lt;strong&gt;every connected server's full tool list into the system prompt at session start&lt;/strong&gt;. Names, descriptions and complete input schemas.&lt;/p&gt;

&lt;p&gt;Connect eight servers with fifteen tools each and you have spent a serious chunk of the context window before the user types anything.&lt;/p&gt;

&lt;p&gt;This is the single strongest practical argument for Skills. It is also why tool description quality is worth obsessing over.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Not sure how much context your MCP server is costing?&lt;/strong&gt; Connect it in the browser, see every tool schema the model receives, and watch a real model decide which one to call.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free →&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-token-counter" rel="noopener noreferrer"&gt;Count your tool-schema tokens →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Is Function Calling?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Function calling&lt;/em&gt; is a model capability, not a protocol. You pass JSON schemas in the API request and the model returns a structured call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You still write every piece of plumbing.&lt;/strong&gt; Execution, auth, retries, error shaping, and a new adapter for each provider you support.&lt;/p&gt;

&lt;p&gt;There is no discovery. The model cannot ask what tools exist — you hand it the list on every request.&lt;/p&gt;

&lt;p&gt;Function calling is the right choice when &lt;strong&gt;one app talks to one provider and owns all its tools&lt;/strong&gt;. Adding MCP there is pure overhead.&lt;/p&gt;

&lt;p&gt;It is the wrong choice the moment a second client needs the same tools.&lt;/p&gt;

&lt;p&gt;Worth remembering: &lt;strong&gt;MCP does not replace function calling.&lt;/strong&gt; Under the hood an MCP client still converts tools into function-calling schemas for the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is A2A?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;A2A&lt;/em&gt; (Agent2Agent) connects agents to other agents. Google announced it in April 2025 and donated it to the Linux Foundation that June.&lt;/p&gt;

&lt;p&gt;An agent publishes an &lt;strong&gt;Agent Card&lt;/strong&gt; at a well-known URL describing its skills, endpoint and auth. Other agents read it to decide whether to delegate.&lt;/p&gt;

&lt;p&gt;Note the collision: A2A uses the word "skills" for advertised agent capabilities. &lt;strong&gt;Those are not Agent Skills as in &lt;code&gt;SKILL.md&lt;/code&gt;.&lt;/strong&gt; Different concept, same word.&lt;/p&gt;

&lt;p&gt;The axis is what separates them. &lt;strong&gt;MCP is vertical, agent down to tools. A2A is horizontal, agent across to agents.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Skills vs MCP: The Real Difference
&lt;/h2&gt;

&lt;p&gt;Strip everything else away and it comes down to one line.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;MCP gives an agent a capability it did not have. A Skill gives an agent judgment it did not have.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ask one question about your use case: &lt;strong&gt;does the agent need to reach a system it cannot currently reach?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes means MCP. The agent has no path to your warehouse, your ticketing system, your internal API.&lt;/p&gt;

&lt;p&gt;No means a Skill. The agent already has the tools — it just does not know your process, your naming conventions, your review checklist.&lt;/p&gt;

&lt;h3&gt;
  
  
  Four differences that show up in production
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Context cost.&lt;/strong&gt; Skills load metadata first, body on demand. MCP tool schemas load in full, up front, whether used or not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations.&lt;/strong&gt; A Skill is Markdown in git. An MCP server is running software with uptime, tokens, versioning and a protocol to track.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Failure mode.&lt;/strong&gt; A bad Skill produces bad output you can read and fix. A broken MCP server produces timeouts, 401s and &lt;code&gt;-32602&lt;/code&gt; errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security surface.&lt;/strong&gt; A Skill runs bundled scripts with your agent's permissions. An MCP server is an external system that can return prompt-injection payloads in tool results.&lt;/p&gt;

&lt;p&gt;Neither is safe by default. &lt;strong&gt;Both need review before you point an autonomous agent at them.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Skills are executable, not documentation.&lt;/strong&gt; A skill can bundle scripts and declare &lt;code&gt;allowed-tools&lt;/code&gt; to pre-approve them. Installing a skill from a public marketplace is closer to installing an npm package than reading a README. Audit it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Side-by-Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Agent Skills&lt;/th&gt;
&lt;th&gt;MCP&lt;/th&gt;
&lt;th&gt;Function calling&lt;/th&gt;
&lt;th&gt;A2A&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Provides&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Procedural knowledge&lt;/td&gt;
&lt;td&gt;Live system access&lt;/td&gt;
&lt;td&gt;Structured intent&lt;/td&gt;
&lt;td&gt;Delegation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Artifact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;SKILL.md&lt;/code&gt; folder&lt;/td&gt;
&lt;td&gt;Server process&lt;/td&gt;
&lt;td&gt;JSON schema&lt;/td&gt;
&lt;td&gt;Agent Card + endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~100 tokens idle&lt;/td&gt;
&lt;td&gt;Full schemas, always&lt;/td&gt;
&lt;td&gt;Full schemas, always&lt;/td&gt;
&lt;td&gt;Card only, on discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Needs hosting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Your app&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-vendor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes, 40+ clients&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No, per provider&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Governance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open spec, agentskills.io&lt;/td&gt;
&lt;td&gt;Linux Foundation&lt;/td&gt;
&lt;td&gt;Each model vendor&lt;/td&gt;
&lt;td&gt;Linux Foundation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Repeatable workflows&lt;/td&gt;
&lt;td&gt;Shared integrations&lt;/td&gt;
&lt;td&gt;Single-app tools&lt;/td&gt;
&lt;td&gt;Multi-agent systems&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When to Use Each
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Build an Agent Skill when…
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The task is &lt;strong&gt;process and judgment&lt;/strong&gt;, not access — a code review checklist, a brand style guide, a postmortem format.&lt;/li&gt;
&lt;li&gt;You keep pasting the same instructions into chat.&lt;/li&gt;
&lt;li&gt;The agent already has the tools and just applies them wrongly.&lt;/li&gt;
&lt;li&gt;You want the same behaviour across Claude Code, Codex and Cursor without maintaining three configs.&lt;/li&gt;
&lt;li&gt;The knowledge changes often and non-engineers should be able to edit it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Build an MCP server when…
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The agent needs &lt;strong&gt;live data or a real side effect&lt;/strong&gt; — a query, a write, a deploy.&lt;/li&gt;
&lt;li&gt;Access requires credentials the agent must not see in plaintext.&lt;/li&gt;
&lt;li&gt;Multiple clients or teams need the same integration.&lt;/li&gt;
&lt;li&gt;You need an audit trail of every call.&lt;/li&gt;
&lt;li&gt;You are exposing your product to customers' agents.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use plain function calling when…
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;One app, one model provider, three or four tools you fully own.&lt;/li&gt;
&lt;li&gt;Nothing external will ever consume those tools.&lt;/li&gt;
&lt;li&gt;You want the smallest possible dependency footprint.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reach for A2A when…
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Independent agents, owned by &lt;strong&gt;different teams or vendors&lt;/strong&gt;, must hand work to each other.&lt;/li&gt;
&lt;li&gt;The remote side should stay a black box, exposing outcomes rather than tools.&lt;/li&gt;
&lt;li&gt;Tasks are long-running and need their own status lifecycle.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Skills over MCP: The Two Standards Are Converging
&lt;/h2&gt;

&lt;p&gt;Here is what most comparison posts miss. &lt;strong&gt;MCP is absorbing skills as a first-class concept.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;Skills over MCP&lt;/em&gt; effort started as an interest group in February 2026 and became a full working group on 16 April 2026.&lt;/p&gt;

&lt;p&gt;It is co-led by maintainers from Nordstrom and Anthropic, with participants from Google, GitHub, AWS, Databricks, Bloomberg and Saxo Bank.&lt;/p&gt;

&lt;p&gt;The current direction is &lt;strong&gt;&lt;a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2640" rel="noopener noreferrer"&gt;SEP-2640&lt;/a&gt;, a Skills Extension built on MCP's existing Resources primitive&lt;/strong&gt;, on the Extensions Track rather than the core spec.&lt;/p&gt;

&lt;p&gt;The practical result: an MCP server will be able to ship &lt;strong&gt;both the tools and the instructions for using them&lt;/strong&gt;, discovered through one connection.&lt;/p&gt;

&lt;p&gt;That is a real shift. Today you install a Postgres MCP server and separately write a Skill explaining your schema conventions.&lt;/p&gt;

&lt;p&gt;Under the extension, the server hands over both. &lt;strong&gt;Progressive disclosure, currently a Skills-only property, comes to MCP.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is still in review, so do not build on it yet. But it settles the strategic question — &lt;strong&gt;Skills and MCP were never going to be rivals&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;MCP already has precedent for this pattern. Tasks and MCP Apps landed the same way, as opt-in extensions negotiated at initialization.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Real Stack, All Four
&lt;/h2&gt;

&lt;p&gt;Take a support-triage agent I would actually build. Every layer earns its place.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; connects it to Linear, Sentry and Postgres. That is how it reads the ticket, the stack trace and the affected rows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An Agent Skill&lt;/strong&gt; holds your triage policy — severity ladder, escalation thresholds, the exact template your team expects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Function calling&lt;/strong&gt; happens invisibly underneath, when the model emits the structured call your MCP client executes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A2A&lt;/strong&gt; delegates anything billing-related to the finance team's agent, which owns credentials you should never hold.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Remove the Skill and the agent files sloppy, inconsistent tickets. &lt;strong&gt;Remove MCP and it cannot see the incident at all.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That asymmetry is the answer to the whole debate. They fail differently because they do different jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five Expensive Mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Wrapping documentation in an MCP server.&lt;/strong&gt; If the tool just returns static text, it should have been a Skill. You are paying schema tokens for a Markdown file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Expecting a Skill to fetch live data.&lt;/strong&gt; A Skill has no network of its own. It can only tell the agent to use tools the agent already has.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Writing vague descriptions.&lt;/strong&gt; The &lt;code&gt;description&lt;/code&gt; field is the entire retrieval signal. "Helps with PDFs" will never fire; naming the trigger conditions will.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Connecting every MCP server you find.&lt;/strong&gt; Tool schemas compound. Eight servers of marginal value can crowd out the two that matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Shipping either one untested.&lt;/strong&gt; Teams test the model and skip the tool layer. Then a renamed parameter breaks production silently.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Test the MCP Layer
&lt;/h2&gt;

&lt;p&gt;Skills are easy to review — they are Markdown, you read them. &lt;strong&gt;The MCP layer is where things break quietly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I use MCP Playground for this. Paste a server URL, see every tool and schema the model would receive, then let a real model try to call them.&lt;/p&gt;

&lt;p&gt;That last part matters. A server that passes &lt;code&gt;tools/list&lt;/code&gt; can still confuse a model into never calling the right tool. Only a live model run reveals that.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Skills are Markdown. Your MCP server is production software.&lt;/strong&gt; Test it against Claude, GPT and Gemini in the browser — no install, no config file, no local setup.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free →&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-agent-studio" rel="noopener noreferrer"&gt;Chat with your server in Agent Studio →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Decision, In One Paragraph
&lt;/h2&gt;

&lt;p&gt;Ask whether the gap is knowledge or access. &lt;strong&gt;Knowledge gaps are Skills. Access gaps are MCP servers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Keep function calling for single-app tools you own outright, and reach for A2A only when a separate team's agent owns the work.&lt;/p&gt;

&lt;p&gt;Then test the layer that can actually fail at runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do Agent Skills replace MCP?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Skills package procedural knowledge as a &lt;code&gt;SKILL.md&lt;/code&gt; folder with no runtime; MCP is a live client-server protocol that gives an agent access to external systems. A skill cannot query a database or call an API on its own. Most production agents use both, and the Skills over MCP working group is standardising a Skills Extension so one server can deliver tools and instructions together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which is cheaper on context, a Skill or an MCP server?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A skill, by a wide margin, when idle. Skills use progressive disclosure: only the name and description load at startup, roughly 100 tokens each, and the full body loads only when the task matches. Most MCP clients load every connected server's complete tool schemas into the system prompt at session start, whether or not those tools are ever used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are Agent Skills Claude-only?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Anthropic released the format as an open standard on 18 December 2025 at agentskills.io. The same &lt;code&gt;SKILL.md&lt;/code&gt; folder is read by Claude and Claude Code, ChatGPT and Codex, Cursor, GitHub Copilot, VS Code, Gemini CLI, JetBrains Junie, AWS Kiro, Block Goose and roughly forty other clients listed on the official showcase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is MCP just function calling with extra steps?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, though MCP sits on top of function calling. Function calling is a model capability: you pass JSON schemas per request and write all the execution, auth and error handling yourself, per provider. MCP standardises discovery, transport, auth and execution so one server works with any MCP client. An MCP client still converts tools into function-calling schemas before sending them to the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are the required fields in a SKILL.md file?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two: &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;description&lt;/code&gt;. The name is max 64 characters, lowercase letters, numbers and single hyphens, and must match the parent directory name. The description is max 1024 characters and should state both what the skill does and when to use it. Optional fields are &lt;code&gt;license&lt;/code&gt;, &lt;code&gt;compatibility&lt;/code&gt;, &lt;code&gt;metadata&lt;/code&gt; and the experimental &lt;code&gt;allowed-tools&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are the "skills" in an A2A Agent Card the same as Agent Skills?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, and the naming collision causes real confusion. A2A skills are capability advertisements inside an Agent Card, telling other agents what a remote agent can do. Agent Skills are &lt;code&gt;SKILL.md&lt;/code&gt; folders of instructions loaded into a single agent's context. Different specs, different purposes, same English word.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I test a Skill and an MCP server the same way?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not really. A skill is Markdown, so review is reading it and running the agent against sample tasks. An MCP server is running software with a wire protocol, so it needs connection, handshake, tool schema and error testing against a real model. A browser tester such as MCP Playground covers the second case without any local setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Guides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What Is the Model Context Protocol (MCP)? A Developer's Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/mcp-vs-function-calling-vs-api-comparison" rel="noopener noreferrer"&gt;MCP vs Function Calling vs REST APIs: When to Use Each&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/mcp-vs-a2a-agent2agent-protocol" rel="noopener noreferrer"&gt;MCP vs A2A: Model Context Protocol vs Agent2Agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/ai-agent-mcp-explained" rel="noopener noreferrer"&gt;AI Agent + MCP Explained: What Every Developer Needs to Know&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/what-is-mcp-agent-tool-calling" rel="noopener noreferrer"&gt;What Is an MCP Agent? Tool Calling Explained&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/migrate-mcp-server-2026-07-28-stateless" rel="noopener noreferrer"&gt;Migrating to the 2026-07-28 Stateless MCP Spec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/what-is-an-mcp-eval" rel="noopener noreferrer"&gt;What Is an MCP Eval, and Why You Need One&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://agentskills.io/specification" rel="noopener noreferrer"&gt;Official: Agent Skills Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/agentskills/agentskills" rel="noopener noreferrer"&gt;Agent Skills spec and reference library on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/skills" rel="noopener noreferrer"&gt;Claude Code: Extend Claude with skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/skills/" rel="noopener noreferrer"&gt;OpenAI Codex: Skills documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/specification/latest" rel="noopener noreferrer"&gt;Official: MCP Specification (2026-07-28)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/community/working-groups/skills-over-mcp" rel="noopener noreferrer"&gt;MCP: Skills over MCP Working Group charter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2640" rel="noopener noreferrer"&gt;SEP-2640: Skills Extension proposal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://a2a-protocol.org/" rel="noopener noreferrer"&gt;Official: A2A Protocol Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mcpplaygroundonline.com/blog/agent-skills-vs-mcp" rel="noopener noreferrer"&gt;MCP Playground&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>agents</category>
      <category>llm</category>
    </item>
    <item>
      <title>What Is an MCP Eval? Why Your Server Passes Every Test and Still Fails</title>
      <dc:creator>Rupa Tiwari</dc:creator>
      <pubDate>Mon, 17 Aug 2026 12:10:05 +0000</pubDate>
      <link>https://dev.to/rupa_tiwari_dd308948d710f/what-is-an-mcp-eval-why-your-server-passes-every-test-and-still-fails-41gf</link>
      <guid>https://dev.to/rupa_tiwari_dd308948d710f/what-is-an-mcp-eval-why-your-server-passes-every-test-and-still-fails-41gf</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📖 TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;An MCP eval is a realistic task a model must complete using only your server's tools&lt;/strong&gt; not an assertion about one call.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A test asks "did the call work?". An eval asks "could an agent get the right answer?"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The signature failure is an answer that is wrong even though every call returned 200.&lt;/strong&gt; No inspector catches it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;There are four useful outcomes&lt;/strong&gt;: pass, wrong answer, too many calls, and untestable. The last one is not a failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evals are not deterministic&lt;/strong&gt;, and pretending otherwise is how you get a number you cannot trust.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Call count degrades before pass rate does&lt;/strong&gt;, which makes it the earlier warning signal.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;You built an MCP server. The handshake works, every tool returns valid JSON, your integration tests are green. Then someone connects it to Claude and it is useless.&lt;/p&gt;

&lt;p&gt;That gap has a name now. &lt;strong&gt;An MCP eval is what closes it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The distinction is simple once you see it. Your test suite proves the protocol works. It says nothing about whether a model can use what you built.&lt;/p&gt;

&lt;p&gt;Those are genuinely different questions, and only one of them is the reason your server exists.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;MCP specification&lt;/a&gt; has nothing to say about the second one, and it should not — conformance is not usability. The &lt;a href="https://blog.modelcontextprotocol.io/posts/2026-07-28/" rel="noopener noreferrer"&gt;2026-07-28 release&lt;/a&gt; tightened the protocol considerably and did not change this at all.&lt;/p&gt;

&lt;p&gt;I have spent the last few months building an eval engine for arbitrary MCP servers. This post covers what an eval is, the four outcomes worth distinguishing, why the results are non-deterministic, and when you should bother.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an MCP Eval Actually Is
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;An MCP eval is a task, phrased the way a user would ask it, that a model has to complete using only your server's tools.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not an assertion. Not a mocked conversation. A question, and a score for whether the model got there.&lt;/p&gt;

&lt;p&gt;A test looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;assert&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="s2"&gt;list_issues&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;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;open&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An eval looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task:        "Which open issue in the billing project has been
              waiting longest, and who is it assigned to?"
Budget:      4 tool calls
Expectation: names a specific issue and an assignee
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing in the eval names a tool. &lt;strong&gt;Choosing the tool is the thing being tested.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The model gets your tool list, your descriptions and your schemas, and has to work out the rest. That is exactly what happens in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP Eval vs Testing vs Inspecting
&lt;/h2&gt;

&lt;p&gt;These three get used interchangeably and they measure different things.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Answers&lt;/th&gt;
&lt;th&gt;Misses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inspecting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Does the handshake succeed? Do tools list?&lt;/td&gt;
&lt;td&gt;Everything about usability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Does this call, with these args, return what I expect?&lt;/td&gt;
&lt;td&gt;Whether a model would ever make that call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Evaluating&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Can an agent reach the right answer from my descriptions?&lt;/td&gt;
&lt;td&gt;Determinism, exhaustive coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key structural point: &lt;strong&gt;when you write a test, you have already made the choice the model has to make.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You picked the tool. You picked the arguments. You skipped the only step that can fail in the way that matters.&lt;/p&gt;

&lt;p&gt;All three are worth having. &lt;a href="https://mcpplaygroundonline.com/blog/how-to-test-mcp-servers-step-by-step" rel="noopener noreferrer"&gt;Testing catches protocol and correctness bugs&lt;/a&gt;, and it is faster and cheaper than an eval. Evals catch a class of defect testing structurally cannot reach.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Failure That Has No Red Log Line
&lt;/h2&gt;

&lt;p&gt;Here is the scenario that made me build this.&lt;/p&gt;

&lt;p&gt;A docs server exposes &lt;code&gt;search&lt;/code&gt; and &lt;code&gt;get_page&lt;/code&gt;. A user asks which regions a product supports.&lt;/p&gt;

&lt;p&gt;The agent calls &lt;code&gt;search("regions")&lt;/code&gt;. It gets back five ranked results. It calls &lt;code&gt;get_page&lt;/code&gt; on the first one. That page mentions two regions in an example snippet.&lt;/p&gt;

&lt;p&gt;The agent answers: "It supports us-east and eu-west."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every call succeeded.&lt;/strong&gt; Valid JSON, no errors, no timeouts. Your logs are clean and your dashboard is green.&lt;/p&gt;

&lt;p&gt;The real answer was eleven regions, listed on a page the search ranked fourth.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This is the defect evals exist to find&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A wrong answer produced entirely from successful calls. There is no error to catch, no exception to log, no status code to alert on. &lt;strong&gt;The only way to detect it is to check the answer.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nothing in your stack is lying. The protocol worked perfectly. The server was just hard to use, and the model did what it could.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Four Outcomes and What Each One Means
&lt;/h2&gt;

&lt;p&gt;A binary pass/fail throws away most of the signal. Four outcomes are worth distinguishing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pass
&lt;/h3&gt;

&lt;p&gt;The agent answered, stayed within its call budget, and the answer was correct. &lt;strong&gt;This is the only outcome that requires judging content&lt;/strong&gt;, which means it is the only one a model decides.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrong Answer
&lt;/h3&gt;

&lt;p&gt;The agent produced an answer and it was not right. Either it could not find the information, or your tools gave it something misleading.&lt;/p&gt;

&lt;p&gt;This is the outcome from the scenario above, and it is the most valuable one an eval produces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Too Many Calls
&lt;/h3&gt;

&lt;p&gt;The agent got there, but it took eight calls when the budget was four. &lt;strong&gt;This is the tool-description signal&lt;/strong&gt;, and it is the one to watch over time.&lt;/p&gt;

&lt;p&gt;The agent was guessing. It tried a tool, got something unhelpful, tried another. Every one of those calls cost you latency, tokens and — if your API is metered — money.&lt;/p&gt;

&lt;p&gt;Call count degrades before pass rate does. A task that passed in two calls last month and passes in six today is a regression, even though the number in the pass column did not move.&lt;/p&gt;

&lt;p&gt;I covered the root cause of this in &lt;a href="https://mcpplaygroundonline.com/blog/mcp-tool-description-quality" rel="noopener noreferrer"&gt;why 97% of MCP tool descriptions are broken&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Untestable
&lt;/h3&gt;

&lt;p&gt;Something outside your server broke. The connection dropped, the driver model rate-limited, the harness fell over.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is not a failure and it must never be counted as one.&lt;/strong&gt; It gets its own bucket for a reason I will come to.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;See a finished eval run&lt;/strong&gt; — tools detected, tasks written against them, a model made to complete each one, and a report showing where it went wrong. No sign-up: &lt;a href="https://mcpplaygroundonline.com/mcp-evals" rel="noopener noreferrer"&gt;Walk through MCP Evals →&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why "Untestable" Deserves Its Own Outcome
&lt;/h2&gt;

&lt;p&gt;This is the design decision I would defend hardest, and it took me a while to get right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A failure only means something if you know the input was valid.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Say an eval calls &lt;code&gt;get_issue("PROJ-4821")&lt;/code&gt; and gets a 404. Is that a defect in your server?&lt;/p&gt;

&lt;p&gt;It depends entirely on where that ID came from.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If &lt;code&gt;list_issues&lt;/code&gt; returned it a second earlier&lt;/strong&gt;, the ID demonstrably exists and your server cannot fetch it. That is a confirmed defect, with both calls as evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If a model invented it&lt;/strong&gt;, a 404 proves nothing. The issue probably just does not exist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same error code, opposite meaning. &lt;strong&gt;The only thing that separates them is provenance.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is why a serious eval engine harvests real values from your server before planning anything that needs them. Failures on harvested values are defects. Failures on invented values are untestable.&lt;/p&gt;

&lt;p&gt;Collapsing those two into "fail" gives you a report full of noise that developers correctly learn to ignore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evals Are Not Deterministic — and That Is Fine
&lt;/h2&gt;

&lt;p&gt;Models write the tasks. A model drives the tools. A model grades the answer. &lt;strong&gt;Run the same suite twice and you can get different numbers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;People find this disqualifying. I think that reaction comes from expecting an eval to be a test, which it is not.&lt;/p&gt;

&lt;p&gt;The research benchmarks live with the same constraint. &lt;a href="https://arxiv.org/abs/2602.00933" rel="noopener noreferrer"&gt;MCP-Atlas&lt;/a&gt; grades 1,000 tasks across 36 real servers using a rubric-driven judge, and &lt;a href="https://openreview.net/forum?id=fe8mzHwMxN" rel="noopener noreferrer"&gt;MCP-Bench&lt;/a&gt; pairs rule-based checks with LLM scoring for exactly this reason. &lt;strong&gt;Nobody has found a way to make this deterministic&lt;/strong&gt;, because the thing being measured is not.&lt;/p&gt;

&lt;p&gt;An eval is &lt;em&gt;evidence about how an agent behaves against your server&lt;/em&gt;. It is not a pass/fail certificate, and any tool that presents it as one is overselling.&lt;/p&gt;

&lt;p&gt;Two rules make non-determinism workable:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reproduce before you act.&lt;/strong&gt; A single failure is a lead, not a finding. Run it again. A defect that reproduces is real; one that does not is variance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the transcript, not the score.&lt;/strong&gt; The number tells you where to look. The transcript — which tools were called, with what arguments, what came back — tells you whether the verdict was fair.&lt;/p&gt;

&lt;p&gt;There is a third rule I only arrived at by getting it wrong: &lt;strong&gt;the grader must fail open.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the judge model errors out or returns nothing for an item, that item stays passing. A missing verdict is not evidence of a defect. Failing closed would let an unrelated API hiccup invent bugs in your server.&lt;/p&gt;

&lt;h2&gt;
  
  
  When You Need Evals, and When You Do Not
&lt;/h2&gt;

&lt;p&gt;Evals cost model calls. They are slower and pricier than tests. Some servers do not need them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Worth it when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More than about 8 tools&lt;/li&gt;
&lt;li&gt;Two or more tools that do similar things&lt;/li&gt;
&lt;li&gt;You are about to rewrite descriptions&lt;/li&gt;
&lt;li&gt;You ship to users you cannot observe&lt;/li&gt;
&lt;li&gt;You support multiple client models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Probably not yet when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two or three unambiguous tools&lt;/li&gt;
&lt;li&gt;Internal server, one known caller&lt;/li&gt;
&lt;li&gt;Still fixing protocol-level bugs&lt;/li&gt;
&lt;li&gt;No tool annotations declared yet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one matters more than it looks. &lt;strong&gt;Fix your annotations before you run evals&lt;/strong&gt;, or safe tooling will skip most of your tools. The &lt;a href="https://github.com/modelcontextprotocol/modelcontextprotocol" rel="noopener noreferrer"&gt;spec repository&lt;/a&gt; documents all three hints, and they take minutes to add.&lt;/p&gt;

&lt;p&gt;An eval calls tools with arguments designed to succeed. An unannotated &lt;code&gt;delete_record&lt;/code&gt; would really delete a record, so anything responsible has to treat unannotated tools as destructive.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Run Your First One
&lt;/h2&gt;

&lt;p&gt;Start smaller than you think.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick your three most-used tools.&lt;/strong&gt; Write three tasks a real user would ask, in their words, with no tool names in them.&lt;/p&gt;

&lt;p&gt;Connect a model to your server and give it each task. &lt;a href="https://mcpplaygroundonline.com/blog/testing-mcp-servers-with-real-ai-models" rel="noopener noreferrer"&gt;Any of the models available in the browser&lt;/a&gt; will do for a first pass — you do not need a harness to learn something.&lt;/p&gt;

&lt;p&gt;Watch three things: did it answer, was the answer right, and how many calls did it take.&lt;/p&gt;

&lt;p&gt;You will almost always find one of two things. A tool the model never reaches for, or a pair it keeps confusing. Both are description problems, and both are fixable in an afternoon.&lt;/p&gt;

&lt;p&gt;Once that loop is useful, make it repeatable so a description change gets checked instead of hoped about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is an MCP eval?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An MCP eval is a task a model has to complete using only your MCP server's tools. Rather than checking that a tool returns HTTP 200, it checks whether an agent can work out which tool to call from your names and descriptions, and whether the answer it produces is correct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is this different from testing with an MCP client?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A client tells you the protocol works — the handshake succeeds, the schema validates, the call returns. An eval tells you the server is usable: that a model given your tools can reach the right answer without burning calls guessing. The most common failure it finds is an answer that is wrong even though every call succeeded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are MCP eval results deterministic?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Models write, drive and grade the evals, so the same suite can come out differently on a second run. Results are evidence about how an agent behaves against your server, not a fixed pass/fail certificate. Reproduce a failure before acting on it, and read the transcript rather than the score.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do MCP evals replace my test suite?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Tests are faster, cheaper and deterministic, and they catch protocol and correctness bugs an eval would waste money rediscovering. Evals catch a different class of defect that tests structurally cannot reach. Run both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does an untestable eval outcome mean?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It means something outside your server broke — the connection dropped, the driver model rate-limited, or the harness failed. It is not a failure and must not be counted as one. Separating untestable from failed is what keeps an eval report free of noise developers learn to ignore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which eval outcome should I watch most closely over time?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Call count. A task that passed in two calls last month and passes in six today is a regression even though the pass column did not move. Call count degrades before pass rate does, which makes it the earliest signal that tool descriptions have drifted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do missing tool annotations matter for MCP evals?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A functional eval calls tools with arguments designed to succeed, so an unannotated destructive tool would really run. Safe tooling has to treat an unannotated tool as destructive and skip it. Declaring &lt;code&gt;readOnlyHint&lt;/code&gt;, &lt;code&gt;idempotentHint&lt;/code&gt; and &lt;code&gt;destructiveHint&lt;/code&gt; buys back that test coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Short Version
&lt;/h2&gt;

&lt;p&gt;A test proves your server responds. &lt;strong&gt;An eval proves it can be used.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The gap between those is where the expensive failures live — wrong answers assembled from successful calls, and agents burning four extra calls because two of your tools read alike.&lt;/p&gt;

&lt;p&gt;Start with three tasks and three tools. Watch the call count as closely as the pass rate. Reproduce before you act.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try it on a real server.&lt;/strong&gt; Connect any MCP server in the browser and give a real model a task. No install, no config file.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free →&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-evals" rel="noopener noreferrer"&gt;See MCP Evals →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Related Guides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What Is the Model Context Protocol (MCP)? A Developer's Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/what-is-mcp-agent-tool-calling" rel="noopener noreferrer"&gt;What Is an MCP Agent? Tool Calling Explained&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/how-to-test-mcp-servers-step-by-step" rel="noopener noreferrer"&gt;How to Test MCP Servers Step by Step&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/best-ai-model-for-mcp-tool-calling" rel="noopener noreferrer"&gt;Which Model Is Best at MCP Tool Calling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/how-to-test-ai-agent-with-mcp" rel="noopener noreferrer"&gt;Testing an AI Agent Without Burning Tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/mcp-tool-description-quality" rel="noopener noreferrer"&gt;Why 97% of MCP Tool Descriptions Are Broken&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/specification" rel="noopener noreferrer"&gt;Official: MCP Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.modelcontextprotocol.io/posts/2026-07-28/" rel="noopener noreferrer"&gt;Official: MCP 2026-07-28 Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/modelcontextprotocol/modelcontextprotocol" rel="noopener noreferrer"&gt;MCP Specification Repository (tool annotations)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2602.00933" rel="noopener noreferrer"&gt;MCP-Atlas: Grading Tool Use Across Real Servers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openreview.net/forum?id=fe8mzHwMxN" rel="noopener noreferrer"&gt;MCP-Bench on OpenReview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mcpplaygroundonline.com/blog/what-is-an-mcp-eval" rel="noopener noreferrer"&gt;MCP Playground&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>testing</category>
      <category>llm</category>
    </item>
    <item>
      <title>Meta's Muse Models and MCP: What the Benchmarks Actually Say</title>
      <dc:creator>Rupa Tiwari</dc:creator>
      <pubDate>Tue, 11 Aug 2026 15:22:54 +0000</pubDate>
      <link>https://dev.to/rupa_tiwari_dd308948d710f/metas-muse-models-and-mcp-what-the-benchmarks-actually-say-17fg</link>
      <guid>https://dev.to/rupa_tiwari_dd308948d710f/metas-muse-models-and-mcp-what-the-benchmarks-actually-say-17fg</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📖 TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Muse Spark 1.1 ranks #1 on Scale AI's MCP-Atlas leaderboard at 88.1%&lt;/strong&gt; — ahead of Claude Opus 5 (85.8%) and Claude Fable 5 (83.3%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Muse Glimmer 30B is Apache 2.0 and runs locally&lt;/strong&gt; — under 20GB at 4-bit, so it fits a 24GB machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Glimmer is distilled from Spark&lt;/strong&gt; via logit distillation. Teacher and student, not two sizes of one model.&lt;/li&gt;
&lt;li&gt;Meta reports &lt;strong&gt;75.5 on MCP-Atlas for Glimmer&lt;/strong&gt; vs 62.5 (Qwen3.6-27B) and 54.2 (Gemma4-31B) — a vendor figure, not a leaderboard entry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Glimmer loses badly at terminal and desktop control.&lt;/strong&gt; Qwen wins TerminalBench 2.1 60.7 to 51.7 and OSWorld-Verified 75.6 to 65.9.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neither model's tool-calling wire format is documented.&lt;/strong&gt; Through OpenRouter both are OpenAI-shaped function callers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Meta shipped two models a week apart in August 2026, and the relationship between them is the story. Muse Spark 1.2 is closed, API-only, with a million-token context. Muse Glimmer 30B is Apache 2.0, open-weights, and distilled from Spark — it runs on a single consumer GPU.&lt;/p&gt;

&lt;p&gt;If you build on MCP, the student is the more interesting release. Here is why, and where the marketing stops matching the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP-Atlas is a real benchmark, and Muse tops it
&lt;/h2&gt;

&lt;p&gt;Most launches give you MMLU and a coding score. Neither predicts whether a model will drive your MCP server without mangling arguments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP-Atlas&lt;/strong&gt; is different. It is Scale AI's benchmark, built specifically for Model Context Protocol tool use: &lt;strong&gt;1,000 tasks across 36 real MCP servers and 220 tools&lt;/strong&gt;, three to six tool calls per task. The model has to discover the right tool from a limited set, call it with correct parameters, handle errors, coordinate across servers, and synthesise an answer.&lt;/p&gt;

&lt;p&gt;On Scale's public leaderboard:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Pass rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Muse Spark 1.1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;88.1%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;claude-opus-5 (xhigh)&lt;/td&gt;
&lt;td&gt;85.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;gemini-3.5-flash (high)&lt;/td&gt;
&lt;td&gt;83.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Claude Fable 5&lt;/td&gt;
&lt;td&gt;83.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;kimi-k3 (max)&lt;/td&gt;
&lt;td&gt;82.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;claude-opus-4-8 (max)&lt;/td&gt;
&lt;td&gt;82.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two caveats, both load-bearing. The leaderboard was last updated &lt;strong&gt;April 2026&lt;/strong&gt;, so the ranked entry is &lt;strong&gt;Spark 1.1, not 1.2&lt;/strong&gt;. And Glimmer, which launched in August, is not on it at all. This is evidence the Muse line is strong at MCP work — not a verified score for the build you are calling today.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Meta reports for Glimmer
&lt;/h2&gt;

&lt;p&gt;Glimmer's numbers are from Meta's own launch table, so read them as a vendor comparison. Conditions matter: &lt;strong&gt;Glimmer at High Reasoning, the rivals in Thinking Mode.&lt;/strong&gt; All best-effort configurations, not defaults.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Muse Glimmer-30B&lt;/th&gt;
&lt;th&gt;Qwen3.6-27B&lt;/th&gt;
&lt;th&gt;Gemma4-31B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP Atlas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;75.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;62.5&lt;/td&gt;
&lt;td&gt;54.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DeepSearch QA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;74.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;71.1&lt;/td&gt;
&lt;td&gt;61.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;τ²-Banking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;23.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16.7&lt;/td&gt;
&lt;td&gt;15.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GAIA2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;43.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;40.0&lt;/td&gt;
&lt;td&gt;36.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SWE-Bench Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;51.2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50.2&lt;/td&gt;
&lt;td&gt;36.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SWE-Bench Verified&lt;/td&gt;
&lt;td&gt;76.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;77.2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;66.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TerminalBench 2.1&lt;/td&gt;
&lt;td&gt;51.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;60.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;43.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OSWorld-Verified&lt;/td&gt;
&lt;td&gt;65.9&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;75.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;58.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern is sharper than "Glimmer wins."&lt;/p&gt;

&lt;p&gt;Glimmer's advantage is &lt;strong&gt;protocol-shaped agentic work&lt;/strong&gt; — discovering tools, invoking schemas correctly across a long workflow, recovering from failures. On MCP-Atlas the gap over Qwen is 13 points; on τ²-Banking it is a rout.&lt;/p&gt;

&lt;p&gt;But Qwen3.6-27B takes SWE-Bench Verified, TerminalBench 2.1 and OSWorld-Verified, and those last two are not close. The honest reading: &lt;strong&gt;Glimmer is tuned for calling tools through a protocol, not for driving a terminal or a desktop.&lt;/strong&gt; Strong MCP results do not transfer to computer use.&lt;/p&gt;

&lt;h2&gt;
  
  
  The number nobody puts in a headline
&lt;/h2&gt;

&lt;p&gt;Meta also publishes safety results. On &lt;strong&gt;Siren AgentDojo&lt;/strong&gt;, a prompt-injection benchmark, Glimmer records a &lt;strong&gt;28.4% attack success rate&lt;/strong&gt; at 94.2 utility. Gemma4-31B is better at 25.6%; Qwen3.6-27B is worse at 40.3%.&lt;/p&gt;

&lt;p&gt;Lower is better, and none of these are comfortable. &lt;strong&gt;Roughly one in four injection attempts lands against the best of the three.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your MCP server returns content that originated outside your control — search results, file contents, third-party API responses — that content reaches the model, and these are the empirical odds it can steer it. Model choice moves the margin. It does not remove the problem. The controls that matter stay on your side of the boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Glimmer's architecture
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;dense causal transformer&lt;/strong&gt; — not MoE — at ~29.6B parameters including a 1.8B ViT-G/14 perception encoder. 52 layers, hidden dim 6,656, SwiGLU at 19,968 intermediate width.&lt;/p&gt;

&lt;p&gt;Two choices stand out if you plan to run it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GQA at 16:1&lt;/strong&gt; — 32 query heads against 2 KV heads. Aggressive, and it is what keeps the KV cache small enough for long agentic sessions on consumer memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A repeating [Local, Local, Local, Global] attention pattern&lt;/strong&gt; with a 2,048-token sliding window. Three cheap local layers per global one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Context is &lt;strong&gt;131,072 tokens by default, extendable to 262,144&lt;/strong&gt;. Sampling defaults are temperature 1.0, top_p 0.95, top_k 64 — carrying over a temperature 0.2 habit from another vendor is a real source of "it did worse for me."&lt;/p&gt;

&lt;p&gt;Full precision needs 55GB+. Quantized to ~4-bit it drops under 20GB, leaving headroom for KV cache and the perception encoder in a 24–32GB envelope. Meta reports "minimal to no degradation on agentic tasks" from that compression.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DFlash speculative decoding&lt;/strong&gt; ships with it: a lightweight drafter proposes token blocks, the main model verifies in parallel. Output quality is identical by construction; measured speedup is 3.1x on an RTX 5090, 1.8x on an M5 Max, 1.5x on an M4 Max.&lt;/p&gt;

&lt;p&gt;Runtimes at launch: Ollama, LM Studio, llama.cpp, MLX, ExecuTorch, vLLM, SGLang.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one claim worth testing yourself
&lt;/h2&gt;

&lt;p&gt;Meta describes three training phases — logit distillation from Spark in pre-training, extended-context agent data with reasoning traces in mid-training, then SFT blended with on-policy distillation and RL.&lt;/p&gt;

&lt;p&gt;Buried in that is the most falsifiable claim in the launch materials:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"When a tool call fails or returns an unexpected result, the model is trained to diagnose the error and retry rather than halt."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the behaviour separating a model you can leave running from one that needs a human every time an endpoint hiccups. And it takes one run to check: point the model at a server that deliberately returns errors, and watch whether it reads the error and adjusts its arguments, or apologises and stops.&lt;/p&gt;

&lt;h2&gt;
  
  
  Muse Spark 1.2, briefly
&lt;/h2&gt;

&lt;p&gt;Closed weights, API-only. &lt;strong&gt;1,048,576-token context&lt;/strong&gt;, ~131,072 output. Accepts text, images, video, audio and PDF.&lt;/p&gt;

&lt;p&gt;For agent builders: &lt;strong&gt;structured output, parallel function calling, configurable reasoning effort&lt;/strong&gt;, and explicit multi-agent support in either role — primary planner or parallel subagent. It leans on planning, goal conditioning and context compaction to hold direction through long tasks.&lt;/p&gt;

&lt;p&gt;Pricing is &lt;strong&gt;$1.25 / $4.25 per million&lt;/strong&gt; tokens. Note the cost shape: with most models, cost tracks how much work the model does. With a 1M-context model, cost tracks &lt;strong&gt;how much context you chose to send&lt;/strong&gt; — a 200k-token prompt is $0.25 before it writes a word. Compaction is a feature for a reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  What nobody has published
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Meta has not documented the tool-calling wire format for either model.&lt;/strong&gt; The model card and developer pages assert reliable tool use and precise schema invocation, but no serialization is specified. The reference runtimes simply expose an OpenAI-compatible surface.&lt;/p&gt;

&lt;p&gt;So: routed through a provider, both models behave as &lt;strong&gt;OpenAI-shaped function callers&lt;/strong&gt;, the same path every non-Anthropic model takes. Any claim you read about how Muse specifically handles deeply nested arguments is currently &lt;strong&gt;untested rather than documented&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Which makes your own server the only authority that counts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which one
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Glimmer&lt;/strong&gt; when you want a model you can self-host, when tool calls must stay on your hardware, or when you are checking whether an open 30B is good enough to replace a frontier model on your tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spark 1.2&lt;/strong&gt; when the task genuinely needs the context or parallel function calling — whole-repository work, long debugging sessions, multi-agent orchestration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The distillation relationship is the mental model: Glimmer inherits Spark's agentic behaviour in a package you can run at home; Spark keeps the scale, context and modalities that will not fit on a laptop.&lt;/p&gt;




&lt;p&gt;You can run both Muse models against your own MCP server in the browser — no install, no Meta account: &lt;strong&gt;&lt;a href="https://mcpplaygroundonline.com/test-mcp-with/meta" rel="noopener noreferrer"&gt;Test your MCP server with Meta Muse&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Full writeup with the complete benchmark tables: &lt;strong&gt;&lt;a href="https://mcpplaygroundonline.com/blog/test-mcp-server-with-meta-muse-models" rel="noopener noreferrer"&gt;Muse Spark 1.2 and Muse Glimmer 30B for MCP&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt; &lt;a href="https://research.meta.ai/blog/introducing-muse-glimmer-open-agentic-model" rel="noopener noreferrer"&gt;Meta AI Research — Introducing Muse Glimmer&lt;/a&gt; · &lt;a href="https://labs.scale.com/leaderboard/mcp_atlas" rel="noopener noreferrer"&gt;Scale AI MCP-Atlas leaderboard&lt;/a&gt; · &lt;a href="https://huggingface.co/meta-models/Muse-Glimmer-30B" rel="noopener noreferrer"&gt;Muse Glimmer on Hugging Face&lt;/a&gt; · &lt;a href="https://openrouter.ai/meta/muse-spark-1.2" rel="noopener noreferrer"&gt;Muse Spark 1.2 on OpenRouter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>llm</category>
      <category>opensource</category>
    </item>
    <item>
      <title>MCP Went Stateless: Migrating to the 2026-07-28 Spec (and Proving It Works)</title>
      <dc:creator>Rupa Tiwari</dc:creator>
      <pubDate>Thu, 30 Jul 2026 18:06:09 +0000</pubDate>
      <link>https://dev.to/rupa_tiwari_dd308948d710f/mcp-went-stateless-migrating-to-the-2026-07-28-spec-and-proving-it-works-174</link>
      <guid>https://dev.to/rupa_tiwari_dd308948d710f/mcp-went-stateless-migrating-to-the-2026-07-28-spec-and-proving-it-works-174</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📖 TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;2026-07-28&lt;/strong&gt; spec shipped &lt;strong&gt;final on July 28, 2026&lt;/strong&gt; (RC locked May 21). It is the biggest revision since MCP launched.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sessions are gone.&lt;/strong&gt; No &lt;code&gt;initialize&lt;/code&gt;, no &lt;code&gt;Mcp-Session-Id&lt;/code&gt;. Every request is self-contained.&lt;/li&gt;
&lt;li&gt;TypeScript ships as &lt;strong&gt;two new packages&lt;/strong&gt; — &lt;code&gt;@modelcontextprotocol/client@2&lt;/code&gt; and &lt;code&gt;@modelcontextprotocol/server@2&lt;/code&gt;. The old &lt;code&gt;@modelcontextprotocol/sdk&lt;/code&gt; line lives on at &lt;code&gt;1.x&lt;/code&gt; for 2025-era servers.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;server/discover&lt;/code&gt; is a &lt;strong&gt;MUST&lt;/strong&gt;. &lt;code&gt;Mcp-Method&lt;/code&gt; / &lt;code&gt;Mcp-Name&lt;/code&gt; headers are required on Streamable HTTP POSTs.&lt;/li&gt;
&lt;li&gt;Roots, Sampling, Logging, and HTTP+SSE are &lt;strong&gt;deprecated&lt;/strong&gt; with a 12-month clock.&lt;/li&gt;
&lt;li&gt;The new #1 security bug: &lt;strong&gt;an unsigned &lt;code&gt;requestState&lt;/code&gt;&lt;/strong&gt; blob. It round-trips through the client, which makes it attacker-controlled input.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;I spent last week migrating a platform that talks to &lt;em&gt;other people's&lt;/em&gt; MCP servers in both revisions. This is the writeup I wanted before I started.&lt;/p&gt;

&lt;p&gt;Not a spec summary — a diff, a build order, and the two things that broke in ways the changelog does not warn you about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop thinking "version bump." Start thinking "era."
&lt;/h2&gt;

&lt;p&gt;This is the mental model shift that makes everything else click.&lt;/p&gt;

&lt;p&gt;Older MCP negotiated a version string during a handshake. The 2026 SDK does not model revisions as a flat list anymore. It models &lt;strong&gt;two eras&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;Era&lt;/th&gt;
&lt;th&gt;Revisions&lt;/th&gt;
&lt;th&gt;How the version travels&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;legacy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2024-10-07 … 2025-11-25&lt;/td&gt;
&lt;td&gt;Negotiated via &lt;code&gt;initialize&lt;/code&gt;, carries &lt;code&gt;Mcp-Session-Id&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;modern&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2026-07-28 and later&lt;/td&gt;
&lt;td&gt;Rides in &lt;code&gt;_meta&lt;/code&gt; on &lt;strong&gt;every&lt;/strong&gt; request; &lt;code&gt;server/discover&lt;/code&gt; advertises capabilities up front&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are not points on one line. They are &lt;strong&gt;two different wire protocols&lt;/strong&gt; that happen to share JSON-RPC.&lt;/p&gt;

&lt;p&gt;Once you internalize that, the migration stops looking like "add a feature" and starts looking like "support a second protocol."&lt;/p&gt;

&lt;h2&gt;
  
  
  The wire diff: what a request actually looks like now
&lt;/h2&gt;

&lt;p&gt;Forget SDK APIs for a second. Here is the part that matters, because it is what your gateway, your load balancer, and your security scanner all see.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before (2025-11-25, stateful)
&lt;/h3&gt;

&lt;p&gt;Two round trips minimum, and a session header you have to carry forever:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;POST&lt;/span&gt; &lt;span class="nn"&gt;/mcp&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"initialize"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protocolVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2025-11-25"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"clientInfo"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"my-client"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&lt;/span&gt;&lt;span class="p"&gt;:{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;OK&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="err"&gt;Mcp-Session-Id:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="err"&gt;f&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;c&lt;/span&gt;&lt;span class="mi"&gt;1e7&lt;/span&gt;&lt;span class="err"&gt;a-...&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;now&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;sticky-route&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;every&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;later&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;request&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;here&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;POST&lt;/span&gt; &lt;span class="nn"&gt;/mcp&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Mcp-Session-Id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;9f2c1e7a-...&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"tools/call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"get_user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"123"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After (2026-07-28, stateless)
&lt;/h3&gt;

&lt;p&gt;One round trip. No handshake. Everything the server needs is in the envelope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="nf"&gt;POST&lt;/span&gt; &lt;span class="nn"&gt;/mcp&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;
&lt;span class="na"&gt;Mcp-Method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tools/call&lt;/span&gt;
&lt;span class="na"&gt;Mcp-Name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;get_user&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"tools/call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"get_user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"123"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"_meta"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"io.modelcontextprotocol/protocolVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2026-07-28"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"io.modelcontextprotocol/clientInfo"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"my-client"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"io.modelcontextprotocol/clientCapabilities"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"elicitation"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"form"&lt;/span&gt;&lt;span class="p"&gt;:{}}}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Three things to notice.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Mcp-Method&lt;/code&gt; and &lt;code&gt;Mcp-Name&lt;/code&gt; are headers now (SEP-2243). A gateway can route on them without parsing the body — that is the whole point.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;_meta&lt;/code&gt; keys are &lt;strong&gt;fully qualified&lt;/strong&gt;: &lt;code&gt;io.modelcontextprotocol/protocolVersion&lt;/code&gt;, not &lt;code&gt;protocolVersion&lt;/code&gt;. Getting this wrong is a silent no-op, not an error.&lt;/p&gt;

&lt;p&gt;And the session ID is simply absent. Any instance in your cluster can serve this request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The payoff:&lt;/strong&gt; a remote server that needed sticky sessions and a shared session store can now sit behind a plain round-robin load balancer. That is the real reason this change happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install: two packages, not one upgrade
&lt;/h2&gt;

&lt;p&gt;This surprised me and it is good news. v2 did not replace the SDK — it shipped &lt;strong&gt;alongside&lt;/strong&gt; it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@modelcontextprotocol/sdk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"^1.30.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// legacy line, still maintained&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@modelcontextprotocol/client"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;// new: stateless + auto-fallback&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@modelcontextprotocol/server"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.0.0"&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// new: for building 2026-spec servers&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All three coexist in one &lt;code&gt;package.json&lt;/code&gt;. No fork, no vendoring, no version pinning games.&lt;/p&gt;

&lt;p&gt;There is a codemod for the mechanical parts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @modelcontextprotocol/codemod@beta v1-to-v2 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It handles the renames — &lt;code&gt;.tool()&lt;/code&gt; becomes &lt;code&gt;registerTool&lt;/code&gt;, imports move to the new packages. What it cannot do is decide your &lt;strong&gt;statefulness strategy&lt;/strong&gt;, which is the actual work.&lt;/p&gt;

&lt;p&gt;Tool schemas in v2 use &lt;a href="https://standardschema.dev/" rel="noopener noreferrer"&gt;Standard Schema&lt;/a&gt;, so Zod v4, Valibot, and ArkType all work instead of Zod-only.&lt;/p&gt;

&lt;h2&gt;
  
  
  The server checklist: seven concrete changes
&lt;/h2&gt;

&lt;p&gt;This is the list I actually worked through. Ordered by how much it breaks if you skip it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Implement &lt;code&gt;server/discover&lt;/code&gt;.&lt;/strong&gt; It is a MUST in the new spec. It replaces the handshake as the way a client learns your capabilities and supported versions. No &lt;code&gt;server/discover&lt;/code&gt;, no modern-era client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Stamp &lt;code&gt;resultType: "complete"&lt;/code&gt; on every result.&lt;/strong&gt; Cheap, mandatory, easy to forget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Add &lt;code&gt;ttlMs&lt;/code&gt; and &lt;code&gt;cacheScope&lt;/code&gt;&lt;/strong&gt; to &lt;code&gt;tools/list&lt;/code&gt;, &lt;code&gt;prompts/list&lt;/code&gt;, &lt;code&gt;resources/list&lt;/code&gt;, &lt;code&gt;resources/read&lt;/code&gt;, and &lt;code&gt;resources/templates/list&lt;/code&gt;. Clients now cache tool lists like HTTP responses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Order &lt;code&gt;tools/list&lt;/code&gt; deterministically.&lt;/strong&gt; A SHOULD, not a MUST — but unstable ordering defeats client-side caching, so it is effectively required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Swap the HTTP GET stream and &lt;code&gt;resources/subscribe&lt;/code&gt; for &lt;code&gt;subscriptions/listen&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Drop &lt;code&gt;ping&lt;/code&gt;, &lt;code&gt;logging/setLevel&lt;/code&gt;, and &lt;code&gt;notifications/roots/list_changed&lt;/code&gt;&lt;/strong&gt; from your modern-era handler.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Fix your error codes.&lt;/strong&gt; More on that next, because it is the sneakiest one.&lt;/p&gt;

&lt;p&gt;One trap worth calling out: if your v1 server sets &lt;code&gt;sessionIdGenerator: undefined&lt;/code&gt; and you have a comment nearby that says "stateless mode," &lt;strong&gt;that is not this&lt;/strong&gt;. That is v1's stateless-&lt;em&gt;session&lt;/em&gt; mode. It still performs the &lt;code&gt;initialize&lt;/code&gt; handshake. It is not 2026-compliant. I had exactly this comment in my own codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Error codes: grep for these today
&lt;/h2&gt;

&lt;p&gt;The spec partitioned the JSON-RPC server-error range. &lt;code&gt;-32000&lt;/code&gt;…&lt;code&gt;-32019&lt;/code&gt; stays implementation-defined; &lt;code&gt;-32020&lt;/code&gt;…&lt;code&gt;-32099&lt;/code&gt; is now reserved for the spec.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-32020&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HeaderMismatch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Mcp-Method&lt;/code&gt; disagrees with the body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-32021&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MissingRequiredClientCapability&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You asked for something the client never advertised&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-32022&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;UnsupportedProtocolVersion&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Version in &lt;code&gt;_meta&lt;/code&gt; is not supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-32602&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Resource not found&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Changed&lt;/strong&gt; — was &lt;code&gt;-32002&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last row is the one that will bite you quietly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# run this in your client codebase right now&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; &lt;span class="s2"&gt;"32002"&lt;/span&gt; src/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A hardcoded &lt;code&gt;-32002&lt;/code&gt; check does not throw when the code changes. It just &lt;strong&gt;stops matching&lt;/strong&gt;, and your "resource not found" branch silently becomes your generic-error branch.&lt;/p&gt;

&lt;p&gt;Practical advice: accept both codes when validating, emit the era-appropriate one. The v2 SDK still ships &lt;code&gt;-32002&lt;/code&gt; in &lt;code&gt;ProtocolErrorCode&lt;/code&gt; for legacy compatibility, so both are live in the wild.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deprecations: the 12-month clock started
&lt;/h2&gt;

&lt;p&gt;The spec added a formal lifecycle — Active → Deprecated → Removed — with a minimum 12-month window. Nothing here disappears before &lt;strong&gt;July 2027&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Roots&lt;/strong&gt; → pass scope explicitly via tool parameters, resource URIs, or config.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sampling&lt;/strong&gt; → call the LLM API directly from your server. Fewer round trips anyway.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logging&lt;/strong&gt; → stderr or OpenTelemetry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP+SSE transport&lt;/strong&gt; → Streamable HTTP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;includeContext: "thisServer" | "allServers"&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OAuth Dynamic Client Registration&lt;/strong&gt; → Client ID Metadata Documents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not add &lt;em&gt;new&lt;/em&gt; usage of any of these. And audit your docs and UI — mine were still advertising two of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two gotchas that cost me a day
&lt;/h2&gt;

&lt;p&gt;Here is the part you will not find in the changelog.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gotcha 1: &lt;code&gt;LATEST_PROTOCOL_VERSION&lt;/code&gt; is &lt;code&gt;2025-11-25&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Yes, in &lt;code&gt;@modelcontextprotocol/client@2&lt;/code&gt;. I assumed it was a packaging mistake. It is not.&lt;/p&gt;

&lt;p&gt;That constant means "the newest &lt;strong&gt;legacy-era&lt;/strong&gt; version, used for the fallback handshake." It is not the newest revision overall. If you write &lt;code&gt;protocolVersion: LATEST_PROTOCOL_VERSION&lt;/code&gt; expecting &lt;code&gt;2026-07-28&lt;/code&gt;, you have quietly pinned yourself to the old era.&lt;/p&gt;

&lt;p&gt;The era model explains it. Once you stop reading revisions as one ordered list, the naming makes sense.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gotcha 2: auto-fallback is not a free lunch
&lt;/h3&gt;

&lt;p&gt;The v2 client advertises automatic fallback: point it at a 2025-era server and it detects, falls back to &lt;code&gt;initialize&lt;/code&gt;, and connects. Mostly true, and it deletes a lot of detection code you would otherwise write.&lt;/p&gt;

&lt;p&gt;Then I shipped it as the single client for everything and broke auth-gated servers.&lt;/p&gt;

&lt;p&gt;The failure: v2's &lt;code&gt;auto&lt;/code&gt; mode treats a &lt;strong&gt;failed &lt;code&gt;server/discover&lt;/code&gt; probe as fatal&lt;/strong&gt;. A 2025-era gateway that answers unknown methods with &lt;code&gt;401&lt;/code&gt; becomes unreachable — even though the &lt;code&gt;initialize&lt;/code&gt; that would have followed uses the same credentials and succeeds fine.&lt;/p&gt;

&lt;p&gt;Second, related discovery: v2's &lt;code&gt;legacy&lt;/code&gt; mode is &lt;strong&gt;not bug-for-bug identical&lt;/strong&gt; to the v1 SDK against non-conforming servers. So "just pin to 2025-11-25 on the new client" is also not the old flow.&lt;/p&gt;

&lt;p&gt;What actually works is keeping the generations apart behind one facade:&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="c1"&gt;// dispatcher — one facade, two clients underneath&lt;/span&gt;
&lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;preference&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;legacy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;connectV1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;            &lt;span class="c1"&gt;// exact pre-2026 flow, untouched&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;modern&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;connectV2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2026-07-28&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// fail loudly, no fallback&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                                       &lt;span class="c1"&gt;// default&lt;/span&gt;
  &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;connectV2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;          &lt;span class="c1"&gt;// try stateless first&lt;/span&gt;
    &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;connectV1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;          &lt;span class="c1"&gt;// on ANY failure, fall back to v1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The rule I would tattoo on this migration:&lt;/strong&gt; never route your existing working path through the new client. Add the new generation &lt;em&gt;beside&lt;/em&gt; the old one, dispatch between them, and let &lt;code&gt;auto&lt;/code&gt; fall back to the flow you already trust.&lt;/p&gt;

&lt;p&gt;One more sharp edge inside that facade: &lt;code&gt;callTool&lt;/code&gt;'s second argument is a &lt;strong&gt;result schema&lt;/strong&gt; in v1 and &lt;strong&gt;request options&lt;/strong&gt; in v2. Same method name, different meaning. Forward options only on the modern path.&lt;/p&gt;

&lt;h2&gt;
  
  
  The new surface you actually want
&lt;/h2&gt;

&lt;p&gt;Migration is not only removal. Three additions are worth adopting deliberately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MRTR (Multi Round-Trip Requests).&lt;/strong&gt; A server can return an &lt;code&gt;InputRequiredResult&lt;/code&gt; mid-tool-call. The client gathers answers, echoes back the &lt;code&gt;requestState&lt;/code&gt;, and re-issues the original request. This is how a tool asks a clarifying question without failing.&lt;/p&gt;

&lt;p&gt;If your agent loop does not implement it, a fully compliant server just looks broken to you.&lt;/p&gt;

&lt;p&gt;The design question MRTR forces: &lt;strong&gt;who answers the question?&lt;/strong&gt; An auto-approve policy that fills in defaults defeats the point — the server asked because it needed a decision. In &lt;a href="https://mcpplaygroundonline.com/mcp-agent-studio" rel="noopener noreferrer"&gt;Agent Studio&lt;/a&gt; I wired the answers to come from the model itself: the tool schema carries &lt;code&gt;_mcpInputResponses&lt;/code&gt; and &lt;code&gt;_mcpRequestState&lt;/code&gt;, an &lt;code&gt;input_required&lt;/code&gt; result goes back to the model as retry instructions, and the whole exchange stays visible in the transcript. If you are building an agent loop against a 2026 server, that is the shape I would copy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tasks.&lt;/strong&gt; Now an extension (&lt;code&gt;io.modelcontextprotocol/tasks&lt;/code&gt;), not core. Poll &lt;code&gt;tasks/get&lt;/code&gt;, &lt;code&gt;tasks/update&lt;/code&gt;, &lt;code&gt;tasks/cancel&lt;/code&gt;. Note that &lt;strong&gt;&lt;code&gt;tasks/list&lt;/code&gt; was removed&lt;/strong&gt; and task creation is server-directed. Code written against the experimental core Tasks API from 2025-11-25 needs updating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP Apps.&lt;/strong&gt; Servers return HTML rendered in a sandboxed iframe; UI actions route back through JSON-RPC. The demo value here is high.&lt;/p&gt;

&lt;p&gt;Also free with the upgrade: full &lt;strong&gt;JSON Schema 2020-12&lt;/strong&gt; in tool inputs (&lt;code&gt;oneOf&lt;/code&gt;, &lt;code&gt;anyOf&lt;/code&gt;, &lt;code&gt;allOf&lt;/code&gt;, &lt;code&gt;$ref&lt;/code&gt;) and standardized &lt;strong&gt;W3C Trace Context&lt;/strong&gt; propagation. If you were flattening complex inputs to work around old schema limits, you can stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The security bug this revision created
&lt;/h2&gt;

&lt;p&gt;Statelessness moved state onto the wire, and wire state is attacker-controlled.&lt;/p&gt;

&lt;p&gt;Under MRTR, your server mints a &lt;code&gt;requestState&lt;/code&gt; blob, hands it to the client, and receives it back on the retry. &lt;strong&gt;The client can modify it in between.&lt;/strong&gt; The spec makes integrity protection a MUST, and the SDK explicitly does not do it for you.&lt;/p&gt;

&lt;p&gt;If an unprotected blob influences authorization or business logic, that is direct exploitation — tamper with the blob, resume someone else's operation.&lt;/p&gt;

&lt;p&gt;Sign it. Use the SDK's &lt;code&gt;createRequestStateCodec&lt;/code&gt; rather than rolling your own MAC.&lt;/p&gt;

&lt;p&gt;The other new-in-2026 checks worth running against yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;cacheScope: "public"&lt;/code&gt; on tenant-scoped data&lt;/strong&gt; — leaks across users via any shared intermediary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing &lt;code&gt;iss&lt;/code&gt; validation&lt;/strong&gt; in auth responses — RFC 9207 mix-up mitigation, now mandatory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing &lt;code&gt;application_type&lt;/code&gt;&lt;/strong&gt; during client registration — OIDC redirect URI conflicts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credentials reused across issuers&lt;/strong&gt; — must be keyed by issuer identity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-security-scanner" rel="noopener noreferrer"&gt;Scan your MCP server →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to actually test the migrated server
&lt;/h2&gt;

&lt;p&gt;You can get the first 20% with curl. Fire a &lt;code&gt;tools/call&lt;/code&gt; with no handshake and see whether it works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://your-server.example.com/mcp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Mcp-Method: tools/list'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{
        "_meta":{
          "io.modelcontextprotocol/protocolVersion":"2026-07-28",
          "io.modelcontextprotocol/clientInfo":{"name":"curl","version":"1.0"}
        }}}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that returns tools with &lt;code&gt;ttlMs&lt;/code&gt; and &lt;code&gt;cacheScope&lt;/code&gt;, you are on the new era. If it returns &lt;code&gt;-32022&lt;/code&gt;, you are not.&lt;/p&gt;

&lt;p&gt;Ironically, statelessness made this commodity check &lt;em&gt;easier&lt;/em&gt; — curl and Postman can now do the raw protocol ping they never could before. Good. That was never the interesting part.&lt;/p&gt;

&lt;p&gt;The interesting part is everything curl cannot answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does my server behave the same on &lt;strong&gt;both&lt;/strong&gt; revisions, for the clients that have not migrated?&lt;/li&gt;
&lt;li&gt;Does a &lt;strong&gt;real model&lt;/strong&gt; still pick the right tool now that my schemas use &lt;code&gt;oneOf&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Does my client handle &lt;code&gt;InputRequiredResult&lt;/code&gt;, &lt;code&gt;-32022&lt;/code&gt;, and a &lt;strong&gt;tampered &lt;code&gt;requestState&lt;/code&gt;&lt;/strong&gt; correctly?&lt;/li&gt;
&lt;li&gt;Is my &lt;code&gt;requestState&lt;/code&gt; actually signed, or did I just assume the SDK did it?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How MCP Playground helps
&lt;/h3&gt;

&lt;p&gt;That is the gap I built &lt;a href="https://mcpplaygroundonline.com/" rel="noopener noreferrer"&gt;MCP Playground&lt;/a&gt; around, and the 2026 spec is fully wired into it. Paste a URL and there is a protocol switch on every test surface: &lt;strong&gt;Auto&lt;/strong&gt; (detect and show the negotiated revision), &lt;strong&gt;Force 2025-11-25&lt;/strong&gt;, or &lt;strong&gt;Force 2026-07-28&lt;/strong&gt; — so you can prove your server answers both eras instead of hoping. If you are building a &lt;em&gt;client&lt;/em&gt;, the &lt;a href="https://mcpplaygroundonline.com/mcp-test-client" rel="noopener noreferrer"&gt;test client&lt;/a&gt; points at mock servers in either revision, including ones that return &lt;code&gt;InputRequiredResult&lt;/code&gt;, &lt;code&gt;-32022 UnsupportedProtocolVersion&lt;/code&gt;, and a deliberately tampered &lt;code&gt;requestState&lt;/code&gt;, so you can exercise your retry loop against hostile-but-legal responses. No install, runs in the browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My migration order
&lt;/h2&gt;

&lt;p&gt;If I did it again, in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Centralize your protocol constants first.&lt;/strong&gt; I found &lt;code&gt;protocolVersion&lt;/code&gt; hardcoded in four files, pinned to a revision &lt;em&gt;20 months&lt;/em&gt; out of date. Fix that before anything else or you will chase the same strings again next revision.&lt;/li&gt;
&lt;li&gt;Add v2 packages &lt;strong&gt;alongside&lt;/strong&gt; v1. Do not remove anything yet.&lt;/li&gt;
&lt;li&gt;Build the dispatcher (&lt;code&gt;legacy&lt;/code&gt; / &lt;code&gt;modern&lt;/code&gt; / &lt;code&gt;auto&lt;/code&gt;) so nothing existing changes behavior.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;server/discover&lt;/code&gt;, &lt;code&gt;resultType&lt;/code&gt;, &lt;code&gt;ttlMs&lt;/code&gt; / &lt;code&gt;cacheScope&lt;/code&gt; to the server.&lt;/li&gt;
&lt;li&gt;Fix error codes, add &lt;code&gt;Mcp-Method&lt;/code&gt; / &lt;code&gt;Mcp-Name&lt;/code&gt; handling.&lt;/li&gt;
&lt;li&gt;Sign &lt;code&gt;requestState&lt;/code&gt; before you ship MRTR — not after.&lt;/li&gt;
&lt;li&gt;Swap deprecated features on the 12-month clock, separately.&lt;/li&gt;
&lt;li&gt;Run both revisions against a real model and confirm every tool still resolves.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 8 is the one people skip. Regressions in an MCP migration are rarely loud — a tool quietly stops resolving, an auth flow fails silently, and you find out from a user.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;The 2026-07-28 spec deletes the handshake, makes &lt;code&gt;server/discover&lt;/code&gt; mandatory, moves protocol metadata into &lt;code&gt;_meta&lt;/code&gt;, changes error codes, and starts a 12-month clock on Roots, Sampling, and Logging. The migration is a checklist, not a rewrite.&lt;/p&gt;

&lt;p&gt;Keep your old path intact, add the new one beside it, sign your &lt;code&gt;requestState&lt;/code&gt;, and then prove both eras work before your users find the gap.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free →&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further reading&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://modelcontextprotocol.io/specification/2026-07-28/changelog" rel="noopener noreferrer"&gt;MCP 2026-07-28 changelog&lt;/a&gt; — official&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mcpplaygroundonline.com/blog/migrate-mcp-server-2026-07-28-stateless" rel="noopener noreferrer"&gt;Migrate Your MCP Server to the 2026-07-28 Spec&lt;/a&gt; — canonical version of this post&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mcpplaygroundonline.com/blog/build-mcp-server-2026-spec" rel="noopener noreferrer"&gt;Build an MCP Server on the 2026-07-28 Spec&lt;/a&gt; — starting fresh instead of migrating&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mcpplaygroundonline.com/blog/mcp-stateless-2026-release-candidate" rel="noopener noreferrer"&gt;MCP Goes Stateless&lt;/a&gt; — why the session model was removed&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mcpplaygroundonline.com/blog/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What Is the Model Context Protocol?&lt;/a&gt; — background&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Migrating something now? Tell me what broke — I am collecting the failure modes that are not in the changelog.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>mcp</category>
      <category>typescript</category>
    </item>
    <item>
      <title>GPT-5.6 MCP: Testing Servers With Sol, Terra &amp; Luna</title>
      <dc:creator>Rupa Tiwari</dc:creator>
      <pubDate>Tue, 14 Jul 2026 06:17:21 +0000</pubDate>
      <link>https://dev.to/rupa_tiwari_dd308948d710f/gpt-56-mcp-testing-servers-with-sol-terra-luna-1524</link>
      <guid>https://dev.to/rupa_tiwari_dd308948d710f/gpt-56-mcp-testing-servers-with-sol-terra-luna-1524</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📖 TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPT-5.6&lt;/strong&gt; shipped July 9, 2026 in three tiers &lt;strong&gt;Sol&lt;/strong&gt; (flagship), &lt;strong&gt;Terra&lt;/strong&gt; (balanced), and &lt;strong&gt;Luna&lt;/strong&gt; (cheapest) all tuned for agentic tool calling.&lt;/li&gt;
&lt;li&gt;All three share a &lt;strong&gt;1M-token context window&lt;/strong&gt;, 128K max output, and native &lt;strong&gt;MCP support&lt;/strong&gt; in the Responses API.&lt;/li&gt;
&lt;li&gt;Test any MCP server against &lt;em&gt;Sol, Terra, or Luna&lt;/em&gt; in &lt;a href="https://mcpplaygroundonline.com/mcp-agent-studio" rel="noopener noreferrer"&gt;MCP Agent Studio&lt;/a&gt; — pick the model, connect a server, and watch each tool call live.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;OpenAI dropped &lt;strong&gt;GPT-5.6&lt;/strong&gt; on July 9, 2026 - and this one is aimed squarely at agents.&lt;/p&gt;

&lt;p&gt;Three models landed at once: &lt;em&gt;Sol&lt;/em&gt;, &lt;em&gt;Terra&lt;/em&gt;, and &lt;em&gt;Luna&lt;/em&gt;. Each is built to &lt;strong&gt;call tools, not just chat&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That makes &lt;strong&gt;testing MCP servers with GPT-5.6&lt;/strong&gt; a different exercise than testing a plain chat model. Tool selection is the whole game.&lt;/p&gt;

&lt;p&gt;I have spent this week pointing all three at MCP servers GitHub, Postgres, Playwright, and multi-server setups. This post is what I learned.&lt;/p&gt;

&lt;p&gt;You will see &lt;strong&gt;which tier to run for which workload&lt;/strong&gt;, how the new tool-calling features change MCP, and how to test each one free in your browser. Skip it and you will overpay for Sol on jobs Luna handles fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is GPT-5.6? Sol, Terra, and Luna Explained
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GPT-5.6 is a three-tier model family, not a single model.&lt;/strong&gt; OpenAI split it by cost and horsepower so you match the model to the job.&lt;/p&gt;

&lt;p&gt;Here is the lineup, straight from OpenAI's pricing page:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Built for&lt;/th&gt;
&lt;th&gt;Input / Output (per 1M)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPT-5.6 Sol&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Flagship — ambitious agentic work&lt;/td&gt;
&lt;td&gt;$5.00 / $30.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPT-5.6 Terra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Balanced — efficient, high-volume work&lt;/td&gt;
&lt;td&gt;$2.50 / $15.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPT-5.6 Luna&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fast, affordable — everyday work&lt;/td&gt;
&lt;td&gt;$1.00 / $6.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The specs are shared across all three. &lt;strong&gt;Every tier gets a 1M-token context window, 128K max output, and a February 16, 2026 knowledge cutoff.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So the choice is not about context or capability limits. &lt;strong&gt;It is about how much reasoning each task actually needs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;New to the protocol these models call? Start with &lt;a href="https://mcpplaygroundonline.com/blog/what-is-model-context-protocol" rel="noopener noreferrer"&gt;what is Model Context Protocol&lt;/a&gt;, then come back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why GPT-5.6 Changes MCP Tool Calling
&lt;/h2&gt;

&lt;p&gt;Here is the part that matters for MCP. &lt;strong&gt;GPT-5.6 does not just call tools one at a time it can orchestrate them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The headline feature is &lt;em&gt;Programmatic Tool Calling&lt;/em&gt;. The model writes JavaScript that chains your tool calls, then runs it in an &lt;strong&gt;isolated V8 sandbox with no network access&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Why care? &lt;strong&gt;The old loop round-trips every tool result back through the model.&lt;/strong&gt; Ten calls means ten expensive turns.&lt;/p&gt;

&lt;p&gt;With Programmatic Tool Calling, the model batches that logic into one script. OpenAI reports &lt;strong&gt;token reductions of 38% to 63.5%&lt;/strong&gt; on real workloads.&lt;/p&gt;

&lt;p&gt;For MCP servers with many tools, that is a big deal. &lt;strong&gt;Fewer round-trips means lower cost and faster agents.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is a second feature: &lt;em&gt;ultra multi-agent mode&lt;/em&gt;. GPT-5.6 spins up four subagents in parallel by default.&lt;/p&gt;

&lt;p&gt;On Terminal-Bench 2.1, that lifted Sol from &lt;strong&gt;88.8% to 91.9%&lt;/strong&gt;. Parallel agents split a hard MCP task into focused lanes.&lt;/p&gt;

&lt;p&gt;Want to see how a model handles your server's tools before you trust any of this? &lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free&lt;/a&gt; and watch each call in the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sol vs Terra vs Luna: Which for MCP Servers?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do not default to Sol.&lt;/strong&gt; The whole point of three tiers is to stop overpaying.&lt;/p&gt;

&lt;p&gt;Here is how I split them for MCP work after a week of runs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Best MCP job&lt;/th&gt;
&lt;th&gt;When I skip it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sol&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Long multi-server chains; write actions; ambiguous goals&lt;/td&gt;
&lt;td&gt;Simple reads or listing tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Terra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Everyday agents; high-volume automation&lt;/td&gt;
&lt;td&gt;Plans that span 8+ dependent calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Luna&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fast lookups, single-tool reads, smoke tests&lt;/td&gt;
&lt;td&gt;Anything needing real multi-step planning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;My rule: &lt;strong&gt;start on Luna, move to Terra when it misses steps, reach for Sol only on the hard, expensive-to-fail agents.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The price gap makes this worth it. &lt;strong&gt;Sol costs five times Luna on input and output.&lt;/strong&gt; A wrong model choice adds up fast at scale.&lt;/p&gt;

&lt;p&gt;Do not guess &lt;strong&gt;run the same prompt on two tiers side by side&lt;/strong&gt; and compare the tool calls. That test takes 30 seconds in the studio.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Test MCP Servers With GPT-5.6 (Step by Step)
&lt;/h2&gt;

&lt;p&gt;You do not need the OpenAI API or an SDK to try this. The whole loop runs in the browser.&lt;/p&gt;

&lt;p&gt;Here is the flow I use in &lt;a href="https://mcpplaygroundonline.com/mcp-agent-studio" rel="noopener noreferrer"&gt;MCP Agent Studio&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 — Connect Your MCP Server
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Paste your MCP server URL into the connection field.&lt;/strong&gt; Any Streamable HTTP or SSE endpoint works.&lt;/p&gt;

&lt;p&gt;No server yet? Deploy one in a click from the &lt;a href="https://mcpplaygroundonline.com/mcp-hosted" rel="noopener noreferrer"&gt;hosted MCP catalog&lt;/a&gt; — GitHub, Playwright, Postgres, and more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 — Pick a GPT-5.6 Tier
&lt;/h3&gt;

&lt;p&gt;Open the &lt;strong&gt;model selector&lt;/strong&gt; and choose &lt;em&gt;GPT-5.6 Sol&lt;/em&gt;, &lt;em&gt;Terra&lt;/em&gt;, or &lt;em&gt;Luna&lt;/em&gt;. Each shows its credit cost per prompt.&lt;/p&gt;

&lt;p&gt;For a first run, &lt;strong&gt;Luna is plenty&lt;/strong&gt; — cheap and fast. Escalate only when the agent stumbles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 — Send and Inspect Every Tool Call
&lt;/h3&gt;

&lt;p&gt;Send a prompt like &lt;em&gt;"list my open GitHub PRs and flag the stale ones."&lt;/em&gt; Watch the tool calls stream in the panel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Click any call to see its exact input and output.&lt;/strong&gt; That trace is how you confirm GPT-5.6 picked the right tool with the right arguments.&lt;/p&gt;

&lt;p&gt;Three steps, start to finish:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Connect&lt;/strong&gt; the MCP server URL (plus token if needed)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select&lt;/strong&gt; a GPT-5.6 tier in the model dropdown&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat&lt;/strong&gt; and inspect each tool call live&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Want the wider workflow? The &lt;a href="https://mcpplaygroundonline.com/blog/how-to-test-mcp-servers-step-by-step" rel="noopener noreferrer"&gt;step-by-step guide to testing MCP servers&lt;/a&gt; covers the full loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  GPT-5.6 vs Claude for MCP Agents: The Honest Take
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GPT-5.6 is not a clean sweep.&lt;/strong&gt; It wins some benchmarks and loses others — and the split matters for MCP.&lt;/p&gt;

&lt;p&gt;Where &lt;strong&gt;Sol pulls ahead&lt;/strong&gt; is agentic, tool-heavy work. On &lt;em&gt;Agents' Last Exam&lt;/em&gt;, Sol set a new high, beating &lt;a href="https://mcpplaygroundonline.com/blog/claude-fable-5-mcp-servers" rel="noopener noreferrer"&gt;Claude Fable 5&lt;/a&gt; by double digits.&lt;/p&gt;

&lt;p&gt;It also topped the Coding Agent Index and led Terminal-Bench 2.1. &lt;strong&gt;For long-horizon MCP agents, that is the relevant lane.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But on &lt;em&gt;SWE-Bench Pro&lt;/em&gt;, Sol scored 64.6% — &lt;strong&gt;trailing Claude by roughly 15 points&lt;/strong&gt;. On raw code-fix accuracy, Claude still leads.&lt;/p&gt;

&lt;p&gt;So the honest read: &lt;strong&gt;GPT-5.6 for tool orchestration and cost, Claude for deep code reasoning.&lt;/strong&gt; The right answer depends on your server.&lt;/p&gt;

&lt;p&gt;The only way to know for your MCP setup is to test both. The studio has &lt;strong&gt;40+ models side by side&lt;/strong&gt; — see the &lt;a href="https://mcpplaygroundonline.com/blog/best-ai-model-for-mcp-tool-calling" rel="noopener noreferrer"&gt;best model for MCP tool calling&lt;/a&gt; for the full breakdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Reliable Tool Calls From GPT-5.6
&lt;/h2&gt;

&lt;p&gt;Even a flagship model needs a clean setup. &lt;strong&gt;Most "the agent broke" moments are schema or prompt problems, not model problems.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is what keeps GPT-5.6 reliable in my runs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write tight tool descriptions.&lt;/strong&gt; GPT-5.6 reads them literally — vague descriptions cause vague calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mark required arguments clearly.&lt;/strong&gt; Ambiguous schemas trip up even strong models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirm before write actions.&lt;/strong&gt; Ask the agent to state the exact change first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start cheap.&lt;/strong&gt; Run Luna to smoke-test the connection, then escalate for the real task.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A subtle one: &lt;strong&gt;the server, not the model, returns most errors you will see.&lt;/strong&gt; A 401 or 410 in a tool output is the API talking, not GPT-5.6.&lt;/p&gt;

&lt;p&gt;When calls fail, this &lt;a href="https://mcpplaygroundonline.com/blog/mcp-server-troubleshooting-common-errors-fix" rel="noopener noreferrer"&gt;MCP troubleshooting guide&lt;/a&gt; maps the common ones fast.&lt;/p&gt;

&lt;p&gt;And before you point any agent at a production server, &lt;strong&gt;scan it&lt;/strong&gt;. &lt;a href="https://mcpplaygroundonline.com/mcp-security-scanner" rel="noopener noreferrer"&gt;Scan your MCP server&lt;/a&gt; for tool-poisoning and injection risks first.&lt;/p&gt;

&lt;h2&gt;
  
  
  How MCP Playground Helps
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MCP Playground is where I test all three GPT-5.6 tiers without touching the API.&lt;/strong&gt; It runs in the browser, free.&lt;/p&gt;

&lt;p&gt;Connect any MCP server, pick &lt;em&gt;Sol, Terra, or Luna&lt;/em&gt; — or any of 40+ models — and watch every tool call in real time.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;compare view&lt;/strong&gt; lets me A/B Sol against Luna, or GPT-5.6 against Claude, on the same prompt. So I spend the flagship only where it earns its keep.&lt;/p&gt;

&lt;p&gt;And the &lt;a href="https://mcpplaygroundonline.com/mcp-hosted" rel="noopener noreferrer"&gt;hosted MCP catalog&lt;/a&gt; gives me a live server URL in one click — no infra to babysit.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Testing an MCP server with GPT-5.6?&lt;/strong&gt; Connect your endpoint, switch between Sol, Terra, and Luna mid-chat, and see which tier holds the plan.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free →&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-agent-studio" rel="noopener noreferrer"&gt;Chat with it in Agent Studio →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What are GPT-5.6 Sol, Terra, and Luna?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They are the three tiers of OpenAI's GPT-5.6 model family, launched July 9, 2026. Sol is the flagship for ambitious agentic work ($5/$30 per 1M tokens), Terra is the balanced tier for high-volume work ($2.50/$15), and Luna is the fast, affordable tier for everyday work ($1/$6). All three share a 1M-token context window, 128K max output, and native MCP support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which GPT-5.6 model is best for testing MCP servers?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It depends on the task. Start with Luna for simple reads, listing tools, and smoke tests. Move to Terra for everyday agents and high-volume automation. Reserve Sol for long multi-server chains, ambiguous goals, and write actions where a wrong tool call is expensive. Because Sol costs five times Luna, matching the tier to the job saves real money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is GPT-5.6 different for MCP tool calling?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GPT-5.6 adds Programmatic Tool Calling, where the model writes JavaScript that orchestrates your tool calls inside an isolated V8 sandbox with no network access. That batches logic instead of round-tripping every result through the model, cutting tokens by 38 to 63.5 percent. It also has an ultra multi-agent mode that runs four subagents in parallel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is GPT-5.6 better than Claude for MCP agents?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is a split. GPT-5.6 Sol leads on agentic and tool-heavy benchmarks like Agents' Last Exam and Terminal-Bench, which map closely to MCP workloads. But Claude still leads on raw code-fix accuracy, scoring higher on SWE-Bench Pro. The best choice depends on your server, so test both side by side in MCP Playground.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I test MCP servers with GPT-5.6 for free?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. MCP Playground runs entirely in the browser. You connect any MCP server, pick GPT-5.6 Sol, Terra, or Luna from the model selector, and watch every tool call in real time with no local setup and no OpenAI API key wrangling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GPT-5.6 is the most agent-focused release OpenAI has shipped&lt;/strong&gt; — three tiers, programmatic tool calling, and native MCP support. Sol leads on tool orchestration; Luna and Terra cover everyday agents cheaply.&lt;/p&gt;

&lt;p&gt;The fastest way to find your tier is to try them on your own server. &lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free&lt;/a&gt; and switch between Sol, Terra, and Luna mid-chat to see which one holds the plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Guides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What Is the Model Context Protocol (MCP)?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/claude-fable-5-mcp-servers" rel="noopener noreferrer"&gt;Claude Fable 5 + MCP Servers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/best-ai-model-for-mcp-tool-calling" rel="noopener noreferrer"&gt;Best AI Model for MCP Tool Calling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/how-to-test-mcp-servers-step-by-step" rel="noopener noreferrer"&gt;How to Test MCP Servers Step by Step&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/mcp-server-troubleshooting-common-errors-fix" rel="noopener noreferrer"&gt;MCP Server Troubleshooting — Common Errors&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://platform.openai.com/docs/models" rel="noopener noreferrer"&gt;OpenAI Platform: Models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openai.com/api/pricing/" rel="noopener noreferrer"&gt;OpenAI API Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/specification" rel="noopener noreferrer"&gt;Official: MCP Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/docs/concepts/transports" rel="noopener noreferrer"&gt;Official: MCP Transports&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mcpplaygroundonline.com/blog/gpt-5-6-mcp-servers-sol-terra-luna" rel="noopener noreferrer"&gt;MCP Playground&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>openai</category>
      <category>mcp</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>MCP vs A2A: Model Context Protocol vs Agent2Agent</title>
      <dc:creator>Rupa Tiwari</dc:creator>
      <pubDate>Tue, 30 Jun 2026 15:19:41 +0000</pubDate>
      <link>https://dev.to/rupa_tiwari_dd308948d710f/mcp-vs-a2a-model-context-protocol-vs-agent2agent-2a89</link>
      <guid>https://dev.to/rupa_tiwari_dd308948d710f/mcp-vs-a2a-model-context-protocol-vs-agent2agent-2a89</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📖 TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; connects one agent to tools, data, and APIs — a vertical link from agent down to capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A2A (Agent2Agent)&lt;/strong&gt; connects agents to other agents — a horizontal link so independent agents can delegate work.&lt;/li&gt;
&lt;li&gt;MCP is from Anthropic; A2A started at Google and is now a Linux Foundation project. They are &lt;strong&gt;complementary, not competitors&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use MCP to give an agent its toolbox. Use A2A to let that agent hire other agents.&lt;/li&gt;
&lt;li&gt;Most production stacks in 2026 run &lt;strong&gt;both&lt;/strong&gt;: A2A between agents, MCP from each agent to its tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Key Difference in One Sentence
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MCP connects an agent to its tools. A2A connects an agent to other agents.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the whole comparison in a line. The two protocols sit on different axes of the same system.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;MCP&lt;/em&gt; is &lt;strong&gt;vertical&lt;/strong&gt;: it runs from a single agent down to the tools, files, and APIs it can call. Think of it as the agent's toolbox.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A2A&lt;/em&gt; is &lt;strong&gt;horizontal&lt;/strong&gt;: it runs sideways, between peer agents that each have their own tools and reasoning. Think of it as agents hiring each other.&lt;/p&gt;

&lt;p&gt;So "MCP vs A2A" is rarely an either/or pick. Once you understand the axes, the question becomes &lt;strong&gt;where each one belongs in your stack&lt;/strong&gt; — which is what the rest of this guide covers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is MCP (Model Context Protocol)?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MCP is an open standard from Anthropic, released in November 2024, for connecting AI models to external systems.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An MCP server exposes three things to a model: &lt;em&gt;tools&lt;/em&gt; (functions the model can call), &lt;em&gt;resources&lt;/em&gt; (data it can read), and &lt;em&gt;prompts&lt;/em&gt; (reusable templates).&lt;/p&gt;

&lt;p&gt;The model is the client. It discovers what a server offers, picks a tool, and calls it with arguments — all over JSON-RPC 2.0.&lt;/p&gt;

&lt;p&gt;The point is to kill custom glue code. Instead of writing a one-off integration for every API, you expose a standard MCP surface once and any MCP-aware client can use it.&lt;/p&gt;

&lt;p&gt;If you are new to it, start with &lt;a href="https://mcpplaygroundonline.com/blog/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What Is the Model Context Protocol?&lt;/a&gt; and &lt;a href="https://mcpplaygroundonline.com/blog/what-is-mcp-agent-tool-calling" rel="noopener noreferrer"&gt;how MCP tool calling works&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;MCP answers one question: &lt;strong&gt;how does this agent reach the outside world?&lt;/strong&gt; Files, databases, GitHub, Slack, your own REST API — all of it becomes callable through a single protocol.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is A2A (Agent2Agent)?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A2A is an open protocol for agent-to-agent communication.&lt;/strong&gt; Google announced it in April 2025 and donated it to the Linux Foundation in June 2025, with backing from 50+ partners.&lt;/p&gt;

&lt;p&gt;MCP assumes the client is a model talking to tools. A2A assumes both sides are &lt;em&gt;full agents&lt;/em&gt; — each with its own model, memory, and tools.&lt;/p&gt;

&lt;p&gt;A2A lets a "client agent" hand a task to a "remote agent" and get results back, without either side exposing its internal logic.&lt;/p&gt;

&lt;p&gt;That last part matters. A2A agents are &lt;strong&gt;opaque&lt;/strong&gt; — they collaborate as black boxes. The client agent does not see the remote agent's tools or prompts, only the task and its output.&lt;/p&gt;

&lt;p&gt;The core building blocks are the &lt;em&gt;Agent Card&lt;/em&gt; (a public capability profile), &lt;em&gt;Tasks&lt;/em&gt; (units of work with a lifecycle), &lt;em&gt;Messages&lt;/em&gt;, and &lt;em&gt;Artifacts&lt;/em&gt; (the results a task produces).&lt;/p&gt;

&lt;p&gt;A real example: a hiring agent asks a sourcing agent to find candidates, then asks a scheduling agent to book interviews. Three separate agents, possibly three vendors, coordinating over A2A.&lt;/p&gt;

&lt;p&gt;A2A answers a different question than MCP: &lt;strong&gt;how do independent agents delegate work to each other?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP vs A2A: Side-by-Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;MCP&lt;/th&gt;
&lt;th&gt;A2A&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Connects&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent → tools &amp;amp; data&lt;/td&gt;
&lt;td&gt;Agent ↔ agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Axis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vertical (down to capabilities)&lt;/td&gt;
&lt;td&gt;Horizontal (across peers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Origin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anthropic (Nov 2024)&lt;/td&gt;
&lt;td&gt;Google → Linux Foundation (2025)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unit of work&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tool call&lt;/td&gt;
&lt;td&gt;Task (with a lifecycle)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Discovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;tools/list, resources/list&lt;/td&gt;
&lt;td&gt;Agent Card (JSON profile)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Other side is&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A concrete tool surface&lt;/td&gt;
&lt;td&gt;An opaque, autonomous agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transport&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JSON-RPC 2.0 over STDIO or Streamable HTTP&lt;/td&gt;
&lt;td&gt;JSON-RPC 2.0 over HTTP(S), SSE, webhooks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Giving one agent capabilities&lt;/td&gt;
&lt;td&gt;Coordinating many agents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rows that matter most are the first two. &lt;strong&gt;Everything else follows from "agent-to-tool" versus "agent-to-agent".&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP vs A2A: Architecture and Transport
&lt;/h2&gt;

&lt;p&gt;Both protocols speak &lt;strong&gt;JSON-RPC 2.0&lt;/strong&gt;, so the wire format feels familiar across the two. The shape of what they exchange is where they split.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP architecture
&lt;/h3&gt;

&lt;p&gt;An MCP host (like Claude Desktop) runs one or more MCP clients. Each client holds a session with one MCP server.&lt;/p&gt;

&lt;p&gt;Transport is either &lt;em&gt;STDIO&lt;/em&gt; for local servers or &lt;em&gt;Streamable HTTP&lt;/em&gt; for remote ones. The exchange is request/response: list tools, call a tool, get a result.&lt;/p&gt;

&lt;p&gt;For a deeper protocol breakdown, see &lt;a href="https://mcpplaygroundonline.com/blog/mcp-vs-rest-api-whats-different" rel="noopener noreferrer"&gt;MCP vs REST API&lt;/a&gt; and &lt;a href="https://mcpplaygroundonline.com/blog/mcp-vs-function-calling-vs-api-comparison" rel="noopener noreferrer"&gt;MCP vs function calling&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  A2A architecture
&lt;/h3&gt;

&lt;p&gt;A2A has a &lt;em&gt;client agent&lt;/em&gt; and a &lt;em&gt;remote agent&lt;/em&gt;, both running as HTTP services. The client sends a task; the remote agent works it and returns artifacts.&lt;/p&gt;

&lt;p&gt;Because agent tasks can be long-running, A2A leans on &lt;strong&gt;Server-Sent Events for streaming&lt;/strong&gt; and webhook push notifications for updates that arrive minutes — or hours — later.&lt;/p&gt;

&lt;p&gt;A task moves through states: &lt;em&gt;submitted&lt;/em&gt;, &lt;em&gt;working&lt;/em&gt;, &lt;em&gt;input-required&lt;/em&gt;, &lt;em&gt;completed&lt;/em&gt;, &lt;em&gt;failed&lt;/em&gt;, or &lt;em&gt;canceled&lt;/em&gt;. That lifecycle is something MCP's single tool call does not model.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key nuance:&lt;/strong&gt; MCP optimizes for a fast, synchronous tool call. A2A optimizes for a delegated task that may take a while and report back asynchronously. The transport choices flow directly from that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Discovery: tools/list vs the Agent Card
&lt;/h2&gt;

&lt;p&gt;Discovery is the cleanest way to feel the difference between the two protocols.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In MCP, a client asks a server "what can you do?" by calling &lt;code&gt;tools/list&lt;/code&gt;.&lt;/strong&gt; It gets back concrete tools with names, descriptions, and JSON input schemas.&lt;/p&gt;

&lt;p&gt;The model then reasons over that list and calls a specific tool. The server's capabilities are &lt;em&gt;transparent&lt;/em&gt; by design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In A2A, discovery happens through the Agent Card&lt;/strong&gt; — a JSON document an agent publishes at a well-known URL (typically &lt;code&gt;/.well-known/agent-card.json&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;The Agent Card describes the agent's skills, endpoint, auth requirements, and supported modes — but not its internal tools. A client agent reads the card to decide &lt;em&gt;whether to delegate&lt;/em&gt;, not &lt;em&gt;which function to invoke&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So MCP discovery says "here are my functions." A2A discovery says "here is what I can take on." One exposes a toolbox; the other advertises a hire-able specialist.&lt;/p&gt;

&lt;p&gt;When you build an MCP server, that &lt;code&gt;tools/list&lt;/code&gt; response is the contract a model depends on. Vague names or weak schemas quietly break tool selection.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 The fastest way to check that contract is to run your server against a real model and watch which tools it picks. &lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free →&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  When to Use MCP vs A2A
&lt;/h2&gt;

&lt;p&gt;Pick based on what is on the other end of the connection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reach for MCP when…
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want one agent to read a database, hit an API, or touch the filesystem.&lt;/li&gt;
&lt;li&gt;The capability is a &lt;strong&gt;function&lt;/strong&gt;, not an autonomous actor.&lt;/li&gt;
&lt;li&gt;You need fast, synchronous calls with structured inputs and outputs.&lt;/li&gt;
&lt;li&gt;You are wrapping your own services so any MCP client can use them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reach for A2A when…
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You have &lt;strong&gt;multiple agents&lt;/strong&gt; that should delegate work to each other.&lt;/li&gt;
&lt;li&gt;Those agents are built on different frameworks or owned by different teams or vendors.&lt;/li&gt;
&lt;li&gt;A unit of work is a long-running &lt;em&gt;task&lt;/em&gt;, not a single call.&lt;/li&gt;
&lt;li&gt;You want agents to collaborate without exposing each other's internals.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quick gut check: if the thing you are connecting to &lt;strong&gt;cannot reason on its own&lt;/strong&gt;, it is an MCP tool. If it &lt;strong&gt;can&lt;/strong&gt;, it is an A2A agent.&lt;/p&gt;

&lt;p&gt;Building a multi-agent system today? Pair this with &lt;a href="https://mcpplaygroundonline.com/blog/multi-agent-mcp-crewai-langchain-guide" rel="noopener noreferrer"&gt;multi-agent MCP with CrewAI and LangChain&lt;/a&gt; for the orchestration side.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why You'll Often Use Both Together
&lt;/h2&gt;

&lt;p&gt;The framing "MCP vs A2A" sells the wrong story. In real systems, &lt;strong&gt;they stack&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Google said as much when it launched A2A: it is positioned as &lt;em&gt;complementary&lt;/em&gt; to MCP, not a replacement.&lt;/p&gt;

&lt;p&gt;Here is the mental model. &lt;strong&gt;A2A is how agents coordinate. MCP is how each agent gets work done.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Walk through one task. A user asks a "travel planner" agent to book a trip.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The planner agent uses &lt;strong&gt;A2A&lt;/strong&gt; to delegate flights to a flight agent and hotels to a hotel agent.&lt;/li&gt;
&lt;li&gt;The flight agent uses &lt;strong&gt;MCP&lt;/strong&gt; to call an airline API and a payments tool.&lt;/li&gt;
&lt;li&gt;The hotel agent uses &lt;strong&gt;MCP&lt;/strong&gt; to query a booking database and a maps service.&lt;/li&gt;
&lt;li&gt;Results flow back over A2A as artifacts, and the planner assembles the itinerary.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A2A handles the conversation between agents. MCP handles each agent's grip on the real world. Remove either and the system stops working.&lt;/p&gt;

&lt;p&gt;That is why I treat them as &lt;strong&gt;two layers of the same architecture&lt;/strong&gt;, not rival standards. Most serious agent platforms in 2026 ship support for both.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Building the MCP layer of your agent stack?&lt;/strong&gt; Test your MCP server against real models in the browser before any agent — or any other agent — depends on it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free →&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-agent-studio" rel="noopener noreferrer"&gt;Chat with your server in Agent Studio →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does A2A replace MCP?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. They operate on different axes. MCP connects an agent to tools and data; A2A connects agents to each other. Google explicitly positions A2A as complementary to MCP, and most agent stacks use both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who created MCP and A2A?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Anthropic released MCP in November 2024. Google announced A2A in April 2025 and donated it to the Linux Foundation in June 2025, where it is now a vendor-neutral open project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is an Agent Card in A2A?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An Agent Card is a JSON document an agent publishes at a well-known URL describing its skills, endpoint, and auth requirements. Other agents read it to decide whether to delegate a task — it is A2A's discovery mechanism, similar in spirit to MCP's tools/list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use MCP and A2A in the same system?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, and most production systems do. A2A handles coordination between agents while each agent uses MCP to call its own tools and data sources. They form two layers of one architecture rather than competing choices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is A2A the same as multi-agent frameworks like CrewAI?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not quite. Frameworks like CrewAI or LangGraph orchestrate agents inside one application. A2A is an open wire protocol for agents to communicate across frameworks, teams, and vendors — including agents the framework did not build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Guides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What Is the Model Context Protocol (MCP)? A Developer's Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/mcp-vs-rest-api-whats-different" rel="noopener noreferrer"&gt;MCP vs REST API — What's Different?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/mcp-vs-function-calling-vs-api-comparison" rel="noopener noreferrer"&gt;MCP vs Function Calling vs API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/multi-agent-mcp-crewai-langchain-guide" rel="noopener noreferrer"&gt;Multi-Agent MCP with CrewAI and LangChain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcpplaygroundonline.com/blog/what-is-mcp-agent-tool-calling" rel="noopener noreferrer"&gt;What Is an MCP Agent? Tool Calling Explained&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/specification" rel="noopener noreferrer"&gt;Official: MCP Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/docs/concepts/transports" rel="noopener noreferrer"&gt;Official: MCP Transports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://a2a-protocol.org/" rel="noopener noreferrer"&gt;Official: A2A Protocol Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/a2aproject/A2A" rel="noopener noreferrer"&gt;A2A Specification on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.googleblog.com/en/a2a-a-new-era-of-agent-interoperability/" rel="noopener noreferrer"&gt;Google: Announcing the Agent2Agent Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linuxfoundation.org/press/linux-foundation-launches-the-agent2agent-protocol-project" rel="noopener noreferrer"&gt;Linux Foundation: A2A Project Launch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mcpplaygroundonline.com/blog/mcp-vs-a2a-agent2agent-protocol" rel="noopener noreferrer"&gt;MCP Playground&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>agents</category>
      <category>llm</category>
    </item>
    <item>
      <title>Why Testing MCP Servers With Real AI Models Matters (2026)</title>
      <dc:creator>Rupa Tiwari</dc:creator>
      <pubDate>Sat, 13 Jun 2026 16:53:58 +0000</pubDate>
      <link>https://dev.to/rupa_tiwari_dd308948d710f/why-testing-mcp-servers-with-real-ai-models-matters-2026-55e9</link>
      <guid>https://dev.to/rupa_tiwari_dd308948d710f/why-testing-mcp-servers-with-real-ai-models-matters-2026-55e9</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Curl and unit tests check the wire format. A real model checks whether the tool is usable&lt;/strong&gt; — those are different failures.&lt;/li&gt;
&lt;li&gt;A model decides &lt;em&gt;which&lt;/em&gt; tool to call, &lt;em&gt;when&lt;/em&gt;, and &lt;em&gt;with what arguments&lt;/em&gt; — your schema and descriptions drive all three.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The same MCP server behaves differently across models&lt;/strong&gt; — GPT, Claude, Gemini, and the open-weight models pick tools and shape arguments differently.&lt;/li&gt;
&lt;li&gt;Model performance gains in 2026 changed tool-calling reliability — test against current models, not last year's.&lt;/li&gt;
&lt;li&gt;Fastest way to do it: paste your server URL into &lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;MCP Playground&lt;/a&gt;, pick a model, and watch every tool call as structured JSON. No setup.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Your MCP server returns a clean &lt;code&gt;200&lt;/code&gt;. The JSON validates. Every unit test is green. So it works, right?&lt;/p&gt;

&lt;p&gt;Not quite. &lt;strong&gt;Testing MCP servers with real AI models is the only way to know your tools are actually usable&lt;/strong&gt; — and that is a separate question from whether they respond.&lt;/p&gt;

&lt;p&gt;A model has to read your tool descriptions, pick the right tool, and build valid arguments on its own. Curl never does any of that.&lt;/p&gt;

&lt;p&gt;I've watched servers pass every wire-level test and still fail in a live agent loop. The model couldn't tell two tools apart. Or it guessed an argument shape that didn't exist.&lt;/p&gt;

&lt;p&gt;This post covers why model-in-the-loop testing matters, how model performance changes your results, and how to check your server across different models before users do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Testing MCP Servers With Real AI Models Means
&lt;/h2&gt;

&lt;p&gt;There are two layers to an MCP server, and they fail in different ways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The transport layer&lt;/strong&gt; is the wire: JSON-RPC over Streamable HTTP or STDIO. Does the server respond, list tools, and return valid results? Curl and unit tests cover this fine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The semantic layer&lt;/strong&gt; is whether a model can &lt;em&gt;use&lt;/em&gt; the tools. Can it find the right one, read the schema, and pass correct arguments without help?&lt;/p&gt;

&lt;p&gt;Testing with a real model means putting an actual LLM in the loop. You send a natural-language prompt, the model reads your &lt;code&gt;tools/list&lt;/code&gt; output, and it decides what to call. That is the same flow your users hit in production.&lt;/p&gt;

&lt;p&gt;New to the protocol? Start with &lt;a href="https://mcpplaygroundonline.com/blog/what-is-model-context-protocol" rel="noopener noreferrer"&gt;what the Model Context Protocol is&lt;/a&gt;, then come back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Matters
&lt;/h2&gt;

&lt;p&gt;Here's the problem. Your tool definition is a contract written for a reader you never meet during development — the model.&lt;/p&gt;

&lt;p&gt;A tool named &lt;code&gt;get_data&lt;/code&gt; with a one-word description passes every schema validator. It also tells the model almost nothing about when to use it.&lt;/p&gt;

&lt;p&gt;Now agitate that. You have three tools that all sound similar. The model picks the wrong one. Or it skips your tool entirely and hallucinates an answer instead.&lt;/p&gt;

&lt;p&gt;None of that shows up in a unit test. The server worked perfectly — nobody called it correctly.&lt;/p&gt;

&lt;p&gt;The failures only a real model exposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool selection&lt;/strong&gt; — the model picks the wrong tool, or ignores yours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Argument construction&lt;/strong&gt; — it fills a required field with a value of the wrong type or format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ambiguous descriptions&lt;/strong&gt; — two tools read as interchangeable, so choice becomes a coin flip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-step chaining&lt;/strong&gt; — the model can't sequence tool A's output into tool B's input.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Over-calling&lt;/strong&gt; — a vague description makes the model call your tool when it shouldn't.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Every one of these is a real bug your users will hit.&lt;/strong&gt; And every one is invisible until a model drives the server. That is why model-in-the-loop testing isn't optional.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Curl and Unit Tests Quietly Miss
&lt;/h2&gt;

&lt;p&gt;I'm not against unit tests. They're fast, deterministic, and they belong in CI. But they test the half of the server that rarely breaks in surprising ways.&lt;/p&gt;

&lt;p&gt;Here's the split I use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;curl / unit test&lt;/th&gt;
&lt;th&gt;real model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Does the server respond?&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is the JSON schema valid?&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does a model pick the right tool?&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Are the descriptions clear enough?&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can it chain multiple tools?&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Unit tests confirm the wire format. A real model confirms the product.&lt;/strong&gt; You need both, but only one of them mirrors what your users actually do.&lt;/p&gt;

&lt;p&gt;For a full breakdown of a test plan, see the &lt;a href="https://mcpplaygroundonline.com/blog/how-to-test-mcp-servers-step-by-step" rel="noopener noreferrer"&gt;step-by-step guide to testing MCP servers&lt;/a&gt; and &lt;a href="https://mcpplaygroundonline.com/blog/how-qa-teams-should-test-mcp-servers" rel="noopener noreferrer"&gt;how QA teams should approach it&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How AI Model Performance Changes Your Results
&lt;/h2&gt;

&lt;p&gt;Tool calling is a model capability, and it has improved sharply over the last year. That cuts both ways for your testing.&lt;/p&gt;

&lt;p&gt;A stronger model is more forgiving. It can infer intent from a weak tool description and still pick correctly. So a server that "works" on the latest frontier model may be hiding sloppy schemas.&lt;/p&gt;

&lt;p&gt;Swap in a smaller or older model and the cracks show. The weak description that the frontier model papered over now produces wrong tool calls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is the trap: you test on your favorite model, ship, then a user runs your server on a cheaper one and it falls apart.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Performance shows up in concrete ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parallel tool calls&lt;/strong&gt; — newer models fire several tools in one turn; older ones go one at a time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Argument accuracy&lt;/strong&gt; — better models respect enums, formats, and required fields more reliably.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recovery&lt;/strong&gt; — a strong model reads an error result and retries with a fix; a weak one loops or gives up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reasoning before calling&lt;/strong&gt; — reasoning models plan a tool sequence instead of guessing the first step.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because of this, last year's test run doesn't validate today's reality. Models update constantly — re-test against current ones. My breakdown of the &lt;a href="https://mcpplaygroundonline.com/blog/best-ai-model-for-mcp-tool-calling" rel="noopener noreferrer"&gt;best AI model for MCP tool calling&lt;/a&gt; goes deeper on the differences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking How Different Models Work With Your Server
&lt;/h2&gt;

&lt;p&gt;Here's the part most people skip: &lt;strong&gt;the same MCP server behaves differently across models.&lt;/strong&gt; Tool calling isn't standardized behavior — each model family has its own habits.&lt;/p&gt;

&lt;p&gt;If you only ship to one client, test on the model that client uses. If you publish a public server, you don't get to choose — so test broadly.&lt;/p&gt;

&lt;p&gt;What I watch for across families:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude (Opus 4.7, Sonnet 4.6)&lt;/strong&gt; — strong at reading long descriptions and chaining tools; good baseline for "is my schema clear".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-5.x&lt;/strong&gt; — aggressive parallel tool calls; exposes race conditions in stateful servers fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3&lt;/strong&gt; — strict about argument formats; surfaces loose schema definitions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-weight (DeepSeek V4, Qwen 3.x, GLM, Kimi, MiniMax)&lt;/strong&gt; — more sensitive to vague descriptions; the honest stress test for tool clarity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A concrete example. I once had a tool with an optional &lt;code&gt;format&lt;/code&gt; field. Claude ignored it and defaulted correctly. A smaller open model passed an invalid value every time.&lt;/p&gt;

&lt;p&gt;The fix wasn't the model — it was my description. I made the allowed values explicit, and every model got it right. &lt;strong&gt;Cross-model testing turns a "model bug" into a schema fix you control.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've written client-specific walkthroughs if you want the exact setup: &lt;a href="https://mcpplaygroundonline.com/blog/test-mcp-server-with-chatgpt-and-openai" rel="noopener noreferrer"&gt;ChatGPT and OpenAI&lt;/a&gt;, &lt;a href="https://mcpplaygroundonline.com/blog/test-mcp-server-with-gemini-models" rel="noopener noreferrer"&gt;Gemini models&lt;/a&gt;, &lt;a href="https://mcpplaygroundonline.com/blog/testing-mcp-with-deepseek" rel="noopener noreferrer"&gt;DeepSeek V4&lt;/a&gt;, and &lt;a href="https://mcpplaygroundonline.com/blog/testing-mcp-with-grok-xai" rel="noopener noreferrer"&gt;Grok&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Cross-Model MCP Testing Workflow
&lt;/h2&gt;

&lt;p&gt;You don't need a test farm. Here's the order I work in before shipping a server.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wire check first&lt;/strong&gt; — confirm the server lists tools and returns valid results with curl or your client. Fix transport bugs before involving a model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One strong model&lt;/strong&gt; — connect a frontier model and run real prompts. Confirm it finds and calls each tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One weak model&lt;/strong&gt; — repeat on a smaller or open-weight model. This is where unclear descriptions break.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch the arguments&lt;/strong&gt; — don't just check the final answer. Read the actual JSON arguments the model built for each call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test the chains&lt;/strong&gt; — give a prompt that needs two or three tools in sequence and confirm the model wires outputs into inputs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix the schema, not the model&lt;/strong&gt; — most failures trace back to a vague name, description, or enum. Tighten those and re-run.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If your tools touch real systems, add a security pass too — a tool a model over-calls is also a tool an attacker can abuse. Before you publish a public server, &lt;a href="https://mcpplaygroundonline.com/mcp-security-scanner" rel="noopener noreferrer"&gt;scan your MCP server&lt;/a&gt; for exposure and prompt injection.&lt;/p&gt;

&lt;h2&gt;
  
  
  How MCP Playground Helps You Test Across Models
&lt;/h2&gt;

&lt;p&gt;Setting up one client per model is the reason most people skip cross-model testing. That's the friction &lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;MCP Playground&lt;/a&gt; removes.&lt;/p&gt;

&lt;p&gt;It runs in the browser: paste a server URL, pick from dozens of models across providers — Claude, GPT-5.x, Gemini 3, DeepSeek, Qwen, Grok, Kimi, and more — and send a real prompt. No API keys, no local client to rebuild.&lt;/p&gt;

&lt;p&gt;You see every tool call as structured JSON: which tool the model chose, the exact arguments, and the raw result. Switch models and re-run the same prompt to compare behavior side by side.&lt;/p&gt;

&lt;p&gt;That's the loop that catches the regressions a migration or a schema tweak hides — before your users find them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://mcpplaygroundonline.com/mcp-test-server" rel="noopener noreferrer"&gt;Test any MCP server free →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why isn't passing my unit tests enough to know my MCP server works?
&lt;/h3&gt;

&lt;p&gt;Unit tests and curl check the transport layer: does the server respond, list tools, and return valid JSON. They never check whether a model can read your tool descriptions, pick the right tool, and build valid arguments on its own. That semantic layer only gets tested when a real AI model drives the server with a natural-language prompt — which is exactly what your users do in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the same MCP server work differently with different AI models?
&lt;/h3&gt;

&lt;p&gt;Yes. Tool calling is a model capability, not standardized behavior. Stronger models infer intent from weak descriptions and forgive sloppy schemas; smaller or open-weight models expose those gaps with wrong tool choices or invalid arguments. Models also differ in parallel tool calls, format strictness, and error recovery. If you publish a public server, test across several model families.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I test my MCP server with a real AI model without a full client setup?
&lt;/h3&gt;

&lt;p&gt;Use a browser-based tool like MCP Playground. Paste your server URL, pick a model, and send a natural-language prompt — no API keys or local client required. You see which tool the model chose, the exact arguments it built, and the raw result as structured JSON, then switch models to compare behavior on the same prompt.&lt;/p&gt;

&lt;h3&gt;
  
  
  My tool works on the latest model but fails on a smaller one. Whose bug is it?
&lt;/h3&gt;

&lt;p&gt;Usually it's your schema, not the model. A frontier model papers over a vague tool name, description, or missing enum; a smaller model takes the schema literally and gets it wrong. Make allowed values explicit, sharpen the description, and tighten required fields. Cross-model testing turns what looks like a model bug into a schema fix you control.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mcpplaygroundonline.com/blog/testing-mcp-servers-with-real-ai-models" rel="noopener noreferrer"&gt;MCP Playground&lt;/a&gt; — a free browser-based tool for testing MCP servers against real AI models.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>mcp</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
