mcp-text-editor

by tumf
MIT License
79
  • Apple
  • Linux

local-only server

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

Integrations

  • Integration for code coverage reporting, as indicated by the codecov badge in the README.

MCP テキストエディターサーバー

標準化されたAPIを通じて行指向のテキストファイル編集機能を提供するモデルコンテキストプロトコル(MCP)サーバー。効率的な部分ファイルアクセスによりトークン使用量を最小限に抑え、LLMツール向けに最適化されています。

Claude.app ユーザー向けクイックスタート

このエディターを Claude.app で使用するには、プロンプトに次の構成を追加します。

code ~/Library/Application\ Support/Claude/claude_desktop_config.json
{ "mcpServers": { "text-editor": { "command": "uvx", "args": [ "mcp-text-editor" ] } } }

またはdockerの場合:

{ "mcpServers": { "text-editor": { "command": "docker", "args": [ "run", "-i", "--rm", "--mount", "type=bind,src=/some/path/src,dst=/some/path/dst", "mcp/text-editor" ] } } }

概要

MCPテキストエディターサーバーは、クライアントサーバーアーキテクチャにおいて、安全かつ効率的な行ベースのテキストファイル操作を可能にするように設計されています。モデルコンテキストプロトコル(Model Context Protocol)を実装し、堅牢な競合検出と解決により信頼性の高いファイル編集を実現します。行指向のアプローチは、共同編集ツール、自動テキスト処理システム、複数のプロセスがテキストファイルを安全に変更する必要があるシナリオなど、同期されたファイルアクセスを必要とするアプリケーションに最適です。部分ファイルアクセス機能は、ファイルの必要な部分のみを読み込むことでトークンの消費量を削減できるため、LLMベースのツールにとって特に役立ちます。

主なメリット

  • 行ベースの編集操作
  • 行範囲指定によるトークン効率の良い部分ファイルアクセス
  • LLMツール統合に最適化
  • ハッシュベースの検証による安全な同時編集
  • アトミックなマルチファイル操作
  • カスタムエラータイプによる堅牢なエラー処理
  • 包括的なエンコーディング サポート (utf-8、shift_jis、latin1 など)

特徴

  • 行指向のテキストファイルの編集と読み取り
  • LLM アプリケーションでのトークンの使用を最小限に抑えるスマートな部分ファイル アクセス
  • 行範囲指定でテキストファイルの内容を取得する
  • 1 回の操作で複数のファイルから複数の範囲を読み取る
  • 行番号シフトを正しく処理する行ベースのパッチ適用
  • 競合検出機能を使用してテキストファイルの内容を編集する
  • 柔軟な文字エンコードのサポート (utf-8、shift_jis、latin1 など)
  • 複数のファイル操作のサポート
  • ハッシュベースの検証による同時編集の適切な処理
  • 大容量ファイルのメモリ効率の高い処理

要件

  • Python 3.11以上
  • POSIX準拠のオペレーティングシステム(Linux、macOSなど)またはWindows
  • テキストファイル操作に十分なディスク容量
  • 読み取り/書き込み操作のファイルシステム権限
  1. Python 3.11以降をインストールする
pyenv install 3.11.6 pyenv local 3.11.6
  1. uv(推奨)またはpipをインストールする
curl -LsSf https://astral.sh/uv/install.sh | sh
  1. 仮想環境を作成し、依存関係をインストールする
uv venv source .venv/bin/activate # On Windows: .venv\Scripts\activate uv pip install -e ".[dev]"

要件

  • Python 3.13以上
  • POSIX準拠のオペレーティングシステム(Linux、macOSなど)またはWindows
  • 読み取り/書き込み操作のファイルシステム権限

インストール

uvx経由で実行

uvx mcp-text-editor

Smithery経由でインストール

Smithery経由で Claude Desktop のテキスト エディター サーバーを自動的にインストールするには:

npx -y @smithery/cli install mcp-text-editor --client claude

手動インストール

  1. Python 3.13以降をインストールする
pyenv install 3.13.0 pyenv local 3.13.0

Dockerのインストール

docker build --network=host -t mcp/text-editor .
  1. uv(推奨)またはpipをインストールする
curl -LsSf https://astral.sh/uv/install.sh | sh
  1. 仮想環境を作成し、依存関係をインストールする
