MDMABLOCK
Interactive documents from Markdown. Extends MD with forms, approvals, webhooks, and more — built for next gen apps
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
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
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 `
441497e41ebbOBSERVED · 2026-10-07Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add mdma-mcp -- npx -y @mobile-reality/[email protected]
Exposed tools (16)
13 read · 3 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
MDMA_REVIEWER | read | Reviews and critiques MDMA documents for quality and spec conformance. |
build-system-prompt | read | Generates a custom MDMA prompt from structured input (domain, components, fields, steps). Returns only the custom prompt part — use buildSystemPrompt({ customPrompt }) in code to combine it with the base MDMA spec. |
generate_mdma | read | Generate an MDMA Markdown document to present structured interactive content to the user. |
get-doc | read | Fetches the latest version of an MDMA documentation file from the public GitHub repo (raw.githubusercontent.com/MobileReality/mdma) and returns its contents as text. Allowed paths: any entry from list-docs, plus any *.md file under |
get-prompt | read | Returns a named MDMA prompt (mdma-author, mdma-reviewer, or mdma-fixer). For mdma-author, pass an optional variantId (e.g. |
get-spec | read | Returns the full MDMA specification: component types, schemas (as JSON Schema), binding syntax, and authoring rules |
graph-3d | read | Render an interactive 3D bar chart (WebGL) from tabular data — two categorical axes plus a numeric height. Use for comparing a metric across two dimensions at once, e.g. revenue by region and quarter. Bars are clickable: ALWAYS wire |
list-docs | read | Returns the catalog of MDMA documentation files available for fetching from the public GitHub repo (path, title, description). Use this to discover what docs you can pass to get-doc. |
list-packages | write | Returns all MDMA npm packages with their purpose, install command, usage example, and category |
list-prompt-variants | read | Returns all available MDMA_AUTHOR prompt variants with their id, label, and description. Pass the id to get-prompt as variantId to retrieve the model-optimised prompt. |
map-picker | read | Pick a geographic location by dropping a pin on a map. |
query_database | write | Run a read-only SQL query against the app database. |
search_web | read | Search the web for up-to-date information. |
set_state | write | Save structured data the user gives you so forms pre-fill from it and you can recall it. Call it whenever the user provides information (name, email, preferences, or specific form values). |
signature-pad | read | Capture a hand-drawn signature and emit it as a data-URL. |
validate-prompt | read | Validates a custom prompt against MDMA conventions. Returns warnings for anti-patterns and suggestions for improvements. |
Trust audit
BLOCKgrade D · trust 63/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (1 observation(s))
- Network
- declared (3 observation(s))
- Shell
- declared (3 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (23)
description: MDMA Author Eval (DSL) — own model
description: MDMA Fixer Eval (capability probe) — own model
description: MDMA Example Flows Eval (DSL) — own model
variant on the single-block fixer eval (16 tests covering structural fixes, bindings, PII,
<p>✅ 100% on the single-block fixer eval (16/16).</p>
import { selectAuthorPrompt } from '../../../../evals/select-prompt.mjs';import logoUrl from '../../assets/logo.svg';
import { ChartRenderer } from '../../chart-components.js';import { parseMarkdown } from '../../chat/parse-markdown.js';import { Graph3DRenderer } from '../../custom-variants/Graph3DRenderer.js';u = JSON.parse(atob(s));
const a = atob(i.replace(/[\n\r]/g, '')),
ajv, dotenv, openai, zod, tsx, typescript
@ai-sdk/anthropic, @ai-sdk/openai, ai, @babel/runtime, expo, expo-status-bar, @types/react, typescript
highlight.js, react, react-dom, react-native-web, recharts, remark-gfm, remark-parse, three
dotenv, openai, yaml, zod, @types/node, tsx
@ag-ui/client, @ag-ui/core, @ag-ui/encoder, @types/react, @types/react-dom, @vitejs/plugin-react, tsx, typescript
{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://a2ui.org/specification/v0_9/common_types.json","title":"A2UI Common Types","description":"Common type definitions used across Aassets/gpt-5.5.gif
assets/logo.png
assets/mdma-2.gif
assets/mdma-3.gif
assets/mdma.gif
Gates applied: no_behavioural_pass.
441497e41ebbfull audit observations/trust-audit/mcp-server/mobilereality__mdma.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-07 | 441497e41ebb | BLOCK | D | 63 | first audit |
Questions
What is the MDMA MCP server?
Interactive documents from Markdown. Extends MD with forms, approvals, webhooks, and more — built for next gen apps
What tools does MDMA expose?
16 in total: 13 read-only, 3 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.
Is MDMA safe to connect to an agent?
No — not without reading the findings first. The audit graded it D (63/100) and found 3 critical or high issues in the source. Each one is listed on this page with the file and line it is on.
What credentials does MDMA need?
It reads EXPO_PUBLIC_ANTHROPIC_API_KEY, EXPO_PUBLIC_OPENAI_API_KEY, EXPO_PUBLIC_OPENROUTER_API_KEY, INTERNAL_API_TOKEN and OPENROUTER_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does MDMA run?
It speaks stdio, so it runs as a local process your client starts. It is published on npm as @mobile-reality/mdma-validator at 0.3.3.
How current is this page?
The grade is for one exact copy of the source (441497e41ebb), read on 2026-10-07. The repository is watched and re-audited when it changes.