Registry interno de ferramentas MCP por tenant e perfil: como centralizar seu catálogo

Quando uma empresa tem 3 MCP servers e 2 times usando, a configuração manual funciona. Quando chega a 8 servidores e 6 times, vira um pesadelo de manutenção — alguém sempre com a versão errada, alguém sem acesso ao servidor certo. A solução é um registry centralizado: um catálogo vivo que cada agente consulta para saber o que existe e o que pode usar.

Sem um registry centralizado, cada time que quer usar um MCP server precisa:

  1. Descobrir que o servidor existe (por e-mail, Slack, documentação desatualizada no Confluence).
  2. Saber o endpoint correto e a versão atual.
  3. Configurar manualmente o cliente MCP com essas informações.
  4. Repetir tudo isso quando o servidor muda de versão ou endpoint.

Isso funciona para 2 ou 3 servidores. Para qualquer coisa além disso, você está criando débito técnico operacional: horas por semana de time sênior fazendo suporte de configuração.

O registry resolve o problema de discovery de forma análoga ao que um DNS faz para IPs: em vez de memorizar e distribuir endereços, você consulta um serviço central que tem a informação atualizada.

O que o registry precisa conter

Um registry MCP eficiente não é só uma lista de URLs. Ele precisa conter metadados suficientes para que um agente (ou um desenvolvedor) entenda o que cada server faz, quem pode usá-lo e como se autenticar.

Campos obrigatórios por entrada no registry:

Esquema YAML/JSON do registry: exemplo completo

Abaixo está um exemplo de registry com três servidores MCP — a estrutura que recomendo como ponto de partida. Você pode manter isso como arquivo YAML servido por um endpoint HTTP simples ou como banco de dados com API.

# mcp-registry.yaml
# Versão do schema do registry (independente da versão dos servidores)
schema_version: "1.0"
atualizado_em: "2026-05-05T10:00:00-03:00"

servidores:
  - name: mcp-crm
    description: >
      Ferramentas de CRM interno: busca de clientes, pedidos, tickets de suporte
      e histórico de interações. Use para fluxos de atendimento e pós-venda.
    endpoint: "https://mcp.interno.empresa.com/crm"
    version: "2.1.0"
    status: ativo
    contact: "time-produto@empresa.com"
    autenticacao:
      tipo: jwt_bearer
      issuer: "https://auth.interno.empresa.com"
      audience: "mcp-crm"
    permissions:
      - crm:acesso  # scope mínimo para se conectar ao servidor
    scopes:
      - pedidos:leitura
      - pedidos:escrita
      - clientes:leitura
      - clientes:escrita
      - tickets:leitura
      - tickets:escrita
    tenants_allowed:
      - "*"  # todos os tenants autorizados internamente
    rate_limit:
      chamadas: 100
      janela: "1m"
      por: agente
    ferramentas:
      - name: buscar_pedido
        version: "1.2.0"
        scopes_necessarios: [pedidos:leitura]
      - name: listar_clientes
        version: "1.0.3"
        scopes_necessarios: [clientes:leitura]
      - name: criar_ticket_suporte
        version: "2.0.0"
        scopes_necessarios: [tickets:escrita]
      - name: buscar_contato_v1
        version: "1.5.2"
        status: depreciado
        deprecation_date: "2026-06-30"
        substituto: buscar_cliente_v2

  - name: mcp-analytics
    description: >
      Ferramentas de analytics e relatórios: dashboards de vendas, funil de conversão,
      churn e métricas de produto. Somente leitura — não escreve em banco de dados.
    endpoint: "https://mcp.interno.empresa.com/analytics"
    version: "1.3.0"
    status: ativo
    contact: "time-dados@empresa.com"
    autenticacao:
      tipo: jwt_bearer
      issuer: "https://auth.interno.empresa.com"
      audience: "mcp-analytics"
    permissions:
      - analytics:acesso
    scopes:
      - relatorios:leitura
      - metricas:leitura
      - exportacao:leitura
    tenants_allowed:
      - "tenant-empresa-abc"
      - "tenant-empresa-xyz"
      # tenants externos não têm acesso a analytics interno
    rate_limit:
      chamadas: 30
      janela: "1m"
      por: agente
    ferramentas:
      - name: relatorio_vendas_mes
        version: "1.1.0"
        scopes_necessarios: [relatorios:leitura]
      - name: taxa_churn_periodo
        version: "1.0.0"
        scopes_necessarios: [metricas:leitura]
      - name: exportar_csv_pedidos
        version: "1.2.0"
        scopes_necessarios: [exportacao:leitura]

  - name: mcp-financeiro
    description: >
      Ferramentas financeiras: consulta de notas fiscais, extrato de cobranças,
      status de inadimplência e geração de boletos. Acesso restrito a tenants autorizados.
    endpoint: "https://mcp.interno.empresa.com/financeiro"
    version: "3.0.0"
    status: ativo
    contact: "time-financeiro@empresa.com"
    autenticacao:
      tipo: jwt_bearer
      issuer: "https://auth.interno.empresa.com"
      audience: "mcp-financeiro"
    permissions:
      - financeiro:acesso
    scopes:
      - notas:leitura
      - cobrancas:leitura
      - boletos:escrita
    tenants_allowed:
      - "tenant-financeiro-interno"
      # Este servidor não é exposto para tenants de clientes
    rate_limit:
      chamadas: 20
      janela: "1m"
      por: agente

Como o discovery automático funciona

