🔖

MCPでclaude desktopと連携してコード編集してくれるツール作った(紹介記事)

に公開

MCPでclaude desktopと連携してコード編集してくれるツール作った(紹介記事)

MCPでコード編集するツールはいくつかありますが、bash実行やディレクトリアクセスが制限されていないなど、セキュリティ面が気になるものが多いです。そこで、セキュリティを重視したコード編集ツール「MCP-Code」を自作してみました。

既存ツールの課題

一般的なMCPコード編集ツールには以下のような問題があります。

  • shellツールでrm -rf /のような危険なコマンドが実行可能
  • プロジェクト外の/etc/passwd~/.ssh/へのアクセスが可能
  • .envファイルや秘密鍵ファイルの内容がAIに送信される可能性

これらは開発効率を上げる一方で、重大なセキュリティリスクを伴います。

セキュリティ

MCPでコード編集するツールに必要な一般的なセキュリティ要件として、以下のようなものがあります。

ファイルアクセス制御

  • プロジェクト外へのアクセス制限: AIがプロジェクトディレクトリ外のファイルにアクセスできないよう制限する
  • 機密ファイルの保護: 環境変数ファイル(.env)、秘密鍵(.pem, .key)などの除外
  • システムファイルの保護: /etc/passwdや重要なシステムファイルへのアクセス防止

コマンド実行制限

  • 任意のシェルコマンド実行の禁止: rm -rf /のような危険なコマンドの実行防止
  • 許可されたスクリプトのみ実行: 事前定義されたスクリプトのみの実行許可
  • 環境変数やパスワードの漏洩防止: コマンド実行時の機密情報保護

パストラバーサル攻撃対策

  • 相対パス攻撃の防止: ../../../etc/passwdのような攻撃の防止
  • シンボリックリンク攻撃の防止: 意図しないファイルへのアクセス防止

ここで紹介してるのは一部です。
実際には入力値のサニタイズなど他にもいろいろあります。

AIに質問したら教えてくれました。

セキュリティ考慮が多く複雑だったため、設計で要点を抑えそもそも対応する必要がないようにしました。

設計

このプロジェクトは以下の設計でセキュリティ要件を満たしています。

1. プロジェクト範囲の制限

export function resolveSafeProjectPath(
  inputPath: string,
  projectRoot: string,
): string {
  return normalizeToProjectRoot(inputPath, projectRoot);
}

すべてのファイルパスを正規化し、プロジェクトルート外へのアクセスを自動的にプロジェクトルートに「丸める」ことで、ディレクトリトラバーサル攻撃を防いでいます。

2. 除外ファイル設定

# グローバル除外設定
excluded_files:
  - "**/*.pem"
  - "**/*.key"

# プロジェクト別除外設定
projects:
  project1:
    excluded_files:
      - "**/.env"
      - "logs/**/*.log"

グローバルとプロジェクト別の二段階で除外ファイルを設定でき、機密ファイルへのアクセスを確実に防げます。

3. スクリプト実行の制限

projects:
  project1:
    scripts:
      build: "npm run build"
      test: "npm run test"

設定ファイルで事前定義されたスクリプトのみが実行可能で、任意のシェルコマンドは実行できません。これによりrm -rf /のような危険なコマンドの実行を防げます。

4. 包括的なログ記録

// システムログとリクエストログの出力
const log = createSystemLogger({});
const requestLog = createRequestErrorLogger({});

すべてのファイル操作とエラーが~/.local/state/mcp-code/logs/に記録され、不正アクセスの検出と監査が可能です。

5. 型安全性とバリデーション

// Zodによる入力検証
const configSchema = z.object({
  current_project: z.string(),
  projects: z.record(
    z.object({
      src: z.string(),
      scripts: z.record(z.string()).optional(),
      excluded_files: z.array(z.string()).optional(),
    }),
  ),
});

TypeScriptとZodによる厳密な型検証により、不正な入力や設定によるセキュリティホールを防いでいます。

実際の使用例

はじめに設定ファイルを ~/.config/mcp-code/config.yaml に置きます。

プロジェクトがあるのは、毎回書き直すのが面倒なためです。

current_projectprojects で設定した名前を指定してください。

設定ファイルの例

# ~/.config/mcp-code/config.yaml
current_project: "my-app"
projects:
  my-app:
    src: "/path/to/my-app"
    scripts:
      build: "npm run build"
      lint: "eslint ."
      format: "prettier --write ."
    excluded_files:
      - "**/.env*"
      - "**/*.pem"
      - "node_modules/**"

次にclaude desktopにMPCサーバーを設定します。

{
  "mcpServers": {
    "mcp_code": {
      "command": "node",
      "args": ["/your/path/to/directory/mcp-code/dist/server.js"],
      "env": {}
    }
  }
}

claude desktopを再起動しMCPサーバーを反映させてください。

起動したら、質問やタスクを投げます。

以下は私が実際に使用している例です。

プロンプト

