MDMA is a free, open source automation project written in TypeScript and released under MIT. It has 67 GitHub stars, 2 forks and 0 open issues, and was last pushed 1 months ago. On this registry it ranks #52 of 54 tracked projects in Automation, with 5 head-to-head comparisons available.

What is MDMA?

MDMA (Markdown Document with Mounted Applications) is an MIT-licensed TypeScript library that extends Markdown with interactive components, so an LLM can answer with forms, tables, and approval gates that a host application renders inline instead of leaving the user to act on plain text.

What it is

MDMA extends Markdown with interactive components defined in fenced mdma code blocks, so a regular Markdown file becomes an interactive application. It is written in TypeScript under the MIT licence, and its topics place it in the LLM and agent tooling ecosystem: llm, ai-agents, agent-skills, claude-skill, mcp, mcp-server, model-context-protocol, generative-ui, remark-plugin, react, and interactive-markdown. The GitHub description calls it "interactive documents from Markdown" that extend Markdown with forms, approvals, and webhooks, built for next generation apps.

The problem it replaces is specific: AI conversations today are plain text, and the user reads a response and then manually acts on it. MDMA closes that gap by letting the model answer with structured components rather than prose. The README states the trade in terms of what it removes — no custom UI per use case, and no parsing free-form text, because the AI generates structured, validated components the frontend renders instantly. The worked example is a patient intake document: an mdma block with type: form and id: intake-form declares fields such as patient-name (type text, required: true, sensitive: true) with onSubmit: submit-intake, followed by a type: button block with id: submit-btn, variant: primary, and onAction: submit.

Key capabilities

  • Fenced mdma code blocks that extend ordinary Markdown, each declaring a type such as form or button and a stable id.
  • Form fields carrying metadata the renderer and backend can act on: name, type (text, email, textarea), label, required, and sensitive.
  • Action wiring through onSubmit and onAction, so a component dispatches to a named target instead of relying on free-form text.
  • Component classes named in the description and tagline: forms, tables, approval gates, and webhooks.
  • Integration surfaces for the Model Context Protocol and adjacent tooling, reflected in the mcp, mcp-server, model-context-protocol, remark-plugin, and react topics.
  • An authoring prompt layer: MDMA_AUTHOR prompt variants live under packages/prompt-pack/src/prompts/mdma-author/, and a hosted MDMA-IL model is published on Hugging Face as MobileReality/mdma-gemma4-26b-dsl-unsloth-v1.

Who uses it and how

  • Frontend developers building React applications that render model output, using the remark-plugin path to turn mdma blocks into live components.
  • Teams running MCP servers, exposing MDMA authoring or rendering over the Model Context Protocol so an agent emits valid components.
  • Agent and Claude skill users who want a conversation to end in a completed form or an approved step rather than a paragraph of instructions.
  • Domain workflows with structured intake and sensitive data, as shown by the README's patient intake form with sensitive: true fields.
  • Prompt contributors, who add a variant under packages/prompt-pack/src/prompts/mdma-author// and open a pull request; maintainers run the eval suite and add the result to the MDMA_AUTHOR matrix.

Getting started

The README excerpt provided shows no install or run command, no package name, and no Docker image; the entry points it does expose are the Website, Live Demo, and Docs links. Contributors are directed to add a prompt variant under packages/prompt-pack/src/prompts/mdma-author// and open a pull request.

How it compares

The facts list no commercial products that MDMA replaces, so no licence, self-hosting, or cost comparison against paid alternatives can be made. Its nearest named neighbours are the Model Context Protocol ecosystem and Markdown/remark plugin tooling, which appear here as integration surfaces rather than competitors; on the evidence given, it stands alone in this registry.

When to use it — and when not

The facts mention no infrastructure a self-hoster must operate, so the burden is whatever the host application already runs plus the LLM path. Teams that need a widely adopted dependency with a documented published package should look elsewhere for now: the README excerpt shows no install command, the project has 67 stars and 2 forks, several prompt matrix entries remain TBD, and gpt-5.4 carries a non-deterministic output duplication bug in multi-turn, custom-prompt, and flow evals in roughly 7–15% of runs.

