ast-editor
Servidor MCP de Editor de Código AST
Un servidor robusto y agnóstico al lenguaje del Protocolo de Contexto de Modelo (MCP) que proporciona a los agentes de codificación de IA la capacidad de editar archivos quirúrgicamente mediante Árboles de Sintaxis Abstracta (AST) en lugar de depender de operaciones de búsqueda y reemplazo o diff frágiles y pesadas en tokens.
¿Por qué ediciones AST?
Cada formato de edición que no es AST (buscar/reemplazar, diff unificado, reescritura de archivo completo) requiere que el modelo copie el texto perfectamente desde un archivo que vio una vez. Un desajuste de espacios en blanco en un archivo de 4,000 líneas y la edición falla. Las ediciones AST evitan el problema por completo: el modelo nombra el objetivo (p. ej., LRUCache.get) y proporciona el nuevo código; el analizador determina dónde vive.
Geometric AGI evaluó todos los formatos principales en 4 modelos y 29 tareas de edición. Las ediciones AST fueron el único formato en alcanzar el 100% de precisión en 3 de 4 modelos, con 18 veces menos tokens de salida que la reescritura de archivo completo y cero fallos de formato. Metodología y resultados completos: AST Edits: The Code Editing Format Nobody Uses.
Créditos
Este servidor MCP fue inspirado por la investigación de Jack Foxabbott y el equipo de Geometric AGI. Sus hallazgos completos, conjunto de pruebas comparativas y datos están disponibles aquí:
Publicación original de Jack Foxabbott (LinkedIn)
GeometricAGI/blog (Código y datos de referencia)
Ahorro estimado de tokens
Ahorro de tokens de salida por edición frente a otros formatos de edición comunes:
Tamaño de edición | Tamaño de archivo | vs reescritura de archivo completo | vs diff unificado | vs buscar/reemplazar |
Ajuste de 1 línea | 100 LoC | 3–5x | ~1.5x | ~1.5x |
Reescritura de cuerpo de función | 500 LoC | 8–12x | 2–3x | 2–3x |
Reescritura de cuerpo de función | 4,000 LoC | 15–20x | 3–5x | 3–5x |
Añadir 2 líneas a una función | cualquier tamaño | ~20x (vía | 5–10x | 3–5x |
Ahorro de tokens de entrada por lectura frente a leer el archivo completo:
Tarea de lectura | Tamaño de archivo | Herramienta de lectura AST | vs lectura de archivo completo |
Fuente de una función | 500 LoC |
| ~20x menos tokens |
Fuente de una función | 2,000 LoC |
| ~50-100x menos tokens |
API de clase (10 métodos, sin cuerpos) | 500 LoC |
| ~10x menos tokens |
Solo bloque de importación | cualquier tamaño |
| ~20-50x menos tokens |
Resumen estructural (nombres + números de línea) | cualquier tamaño |
| ~15-30x menos tokens |
Firma de una función | cualquier tamaño |
| ~50-200x menos tokens |
Para usuarios diarios de agentes, es alcanzable una reducción realista del 40-60% en el total de tokens por sesión, en promedio (combinando el ahorro de salida de las ediciones quirúrgicas con el ahorro de entrada de las lecturas dirigidas).
Los ahorros provienen de cuatro efectos compuestos:
Tokens de salida: Uso de
prepend_to_body/append_to_bodypara pequeñas adiciones en lugar de reescribir cuerpos de funciones completos.Tokens de entrada: Uso de
read_symbol/read_interface/read_importspara leer solo lo necesario en lugar de archivos completos (~10-20x menos tokens de entrada por lectura).Descubrimiento:
list_symbols/get_signatureen lugar de leer archivos completos.Cero fallos de formato: Las ediciones AST nunca fallan por deriva de espacios en blanco, eliminando los bucles de reintento que plagan otros formatos.
Lenguajes y capacidades compatibles
Lenguaje | Extensiones | Ediciones estructurales | Comentarios | Docstrings | Notas |
Python |
| ✅ | ✅ | ✅ función/clase | Decoradores preservados. Literales |
JavaScript |
| ✅ | ✅ | — | |
TypeScript |
| ✅ | ✅ | — | Las interfaces se tratan como clases para |
C |
| ✅ | ✅ | — |
|
C++ |
| ✅ | ✅ | — | Soporta |
Ruby |
| ✅ | ✅ | — | Clases, módulos, métodos de instancia, |
Go |
| ✅ | ✅ | — |
|
Java |
| ✅ | ✅ | — |
|
JSON |
| ✅ (claves, valores, arrays) | — (sin sintaxis de comentarios) | — | |
YAML |
| ✅ (claves, valores, secuencias) | ✅ | — | Secuencias de bloque y flujo soportadas. |
TOML |
| ✅ (claves, valores, arrays, tablas) | ✅ | — | Cabeceras |
Características transversales:
Funciones decoradas (Python
@decorator): los decoradores se preservan en ediciones de cuerpo/firma e incluidos en la eliminación.Slicing correcto de bytes: caracteres multibyte (emoji,
═,→) manejados de forma segura en el texto fuente.Importaciones idempotentes:
add_importomite duplicados exactos automáticamente.
Decisiones de diseño específicas del lenguaje
Algunas herramientas tienen semánticas específicas del lenguaje donde existen múltiples interpretaciones razonables. El comportamiento elegido se documenta aquí para mayor transparencia:
add_field (Ruby y Go) — opción (a): paso de texto literal
Ruby:
add_field("LRUCache", " attr_accessor :capacity")inserta la cadena literal en la parte superior del cuerpo de la clase. La herramienta no envuelve automáticamente nombres desnudos enattr_accessor— usted proporciona el texto exacto que desea (ya seaattr_accessor,attr_reader,@instance_var = nileninitialize, oCLASS_CONST = 42).Go:
add_field("Cache", "\tversion int")inserta la cadena literal dentro del cuerpostruct { ... }. La herramienta no infiere tipos de nombres desnudos — usted proporciona la declaración completa del campo Go.Justificación: consistente con cómo funciona
add_fieldpara otros lenguajes (Python, JS/TS, C++) donde el llamador proporciona el texto fuente completo. La opción alternativa (b) — auto-envoltura (p. ej.,attr_accessor :foodesde el nombrefoo) — sería más mágica pero más difícil de usar para casos extremos (campos tipados, campos de solo lectura, campos con valor predeterminado, etc.).
add_method (Go) — opción (a): inserción de hermano de nivel superior
add_method("Cache", "func (c *Cache) Has(key string) bool { ... }")localiza la declaracióntype Cache struct { ... }e inserta el nuevo método inmediatamente después, en el nivel superior (no dentro de las llaves de la estructura).Justificación: Los métodos de Go son léxicamente de nivel superior, no anidados dentro de su tipo receptor — esto coincide con cómo se escribe realmente el código Go. La opción alternativa (b) — rechazar porque "los métodos de Go no están dentro de structs" — sería pedantemente correcta pero obligaría a los llamadores a usar
insert_after("Cache", content)en su lugar, lo que pierde la señal semántica de que se trata de una adición de método.
Herramientas expuestas
Todas las herramientas requieren que file_path sea una ruta absoluta a un archivo existente.
Edición de código — estructural (Python, JS, TS, C, C++, Ruby, Go, Java)
Herramienta | Parámetros | Descripción |
|
| Reemplazar una definición de función completa (firma + cuerpo + decoradores). |
|
| Reemplazar solo el cuerpo de una función, preservando la firma y los decoradores. |
|
| Reemplazar solo la firma, preservando el cuerpo y los decoradores. |
|
| Insertar contenido en la parte superior del cuerpo de una función. |
|
| Insertar contenido en la parte inferior del cuerpo de una función. |
|
| Añadir cualquier contenido de nivel superior (función, clase, constante, alias de tipo) al final del archivo. |
|
| Añadir un método al final del cuerpo de una clase. |
|
| Añadir un campo/atributo/miembro en la parte superior del cuerpo de una clase. |
|
| Insertar un hermano inmediatamente antes de un símbolo nombrado. |
|
| Insertar un hermano inmediatamente después de un símbolo nombrado. |
|
| Eliminar un bloque de definición de función o clase (incluyendo decoradores). |
Parámetros y firmas
Herramienta | Parámetros | Descripción |
|
| Añadir un parámetro a una firma de función ( |
|
| Eliminar un parámetro por nombre. |
Importaciones e inclusiones
Herramienta | Parámetros | Descripción |
|
| Añadir una línea |
|
| Eliminar una línea de importación coincidente. |
|
| Añadir un nombre a un |
|
| Eliminar un nombre de una importación from de múltiples nombres en Python. |
Comentarios y docstrings
Herramienta | Parámetros | Descripción |
|
| Insertar un bloque de comentarios inmediatamente antes de un símbolo nombrado. Funciona para Python/Ruby/YAML/TOML ( |
|
| Eliminar el bloque de comentarios contiguo sobre un símbolo. Reconoce tanto comentarios de línea como bloques |
|
| Reemplazar el bloque de comentarios inicial sobre un símbolo (o insertar uno si no existe). |
|
| Reemplazar o insertar un docstring de función/clase de Python. Solo Python. |
Edición de Dict/list (JSON, YAML, TOML, Y literales de dict/list a nivel de módulo de Python)
Herramienta | Parámetros | Descripción |
|
| Reemplazar el valor de una clave de configuración existente. |
|
| Añadir un par clave-valor a un dict/objeto/mapeo/tabla. Para Python, |
|
| Eliminar un par clave-valor. Para Python, el objetivo es |
|
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