Claude Info
AI и агенты

MDMA

MobileReality/mdma

MDMA расширяет Markdown интерактивными компонентами: формами, таблицами, вебхуками, шлюзами согласования. Позволяет LLM генерировать структурированный UI прямо в чате — без кастомного парсинга и ручной вёрстки.

Установка

terminal
bash
npx @modelcontextprotocol/inspector node packages/mcp/dist/bin/mdma-mcp.js

README

Зачем нужен MDMA?

Сегодня AI-диалоги — это обычный текст: пользователь читает ответ и вручную выполняет действия. MDMA меняет это. Когда LLM знает спецификацию MDMA, он может отвечать интерактивными компонентами (формами, таблицами, шлюзами согласования) вместо простого текста. Диалог становится действенным: пользователь заполняет форму, подтверждает шаг или просматривает структурированные данные — всё inline, с предсказуемой схемой, которую ваше приложение уже умеет рендерить и обрабатывать.

Никакого кастомного UI под каждый сценарий. Никакого парсинга произвольного текста. AI генерирует структурированные, валидированные компоненты, а ваш фронтенд мгновенно их отображает.

Что такое MDMA?

MDMA расширяет Markdown интерактивными компонентами, определёнными в огороженных блоках mdma. Обычный Markdown-файл превращается в интерактивное приложение:

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:

КомпонентКлюч типаОписание
FormformМногопольные формы с полями text, email, number, select, textarea, checkbox и datetime. Поддерживает валидацию, обязательные поля, значения по умолчанию и флаги sensitive (PII).
ButtonbuttonКнопки действий с вариантами primary, secondary и danger.
TasklisttasklistИнтерактивные чекбокс-задачи с метками.
TabletableТаблицы данных с типизированными столбцами и строками.
ChartchartПо умолчанию — таблица — рендерит данные графика как простую HTML-таблицу, чтобы не добавлять зависимость от библиотеки графиков (~400 КБ). Переопределяется собственным рендерером (например, recharts) через customizations.components.chart (см. Кастомный рендерер графиков ниже).
CalloutcalloutБаннеры-уведомления с вариантами info, warning, error и success. Поддерживают опциональный заголовок и кнопку закрытия.
Approval Gateapproval-gateШлюзы согласования с состояниями pending, approved и denied.
WebhookwebhookТриггеры вебхуков с индикаторами статуса: idle, executing, success и error.
ThinkingthinkingСворачиваемые блоки размышлений/рассуждений, показывающие цепочку мыслей AI.

Кроме того, стандартный Markdown-контент (заголовки, абзацы, списки, блоки кода, изображения, ссылки, таблицы и т.д.) рендерится inline между компонентами.

Кастомный рендерер графиков

Встроенный рендерер графиков намеренно отображает данные как обычную таблицу, чтобы библиотека оставалась лёгкой. Для получения настоящих графиков зарегистрируйте кастомный рендерер:

tsx
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>.

Установка

bash
# Ядро — парсинг и выполнение 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.

Использование

ts
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',
});

В чате

ts
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-reactReact-компоненты для рендеринга MDMA-документов
@mobile-reality/mdma-prompt-packСистемные промпты для LLM-генерации MDMA
@mobile-reality/mdma-validatorСтатический анализатор и валидатор документов
@mobile-reality/mdma-cliCLI-инструмент для конструирования промптов и валидации

Лицензия

MIT

Похожие скиллы