editor-mcp

by danielpodrazka
Verified

local-only server

The server can only run on the client’s local machine because it depends on local resources.

Integrations

  • Uses Babel for JavaScript and React JSX syntax validation before committing code changes, ensuring JavaScript/React code maintains proper syntax.

  • Provides syntax checking for JavaScript files (.js) to maintain code integrity when editing JavaScript code.

  • Requires Node.js to perform JavaScript/JSX syntax validation through Babel when editing these file types.

エディターMCP

FastMCPで構築されたPythonベースのテキストエディタサーバーは、強力なファイル操作ツールを提供します。このサーバーは、標準化されたAPIと独自のマルチステップアプローチを介してテキストファイルの読み取り、編集、管理を可能にし、LLMやAIアシスタントのコード編集の精度と信頼性を大幅に向上させます。

特徴

  • ファイルの選択: 絶対パスを使用して作業するファイルを設定する
  • 読み取り操作:
    • skimを使用して行番号付きのファイル全体を読み取る
    • readを使用して、先頭に行番号を付けた特定の行範囲を読み取ります。
    • find_lineを使用してファイル内の特定のテキストを検索する
    • find_functionを使用して Python および JavaScript/JSX ファイル内の関数定義を検索して抽出します。
  • 編集操作:
    • 差分プレビュー付きの2段階編集プロセス
    • ID認証でテキストを選択して上書きする
    • 選択→上書き→パターンの確認/キャンセルによるクリーンな編集ワークフロー
    • Python (.py) および JavaScript/React (.js、.jsx) ファイルの構文チェック
    • コンテンツを含む新しいファイルを作成する
  • ファイル管理:
    • 適切な初期化で新しいファイルを作成する
    • ファイルシステムからファイルを削除する
    • listdirでディレクトリの内容を一覧表示する
  • テストサポート:
    • run_testsで Python テストを実行する
    • 適切なモジュール解決のためにPythonパスを設定する
  • 安全機能:
    • 競合を防ぐためのコンテンツID検証
    • リソース枯渇を防ぐための行数制限
    • コードの整合性を維持するための構文チェック
    • 機密ファイルへのアクセスを制限するための保護されたパス

セキュリティリスク

editor-mcp には、特定のセキュリティ上の考慮事項を伴う強力な機能が含まれています。

  • 脱獄リスク:有害な命令が埋め込まれたファイルを読み込んだ場合、editor-mcp は脱獄される可能性があります。編集中のファイル内の悪意のあるコンテンツには、AI アシスタントを操作する命令が含まれている可能性があります。
  • 任意のコード実行: テストの実行が有効になっている場合、操作されたテスト ファイルまたは悪意のある Python コードによって任意のコードが実行されるリスクがあります。
  • データの公開: 適切なパス保護が構成されていない場合、ファイル システム操作へのアクセスによって機密情報が公開される場合があります。

これらのリスクを軽減するには:

  1. 機密ファイルとディレクトリへのアクセスを制限するには、 PROTECTED_PATHS環境変数を使用します。
  2. 絶対に必要な場合を除き、運用環境でのテスト実行機能を無効にします。
  3. 特に信頼できないソースから送信されたファイルの場合は、開く前にファイルを慎重に確認してください。
  4. 権限が制限されたサンドボックス環境でエディターを実行することを検討してください。

LLMの主な利点

このテキスト エディターの独自の設計により、LLM コード編集に通常影響する重大な問題が解決されます。

  • コンテキストの喪失を防止- 従来のアプローチでは、LLMが数回の編集でコードベースの概要を把握できなくなることがよくあります。この実装では、複数のステップにわたるプロセスを通じてコンテキストが維持されます。
  • リソースを大量に消費する書き換えを回避- LLMは通常、混乱が生じた場合にファイル全体を置き換えてしまうため、コストがかかり、処理が遅く、非効率的です。このエディターは、選択的な編集を強制します。
  • 視覚的なフィードバックを提供- 差分プレビュー システムにより、LLM は変更をコミットする前に実際に変更を確認して検証できるため、エラーが大幅に削減されます。
  • 構文チェックを強制- Python および JavaScript/React の自動検証により、壊れたコードがコミットされないようにします。
  • 編集推論の改善- マルチステップ アプローチにより、LLM はステップ間で推論する時間を確保でき、無計画なトークン生成を削減できます。

