AIエージェント・MCP

ECA(Editor Code Assistant)とは?Emacs・VS Code・CLIでの導入とツール承認の設定

ECA(Editor Code Assistant)とは?Emacs・VS Code・CLIでの導入とツール承認の設定

ECA(Editor Code Assistant)は、Emacs、VS Code、Neovim、IntelliJ、ターミナルから同じ設定で使えるオープンソースのAIコーディング支援ツールです。中心にあるのは Clojure で書かれた eca server で、各クライアントはこのサーバーと標準入出力でやり取りするだけです。LSP(Language Server Protocol)の発想をAIアシスタントに持ち込んだ構成です。

この記事では、2026年11月5日公開の 0.170.1 を手元で起動して確かめた内容をもとに、Emacsでの導入とキー操作、ターミナル用の eca-cli、モデルの設定、ツール承認とフック・サンドボックス、OpenCodeとの違い、採用を見送る条件までを扱います。

まとめ:ECAの要点と導入判断

  • ECAは eca server とクライアントの2層構成です。クライアントがサーバーを自動で取得して起動するため、通常はサーバーを手で入れる必要がありません。
  • Emacsは MELPA から M-x package-install eca で入り、M-x eca でチャットが開きます。要件は Emacs 28.1 以降です。
  • 2026年10月の 0.169.0 でターミナル用の eca-cli が公式クライアントになり、-p でスクリプトやCIからも呼べます。
  • ツール実行の既定は「読み取り専用は許可、それ以外は毎回確認(ask)」です。止めたい操作は toolCall.approval の deny か、preToolCall フックで拒否します。
  • リリースは2026年10月だけで9回です。チームで使うならサーバーの版を固定する手段を先に決めてください。

ECAの仕組み:エディタとLLMの間に立つeca server

ECAは、エディタごとにAI機能を作り直す代わりに、共通のサーバーへ機能を集める設計です。クライアントは eca server を子プロセスとして起動し、LSPと同じ Content-Length ヘッダー付きのJSON-RPCで通信します。チャット、ツール呼び出し、モデルの切り替え、設定の読み込みはサーバー側にあるため、どのクライアントから使っても挙動と設定が揃います。

macOS(Intel)向けのネイティブバイナリ 0.170.1 を取得し、自作の小さなクライアントから initialize を3回送ると、応答は248〜351msでした。サーバーが公開したネイティブツールは20個で、0.161.2(2026年9月25日)と顔ぶれは同じです。スラッシュコマンドは31個から34個に増え、増えたのは /approvals・/forget-approvals・/quota の3つでした。

項目 内容(2026年11月7日時点)
サーバー実装 Clojure(GraalVMネイティブバイナリと eca.jar)
ライセンス Apache-2.0
最新リリース 0.170.1(2026-11-05)
リリース数 416件(0.0.2=2025-06-21から)
通信方式 stdio上のJSON-RPC(LSP方式)
配布OS macOS・Linux(amd64・aarch64)・Windows(amd64)

最新の版は ECAのGitHub Releases で確認できます。Clojure 言語そのものは Clojureとは?JVMで動くLisp系関数型言語の特徴・文法とインストール、採用判断 で扱っています。

対応エディタとクライアント一覧

公式クライアントは次の6つで、どれもサーバーを自動で取得します。ブラウザから承認や監視をする ECA Remote は、起動中のサーバーに接続する機能です(設定の remote.enabled で有効化)。

クライアント 入手先 要件・状態 スター数
Emacs(eca-emacs) MELPA Emacs 28.1以降 524
Neovim(eca-nvim) プラグインマネージャー Neovim 0.8.0以降・開発中 68
IntelliJ(eca-intellij) JetBrains Marketplace Tools > ECA で設定 19
VS Code(eca-vscode) VS Code Marketplace サーバー自動取得 17
ECA Desktop GitHub Releases macOS・Linux向け単体アプリ 15
eca-cli インストールスクリプト macOS・Linux(x86_64・arm64) 7