project readme (upstream, from github) — read inline

MDMA

Markdown Document with Mounted Applications

Interactive documents from Markdown. Built for next gen-apps

🌐 Website   ·   🚀 Live Demo   ·   📖 Docs   ·   💬 Discord   ·   🤗 Model

Why MDMA?

AI conversations today are plain text — the user reads a response and manually acts on it. MDMA changes that. When an LLM knows the MDMA spec, it can respond with interactive components (forms, tables, approval gates) instead of just text. The conversation becomes actionable: the user fills out a form, approves a step, or reviews structured data — all inline, with a predictable schema that your app already knows how to render and process.

No custom UI per use case. No parsing free-form text. The AI generates structured, validated components and your frontend renders them instantly.

What is MDMA?

MDMA extends Markdown with interactive components defined in fenced mdma code blocks. A regular Markdown file becomes an interactive application:

# Patient Intake

```mdma
type: form
id: intake-form
fields:
  - name: patient-name
    type: text
    label: "Full Name"
    required: true
    sensitive: true
  - name: email
    type: email
    label: "Email"
    required: true
    sensitive: true
  - name: reason
    type: textarea
    label: "Reason for Visit"
    required: true
onSubmit: submit-intake
```



```mdma
type: button
id: submit-btn
text: "Submit Intake Form"
variant: primary
onAction: submit
```

Speed comparison

Same scenario, two models. GPT-5.5 and our own hosted MDMA-IL model.

Our model is available on Hugging Face: MobileReality/mdma-gemma4-26b-dsl-unsloth-v1

GPT-5.5 Our own hosted model

MDMA_AUTHOR prompt matrix

Each cell shows the pass rate of the model-specialized MDMA_AUTHOR prompt variant on the listed eval suite.

✅ 100% on the suite.

🟡 Scoring between 80–99% on the suite.

🔴 Scoring below 80% on the suite.

Variant one-shot one-shot with custom prompt conversation specific flow of conversation
OpenAI
gpt-5.6-sol
gpt-5.6-terra
gpt-5.6-luna
gpt-5.5
gpt-5.4 ✅ † ✅ † ✅ †
gpt-5.4-mini ✅ * ✅ *
gpt-5.4-nano ✅ * ✅ *
gpt-5.2
gpt-5.1
gpt-5 [i]
gpt-5-mini [i] ✅ * ✅ *
gpt-5-nano [i] 🟡 * 🟡 *
gpt-4.1
gpt-4.1-mini ✅ * ✅ *
gpt-4.1-nano ✅ * 🟡 *
Anthropic
claude-opus-4.8
claude-opus-4.7
claude-opus-4.6
claude-sonnet-4.6
claude-haiku-4.5 ✅ * ✅ *
claude-fable-5
Google
gemini-3.5-flash
gemini-3.1-pro-preview 🟡 ‡
gemini-3.1-pro-preview-customtools
gemini-3.1-flash-lite-preview ✅ * ✅ *
gemini-3-flash-preview ✅ * ✅ *
gemini-2.5-pro
gemini-2.5-flash ✅ * ✅ *
gemini-2.5-flash-lite ✅ * ✅ *
xAI
grok-4.3 [i] 🟡 🔴 🔴 🔴
grok-4.20
grok-4.5
Zhipu (z.ai)
glm-4-plus TBD TBD TBD TBD
Moonshot
kimi-k2 TBD TBD TBD TBD
Alibaba
qwen3-max TBD TBD TBD TBD
MiniMax
minimax-m1 TBD TBD TBD TBD
Other
model

Don't see your model? Add a prompt variant under packages/prompt-pack/src/prompts/mdma-author// and open a PR — we'll run the eval suite and add it to this table.

gpt-5.4 intermittent duplication buggpt-5.4 passes one-shot evals reliably but shows a non-deterministic output duplication in multi-turn, custom-prompt, and flow evals (~7–15% of runs). The model generates a complete, correct response and then immediately re-emits the entire output verbatim, causing [duplicate-ids] validation errors. This is a known model-level issue unrelated to the prompt variant. See the OpenAI community thread for details. If this affects your use case, prefer gpt-5.5 or gpt-5.2.

