MDMA
MobileReality/mdmaMDMA расширяет Markdown интерактивными компонентами: формами, таблицами, вебхуками, шлюзами согласования. Позволяет LLM генерировать структурированный UI прямо в чате — без кастомного парсинга и ручной вёрстки.
Установка
npx @modelcontextprotocol/inspector node packages/mcp/dist/bin/mdma-mcp.jsREADME
Зачем нужен MDMA?
Сегодня AI-диалоги — это обычный текст: пользователь читает ответ и вручную выполняет действия. MDMA меняет это. Когда LLM знает спецификацию MDMA, он может отвечать интерактивными компонентами (формами, таблицами, шлюзами согласования) вместо простого текста. Диалог становится действенным: пользователь заполняет форму, подтверждает шаг или просматривает структурированные данные — всё inline, с предсказуемой схемой, которую ваше приложение уже умеет рендерить и обрабатывать.
Никакого кастомного UI под каждый сценарий. Никакого парсинга произвольного текста. AI генерирует структурированные, валидированные компоненты, а ваш фронтенд мгновенно их отображает.
Что такое MDMA?
MDMA расширяет Markdown интерактивными компонентами, определёнными в огороженных блоках mdma. Обычный Markdown-файл превращается в интерактивное приложение:
# 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
```
```mdma
type: button
id: submit-btn
text: "Submit Intake Form"
variant: primary
onAction: submit
```Компоненты
9 встроенных типов компонентов, все рендерятся из коробки через @mobile-reality/mdma-renderer-react:
| Компонент | Ключ типа | Описание |
|---|---|---|
| Form | form | Многопольные формы с полями text, email, number, select, textarea, checkbox и datetime. Поддерживает валидацию, обязательные поля, значения по умолчанию и флаги sensitive (PII). |
| Button | button | Кнопки действий с вариантами primary, secondary и danger. |
| Tasklist | tasklist | Интерактивные чекбокс-задачи с метками. |
| Table | table | Таблицы данных с типизированными столбцами и строками. |
| Chart | chart | По умолчанию — таблица — рендерит данные графика как простую HTML-таблицу, чтобы не добавлять зависимость от библиотеки графиков (~400 КБ). Переопределяется собственным рендерером (например, recharts) через customizations.components.chart (см. Кастомный рендерер графиков ниже). |
| Callout | callout | Баннеры-уведомления с вариантами info, warning, error и success. Поддерживают опциональный заголовок и кнопку закрытия. |
| Approval Gate | approval-gate | Шлюзы согласования с состояниями pending, approved и denied. |
| Webhook | webhook | Триггеры вебхуков с индикаторами статуса: idle, executing, success и error. |
| Thinking | thinking | Сворачиваемые блоки размышлений/рассуждений, показывающие цепочку мыслей AI. |
Кроме того, стандартный Markdown-контент (заголовки, абзацы, списки, блоки кода, изображения, ссылки, таблицы и т.д.) рендерится inline между компонентами.
Кастомный рендерер графиков
Встроенный рендерер графиков намеренно отображает данные как обычную таблицу, чтобы библиотека оставалась лёгкой. Для получения настоящих графиков зарегистрируйте кастомный рендерер:
import { MdmaDocument } from '@mobile-reality/mdma-renderer-react';
import { MyRechartsRenderer } from './MyRechartsRenderer';
function App({ ast, store }) {
return (
<MdmaDocument
ast={ast}
store={store}
customizations={{
components: {
chart: MyRechartsRenderer,
},
}}
/>
);
}Этот паттерн работает для переопределения любого встроенного компонента — передайте кастомный React-компонент в customizations.components.<type>.
Установка
# Ядро — парсинг и выполнение MDMA-документов
npm install @mobile-reality/mdma-parser @mobile-reality/mdma-runtime
# React-рендеринг
npm install @mobile-reality/mdma-renderer-react
# AI-авторинг — системные промпты для генерации на основе LLM
npm install @mobile-reality/mdma-prompt-pack
# Валидация — статический анализ MDMA-документов
npm install @mobile-reality/mdma-validator
# CLI — интерактивный конструктор промптов + валидация документов
npx @mobile-reality/mdma-cliВсе пакеты опубликованы в npm-организации @mobile-reality.
Использование
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import { remarkMdma } from '@mobile-reality/mdma-parser';
import { createDocumentStore } from '@mobile-reality/mdma-runtime';
import type { MdmaRoot } from '@mobile-reality/mdma-spec';
// 1. Парсим markdown в AST
const processor = unified().use(remarkParse).use(remarkMdma);
const tree = processor.parse(markdown);
const ast = (await processor.run(tree)) as MdmaRoot;
// 2. Создаём реактивное хранилище документа
const store = createDocumentStore(ast, {
documentId: 'my-doc',
sessionId: crypto.randomUUID(),
});
// 3. Подписываемся на изменения состояния
store.subscribe((state) => {
console.log('Bindings:', state.bindings);
});
// 4. Диспатчим действия пользователя
store.dispatch({
type: 'FIELD_CHANGED',
componentId: 'intake-form',
field: 'patient-name',
value: 'Jane Doe',
});В чате
import { buildSystemPrompt } from '@mobile-reality/mdma-prompt-pack';
// Кастомный промпт точно предписывает, что должен генерировать LLM
const systemPrompt = buildSystemPrompt({
customPrompt: `You are a bug tracking assistant. When a user reports a bug,
always generate a single form component matching this exact structure:
\`\`\`mdma
type: form
id: bug-report
fields:
- name: title
type: text
label: "Bug Title"
required: true
- name: severity
type: select
label: "Severity"
options:
- { label: Critical, value: critical }
- { label: High, value: high }
- { label: Medium, value: medium }
- { label: Low, value: low }
- name: steps
type: textarea
label: "Steps to Reproduce"
required: true
\`\`\`
`,
});Пакеты
| Пакет | Описание |
|---|---|
@mobile-reality/mdma-spec | Типы TypeScript и JSON-схема для спецификации MDMA |
@mobile-reality/mdma-parser | Плагин remark для парсинга блоков mdma в AST |
@mobile-reality/mdma-runtime | Реактивное хранилище состояния документа |
@mobile-reality/mdma-renderer-react | React-компоненты для рендеринга MDMA-документов |
@mobile-reality/mdma-prompt-pack | Системные промпты для LLM-генерации MDMA |
@mobile-reality/mdma-validator | Статический анализатор и валидатор документов |
@mobile-reality/mdma-cli | CLI-инструмент для конструирования промптов и валидации |
Лицензия
MIT