<?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>Your Prompt Is Production Logic So Why Are You Managing It Like Text?</title>
      <dc:creator>PromptOT</dc:creator>
      <pubDate>Wed, 12 Aug 2026 12:03:42 +0000</pubDate>
      <link>https://dev.to/promptot/your-prompt-is-production-logic-so-why-are-you-managing-it-like-text-3pl3</link>
      <guid>https://dev.to/promptot/your-prompt-is-production-logic-so-why-are-you-managing-it-like-text-3pl3</guid>
      <description>&lt;p&gt;AI applications often begin with a prompt stored directly inside the codebase:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;systemPrompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
You are a helpful customer-support assistant.
Answer the customer clearly and politely.
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works perfectly for an early prototype.&lt;/p&gt;

&lt;p&gt;But as the application grows, the prompt becomes more than a string. It starts controlling product behaviour:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What the AI is allowed to say&lt;/li&gt;
&lt;li&gt;How it handles sensitive requests&lt;/li&gt;
&lt;li&gt;When it should escalate to a human&lt;/li&gt;
&lt;li&gt;Which output format it must follow&lt;/li&gt;
&lt;li&gt;How reliably it responds to edge cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, changing a prompt is effectively changing production logic.&lt;/p&gt;

&lt;p&gt;Yet many teams continue managing prompts through hardcoded strings, documents, spreadsheets or provider playgrounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with hardcoded prompts
&lt;/h2&gt;

&lt;p&gt;Imagine that a product manager wants to make the support assistant more concise.&lt;/p&gt;

&lt;p&gt;The change may look harmless:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- Answer the customer clearly and politely.
&lt;/span&gt;&lt;span class="gi"&gt;+ Answer the customer in no more than three sentences.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But that small edit could affect refund explanations, security warnings or escalation instructions.&lt;/p&gt;

&lt;p&gt;The code diff tells us what changed, but it does not tell us how the AI’s behaviour changed.&lt;/p&gt;

&lt;p&gt;This creates several problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Every prompt change requires a deployment
&lt;/h3&gt;

&lt;p&gt;Even a one-line wording update may need a pull request, review, CI pipeline and application deployment.&lt;/p&gt;

&lt;p&gt;That makes prompt experimentation unnecessarily slow.&lt;/p&gt;

&lt;h3&gt;
  
  
  It is difficult to know which prompt is live
&lt;/h3&gt;

&lt;p&gt;Teams may have different versions in source code, staging environments, documents and model playgrounds.&lt;/p&gt;

&lt;p&gt;Eventually, someone asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which version is actually running in production?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer is often less obvious than it should be.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rollback is incomplete
&lt;/h3&gt;

&lt;p&gt;Git can restore the previous prompt text, but prompt behaviour also depends on variables, model configuration, test inputs and surrounding context.&lt;/p&gt;

&lt;p&gt;Restoring one string does not necessarily restore the complete working state.&lt;/p&gt;

&lt;h3&gt;
  
  
  Visual diffs cannot predict behavioural regressions
&lt;/h3&gt;

&lt;p&gt;A small wording change can create a large output difference.&lt;/p&gt;

&lt;p&gt;Traditional code review remains useful, but prompts also need behavioural testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat prompts as release artifacts
&lt;/h2&gt;

&lt;p&gt;A production prompt should have a lifecycle similar to application code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create → Test → Review → Version → Publish → Monitor → Roll back
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important change is separating the editable draft from the version used by the live application.&lt;/p&gt;

&lt;p&gt;A team should be able to experiment without immediately affecting production. When the new version is ready, it can be published deliberately.&lt;/p&gt;

&lt;p&gt;If the behaviour regresses, the previous version should remain available for immediate rollback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structure improves prompt reviews
&lt;/h2&gt;

&lt;p&gt;Large prompts are difficult to review when everything is stored in one text field.&lt;/p&gt;

&lt;p&gt;A more maintainable prompt can be divided into sections:&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
Guardrails
Output format
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Role:
You are a customer-support assistant for {{company_name}}.

Instructions:
Identify the customer’s problem and provide the next appropriate action.

Guardrails:
Never request passwords, card numbers or security codes.

Output format:
Return the category, escalation status and customer-facing response.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes changes easier to understand.&lt;/p&gt;

&lt;p&gt;If someone modifies the guardrails, reviewers can immediately see that the change affects safety rather than tone or formatting.&lt;/p&gt;

&lt;p&gt;Structured blocks are not intended to make prompts more complicated. They make the responsibility of each instruction clearer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test behaviour before publishing
&lt;/h2&gt;

&lt;p&gt;Prompt testing should include more than one ideal input.&lt;/p&gt;

&lt;p&gt;For a customer-support prompt, a useful test set might contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Normal request:
How can I update my billing address?

Edge case:
I was charged twice and need help immediately.

Security case:
Can I send you my password so you can inspect my account?

Off-topic case:
Write a poem about the weather.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected behaviour can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correct request classification&lt;/li&gt;
&lt;li&gt;Required words or information&lt;/li&gt;
&lt;li&gt;Forbidden content&lt;/li&gt;
&lt;li&gt;Escalation when appropriate&lt;/li&gt;
&lt;li&gt;A valid output structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tests will not prove that a prompt is perfect. They provide a repeatable signal that important behaviour has not been accidentally removed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delivery should not require redeployment
&lt;/h2&gt;