リソース管理

エディターは、システムの安定性を確保し、リソースの枯渇を防ぐために、いくつかの安全策を実装しています。

  • 最大編集行数: デフォルトでは、エディターは1回の編集操作につき50行の制限を適用します。

インストール

このMCPはClaude Desktopで開発およびテストされています。Claude Desktopはどのプラットフォームでもダウンロードできます。Linux版Claude Desktopの場合は、非公式インストールスクリプト(公式ファイルを使用)を使用できます。推奨リポジトリ: https ://github.com/emsi/claude-desktop/tree/main

Claude Desktop をインストールしたら、以下の手順に従ってこの特定の MCP をインストールします。

UVXによる簡単なインストール(推奨)

Editor MCP をインストールする最も簡単な方法は、提供されているインストール スクリプトを使用することです。

# Clone the repository git clone https://github.com/danielpodrazka/editor-mcp.git cd editor-mcp # Run the installation script chmod +x install.sh ./install.sh

このスクリプトは次のことを行います。

  1. UVXがインストールされているかどうかを確認し、必要に応じてインストールします。
  2. 開発モードでエディターMCPをインストールする
  3. editor-mcpコマンドをPATHで利用できるようにします

手動インストール

UVXの使用

# Install directly from GitHub uvx install git+https://github.com/danielpodrazka/mcp-text-editor.git # Or install from a local clone git clone https://github.com/danielpodrazka/mcp-text-editor.git cd mcp-text-editor uvx install -e .

従来のpipの使用

pip install git+https://github.com/danielpodrazka/mcp-text-editor.git # Or from a local clone git clone https://github.com/danielpodrazka/mcp-text-editor.git cd mcp-text-editor pip install -e .

要件の使用(レガシー)

ロック ファイルからインストールします。

uv pip install -r uv.lock

ロックされた要件ファイルの生成:

uv pip compile requirements.in -o uv.lock

使用法

サーバーの起動

インストール後、次のいずれかの方法で Editor MCP サーバーを起動できます。

# Using the installed script editor-mcp # Or using the Python module python -m text_editor.server

MCP構成

エディター MCP を MCP 構成ファイルに追加できます。

{ "mcpServers": { "text-editor": { "command": "editor-mcp", "env": { "MAX_SELECT_LINES": "100", "ENABLE_JS_SYNTAX_CHECK": "0", "FAIL_ON_PYTHON_SYNTAX_ERROR": "1", "FAIL_ON_JS_SYNTAX_ERROR": "0", "PROTECTED_PATHS": "*.env,.env*,config*.json,*secret*,/etc/passwd,/home/user/.ssh/id_rsa" } } } }

環境変数の設定

エディター MCP は、動作をカスタマイズするためのいくつかの環境変数をサポートしています。

  • MAX_SELECT_LINES : "100" - 1回の操作で編集できる行の最大数(デフォルトは50)
  • ENABLE_JS_SYNTAX_CHECK : "0" - JavaScript および JSX 構文チェックを有効/無効にする (デフォルトは "1" - 有効)
  • FAIL_ON_PYTHON_SYNTAX_ERROR : "1" - 有効にすると、Python構文エラーによって上書き操作が自動的にキャンセルされます(デフォルトでは有効)
  • FAIL_ON_JS_SYNTAX_ERROR : "0" - 有効にすると、JavaScript/JSX 構文エラーによって上書き操作が自動的にキャンセルされます (デフォルトは無効)
  • PROTECTED_PATHS : アクセスできないファイルパターンまたはパスのコンマ区切りリスト。ワイルドカードをサポートします(例:「 .env,.env ,/etc/passwd」)

ソースからビルドする場合のサンプル MCP 構成