uv venv source .venv/bin/activate # On Windows: .venv\Scripts\activate uv pip install -e ".[dev]"

使用法

サーバーを起動します。

python -m mcp_text_editor

docker でサーバーを起動します。

docker run -i --rm --mount "type=bind,src=/some/path/src,dst=/some/path/dst" mcp/text-editor

検査官と:

npx @modelcontextprotocol/inspector docker run -i --rm --mount "type=bind,src=/some/path/src,dst=/some/path/dst" mcp/text-editor

MCPツール

サーバーはテキスト ファイルの操作用にいくつかのツールを提供します。

テキストファイルの内容を取得する

行範囲を指定して 1 つ以上のテキスト ファイルの内容を取得します。

単一範囲リクエスト:

{ "file_path": "path/to/file.txt", "line_start": 1, "line_end": 10, "encoding": "utf-8" // Optional, defaults to utf-8 }

複数の範囲のリクエスト:

{ "files": [ { "file_path": "file1.txt", "ranges": [ {"start": 1, "end": 10}, {"start": 20, "end": 30} ], "encoding": "shift_jis" // Optional, defaults to utf-8 }, { "file_path": "file2.txt", "ranges": [ {"start": 5, "end": 15} ] } ] }

パラメータ:

  • file_path : テキストファイルへのパス
  • line_start / start : 開始行番号(1から始まる)
  • line_end / end : 終了行番号(含む、ファイルの終わりの場合は null)
  • encoding : ファイルのエンコーディング(デフォルト: "utf-8")。テキストファイルのエンコーディングを指定します(例: "shift_jis"、"latin1")。

単一範囲応答:

{ "contents": "File contents", "line_start": 1, "line_end": 10, "hash": "sha256-hash-of-contents", "file_lines": 50, "file_size": 1024 }

複数の範囲の応答:

{ "file1.txt": [ { "content": "Lines 1-10 content", "start": 1, "end": 10, "hash": "sha256-hash-1", "total_lines": 50, "content_size": 512 }, { "content": "Lines 20-30 content", "start": 20, "end": 30, "hash": "sha256-hash-2", "total_lines": 50, "content_size": 512 } ], "file2.txt": [ { "content": "Lines 5-15 content", "start": 5, "end": 15, "hash": "sha256-hash-3", "total_lines": 30, "content_size": 256 } ] }

パッチテキストファイルの内容

堅牢なエラー処理と競合検出機能を備え、テキストファイルにパッチを適用します。1回の操作で複数のファイルを編集できます。

リクエスト形式:

{ "files": [ { "file_path": "file1.txt", "hash": "sha256-hash-from-get-contents", "encoding": "utf-8", // Optional, defaults to utf-8 "patches": [ { "start": 5, "end": 8, "range_hash": "sha256-hash-of-content-being-replaced", "contents": "New content for lines 5-8\n" }, { "start": 15, "end": null, // null means end of file "range_hash": "sha256-hash-of-content-being-replaced", "contents": "Content to append\n" } ] } ] }

重要な注意事項:

  1. 編集する前に、必ず get_text_file_contents を使用して現在のハッシュと range_hash を取得してください。
  2. 行番号のシフトを正しく処理するために、パッチは下から上に適用されます。
  3. 同じファイル内でパッチが重複してはならない
  4. 行番号は1から始まります
  5. end: nullファイルの末尾にコンテンツを追加するために使用できます。
  6. ファイルのエンコーディングは、get_text_file_contents で使用されるエンコーディングと一致する必要があります。

成功レスポンス:

{ "file1.txt": { "result": "ok", "hash": "sha256-hash-of-new-contents" } }

ヒント付きのエラー応答:

{ "file1.txt": { "result": "error", "reason": "Content hash mismatch", "suggestion": "get", // Suggests using get_text_file_contents "hint": "Please run get_text_file_contents first to get current content and hashes" } }
"result": "error", "reason": "Content hash mismatch - file was modified", "hash": "current-hash", "content": "Current file content"

} }

### Common Usage Pattern 1. Get current content and hash: ```python contents = await get_text_file_contents({ "files": [ { "file_path": "file.txt", "ranges": [{"start": 1, "end": null}] # Read entire file } ] })
  1. ファイルの内容を編集します:
result = await edit_text_file_contents({ "files": [ { "path": "file.txt", "hash": contents["file.txt"][0]["hash"], "encoding": "utf-8", # Optional, defaults to "utf-8" "patches": [ { "line_start": 5, "line_end": 8, "contents": "New content\n" } ] } ] })
  1. 競合の処理:
if result["file.txt"]["result"] == "error": if "hash mismatch" in result["file.txt"]["reason"]: # File was modified by another process # Get new content and retry pass

エラー処理

サーバーはさまざまなエラーケースを処理します。

  • ファイルが見つかりません
  • 権限エラー
  • ハッシュの不一致(同時編集検出)
  • 無効なパッチ範囲
  • 重なり合うパッチ
  • エンコードエラー(指定されたエンコードでファイルをデコードできない場合)
  • 行番号が範囲外です

セキュリティに関する考慮事項

  • ファイルパス検証: サーバーはディレクトリトラバーサル攻撃を防ぐためにすべてのファイルパスを検証します。
  • アクセス制御: 許可されたディレクトリへのアクセスを制限するために、適切なファイルシステム権限を設定する必要があります。
  • ハッシュ検証: すべてのファイルの変更は、競合状態を防ぐために SHA-256 ハッシュを使用して検証されます。
  • 入力サニタイズ: すべてのユーザー入力は適切にサニタイズされ、検証されます
  • エラー処理: エラーメッセージでは機密情報が公開されません

トラブルシューティング

よくある問題

  1. 許可が拒否されました
    • ファイルとディレクトリの権限を確認する
    • サーバープロセスに必要な読み取り/書き込みアクセス権があることを確認する
  2. ハッシュの不一致と範囲ハッシュエラー
    • ファイルは別のプロセスによって変更されました
    • 置き換えられるコンテンツが変更されました
    • get_text_file_contentsを実行して最新のハッシュを取得します
  3. エンコーディングの問題
    • ファイルのエンコーディングが指定されたエンコーディングと一致することを確認する
    • 新しいファイルにはutf-8を使用する
    • ファイル内のBOMマーカーを確認する
  4. 接続の問題
    • サーバーが稼働しておりアクセス可能であることを確認する
    • ネットワーク構成とファイアウォールの設定を確認する
  5. パフォーマンスの問題
    • 大きなファイルの場合は、行範囲を狭くすることを検討してください
    • システムリソース(メモリ、ディスク容量)を監視する
    • ファイルの種類に応じて適切なエンコードを使用する

発達

設定

  1. リポジトリをクローンする
  2. Python仮想環境を作成してアクティブ化する
  3. 開発依存関係をインストールします: uv pip install -e ".[dev]"
  4. テストを実行する: make all

コード品質ツール

  • 糸くずの出るラフ
  • コードフォーマット用の黒
  • インポートソート用のisort
  • 型チェックのためのmypy
  • テストカバレッジ用のpytest-cov

テスト

テストはtestsディレクトリにあり、pytest で実行できます。

# Run all tests pytest # Run tests with coverage report pytest --cov=mcp_text_editor --cov-report=term-missing # Run specific test file pytest tests/test_text_editor.py -v

現在のテスト範囲: 90%

プロジェクト構造

mcp-text-editor/ ├── mcp_text_editor/ │ ├── __init__.py │ ├── __main__.py # Entry point │ ├── models.py # Data models │ ├── server.py # MCP Server implementation │ ├── service.py # Core service logic │ └── text_editor.py # Text editor functionality ├── tests/ # Test files └── pyproject.toml # Project configuration

ライセンス

マサチューセッツ工科大学

貢献

  1. リポジトリをフォークする
  2. 機能ブランチを作成する
  3. 変更を加える
  4. テストとコード品質チェックを実行する
  5. プルリクエストを送信する

入力ヒント

このプロジェクトでは、コードベース全体でPythonの型ヒントを使用しています。貢献する場合には、必ずこれを維持するようにしてください。

エラー処理

すべてのエラーケースは適切に処理され、意味のあるエラーメッセージが返される必要があります。無効な入力やファイル操作によってサーバーがクラッシュすることは決してあってはなりません。

テスト

新機能には適切なテストを含める必要があります。現在のテスト範囲を維持または改善するよう努めてください。

コードスタイル

すべてのコードはBlackでフォーマットされ、Ruffリンティングに合格する必要があります。インポート時のソートはisortで処理する必要があります。

ID: k44dnvso10