&lt;p&gt;After publishing a prompt, the application should retrieve the approved version through an API rather than requiring the prompt to be bundled into application code.&lt;/p&gt;

&lt;p&gt;Conceptually:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getPublishedPrompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;support-assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A production integration should also consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client-side caching&lt;/li&gt;
&lt;li&gt;Request timeouts&lt;/li&gt;
&lt;li&gt;Version pinning&lt;/li&gt;
&lt;li&gt;A last-known-good fallback&lt;/li&gt;
&lt;li&gt;Safe behaviour if the prompt service is unavailable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The objective is to make prompt updates faster without introducing unnecessary runtime risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where MCP fits
&lt;/h2&gt;

&lt;p&gt;Many developers now work from tools such as Claude, Cursor and Codex.&lt;/p&gt;

&lt;p&gt;The Model Context Protocol, or MCP, can let those tools interact with a prompt-management system using controlled operations.&lt;/p&gt;

&lt;p&gt;For example, a developer could ask their AI client to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Load the support assistant prompt, create three security test cases,
save a new draft and show me the changes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MCP does not replace versioning, permissions or review.&lt;/p&gt;

&lt;p&gt;It provides another interface to the same governed workflow. Changes should still be attributable, versioned and published deliberately.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we are building with PromptOT
&lt;/h2&gt;

&lt;p&gt;We built &lt;a href="https://www.promptot.com/" rel="noopener noreferrer"&gt;PromptOT&lt;/a&gt; around this production-prompt workflow.&lt;/p&gt;

&lt;p&gt;It provides a shared workspace where teams can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compose prompts using typed blocks&lt;/li&gt;
&lt;li&gt;Create reusable variables&lt;/li&gt;
&lt;li&gt;Save and compare versions&lt;/li&gt;
&lt;li&gt;Maintain test cases&lt;/li&gt;
&lt;li&gt;Run prompt evaluations&lt;/li&gt;
&lt;li&gt;Publish an approved version&lt;/li&gt;
&lt;li&gt;Deliver published prompts through an API&lt;/li&gt;
&lt;li&gt;Manage prompt workflows through compatible MCP clients&lt;/li&gt;
&lt;li&gt;Roll back when a change causes problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The aim is not to replace source control.&lt;/p&gt;

&lt;p&gt;Application code should remain in Git. PromptOT provides a dedicated lifecycle for the prompts that control AI behaviour and often need to evolve independently from application deployments.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical starting point
&lt;/h2&gt;

&lt;p&gt;You probably do not need a prompt-management platform if you have one prompt, one developer and no production users.&lt;/p&gt;

&lt;p&gt;The need becomes more visible when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple people modify prompts&lt;/li&gt;
&lt;li&gt;The application contains many prompts&lt;/li&gt;
&lt;li&gt;Prompts change frequently&lt;/li&gt;
&lt;li&gt;Non-developers contribute to prompt behaviour&lt;/li&gt;
&lt;li&gt;A bad prompt change can affect customers&lt;/li&gt;
&lt;li&gt;The team needs testing, controlled publishing or rollback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful first step is to identify the prompts currently controlling production behaviour.&lt;/p&gt;

&lt;p&gt;For each one, document:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Where is it stored?&lt;/li&gt;
&lt;li&gt;Who can change it?&lt;/li&gt;
&lt;li&gt;Which version is live?&lt;/li&gt;
&lt;li&gt;How is it tested?&lt;/li&gt;
&lt;li&gt;How would the team roll it back?&lt;/li&gt;
&lt;li&gt;What happens if its delivery system is unavailable?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If those questions are difficult to answer, the prompt has probably become a production asset without a production workflow.&lt;/p&gt;

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

&lt;p&gt;Prompts may look like text, but in an AI product they often function as application logic.&lt;/p&gt;

&lt;p&gt;Once a prompt can affect customers, revenue, safety or operational decisions, it deserves more than a copied string and a hopeful deployment.&lt;/p&gt;

&lt;p&gt;It deserves versioning, testing, controlled publishing and a reliable rollback path.&lt;/p&gt;

&lt;p&gt;We are actively developing this workflow in &lt;a href="https://www.promptot.com/" rel="noopener noreferrer"&gt;PromptOT&lt;/a&gt;, and I would be interested to hear how other teams currently manage production prompts.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>programming</category>
      <category>devtools</category>
    </item>
    <item>
      <title>The Prompt Versioning Nightmare (And How I Finally Fixed It With PromptOT)</title>
      <dc:creator>PromptOT</dc:creator>
      <pubDate>Sat, 08 Aug 2026 08:50:28 +0000</pubDate>
      <link>https://dev.to/promptot/the-prompt-versioning-nightmare-and-how-i-finally-fixed-it-with-promptot-5i1</link>
      <guid>https://dev.to/promptot/the-prompt-versioning-nightmare-and-how-i-finally-fixed-it-with-promptot-5i1</guid>
      <description>&lt;p&gt;If you've shipped anything serious with LLMs, you already know the feeling.&lt;/p&gt;

&lt;p&gt;You tweak a prompt. It works better. You commit it. Two weeks later, something breaks in production. You have no idea which version of the prompt is actually running, who changed what, or how to roll back without rewriting three files.&lt;/p&gt;

