Esta página se aplica à Apigee e à Apigee híbrida.
Confira a documentação da
Apigee Edge.
Nesta página, descrevemos como resolver problemas com a implantação de proxies de descoberta do MCP. Use esta página para entender o ciclo de vida de provisionamento assíncrono das implantações do MCP, resolver códigos de erro e verificar a conectividade de tempo de execução.
Entender a implantação do MCP
A implantação de um proxy de descoberta do MCP é um processo assíncrono de várias etapas que garante que a configuração seja totalmente propagada na infraestrutura da Apigee e do Google Cloud antes da conclusão da implantação do proxy.
Enquanto essas etapas de provisionamento downstream estão sendo realizadas, a UI mostra o proxy no status Provisionando. Quando o processo for concluído, o status mudará para Implantado. Esse status confirma que todos os componentes downstream estão totalmente provisionados e que o proxy está pronto para processar o tráfego.
Solução de problemas
As seções a seguir descrevem erros e problemas conhecidos que podem ocorrer ao usar o MCP na Apigee.
Códigos de status de resposta de erro para chamadas de ferramentas e metadados
Os endpoints do MCP da Apigee retornam códigos de status HTTP que seguem a especificação do Protocolo de Contexto de Modelo (MCP) e os padrões OAuth relacionados. Entender esse comportamento ajuda a processar corretamente os erros no seu cliente da MCP ou agente de IA.
A tabela a seguir resume os códigos de status retornados pelos endpoints do MCP da Apigee:
| Cenário | Código de status HTTP | Corpo da resposta |
|---|---|---|
A execução de uma ferramenta falha em tools/call (por exemplo, a
API de back-end retorna um erro 4xx ou 5xx, como um
erro de validação ou um campo obrigatório ausente). |
200 OK |
Um CallToolResult com result.isError definido como
true e os detalhes do erro em content. Isso permite que o
cliente da MCP e o agente de LLM leiam o erro e se recuperem (por exemplo, ao
solicitar novamente a entrada ausente e tentar de novo) em vez de encerrar a
sessão. |
Os metadados do recurso protegido por OAuth (PRM) não estão configurados ou não podem ser
encontrados em /.well-known/oauth-protected-resource/mcp. |
404 Not Found |
Indica que não há metadados de recursos protegidos disponíveis no local solicitado. |
| O token de acesso está ausente, é inválido ou expirou. | 401 Unauthorized |
Inclui um desafio WWW-Authenticate para impulsionar o fluxo de descoberta do OAuth. |
| O token de acesso tem escopo insuficiente. | 403 Forbidden |
Inclui um desafio WWW-Authenticate para impulsionar o fluxo de autorização
de aumento de privilégios. |
Exemplo: corpo da resposta de erro de execução da ferramenta
Quando uma chamada de ferramenta falha, o Apigee MCP retorna HTTP 200 OK e
informa a falha no objeto JSON-RPC result, com
isError definido como true. O erro original retornado pelo seu back-end é preservado: o corpo da resposta do back-end é colocado literalmente (como uma string) em result.content[].text. Por exemplo, se o back-end retornar
HTTP 404 com o corpo {"error":"User 42 not found"}, a resposta do MCP
será:
{ "jsonrpc": "2.0", "id": 1, "result": { "content": [ { "type": "text", "text": "{\"error\":\"User 42 not found\"}" } ], "isError": true } }
O id corresponde ao id da sua solicitação tools/call.
Se o back-end não retornar um corpo de resposta, text vai conter um resumo gerado, como Operation failed (HTTP 500)..
O cliente MCP precisa inspecionar result.isError (não o código de status HTTP) para detectar uma falha na chamada de ferramenta. Se o código do cliente esperar especificamente um status HTTP 4xx ou 5xx para sinalizar um erro de execução da ferramenta, ele não vai detectar o erro, porque a resposta é HTTP 200 OK. Atualize esses clientes para ler result.isError e a matriz content.
Erros no nível do protocolo (por exemplo, uma solicitação JSON-RPC malformada) são diferentes dos erros de execução da ferramenta: eles continuam sendo retornados no objeto error JSON-RPC (por exemplo, {"jsonrpc": "2.0", "error": {"code": -32700, ...}}) em vez de result.isError.
Recomendação:os clientes MCP compatíveis com padrões processam esses códigos de status
com a lógica padrão. Portanto, nenhuma mudança é necessária. Se você adicionou uma
solução alternativa do lado do cliente para processar códigos de status não padrão, por exemplo, analisando
um corpo de resposta não 2xx para erros tools/call ou tratando uma
resposta 500 do endpoint da PRM como "metadados não configurados", recomendamos
remover essa solução alternativa. Caso contrário, o cliente poderá continuar usando
uma lógica de processamento obsoleta em vez de processar os códigos de status corrigidos normalmente.
Política de CORS para chamadas de MCP baseadas em navegador
Uma política de compartilhamento de recursos entre origens (CORS) é necessária quando as chamadas do MCP da Apigee são feitas diretamente de um navegador (por exemplo, quando o inspetor do MCP usa a configuração "Direto" em vez de "Via proxy"). O modelo de proxy de descoberta do MCP inclui a política de CORS da Apigee no PreFlow de solicitação do endpoint de proxy do pacote de proxy por padrão para ativar chamadas baseadas em navegador.
Se você encontrar problemas relacionados ao CORS ao fazer chamadas diretamente de um navegador, talvez seja necessário ajustar as configurações da política de CORS no PreFlow de solicitação do endpoint de proxy do pacote de proxy de descoberta do MCP.
Erro de análise JSON ao enviar solicitação para o endpoint do MCP
Você pode receber uma mensagem de erro semelhante a esta (ou com um código e uma mensagem de erro diferentes) ao enviar uma solicitação para o endpoint do MCP:
{
"error": {
"code": -32700,
"message": "JSON parse error"
},
"id": null,
"jsonrpc": "2.0"
}Nesse caso, recomendamos que você confirme as seguintes informações:
- Você inseriu o URL do endpoint do MCP correto.
- Sua solicitação está formatada corretamente.
- Você está acessando um método compatível.
- Você ativou e configurou o proxy de descoberta do MCP em uma região compatível. Para uma lista de regiões que podem ter limites de capacidade, consulte falhas de implantação.
Falhas de implantação
Se a implantação do proxy de descoberta do MCP falhar com o status Falha na UI, verifique a mensagem de erro para mais detalhes. Falhas comuns incluem:
- Falha na configuração de rede ou Esquema não compatível em OAS: esses erros geralmente indicam um problema com a especificação OpenAPI. Verifique se a especificação é válida e usa uma versão compatível.
- Limites de capacidade da região (somente Apigee): se você encontrar um erro relacionado à falha no provisionamento do balanceador de carga ou se o status de provisionamento nunca mudar para Implantado, isso pode ser devido a limites temporários de capacidade da infraestrutura em uma das seguintes regiões:
asia-east2asia-northeast3asia-southeast2australia-southeast1europe-central2europe-west12europe-west9me-central2us-central2
Para resolver o erro, tente implantar o proxy em um ambiente de outra região. Esse modo de falha não se aplica à Apigee híbrida, em que a infraestrutura de ambiente de execução é seu próprio cluster.
- MCP não ativado no cluster (somente Apigee híbrida): se a implantação do proxy do MCP permanecer no status Provisionando indefinidamente e nunca atingir Implantado, verifique se o MCP está ativado no cluster. Consulte Diagnóstico do lado do cluster abaixo.
Diagnóstico do lado do cluster (somente Apigee híbrida)
Como o plano de dados da MCP híbrida do Apigee é executado no seu próprio cluster do Kubernetes,
os modos de falha no cluster são diagnosticados com kubectl no cluster.
Siga a lista de verificação de diagnóstico abaixo na ordem.
Etapa 1: verificar se o MCP está ativado no cluster
O MCP é implantado como um recurso personalizado ApigeeDeployment (gerenciado pelo operador da Apigee), não como um Deployment do Kubernetes simples. Verifique o ApigeeDeployment do MCP:
kubectl -n APIGEE_NAMESPACE get apigeedeployment -l app=apigee-mcp-server
Saída esperada (os nomes de recursos incluem um sufixo derivado da organização, mostrado aqui como ORG_CR_SUFFIX):
NAME STATE NESTEDSTATE AGE apigee-mcp-server-default-ORG_CR_SUFFIX running 1h
Se o comando retornar No resources found in APIGEE_NAMESPACE namespace.,
o MCP não estará ativado. Volte para
Ativar o MCP na Apigee híbrida e
verifique se enableMcpServer: true está definido como uma chave de nível superior no seu
overrides.yaml e se você fez upgrade da versão do Helm apigee-operator
antes da versão apigee-org. Consulte as etapas 3 e 4 do procedimento de ativação para os comandos helm corretos.
Etapa 2: verificar se os pods do MCP estão em execução
kubectl -n APIGEE_NAMESPACE get pods -l app=apigee-mcp-server
Saída esperada (os sufixos do pod serão diferentes):
NAME READY STATUS RESTARTS AGE apigee-mcp-server-default-ORG_CR_SUFFIX-1170-abcd1234 2/2 Running 0 1h apigee-mcp-server-default-ORG_CR_SUFFIX-1170-efgh5678 2/2 Running 0 1h
Os nomes dos pods seguem o modelo
apigee-mcp-server-default-ORG_CR_SUFFIX-REV-POD_HASH,
em que REV é a revisão de lançamento híbrido de quatro dígitos (por exemplo, 1170
para o híbrido 1.17.0) e POD_HASH é um sufixo alfanumérico de oito caracteres que
é diferente para cada pod.
Cada pod precisa mostrar 2/2 na coluna READY e
Running na coluna STATUS. Se os pods não forem Running,
kubectl -n APIGEE_NAMESPACE describe pod POD_NAME vai mostrar
o motivo. As causas comuns são falhas no pull de imagens (verifique a saída do cluster para o
registro de imagens configurado em overrides.yaml) e headroom insuficiente de CPU ou
memória (aumente mcpServer.resources.requests em
overrides.yaml).
Etapa 3: verificar o status do pull da configuração do sidecar
O contêiner secundário apigee-mcp-server-config em cada pod do MCP extrai periodicamente a configuração do MCP do plano de controle da Apigee. Cada extração recupera
a referência de configuração atual de apigee.googleapis.com e
busca o pacote de configuração referenciado do Cloud Storage. O plano de dados do MCP
começa a veicular o tráfego da ferramenta do MCP em https://mcp.apigee.internal/mcp assim que um
pull é concluído com uma configuração válida.
Antes da primeira extração bem-sucedida com uma configuração válida (porque ainda não foi implantado um proxy de descoberta do MCP para sua organização ou porque o sidecar não consegue alcançar o plano de controle), os pods do MCP permanecem Ready, mas as solicitações para https://mcp.apigee.internal/mcp falham com conexão recusada.
Inspecione os registros do sidecar para determinar em qual caso você está:
kubectl -n APIGEE_NAMESPACE logs -l app=apigee-mcp-server -c apigee-mcp-server-config --tail=100
- Repetição da linha
infoindicando que não há configuração do MCP no plano de controle: O plano de controle da Apigee retornou uma resposta bem-sucedida, mas nenhum proxy de descoberta do MCP foi implantado para sua organização ainda. Esse é o estado estável esperado durante a integração. Para fazer a transição do plano de dados do MCP para o estado de serviço, implante um proxy de descoberta do MCP de acordo com o guia de início rápido do MCP.{"level":"info","ts":1787582542.68,"caller":"mcpsidecar/sidecar.go:397","msg":"mcpsidecar: no MCP config from CP yet; skipping tick, pod stays Ready via seed","org":"YOUR_ORG","mcp_server_id":"default"} - Linha
errorcom um contadorconsecutive_failures: Os registros do sidecar são JSON estruturados. Quando você vê{"level":"error","ts":1787613247.74,"caller":"mcpsidecar/sidecar.go:...","msg":"mcpsidecar: ...","org":"YOUR_ORG","mcp_server_id":"default","consecutive_failures":185,"error":"<wrapped error text>"}"level":"error"com um contadorconsecutive_failurescrescente, o sidecar não concluiu um pull de configuração. O sidecar tenta novamente de forma automática com backoff e redefine o contador para 0 no próximo pull bem-sucedido.Causas comuns a serem verificadas quando esse contador continua aumentando:
- A conta de serviço do Google Cloud
apigee-watchernão está na listawatcher_identitiesdo recursocontrolPlaneAccessda organização da Apigee. Consulte Etapa 2: conceder à identidade do observador acesso à configuração do MCP no plano de controle no procedimento de ativação para adicionar a concessão e verificar se ela foi concluída. - A saída do cluster para
apigee.googleapis.comoustorage.googleapis.comestá bloqueada. Os dois endpoints precisam estar acessíveis dos pods do MCP. Consulte Requisitos de rede de saída no procedimento de ativação. - A conta de serviço
apigee-watchernão pode receber tokens de acesso do Google Cloud desse cluster. Se os componentes da Apigee híbrida no mesmo namespace também estiverem informando falhas de autenticação, resolva primeiro o problema de autenticação compartilhada. - Um erro temporário do plano de controle da Apigee ou do Cloud Storage. Se o contador continuar aumentando por um período prolongado depois de descartar as causas acima, entre em contato com o Suporte da Apigee.
- A conta de serviço do Google Cloud
Etapa 4: verificar se os hostAliases do processador de mensagens foram injetados
Quando você ativa o MCP, o operador do Apigee injeta uma entrada hostAliases na
especificação do pod do processador de mensagens (MP). A entrada contém um IP (o ClusterIP do serviço MCP) e dois
nomes de host: mcp.apigee.internal e o ORG_NAME.mcp.apigee.internal em letras minúsculas. Verifique se a injeção foi bem-sucedida:
kubectl -n APIGEE_NAMESPACE get pods -l app=apigee-runtime \ -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.hostAliases}{"\n"}{end}'
Cada pod do MP listado precisa ter uma entrada hostAliases que contenha mcp.apigee.internal e ORG_NAME.mcp.apigee.internal em letras minúsculas apontando para o ClusterIP do serviço MCP. Qualquer pod do MP que mostre uma entrada vazia ou ausente foi criado antes da ativação do MCP. Exclua o pod do MP afetado para que o controlador ApigeeDeployment o recrie com base na especificação do pod atual (que inclui a entrada hostAliases injetada):
kubectl -n APIGEE_NAMESPACE delete pod -l app=apigee-runtime
Etapa 5: verificação de ponta a ponta
Para um teste de ponta a ponta que envia uma solicitação initialize real do MCP pelo
plano de dados do MCP, implante um proxy de descoberta do MCP e siga o
início rápido do MCP.
Antes que um proxy de descoberta do MCP seja implantado para sua organização, as solicitações para
https://mcp.apigee.internal/mcp falham com conexão recusada
independente de o processador de mensagens conseguir alcançar os pods do MCP (consulte a etapa 3).
Histórico de consultas
Se você abrir um caso de suporte que envolva o plano de dados da MCP híbrida da Apigee, anexe a seguinte saída para acelerar o diagnóstico:
kubectl -n APIGEE_NAMESPACE logs -l app=apigee-mcp-server --all-containers --tail=1000kubectl -n APIGEE_NAMESPACE describe pod -l app=apigee-mcp-serverkubectl -n APIGEE_NAMESPACE get pods -l app=apigee-mcp-server -o wideekubectl -n APIGEE_NAMESPACE get svc -l app=apigee-mcp-server.- Saída recente de
overrides.yamlehelm history APIGEE_ORG_RELEASE_NAME -n APIGEE_NAMESPACE(em queAPIGEE_ORG_RELEASE_NAMEé o nome da versão do Helm do gráficoapigee-org. Para encontrar, usehelm list -n APIGEE_NAMESPACE | grep apigee-org). Antes de compartilharoverrides.yaml, oculte material secreto, incluindo:- Todas as chaves de conta de serviço inline em
gcp.workloadIdentity,envs[].serviceAccountPathsoumcpServer.serviceAccountPath. - Todos os certificados TLS ou chaves privadas em
virtualhosts. - Os campos de senha
cassandra.auth. - Todas as credenciais inline que suas substituições transmitem ao operador.
- Todas as chaves de conta de serviço inline em
- O comando e a resposta
curlcompletos que reproduzem o problema.
Não é possível mudar o estilo da API para MCP no hub de APIs
Se um recurso de API com operações de API já estiver presente no hub de APIs da Apigee, não será possível mudar o atributo Estilo da API desse recurso para MCP. Para registrar uma API com o hub de APIs da Apigee como uma API do MCP, selecione o estilo MCP ao registrar a API pela primeira vez ou verifique se não há operações presentes no recurso de API antes de mudar o estilo para MCP.
Se você encontrar outros problemas, consulte Usar a depuração para informações detalhadas sobre como usar a ferramenta de depuração no console Google Cloud para analisar solicitações e respostas de e para seu proxy de descoberta do MCP.