gemini-3.1-pro-preview stochastic preamble loop — on ~7–15% of flow-eval runs, the model emits a chain-of-thought as visible Markdown prose (e.g. **Investigating Production Errors** repeated 3–5 times) instead of opening a ```mdma block, producing either [yaml-correctness: outside fenced block] or [duplicate-ids] errors. Per Google's official Gemini 3 prompting guide, this is a model-level behavior driven by temperature/sampling — prompt-level fixes shift which test loops rather than eliminating the loops. If deterministic flow output matters, prefer gemini-2.5-pro for production multi-step flows.

* Smaller / lower-tier models from any lab (OpenAI mini · nano, Anthropic Haiku, Google Gemini Flash, etc.) pass our eval suites, which exercise short, structured test cases. In longer real-world conversations they tend to hallucinate, forget earlier turns, or drift from the spec. For production use that involves multi-turn dialogue or stateful flows, prefer the flagship-tier model from the same family.

[i] Noticeably slow response times — single-turn responses commonly take tens of seconds and full eval runs measure in minutes.

MDMA_FIXER prompt matrix

Each cell shows the pass rate of the model-specialized MDMA_FIXER prompt variant on the single-block fixer eval (16 tests covering structural fixes, bindings, PII, forms, tables/charts, approvals, and custom-component extraction). The fixer is what powers automatic repair of LLM output that fails validate() — every supported model lands at ✅ via model-tailored inline guards (no-leading-separator, preserve-input-structure, table-key-direction, replace-all-placeholders, fix-all-listed-errors, etc.).

✅ 100% on the single-block fixer eval (16/16).

Variant single-block fixer notes for testing
OpenAI
gpt-5.6-sol
gpt-5.6-terra
gpt-5.6-luna
gpt-5.5
gpt-5.4
gpt-5.4-mini
gpt-5.4-nano
gpt-5.2
gpt-5.1
gpt-5
gpt-5-mini
gpt-5-nano
gpt-4.1
gpt-4.1-mini
gpt-4.1-nano
Anthropic
claude-opus-4.8
claude-opus-4.7
claude-opus-4.6
claude-sonnet catch-all variant — matches claude-sonnet-4-5, claude-sonnet-4-6, etc.
claude-haiku
claude-fable-5 ✅ ‡ requires reasoning.exclude: true (wired in evals/promptfooconfig.fixer.js)
Google
gemini-3.5-flash ✅ ‡ requires reasoning.exclude: true; adds an inline no-leading-separator guard
gemini-3.1-pro-preview ✅ ‡ requires OpenRouter reasoning.exclude: true (already wired in evals/promptfooconfig.fixer.js)
gemini-3.1-pro-preview-customtools ✅ ‡ same reasoning.exclude requirement
gemini-3.1-flash-lite-preview
gemini-3-flash-preview
gemini-2.5-pro ✅ ‡ same reasoning.exclude requirement
gemini-2.5-flash
gemini-2.5-flash-lite
xAI
grok-4.3 ✅ ‡ minimal prompt + reasoning.exclude: true — extra framing regresses Grok 4.3
grok-4.20
grok-4.5 ✅ ‡ requires reasoning.exclude: true (hidden-reasoning model)

‡ Reasoning-token leak suppression — for reasoning-flavoured Gemini Pro variants and Grok 4.3, the fixer would otherwise see visible "Thinking: Topic" prose prepended to every response. The eval config sets passthrough.reasoning.exclude: true (and the demo's usePreviewValidation does the same per-provid

readme truncated — read the full docs on github

Frequently asked questions

Is MDMA free to use?

MDMA is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does MDMA do?

Markdown that mounts real applications

What is MDMA written in?

MDMA is primarily written in TypeScript. Its source is publicly available at https://github.com/MobileReality/mdma, and it has 67 GitHub stars.