スター数は2026年11月7日時点です(サーバー本体は1,048)。関心はEmacsクライアントに集中しています。

EmacsでECAを使う手順

Emacs自体の導入や init.el の基本は Emacs(イーマックス)とは?使い方・インストール・init.el設定を解説【31.1対応】 にまとめています。ここではECA固有の部分だけを扱います。

MELPA・use-package・Doom Emacsでのインストール

MELPA にはパッケージ名 eca で登録されています。MELPA をまだパッケージアーカイブに入れていない場合は、先に package-archives へ追加して M-x package-refresh-contents で一覧を更新します。use-package と Doom Emacs の書き方は eca-emacs の公式README に載っています。

;; MELPA
M-x package-install eca

;; use-package(Emacs 30 以降の :vc)
(use-package eca
  :vc (:url "https://github.com/editor-code-assistant/eca-emacs" :rev :newest))

;; Doom Emacs(packages.el)
(package! eca :recipe (:host github :repo "editor-code-assistant/eca-emacs" :files ("*.el")))

M-x ecaによる起動と初回プロンプトの送信

M-x eca を実行すると、eca-emacs は eca-custom-command の指定、$PATH 上の eca の順にサーバーを探し、どちらも無ければ自動でダウンロードします。<eca-chat> ウィンドウが開いたら、> の後ろにプロンプトを書いて RET で送ります。C-u M-x eca にすると、対象にするワークスペースのフォルダを選べます。

初回はモデルが未設定で、ログイン前のサーバーが返すモデル一覧は空です。チャットで /login を打ってプロバイダーを登録します(手順は後述のモデル設定の章)。

チャットバッファのキー操作

チャットバッファで C-c . を押すとトランジェントメニューが開き、主要操作はそこから選べます。頻度の高いものには次のキーが割り当てられています。

操作 キー コマンド
新しいチャット C-c C-n eca-chat-new
モデルの選択 C-c C-m eca-chat-select-model
エージェントの切替 C-c C-b eca-chat-cycle-agent
保留中のツール呼び出しを1件承認 C-c C-S-a eca-chat-tool-call-accept-next
保留中のツール呼び出しを1件拒否 C-c C-r eca-chat-tool-call-reject-next
全件承認してチャット中は記憶 C-c C-s eca-chat-tool-call-accept-all-and-remember

選択範囲の書き換えは eca-rewrite、カーソル位置への回答表示は eca-chat-inline-prompt です。複数プロジェクトを並行して走らせるなら、eca-workspaces が全チャットの状態(実行中・承認待ち・質問待ち)と費用を一覧にします。

TRAMP・Magitと組み合わせる設定

TRAMP 経由でリモートのファイルを開いている場合、eca-emacs はサーバーをリモート側で起動します。自動ダウンロードはローカルだけなので、リモート側の PATH に eca を置くか、eca-custom-command でリモート上のパスを指定します。

