AI エージェント向け
Claude Code、Codex、CI のジョブから `openemail` を操作します:無人でのサインイン、データとしてのヘルプ、ドライラン、足りないスコープ、確認コード。
組み込みのガイド
openemail agents は、Claude Code や Codex のような AI エージェント、または CI のスクリプト向けに、Markdown の短いガイドを表示します。人の手を借りずにサインインする方法、出力の読み方、コマンドの探し方、安全な変更の仕方、リストのページのたどり方、確認コードやスコープが足りないときの対処、そしてコピーして使える 5 つのレシピです。openemail agent も同じコマンドです。
openemail agentsopenemail agents --json | jq -r '.recipes[].commands[]'--json を付けると、ガイドは schemaVersion、title、intro、{ id, title, points } の配列である sections、exitCodes、{ id, title, commands } の配列である recipes を持つ 1 つのドキュメントになります。これらのルールを毎回プロンプトに貼り付ける代わりに、プロジェクトがすでにエージェントに渡している指示ファイルで一度だけ、CLI を使う前に openemail agents を実行するよう伝えてください。
人の手を借りずにサインインする
- API キーを使います。
OPENEMAIL_API_KEYを設定するか、1 つのコマンドに--api-keyを渡します。キーは設定 → API キー(openemail open api-keys)で、エージェントに必要なスコープだけを付けて作成してください。キーはブラウザを開かず、確認コードも必要ありません。 - または、人がこのマシンで一度
openemail loginで行ったブラウザでのサインインを再利用し、--profile <name>で選びます。CLI はトークンを自分で更新します。 - ターミナルがなければ何も尋ねません。
--json、--no-input、CIのもとで、またはターミナルが接続されていない場合、CLI が尋ねるはずだった値は終了コード2で止まり、渡すべきフラグを示します。 - ブラウザでのサインインは人が承認する必要があるため、無人の
openemail loginは何も登録しないうちに終了コード2とコードunattendedで止まり、openemail login --with-tokenを案内します。 openemail whoami --jsonは、ワークスペース、サインインの種類、そのscopesを表示します。
出力を読む
すべてのコマンドに --json を渡してください。すると stdout にはちょうど 1 つの JSON ドキュメント、--ndjson なら 1 行に 1 つのオブジェクトだけが出力され、進捗は stderr に出ます。失敗すると stderr に {"error":{...}} の行が 1 行出力されます。終了コードとその code で分岐し、next は人に見せ、文言が変わりうる message は決して解析しないでください。すべてのフィールドと終了コードは「スクリプト」のページにあります。
データとしてのコマンド
--help --json は、CLI が解析に使うのと同じコマンドレジストリから組み立てた 1 つの JSON ドキュメントとしてヘルプを出力するので、インストールされているバージョンと常に一致します。ルート、グループ、コマンドのどれでも使え、openemail help <command> --json も同じものを出力します。
openemail send --help --jsonopenemail domains delete --help --json | jq '.commands[0] | {scopes, destructive}'openemail help domains --json | jq -r '.commands[0].subcommands[].command'openemail --help --json | jq -r '.commands[].command'このドキュメント
schemaVersionnumber- フィールドの意味が変わると上がります
cli, versionstring- 常に `openemail`、そして出力したバージョン
pathstring[]- 尋ねたコマンド。ルートでは空
commandsobject[]- ルートではすべてのトップレベルのコマンド、それ以外では尋ねたコマンド。それぞれサブコマンドを含みます
globalFlagsobject[]- すべてのコマンドが受け付けるフラグ。形はコマンドのフラグと同じです
subcommandAliasesobject- `ls` や `rm` などの共通のエイリアスと、それが表す動詞
exitCodesobject[]- すべての終了コードを `{ code, name, meaning }` の形で
コマンド
namestring- コマンドの最後の語
commandstring- `openemail domains delete` のようなコマンド全体
path, aliasesstring[]- `openemail` の後に続いてそこへ至る語と、その別名
summary, descriptionstring- 何をするかを 1 行で、そして詳しく
usagestring[]- 呼び出し方
categorystring | null- トップレベルのコマンドなら `openemail --help` での区分、それ以外は `null`
group, runnable, hiddenboolean- サブコマンドを持つか、単独で実行できるか、ヘルプで非表示か
authstring- 必要なサインイン:`required`、ブラウザでのサインインのみの `browser`、`optional`、`none`
scopesstring[]- 毎回の実行に必要な API スコープ
destructiveboolean- 先に確認を求めるかどうか。その確認には `--yes` が答えます
argumentsobject[]- 各引数の `name`、`description`、`required`、`variadic`
flagsobject[]- 各フラグの `name`、`short`、`kind`、`required`、`repeatable`、`choices`、`placeholder`、`description`、`hidden`
notes, examplesobject[]- 追加のヘルプブロックを `{ title, lines }` として、例を `{ command, note }` として
resourceobject | null- リソースコマンドなら背後にある SDK メソッドと REST 呼び出し、それ以外は `null`
subcommandsobject[]- グループの下のコマンド。形は同じです
リソース
namespacestring- `domains` のような SDK の名前空間
sdkMethodstring- `openemail.domains.delete` のような SDK メソッド
sdkMethodAllstring | null- リストの場合、`--all --json` がたどる `listAll` メソッド
httpMethod, httpPathstring- `DELETE` と `/domains/{id}` のような REST 呼び出し
scopesstring[]- メソッドに必要なスコープ
authstring- `apiKey`、または API キーを送らないメソッドでは `none` と `inboxToken`
returnsobject- `{ shape, type }`:`object` や `page` といった応答の形と、その SDK の型
paginatesboolean- リストの 1 ページを返すかどうか
ツリー全体は約 1 メガバイトで、そのほとんどは 198 のリソースコマンドです。必要なコマンドを指定するか、jq でツリーを絞り込んでください。テキストはバッククォートを保ち、色のコードを含みません。security のような非表示のコマンドも、hidden を true にして含まれます。
ドライラン
--dry-run は mcp serve 以外のすべてのコマンドで使えます。読み取りは通常どおり実行され、何かを変更する最初のリクエストは送られずに表示され、コマンドはそれ以外何もせずコード 0 で終了します。何も送らないので確認は省略され、エージェントは --yes を渡さずに、破壊的なコマンドが何をするかを確かめられます。
openemail domains delete <domain-id> --dry-runopenemail send --from [email protected] --to [email protected] --subject "Hi" --text "Hello" --dry-run --json{ "dryRun": true, "request": { "method": "POST", "url": "https://api.openemail.uk/emails", "headers": { "accept": "application/json", "authorization": "Bearer [redacted]", "content-type": "application/json", "idempotency-key": "58e6fb61-ad2e-401e-b141-7a0546c7c749", "user-agent": "openemail-cli/0.0.1 openemail-sdk/0.0.5" }, "body": { "from": "[email protected]", "to": [ "[email protected]" ], "subject": "Hi", "text": "Hello" }, "raw": null }}- 変更とは、
GETとHEAD以外のすべてのリクエスト、MCP ツールの呼び出し、そしてloginとlogoutのサインインとサインアウトのリクエストです。トークンの更新とdocs askはそのまま実行されます。 - 計画には、メソッド、完全な URL、
Authorizationの値をBearer [redacted]に切り詰めたヘッダー、Resend のキーのような秘密のフィールドを伏せた JSON 本文が表示されます。アップロードはサイズとコンテンツタイプだけを表示します。 profile use、login --with-token、保存済みの API キーの削除のように、このマシンの中だけで済む変更は{"dryRun":true,"local":{"action","profile"}}を出力し、何も保存しません。- 最初の変更の前に読み取った内容を表示するコマンドは、それを先に表示します。
readはスレッドを表示し、その後に既読にするリクエストを表示します。後者を省くには--no-mark-readを渡してください。 mcp serveは、何を送るかをクライアントが決めるため、--dry-runを終了コード2で拒否します。代わりにopenemail mcp call <tool> --dry-runで 1 つのツール呼び出しをプレビューしてください。
足りないスコープ
すべてのコマンドは常に必要な API スコープを知っており、ヘルプにも一覧があります。保存済みのサインインにそのどれかが足りないとき、コマンドは API に現在の一覧を一度だけ問い合わせるので、サインイン後にウェブサイトで与えたアクセスもすぐに反映されます。それでもスコープが足りなければ、何かを尋ねたりリクエストを送ったりする前に、終了コード 4 とコード insufficient_scope で止まります:
{"error":{"type":"cli_error","code":"insufficient_scope","message":"This sign-in does not have the emails:send permission, which openemail send needs.","hint":null,"next":"Give this app more access in Account settings, Connected apps (openemail open apps, then Edit access), or run openemail login --force and choose more access.","status":null,"requestId":null,"param":null,"docUrl":null,"exitCode":4}}- ブラウザでのサインインの場合、
nextは、アカウント → コマンドラインでアプリにより多くのアクセスを与える(openemail open cliから「アクセスを編集」)か、openemail login --forceを実行してより多くのアクセスを選ぶよう案内します。ブラウザでのサインインにはkeys:writeやkeys:manageが与えられないため、それらには API キーを案内します。 - API キーの場合、
nextはそのスコープを持つキーを使うよう案内します。 --api-keyやOPENEMAIL_API_KEYから来たキーは事前には確認されず、API が判断します。スコープが足りないために API が呼び出しを拒否したときも、エラーには同じnextが入ります。
確認コード
API キーには確認コードは必要ありません。ブラウザでのサインインでは、webhook の追加、ルールの作成、メンバーの変更、ドメインの削除といった慎重を要する変更の前にコードが必要で、エージェントはそれを入力できません。そのため、エージェントを動かす前に、人が同じプロファイルでターミナルから openemail verify を実行するか、アカウント → コマンドラインでそのサインインに「60分間、変更を許可」を選びます。どちらでも以後 60 分間有効です。
openemail verifyopenemail verify --status --jsonverify --status --json は、プロファイルが確認済みかどうかを elevated で、いつまでかを elevatedUntil でエージェントに伝えます。確認がなければ、変更は終了コード 4 とコード step_up_required で止まり、何も変わりません:
{"error":{"type":"cli_error","code":"step_up_required","message":"This action needs a verification code, and there is no interactive terminal to ask for one.","hint":null,"next":"Run openemail verify in an interactive terminal first, then run this again within 60 minutes. An API key never needs a code.","status":403,"requestId":"req_9Qm4tV","param":null,"docUrl":"https://openemail.uk/docs/api/errors#step_up_required","exitCode":4}}MCP 経由で
MCP を話すエージェントは、代わりに OpenEmail の MCP サーバーを使えます。openemail mcp config --client claude-code、または codex、cursor など一覧にある他のクライアントを指定すると設定を表示し、openemail mcp serve はこの CLI のブラウザでのサインインを再利用するローカルのブリッジです。API キーは MCP サーバーに届きません。詳しくは「AI と MCP」のページをご覧ください。
レシピ
openemail inbox --unread --limit 20 --jsonopenemail inbox --unread --json | jq -r '.items[].id'openemail read CAHk7pQ2x9LmZ4 --no-mark-read --jsonopenemail send --from [email protected] --to [email protected] --subject "Weekly report" --body-file report.md --idempotency-key weekly-report-39 --jsonopenemail domains create --domain example.com --dry-run --jsonopenemail domains create --domain example.com --jsonopenemail whoami --json | jq '.scopes'