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 の設定ファイルとクライアントです。