<?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: PromptOT</title>
    <description>The latest articles on DEV Community by PromptOT (@promptot).</description>
    <link>https://dev.to/promptot</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%2F4009001%2Fda212af2-413d-4e9a-8dd6-251b8f6bbb93.jpg</url>
      <title>DEV Community: PromptOT</title>
      <link>https://dev.to/promptot</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/promptot"/>
    <language>en</language>
    <item>
      <title>PromptOT MCP: Manage and version LLM prompts from your AI tools</title>
      <dc:creator>PromptOT</dc:creator>
      <pubDate>Sat, 18 Jul 2026 11:03:46 +0000</pubDate>
      <link>https://dev.to/promptot/i-stopped-copy-pasting-prompts-into-chatgpt-heres-the-mcp-setup-that-replaced-it-co</link>
      <guid>https://dev.to/promptot/i-stopped-copy-pasting-prompts-into-chatgpt-heres-the-mcp-setup-that-replaced-it-co</guid>
      <description>&lt;h1&gt;
  
  
  PromptOT MCP: Manage and version LLM prompts from your AI tools
&lt;/h1&gt;

&lt;p&gt;Prompts often start as simple strings in code.&lt;/p&gt;

&lt;p&gt;Then the product grows.&lt;/p&gt;

&lt;p&gt;You add a better system prompt. Then a guardrail. Then a different version for production. Then a customer-specific variable. Then test cases. Then someone wants to roll back to the version from last week.&lt;/p&gt;

&lt;p&gt;At that point, prompts are no longer just text. They become part of the application layer.&lt;/p&gt;

&lt;p&gt;That is the problem PromptOT is built around.&lt;/p&gt;

&lt;p&gt;PromptOT is a prompt management platform for LLM applications. It lets teams build, version, evaluate, and deliver system prompts through an API without redeploying the app every time a prompt changes.&lt;/p&gt;

&lt;p&gt;The new part I want to share is the &lt;strong&gt;PromptOT MCP server&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It lets you manage your PromptOT prompts directly from MCP-compatible AI tools like Claude Desktop, Cursor, Codex, ChatGPT, claude.ai, and other clients.&lt;/p&gt;

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

&lt;p&gt;MCP stands for &lt;strong&gt;Model Context Protocol&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It gives AI tools a standard way to connect with external systems. Instead of only chatting with an assistant, you can give the assistant controlled tools for reading and changing real application data.&lt;/p&gt;

&lt;p&gt;For PromptOT, that means your AI assistant can help with things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;listing prompts&lt;/li&gt;
&lt;li&gt;editing prompt blocks&lt;/li&gt;
&lt;li&gt;managing variables&lt;/li&gt;
&lt;li&gt;saving drafts&lt;/li&gt;
&lt;li&gt;publishing versions&lt;/li&gt;
&lt;li&gt;rolling back versions&lt;/li&gt;
&lt;li&gt;creating test cases&lt;/li&gt;
&lt;li&gt;comparing prompt versions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not just to generate prompt text. The goal is to manage prompt operations as part of the development workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What PromptOT does
&lt;/h2&gt;

&lt;p&gt;PromptOT lets you structure prompts as versioned assets instead of hardcoded strings.&lt;/p&gt;