&lt;p&gt;Welcome to the prompt versioning problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Prompts are code. They control model behavior the same way a function controls program behavior. But we treat them like magic strings buried inside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python files as multi-line f-strings&lt;/li&gt;
&lt;li&gt;YAML configs that nobody remembers editing&lt;/li&gt;
&lt;li&gt;Notion pages that drift from reality within a week&lt;/li&gt;
&lt;li&gt;Slack messages ("hey, use this new system prompt")&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;prompts/&lt;/code&gt; folder with 47 versions and zero context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's what breaks when prompts live like this:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. No version history that actually means anything
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;git blame&lt;/code&gt; tells you &lt;em&gt;who&lt;/em&gt; changed a prompt, but not &lt;em&gt;why&lt;/em&gt; it was changed, whether it was tested, or whether the change made outputs better or worse.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. No safe rollback
&lt;/h3&gt;

&lt;p&gt;Prod breaks at 2 AM. Which prompt was live yesterday? Was it the one on &lt;code&gt;main&lt;/code&gt;, the hotfix branch, or the one that got hardcoded during last week's demo? Good luck.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Fragmented reusability
&lt;/h3&gt;

&lt;p&gt;You end up copy-pasting the same "tone of voice" instructions across 12 prompts. Update one, forget the other 11.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. No environment separation
&lt;/h3&gt;

&lt;p&gt;The prompt in staging is subtly different from prod. You only find out when a customer screenshots the output.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Testing is theater
&lt;/h3&gt;

&lt;p&gt;You "tested it" by running it once in a notebook. There's no regression suite, no diff between versions, no way to know if v7 is actually better than v6.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Non-engineers are locked out
&lt;/h3&gt;

&lt;p&gt;Your PM knows the prompt is wrong but can't fix a typo without opening a PR and pinging you on Slack.&lt;/p&gt;

&lt;p&gt;Sound familiar? Yeah. Same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter PromptOT
&lt;/h2&gt;

&lt;p&gt;I started using &lt;a href="https://promptot.ai" rel="noopener noreferrer"&gt;PromptOT&lt;/a&gt; after getting fed up with maintaining prompts across three services. The pitch is simple: &lt;strong&gt;treat prompts like first-class versioned artifacts, with the tooling engineers already expect for code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what actually clicked for me.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompts as versioned entities
&lt;/h3&gt;

&lt;p&gt;Every prompt gets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A stable ID&lt;/li&gt;
&lt;li&gt;A version history (draft to published to rollback-able)&lt;/li&gt;
&lt;li&gt;A diff view between any two versions&lt;/li&gt;
&lt;li&gt;A published version that's what your app actually pulls at runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No more "which one is live?" You publish a version explicitly. That's the one running. Full stop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v1 (published) --&amp;gt; v2 (draft) --&amp;gt; v3 (published, live)
                                  ^
                                  rollback here if v3 misbehaves
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Blocks: prompts you can compose
&lt;/h3&gt;

&lt;p&gt;This was the game-changer for me. Instead of copy-pasting shared instructions across prompts, you define &lt;strong&gt;blocks&lt;/strong&gt; — reusable prompt fragments — and compose them into full prompts.&lt;/p&gt;

&lt;p&gt;Change the "tone of voice" block once. Every prompt that references it picks up the update on the next publish.&lt;/p&gt;

&lt;p&gt;It's basically DRY, but for prompts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variables
&lt;/h3&gt;

&lt;p&gt;Prompts almost always have dynamic parts: user name, product catalog, current date, whatever. PromptOT lets you declare variables explicitly, so the prompt template is clean and the runtime substitution is auditable.&lt;/p&gt;

&lt;p&gt;No more string-concatenation spaghetti.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test cases attached to the prompt
&lt;/h3&gt;

&lt;p&gt;You can attach test cases directly to a prompt. Each test case has inputs and an expected shape of output. Before publishing v7, you run the suite. If v7 regresses on cases v6 passed, you know before your users do.&lt;/p&gt;

&lt;p&gt;This is the part I wish I'd had two years ago.&lt;/p&gt;

&lt;h3&gt;
  
  
  Draft versions
&lt;/h3&gt;

&lt;p&gt;You can save a draft, iterate on it, share the link with a teammate, and only publish when it's actually ready. Draft is not live. Only explicit publish flips the switch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compiled prompt endpoint
&lt;/h3&gt;

&lt;p&gt;Your app doesn't care about blocks and variables at runtime — it just wants the final string. PromptOT exposes a "compiled prompt" endpoint that gives you the fully-assembled prompt for the currently published version, with variables filled in.&lt;/p&gt;

&lt;p&gt;Your app code goes from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;system_prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are a helpful assistant for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;company_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.
Your tone should be &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tone&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fifty_more_lines_of_instructions&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
Today&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s date is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;system_prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;promptot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_compiled_prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;prompt_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customer-support-agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;variables&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;company_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prompt logic lives in PromptOT. App code just calls it. Clean.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Workflow That Finally Works
&lt;/h2&gt;

&lt;p&gt;Here's what my day-to-day looks like now:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;PM spots a wording issue.&lt;/strong&gt; They open the prompt in PromptOT and save a draft. No PR needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I review the draft.&lt;/strong&gt; I see a diff against the published version. I know exactly what changed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I run the test cases.&lt;/strong&gt; If they pass, I publish. If they regress, we iterate on the draft.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Published version goes live.&lt;/strong&gt; App picks it up on the next call — no redeploy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Something goes wrong?&lt;/strong&gt; One-click rollback to the previous published version. Prod is stable while we investigate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. No merge conflicts on prompts. No 2 AM confusion about what's running. No "hey can you push the new prompt for me."&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters More Every Month
&lt;/h2&gt;

