🚀 Janee 🔐
AIエージェントのシークレット管理をMCPを通じて行います。このツールは、エージェントがAPIキーを直接見ることなくAPIにアクセスできるようにし、セキュリティと管理性を向上させます。

AIエージェントが有用であるためにはAPIアクセスが必要です。しかし、エージェントに生のAPIキーを与えるべきではありません。Janeeは、エージェントとAPIの間に位置し、資格情報を注入し、ポリシーを適用し、すべてのアクションをログに記録します。
✨ 主な機能
|
|
| 🔒 ゼロ知識エージェント |
エージェントはキーを見ることなくAPIを呼び出せます。 |
| 📋 完全な監査証跡 |
すべてのリクエストがタイムスタンプ、メソッド、パス、ステータスとともにログに記録されます。 |
| 🛡️ リクエストポリシー |
機能ごとに許可/拒否ルールを設定できます(例:Stripeの読み取り専用)。 |
| ⏱️ セッションTTL |
時間制限付きのアクセスが可能で、即時取り消しができます。 |
| 🔌 任意のMCPクライアントと互換性 |
Claude Desktop、Cursor、OpenClawなどと動作します。 |
| 🏠 ローカルファースト |
キーはマシン上で暗号化され、クラウドに送信されることはありません。 |
| 🖥️ 実行モード |
資格情報を注入してCLIツールを実行でき、エージェントはキーを見ることがありません。 |
| 🤖 GitHub App認証 |
自律エージェント用の短期トークンを提供し、静的なPATは必要ありません。 |
| 🔧 自動git認証 |
資格情報にGitHubトークンが含まれている場合、git push/pull が正常に動作します。 |
問題点
AIエージェントが有用であるためにはAPIアクセスが必要です。現在のアプローチは、エージェントにキーを与え、適切に動作することを期待するものですが、以下のような問題があります。
- 🔓 エージェントがStripe、Gmail、データベースに完全なアクセス権を持つ。
- 📊 アクセスした内容や理由の監査証跡がない。
- 🚫 問題が発生したときにキルスイッチがない。
- 💉 1つのプロンプトインジェクションで災害につながる可能性がある。
解決策
Janeeは、AIエージェントのAPIシークレットを管理するMCPサーバーです。
- APIキーを保存 —
~/.janee/ にローカルで暗号化して保存します。
janee serve を実行 — MCPサーバーを起動します。
- エージェントがアクセスを要求 —
execute MCPツールを介して行います。
- Janeeが実際のキーを注入 — エージェントはキーを見ることがありません。
- すべてがログに記録される — 完全な監査証跡が残ります。
キーはあなたのマシン上に留まり、エージェントはキーを見ることがありません。あなたがコントロールを維持できます。
一度設定して、どこでも使用
JaneeでAPIを一度設定すると、すべてのエージェントが使用できます。
services:
stripe:
baseUrl: https://api.stripe.com
auth: { type: bearer, key: sk_live_xxx }
github:
baseUrl: https://api.github.com
auth: { type: bearer, key: ghp_xxx }
openai:
baseUrl: https://api.openai.com
auth: { type: bearer, key: sk-xxx }
これで、Janeeに接続するすべてのエージェントがこれらのAPIを使用できます。
- Claude Desktop — APIにアクセスできます。
- Cursor — APIにアクセスできます。
- OpenClaw — APIにアクセスできます。
- 任意のMCPクライアント — APIにアクセスできます。
ツール間でキーをコピーする必要はなく、「どのエージェントがどのAPIを設定しているか」の問題も解消されます。新しいエージェントを追加しても、すべてのAPIにアクセスできます。キーを取り消す場合は、Janeeで一度更新するだけです。
1つの設定で、すべてのエージェントが利用でき、完全な監査証跡が残ります。
🚀 クイックスタート
インストール
npm install -g @true-and-useful/janee
初期化
janee init
これにより、~/.janee/config.yaml がサンプルサービスとともに作成されます。
サービスの追加
オプション1: インタラクティブ(初めてのユーザーに推奨)
janee add
Janeeがサービスの追加手順を案内します。
Service name: stripe
Base URL: https://api.stripe.com
Auth type: bearer
API key: sk_live_xxx
✓ Added service "stripe"
Create a capability for this service? (Y/n): y
Capability name (default: stripe):
TTL (e.g., 1h, 30m): 1h
Auto-approve? (Y/n): y
✓ Added capability "stripe"
Done! Run 'janee serve' to start.
AIエージェントを使用する場合:プロンプトをスキップするフラグについては Non-interactive Setup を参照するか、以下の エージェント固有のガイド を参照してください。
オプション2: 設定ファイルを直接編集
~/.janee/config.yaml を編集します。
services:
stripe:
baseUrl: https://api.stripe.com
auth:
type: bearer
key: sk_live_xxx
capabilities:
stripe:
service: stripe
ttl: 1h
autoApprove: true
CLIツールの追加(実行モード)
一部のツールは、HTTPヘッダーではなく環境変数として資格情報を必要とします。実行モードではこれを処理します。
janee add twitter --exec \
--key "tvly-xxx" \
--allow-commands "bird,tweet-cli" \
--env-map "TWITTER_API_KEY={{credential}}"
これで、エージェントはAPIキーを見ることなくJaneeを介してCLIツールを実行できます。
janee_exec({
capability: "twitter",
command: ["bird", "post", "Hello world!"],
cwd: "/home/agent/project",
reason: "User asked to post a tweet"
})
Janeeは TWITTER_API_KEY を注入してプロセスを起動し、コマンドを実行し、標準出力/標準エラー出力を返します。資格情報はエージェントのコンテキストに入ることはありません。
主要なフラグ:
--exec — 実行モードとして構成する(HTTPプロキシではなくCLIラッパー)
--allow-commands — 許可される実行可能ファイルのホワイトリスト(セキュリティ)
--env-map — 資格情報を環境変数にマッピングする
--work-dir — サブプロセスの作業ディレクトリ
--timeout — 最大実行時間(デフォルト: 30秒)
Git操作(自動HTTPS認証)
GitHub資格情報を使用して実行モードを使用する場合、Janeeは自動的にgit認証を処理します。追加の設定は必要ありません — git push、git pull、git clone が正常に動作します。
capabilities:
- name: git-ops
service: github
mode: exec
allowCommands: [git]
env:
GH_TOKEN: "{{credential}}"
janee_exec({
capability: "git-ops",
command: ["git", "push", "origin", "main"],
cwd: "/workspace/my-repo"
})
Janeeは、環境に GH_TOKEN/GITHUB_TOKEN が含まれる git コマンドを検出し、HTTPS認証用の一時的なaskpassスクリプトを作成します。コマンドが完了した後、スクリプトは自動的にクリーンアップされます。
GitHub App認証の追加(自律エージェント用)
長時間実行されるエージェントにとって、静的なトークンはリスクがあります。GitHub App認証は、必要に応じて短期間のインストールトークンを生成し、長期間のPATは必要ありません。
オプション1: create-gh-appを使用する(推奨)
npx @true-and-useful/create-gh-app create my-agent --owner @me
npx @true-and-useful/create-gh-app janee-add my-agent
完了です。あなたのエージェントは、JaneeのMCPプロキシを介して短期間のGitHubトークンを取得できるようになりました。
オプション2: 手動設定
janee add github-app \
--auth-type github-app \
--app-id 123456 \
--pem-file /path/to/private-key.pem \
--installation-id 789
または設定ファイルを介して:
services:
github:
baseUrl: https://api.github.com
auth:
type: github-app
appId: "123456"
pemFile: /path/to/private-key.pem
installationId: "789"
動作原理:エージェントがアクセスを要求すると、Janeeはアプリの秘密鍵でJWTを署名し、GitHubのAPIを介して1時間のインストールトークンと交換し、トークンを有効期限までキャッシュします。エージェントは秘密鍵を見ることはなく、短期間のトークンのみがAPIに到達します。
MCPサーバーの起動
janee serve
エージェントとの連携
MCPをサポートするエージェント(Claude Desktop、Cursor、OpenClaw)は、execute ツールを呼び出してJaneeを介してAPIリクエストを行うことができます。
execute({
capability: "stripe",
method: "GET",
path: "/v1/balance",
reason: "User asked for account balance"
})
Janeeはキーを復号化し、リクエストを行い、すべてをログに記録し、レスポンスをエージェントに返します。
統合
MCPに対応した任意のエージェントと連携できます。
- OpenClaw — ネイティブプラグイン (
@true-and-useful/janee-openclaw)
- コンテナ化されたエージェントの場合:コンテナ設定ガイド を参照してください。
- Cursor — 設定ガイド
- Claude Code — 設定ガイド
- Codex CLI — 設定ガイド
- 任意のMCPクライアント —
janee serve を指すように設定します。
OpenClawとの統合
OpenClaw を使用する場合は、ネイティブツールサポートのためのプラグインをインストールします。
npm install -g @true-and-useful/janee
janee init
openclaw plugins install @true-and-useful/janee-openclaw
エージェントの設定で有効にします。
{
agents: {
list: [{
id: "main",
tools: { allow: ["janee"] }
}]
}
}
あなたのエージェントには以下のツールが利用可能になります。
janee_list_services — 利用可能なAPIを発見します。
janee_execute — Janeeを介してAPIリクエストを行います。
プラグインは自動的に janee serve を起動します。すべてのリクエストは ~/.janee/logs/ にログに記録されます。
MCPツール
Janeeは3つのMCPツールを公開しています。
| ツール |
説明 |
list_services |
利用可能なAPIとそのポリシーを発見します。 |
execute |
Janeeを介してAPIリクエストを行います(HTTPプロキシモード)。 |
exec |
資格情報を注入してCLIコマンドを実行します(実行モード)。 |
manage_credential |
エージェントスコープの資格情報へのアクセスを表示、付与、または取り消します。 |
reload_config |
サービスを追加/削除した後、ディスクから設定を再読み込みします(janee serve で起動した場合に利用可能)。 |
エージェントは利用可能なツールを発見し、Janeeを介してAPIを呼び出します。同じ監査証跡と保護が適用されます。
設定
設定は ~/.janee/config.yaml に保存されます。
server:
host: localhost
services:
stripe:
baseUrl: https://api.stripe.com
auth:
type: bearer
key: sk_live_xxx
github:
baseUrl: https://api.github.com
auth:
type: bearer
key: ghp_xxx
capabilities:
stripe:
service: stripe
ttl: 1h
autoApprove: true
stripe_sensitive:
service: stripe
ttl: 5m
requiresReason: true
サービス = 実際のキーを持つ実際のAPI
機能 = エージェントが要求できるものとポリシー
アクセス制御
どのエージェントがどの機能を使用できるかを制御します。
server:
host: localhost
defaultAccess: restricted
capabilities:
stripe:
service: stripe
ttl: 1h
allowedAgents: ["agent-a", "agent-b"]
github:
service: github
ttl: 1h
defaultAccess: restricted — allowedAgents リストがない機能は、すべてのエージェントから隠されます。
defaultAccess: open(デフォルト) — allowedAgents リストがない機能は、すべてのエージェントに利用可能です。
allowedAgents — 機能ごとのエージェント名のリスト(MCP初期化ハンドシェイクの clientInfo.name と一致する)
エージェントが実行時に作成した資格情報は、デフォルトで agent-only アクセスになります — 作成したエージェントのみが使用でき、manage_credential ツールを介して明示的にアクセスを付与しない限り、他のエージェントは使用できません。
実行モードの機能
services:
twitter:
auth:
type: bearer
key: tvly-xxx
capabilities:
twitter:
service: twitter
mode: exec
allowCommands: ["bird", "tweet-cli"]
envMap:
TWITTER_API_KEY: "{{credential}}"
ttl: 1h
autoApprove: true
実行モードの機能は janee_exec を使用します(execute ではなく)。資格情報は環境変数として注入され、エージェントは標準出力/標準エラー出力のみを見ます。
実行モードでのランナーのハードニングデフォルト:
- 分離された最小限の環境(ホスト環境の完全な継承はなし)
- コマンドごとに一時的な
HOME ディレクトリ
- タイムアウトでプロセスグループを終了
ランナー/オーソリティモード(コンテナ用)
エージェントがDockerコンテナ内で実行される場合、リモートホスト上の janee_exec はコンテナのファイルシステムにアクセスできません。ランナー/オーソリティアーキテクチャはこの問題を解決します。
- オーソリティ はホスト上で実行されます:資格情報を保持し、ポリシーを適用し、APIリクエストをプロキシします。
- ランナー は各コンテナ内で実行されます:エージェントにMCPを提供し、非実行呼び出しをオーソリティに転送し、
janee_exec をローカルで実行します。
janee serve -t http -p 3100 --host 0.0.0.0 --runner-key "$JANEE_RUNNER_KEY"
janee serve -t http -p 3200 --host 127.0.0.1 \
--authority http://host.docker.internal:3100 --runner-key "$JANEE_RUNNER_KEY"
エージェントは JANEE_URL=http://localhost:3200 のみを必要とします。
オーソリティを独立したプロセスとして実行することもできます。
janee authority --runner-key "$JANEE_RUNNER_KEY" --host 127.0.0.1 --port 9120
完全なアーキテクチャ、実行承認フロー、Docker Composeの例、およびトラブルシューティングについては、ランナー/オーソリティガイド を参照してください。
リクエストポリシー
rules を使用して、各機能が行えるリクエストを正確に制御します。
capabilities:
stripe_readonly:
service: stripe
ttl: 1h
rules:
allow:
- GET *
deny:
- POST *
- PUT *
- DELETE *
stripe_billing:
service: stripe
ttl: 15m
requiresReason: true
rules:
allow:
- GET *
- POST /v1/refunds/*
- POST /v1/invoices/*
deny:
- POST /v1/charges/*
- DELETE *
ルールの動作原理:
deny パターンが最初にチェックされます — 明示的な拒否は常に優先されます。
- 次に
allow パターンがチェックされます — 進行するには一致する必要があります。
- ルールが定義されていない場合 → すべて許可されます(下位互換性)。
- ルールが定義されているが一致しない場合 → デフォルトで拒否されます。
パターン形式:METHOD PATH
GET * → 任意のGETリクエスト
POST /v1/charges/* → /v1/charges/ およびサブパスへのPOST
* /v1/customers → /v1/customers への任意のメソッド
DELETE /v1/customers/* → 任意の顧客のDELETE
これにより、セキュリティが強化されます:エージェントが「理由」について嘘をついたとしても、ポリシーが許可するエンドポイントのみにアクセスできます。サーバー側で強制されます。
CLIリファレンス
janee init
janee add
janee add stripe -u https://api.stripe.com -k sk_xxx
janee remove <service>
janee remove <service> --yes
janee list
janee list --json
janee search [query]
janee search stripe --json
janee cap list
janee cap list --json
janee cap add <name> --service <service>
janee cap edit <name>
janee cap remove <name>
janee serve
janee serve --transport http --port 9100
janee serve --authority https://janee.example.com --runner-key $JANEE_RUNNER_KEY
janee authority --runner-key $JANEE_RUNNER_KEY
janee logs
janee logs -f
janee logs --json
janee sessions
janee sessions --json
janee revoke <id>
非インタラクティブ設定(AIエージェント用)
AIエージェントはインタラクティブなプロンプトに応答できません。--*-from-env フラグを使用して、環境変数から資格情報を読み取ることができます — これにより、シークレットがエージェントのコンテキストウィンドウに入ることがなくなります。
janee add stripe -u https://api.stripe.com --auth-type bearer --key-from-env STRIPE_KEY
janee add bybit --auth-type hmac-bybit --key-from-env BYBIT_KEY --secret-from-env BYBIT_SECRET
janee add okx --auth-type hmac-okx --key-from-env OKX_KEY --secret-from-env OKX_SECRET --passphrase-from-env OKX_PASS
janee add github --auth-type github-app --app-id-from-env GH_APP_ID --pem-from-env GH_PEM --installation-id-from-env GH_INSTALL_ID
すべての必要な資格情報がフラグを介して提供されると、Janeeは以下のことを行います。
- 読み取りラインを開かない(標準入力でハングしない)
- 適切なデフォルト値(1時間のTTL、自動承認)で機能を自動作成する
必要に応じて、~/.janee/config.yaml を直接編集することもできます。
動作原理
┌─────────────┐ ┌──────────┐ ┌─────────┐
│ AI Agent │─────▶│ Janee │─────▶│ Stripe │
│ │ MCP │ MCP │ HTTP │ API │
└─────────────┘ └──────────┘ └─────────┘
│ │
No key Injects key
+ logs request
- エージェントが
execute MCPツールを機能、メソッド、パスとともに呼び出します。
- Janeeはサービス設定を検索し、実際のキーを復号化します。
- 実際のAPIにキーを付けてHTTPリクエストを行います。
- ログに記録します:タイムスタンプ、サービス、メソッド、パス、ステータス。
- レスポンスをエージェントに返します。
エージェントは実際のキーに触れることがありません。
📐 詳細な解説:詳細な図、脅威モデル、および代替案との比較については、アーキテクチャとセキュリティモデル を参照してください。
セキュリティ
- 暗号化:キーはAES-256-GCMで保存されます。
- エージェントの識別:MCP初期化ハンドシェイクの
clientInfo.name から導出され、カスタムヘッダーは必要ありません。
- エージェントの分離:各エージェントは独自のセッションを持ち、識別が分離されます(HTTPトランスポートはセッションごとにサーバー+トランスポートを作成します)。
- アクセス制御:機能ごとの
allowedAgents ホワイトリスト + サーバー全体の defaultAccess ポリシー。
- 資格情報のスコープ:エージェントが作成した資格情報はデフォルトで
agent-only アクセスになります。
- 監査ログ:すべてのリクエストが
~/.janee/logs/ にログに記録されます。
- セッション:時間制限付きで、取り消し可能です。
- キルスイッチ:
janee revoke または設定を削除します。
Docker
ローカルのNode.jsが不要なコンテナとしてJaneeを実行できます。
docker build -t janee .
docker run -d -p 3000:3000 \
-v ~/.janee:/root/.janee:ro \
janee --transport http --port 3000 --host 0.0.0.0
またはDocker Composeを使用します。
mkdir -p config && cp ~/.janee/config.yaml config/
docker compose up -d
Dockerを使用したClaude Desktopについては、Dockerドキュメント を参照してください。
コントリビューション
コントリビューションを歓迎します!PRを提出する前に、CONTRIBUTING.md を読んでください — 必要なPRチェックリスト(テスト、変更履歴、バージョンアップなど)が含まれています。
📄 ライセンス
MIT — True and Useful LLC によって構築されました。
AIエージェントにキーを与えるのをやめ、アクセスをコントロールしましょう。 🔐