(setq eca-custom-command '("/workspace/.local/bin/eca" "server"))

ECAは編集したファイルのバッファを読み直しますが、Magit のステータスバッファまでは更新しません。eca-chat-tool-call-functions フックでツール呼び出しの状態変化を受け取り、magit-refresh-all を呼ぶ例がREADMEにあります。

VS Code・Neovim・IntelliJでの導入

VS Code は Marketplace の拡張機能「ECA」を入れるだけで、サーバーの取得と起動を拡張機能が受け持ちます。サーバーの版を固定したいときは eca.serverPath にバイナリのパスを書きます。

Neovim 版は Neovim 0.8.0 以降と curl・unzip が必要で、:EcaChat(既定キーは <leader>ec)でチャットを開きます。READMEに開発中(Work in Progress)と書かれているため、業務の主環境にするならEmacs版かVS Code版との差を先に確かめてください。Neovim本体の設定は Neovim 0.12系への移行手順:vim.packと内蔵LSP・自動補完の実装【0.12.6対応】 が参考になります。

IntelliJ は JetBrains Marketplace のプラグイン「ECA」を入れ、Preferences > Tools > ECA で設定します。

eca-cliのターミナル操作とスクリプトへの組み込み

eca-cli は、エディタを開かずにターミナルでECAを使うクライアントです。0.169.0(2026年10月28日)の変更履歴で公式クライアントになりました。対応は macOS と Linux(x86_64・arm64)で、Windows では配布されている eca-cli.jar を Babashka で動かします。インストールすると単体バイナリが ~/.local/bin に入り、サーバーは eca-cli が自動で取得します。

bash <(curl -fsSL https://raw.githubusercontent.com/editor-code-assistant/eca-cli/main/install)

cd your-project
eca-cli                                   # 対話モード
eca-cli -p "src/main.clj は何をしている?"   # 1回答えて終了
git diff | eca-cli -p "この変更をレビューして"  # パイプの入力を文脈にする
eca-cli -p "変更点を要約" --output-format json --ephemeral

スクリプトから使うときに押さえる点は2つです。1つ目は承認で、-p で動かすと確認を求めるツール呼び出しは拒否されます(承認する人がいないため)。編集やコマンド実行までさせるなら --trust を付けますが、その場合は後述の deny ルールやサンドボックスと組み合わせてください。2つ目は終了コードで、0が成功、1がプロバイダーのエラーやログイン切れなどでターンが失敗したとき、2がオプションの誤りです。--output-format json にすると、結果に chatId・isError・usage・rejectedToolCalls などが入ります。

モデルとプロバイダーの設定

チャットで /login を打ち、プロバイダー名を送ると認証手順が案内されます。完了するとグローバル設定にプロバイダーが追加され、モデルは /model で切り替えます。プロバイダーごとの設定例は ECA公式ドキュメントのモデル設定 にまとまっています。

設定例があるのは Anthropic、Codex/OpenAI、GitHub Copilot、Gemini、AWS Bedrock、OpenRouter、llama.cpp、LM Studio など17種です。API方式は openai-chat・openai-responses・anthropic・ollama が基本で(Bedrock だけは専用の bedrock 方式)、方式が合う互換エンドポイントはカスタムプロバイダーとして追加できます。

注意点は3つあります。

  • Claude Pro/Max でのログイン:対応していますが、公式ドキュメントは「Anthropicが公式にサポートする使い方ではない」と明記しています。業務では API キーで接続します。
  • GitHub Copilot の Free・Student プラン:自動モデル選択しか提供されず、その機能がGitHub自身のクライアントに限られるため、ECAからは使えません。READMEには「Copilotは無料モデルあり」と書かれていますが、モデル設定のページが正です。
  • サブスクリプションの残量:0.165.0 から、Claude Pro/Max・ChatGPT・GitHub Copilot の残り枠とリセット時刻を /quota で確認できます。API従量なら /costs で費用を見ます。

設定はグローバルの ~/.config/eca/config.json とプロジェクトの .eca/config.json が深くマージされ、プロジェクト側が勝ちます。手元では .eca/config.json に "defaultAgent": "plan" を書くと、起動直後の選択エージェントが plan に変わりました。チーム共通の方針はプロジェクト設定に、APIキーなど個人の情報はグローバル設定に分けます。

codeエージェントとplanエージェントの使い分け

チャットの振る舞いは「エージェント」で切り替えます。チャットで選ぶ主エージェントは2つで、既定は code です。

  • code:すべてのツールを使い、実際にコードを変更します。
  • plan:編集ツールを持たず、計画を作って変更予定をプレビューで見せます。ファイルは書き換えません。

このほか、読み取り専用でコードベースを探す explorer と、複数手順の調査を並行して受け持つ general が、サブエージェントとして組み込まれています。手元のサーバーも起動時の設定通知でこの4つを返しました。

公式の推奨は、plan で計画を詰めてから code に切り替えて実行させる流れです。選択範囲だけを修正したい場合は、範囲を選んで指示する rewrite 機能を使えます。

ツール承認の既定値と設定例

既定では、ファイル読み取りや grep などの読み取り専用ツールだけを許可し、それ以外(ファイル書き込み、シェルコマンド、MCPツールなど)は毎回確認を求めます。以前の manualApproval は非推奨で、toolCall.approval に置き換わりました。項目と判定順序の全体は ECA公式ドキュメントのツール設定 にあります。

denyルールによるrm・mvを含むコマンドの拒否

設定は byDefault(ask・allow・deny)と、ツールごとの allow・ask・deny で書きます。次の例は、確認を既定にしたうえで、シェルコマンドのうち rm と mv を含むものだけを拒否します。.eca/config.json に置いて 0.170.1 を起動し、エラーなく読み込まれることまで確認しました。モデル未設定のため、実際の拒否動作は確かめていません。

{
  "toolCall": {
    "approval": {
      "byDefault": "ask",
      "deny": {
        "eca__shell_command": {
          "argsMatchers": { "command": ["(?s).*\\b(rm|mv)\\b.*"] }
        }
      }
    }
  }
}

argsMatchers の正規表現はJavaの書式で、引数の値全体と一致したときだけ当たります。コマンドは連結ごと1本の文字列として照合されるので、cat a | rm b も上の正規表現で拒否されます。先頭の (?s) は改行も . に一致させる指定で、Java 25 で確かめると、これを外したパターンは「ls」と「rm a」を改行でつないだ文字列に一致しませんでした。複数行のコマンドが拒否から漏れるので外さないでください。argsMatchers の無い deny は、ツール自体をLLMから見えなくします。

ツール承認ルールの判定優先順位

先に当たったものが採用されます。順に、deny ルール、チャット中に記憶した承認、ツール自身の安全確認(ワークスペース外のパスを扱う操作は allow があっても確認に回る)、ask、allow、旧 manualApproval、byDefault です。チャット単位で全呼び出しを自動承認する trust mode も deny は上書きしません。新しいチャットを常に trust mode で始める chat.defaultTrust もありますが、deny ルールを書く前には有効にしないでください。

plan と explorer は独自のルールで全体設定を置き換え、rm・mv・git commit・npm install などの変更系コマンドを拒否します。全体設定に足した allow は、この2つを使っている間は効きません。

「承認して記憶」の範囲は0.164.0からチャット単位

確認画面で「承認して記憶」を選ぶと、同じツールの以降の呼び出しは自動で通ります。0.164.0(2026年10月13日)でこの記憶の範囲が全チャットからそのチャットとサブエージェントに狭まり、/approvals で一覧、/forget-approvals で消去できるようになりました。記憶は設定ファイルに書かれません。

シェルと git は、ツール単位ではなくコマンド単位で記憶します。git checkout を記憶しても git push は確認されます。$(...) やバッククォート、サブシェル、ヒアドキュメント、ファイルへのリダイレクト、sudo・bash -c・xargs を含むコマンドは、記憶済みでも毎回確認に戻ります。

フックによる実行拒否とサーバー全体のサンドボックス化

承認ルールで書けない条件は preToolCall フックで判定できます。フックはシェルコマンドで、標準入力にJSONでイベントが届きます。終了コード2で終えるとツール呼び出しを拒否し、標準エラーの文がLLMに理由として渡ります。次の例は jq を使い、入力を読めなかったときも拒否に倒します。正規表現で git push という文字列を探す補助策なので、git -C /tmp push やGitエイリアス経由のpushまでは防げません。フックは13種類あり、一覧は ECA公式ドキュメントのフック設定 にあります。

#!/usr/bin/env bash
# ~/.config/eca/hooks/block-push.sh:git push を含むコマンドを止める
cmd=$(jq -er '.tool_input.command | select(type == "string")') || {
  echo "フック入力の解析に失敗したため拒否します" >&2
  exit 2
}
if printf '%s' "$cmd" | grep -Eq '(^|[^[:alnum:]_-])git[[:space:]]+push([^[:alnum:]_-]|$)'; then
  echo "git push はこのリポジトリでは人が実行します" >&2
  exit 2
fi
exit 0
{
  "hooks": {
    "block-git-push": {
      "type": "preToolCall",
      "matcher": { "eca__shell_command": {}, "eca__git": {} },
      "actions": [{ "type": "shell", "file": "~/.config/eca/hooks/block-push.sh" }]
    }
  }
}

ECAには shell_command とは別に git ツールがあるので、matcher には両方を入れます。スクリプト単体に入力を流すと、git add . && git push origin main、command の無い入力、JSONでない入力は終了コード2、git status・git push-all は0でした。この設定入りの 0.170.1 は起動エラーなく動きましたが、モデル未設定のため実際の拒否は確かめていません。

承認ルールもフックもECAのプロセス自身が守る約束なので、信頼できないリポジトリではOSレベルの隔離を重ねます。シェル、ファイル編集、MCPのstdioサーバー、フックはすべて eca server の中か子プロセスで動くため、サーバーごと包めば全部が隔離されます。公式は Docker/Podman 用のイメージ ghcr.io/editor-code-assistant/eca-sandbox-image を配布し、Emacs では eca-process-wrapper-function で firejail などを前置できます。シェルだけを包む toolCall.shellCommand はMCPサーバーやファイル操作が対象外なので選びません。

/initとAGENTS.md・スキル・コンテキスト指定

プロジェクトで最初に1回 /init を実行すると、リント方法やテスト手順をまとめた AGENTS.md を生成・更新します。ECAはプロジェクト直下の AGENTS.md と ~/.config/eca/AGENTS.md を常に文脈へ含め、最終的にLLMへ送るプロンプトは /prompt-show で確認できます。AGENTS.md とほかのツールの指示ファイルの違いは copilot-instructions.mdとは?書き方とサンプル・配置場所、AGENTS.mdとの違い【2026年10月】 で比較しています。

スキルは SKILL.md を置いたフォルダで、.eca/skills のほか .agents/skills と ~/.agents/skills も読みます。後の2つはCodexやCursorなども読む共通の置き場所で、ほかのツール用に書いたスキルをそのまま使えます。手元で .agents/skills/release-note/SKILL.md を置いて起動すると、コマンド一覧に /release-note が種別 skill で加わりました。仕様は Agent Skillsとは?SKILL.md仕様とAAIF寄贈後も移植性を保つ実装手順 で解説しています。

チャット中の文脈指定は記号で使い分けます。# はファイルパスだけを書き込み、読むかどうかはLLMに任せます。@ はファイルの中身を添付し、MCPサーバーのリソースも指定できます。MCP自体は MCP(Model Context Protocol)とは?仕組み・APIとの違い・MCPサーバーの作り方 を参照してください。

ECAとOpenCodeの違い:入口と承認の既定値

「eca vs opencode」で比べられることの多い OpenCode は、ターミナルのTUIを主な入口にするオープンソースのコーディングエージェントです。opencode serve でOpenAPIを公開するHTTPサーバーとしても動き、エディタからは Agent Client Protocol(ACP)経由で opencode acp を起動して使います。ECAは逆に、エディタごとの専用プラグインを主な入口にしています。

観点 ECA OpenCode
主な入口 エディタのプラグイン+eca-cli ターミナルのTUI
エディタとの接続 stdioのJSON-RPC(LSP方式) ACP(opencode acp)
ライセンス Apache-2.0 MIT
最新版(11月7日) 0.170.1 v2.2.6(V1系はv1.19.5)
ツール承認の既定 読み取り専用以外はask buildは原則allow(.env等はask)

差が大きいのは承認の既定値です。OpenCodeの権限設定のドキュメント によると、V2の共通基本設定は全操作を許可し、確認対象は .env と .env.* の読み取りだけです(.env.example は許可)。ただし、planは計画用ディレクトリ以外の編集を拒否し、exploreにも操作制限があります。既定のbuildでは、ワークスペース外のファイル操作も確認されません。ECAは編集もシェルも既定で確認を求めるので、導入した日から人の目を通す運用になります。

選び方ははっきりしています。Emacs や IntelliJ の中で使いたい、または承認を既定で厳しくしておきたいならECAです。ターミナルで完結し、利用者の多さと情報量を重視するなら OpenCode が向きます。両方を使う場合も、ECAのモデル設定には OpenCode Go を接続先にする例が載っているため、契約を分ける必要はありません。OpenCode の導入と設定は OpenCodeとは?2.0の変更点・インストール・設定・無料モデルを解説【2026年10月】、VS Code専用のエージェントは Clineとは?VS Code拡張・CLI・Desktopの使い方と料金、自動承認の既定値(v4.1対応) で扱っています。

ECAを選ぶ場面と見送る場面

ECAが最も効くのは、チーム内で使うエディタがばらばらな場合です。モデル、承認ルール、フック、MCPサーバーの設定は config.json で、プロジェクトへの指示は AGENTS.md で共有でき、Emacs派とVS Code派とターミナル派で挙動が揃います。

一方、次の条件に当てはまるなら見送るか、検証期間を長めに取ってください。

  • VS Code だけで完結しているチーム:VS Code 専用のエージェントの方が利用者も情報も多く、ECAを挟む利点が小さくなります。
  • 版の固定が必要な環境:2026年10月だけで9回リリースされ、0.x系のため挙動の変更も起きます(承認の記憶がチャット単位になった0.164.0が実例)。既定ではクライアントが最新サーバーを取得するので、Emacs なら eca-custom-command、VS Code なら eca.serverPath で検証済みのバイナリを指す運用を決めてから展開します。
  • Neovim や Windows のターミナルが主環境:Neovim クライアントは開発中と明示され、eca-cli のネイティブ版は Windows に無いためです。

ほかのコーディングエージェントとの位置づけは Coding Agent(コーディングエージェント)とは:仕組み・3つの型と主要ツールの料金・選び方【2026年11月】 で整理しています。

よくある質問

ECAは何の略ですか?

Editor Code Assistant の略です。特定のエディタに依存しないAIペアプログラミング支援を目的としたオープンソースプロジェクトで、公式サイトは eca.dev です。

ECAは無料で使えますか?

ECA本体は Apache-2.0 のオープンソースで無料です。費用がかかるのは接続先のLLMで、各プロバイダーの料金体系に従います。API従量の費用は /costs、サブスクリプションの残り枠は /quota で確認できます。

EmacsでECAを使うには何が必要ですか?

Emacs 28.1 以降が必要です。MELPA から M-x package-install eca で入れ、M-x eca を実行するとサーバーが自動でダウンロードされます。その後チャットで /login を打ってモデルを設定します。

ローカルLLMで使えますか?

使えます。Ollama 方式に対応しているほか、llama.cpp と LM Studio の設定例も公式ドキュメントにあります。ローカルモデルの上限トークン数や料金表示は設定で上書きできます。

Clojureを書けなくてもECAを使えますか?

使えます。サーバーが Clojure で実装されているだけで、利用者が扱うのは JSON の設定ファイルとクライアントです。

関連記事

お気に入りに入れた記事の一覧

一創の公式 SNS

X では毎朝の新着記事と IT ニュースの速報を、YouTube・TikTok・Instagram・LinkedIn・Facebook では記事の解説動画を配信しています。

この記事は以下の記事からリンクされています

資料請求

RELATED POSTS 関連記事

目次