Skip to main content
Glama

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チームの研究に触発されました。彼らの完全な調査結果、ベンチマークスイート、データは以下から入手できます:

推定トークン削減量

他の一般的な編集形式と比較した、編集ごとの出力トークン削減量:

編集サイズ

ファイルサイズ

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 prepend_to_body / append_to_body)

5–10倍

3–5倍

ファイル全体を読み込む場合と比較した、読み取りごとの入力トークン削減量:

読み取りタスク

ファイルサイズ

ASTリーダーツール

vs ファイル全体の読み取り

1つの関数のソース

500行

read_symbol

~20倍少ないトークン

1つの関数のソース

2,000行

read_symbol

~50-100倍少ないトークン

クラスAPI (10メソッド、本体なし)

500行

read_interface

~10倍少ないトークン

インポートブロックのみ

任意のサイズ

read_imports

~20-50倍少ないトークン

構造の概要 (名前 + 行番号)

任意のサイズ

list_symbols

~15-30倍少ないトークン

1つの関数のシグネチャ

任意のサイズ

get_signature

~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

.py

#

✅ 関数/クラス

デコレータは保持されます。モジュールレベルの dict/list リテラルは add_key / append_to_array で編集可能。

JavaScript

.js, .jsx, .mjs, .cjs

// + /* ... */

TypeScript

.ts, .tsx

// + /* ... */

インターフェースは add_method / add_field に対してクラスとして扱われます。

C

.c, .h

// + /* ... */ (単一行 + 複数行)

.h はデフォルトでCとして扱われます。C++ヘッダーには .hpp/.hxx/.hh を使用してください。

C++

.cpp, .cc, .cxx, .hpp, .hxx, .hh

// + /* ... */ (単一行 + 複数行)

class, struct, union, enum, namespace をサポート。Class::method の修飾名は正しく解決されます。

Ruby

.rb

#

クラス、モジュール、インスタンスメソッド、singleton_methoddef self.foo によるクラスメソッド)をサポート。require/require_relative/load/autoload はインポートとして認識されます。

Go

.go

// + /* ... */

struct, interface, 関数、メソッドをサポート。メソッドはレシーバーで指定します:Cache.Get はトップレベルの func (c *Cache) Get(...) に解決されます。グループ化された import (...) ブロックをサポート。

Java

.java

// + /* ... */ + Javadoc /** ... */

class, interface, enum, record、メソッド、コンストラクタ、フィールドをサポート。アノテーション(@Override, @Deprecated)は編集時にメソッドと共に移動します(modifiers ノードでラップ)。Enumメソッド(enum_body_declarations 内にネスト)は list_symbols でBFSにより発見されます。

JSON

.json

✅ (キー、値、配列)

— (コメント構文なし)

YAML

.yml, .yaml

✅ (キー、値、シーケンス)

#

ブロックおよびフローシーケンスをサポート。

TOML

.toml

✅ (キー、値、配列、テーブル)

#

[table] ヘッダーはコメントツールで名前指定可能。

横断的な機能:

  • デコレータ付き関数 (Python @decorator): デコレータは本体/シグネチャの編集時に保持され、削除時には含まれます。

  • バイト単位で正確なスライス: マルチバイト文字(絵文字、, )はソーステキスト内で安全に処理されます。

  • べき等なインポート: add_import は完全に重複するインポートを自動的にスキップします。

言語固有の設計上の決定

いくつかのツールには、複数の妥当な解釈が存在する場合の言語固有のセマンティクスがあります。選択された動作は透明性のためにここに文書化されています:

add_field (RubyおよびGo) — オプション (a): リテラルテキストのパススルー

  • Ruby: add_field("LRUCache", " attr_accessor :capacity") は、クラス本体の先頭にリテラル文字列を挿入します。このツールは attr_accessor 内の裸の名前を自動的にラップしません。必要な正確なテキスト(attr_accessorattr_readerinitialize 内の @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)

ツール

パラメータ

説明

replace_function

file_path, target, content

関数定義全体(シグネチャ + 本体 + デコレータ)を置換します。

replace_function_body

file_path, target, content

シグネチャとデコレータを保持したまま、関数の本体のみを置換します。

replace_signature

file_path, target, new_signature

本体とデコレータを保持したまま、シグネチャのみを置換します。

prepend_to_body

file_path, target, content

関数本体の先頭にコンテンツを挿入します。

append_to_body

file_path, target, content

関数本体の末尾にコンテンツを挿入します。

add_top_level

file_path, content

ファイルの末尾に任意のトップレベルコンテンツ(関数、クラス、定数、型エイリアス)を追加します。

add_method

file_path, class_target, content

クラス本体の末尾にメソッドを追加します。

add_field

file_path, class_target, content

クラス本体の先頭にフィールド/属性/メンバーを追加します。

insert_before

file_path, target, content

名前付きシンボルの直前に兄弟要素を挿入します。

insert_after

file_path, target, content

名前付きシンボルの直後に兄弟要素を挿入します。

delete_symbol

file_path, target

関数またはクラス定義ブロック(デコレータを含む)を削除します。

パラメータとシグネチャ

ツール

パラメータ

説明

add_parameter

file_path, target, parameter, position

関数シグネチャにパラメータを追加します(position: "start" または "end")。

remove_parameter

file_path, target, parameter_name

名前でパラメータを削除します。

インポートとインクルード

ツール

パラメータ

説明

add_import

file_path, import_text

import/from/#include 行を追加します。重複はスキップします。

remove_import

file_path, import_text

一致するインポート行を削除します。

add_import_name

file_path, module, name

既存の from <module> import a, b に名前を1つ追加します。Python専用。

remove_import_name

file_path, module, name

複数名前のPython from-importから名前を1つ削除します。

コメントとDocstrings

ツール

パラメータ

説明

add_comment_before

file_path, target, comment

名前付きシンボルの直前にコメントブロックを挿入します。Python/Ruby/YAML/TOML (#)、JS/TS/C/C++/Go/Java (// または /* */; Java Javadoc /** */ 対応) で動作します。

remove_leading_comment

file_path, target

シンボルの上の連続するコメントブロックを削除します。行コメントとCスタイルの単一行または複数行 /* ... */ ブロックの両方を認識します。

replace_leading_comment

file_path, target, new_comment

シンボルの上の先頭コメントブロックを置換します(存在しない場合は挿入します)。

replace_docstring

file_path, target, new_docstring

Python関数/クラスのdocstringを置換または挿入します。Python専用。

Dict/list編集 (JSON, YAML, TOML, およびPythonモジュールレベルのdict/listリテラル)

ツール

パラメータ

説明

replace_value

file_path, target, content

既存の設定キーの値を置換します。target はドット区切りのキーパスです。

add_key

file_path, parent_target, key, value

dict/object/mapping/tableにキーと値のペアを追加します。Pythonの場合、parent_target はdict変数名です。設定の場合、ドット区切りのパスです(ルートには `"

Install Server
A
security – no known vulnerabilities
A
license - permissive license
A
quality - A tier

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