{ "mcpServers": { "text-editor": { "command": "/home/daniel/pp/venvs/editor-mcp/bin/python", "args": ["/home/daniel/pp/editor-mcp/src/text_editor/server.py"], "env": { "MAX_SELECT_LINES": "100", "ENABLE_JS_SYNTAX_CHECK": "0", "FAIL_ON_PYTHON_SYNTAX_ERROR": "1", "FAIL_ON_JS_SYNTAX_ERROR": "0", "PROTECTED_PATHS": "*.env,.env*,config*.json,*secret*,/etc/passwd,/home/user/.ssh/id_rsa" } } } }

利用可能なツール

エディター MCP は、ファイルの操作、編集、テストのための 13 個の強力なツールを提供します。

1. set_file

作業する現在のファイルを設定します。

パラメータ:

  • filepath (str): ファイルへの絶対パス

戻り値:

  • ファイルパスを含む確認メッセージ

2. skim

現在のファイルから全文を読み取ります。各行の先頭には行番号が付きます。

戻り値:

  • 行番号、行の総数、最大編集行数の設定を含む行を含む辞書

出力例:

{ "lines": [ [1, "def hello():"], [2, " print(\"Hello, world!\")"], [3, ""], [4, "hello()"] ], "total_lines": 4, "max_select_lines": 50 }

3. read

現在のファイルから開始行から終了行までテキストを読み取ります。

パラメータ:

  • start (int): 開始行番号(1から始まるインデックス)
  • end (int): 終了行番号(1から始まるインデックス)

戻り値:

  • 行番号をキーとして持つ行と、開始行と終了行の情報を含む辞書

出力例:

{ "lines": [ [1, "def hello():"], [2, " print(\"Hello, world!\")"], [3, ""], [4, "hello()"] ], "start_line": 1, "end_line": 4 }

4. select

後続の上書き操作のために、現在のファイルから行の範囲を選択します。

パラメータ:

  • start (int): 開始行番号(1から始まる)
  • end (int): 終了行番号(1から始まる)

戻り値:

  • 検証用に選択された行、行範囲、および ID を含む辞書

注記

  • このツールは、max_select_linesに対して選択を検証します。
  • 選択内容は上書きツールで使用するために保存されます
  • 上書きツールを呼び出す前にこれを使用する必要があります

5. overwrite

現在のファイル内の一定範囲の行を新しいテキストで上書きする準備をします。

パラメータ:

  • new_lines (リスト): 選択範囲を上書きする新しい行のリスト

戻り値:

  • 提案された変更を示す差分プレビュー

注記

  • これは 2 段階のプロセスの最初のステップです。
    1. まずoverwrite()を呼び出して差分プレビューを生成します
    2. 次に、confirm() を呼び出して適用するか、cancel() を呼び出して保留中の変更を破棄します。
  • このツールは、以前に選択した行を新しいコンテンツに置き換えることができます。
  • 新しい行の数は元の選択と異なる場合があります
  • Pythonファイル(.py拡張子)の場合、書き込む前に構文チェックが実行されます。
  • JavaScript/Reactファイル(拡張子.js、.jsx)の場合、構文チェックはオプションであり、 ENABLE_JS_SYNTAX_CHECK環境変数で無効にすることができます。

6. confirm

上書き操作からの保留中の変更を適用します。

戻り値:

  • ステータスとメッセージを含む操作結果

注記

  • これは編集プロセスの2番目のステップで実行できる2つのアクションのうちの1つです。
  • 変更が正常に適用されると選択は削除されます

7. cancel

上書き操作から保留中の変更を破棄します。

戻り値:

  • ステータスとメッセージを含む操作結果

注記

  • これは編集プロセスの2番目のステップで実行できる2つのアクションのうちの1つです。
  • 変更をキャンセルしても選択はそのまま残ります

8. delete_file

現在設定されているファイルを削除します。

戻り値:

  • ステータスとメッセージを含む操作結果

9. new_file

新しいファイルを作成します。

パラメータ:

  • absolute_file_path (str): 新しいファイルのパス