&lt;p&gt;LLMs aren't getting less central to what we build. Every product I've shipped in the last year has 5-20 prompts running behind the scenes. Some have more.&lt;/p&gt;

&lt;p&gt;At that scale, treating prompts as loose strings in code isn't sustainable. You need the same primitives you have for code: versions, diffs, rollbacks, tests, reusability.&lt;/p&gt;

&lt;p&gt;PromptOT gives you exactly that. It's the piece I didn't know I needed until I had it, and now I can't imagine going back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;If any of this hit close to home, try it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign up at &lt;a href="https://promptot.ai" rel="noopener noreferrer"&gt;promptot.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create your first prompt&lt;/li&gt;
&lt;li&gt;Break it into blocks and variables&lt;/li&gt;
&lt;li&gt;Publish v1, then iterate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mental shift from "prompts are strings" to "prompts are versioned artifacts" takes about a day. The productivity gain lasts forever.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you've got your own war stories about prompt versioning going sideways, drop them in the comments — I want to hear how everyone else has been suffering through this.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>promptengineering</category>
      <category>devops</category>
    </item>
    <item>
      <title>Who Owns the Production Prompt?</title>
      <dc:creator>PromptOT</dc:creator>
      <pubDate>Thu, 06 Aug 2026 08:57:45 +0000</pubDate>
      <link>https://dev.to/promptot/who-owns-the-production-prompt-3le</link>
      <guid>https://dev.to/promptot/who-owns-the-production-prompt-3le</guid>
      <description>&lt;p&gt;A production prompt rarely belongs to one person for long.&lt;/p&gt;

&lt;p&gt;An engineer writes the first version. Product changes the tone. Support adds escalation rules. Legal adds restrictions. Another engineer updates the output schema. Six weeks later, everyone has edited the prompt, but nobody truly owns it.&lt;/p&gt;

&lt;p&gt;The result is usually one enormous string that looks something like this:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;systemPrompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
You are a helpful support assistant...

Follow these product rules...

Never make these claims...

Escalate when...

Return JSON in this exact format...
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Technically, it works. Organizationally, it is a mess.&lt;/p&gt;

&lt;p&gt;The problem is not only where the prompt is stored. The bigger problem is that several teams own different parts of its behaviour, but the prompt provides no boundaries between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  One prompt, several owners
&lt;/h2&gt;

&lt;p&gt;Consider a customer-support assistant.&lt;/p&gt;

&lt;p&gt;Different parts of its prompt naturally belong to different people:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Role:&lt;/strong&gt; Product defines the assistant's purpose and personality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context:&lt;/strong&gt; Support or operations provides policies and domain knowledge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instructions:&lt;/strong&gt; Product and engineering define the workflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guardrails:&lt;/strong&gt; Legal, security, and support define what must never happen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output format:&lt;/strong&gt; Engineering owns the contract consumed by the application.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When all of this lives inside one text field, every edit becomes risky.&lt;/p&gt;

&lt;p&gt;A marketing teammate changing the tone can accidentally modify a formatting instruction. An engineer updating JSON fields can remove a policy sentence. Legal cannot easily review only the restrictions that matter to them.&lt;/p&gt;

&lt;p&gt;The prompt is shared, but its ownership is invisible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop treating the prompt as one document
&lt;/h2&gt;

&lt;p&gt;A more maintainable approach is to compose a prompt from typed blocks.&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;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;You are a customer-support assistant for Acme.&lt;/span&gt;

&lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;Refunds are available within 30 days of purchase.&lt;/span&gt;

&lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;Answer the customer's question and suggest the next action.&lt;/span&gt;

&lt;span class="na"&gt;guardrails&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;Never promise a refund before verifying the purchase date.&lt;/span&gt;
  &lt;span class="s"&gt;Escalate threats, chargebacks, and legal complaints.&lt;/span&gt;

&lt;span class="na"&gt;output_format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;Return JSON containing message, category, and needs_escalation.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The compiled prompt sent to the model may still be plain text. The important difference is how the team authors and manages it.&lt;/p&gt;

&lt;p&gt;Each block now has a clear purpose. Reviews become more focused, changes are easier to understand, and ownership can follow the structure of the prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use ownership boundaries, not editing restrictions
&lt;/h2&gt;

&lt;p&gt;The goal is not to prevent non-engineers from touching prompts.&lt;/p&gt;

&lt;p&gt;Domain experts often understand the desired behaviour better than the engineer implementing the application. Support knows which questions cause trouble. Legal knows which claims introduce risk. Product knows how the assistant should communicate.&lt;/p&gt;

&lt;p&gt;The goal is to let each person contribute without making every change an uncontrolled production change.&lt;/p&gt;

&lt;p&gt;A lightweight ownership model can look like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prompt area&lt;/th&gt;
&lt;th&gt;Primary owner&lt;/th&gt;
&lt;th&gt;Typical reviewer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Role and tone&lt;/td&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;td&gt;Marketing or support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business context&lt;/td&gt;
&lt;td&gt;Domain expert&lt;/td&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instructions&lt;/td&gt;
&lt;td&gt;Product and engineering&lt;/td&gt;
&lt;td&gt;Domain expert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guardrails&lt;/td&gt;
&lt;td&gt;Legal, security, or support&lt;/td&gt;
&lt;td&gt;Engineering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output format&lt;/td&gt;
&lt;td&gt;Engineering&lt;/td&gt;
&lt;td&gt;API consumer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This does not need to become a complicated approval matrix. Even documenting the primary owner of each area removes a surprising amount of confusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate personal experiments from shared assets
&lt;/h2&gt;

