ast-editor
MCP-сервер AST-редактора кода
Надежный, не зависящий от языка сервер протокола контекста модели (MCP), который предоставляет ИИ-агентам для написания кода возможность хирургического редактирования файлов через абстрактные синтаксические деревья (AST) вместо использования хрупких и затратных по токенам операций поиска-замены или diff.
Почему именно AST-правки?
Любой формат правок, не основанный на AST — поиск/замена, unified diff, полная перезапись файла — требует от модели идеального копирования текста из файла, который она видела один раз. Одно несоответствие пробелов в файле на 4000 строк, и правка не удастся. AST-правки полностью обходят эту проблему: модель называет цель (например, LRUCache.get) и предоставляет новый код; парсер сам определяет, где он находится.
Geometric AGI протестировали все основные форматы на 4 моделях и 29 задачах редактирования. AST-правки оказались единственным форматом, достигшим 100% точности на 3 из 4 моделей, с использованием в 18 раз меньшего количества выходных токенов, чем при полной перезаписи файла, и нулевым количеством ошибок формата. Полная методология и результаты: AST Edits: The Code Editing Format Nobody Uses.
Благодарности
Этот MCP-сервер был вдохновлен исследованиями Джека Фоксаббота и команды Geometric AGI. Их полные выводы, набор тестов и данные доступны здесь:
Оригинальный пост Джека Фоксаббота (LinkedIn)
GeometricAGI/blog (Код и данные тестов)
Оценочная экономия токенов
Экономия выходных токенов на одну правку по сравнению с другими распространенными форматами:
Размер правки | Размер файла | vs полная перезапись | vs unified diff | vs поиск/замена |
Правка 1 строки | 100 строк | 3–5x | ~1.5x | ~1.5x |
Перезапись тела функции | 500 строк | 8–12x | 2–3x | 2–3x |
Перезапись тела функции | 4,000 строк | 15–20x | 3–5x | 3–5x |
Добавление 2 строк в функцию | любой | ~20x (через | 5–10x | 3–5x |
Экономия входных токенов на чтение по сравнению с чтением всего файла:
Задача чтения | Размер файла | Инструмент чтения AST | vs чтение всего файла |
Исходный код одной функции | 500 строк |
| ~20x меньше токенов |
Исходный код одной функции | 2,000 строк |
| ~50-100x меньше токенов |
API класса (10 методов, без тел) | 500 строк |
| ~10x меньше токенов |
Только блок импортов | любой |
| ~20-50x меньше токенов |
Структурный обзор (имена + номера строк) | любой |
| ~15-30x меньше токенов |
Сигнатура одной функции | любой |
| ~50-200x меньше токенов |
Для повседневных пользователей агентов достижимо реальное сокращение общего количества токенов за сессию на 40-60% в среднем (комбинируя экономию выходных токенов от хирургических правок с экономией входных токенов от целевого чтения).
Экономия достигается за счет четырех эффектов:
Выходные токены: Использование
prepend_to_body/append_to_bodyдля небольших дополнений вместо перезаписи всего тела функции.Входные токены: Использование
read_symbol/read_interface/read_importsдля чтения только необходимого вместо целых файлов (~10-20x меньше входных токенов на чтение).Обнаружение:
list_symbols/get_signatureвместо чтения целых файлов.Нулевые ошибки формата: AST-правки никогда не ошибаются из-за смещения пробелов, устраняя циклы повторных попыток, характерные для других форматов.
Поддерживаемые языки и возможности
Язык | Расширения | Структурные правки | Комментарии | Docstrings | Примечания |
Python |
| ✅ | ✅ | ✅ функция/класс | Декораторы сохраняются. Литералы |
JavaScript |
| ✅ | ✅ | — | |
TypeScript |
| ✅ | ✅ | — | Интерфейсы обрабатываются как классы для |
C |
| ✅ | ✅ | — |
|
C++ |
| ✅ | ✅ | — | Поддерживает |
Ruby |
| ✅ | ✅ | — | Классы, модули, методы экземпляра, |
Go |
| ✅ | ✅ | — |
|
Java |
| ✅ | ✅ | — |
|
JSON |
| ✅ (ключи, значения, массивы) | — (нет синтаксиса комментариев) | — | |
YAML |
| ✅ (ключи, значения, последовательности) | ✅ | — | Поддерживаются блочные и потоковые последовательности. |
TOML |
| ✅ (ключи, значения, массивы, таблицы) | ✅ | — | Заголовки |
Сквозные функции:
Декорированные функции (Python
@decorator): декораторы сохраняются при правках тела/сигнатуры и включаются при удалении.Побайтово-корректная нарезка: многобайтовые символы (эмодзи,
═,→) безопасно обрабатываются в исходном тексте.Идемпотентные импорты:
add_importавтоматически пропускает точные дубликаты.
Языково-специфичные проектные решения
Некоторые инструменты имеют языково-специфичную семантику, где возможны несколько разумных интерпретаций. Выбранное поведение задокументировано здесь для прозрачности:
add_field (Ruby и Go) — вариант (a): прямая вставка текста
Ruby:
add_field("LRUCache", " attr_accessor :capacity")вставляет строковый литерал в начало тела класса. Инструмент не оборачивает автоматически голые имена вattr_accessor— вы предоставляете точный текст, который хотите (будь тоattr_accessor,attr_reader,@instance_var = nilвinitializeилиCLASS_CONST = 42).Go:
add_field("Cache", "\tversion int")вставляет строковый литерал внутрь телаstruct { ... }. Инструмент не выводит типы из голых имен — вы предоставляете полное объявление поля Go.Обоснование: соответствует тому, как
add_fieldработает для других языков (Python, JS/TS, C++), где вызывающий предоставляет полный исходный текст. Альтернативный вариант (b) — авто-оборачивание (например,attr_accessor :fooиз имениfoo) — был бы более «магическим», но сложнее в использовании для граничных случаев (типизированные поля, поля только для чтения, поля со значением по умолчанию и т.д.).
add_method (Go) — вариант (a): вставка на верхнем уровне
add_method("Cache", "func (c *Cache) Has(key string) bool { ... }")находит объявлениеtype Cache struct { ... }и вставляет новый метод сразу после него, на верхнем уровне (не внутри фигурных скобок структуры).Обоснование: методы Go лексически находятся на верхнем уровне, а не вложены в тип получателя — это соответствует тому, как код Go пишется на самом деле. Альтернативный вариант (b) — отказ, потому что «методы Go не находятся внутри структур» — был бы педантично верным, но заставил бы вызывающих использовать
insert_after("Cache", content), что теряет семантический сигнал о том, что это добавление метода.
Доступные инструменты
Все инструменты требуют, чтобы file_path был абсолютным путем к существующему файлу.
Редактирование кода — структурное (Python, JS, TS, C, C++, Ruby, Go, Java)
Инструмент | Параметры | Описание |
|
| Заменить полное определение функции (сигнатура + тело + декораторы). |
|
| Заменить только тело функции, сохраняя сигнатуру и декораторы. |
|
| Заменить только сигнатуру, сохраняя тело и декораторы. |
|
| Вставить контент в начало тела функции. |
|
| Вставить контент в конец тела функции. |
|
| Добавить любой контент верхнего уровня (функция, класс, константа, псевдоним типа) в конец файла. |
|
| Добавить метод в конец тела класса. |
|
| Добавить поле/атрибут/член в начало тела класса. |
|
| Вставить элемент сразу перед именованным символом. |
|
| Вставить элемент сразу после именованного символа. |
|
| Удалить блок определения функции или класса (включая декораторы). |
Параметры и сигнатуры
Инструмент | Параметры | Описание |
|
| Добавить параметр в сигнатуру функции ( |
|
| Удалить параметр по имени. |
Импорты и включения
Инструмент | Параметры | Описание |
|
| Добавить строку |
|
| Удалить соответствующую строку импорта. |
|
| Добавить одно имя в существующий |
|
| Удалить одно имя из Python from-import с несколькими именами. |
Комментарии и docstrings
Инструмент | Параметры | Описание |
|
| Вставить блок комментария сразу перед именованным символом. Работает для Python/Ruby/YAML/TOML ( |
|
| Удалить непрерывный блок комментариев над символом. Распознает как строчные комментарии, так и C-стиль однострочных или многострочных блоков |
|
| Заменить блок комментариев над символом (или вставить, если его нет). |
|
| Заменить или вставить docstring функции/класса Python. Только для Python. |
Редактирование Dict/list (JSON, YAML, TOML и литералы dict/list на уровне модуля Python)
Инструмент | Параметры | Описание |
|
| Заменить значение существующего ключа конфигурации. |
|
| Добавить пару ключ-значение в dict/объект/отображение/таблицу. Для |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/kambleakash0/agent-skills'
If you have feedback or need assistance with the MCP directory API, please join our Discord server