data-transformer
BatchTicket
BatchTicket (CLI: adt) — детерминированный структурированный преобразователь данных для агентских рабочих процессов. Как маленький талон, который сопровождает производственную или отгрузочную партию, каждый запуск несет версионированный план и явный отчет о том, что изменило исполнение. Этот отчет не утверждает, что сопоставление было семантически корректным.
Это не очередной диалект jq или SQL. DuckDB, JSON Schema, PyYAML и стандартные парсеры владеют устоявшейся работой по исполнению. Этот проект владеет контрактом для агентов вокруг них.
Версия 0.2.0 — невыпущенный кандидат на исходный релиз. Проект лицензирован в соответствии с
Apache License 2.0. Стабильными техническими идентификаторами остаются
agent-data-transformer, data-transformer, adt и четыре MCP-инструмента data_*.
Что реализовано
Просмотр JSON, JSONL, CSV, TSV, YAML и Parquet без возврата полных полезных нагрузок.
Обнаружение ограниченных вложенных наборов записей в JSON/YAML-конвертах и профилирование их логических полей.
Сравнение формы исходной записи с целевой JSON Schema, выявление только структурных кандидатов на сопоставление и создание исполняемого чернового плана только после явных совместимых сопоставлений.
Безопасный план трансформации v1 без необработанного кода, SQL, shell, jq, regex или выполнения шаблонов.
Фильтрация, проекция, удаление, переименование, сортировка, ограничение, дедупликация, приведение типов, наследование, разворачивание, соединение, группировка, сводные таблицы, обратные сводные таблицы, уплощение, разуплощение и мутация дерева.
JSON Schema плюс проверки на непустоту, уникальность, количество строк, поля и типы.
Схемно-зависимый дифф с ключом или без ключа.
Пробный прогон с реальной предварительной проверкой назначения, поэтапной атомарной публикацией и защитой от перезаписи.
Изоляция воркера на весь вызов с совокупными лимитами источника/байт/строк/элементов/глубины/времени/RSS/временных файлов.
Потолок байтов для полного сериализованного ответа, включая образцы, формы, эффекты выполнения, различия, ошибки проверки и ошибки.
Одна строгая типизированная модель плана v1 генерирует проверку во время выполнения, опубликованную JSON Schema и живую MCP-схему.
Одно общее ядро с CLI и четырьмя MCP-инструментами уровня задач.
Related MCP server: MCP Data Integration Server
Установка и запуск
Разработка из репозитория:
git clone https://github.com/tetracoralla/BatchTicket.git
cd BatchTicket
uv sync --frozen --extra dev
uv run adt inspect examples/users.json --select 'data.users[*]'
uv run adt inspect examples/users.json --select 'data.users[*]' \
--target-schema target.schema.json --mappings mappings.json
uv run adt transform examples/adults.plan.yaml
uv run adt transform examples/adults.plan.yaml --dry-run
uv run adt validate examples/users.json --select 'data.users[*]' \
--assertions examples/users.assertions.json
ADT_WORKSPACE_ROOT=/absolute/granted/workspace uv run adt mcpСоберите платформенно-зависимый плагин, которому не нужны репозиторий, uv, установленный Python
или сетевое подключение во время выполнения:
uv run python scripts/build_plugin.py
uv run python scripts/probe_plugin.py \
dist/plugin/data-transformer-0.2.0-darwin-arm64
codex plugin marketplace add dist/plugin
codex plugin add data-transformer@data-transformer-localСборка создает каталог плагина, архив .tar.gz и контрольную сумму SHA-256 в
dist/plugin/. Установите или скопируйте полный сгенерированный каталог; .mcp.json в корне репозитория
является конфигурацией для разработки, тогда как .mcp.json сгенерированного плагина вызывает
свой встроенный исполняемый файл напрямую. Сгенерированный локальный маркетплейс указывает Codex на этот
автономный каталог. Пересборка с --replace отказывается от символических ссылок в корневых каталогах вывода или
сгенерированных целях перед удалением или перезаписью чего-либо.
Сгенерированный автономный пакет в настоящее время является локальным артефактом проверки, а не публичным релизным ресурсом. Он включает среду выполнения Python, пакеты Python и нативные библиотеки, чьи материалы сторонних лицензий еще не собраны в архив. Не загружайте каталог плагина, архив или контрольную сумму в GitHub Release. Это не ограничивает публикацию или использование репозитория исходного кода Apache-2.0; см. контрольный список релиза.
Пример трансформации возвращает две записи инлайн и сообщает через execution_effects, что одна входная строка была удалена. Вывод в файл осуществляется через output.path; существующие файлы никогда не заменяются, если output.overwrite явно не установлен в true.
Пути CLI являются явными пользовательскими путями и могут быть абсолютными. Пути к файлам MCP — это более узкая
возможность: сервер сначала использует рабочие области, предоставленные через протокол корней MCP.
Один корень выбирается автоматически; когда предоставлено несколько корней, передайте точное
имя корня в необязательном поле workspace инструмента. Хосты без поддержки корней могут передать
явный ADT_WORKSPACE_ROOT в качестве совместимого разрешения. Пути инструментов остаются относительными
к выбранному корню, а абсолютные, родительские, URI и символические ссылки отклоняются. Только встроенные
вызовы MCP не требуют разрешения рабочей области.
Codex CLI 0.148 в настоящее время не передает корни MCP локальным серверам плагинов. Для холодного
теста хоста CLI запустите Codex с ADT_WORKSPACE_ROOT, установленным в точную тестовую рабочую область. Инструменты
только для чтения могут работать с approval=never; data_transform имеет условную возможность
вывода в файл и поэтому требует политику хоста с поддержкой одобрения, даже если конкретный
вызов возвращает данные инлайн. Заблокированный вызов — это результат авторизации, а не разрешение на
возврат к оболочке или перезаписи данных на стороне модели.
Детерминированная адаптация схемы
data_inspect принимает необязательные target_schema и объект mappings. Он может выбрать
уникальный вложенный набор записей по структурным признакам, предложить точные или нормализованные совпадения имен
и сообщить о несовместимых, отсутствующих, дублированных, пропущенных или удаленных полях. Он не использует
нечеткие синонимы, приведения или значения по умолчанию. Адаптер v1 сопоставляет поля записей верхнего уровня и поддерживает
объектную схему или массив, чьи items являются одной объектной схемой. Составные/ссылочные схемы
и неоднозначные наборы записей остаются явно неразрешенными.
Когда каждое обязательное поле имеет явное совместимое сопоставление,
adaptation.status равен ready, а adaptation.draft_plan — это обычный план трансформации v1.
Запустите этот план через data_transform; адаптер не создает отдельного пути выполнения или пятого публичного инструмента.
Библиотечный API
from data_transformer import DataTransformer
result = DataTransformer().transform(
{
"version": "1",
"sources": {"rows": {"inline": [{"x": 2}, {"x": 4}]}},
"steps": [
{
"op": "derive",
"field": "doubled",
"expr": {"multiply": [{"field": "x"}, {"value": 2}]},
}
],
}
)Публичные вызовы возвращают status: ok, status: dry_run или status: error со стабильным error.code. Успешные трансформации раскрывают наблюдаемые во время выполнения изменения в execution_effects; они не раскрывают трассировки стека или внутренности DuckDB.
См. модель продукта, план трансформации v1 и контракт на проверку. Вклад описан в CONTRIBUTING.md, отчеты о безопасности — в SECURITY.md, а важные изменения — в CHANGELOG.md.
Available Tools
4 toolsdata_diffARead-onlyIdempotent
Compare two structured datasets by schema and rows, optionally using stable key fields. Returns compact added, removed, and changed counts and samples.
| Name | Required | Description | Default |
|---|---|---|---|
| left | Yes | ||
| right | Yes | ||
| limits | No | ||
| workspace | No | ||
| key_fields | No | ||
| sample_rows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds context about the output being 'compact' and that it 'returns added, removed, and changed counts and samples', which goes beyond annotations. There is no contradiction, and the description adds value by clarifying the behavioral output characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence that front-loads the purpose and includes the key optional parameter (key fields) and the output nature. Every phrase earns its place, with no redundancy or fluff. This is ideal conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 6 parameters including complex source objects (PathSource/InlineSource) and a limits model, but the description does not mention that sources can be paths or inline, nor the limits concept. However, the schema provides rich detail on these, and the output is described. Given no output schema, the description covers the return format adequately. The main gap is not explaining how sources are specified, but the schema covers that, so a moderate score is fair.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, but the description explicitly mentions 'stable key fields' matching the key_fields parameter and 'compact counts and samples' relating to sample_rows. However, it does not explain the left/right source objects, limits, or workspace parameters. The description adds some meaning but not enough to fully compensate for low coverage; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Compare two structured datasets by schema and rows' with 'optional stable key fields', and specifies the output as 'compact added, removed, and changed counts and samples'. This is a specific verb+resource combination that distinguishes it from siblings like data_transform (transforms), data_inspect (inspects), and data_validate (validates).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when two datasets need comparison, but it does not explicitly mention when not to use it or name alternatives. Sibling tools are obvious from their names, but the description could have added context about when to choose this over data_inspect or data_validate. Still, the purpose is clear enough that a moderate score is warranted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_inspectARead-onlyIdempotent
Inspect JSON, JSONL, CSV, TSV, YAML, or Parquet shape, types, counts, and a small sample without returning the full payload. Use for 'what fields are in this data?' or unknown tool output. Optionally compare record fields with target_schema and return deterministic mapping candidates; a draft plan is returned only after explicit mappings are supplied. One successful call is sufficient for its recorded observations; never repeat the same arguments to confirm it.
| Name | Required | Description | Default |
|---|---|---|---|
| limits | No | ||
| source | Yes | ||
| mappings | No | ||
| workspace | No | ||
| sample_rows | No | ||
| target_schema | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the read-only/idempotent annotations by adding key behavioral details: no full payload returned, deterministic mapping candidates, draft plans only after explicit mappings, and a note that one successful call is sufficient for observations. These are meaningful traits not present in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core purpose, and every sentence adds valuable context: formats, outputs, use cases, optional mapping behavior, and idempotence caution. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's main purpose, use cases, and special behaviors well. It lacks detail on certain parameters (limits, workspace) and the two source variants, but for a read-only inspection tool with clear annotations, the provided context is sufficient for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It meaningfully explains target_schema and mappings, and implies sample behavior via 'small sample,' but it leaves limits, workspace, and source structure (path vs inline) undocumented. This is a partial but not full compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool inspects multiple data formats (JSON, JSONL, CSV, TSV, YAML, Parquet) and returns shape, types, counts, and a small sample without returning the full payload. It also clearly distinguishes itself from sibling tools by specifying its use case: 'what fields are in this data?' or unknown tool output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance ('Use for...') and a strong behavioral instruction ('never repeat the same arguments to confirm it'). While it doesn't explicitly name alternative sibling tools as exclusions, the use case framing makes it clear when inspection is appropriate versus transform/validate/diff.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_transformADestructiveIdempotent
Transform or rewrite records: reshape, filter, join, aggregate, cast, flatten, or convert structured data with Transformation Plan v1. Do not use this tool for a validation-only request such as checking non-null or unique fields; use data_validate. Known transformation shape: {"version":"1","sources":{"input":{"path":"users.json","select":"data.users[*]"}},"steps":[{"id":"filtered","op":"filter","source":"input","where":{"field":"age","gte":18}},{"op":"select","source":"filtered","fields":[{"field":"userId","as":"id"}]}],"return":{"mode":"auto"}}. Omit workspace with ADT_WORKSPACE_ROOT; otherwise it is an exact granted root name, never a path. Returns a compact sample and explicit execution effects; large results require output.path.
| Name | Required | Description | Default |
|---|---|---|---|
| plan | Yes | ||
| dry_run | No | ||
| workspace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=true, idempotentHint=true), so the description's job is to add value beyond them. It does: it discloses that the tool 'Returns a compact sample and explicit execution effects,' warns that 'large results require output.path,' and explains workspace variable behavior (ADT_WORKSPACE_ROOT). Crucially, the description is consistent with the annotations—the described rewrite/transform behavior aligns with destructiveHint=true, so there's no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but justifiably so given the tool's complexity—a full transformation DSL. It front-loads the purpose, uses a crisp exclusion, and packs workspace semantics and return behavior into tight sentences. The embedded JSON example is bulky but earns its place. It loses one point for the dense JSON blob being potentially hard to scan, but every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 top-level params, a huge nested schema (19 step types, multiple assertion types), and no output schema, the description covers the most critical gaps: workspace pathing rules, large-result handling (output.path), the full plan shape, and the validation sibling's boundary. It's slightly shy of a 5 because the 'compact sample and explicit execution effects' return semantics are never detailed, and error/limit behaviors aren't addressed—leaving some burden on the agent despite the otherwise strong guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate, and it does extensively: it embeds a complete Transformation Plan v1 JSON example showing versions, sources with path/select, steps (filter with condition, select with aliases), and return mode. It also explicitly documents the workspace parameter semantics and the output.path behavior for large results. This is exactly the burden-shifting the rubric requires when the schema provides no narrative.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb phrase — 'Transform or rewrite records: reshape, filter, join, aggregate, cast, flatten, or convert structured data with Transformation Plan v1' — clearly naming the resource (Transformation Plan v1) and listing concrete operations. It differentiates from siblings by explicitly excluding validation tasks ('Do not use this tool for a validation-only request'). This is a strong purpose statement for a tool whose name alone would be ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit when-not-to-use directive with a named alternative: 'Do not use this tool for a validation-only request such as checking non-null or unique fields; use data_validate.' It also provides workspace usage guidance ('Omit workspace with ADT_WORKSPACE_ROOT; otherwise it is an exact granted root name, never a path') and large-result handling. This matches the exemplar behavior in the rubric—clear exclusion plus named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_validateARead-onlyIdempotent
Validate or check requirements on existing structured data (校验/检查非空、唯一、类型、字段或行数); choose data_validate, not data_transform, for validation-only requests. It accepts JSON Schema and deterministic assertions and returns valid true or false without rewriting the source. Known validation shape: {"source":{"path":"users.json","select":"data.users[*]"},"assertions":[{"type":"not_null","field":"userId"},{"type":"unique","field":"userId"}]}.
| Name | Required | Description | Default |
|---|---|---|---|
| limits | No | ||
| schema | No | ||
| source | Yes | ||
| workspace | No | ||
| assertions | No | ||
| sample_rows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only, idempotent, and non-destructive. The description adds useful context by stating it 'returns valid true or false without rewriting the source' and that assertions are deterministic, reinforcing that validation has no side effects. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and usage guidance, and the three sentences are efficient. The JSON shape example is practical and earns its place, though it slightly lengthens the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 6-parameter tool with no output schema, the description covers the main purpose, sibling differentiation, side-effect-free behavior, and return type. Yet optional parameters like limits, workspace, and sample_rows are not addressed, so the description is not fully complete despite the rich input schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate. It provides a concrete validation shape for source and assertions, and enumerates assertion type names, giving real semantic value for the core parameters. However, other parameters such as limits, workspace, and sample_rows are not described, leaving clear gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Validate or check requirements') and clearly identifies the resource ('existing structured data'). It enumerates supported check types (non-null, unique, type, field, row count) and explicitly distinguishes from a sibling tool ('choose data_validate, not data_transform'), which is strong differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides an explicit usage rule: 'choose data_validate, not data_transform, for validation-only requests.' This named alternative and clear when/when-not guidance meets the highest bar, even though it does not mention data_inspect or data_diff.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.2.0- First observed
data_diff - First observed
data_inspect - First observed
data_transform - First observed
data_validate
TDQS
Scored across 4 tools
Each tool occupies a cleanly separated role: observe (inspect), modify (transform), check (validate), and compare (diff). The overlap risk between transform and validate is explicitly addressed with cross-references steering agents to the right tool. No ambiguity remains after reading the descriptions.
All tools follow the exact data_<verb> pattern in snake_case with uniform imperative verbs: transform, inspect, validate, diff. The convention is fully predictable with zero deviation.
At 4 tools, the surface is tightly scoped with no bloat, comfortably within the ideal range for a focused data utility. Every tool earns its place within the read/validate/write/compare lifecycle.
Core workflows are fully covered: reading, transforming/writing output, validating, and diffing data, with output paths already handled by the transform tool. Minor gaps like an explicit export/delete or data source listing tool prevent a perfect score, but agents can accomplish all primary tasks.
Maintenance
Related MCP Connectors
Remote MCP: JSON repair, JSON Schema validation, JSON to TypeScript, CSV to JSON and JSON to CSV.
Query, join, profile, clean and convert CSV/JSON/Parquet with server-side DuckDB over MCP.
Governed data discovery, exact queries, decisions, simulations, and runtime utilities over MCP.
Deterministic MCP, JSON Schema, and SemVer preflight via Agothe's public MUV scope.
Related MCP Servers
- AlicenseAqualityCmaintenanceDetects schema mismatches between data producers and consumers through static analysis, supporting extraction, comparison, code generation, and automated validation with watch mode for MCP tools, APIs, and service contracts.1112 npmMIT
- FlicenseNot gradedqualityBmaintenanceEnables reading, normalizing, validating, merging, and exporting data from Excel, CSV, JSON, and SQLite sources into a unified schema, with tools exposed via FastMCP.1-
- AlicenseNot gradedqualityBmaintenanceProvides deterministic tools for understanding, transforming, and verifying structured data via MCP, enabling rule inference from examples and verification of transformed records.MIT
- AlicenseNot gradedqualityFmaintenanceEnables orchestrating data quality checks, transformation, and deduplication pipelines via an MCP interface. Offers tools for listing pipeline stages, validating wiring, running the full check-transform-match pipeline, and explaining configurations.MIT