戻り値:

  • 該当する場合、コンテンツのステータスと ID を含む操作結果

注記

  • 現在のファイルが存在し、空でない場合、このツールは失敗します

10. find_line

現在のファイル内で指定されたテキストに一致する行を検索します。

パラメータ:

  • search_text (str): ファイル内で検索するテキスト

戻り値:

  • 一致する行とその行番号および一致の合計を含む辞書

出力例:

{ "status": "success", "matches": [ [2, " print(\"Hello, world!\")"] ], "total_matches": 1 }

注記

  • ファイルパスが設定されていない場合はエラーを返します
  • 各行内のテキストの完全一致を検索します
  • このIDは後続の編集操作に使用できます

11. find_function

現在の Python または JavaScript/JSX ファイル内の関数またはメソッドの定義を検索します。

パラメータ:

  • function_name (str): 検索する関数またはメソッドの名前

戻り値:

  • 関数の行番号、start_line、end_line を含む辞書

出力例:

{ "status": "success", "lines": [ [10, "def hello():"], [11, " print(\"Hello, world!\")"], [12, " return True"] ], "start_line": 10, "end_line": 12 }

注記

  • Pythonファイルの場合、このツールはPythonのASTとトークン化モジュールを使用して、デコレータやドキュメント文字列を含む関数の境界を正確に識別します。
  • JavaScript/JSX ファイルの場合、このツールは複数のアプローチを組み合わせて使用します。
    • 主な方法: Babel AST 解析 (利用可能な場合) (Node.js および Babel パッケージが必要)
    • フォールバック方法: Babel が利用できない場合の関数宣言の正規表現パターンマッチング
  • 標準関数、非同期関数、矢印関数、React フックなど、さまざまな JavaScript 関数タイプをサポートします。
  • ファイルパスが設定されていない場合、または関数が見つからない場合はエラーを返します。

12. listdir

ディレクトリの内容を一覧表示します。

パラメータ:

  • dirpath (str): リストするディレクトリへのパス

戻り値:

  • ファイル名とクエリされたパスのリストを含む辞書

13. run_testsset_python_path

pytest を使用して Python テストを実行し、Python 環境を構成するためのツール。

  • JavaScript 構文チェックを無効にするには、「0」、「false」、または「no」に設定します
  • Babelと関連する依存関係がインストールされていない場合に便利です
  • FAIL_ON_PYTHON_SYNTAX_ERROR : Python構文エラーが発生した場合に上書き操作を自動的にキャンセルするかどうかを制御します(デフォルト: 1)
    • 有効にすると、Python ファイルの構文エラーにより上書きアクションが自動的にキャンセルされます。
    • 線は選択されたままなので、エラーを修正して再試行できます。
  • FAIL_ON_JS_SYNTAX_ERROR : JavaScript/JSX 構文エラーが発生した場合に上書き操作を自動的にキャンセルするかどうかを制御します (デフォルト: 0)
    • 有効にすると、JavaScript/JSX ファイルの構文エラーにより上書きアクションが自動的にキャンセルされます。
    • 線は選択されたままなので、エラーを修正して再試行できます。
  • DUCKDB_USAGE_STATS : DuckDBデータベースで使用状況統計を収集するかどうかを制御します(デフォルト: 0)
    • ツールの使用統計の収集を有効にするには、「1」、「true」、または「yes」に設定します
    • 有効にすると、タイムスタンプや引数を含む各ツール呼び出しに関する情報を記録します。
  • STATS_DB_PATH : 統計用のDuckDBデータベースが保存されるパス(デフォルト: "text_editor_stats.duckdb")
    • DUCKDB_USAGE_STATSが有効な場合にのみ使用されます
  • PROTECTED_PATHS : アクセスを拒否するファイルパターンまたは絶対パスのカンマ区切りリスト
    • 例: *.env,.env*,config*.json,*secret*,/etc/passwd,/home/user/credentials.txt
    • 正確なファイル パスと、任意の位置でワイルドカードを使用できる柔軟な glob パターンの両方をサポートします。
      • *.env - .envdev.envprod.envなど、 .env で終わるファイルに一致します。
      • .env* - .env.env.local.env.productionなど、 .env で始まるファイルに一致します。
      • *secret* - 名前に「secret」を含むファイルに一致します
    • 機密性の高い構成ファイルや資格情報が誤って公開されることを防ぎます
    • 線は選択されたままなので、エラーを修正して再試行できます。

