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.
Antes de começar
Seção intitulada “Antes de começar”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.
Cadastrar o conector
Seção intitulada “Cadastrar o conector”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:
| Header | Valor |
|---|---|
X-Client-Id | sb_client_... |
X-Client-Secret | sb_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.
| Tool | Escopo |
|---|---|
get_api_context | nenhum além de uma credencial válida |
list_meetings | meetings.read |
get_meeting | meetings.read |
get_meeting_overall_evaluation | meetings.read |
get_meeting_answers | meetings.read |
get_meeting_transcript | meetings.read + transcriptions.read |
list_calls | calls.read |
get_call | calls.read |
get_call_overall_evaluation | calls.read |
get_call_answers | calls.read |
get_call_transcript | calls.read + transcriptions.read |
list_emails | emails.read |
get_email | emails.read |
list_email_messages | emails.read + emails.content.read |
list_whatsapp_conversations | whatsapp.read |
get_whatsapp_conversation | whatsapp.read |
list_whatsapp_messages | whatsapp.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.
Transcrições vêm em janelas
Seção intitulada “Transcrições vêm em janelas”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.
Corpo de e-mail custa mais que metadado
Seção intitulada “Corpo de e-mail custa mais que metadado”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.
Texto de WhatsApp custa mais que metadado
Seção intitulada “Texto de WhatsApp custa mais que metadado”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.
O que o servidor resolve, e o que não
Seção intitulada “O que o servidor resolve, e o que não”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.
Cota compartilhada
Seção intitulada “Cota compartilhada”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.