Para agentes de IA
Conduza `openemail` a partir do Claude Code, do Codex ou de um trabalho de CI: início de sessão sem supervisão, ajuda como dados, simulações, scopes em falta e códigos de verificação.
O guia integrado
openemail agents mostra um guia curto em Markdown para um agente de IA como o Claude Code ou o Codex, ou para um script em CI: como iniciar sessão sem uma pessoa, ler a saída, encontrar comandos, alterar coisas com segurança e percorrer listas, o que fazer quando falta um código de verificação ou um scope, e cinco receitas para copiar. openemail agent é o mesmo comando.
openemail agentsopenemail agents --json | jq -r '.recipes[].commands[]'Com --json o guia é um único documento com schemaVersion, title, intro, sections de { id, title, points }, exitCodes e recipes de { id, title, commands }. Em vez de colar estas regras em cada prompt, diga ao agente uma vez, no ficheiro de instruções que o seu projeto já lhe dá, que execute openemail agents antes de usar a CLI.
Iniciar sessão sem uma pessoa
- Use uma chave de API. Defina
OPENEMAIL_API_KEY, ou passe--api-keya um único comando. Crie-a em Definições → Chaves API (openemail open api-keys) só com os scopes de que o agente precisa. Uma chave nunca abre um navegador e nunca precisa de um código de verificação. - Ou reutilize um início de sessão no navegador que uma pessoa fez uma vez nesta máquina com
openemail login, e escolha-o com--profile <name>. A CLI renova os seus tokens sozinha. - Sem um terminal nada pede entrada. Com
--json,--no-inputouCI, ou sem um terminal ligado, um valor que a CLI teria pedido para com o código de saída2e indica a opção a passar. - Um início de sessão no navegador precisa de uma pessoa que o aprove, por isso um
openemail loginsem supervisão para com o código de saída2e o códigounattendedantes de registar o que quer que seja, e remete paraopenemail login --with-token. openemail whoami --jsonmostra o espaço de trabalho, o tipo de início de sessão e os seusscopes.
Ler a saída
Passe --json a cada comando. O stdout contém então exatamente um documento JSON, ou um objeto por linha com --ndjson, e o progresso fica em stderr. Uma falha mostra uma linha {"error":{...}} em stderr: decida pelo código de saída e pelo seu code, mostre next a uma pessoa e nunca analise message, cuja redação pode mudar. A página Scripts lista cada campo e cada código de saída.
Comandos como dados
--help --json mostra a ajuda como um único documento JSON, construído a partir do mesmo registo de comandos com que a CLI analisa, por isso corresponde sempre à versão instalada. Funciona na raiz, num grupo ou num comando, e openemail help <command> --json mostra o mesmo.
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'O documento
schemaVersionnumber- Muda quando um campo muda de significado
cli, versionstring- Sempre `openemail`, e a versão que o gerou
pathstring[]- O comando pedido, vazio para a raiz
commandsobject[]- Para a raiz, cada comando de primeiro nível; caso contrário, o pedido, cada um com os seus subcomandos
globalFlagsobject[]- As opções que cada comando aceita, com a mesma forma que as opções de um comando
subcommandAliasesobject- Cada alias partilhado, como `ls` ou `rm`, e os verbos que substitui
exitCodesobject[]- Cada código de saída como `{ code, name, meaning }`
Um comando
namestring- A última palavra do comando
commandstring- O comando completo, como `openemail domains delete`
path, aliasesstring[]- As palavras depois de `openemail` que levam até ele, e os seus outros nomes
summary, descriptionstring- O que faz, numa linha e por extenso
usagestring[]- Como chamá-lo
categorystring | null- A sua secção em `openemail --help` para um comando de primeiro nível; caso contrário, `null`
group, runnable, hiddenboolean- Se tem subcomandos, se corre sozinho e se a ajuda o omite
authstring- O início de sessão de que precisa: `required`, `browser` só para um início de sessão no navegador, `optional` ou `none`
scopesstring[]- Os scopes de API de que cada execução precisa
destructiveboolean- Se pede confirmação primeiro, que `--yes` responde
argumentsobject[]- `name`, `description`, `required` e `variadic` de cada argumento
flagsobject[]- `name`, `short`, `kind`, `required`, `repeatable`, `choices`, `placeholder`, `description` e `hidden` de cada opção
notes, examplesobject[]- Os blocos de ajuda extra como `{ title, lines }`, e os exemplos como `{ command, note }`
resourceobject | null- Para um comando de recurso, o método do SDK e a chamada REST por trás dele; caso contrário, `null`
subcommandsobject[]- Os comandos dentro de um grupo, com a mesma forma
Um recurso
namespacestring- O namespace do SDK, como `domains`
sdkMethodstring- O método do SDK, como `openemail.domains.delete`
sdkMethodAllstring | null- Para uma lista, o método `listAll` que `--all --json` percorre
httpMethod, httpPathstring- A chamada REST, como `DELETE` e `/domains/{id}`
scopesstring[]- Os scopes de que o método precisa
authstring- `apiKey`, ou `none` e `inboxToken` para um método que não envia nenhuma chave de API
returnsobject- `{ shape, type }`: a forma da resposta, como `object` ou `page`, e o seu tipo do SDK
paginatesboolean- Se devolve uma página de uma lista
A árvore completa tem cerca de um megabyte, quase tudo os 198 comandos de recursos, por isso peça o comando de que precisa ou filtre a árvore com jq. O texto mantém os acentos graves e não traz códigos de cor, e os comandos ocultos como security estão incluídos com hidden a true.
Simulações
--dry-run funciona em todos os comandos exceto mcp serve. As leituras correm como de costume, depois o primeiro pedido que alteraria alguma coisa é mostrado em vez de enviado, e o comando termina com o código 0 sem fazer mais nada. As confirmações são saltadas, já que nada é enviado, por isso um agente pode ver o que um comando destrutivo faria sem passar --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 }}- Uma alteração é qualquer pedido exceto
GETeHEAD, uma chamada a uma ferramenta MCP, e os pedidos de início e fim de sessão deloginelogout. A renovação de tokens edocs askcontinuam a correr. - O plano mostra o método, o URL completo, os cabeçalhos com o valor de
Authorizationreduzido aBearer [redacted], e o corpo JSON com os campos secretos, como uma chave do Resend, ocultados. Um carregamento mostra só o seu tamanho e o tipo de conteúdo. - Uma alteração que fica nesta máquina, como
profile use,login --with-tokenou esquecer uma chave de API guardada, mostra{"dryRun":true,"local":{"action","profile"}}e não guarda nada. - Um comando que mostra o que leu antes da sua primeira alteração mostra-o primeiro:
readmostra a conversa e depois o pedido que a marcaria como lida. Passe--no-mark-readpara omitir o segundo. mcp serverecusa--dry-runcom o código de saída2, porque o seu cliente decide o que enviar. Em vez disso, pré-visualize uma chamada a uma ferramenta comopenemail mcp call <tool> --dry-run.
Scopes em falta
Cada comando conhece os scopes de API de que precisa sempre, e a sua ajuda lista-os. Quando falta um a um início de sessão guardado, o comando pede uma vez à API a lista atual, por isso o acesso dado no site depois do início de sessão conta de imediato. Se o scope continuar em falta, para com o código de saída 4 e o código insufficient_scope antes de perguntar alguma coisa ou enviar um pedido:
{"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}}- Para um início de sessão no navegador,
nextdiz para dar mais acesso à aplicação em Conta → Linha de comandos (openemail open cli, depois Editar acesso), ou para executaropenemail login --forcee escolher mais acesso. Um início de sessão no navegador nunca recebekeys:writenemkeys:manage, por isso para esses remete para uma chave de API. - Para uma chave de API,
nextdiz para usar uma chave que tenha o scope. - Uma chave de
--api-keyou deOPENEMAIL_API_KEYnão é verificada antecipadamente, e é a API que decide. Quando a API recusa uma chamada por falta de um scope, o erro traz o mesmonext.
Códigos de verificação
Uma chave de API nunca precisa de um código de verificação. Um início de sessão no navegador precisa de um antes de uma alteração sensível, como adicionar um webhook, criar uma regra, alterar um membro ou remover um domínio, e um agente não o consegue escrever. Por isso, antes de o agente correr, uma pessoa executa openemail verify num terminal com o mesmo perfil, ou escolhe Permitir alterações durante 60 minutos para esse início de sessão em Conta → Linha de comandos. Qualquer um dos dois cobre os 60 minutos seguintes.
openemail verifyopenemail verify --status --jsonverify --status --json diz ao agente se o perfil está verificado, em elevated, e até quando, em elevatedUntil. Sem verificação, a alteração para com o código de saída 4 e o código step_up_required, e nada é alterado:
{"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}}Por MCP
Um agente que fala MCP pode usar o servidor MCP do OpenEmail em vez disso. openemail mcp config --client claude-code, ou codex, cursor e os outros clientes que lista, mostra a configuração, e openemail mcp serve é uma ponte local que reutiliza o início de sessão no navegador desta CLI. As chaves de API não chegam ao servidor MCP. A página IA e MCP tem os detalhes.
Receitas
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'