Pular para o conteúdo

Servidor MCP

Esta API serve um servidor Model Context Protocol por HTTP em https://api.salesbud.com.br/mcp. Cadastrado uma vez como conector personalizado no claude.ai, ele deixa o modelo ler reuniões, ligações, transcrições, respostas do template, avaliações, e-mails e conversas de WhatsApp com a sua credencial — sem nada para instalar.

Ele é um cliente da API pública, não uma superfície nova: mesma credencial OAuth, mesmos escopos, mesmos limites de uso e apenas operações de leitura — nada que ele alcance é diferente do que a API HTTP devolveria para a mesma credencial.

Você precisa de uma credencial de API com os escopos que pretende usar, da feature API_ACCESS habilitada para a sua empresa e de acesso de administrador na organização do Claude que vai guardar o conector. As credenciais não são self-service; veja o Começo rápido.

Quem administra a organização no Claude cadastra um conector personalizado apontando para https://api.salesbud.com.br/mcp. A autenticação é No sign-in — este servidor não tem fluxo OAuth — e a credencial da empresa cujos dados o conector deve ler viaja em dois headers de requisição:

HeaderValor
X-Client-Idsb_client_...
X-Client-Secretsb_secret_...

Qualquer outro cliente HTTP pode mandar a mesma credencial como Basic (RFC 7617):

Authorization: Basic <base64 de client_id:client_secret>

Duas consequências de uma credencial cadastrada uma vez pelo administrador:

  • Ela fica guardada do lado da Anthropic e é compartilhada pela organização inteira no Claude. Todo mundo ali lê o que os escopos permitirem, e a trilha de auditoria registra a credencial, não quem pediu.
  • Revogar significa rotacionar. Rotacionar o segredo quebra junto qualquer outra integração que use a mesma credencial, então dê uma só para o conector.

Se a credencial restringe acesso por IP, a allowlist precisa conter a faixa de saída da Anthropic, 160.79.104.0/21: a requisição chega nesta API de lá, não do navegador do usuário.

Uma tool por operação pública de leitura. A coluna de escopo é o que a credencial precisa carregar — escopo faltando volta como uma mensagem legível de INSUFFICIENT_SCOPE, que o modelo consegue relatar, não como exceção.

ToolEscopo
get_api_contextnenhum além de uma credencial válida
list_meetingsmeetings.read
get_meetingmeetings.read
get_meeting_overall_evaluationmeetings.read
get_meeting_answersmeetings.read
get_meeting_transcriptmeetings.read + transcriptions.read
list_callscalls.read
get_callcalls.read
get_call_overall_evaluationcalls.read
get_call_answerscalls.read
get_call_transcriptcalls.read + transcriptions.read
list_emailsemails.read
get_emailemails.read
list_email_messagesemails.read + emails.content.read
list_whatsapp_conversationswhatsapp.read
get_whatsapp_conversationwhatsapp.read
list_whatsapp_messageswhatsapp.read + whatsapp.content.read

Peça get_api_context primeiro quando não souber o que a credencial alcança: ele responde com o client, a empresa, os escopos e o limite por minuto.

O /oauth/token não é tool de propósito — o servidor emite e renova o token por dentro, e expor isso gastaria o bucket de OAuth e colocaria o token na conversa. As sondas de liveness e readiness também não são tools.

Uma transcrição de uma hora tem milhares de falas e não cabe no contexto do modelo de uma vez. As tools de transcrição devolvem 200 falas por chamada e dizem quantas faltam; o modelo passa offset para continuar. A API devolve a transcrição inteira — o janelamento é do servidor MCP.

Registro sem transcrição não é erro: a tool responde transcript unavailable (status: not_started), que é o contrato descrito em Reuniões e ligações.

list_emails e get_email devolvem metadado da conversa — participantes, caixas conectadas, contas vinculadas, contagens — e nunca o corpo. Ler as mensagens é outra tool, list_email_messages, e ela pede mais: emails.content.read além de emails.read, e uma política de rate limit própria, mais apertada que a do resto da API. Peça uma página por vez em vez de varrer a caixa inteira.

Corpo com mais de 2.000 caracteres é cortado no texto que o modelo lê e vai inteiro no structuredContent. Conteúdo de anexo, corpo em HTML e bcc a API nunca serve, então nenhuma tool alcança.

list_whatsapp_conversations e get_whatsapp_conversation devolvem metadado da conversa — contato, vendedor, contas vinculadas, instantes de atividade — e nunca uma mensagem. Ler as mensagens é outra tool, list_whatsapp_messages, e ela pede mais: whatsapp.content.read além de whatsapp.read, e uma política de rate limit própria. Peça uma página por vez em vez de varrer o histórico inteiro.

Texto ou transcrição de áudio com mais de 2.000 caracteres é cortado no texto que o modelo lê e vai inteiro em structuredContent. Mensagem apagada para todos fica como lápide, sem conteúdo; mensagem editada mostra o texto atual. Conteúdo de mídia, identificadores do provedor, reações e estado de leitura nunca chegam ao modelo — a API não os serve. Veja a referência de WhatsApp.

Ele resolve renovação de token com margem de segurança, uma repetição em 401 com token novo, Retry-After em 429, backoff em 503 e falha imediata nos outros 4xx. Os erros chegam ao modelo com code e request_id, então um filtro de data mal formatado volta como INVALID_DATETIME e o modelo corrige o formato sozinho.

Ele não pagina por você. O modelo segue has_more e next_cursor como qualquer outro cliente, e a descrição da tool avisa disso, porque página curta não é a última página.

Também não existe sync incremental, porque a v1 não tem: janele por meeting_at ou created_at e reprocesse de forma idempotente por id.

Todas as credenciais de uma empresa dividem o mesmo bucket de 600 requisições por minuto. Um agente percorrendo um histórico longo consome a cota que as suas outras integrações estão usando; veja Limites de uso.