&lt;p&gt;Teams also need a simple way to decide which prompts are official.&lt;/p&gt;

&lt;p&gt;We have found it useful to think in three levels:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Personal drafts
&lt;/h3&gt;

&lt;p&gt;These are experiments. People should be able to try new instructions, tones, and examples without asking for approval.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Team or project prompts
&lt;/h3&gt;

&lt;p&gt;These prompts are shared within a product or department. They have an owner, version history, and saved test cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Organization-approved templates
&lt;/h3&gt;

&lt;p&gt;These are reusable starting points for common workflows such as summarization, support, extraction, content review, or code review.&lt;/p&gt;

&lt;p&gt;They should be curated. A shared template without an owner eventually becomes another abandoned document that nobody trusts.&lt;/p&gt;

&lt;p&gt;This model keeps experimentation fast while making official prompts easy to discover.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version the decision, not only the text
&lt;/h2&gt;

&lt;p&gt;A useful version history should explain more than which words changed.&lt;/p&gt;

&lt;p&gt;For every published prompt version, a team should be able to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who made the change?&lt;/li&gt;
&lt;li&gt;Why was it changed?&lt;/li&gt;
&lt;li&gt;Which blocks changed?&lt;/li&gt;
&lt;li&gt;Which test cases were run?&lt;/li&gt;
&lt;li&gt;What was approved for production?&lt;/li&gt;
&lt;li&gt;Which version should we restore if behaviour regresses?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Git can still manage the application code and tool implementations. But a commit diff alone rarely explains why a domain expert changed an escalation rule or whether the updated prompt still behaves correctly.&lt;/p&gt;

&lt;p&gt;That context belongs with the prompt version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publishing should be an explicit action
&lt;/h2&gt;

&lt;p&gt;Saving a draft and publishing to production should not be the same action.&lt;/p&gt;

&lt;p&gt;A safer workflow 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;Edit a block
    ↓
Review the focused diff
    ↓
Run saved test cases
    ↓
Approve the candidate
    ↓
Publish an immutable version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Production continues using the previous published version while the team edits and tests the draft.&lt;/p&gt;

&lt;p&gt;This is what allows collaboration without making collaboration dangerous.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test responsibilities, not just examples
&lt;/h2&gt;

&lt;p&gt;The ownership model should also influence the test suite.&lt;/p&gt;

&lt;p&gt;Engineering may add tests that validate the output schema. Support may add common customer scenarios. Legal may contribute cases that verify prohibited claims. Product may test tone and helpfulness.&lt;/p&gt;

&lt;p&gt;For example:&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;"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;"Refund outside the allowed window"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"I bought this 60 days ago. Can you refund it?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expected_behaviour"&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="s2"&gt;"Does not promise a refund"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Explains the 30-day policy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Offers an escalation path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Returns the required JSON fields"&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;Now the test suite represents the expectations of the whole team, not only the person who originally wrote the prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we are building with PromptOT
&lt;/h2&gt;

&lt;p&gt;This collaboration problem is a major reason we are building &lt;a href="https://www.promptot.com" rel="noopener noreferrer"&gt;PromptOT&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;PromptOT treats prompts as structured, shared production assets instead of opaque text fields. Teams can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compose prompts from typed blocks&lt;/li&gt;
&lt;li&gt;Start from reusable templates&lt;/li&gt;
&lt;li&gt;Work with variables instead of duplicated prompt copies&lt;/li&gt;
&lt;li&gt;Keep draft and published states separate&lt;/li&gt;
&lt;li&gt;Compare version history&lt;/li&gt;
&lt;li&gt;Attach reusable test cases&lt;/li&gt;
&lt;li&gt;Run evaluations before publishing&lt;/li&gt;
&lt;li&gt;Roll back to a previous version&lt;/li&gt;
&lt;li&gt;Deliver compiled prompts through an API&lt;/li&gt;
&lt;li&gt;Manage prompts from supported AI tools through MCP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application still owns its code. PromptOT owns the prompt lifecycle.&lt;/p&gt;

&lt;p&gt;That boundary is intentional. Prompt management should complement Git, not attempt to replace it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a simple ownership exercise
&lt;/h2&gt;

&lt;p&gt;You do not need new infrastructure to improve prompt ownership today.&lt;/p&gt;

&lt;p&gt;Take one important production prompt and divide it into five sections:&lt;/p&gt;

&lt;ol&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;/ol&gt;

&lt;p&gt;Then assign a primary owner to each section and create one test case for every important responsibility.&lt;/p&gt;

&lt;p&gt;You will quickly discover where requirements conflict, which instructions are duplicated, and which parts of the prompt nobody understands well enough to own.&lt;/p&gt;

&lt;p&gt;That exercise is valuable even if the prompt remains in a file for now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompts are collaborative interfaces
&lt;/h2&gt;

&lt;p&gt;The best production prompts are not written once by a single prompt engineer.&lt;/p&gt;

&lt;p&gt;They evolve through input from engineering, product, support, operations, security, and domain experts. The tooling should make those contributions safer and easier to review.&lt;/p&gt;

&lt;p&gt;When prompt ownership is clear, teams can move faster without losing control of production behaviour.&lt;/p&gt;