&lt;p&gt;A prompt can be composed from typed blocks, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;role&lt;/li&gt;
&lt;li&gt;context&lt;/li&gt;
&lt;li&gt;instructions&lt;/li&gt;
&lt;li&gt;guardrails&lt;/li&gt;
&lt;li&gt;output format&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also supports variables like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{customer_name}}
{{tone}}
{{product_context}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those variables can be resolved when your application fetches the prompt.&lt;/p&gt;

&lt;p&gt;So instead of redeploying your app every time you adjust a prompt, your app can fetch the latest published prompt through an API.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the MCP server adds
&lt;/h2&gt;

&lt;p&gt;The PromptOT MCP server exposes 23 tools across five areas:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;What you can do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prompts&lt;/td&gt;
&lt;td&gt;List, get, compile, create, update, and delete prompts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blocks&lt;/td&gt;
&lt;td&gt;Create, edit, delete, and reorder typed prompt blocks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variables&lt;/td&gt;
&lt;td&gt;Manage &lt;code&gt;{{key}}&lt;/code&gt; placeholders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versions&lt;/td&gt;
&lt;td&gt;Save drafts, publish, diff, and roll back&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test cases&lt;/td&gt;
&lt;td&gt;Create and manage prompt evaluation inputs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That makes it possible to work on prompts from inside the AI tools developers already use.&lt;/p&gt;

&lt;p&gt;For example, you can ask your assistant to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Show me the current support-agent prompt.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add a stricter refund-policy guardrail as a new block, but save it as a draft.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Compare this draft with the currently published version.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Publish the draft if the changes look safe.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The assistant is not just writing text in a chat window. It is using scoped PromptOT tools to work with real prompt objects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;The MCP package is available as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @prompt-ot/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will need a scoped PromptOT API key from your PromptOT dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Desktop
&lt;/h3&gt;

&lt;p&gt;Add this to your Claude Desktop MCP config:&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;"promptot"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@prompt-ot/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;"env"&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;"PROMPTOT_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pot_..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"PROMPTOT_MCP_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;"claude-desktop"&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;PromptOT also provides a desktop extension bundle for Claude Desktop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://www.promptot.com/downloads/promptot.mcpb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cursor
&lt;/h3&gt;

&lt;p&gt;Add this to your Cursor MCP config:&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;"promptot"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@prompt-ot/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;"env"&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;"PROMPTOT_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pot_..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"PROMPTOT_MCP_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;"cursor"&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;h3&gt;
  
  
  Codex CLI
&lt;/h3&gt;

&lt;p&gt;Add this to your Codex config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[mcp_servers.promptot]&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"npx"&lt;/span&gt;
&lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"@prompt-ot/mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;PROMPTOT_API_KEY&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"pot_..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;PROMPTOT_MCP_CLIENT&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"codex-cli"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Hosted MCP
&lt;/h3&gt;

&lt;p&gt;PromptOT also has a hosted MCP endpoint:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This can be used by clients that support hosted MCP connections with OAuth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example workflow
&lt;/h2&gt;

&lt;p&gt;Here is a realistic workflow.&lt;/p&gt;

&lt;p&gt;You are building an AI support agent. The current system prompt is hardcoded in your app. Every time you want to update the refund policy, escalation rules, or tone, you need to change code, open a pull request, wait for CI, and deploy.&lt;/p&gt;

&lt;p&gt;With PromptOT, you can move that system prompt into a managed prompt.&lt;/p&gt;

&lt;p&gt;You split it into blocks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Role
Context
Instructions
Refund policy
Escalation rules
Output format
Guardrails
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your app fetches the published version through the PromptOT API.&lt;/p&gt;

&lt;p&gt;Then, with the MCP server connected, you can ask your AI tool to help manage changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open the support-agent prompt and create a draft version with a stricter escalation rule for billing-related complaints.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Show me the diff between the published version and this draft.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a test case for an angry customer asking for a refund outside the refund window.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Publish the draft.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps prompt work closer to the tools where developers and AI engineers already think through changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Prompt management gets messy because prompts sit between product, engineering, support, and evaluation.&lt;/p&gt;

&lt;p&gt;They are not exactly code, but they affect production behavior like code.&lt;/p&gt;

&lt;p&gt;A few things become important quickly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who changed this prompt?&lt;/li&gt;
&lt;li&gt;What changed between versions?&lt;/li&gt;
&lt;li&gt;Which version is live?&lt;/li&gt;
&lt;li&gt;Can we roll back?&lt;/li&gt;
&lt;li&gt;Can we test this prompt before shipping it?&lt;/li&gt;
&lt;li&gt;Can we update prompts without redeploying the app?&lt;/li&gt;
&lt;li&gt;Can AI tools help maintain prompts safely?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PromptOT is designed around those questions.&lt;/p&gt;

&lt;p&gt;The MCP server adds another layer: instead of only clicking through a dashboard, you can let your AI development tools interact with the prompt system directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safety model
&lt;/h2&gt;

&lt;p&gt;PromptOT uses scoped API keys for MCP access.&lt;/p&gt;

&lt;p&gt;That matters because an MCP server can expose powerful actions. PromptOT separates tool capabilities so clients can understand whether a tool is read-only, destructive, or idempotent.&lt;/p&gt;

&lt;p&gt;The goal is to make prompt operations useful without turning every assistant action into an unsafe production change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://www.promptot.com" rel="noopener noreferrer"&gt;https://www.promptot.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP docs: &lt;a href="https://www.promptot.com/docs/mcp" rel="noopener noreferrer"&gt;https://www.promptot.com/docs/mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP tools reference: &lt;a href="https://www.promptot.com/docs/mcp/tools" rel="noopener noreferrer"&gt;https://www.promptot.com/docs/mcp/tools&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Desktop extension: &lt;a href="https://www.promptot.com/downloads/promptot.mcpb" rel="noopener noreferrer"&gt;https://www.promptot.com/downloads/promptot.mcpb&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/appdevexpert/prompt-ot" rel="noopener noreferrer"&gt;https://github.com/appdevexpert/prompt-ot&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;LLM apps are moving from simple prompt strings to real prompt infrastructure.&lt;/p&gt;

&lt;p&gt;Once prompts need versions, variables, publishing, rollback, evaluations, and team workflows, they deserve their own operational layer.&lt;/p&gt;

&lt;p&gt;PromptOT MCP is one step toward making prompt management feel native inside the AI tools developers already use.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>mcp</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Hardcoding LLM prompts is fine until it isn't. Here's what we built instead.</title>
      <dc:creator>PromptOT</dc:creator>
      <pubDate>Tue, 30 Jun 2026 06:53:54 +0000</pubDate>
      <link>https://dev.to/promptot/hardcoding-llm-prompts-is-fine-until-it-isnt-heres-what-we-built-instead-3g7b</link>
      <guid>https://dev.to/promptot/hardcoding-llm-prompts-is-fine-until-it-isnt-heres-what-we-built-instead-3g7b</guid>
      <description>&lt;p&gt;I had a bug last month that took most of a Saturday to find. A support bot we shipped started promising refund timelines that didn't match policy. Customer complaints, frantic Slack messages, the usual.&lt;/p&gt;

&lt;p&gt;The prompt had changed three weeks earlier. Nobody could remember why. Git blame pointed to a one-line edit inside a 200-line &lt;code&gt;SYSTEM_PROMPT&lt;/code&gt; constant. No PR description, no diff worth reading.&lt;/p&gt;

&lt;p&gt;That's when I knew I'd been writing prompts wrong for the last two years.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.promptot.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.promptot.com%2Fopengraph-image.jpg%3Fopengraph-image.5503fc36.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.promptot.com/" rel="noopener noreferrer" class="c-link"&gt;
            PromptOT - Prompt Management Platform
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Compose prompts from typed blocks, version safely, and deliver to your apps via API. The prompt management platform built for AI engineering teams.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.promptot.com%2Ffavicon.ico%3Ffavicon.70c146bd.ico" width="48" height="48"&gt;
          promptot.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Prompts are code, but we treat them like Notion docs
&lt;/h2&gt;

&lt;p&gt;A typical system prompt for anything useful crams five things into one string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a friendly support agent for Acme. Use this knowledge: {{kb}}.
Follow escalation rules. Never share internal ticket IDs. Reply in plain
text, two to four paragraphs.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a role, context, instructions, guardrails, and an output format all jammed together. When the PM wants to soften the tone, they're editing the same string an engineer uses to update the knowledge base. When security adds a guardrail, it lands inches from the response format. One bad edit and every reply ships broken.&lt;/p&gt;

&lt;p&gt;We wouldn't write code this way. So why are prompts always a 200-line &lt;code&gt;const&lt;/code&gt; somewhere in &lt;code&gt;lib/&lt;/code&gt;?&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.promptot.com" rel="noopener noreferrer"&gt;PromptOT&lt;/a&gt; is a prompt management platform. The core idea is small: typed blocks instead of flat strings.&lt;/p&gt;

&lt;p&gt;You break a prompt into pieces. Each piece has a type — role, context, instructions, guardrails, output_format, custom. Each one is independently editable, can be toggled on or off, and has its own version history. The compiler joins them into a single prompt string at delivery time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Block 1 — role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;are&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;support&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;agent&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Acme..."&lt;/span&gt;
&lt;span class="na"&gt;Block 2 — context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;       &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Knowledge&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;base:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{kb}}..."&lt;/span&gt;
&lt;span class="na"&gt;Block 3 — instructions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Acknowledge&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issue..."&lt;/span&gt;
&lt;span class="na"&gt;Block 4 — guardrails&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Never&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;share&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;internal&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ticket&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;IDs..."&lt;/span&gt;
&lt;span class="na"&gt;Block 5 — output_format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Plain&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;text,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;two&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;four&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;paragraphs..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the PM edits one block. The security review adds a guardrail without touching anything else. Each save is a version. Publishing a version makes it immutable. If something breaks in prod, you roll back from the dashboard in two clicks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The delivery layer
&lt;/h2&gt;

