Atlas / MCP servers / mobilereality / MDMA

MDMABLOCK

mcp/mobilereality/mdma

Interactive documents from Markdown. Extends MD with forms, approvals, webhooks, and more — built for next gen apps

Verdict
BLOCK
Grade
D
Trust score
63 /100
Exposed tools
16 13r · 3w · 0d
Transport
stdio
License
MIT
Stars
69
01

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 `

Read from source at commit 441497e41ebbOBSERVED · 2026-10-07
Advertisement
02

Connect

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-code (npm)
claude mcp add mdma-mcp -- npx -y @mobile-reality/[email protected]
03

Exposed tools (16)

13 read · 3 write · 0 destructive.

ToolRiskDescription
MDMA_REVIEWERreadReviews and critiques MDMA documents for quality and spec conformance.
build-system-promptreadGenerates 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_mdmareadGenerate an MDMA Markdown document to present structured interactive content to the user.
get-docreadFetches 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-promptreadReturns a named MDMA prompt (mdma-author, mdma-reviewer, or mdma-fixer). For mdma-author, pass an optional variantId (e.g.
get-specreadReturns the full MDMA specification: component types, schemas (as JSON Schema), binding syntax, and authoring rules
graph-3dreadRender 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-docsreadReturns 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-packageswriteReturns all MDMA npm packages with their purpose, install command, usage example, and category
list-prompt-variantsreadReturns 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-pickerreadPick a geographic location by dropping a pin on a map.
query_databasewriteRun a read-only SQL query against the app database.
search_webreadSearch the web for up-to-date information.
set_statewriteSave 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-padreadCapture a hand-drawn signature and emit it as a data-URL.
validate-promptreadValidates a custom prompt against MDMA conventions. Returns warnings for anti-patterns and suggestions for improvements.
04

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.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (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)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
evals/own-model/promptfooconfig.own-model-author.yaml:10
description: MDMA Author Eval (DSL) — own model
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
evals/own-model/promptfooconfig.own-model-fixer.yaml:9
description: MDMA Fixer Eval (capability probe) — own model
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
evals/own-model/promptfooconfig.own-model-flows.yaml:10
description: MDMA Example Flows Eval (DSL) — own model
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
demo/src/docs/sections/PromptMatrix.tsx:159
variant on the single-block fixer eval (16 tests covering structural fixes, bindings, PII,
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
demo/src/docs/sections/PromptMatrix.tsx:163
<p>✅ 100% on the single-block fixer eval (16/16).</p>
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
benchmarks/genui-formats/src/adapters/mdma.ts:19
import { selectAuthorPrompt } from '../../../../evals/select-prompt.mjs';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
demo/src/App.tsx:3
import logoUrl from '../../assets/logo.svg';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
demo/src/docs/sections/Components.tsx:5
import { ChartRenderer } from '../../chart-components.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
demo/src/docs/sections/Components.tsx:6
import { parseMarkdown } from '../../chat/parse-markdown.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
demo/src/docs/sections/Components.tsx:7
import { Graph3DRenderer } from '../../custom-variants/Graph3DRenderer.js';
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
packages/cli/app-dist/assets/index-DE6VOPh-.js:17763
u = JSON.parse(atob(s));
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
packages/cli/app-dist/assets/index-DE6VOPh-.js:21605
const a = atob(i.replace(/[\n\r]/g, '')),
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
benchmarks/genui-formats/package.json
ajv, dotenv, openai, zod, tsx, typescript
Why it matters. 6 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
demo-native/package.json
@ai-sdk/anthropic, @ai-sdk/openai, ai, @babel/runtime, expo, expo-status-bar, @types/react, typescript
Why it matters. 8 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
demo/package.json
highlight.js, react, react-dom, react-native-web, recharts, remark-gfm, remark-parse, three
Why it matters. 17 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
evals/package.json
dotenv, openai, yaml, zod, @types/node, tsx
Why it matters. 6 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
examples/integrations/ag-ui/package.json
@ag-ui/client, @ag-ui/core, @ag-ui/encoder, @types/react, @types/react-dom, @vitejs/plugin-react, tsx, typescript
Why it matters. 9 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
benchmarks/genui-formats/vendor/a2ui-transport-prompt.txt:22
{"$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 A
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOInventory / provenance · inv.oversize · CWE-1104
assets/gpt-5.5.gif
assets/gpt-5.5.gif
Why it matters. 15186935 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
assets/logo.png
assets/logo.png
Why it matters. 4229712 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
assets/mdma-2.gif
assets/mdma-2.gif
Why it matters. 4889793 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
assets/mdma-3.gif
assets/mdma-3.gif
Why it matters. 6703074 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
assets/mdma.gif
assets/mdma.gif
Why it matters. 7823053 bytes not read

Gates applied: no_behavioural_pass.

Audited 2026-10-07 · audit v0.4.1 · source sha 441497e41ebbfull audit observations/trust-audit/mcp-server/mobilereality__mdma.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-07441497e41ebbBLOCKD63first audit
06

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.

Advertisement