<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Deploying your first MCP server on Krypton Runtime</title><link>https://www.kryptonhq.com/docs/tutorials/first-mcp/</link><description>Recent content in Deploying your first MCP server on Krypton Runtime</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://www.kryptonhq.com/docs/tutorials/first-mcp/index.xml" rel="self" type="application/rss+xml"/><item><title>HTTP server</title><link>https://www.kryptonhq.com/docs/tutorials/first-mcp/http/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.kryptonhq.com/docs/tutorials/first-mcp/http/</guid><description>&lt;p&gt;If your MCP server speaks MCP&amp;rsquo;s streamable-HTTP transport natively
(JSON-RPC 2.0 over HTTP POST), Krypton treats it like any other Agent.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ports refresher: client traffic to &lt;code&gt;:8080&lt;/code&gt; (gateway), introspection /
UI on &lt;code&gt;:8090&lt;/code&gt; (control plane). See &lt;a href="../../first-agent/#ports--endpoints--the-two-minute-mental-model"&gt;Ports &amp;amp; endpoints&lt;/a&gt;
for the full breakdown.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="container-contract"&gt;Container contract&lt;/h2&gt;
&lt;p&gt;Your container needs to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Listen on &lt;code&gt;spec.port&lt;/code&gt; (default &lt;code&gt;8080&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Accept &lt;code&gt;POST&lt;/code&gt; at &lt;code&gt;spec.invocationPath&lt;/code&gt; (default &lt;code&gt;/&lt;/code&gt;) with JSON-RPC 2.0 bodies&lt;/li&gt;
&lt;li&gt;Implement &lt;code&gt;initialize&lt;/code&gt;, &lt;code&gt;notifications/initialized&lt;/code&gt;, &lt;code&gt;tools/list&lt;/code&gt;, &lt;code&gt;tools/call&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Honor &lt;code&gt;Accept: text/event-stream&lt;/code&gt; if you want strict MCP clients
(Postman MCP, MCP Inspector) — return SSE frames when requested,
plain JSON otherwise&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="deploy"&gt;Deploy&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;apiVersion&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;krypton.ai/v1alpha1&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;kind&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;Agent&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;metadata&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;name&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;my-mcp&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;namespace&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;agents&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;spec&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;image&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;my-registry/my-mcp-server:v1&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;imagePullPolicy&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;IfNotPresent&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;protocol&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;mcp&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;port&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#0000cf;font-weight:bold"&gt;8080&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;invocationPath&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;/&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;mode&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;always-on&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;minReplicas&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;maxReplicas&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#0000cf;font-weight:bold"&gt;3&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply -f my-mcp.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The pod starts, the Service exposes it inside the cluster, the
operator UI surfaces its tools.&lt;/p&gt;</description></item><item><title>STDIO server</title><link>https://www.kryptonhq.com/docs/tutorials/first-mcp/stdio/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.kryptonhq.com/docs/tutorials/first-mcp/stdio/</guid><description>&lt;p&gt;Most published MCP servers (the official &lt;code&gt;@modelcontextprotocol/server-*&lt;/code&gt;
packages, plenty of community ones) only speak stdio. Krypton can host
them via &lt;code&gt;mcp-stdio-bridge&lt;/code&gt; — a tiny HTTP-in-front-of-stdio shim that
runs alongside your server inside the same container.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;pre class="mermaid"&gt;%%{init: {&amp;#34;theme&amp;#34;: &amp;#34;base&amp;#34;, &amp;#34;flowchart&amp;#34;: {&amp;#34;nodeSpacing&amp;#34;: 60, &amp;#34;rankSpacing&amp;#34;: 70, &amp;#34;diagramPadding&amp;#34;: 24}, &amp;#34;themeVariables&amp;#34;: {&amp;#34;fontFamily&amp;#34;: &amp;#34;Inter, ui-sans-serif, system-ui, sans-serif&amp;#34;, &amp;#34;primaryColor&amp;#34;: &amp;#34;#eef2ff&amp;#34;, &amp;#34;primaryTextColor&amp;#34;: &amp;#34;#1f2937&amp;#34;, &amp;#34;primaryBorderColor&amp;#34;: &amp;#34;#6366f1&amp;#34;, &amp;#34;lineColor&amp;#34;: &amp;#34;#64748b&amp;#34;, &amp;#34;secondaryColor&amp;#34;: &amp;#34;#ecfeff&amp;#34;, &amp;#34;tertiaryColor&amp;#34;: &amp;#34;#f8fafc&amp;#34;}}}%%
flowchart LR
 request[&amp;#34;HTTP POST /&amp;lt;br/&amp;gt;JSON-RPC&amp;#34;] --&amp;gt; bridge[&amp;#34;mcp-stdio-bridge&amp;#34;]
 bridge --&amp;gt; stdin[&amp;#34;Child stdin&amp;#34;]
 stdout[&amp;#34;Child stdout&amp;#34;] --&amp;gt; bridge
 bridge --&amp;gt; response[&amp;#34;HTTP response&amp;lt;br/&amp;gt;id-routed&amp;#34;]

 subgraph child[&amp;#34;Long-lived MCP process&amp;#34;]
 stdin --&amp;gt; process[&amp;#34;Server command&amp;#34;]
 process --&amp;gt; stdout
 end

 classDef traffic fill:#ecfeff,stroke:#0891b2,color:#164e63;
 classDef bridgeNode fill:#eef2ff,stroke:#6366f1,color:#312e81;
 classDef processNode fill:#f0fdf4,stroke:#16a34a,color:#14532d;
 class request,response traffic;
 class bridge bridgeNode;
 class stdin,stdout,process processNode;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;The bridge forks &lt;code&gt;$MCP_COMMAND&lt;/code&gt; &lt;strong&gt;once&lt;/strong&gt; at container startup.&lt;/li&gt;
&lt;li&gt;HTTP requests are serialized to the child&amp;rsquo;s stdin.&lt;/li&gt;
&lt;li&gt;Responses are demultiplexed by JSON-RPC &lt;code&gt;id&lt;/code&gt;, so concurrent HTTP
requests don&amp;rsquo;t cross-talk.&lt;/li&gt;
&lt;li&gt;Notifications (no &lt;code&gt;id&lt;/code&gt;) are fire-and-forget.&lt;/li&gt;
&lt;li&gt;One-shot stdio servers (process-per-call) aren&amp;rsquo;t supported — the
child must be long-lived.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="deploy"&gt;Deploy&lt;/h2&gt;
&lt;p&gt;The published bridge image is a pure-Go binary on &lt;code&gt;distroless/static&lt;/code&gt;.
That&amp;rsquo;s enough for stdio binaries that are themselves statically linked.
For runtime-dependent servers (Node, Python), layer the runtime onto a
derived image first.&lt;/p&gt;</description></item></channel></rss>