&lt;p&gt;Apps fetch the compiled prompt through a simple API. Production keys return the published version. Development keys return whatever draft is currently being iterated on. Variables resolve at fetch time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.promptot.com/api/v1/prompts/support-bot/compiled &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer pk_live_..."&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;'{"customer_name": "Maya", "kb": "..."}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No SDK to install. No prompt strings sitting in your codebase. Updating a prompt does not require a deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I'm proudest of
&lt;/h2&gt;

&lt;p&gt;PromptOT ships an MCP server with 23 tools, so your AI assistant can manage prompts for you. I can be in Claude Desktop or Cursor and say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Read my support-bot prompt and add a guardrail about not promising refund timelines.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude calls &lt;code&gt;get_prompt&lt;/code&gt;, drafts the change, and calls &lt;code&gt;save_draft_version&lt;/code&gt;. I review the diff and publish. The whole loop happens in chat. No tab-switching, no dashboard.&lt;/p&gt;

&lt;p&gt;claude.ai and ChatGPT connect via OAuth, so they never see a raw key. Other clients (Claude Desktop, Cursor, Codex CLI, Windsurf, Zed) get a scoped install snippet from the dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Free tier covers most side projects — 3 projects, 5 prompts each, 1,000 API calls a month, MCP included. No credit card.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://www.promptot.com" rel="noopener noreferrer"&gt;promptot.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://www.promptot.com/docs" rel="noopener noreferrer"&gt;promptot.com/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP install: &lt;a href="https://www.promptot.com/docs/mcp/install" rel="noopener noreferrer"&gt;promptot.com/docs/mcp/install&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your LLM prompts currently live as constants in a TypeScript file with a TODO from six months ago, you'll know what this fixes.&lt;/p&gt;

&lt;p&gt;What's the worst prompt bug you've shipped to production? Curious which patterns repeat.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>promptengineering</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
