Pular para o conteúdo principal
O modo de código (Code Mode) é um segundo endpoint do servidor MCP hospedado. Em vez das 139 ferramentas, o agente recebe duas: 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.
O endpoint /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.
Fique no /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 com count_tokens no Claude Sonnet: O agente só paga pelos temas que de fato lê.

Conectar

Conecte ao agente ou o /mcp ou o /code, não os dois. Com os dois conectados, o agente continua carregando as definições das 139 ferramentas do /mcp (77.666 tokens quando eram 114), e a economia de contexto do /code some. Se você já usa o /mcp, desligue esse conector no agente em que adicionar o /code.
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.
  • await funciona no nível de cima. Chame a API com await ps.<ferramenta>(args); o resultado é a resposta JSON da API.
  • Imprima com console.log (também info, 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, sem import, sem require, sem process, sem setTimeout/setInterval. A única saída do script é o ps.

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.
Um erro não capturado para o script. Outros erros que uma chamada pode lançar: 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.
Durante 24 horas, a mesma chave com os mesmos argumentos devolve a primeira resposta aceita e não envia nada. A mesma chave com argumentos diferentes dá 409 IDEMPOTENCY_KEY_REUSED. Idempotência

Scripts que rodam rápido

Cada chamada ps 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 whatsappNumberId em toda chamada com escopo de número, e reuse o id (e qualquer outro id) já obtido antes na conversa. Chame ps.numbers_list({}) só quando o id ainda não for conhecido.
  • Rodar juntas as chamadas independentes com await Promise.all([...]), nunca com await uma a uma num loop — como no primeiro exemplo.
  • Pedir só o necessário: um pageSize pequeno e filtros como status, startDate e search.
  • 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 com 400 MCP_AUDIO_URL_REQUIRED e nada é enviado. Servidor MCP
O mesmo vale para scripts que você mesmo escreve ou revisa.

Limites por execução

  • Toda chamada conta, inclusive as recusadas. Um messages_send com argumentos inválidos conta como envio.
  • Só messages_send conta como envio. call_initiate e call_permission_request contam só nas 50 chamadas.
  • Não há limite de execuções por hora: os limites de taxa da API /v1 valem para cada chamada, como no /mcp.

Falha e relatório

Uma falha para o script, e nada é desfeito. O que foi enviado continua enviado. Todo execute 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 pelo execute é a sua cópia.

Relacionados