<?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: Minds</title>
    <description>The latest articles on DEV Community by Minds (@getminds).</description>
    <link>https://dev.to/getminds</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%2F4058394%2F1ef8bc03-2465-429c-bb7b-b198f8d67c6d.jpg</url>
      <title>DEV Community: Minds</title>
      <link>https://dev.to/getminds</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/getminds"/>
    <language>en</language>
    <item>
      <title>What it took to ship a production remote MCP server with OAuth 2.1</title>
      <dc:creator>Minds</dc:creator>
      <pubDate>Sat, 01 Aug 2026 19:48:50 +0000</pubDate>
      <link>https://dev.to/getminds/what-it-took-to-ship-a-production-remote-mcp-server-with-oauth-21-364c</link>
      <guid>https://dev.to/getminds/what-it-took-to-ship-a-production-remote-mcp-server-with-oauth-21-364c</guid>
      <description>&lt;p&gt;Publishing an MCP endpoint is easy. Making it behave consistently across clients is where the work starts.&lt;/p&gt;

&lt;p&gt;We recently shipped a hosted MCP server for Minds, an evidence-grounded synthetic market research platform. The server now connects to ChatGPT, Claude, Cursor, Google Antigravity, and clients that support Streamable HTTP.&lt;/p&gt;

&lt;p&gt;Here are the implementation lessons that mattered.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The transport endpoint is not a landing page
&lt;/h2&gt;

&lt;p&gt;Our MCP client URL is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://getminds.ai/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That URL speaks the protocol. A normal browser should instead reach an indexable setup guide. We therefore keep two explicit fields wherever a registry supports them: the remote transport URL for clients and &lt;code&gt;/mcp/setup&lt;/code&gt; for humans.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Accept both JSON and event-stream responses
&lt;/h2&gt;

&lt;p&gt;One early integration failed with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Not Acceptable: Client must accept text/event-stream
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The robust client request advertises both response types:&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;Accept: application/json, text/event-stream
Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our current endpoint successfully negotiates a JSON initialize response and returns an &lt;code&gt;Mcp-Session-Id&lt;/code&gt; for the session.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Let OAuth discovery do the work
&lt;/h2&gt;

&lt;p&gt;The initialize response points clients to OAuth protected-resource metadata. Clients that support dynamic registration can discover the flow without a copied client ID or secret. API keys remain available for environments that securely support custom bearer headers.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Keep tool schemas live and documentation descriptive
&lt;/h2&gt;

&lt;p&gt;The server currently exposes 15 tools across audiences, panels, durable studies, study drafts, summaries, method discovery, and export. Clients should inspect the live &lt;code&gt;tools/list&lt;/code&gt; response rather than hard-code schemas from an old article.&lt;/p&gt;

&lt;p&gt;Our public repository documents the role of every operation, but deliberately treats the running server as the schema authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Separate planning from durable execution
&lt;/h2&gt;

&lt;p&gt;For multi-question research, the client first calls &lt;code&gt;plan_panel_study&lt;/code&gt;. A human can review the plan before &lt;code&gt;run_panel_study&lt;/code&gt; starts a durable server-side run. The agent polls &lt;code&gt;get_panel_study&lt;/code&gt; instead of assuming a long task finished inside one chat turn.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. State the research boundary
&lt;/h2&gt;

&lt;p&gt;Synthetic panels are useful for an early decision-support pass: sharpening a question, surfacing objections, comparing plausible reactions, and deciding what deserves real-respondent validation. They are not representative human fieldwork.&lt;/p&gt;

&lt;p&gt;The repository and setup guide are public:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/minds-ai-co/minds-mcp" rel="noopener noreferrer"&gt;https://github.com/minds-ai-co/minds-mcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getminds.ai/mcp/setup?utm_source=content&amp;amp;utm_medium=content&amp;amp;utm_campaign=content-seo-mcp-reference&amp;amp;utm_content=dev-production-mcp-oauth" rel="noopener noreferrer"&gt;https://getminds.ai/mcp/setup?utm_source=content&amp;amp;utm_medium=content&amp;amp;utm_campaign=content-seo-mcp-reference&amp;amp;utm_content=dev-production-mcp-oauth&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you maintain a remote MCP server, I would be interested in the client-specific edge case that consumed the most time for you.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>api</category>
      <category>webdev</category>
      <category>security</category>
    </item>
  </channel>
</rss>