&lt;p&gt;The question is no longer simply, "Where should we store the prompt?"&lt;/p&gt;

&lt;p&gt;The better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How can everyone responsible for the AI's behaviour contribute without accidentally breaking someone else's contract?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the workflow prompt-management tools need to solve.&lt;/p&gt;




&lt;p&gt;PromptOT is a structured prompt-management platform for teams building production LLM applications. Learn more at &lt;a href="https://www.promptot.com" rel="noopener noreferrer"&gt;promptot.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title># We Added MCP to PromptOT: Manage Production Prompts from Claude, Cursor, and Codex</title>
      <dc:creator>PromptOT</dc:creator>
      <pubDate>Mon, 03 Aug 2026 08:46:34 +0000</pubDate>
      <link>https://dev.to/promptot/-we-added-mcp-to-promptot-manage-production-prompts-from-claude-cursor-and-codex-134d</link>
      <guid>https://dev.to/promptot/-we-added-mcp-to-promptot-manage-production-prompts-from-claude-cursor-and-codex-134d</guid>
      <description>&lt;p&gt;Developers increasingly use Claude, Cursor and Codex to write, review and improve application code.&lt;/p&gt;

&lt;p&gt;But when those applications depend on production LLM prompts, there is usually a disconnect.&lt;/p&gt;

&lt;p&gt;Your AI coding assistant can modify the application, but it cannot safely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Find the production prompt&lt;/li&gt;
&lt;li&gt;Understand its current version&lt;/li&gt;
&lt;li&gt;Update a specific prompt section&lt;/li&gt;
&lt;li&gt;Create a draft&lt;/li&gt;
&lt;li&gt;Compare versions&lt;/li&gt;
&lt;li&gt;Add test cases&lt;/li&gt;
&lt;li&gt;Publish an approved version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The developer must leave the AI tool, open a separate dashboard, locate the prompt and repeat the change manually.&lt;/p&gt;

&lt;p&gt;We wanted to remove that context switch.&lt;/p&gt;

&lt;p&gt;That is why we added a Model Context Protocol server to &lt;a href="https://www.promptot.com" rel="noopener noreferrer"&gt;PromptOT&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;PromptOT MCP lets compatible AI assistants work directly with your PromptOT workspace through structured tools and scoped permissions.&lt;/p&gt;

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

&lt;p&gt;PromptOT is a prompt management platform for production LLM applications.&lt;/p&gt;

&lt;p&gt;Instead of keeping system prompts as hardcoded strings, PromptOT lets teams manage them as structured assets.&lt;/p&gt;

&lt;p&gt;A prompt can contain separate blocks for:&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;Examples&lt;/li&gt;
&lt;li&gt;Guardrails&lt;/li&gt;
&lt;li&gt;Output format&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teams can version these prompts, create test cases, run evaluations and publish approved versions.&lt;/p&gt;

&lt;p&gt;Applications retrieve the compiled prompt through an API, allowing prompts to be updated without redeploying the application.&lt;/p&gt;

&lt;p&gt;The dashboard remains useful for visual editing and review. But developers increasingly work inside AI-assisted tools, so we wanted PromptOT to be accessible there as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why MCP?
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol gives AI clients a standard way to communicate with external tools and data sources.&lt;/p&gt;

&lt;p&gt;Without MCP, connecting an assistant to PromptOT would require a custom integration for every client.&lt;/p&gt;

&lt;p&gt;We would need one integration for Claude, another for Cursor, another for Codex and potentially another for every future AI tool.&lt;/p&gt;

&lt;p&gt;With MCP, PromptOT exposes one structured tool catalog.&lt;/p&gt;

&lt;p&gt;Any compatible client can discover those tools, understand their input schemas and call them when the user makes a natural-language request.&lt;/p&gt;

&lt;p&gt;The flow 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;Developer
   ↓
Claude, Cursor or Codex
   ↓
PromptOT MCP server
   ↓
Authenticated PromptOT API
   ↓
Prompt workspace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI assistant does not receive unrestricted database access. It can only call the PromptOT operations exposed through its authorized MCP connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  What can PromptOT MCP do?
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  Prompt management
&lt;/h3&gt;

&lt;p&gt;The assistant can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List prompts&lt;/li&gt;
&lt;li&gt;Get a prompt and its current state&lt;/li&gt;
&lt;li&gt;Retrieve the compiled prompt&lt;/li&gt;
&lt;li&gt;Create a prompt&lt;/li&gt;
&lt;li&gt;Update prompt metadata&lt;/li&gt;
&lt;li&gt;Delete a prompt with explicit confirmation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;List all prompts in my PromptOT workspace related to customer support.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Block management
&lt;/h3&gt;

&lt;p&gt;The assistant can work with the structured sections inside a prompt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List blocks&lt;/li&gt;
&lt;li&gt;Create a block&lt;/li&gt;
&lt;li&gt;Update a block&lt;/li&gt;
&lt;li&gt;Delete a block&lt;/li&gt;
&lt;li&gt;Reorder blocks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&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 customer-support prompt and add a guardrail that
prevents the assistant from requesting passwords or complete
payment information.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI client can find the prompt, inspect its current blocks and make the appropriate structured change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variable management
&lt;/h3&gt;