目標: パーサーの実装

重要なコンテキスト:
- `docs/implementation/PARSER.md` に準拠した実装

まず`docs/implementation/PARSER.md` を読みタスクを理解してください。
次に 途中まで実装済みです。buildしてエラーを修正してください。仕様に準拠しないと他のプログラムとの整合性が取れないので気を付けてください。

**fileEditLines**を複数回同じファイルに使うと場合は行数が変わるため、意図しない内容になります。回避するにはfindInFileで検索すると行数が帰るため、ファイル読み込み後「修正箇所の検索 -> fileEditLines」を繰り返して修正してください。
他にもツールを用意しているため、適切なツールを選択してください。

最後に `docs/implementation/PARSER.md` と実装方針が合っているか確認してください。

タスク: パーサーの実装

こうするとAIがtreeコマンドのようなプログラムでプロジェクトのディレクトリ構造を把握したり、プログラムファイルを読み取って変更をかけてくれます。

※除外設定したディレクトリやファイルは tree表示やfindInFile の結果に含まれません。
つまりそもそもファイル自体あるか見せない設計を取り入れてます。バグを除く

私は「ドキュメント駆動型AI駆動開発」を行っているのでこのように使用しています。

前に「ドキュメント駆動型AI駆動開発」の記事を書いているので興味があれば読んでみてください。

注意点

レート制限

AIが一気にファイルを作成・編集するため、Claude DesktopのAPIレート制限にかかりやすくなります。

大量のファイル操作を行う際は、適度に間隔を空けるか、複数回に分けて実行することをお勧めします。

具体的な制限値

  • Claude Desktop API制限: 1分間に約50リクエスト
  • 大量ファイル編集時の推奨: バッチサイズ10ファイル程度で区切る
  • プロジェクト検索: 1000ファイルまでの制限あり

使用に際しては、その点をご了承ください。

設定ファイルの準備

初回使用時に~/.config/mcp-code/config.yamlの設定が必要です。詳細な設定方法はREADME.mdをご参照ください。

セキュリティ上の重要な注意事項

今回作成したツールは設計によってプロジェクト外のファイルが変更されないようにしていますが、完全に安全かというとそうではありません。

例えば、AIによって編集されたテストファイルや設定ファイルに悪意のあるコードが混入した場合、スクリプト実行時にそれが実行される可能性があります。

スクリプト実行時の留意点

このMCP-Codeはファイルアクセスを厳格に制限していますが、設定されたスクリプト自体のセキュリティは保証していません

そのため使用に当たってはscriptの実行時に必ずファイルを確認してから実行してください。

AIがファイルを編集した後、以下の点にご注意ください。

  • スクリプト実行前の確認: npm run test等を実行する前に、package.jsonやテストファイルの内容を必ず確認
  • 安全なスクリプトの推奨: フォーマッター(prettier)、リンター(eslint)、型チェック(tsc)など、読み取り専用に近い操作を推奨
  • 危険なスクリプトの避用: ファイル削除、外部通信、システム変更を行うスクリプトは慎重に検討

推奨セキュリティプラクティス

このツールでは以下の使い方を推奨しています。

  1. 段階的確認: AI編集→内容確認→スクリプト実行の順序を徹底
  2. 最小権限原則: 必要最小限のスクリプトのみを設定に含める
  3. 定期的な監査: ログファイルを定期的に確認し、意図しない操作がないかチェック

まとめ

このツールは以下の攻撃を防ぎます

ツールの設計による保護範囲

  • プロジェクト外ファイルへのアクセス
  • 機密ファイルの読み書き
  • 任意のシェルコマンド実行

しかし、以下のリスクは防げません:

設計では防げないリスク

  • 編集されたファイル内の悪意のあるコード
  • 設定されたスクリプト自体の脆弱性

コントリビュータ募集中

このプロジェクトでは以下の協力を求めています:

ツールの拡充・強化

  • Git統合機能: gitStatus, gitDiff, gitCommitなどのGit操作
  • コード解析機能: 構文チェック、依存関係解析、TODO抽出
  • 開発支援機能: パッケージ管理、ログ監視、プロセス管理

セキュリティ機能の向上

  • より高度なアクセス制御: ファイル権限ベースの制御
  • 暗号化機能: 機密ファイルの暗号化保存
  • 監査機能: より詳細なアクセスログと異常検知

バグの報告・改善

  • ロジックの改善: バグの報告・ロジックの改善
  • テストケースの改善: より良いテストの拡充

コントリビューションに興味がある方は、CONTRIBUTING.mdをご覧ください。

終わりに

セキュリティを重視したMCPツールを作ることで、AIと安全にコード編集ができる環境を実現できました。

オープンソースとして公開していますので、ぜひ使ってみて改善点や要望があればIssueやPRでお知らせください。皆さんのフィードバックでより良いツールにしていきたいと思います。

一緒により安全で便利なAI開発環境を作っていきましょう!

Discussion