ast-editor
AST Code Editor MCP Server
堅牢で言語に依存しないModel Context Protocol (MCP) サーバーです。AIコーディングエージェントに対し、トークンを大量に消費し壊れやすい検索・置換やdiff操作に頼るのではなく、抽象構文木 (AST) を介して外科的にファイルを編集する機能を提供します。
なぜAST編集なのか?
AST以外の編集形式(検索/置換、unified diff、ファイル全体の書き換え)はすべて、モデルが一度見たファイルからテキストを完璧にコピーすることを要求します。4,000行のファイルで空白が1つでも一致しなければ、編集は失敗します。AST編集はこの問題を完全に回避します。モデルはターゲット(例: LRUCache.get)を指定して新しいコードを提供するだけで、パーサーがその場所を特定します。
Geometric AGIは、4つのモデルと29の編集タスクにわたって、すべての主要な形式をベンチマークしました。AST編集は、4つのモデルのうち3つで100%の正確性を達成した唯一の形式であり、ファイル全体の書き換えよりも出力トークンが18倍少なく、形式エラーもゼロでした。 完全な手法と結果はこちら:AST Edits: The Code Editing Format Nobody Uses。
クレジット
このMCPサーバーは、Jack Foxabbott氏とGeometric AGIチームの研究に触発されました。彼らの完全な調査結果、ベンチマークスイート、データは以下から入手できます:
Jack Foxabbott氏の元の投稿 (LinkedIn)
GeometricAGI/blog (ベンチマークコードとデータ)
推定トークン削減量
他の一般的な編集形式と比較した、編集ごとの出力トークン削減量:
編集サイズ | ファイルサイズ | vs ファイル全体の書き換え | vs unified diff | vs 検索/置換 |
1行の修正 | 100行 | 3–5倍 | ~1.5倍 | ~1.5倍 |
関数本体の書き換え | 500行 | 8–12倍 | 2–3倍 | 2–3倍 |
関数本体の書き換え | 4,000行 | 15–20倍 | 3–5倍 | 3–5倍 |
関数に2行追加 | 任意のサイズ | ~20倍 (via | 5–10倍 | 3–5倍 |
ファイル全体を読み込む場合と比較した、読み取りごとの入力トークン削減量:
読み取りタスク | ファイルサイズ | ASTリーダーツール | vs ファイル全体の読み取り |
1つの関数のソース | 500行 |
| ~20倍少ないトークン |
1つの関数のソース | 2,000行 |
| ~50-100倍少ないトークン |
クラスAPI (10メソッド、本体なし) | 500行 |
| ~10倍少ないトークン |
インポートブロックのみ | 任意のサイズ |
| ~20-50倍少ないトークン |
構造の概要 (名前 + 行番号) | 任意のサイズ |
| ~15-30倍少ないトークン |
1つの関数のシグネチャ | 任意のサイズ |
| ~50-200倍少ないトークン |
日常的にエージェントを使用する場合、セッションあたりの合計トークン数を平均して40〜60%削減することが現実的に可能です(外科的な編集による出力削減と、ターゲットを絞った読み取りによる入力削減を組み合わせた場合)。
この削減は、4つの相乗効果から生まれます:
出力トークン: 関数本体全体を書き換える代わりに、小さな追加には
prepend_to_body/append_to_bodyを使用する入力トークン: ファイル全体ではなく必要なものだけを読み取るために
read_symbol/read_interface/read_importsを使用する(読み取りごとに約10〜20倍少ない入力トークン)発見: ファイル全体を読み取る代わりに
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、initialize内の@instance_var = nil、またはCLASS_CONST = 42など)を提供してください。Go:
add_field("Cache", "\tversion int")は、struct { ... }本体内にリテラル文字列を挿入します。このツールは裸の名前から型を推論しません。完全なGoフィールド宣言を提供してください。根拠: 他の言語(Python, JS/TS, C++)で
add_fieldがどのように機能するか(呼び出し元が完全なソーステキストを提供する)と一貫しています。もう一つのオプション (b) である自動ラップ(名前fooからattr_accessor :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から名前を1つ削除します。 |
コメントとDocstrings
ツール | パラメータ | 説明 |
|
| 名前付きシンボルの直前にコメントブロックを挿入します。Python/Ruby/YAML/TOML ( |
|
| シンボルの上の連続するコメントブロックを削除します。行コメントとCスタイルの単一行または複数行 |
|
| シンボルの上の先頭コメントブロックを置換します(存在しない場合は挿入します)。 |
|
| Python関数/クラスのdocstringを置換または挿入します。Python専用。 |
Dict/list編集 (JSON, YAML, TOML, およびPythonモジュールレベルのdict/listリテラル)
ツール | パラメータ | 説明 |
|
| 既存の設定キーの値を置換します。 |
|
| dict/object/mapping/tableにキーと値のペアを追加します。Pythonの場合、 |
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