describe, que devolve as declarações TypeScript da API, e execute, que roda um script escrito pelo agente. Dentro do script, cada chamada é await ps.<ferramenta>(args) — as mesmas ferramentas, os mesmos argumentos e as mesmas permissões do /mcp.
/mcp não muda. Escolha um por conexão.
Quando usar
Use o/code quando:
- a tarefa encadeia várias chamadas — listar, filtrar e depois ler ou agir em cada item;
- você percorre muitos itens (números, webhooks, mensagens, contatos);
- você quer um relatório calculado a partir de muitas leituras, devolvido como um resultado só;
- o contexto do seu agente é apertado e as definições das 139 ferramentas custam caro demais.
/mcp quando a tarefa tem uma ou duas chamadas, ou quando você quer aprovar cada chamada, uma a uma, no seu cliente.
Um encadeamento que no /mcp leva dezenas de idas e voltas pelo modelo vira um único execute no /code: os resultados intermediários ficam dentro do script, e só o que ele imprime volta para o modelo.
Quanto custa em contexto
Medido comcount_tokens no Claude Sonnet:
O agente só paga pelos temas que de fato lê.
Conectar
A autenticação é a mesma do/mcp: um token OAuth 2.1 (Authorization: Bearer, tratado pelo conector personalizado do claude.ai, com concessão do tenant inteiro ou por número) ou uma chave de API ps_* no header x-api-key — com uma chave de conta (ps_account_), mais o x-workspace-id indicando o workspace (detalhes). Cada chamada do script vai para a API pública /v1 com essa credencial, então o escopo da chave, os papéis, as concessões por número, os limites de taxa e a cobrança valem exatamente como no /mcp.
No claude.ai, adicione um conector personalizado com a URL https://mcp.pilotstatus.com.br/code. Clientes configurados por arquivo:
O modo de código existe só no servidor hospedado. O pacote npm
@pilot-status/mcp-server (auto-hospedado) serve apenas as 139 ferramentas.describe
Devolve o que o script pode chamar. Recebe no máximo um argumento:
Temas:
messages, conversations, referrals, leads, ads, groups, numbers, templates, flows, branding, analytics, api-keys, subscription, media, billing, webhooks, calls, chatwoot, pricing, workspace, phone-lines, docs.
As declarações e descrições estão em inglês, como as das ferramentas do /mcp.
Todo método, menos o docs_search, aceita também whatsappNumberId, o número de destino das ferramentas com escopo de número. Ele é obrigatório com credencial OAuth ou com escopo de tenant (vai no header x-whatsapp-number-id) e é ignorado quando a chave de API já tem escopo de um número.
Erros: passar theme e search juntos devolve INVALID_ARGUMENTS; um tema que não existe devolve UNKNOWN_THEME com a lista de themes válidos.
execute
Recebe um argumento, code: o corpo de um script TypeScript.
awaitfunciona no nível de cima. Chame a API comawait ps.<ferramenta>(args); o resultado é a resposta JSON da API.- Imprima com
console.log(tambéminfo,warn,error,debug). Objetos saem como JSON. - Um valor de
returné acrescentado à saída como=> <valor>. - Os tipos só são removidos, não conferidos: erro de tipo não para o script; erro de sintaxe para.
- Não há rede nem nada do servidor: sem
fetch, semimport, semrequire, semprocess, semsetTimeout/setInterval. A única saída do script é ops.
Exemplo: listar e ler cada um
Lê as entregas recentes de cada webhook do número, em paralelo, e imprime só o resumo.Exemplo: tratar uma recusa da API
Quando a API recusa uma chamada,ps.<ferramenta> lança um erro dentro do script. O erro tem name === "ApiError", o status HTTP e o code da API. Capture-o para seguir em frente.
InvalidArguments (os argumentos não batem com a declaração; code é INVALID_ARGUMENTS), CallLimitExceeded e SendLimitExceeded (veja Limites).
Exemplo: enviar com segurança usando idempotencyKey
Passe um idempotencyKey em todo ps.messages_send. Derive a chave do que torna o envio único — aqui, o id do pedido e o destinatário — para que rodar o mesmo script de novo não mande a mesma mensagem duas vezes.
409 IDEMPOTENCY_KEY_REUSED. Idempotência
Scripts que rodam rápido
Cada chamadaps leva segundos, e o relógio de 30 segundos conta todas elas. A descrição do execute — o que o agente lê na lista de ferramentas — orienta o agente a:
- Reusar os ids que já tem. Com uma credencial do workspace inteiro, passe
whatsappNumberIdem toda chamada com escopo de número, e reuse o id (e qualquer outro id) já obtido antes na conversa. Chameps.numbers_list({})só quando o id ainda não for conhecido. - Rodar juntas as chamadas independentes com
await Promise.all([...]), nunca comawaituma a uma num loop — como no primeiro exemplo. - Pedir só o necessário: um
pageSizepequeno e filtros comostatus,startDateesearch. - Usar uma URL real em
media: uma URL http(s) recebida, nunca base64 inventado. Para áudio e voz isso é obrigatório: um data URI é recusado com400 MCP_AUDIO_URL_REQUIREDe nada é enviado. Servidor MCP
Limites por execução
- Toda chamada conta, inclusive as recusadas. Um
messages_sendcom argumentos inválidos conta como envio. - Só
messages_sendconta como envio.call_initiateecall_permission_requestcontam só nas 50 chamadas. - Não há limite de execuções por hora: os limites de taxa da API
/v1valem para cada chamada, como no/mcp.
Falha e relatório
Uma falha para o script, e nada é desfeito. O que foi enviado continua enviado. Todoexecute que rodou devolve um relatório:
É pelo
calls que o agente sabe o que já aconteceu antes de decidir o próximo passo. Para rodar um script de novo com segurança, ele precisa passar idempotencyKey em todo ps.messages_send — sem a chave, rodar de novo envia de novo.
Recusado antes de rodar
Quando o script não consegue começar,execute devolve isError: true com error, code e nenhum relatório:
Sem nenhuma credencial, o
/code responde 401 e inicia o fluxo OAuth, como o /mcp. Uma credencial que a API recusa impede a execução, com o status e o code da API.
O que fica registrado
Cada execução — o script, os argumentos de cada chamada e a saída — fica guardada por 30 dias para suporte e segurança, e depois é apagada. Argumentos e saída podem conter dados de contato (telefones, texto de mensagens). As execuções não aparecem no painel nem na API: o relatório devolvido peloexecute é a sua cópia.