発達

前提条件

editor-mcp には以下が必要です:

  • Python 3.7以上
  • FastMCPパッケージ
  • 黒(Pythonコードのフォーマットチェック用)
  • Babel (JavaScript/JSX ファイルで作業する場合の構文チェック用)

開発依存関係をインストールします。

# Using pip pip install pytest pytest-asyncio pytest-cov # Using uv uv pip install pytest pytest-asyncio pytest-cov

JavaScript/JSXの構文検証には、Node.jsとBabelが必要です。テキストエディターは、以下のファイル形式の編集時にnpx babelを使用してJS/JSXの構文をチェックします。

# Required for JavaScript/JSX syntax checking npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/preset-react # You can also install these globally if you prefer # npm install -g @babel/core @babel/cli @babel/preset-env @babel/preset-react

エディターには以下が必要です:

  • @babel/core@babel/cli - 構文チェック用のコア Babel パッケージ
  • @babel/preset-env - 標準の JavaScript (.js) ファイル用
  • @babel/preset-react - React JSX (.jsx) ファイル用

テストの実行

# Run tests pytest -v # Run tests with coverage pytest -v --cov=text_editor

テスト構造

テスト スイートは以下をカバーします。

  1. set_file ツール
    • 有効なファイルの設定
    • 存在しないファイルの設定
  2. 読み取りツール
    • ファイル状態の検証
    • ファイル全体の読み取り
    • 特定の行範囲の読み取り
    • 空のファイルのようなエッジケース
    • 無効な範囲の処理
  3. 選択ツール
    • 行範囲の検証
    • max_select_linesに対する選択検証
    • 後続の操作のための選択保存
  4. 上書きツール
    • IDを使用した選択したコンテンツの検証
    • コンテンツ置換の検証
    • Python および JavaScript/React ファイルの構文チェック
    • 変更の差分プレビューの生成
  5. ツールの確認とキャンセル
    • 保留中の変更を適用またはキャンセルする
    • 2段階認証プロセス
  6. ファイル削除ツール
    • ファイル削除の検証
  7. 新しいファイルツール
    • ファイル作成の検証
    • 既存ファイルの処理
  8. find_line ツール
    • ファイル内のテキスト一致の検索
    • 特定の検索用語の処理
    • 存在しないファイルのエラー処理
    • 一致しないケースの処理
    • 既存ファイルの処理

仕組み

多段階編集アプローチ

LLM が単に編集する行を検索して置換するだけの従来のコード編集アプローチ (複数回の編集後に混乱が生じることが多い) とは異なり、このエディターは構造化された複数ステップのワークフローを実装し、編集の精度を大幅に向上させます。

  1. set_file - まず、LLMは編集したいファイルを設定します
  2. skim - LLMはファイル全体を読み取り、完全な概要を取得します。
  3. 読む- LLMはタスクに関連する特定のセクションを調べ、より良い文脈のために数字の横に行を表示します。
  4. 選択- 編集の準備ができたら、LLM は特定の行を選択します (設定可能な数に制限され、デフォルトは 50)
  5. 上書き- LLMは置換コンテンツを提案し、何が変更されるかを正確に示すgit diffスタイルのプレビューを表示します。
  6. 確認/キャンセル- プレビューを確認した後、LLMは変更を適用するか破棄するかを選択できます。

この構造化されたワークフローにより、LLMは各編集について慎重に判断するようになり、誤ってファイル全体を上書きしてしまうといったよくあるエラーを防止できます。変更をコミットする前にプレビューを確認できるため、LLMは編集内容が正しいことを確認できます。

ID認証システム