&lt;p&gt;PromptOT supports runtime variables such as:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Through MCP, an assistant can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List variables&lt;/li&gt;
&lt;li&gt;Add or update variables&lt;/li&gt;
&lt;li&gt;Delete variables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&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 tone variable to the onboarding-assistant prompt with
“friendly” as its default value.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Version management
&lt;/h3&gt;

&lt;p&gt;Prompt changes should not silently replace production behaviour.&lt;/p&gt;

&lt;p&gt;PromptOT MCP includes tools to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List versions&lt;/li&gt;
&lt;li&gt;Save a draft version&lt;/li&gt;
&lt;li&gt;Publish a version&lt;/li&gt;
&lt;li&gt;Roll back to an earlier version&lt;/li&gt;
&lt;li&gt;Compare two versions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A developer can ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Save the current customer-support prompt as a new draft version.
Use “Added billing escalation guardrail” as the changelog note.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Compare the current draft with the published version and
summarize the behavioural differences.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Test-case management
&lt;/h3&gt;

&lt;p&gt;AI assistants can also manage PromptOT test cases.&lt;/p&gt;

&lt;p&gt;Available operations include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List test cases&lt;/li&gt;
&lt;li&gt;Create a test case&lt;/li&gt;
&lt;li&gt;Update a test case&lt;/li&gt;
&lt;li&gt;Delete a test case&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inspect the support-agent prompt and create three test cases:

1. A normal product question
2. A billing escalation
3. An off-topic request

Check the existing test cases first and do not create duplicates.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The cases are saved to the same PromptOT prompt and become available to the rest of the team.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real workflow from Claude
&lt;/h2&gt;

&lt;p&gt;Suppose we have a prompt named &lt;code&gt;support-agent&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It contains a Role block and an Instructions block, but it does not have a strong guardrail for billing disputes.&lt;/p&gt;

&lt;p&gt;Inside Claude, we can ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Using PromptOT, inspect the support-agent prompt.

Add a guardrail requiring refund requests and duplicate-charge
reports to be escalated to a human. Do not change any other
prompt blocks.

Save the result as a new draft version with a clear changelog note.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude can use PromptOT MCP to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the prompt&lt;/li&gt;
&lt;li&gt;Read its blocks&lt;/li&gt;
&lt;li&gt;Create or update the guardrail block&lt;/li&gt;
&lt;li&gt;Save a new draft version&lt;/li&gt;
&lt;li&gt;Return the result to the user&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The same workflow can be performed from Cursor or Codex.&lt;/p&gt;

&lt;p&gt;The prompt remains inside PromptOT, with its structure and history preserved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing PromptOT MCP
&lt;/h2&gt;

&lt;p&gt;PromptOT supports local and hosted MCP connections.&lt;/p&gt;

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

&lt;p&gt;The easiest Claude Desktop installation is the PromptOT Desktop Extension.&lt;/p&gt;

&lt;p&gt;Download it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.promptot.com/downloads/promptot.mcpb" rel="noopener noreferrer"&gt;Download PromptOT for Claude Desktop&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open the downloaded file, and Claude Desktop will guide you through the installation.&lt;/p&gt;

&lt;p&gt;A manual configuration is also available:&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;"your_promptot_mcp_key"&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;h3&gt;
  
  
  Cursor
&lt;/h3&gt;

&lt;p&gt;Add PromptOT to your Cursor MCP configuration:&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;"your_promptot_mcp_key"&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 PromptOT to the Codex configuration:&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;"your_promptot_mcp_key"&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;p&gt;The MCP package can also be launched directly:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Browser-based clients can use PromptOT’s hosted MCP endpoint with OAuth:&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;Complete installation instructions are available in the &lt;a href="https://www.promptot.com/docs/mcp" rel="noopener noreferrer"&gt;PromptOT MCP documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing MCP access safely
&lt;/h2&gt;

&lt;p&gt;Giving an AI assistant access to production prompt management requires clear boundaries.&lt;/p&gt;

&lt;p&gt;We designed PromptOT MCP around several safety principles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scoped keys
&lt;/h3&gt;

&lt;p&gt;MCP keys can be limited to the permissions they need.&lt;/p&gt;

&lt;p&gt;A read-only assistant does not need permission to modify or publish prompts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conservative defaults
&lt;/h3&gt;

&lt;p&gt;New MCP keys use development-oriented defaults. Publishing access must be granted intentionally.&lt;/p&gt;

&lt;h3&gt;
  
  
  Explicit destructive actions
&lt;/h3&gt;

&lt;p&gt;Delete operations are marked as destructive and require explicit confirmation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Audit history
&lt;/h3&gt;

&lt;p&gt;MCP-originated changes include client information, allowing teams to understand where each mutation came from.&lt;/p&gt;

&lt;h3&gt;
  
  
  Immediate revocation
&lt;/h3&gt;

&lt;p&gt;An MCP key can be revoked from PromptOT. Future requests using that key will be rejected.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structured tool schemas
&lt;/h3&gt;

&lt;p&gt;Every MCP tool has a defined input schema.&lt;/p&gt;

&lt;p&gt;The assistant cannot send arbitrary database operations or execute unrestricted code through the PromptOT MCP server.&lt;/p&gt;

&lt;p&gt;These boundaries are important because MCP should make development faster without removing control from the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP does not replace the PromptOT API
&lt;/h2&gt;

&lt;p&gt;PromptOT supports two complementary paths.&lt;/p&gt;

&lt;h3&gt;
  
  
  The API is for applications
&lt;/h3&gt;