Com o registry no ar, o fluxo de descoberta de um agente funciona assim:

  1. Agente faz login: obtém um JWT com os claims de tenant_id, agent_id e a lista de scopes que tem permissão.
  2. Agente consulta o registry: faz um GET para https://registry.interno.empresa.com/mcp/servidores com o JWT no header. O registry filtra e retorna apenas os servidores onde o tenant está em tenants_allowed e o agente tem pelo menos um dos permissions necessários.
  3. Agente configura seus clientes MCP: com a lista retornada, o agente sabe a quais servidores se conectar, qual endpoint usar e quais ferramentas estão disponíveis para ele.
  4. Cache com TTL: o agente guarda a lista em memória por um período configurável (padrão: 5 minutos). Isso evita uma consulta ao registry a cada chamada de ferramenta.

O endpoint principal do registry deve ter um schema como este:

GET /mcp/servidores
Authorization: Bearer {jwt}

Response 200:
{
  "schema_version": "1.0",
  "gerado_em": "2026-05-05T14:32:11-03:00",
  "cache_ttl_segundos": 300,
  "servidores": [
    {
      "name": "mcp-crm",
      "endpoint": "https://mcp.interno.empresa.com/crm",
      "version": "2.1.0",
      "ferramentas_disponiveis": [
        "buscar_pedido",
        "listar_clientes",
        "criar_ticket_suporte"
        // buscar_contato_v1 NÃO aparece aqui se foi depreciado e expirou
      ]
    }
    // somente servidores que este token pode acessar
  ]
}

Versionamento semântico no nível da ferramenta

O registry precisa rastrear versões em dois níveis: o servidor como um todo e cada ferramenta individualmente. Isso parece excesso de detalhe, mas é fundamental na prática.

Imagine que você tem o servidor MCP de CRM na versão 2.1.0. Dentro dele:

Se você rastrear só a versão do servidor, qualquer time que tinha um agente funcionando com a v1 de criar_ticket vai quebrar sem aviso quando o servidor subir de versão. Com versionamento por ferramenta no registry, você pode manter v1 e v2 simultaneamente durante o período de migração.

Regras de versionamento SemVer para ferramentas MCP
Tipo de mudança Versão afetada Exemplo Precisa de período de migração?
Correção interna sem mudança de interface PATCH (0.0.X) Corrigiu bug que retornava data em fuso errado Não
Novo campo opcional no input ou output MINOR (0.X.0) Adicionou campo urgencia opcional no input de criar_ticket Não (retrocompatível)
Nova ferramenta adicionada ao servidor MINOR do servidor Adicionou reabrir_ticket Não
Campo obrigatório adicionado ao input MAJOR (X.0.0) Tornou categoria obrigatório em criar_ticket Sim — mínimo 30 dias com ambas versões ativas
Campo removido ou renomeado no output MAJOR (X.0.0) Renomeou status para situacao Sim — mínimo 30 dias com ambas versões ativas
Ferramenta removida do servidor MAJOR do servidor Removeu buscar_contato_v1 Sim — anunciar com no mínimo 60 dias de antecedência

Como estruturar o registry tecnicamente

Existem três abordagens, em ordem crescente de complexidade:

  1. Arquivo YAML/JSON servido por CDN ou servidor estático. Ideal para começar. O registry é um arquivo que você versiona no Git e serve via S3, Cloudflare ou nginx. A desvantagem é que não tem lógica de filtro por tenant — você serve o catálogo completo e o cliente filtra. Funciona para times pequenos com poucos tenants.
  2. API simples (FastAPI, Express, Gin). O registry vira um serviço HTTP que aceita o JWT, valida os claims e devolve o catálogo filtrado. Recomendado a partir de 3+ times usando MCP. Custo de infraestrutura baixo: uma instância pequena aguenta milhares de consultas por hora.
  3. Registry federado com auto-registro. Cada MCP server, ao subir, registra a si mesmo no registry via API. Quando é desligado, cancela o registro. O registry mantém heartbeat de cada servidor e remove automaticamente os que não respondem. Essa é a abordagem de longo prazo para empresas com dezenas de servidores.

Para a maioria das PMEs, a abordagem 2 (API simples) é o ponto de equilíbrio certo. Cobre o essencial sem o overhead operacional da federação.

Integração com segurança e allowlist

O registry e a camada de segurança trabalham juntos: o registry informa o que existe e o que cada perfil pode ver; a allowlist no MCP server impõe o que cada agente pode efetivamente chamar.

O fluxo completo de uma chamada autorizada é:

  1. Agente consulta registry → recebe lista de servidores e ferramentas disponíveis para seu perfil.
  2. Agente decide chamar a ferramenta buscar_pedido no servidor mcp-crm.
  3. Agente envia a chamada com o JWT no header.
  4. Servidor MCP valida o JWT, verifica se buscar_pedido está na allowlist do agente e se o scope pedidos:leitura está presente no token.
  5. Servidor executa a ferramenta e retorna o resultado.
  6. Servidor registra a chamada nos logs de auditoria.

Para o checklist completo de segurança nesse fluxo, veja segurança em MCP: allowlist, sandbox, scopes e logs.

Manutenção e ciclo de vida do registry

Um registry mal mantido é pior do que nenhum registry — porque os times passam a confiar nele e ficam frustrados quando encontram informações desatualizadas.

Boas práticas de manutenção:

Por onde começar

Se você tem MCP servers em produção hoje sem registry, aqui está a sequência mínima:

  1. Documente todos os servidores existentes no esquema YAML acima. Só o exercício de preencher os campos vai revelar inconsistências que você não sabia que existiam.
  2. Suba o YAML como um endpoint HTTP estático. Já é um registry funcional.
  3. Configure os clientes MCP para consultar esse endpoint em vez de usar configuração manual.
  4. Nas próximas semanas, adicione filtro por tenant e health check automático.

Para entender como cada servidor deve ser estruturado como produto antes de entrar no registry, leia MCP server como produto: empacote suas ferramentas. E para o contexto geral, comece por MCP para empresas: o que é e quando implementar.