サーバーはFastMCPを使用して、明確に定義されたAPIを通じてテキスト編集機能を提供します。ID検証システムは、読み取り操作と変更操作の間でコンテンツが変更されていないことを検証することで、データの整合性を保証します。

IDメカニズムは、SHA-256を使用して、ファイルコンテンツまたは選択された行範囲の一意の識別子を生成します。行指定の操作の場合、IDには行範囲を示すプレフィックス(例:"L10-15-[ハッシュ]")が含まれます。これにより、編集が期待されるコンテンツに適用されていることを確認できます。

実装の詳細

メインのTextEditorServerクラス:

  1. 「text-editor」という名前のFastMCPインスタンスで初期化します。
  2. 環境変数から設定可能なmax_select_lines制限(デフォルト: 50)を設定します。
  3. 現在のファイルパスを状態として維持する
  4. FastMCP を通じて 13 個の主要ツールを登録します。
    • set_file : 現在のファイルパスを検証して設定します
    • skim : ファイルの内容全体を読み取り、行番号から行テキストまでの辞書を返します。
    • read : 指定された行範囲から行を読み取り、行の内容の構造化された辞書を返します。
    • select : 後続の上書き操作の対象となる行を選択する
    • overwrite : 新しい行のリストを取得し、変更されたコンテンツの差分プレビューを準備します。
    • confirm : 上書き操作から保留中の変更を適用します
    • cancel : 上書き操作から保留中の変更を破棄します
    • delete_file : 現在のファイルを削除する
    • new_file : 新しいファイルを作成する
    • find_line : 特定のテキストを含む行を検索します
    • find_function : Python および JavaScript/JSX ファイル内の関数またはメソッドの定義を検索します
    • listdir : ディレクトリの内容を一覧表示する
    • run_testsset_python_path : Python テストを実行するためのツール

サーバーはデフォルトで FastMCP の stdio トランスポートを使用して実行されるため、さまざまなクライアントとの統合が容易になります。

最良の結果を得るためのシステムプロンプト

AI アシスタントで最適な結果を得るには、AI が管理しやすく安全な編集を行えるようにガイドするシステム プロンプト ( system_prompt.mdを参照) を使用することをお勧めします。

このシステム プロンプトは、AI アシスタントを支援します。

  1. 段階的な変更- 編集を小さな部分に分割する
  2. コードの整合性を維持する- コードの機能性を維持する変更を加える
  3. リソース制限内で作業する- システムに過大な負担をかける可能性のある操作を避ける
  4. 検証ワークフローに従う- 編集後にエラーがないか最終チェックを行う

AI アシスタントを使用するときにこのシステム プロンプトを組み込むことで、編集動作の信頼性が向上し、自動コード編集でよくある落とし穴を回避できます。

使用状況統計

テキスト エディター MCP を有効にすると、使用状況の統計を収集して、編集ツールの使用状況に関する洞察を提供できます。

  • データ収集: DUCKDB_USAGE_STATSが有効な場合、統計は DuckDB データベースに収集されます。
  • 追跡情報: ツール名、引数、タイムスタンプ、現在のファイルパス、ツール応答、リクエスト/クライアントIDを記録します。
  • 保存場所: データはSTATS_DB_PATHで指定されたDuckDBファイルに保存されます。
  • プライバシー: すべてがローカルマシンに保存されます

収集された統計情報は、使用パターンを理解し、一般的なワークフローを特定し、最も頻繁に実行される操作に合わせてエディターを最適化するのに役立ちます。

任意の DuckDB クライアントを介して標準 SQL を使用してデータベースをクエリし、使用パターンを分析できます。

トラブルシューティング

問題が発生した場合:

  1. ファイルの権限を確認する
  2. ファイルパスが絶対パスであることを確認する
  3. 環境が Python 3.7 以上を使用していることを確認する

インスピレーション

同様のプロジェクトhttps://github.com/tumf/mcp-text-editorに触発され、最初はこれをフォークしましたが、全体的なアイデアだけは同じままにするために、コードベース全体を最初から書き直すことにしました。

ID: era56k0b3d