&lt;p&gt;A production application retrieves its compiled prompt at runtime:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PromptOT&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@prompt-ot/sdk&lt;/span&gt;&lt;span class="dl"&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;promptot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PromptOT&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PROMPTOT_API_KEY&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;promptot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prompts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;support-agent&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;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;user_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alex&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Pro&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;tone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;friendly&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="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application can send the resulting prompt to its selected model provider:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&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;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userMessage&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PromptOT returns a compiled string, so the application is not locked into one model provider.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP is for AI-assisted development workflows
&lt;/h3&gt;

&lt;p&gt;Claude, Cursor or Codex uses MCP to help developers manage prompt resources through natural language.&lt;/p&gt;

&lt;p&gt;The API serves the application.&lt;/p&gt;

&lt;p&gt;MCP serves the developer’s AI tools.&lt;/p&gt;

&lt;p&gt;Both operate on the same PromptOT source of truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we learned while building the MCP server
&lt;/h2&gt;

&lt;p&gt;Building an MCP server is not only about wrapping REST endpoints.&lt;/p&gt;

&lt;p&gt;A useful MCP implementation also needs careful tool and permission design.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clear tool boundaries
&lt;/h3&gt;

&lt;p&gt;A small, predictable tool is easier for an AI assistant to use correctly than one large operation with many unrelated behaviours.&lt;/p&gt;

&lt;p&gt;For example, PromptOT provides separate tools for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updating a block&lt;/li&gt;
&lt;li&gt;Reordering blocks&lt;/li&gt;
&lt;li&gt;Saving a draft version&lt;/li&gt;
&lt;li&gt;Publishing a version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the assistant’s intended action easier to understand and audit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Human-readable descriptions
&lt;/h3&gt;

&lt;p&gt;The model relies on tool descriptions to decide which operation it should call.&lt;/p&gt;

&lt;p&gt;Tool descriptions are therefore part of the product interface, not merely internal documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Safe defaults
&lt;/h3&gt;

&lt;p&gt;Read operations, mutations and destructive operations should be clearly distinguished.&lt;/p&gt;

&lt;p&gt;An AI client should understand whether a tool only retrieves information or permanently changes a resource.&lt;/p&gt;

&lt;h3&gt;
  
  
  Controlled payload sizes
&lt;/h3&gt;

&lt;p&gt;Compiled prompts can become large.&lt;/p&gt;

&lt;p&gt;An MCP server must return enough context for the assistant to complete its task without flooding the model context window with unnecessary data.&lt;/p&gt;

&lt;p&gt;PromptOT supports prompt truncation controls when retrieving large compiled prompts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consistent transports
&lt;/h3&gt;

&lt;p&gt;Local clients such as Claude Desktop, Cursor and Codex work well with a standard input/output MCP transport.&lt;/p&gt;

&lt;p&gt;Browser-based clients require a hosted HTTP transport with authentication.&lt;/p&gt;

&lt;p&gt;Both transports should expose the same tool catalog so the assistant receives consistent PromptOT capabilities regardless of where it is running.&lt;/p&gt;

&lt;h2&gt;
  
  
  One prompt workspace across every tool
&lt;/h2&gt;

&lt;p&gt;PromptOT MCP creates a workflow where the dashboard, application and AI development tools operate on the same prompt resources.&lt;/p&gt;

&lt;p&gt;A prompt edited from Claude appears in PromptOT’s history.&lt;/p&gt;

&lt;p&gt;A test case created from Cursor becomes available to the team.&lt;/p&gt;

&lt;p&gt;A version prepared from Codex can still be reviewed before it is published.&lt;/p&gt;

&lt;p&gt;The goal is not to move prompt management into one specific AI client.&lt;/p&gt;

&lt;p&gt;The goal is to maintain one source of truth while allowing developers to work from the tools they already use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example MCP workflows
&lt;/h2&gt;

&lt;p&gt;After connecting PromptOT, start with something simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;List my PromptOT prompts and explain the purpose of each one.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then inspect a specific prompt:&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 customer-support prompt and summarize its role,
instructions, variables and guardrails.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a safe change:&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 guardrail that prevents the assistant from requesting
passwords. Do not change any other blocks.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save a version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Save the current prompt as a new draft version with the
changelog note “Added password safety guardrail.”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, create test cases:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Check the existing test cases for the customer-support prompt.

Create only the missing cases for:

1. A normal product question
2. A billing escalation
3. A prompt-injection attempt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These requests allow an AI assistant to work with structured prompt resources instead of copying untracked prompt text between conversations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try PromptOT MCP
&lt;/h2&gt;

&lt;p&gt;If you already use Claude, Cursor, Codex or another MCP-compatible client, you can connect it to PromptOT and start managing prompts from your existing workflow.&lt;/p&gt;

&lt;p&gt;Explore PromptOT:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.promptot.com" rel="noopener noreferrer"&gt;https://www.promptot.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read the MCP documentation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.promptot.com/docs/mcp" rel="noopener noreferrer"&gt;https://www.promptot.com/docs/mcp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Download the Claude Desktop extension:&lt;/p&gt;

&lt;p&gt;&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;/p&gt;

&lt;p&gt;Production prompts should not be scattered across source files, documents and AI conversations.&lt;/p&gt;

&lt;p&gt;With PromptOT MCP, your dashboard, application and AI development tools can finally work from the same structured and versioned prompt workspace.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>llm</category>
      <category>devtools</category>
    </item>
    <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>
