<?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: Peter</title>
    <description>The latest articles on DEV Community by Peter (@smeldr).</description>
    <link>https://dev.to/smeldr</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%2F3988634%2F48c095ea-731e-40a3-aaae-d4c793825c3a.png</url>
      <title>DEV Community: Peter</title>
      <link>https://dev.to/smeldr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/smeldr"/>
    <language>en</language>
    <item>
      <title>Anthropic described the right way to build MCP servers. Gut feeling confirmed.</title>
      <dc:creator>Peter</dc:creator>
      <pubDate>Wed, 17 Jun 2026 09:45:14 +0000</pubDate>
      <link>https://dev.to/smeldr/anthropic-described-the-right-way-to-build-mcp-servers-gut-feeling-confirmed-38gc</link>
      <guid>https://dev.to/smeldr/anthropic-described-the-right-way-to-build-mcp-servers-gut-feeling-confirmed-38gc</guid>
      <description>&lt;p&gt;I make a lot of design decisions on gut feeling. Is this the right way to structure MCP tools? Should the transport be remote or local? How much context should an agent get about the fields it's writing to?&lt;/p&gt;

&lt;p&gt;You make your best call, ship it, and move on.&lt;/p&gt;

&lt;p&gt;About six weeks ago, Anthropic published their recommendations for production-ready MCP servers. I read through it and felt that quiet satisfaction you get when someone else independently arrives at the same place. Every single point mapped to something already in Smeldr.&lt;/p&gt;

&lt;p&gt;Here's how:&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Build remote servers, not local/stdio
&lt;/h2&gt;

&lt;p&gt;Anthropic's recommendation: deploy servers that run remotely. Local stdio-only servers can't reach web, mobile, or cloud-hosted agents.&lt;/p&gt;

&lt;p&gt;Smeldr ships with HTTP+SSE transport. The MCP server runs as a standard HTTP server. An agent running anywhere connects over the network with a bearer token.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Group tools around intent, not raw endpoints
&lt;/h2&gt;

&lt;p&gt;Anthropic's recommendation: fewer tools focused on what users want to accomplish, not mirrored one-to-one from your API surface.&lt;/p&gt;

&lt;p&gt;Smeldr generates tools grouped around content lifecycle intent. For a &lt;code&gt;Story&lt;/code&gt; type you get &lt;code&gt;create_story&lt;/code&gt;, &lt;code&gt;update_story&lt;/code&gt;, &lt;code&gt;publish_story&lt;/code&gt;, &lt;code&gt;archive_story&lt;/code&gt;, &lt;code&gt;list_stories&lt;/code&gt;, &lt;code&gt;get_story&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The agent doesn't need to know about routes, database rows, or state transitions. It calls &lt;code&gt;publish_story&lt;/code&gt; and the framework handles the rest: lifecycle validation, 404 enforcement for non-published content, sitemap update.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Ship rich tool semantics
&lt;/h2&gt;

&lt;p&gt;Anthropic's recommendation: use MCP's richer features to give agents better context about what tools do and what fields mean.&lt;/p&gt;

&lt;p&gt;Smeldr adds semantics at the struct level:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Story&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;smeldr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Node&lt;/span&gt;
    &lt;span class="n"&gt;Title&lt;/span&gt;   &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`smeldr:"required,min=3" smeldr_description:"The headline of the story"`&lt;/span&gt;
    &lt;span class="n"&gt;Excerpt&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`smeldr:"required"       smeldr_description:"1-2 sentences used in listing and as meta description"`&lt;/span&gt;
    &lt;span class="n"&gt;Body&lt;/span&gt;    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`smeldr:"required"       smeldr_format:"markdown"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;smeldr_description tells the agent what a field is for. smeldr_format tells it what format to use. These are baked into the MCP schema generated from the struct. Every tool call carries this context automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Standardised authentication
&lt;/h2&gt;

&lt;p&gt;Anthropic's recommendation: implement standardised auth to avoid unexpected re-authentication and enable fast first-time setup.&lt;/p&gt;

&lt;p&gt;Smeldr uses BearerHMAC tokens. Every MCP call is authenticated with a signed bearer token. Token management is available via MCP tools, so an agent with the right role can provision access for other agents.&lt;/p&gt;

&lt;p&gt;OAuth 2.0 is live - Claude.ai and ChatGPT connections both verified. For self-hosted deployments, token-based auth gets you running in minutes.&lt;/p&gt;




&lt;p&gt;That's the whole list. The problem made these answers obvious. It's always good when the spec agrees.&lt;/p&gt;

&lt;p&gt;Originally published on &lt;a href="https://smeldr.dev/devlog/anthropic-validation?utm_source=devto&amp;amp;utm_campaign=anthropic-validation" rel="noopener noreferrer"&gt;smeldr.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>ai</category>
      <category>mcp</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
