概要
Claude Code CLIをElectronアプリからプログラム的に呼び出す方法を調べた。技術的には方法が2つあることがわかった。ただし、OSSとして配布する場合に利用規約(ToS)的な問題があることもわかった。そのまとめ。
背景: 自分が今やっていること
自分は今、DocusaurusベースのサイトをElectronアプリで包んで使っている。中身はメールテンプレートやプロジェクトのドキュメント。普段のワークフローとしては、そのElectronアプリで内容を確認しつつ、ターミナルでClaude Codeを立ち上げて「このメールの返信を書いて」「この文章をチェックして」といった作業をしている。
ここでふと思った。ターミナルでClaude Codeに頼んでいる部分を、Electronアプリの中に組み込めないか? ボタン一つでClaude Codeを呼び出せたら、ターミナルとアプリを行ったり来たりしなくて済む。そういう「ローカルのClaude Codeを裏で呼び出すGUIアプリ」は作れるのか? というのが出発点。
アプローチ1: CLIサブプロセス方式
Node.jsのchild_processでclaudeコマンドを-p(非対話モード)フラグ付きで実行する方法。
const { spawn } = require("child_process");
const claude = spawn("claude", [
"-p",
"Explain the auth module",
"--output-format",
"json",
"--allowedTools",
"Read,Glob,Grep",
]);
claude.stdout.on("data", (data) => {
const result = JSON.parse(data.toString());
console.log(result);
});主なCLIフラグは以下。
-p/--print: 非対話モード--output-format:text、json、stream-jsonから選択--allowedTools: 自動承認するツールを指定--continue/-c: 前の会話を継続--resume/-r: セッションIDで再開--max-turns: エージェントのターン数制限--permission-mode:acceptEdits、bypassPermissionsなど
認証はローカルのClaude Codeログインセッション(~/.claude/)を使用する。Pro/Maxサブスクリプションの範囲で動き、追加のAPIキーや課金は不要。
アプローチ2: Agent SDK方式
npm install @anthropic-ai/claude-agent-sdkimport { query } from "@anthropic-ai/claude-agent-sdk";
import { ipcMain } from "electron";
ipcMain.handle("ask-claude", async (event, prompt) => {
for await (const message of query({
prompt,
options: {
allowedTools: ["Read", "Edit", "Bash"],
permissionMode: "acceptEdits",
},
})) {
if (message.type === "stream_event") {
event.sender.send("claude-token", message);
}
if ("result" in message) {
return message.result;
}
}
});こちらはAnthropic Consoleから取得するAPIキーが必要で、トークン単位の従量課金になる。
2つのアプローチの比較
| 観点 | CLIサブプロセス | Agent SDK |
|---|---|---|
| セットアップ | npm install不要 | npm install必要 |
| 型安全性 | 文字列ベース | TypeScript型あり |
| ストリーミング | JSONイベント経由 | ネイティブasync iterators |
| 認証 | ローカルのClaude Codeログイン | APIキー(従量課金) |
| コスト | Pro/Maxサブスクリプションに含まれる | トークン単位で課金 |
自分用のツールとして使うだけなら、CLIサブプロセス方式がシンプルで追加費用もかからない。Agent SDK方式はAPIキーが必要だが、TypeScriptの型がある分、Electronアプリとしてきちんと作り込むなら扱いやすい。
利用規約上の問題
ここからがややこしい話。技術的にできることと、やっていいことは違う。
明確に許可されていること
- 自分のマシンで自分が
claude -pを使うこと(個人利用の自動化) - Agent SDKをAPIキー認証で使うこと
明確に禁止されていること
- サーバーを立てて自分のサブスクリプション経由でリクエストを中継すること
- Pro/MaxのOAuthトークンをAgent SDKや第三者ツールで使うこと
- エンドユーザーにClaude.aiログインを提供するプロダクトを作ること
グレーゾーン: OSSとして配布する場合
問題はここ。OSSのElectronアプリとして配布し、各ユーザーが自分のマシンで自分のサブスクリプションを使ってclaude -pを実行するケース。
アーキテクチャ的にはAnthropicのVS Code拡張やJetBrains拡張と同じパターンになる。ローカルのCLIを呼び出すUIラッパーということ。
ただ、以下の懸念がある。
- 「公式の統合」と「第三者アプリが
claude -pを呼ぶ」の間の線引きが不明確 - Anthropicは最近ToSの執行を厳格化している
- 自動的な不正利用検知でユーザーのアカウントがフラグ付けされうる
- 将来ToSが変更されてこのパターンが明示的に禁止される可能性がある
VS Code拡張やJetBrains拡張はAnthropic公式が作ったものなので当然許可されている。第三者が同じことをやった場合にどう扱われるかは、現時点では明確な答えがない。
安全なアプローチ
OSSとして配布したい場合に安全と言える方法は以下。
- APIキー方式: 各ユーザーがconsole.anthropic.comから自分のAPIキーを取得して使う。従量課金だがToS上は明確に許可されている
- Anthropicに直接確認: サポートに問い合わせて書面で確認を得る
- 公式の対応を待つ: 将来「Claude Codeをアプリに組み込む」ための公式ライセンスやティアが出る可能性がある
まとめ
現状の答えとしては、CLIサブプロセス方式でOSSとして配布した場合、ユーザーがBANされるリスクがある。安全とは言えない。
API課金を避けたい場合、現時点ではこのプロジェクトの実現は難しいというのが現実的な結論。自分用のツールとして自分のマシンで使う分には問題ないので、そこは切り分けて考える必要がある。個人利用と配布の間に壁があるという話。