execkit について
execkitは、AIエージェント向けのステートフルなシェルセッションツールで、ローカル、SSH、Dockerでコマンドを実行します。構造化された結果に加え、秘密情報のマスキング、出力制限、ポリシーチェック、監査ログ、リモートワークスペースの復元に対応します。
主な機能
- 01ローカル・SSH・Dockerの永続セッション
- 02構造化されたコマンド結果
- 03秘密情報のマスキングと出力制限
- 04コマンドのポリシーチェックとタイムアウト
- 05監査ログとライブセッションビューア
- 06リモートワークスペースのチェックポイントと復元
活用シーン
- 01リモートホストでエージェントのコマンドを実行
- 02Dockerコンテナ内で作業
- 03エージェント実行中のコマンド履歴を確認
- 04誤ったコマンド実行後にリモートファイルを復元
MCP 対応
MCPサーバーは、セッションの作成、実行、一覧表示、破棄に加え、リモートセッション用のチェックポイントと復元ツールを提供します。Claude、Cursor、Gemini、Codex、VS Code、WindsurfなどのMCPクライアントに設定できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
組み込みのエージェントシェルではなく、execkit を使うと次のことができます。
- ローカル、SSH、Docker で永続的なセッションを利用できます。
cdと環境変数は呼び出し間で引き継がれ、すべてのコマンドから、標準出力と標準エラー出力を分けた構造化された結果、終了コード、実行時間、現在の作業ディレクトリが返されます。 - エージェントのコンテキストを保護する出力を利用できます。 モデルに表示される前にシークレットがマスキングされ、出力予算(
tail、head、grep、文字数上限)によって、ログの多いビルドがコンテキストウィンドウをあふれさせるのを防ぎます。 - 監査証跡、ライブビューアー、取り消し機能を利用できます。 すべてのコマンドを JSONL 監査ログに記録できます。また、ターミナルまたはブラウザー(上図)でセッションをリアルタイムに確認でき、リモートセッションではワークスペースのファイルをチェックポイントに保存して復元できます。
インストール
uv を使えば、インストール不要です。MCP クライアントの設定に次の内容を追加してください。
{ "mcpServers": { "execkit": { "command": "uvx", "args": ["execkit-mcp"] } } }
または、インストールして execkit にクライアント用の設定を出力させることもできます。
pip install execkit-mcp && execkit-mcp setup claude # or: cursor | gemini | codex | vscode | windsurf
続いて execkit-mcp doctor を実行すると、セットアップを確認できます。その他の方法(ビルド済みバイナリ、cargo install、ソースからのビルド)については、クイックスタートを参照してください。
ステータス: 初期の 0.x です。マイナーバージョン間で API が変更される場合があります。重要な対象に使用する前に、制限事項をお読みください。
どのような場合に使うか
execkit はエージェントに組み込まれたシェルやサンドボックスを補完するものであり、置き換えるものではありません。エージェントがリモートホスト上やコンテナ内で作業する必要がある場合、実行された内容を記録したい場合、またはリモートワークスペースでのファイル変更を取り消したい場合に使用してください。
エージェントは敵対者です。 execkit を動かす LLM は、読み取ったあらゆるものによってプロンプトインジェクションを受ける可能性があります。そのため execkit は、呼び出し元を独自に管理します。コマンドは実行前にポリシーの境界を通過し、出力が返される前にシークレットがマスキングされ、SSH ホストキーが変更されている場合は、MITM 攻撃者への接続を再試行するのではなく、明確にエラーになります。
flowchart LR
A([AI agent]) -->|command| F{policy fence}
F -->|blocked| X([rejected, never runs])
F -->|allowed| T[transport: local / SSH / Docker]
T --> O[raw output]
O --> R[redact secrets, bound output]
R --> E([structured ExecResult])
E -.-> A
エージェントから使用する(MCP)
エージェントは session_create(local、ssh、または docker)、session_exec、
session_list、session_destroy に加え、リモートでの取り消し用に
session_checkpoint / session_checkpoints / session_restore を利用できます。
状態は呼び出し間で保持され、すべての結果はターミナルから収集するのではなく、解析されます。
// session_exec {"command": "cd /app && npm ci"} -> { "exit_code": 0, "cwd": "/app" }
// session_exec {"command": "npm run build"} // cwd is still /app
// -> { "stderr": "Error: Cannot find module 'webpack'",
// "exit_code": 1, "duration_ms": 3420, "cwd": "/app",
// "truncated": false, "timed_out": false }
コマンドはデフォルトで 120 秒後にタイムアウトします(呼び出しごとに timeout_secs を指定でき、最大 3600 秒です)。タイムアウト時、execkit は Ctrl-C でコマンドを中断し、終了コード 124 と timed_out: true を返します。セッションの現在の作業ディレクトリと環境変数は保持されます。
オペレーター向けのセキュリティ設定(ホストキーの検証、キー用ディレクトリ、監査、セッション制限)については、crates/execkit-mcp/README.md を参照してください。
エージェントの動作を確認する
EXECKIT_MCP_AUDIT_DIR を設定すると、すべてのセッションが記録されます。execkit-mcp watch はターミナルでライブ表示し、execkit-mcp watch --serve --open は上部に表示されている読み取り専用のブラウザービューアーを開きます。
![]() | ![]() |
/ でトランスクリプトを検索し、エラー間を移動します。 | セッションの名前変更、ピン留め、保持、エクスポート、またはスクリーンショットの撮影ができます。ブロックされたコマンドはインラインで表示されます。 |
ライブラリとして使う
[dependencies]
execkit = "0.9" # local + SSH + Docker
# execkit = { version = "0.9", default-features = false } # local + Docker only (no SSH; no russh/tokio)
use std::time::Duration;
use execkit::{Policy, Session};
fn main() -> Result<(), execkit::Error> {
let mut s = Session::local()?
.with_policy(Policy { allow: vec![], deny: vec!["rm".into()] })
.with_timeout(Duration::from_secs(60));
let r = s.exec("echo hi; echo err 1>&2; cd /tmp")?;
// r.stdout == "hi" r.stderr == "err" r.exit_code == 0 r.cwd == "/tmp"
println!("{} (exit {})", r.stdout, r.exit_code);
let r = s.exec_with_timeout("sleep 30", None, Duration::from_secs(1))?;
// r.timed_out == true r.exit_code == 124; the session is still usable
Ok(())
}
実行可能なサンプル:cargo run --example local、
EXECKIT_SSH="user:password@host:22" cargo run --example ssh、および
EXECKIT_DOCKER=<container> cargo run --example docker。
Python
Python から同じセッションを使えます。pip install execkit(ネイティブバインディングを使用するため、Rust ツールチェーンは不要です):
from execkit import Session
with Session.local() as s:
r = s.exec("echo hi; echo err >&2; cd /tmp")
print(r.stdout, r.exit_code, r.cwd, r.stderr) # hi 0 /tmp err
crates/execkit-py/README.md を参照してください。
内容
- 永続的なステートフルセッションを、ローカル PTY、SSH、または Docker で利用できます。SSH は
~/.ssh/configのホストエイリアスを受け付けます。 - 構造化された
ExecResult:stdout/stderr の分離、終了コード、実行時間、cwd、truncated、timed_out。 - Base64 によるコマンドフレーミング。 コメント、ヒアドキュメント、
!、末尾の&、構文エラー、長いコマンドがあってもセッションがハングしません。 - セッションを維持するタイムアウト。 コマンドがタイムアウトすると中断され、セッションはそのまま続行します。
- 一般的なトークン形式(AWS、GitHub、GitLab、Slack、Stripe、Google、Anthropic、OpenAI、JWT、PEM 秘密鍵)、URL パスワード、
password=/token=形式のペア、およびセッションが秘密情報を表す名前の変数に割り当てた値を秘匿します。 エコーされたコマンドも秘匿されます。 - 出力予算:行単位の
tail/head/head+tail、コンテキスト付きのgrepフィルター、文字数上限。呼び出しごと、またはセッションのデフォルトとして設定でき、結果には保持された内容が報告されます。 - リモートセッションでのエージェント操作の取り消し:ワークスペースのスナップショットを作成し、コマンドが失敗した場合にファイルを復元します(リモート側に
gitが必要で、ワークスペースの指定が必須です。対象はファイルのみで、副作用は含みません)。 - 監査ログとライブビューアーに加え、クライアントへの MCP ライブ通知。
- 組み込み可能で、サービスではありません:ご自身のプロセス内で
cargo addして使用でき、デーモンもベンダーも不要です。
0.9 へのアップグレード
0.8 からの破壊的変更です。詳細は 0.9 へのアップグレード を参照してください。
- SSH ホスト鍵は
~/.ssh/known_hostsではなく、~/.execkit/known_hostsにピン留めされます。 古いピン留めは読み込まれません。初回接続時に再度ピン留めするか、mkdir -p ~/.execkit && chmod 700 ~/.execkitの後にgrep -E '^[^ ]+ SHA256:' ~/.ssh/known_hosts >> ~/.execkit/known_hostsを実行してコピーしてください。 古いピン留めはポートに関係なくホスト名のみで識別されていました。ポート 22 以外の場合は、行を[host]:portに書き換えてください。そうしないと、後で同じホストのポート 22 に接続した際に鍵の不一致が発生します。 - すべてのコマンドで stdin は
/dev/nullに設定され、ページャーはcatに設定されます。 - 実行先に
base64が必要です。 - タイムアウト時は、セッションを閉じるエラーではなく、終了コード 124 と
timed_out: trueが返され、セッションは維持されます。ExecResultに新しいtimed_outフィールドが追加されました。 - セッション ID は
1_localではなく、a3f9-1_localのような形式になります。 SshConfigに新しいconnect_timeoutフィールドが追加されました(デフォルトは 15 s)。SshConfig::newを使用してください。
制限事項
- サンドボックスではありません。 コマンドポリシーは、文字列マッチングによる助言的なものです。簡単に回避できます。
deny: ["curl"]はcurlをブロックしますが、env curl、sudo curl、sh -c curlはブロックしません。実際の制御には、最小権限の 環境 が重要です。エージェントと SSH ユーザーは、最小限の権限で実行してください。 - 対話形式の入力には対応していません。 stdin は
/dev/nullなので、プロンプト、REPL、エディターは動作しません。非対話型のフラグ(sudo -n、apt-get -y)を使用してください。ページャーはデフォルトでcatを使いますが、lessやvimを直接実行すると、タイムアウトするまで停止し、セッションが閉じられます。シェルの履歴は無効です。 - タイムアウトでは処理を中断しますが、すべてのプロセスを終了するわけではありません。 execkit は Ctrl-C を送信します。Ctrl-C を無視するコマンドはセッションを終了します。時間のかかるジョブはバックグラウンドで実行し(
nohup CMD > /tmp/job.log 2>&1 &)、ログを定期的に確認してください。 - 実行先には POSIX シェルと
base64が必要です。 ローカルセッションではbashを使用します。Windows はサポートされていません。 - 同期型のコアです。 一般的なエージェントの用途には十分ですが、数千の同時セッション向けには最適化されていません。
- SSH の
AcceptAnyホストキーモード は、明示的に安全でない設定を許可した場合に限り、テスト用に利用できます。本番環境では絶対に使用しないでください。
気になる点が見つかりましたか?Issue を作成してください。
コントリビューションとセキュリティ
- コントリビューションについては、
CONTRIBUTING.mdを参照してください。 - 脆弱性を見つけましたか?
SECURITY.mdに従って報告してください。セキュリティに関する報告を公開 Issue として作成しないでください。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。


