Criar um conector MCP remoto
Constrói um servidor MCP Streamable-HTTP stateless (TypeScript, @modelcontextprotocol/sdk) que funciona como um conector personalizado do claude.ai, opcionalmente com cartões visuais inline (MCP Apps), e o implanta na Vercel. Comprovado em um projeto real com mais de 30 ferramentas.
Os templates estão em templates/ ao lado deste arquivo. Notas mais detalhadas estão em references/; leia-as apenas quando a etapa precisar:
references/mcp-apps-cards.md— cartões inline: recursoui://, protocolo postMessage, CSP, listas clicáveisreferences/deploy-vercel.md— configuração da Vercel, implantação, readição do conector no claude.aireferences/gotchas.md— armadilhas que custam tempo real (leia antes de depurar)
Fluxo de Trabalho
- Esclareça (pergunte apenas o que não puder inferir): quais dados/API, somente leitura ou gravação, precisa de autenticação ou não, quer cartões ou apenas texto. Padrão: dados públicos, somente leitura, sem autenticação, texto + cartões.
- Teste cada API upstream antes de escrever código. Use
curlem cada endpoint: status, formato da resposta, formatos de data, limites de taxa, timeouts, redirecionamentos (um301significa que a URL mudou, por exemplo,api.frankfurter.dev, não.app). Endpoints públicos SPARQL/busca podem ser lentos: meça o tempo, mantenha as consultas simples, filtre no código. - Gere o esqueleto a partir de
templates/(copiepackage.json,tsconfig.json,vercel.json,api/,src/,scripts/), renomeiemy-connector, executenpm install. - Escreva as ferramentas em
src/server.ts(umregisterToolpara cada uma). Regras abaixo. - Adicione cada ferramenta a
scripts/test-client.ts. O executor falha em ferramentas não testadas, saída vazia eisError. - Verifique localmente:
npm run typecheck, iniciePORT=<porta nova> npm run dev, confirme que o log mostra "listening" (nãoEADDRINUSE), depoisnpm test -- http://localhost:<porta>/mcp. Objetivo:Untested tools: none. Problems: 0. - Documente: tabela de ferramentas no README (uma linha por ferramenta), CONTRIBUTING, LICENSE.
- Faça commit, push e implante apenas com a autorização do usuário (consulte
references/deploy-vercel.md), depois execute o teste contra a URL ativa. - Diga ao usuário para remover e readicionar o conector no claude.ai (ele armazena em cache a lista de ferramentas) e forneça de 3 a 5 prompts de teste curtos.
Regras de design de ferramentas
- Poucas ferramentas, que realmente funcionem. Nomes são verbos em
snake_case:search_x,get_x,list_x. - Esquema Zod com limites em cada entrada (
min/max,default); descreva cada campo com um exemplo. - A descrição diz o que ela retorna e quando usá-la, em uma ou duas frases. O modelo a lê para escolher a ferramenta.
- Anotações:
readOnlyHint: true, idempotentHint: true, destructiveHint: false, maisopenWorldHint: truepara APIs externas. - Envolva cada manipulador em
safe(...): falhas upstream tornam-se resultadosisErrorcom uma mensagem legível, nunca uma falha. - Nomeie a fonte de dados em cada resultado. Informe quando os dados são editados pela comunidade ou provisórios.
- Nunca falhe em campos ausentes; recorra a "desconhecido".
- Tolerância a erros de digitação: em caso de nenhuma correspondência, retorne sugestões "você quis dizer" em vez de um resultado vazio.
- Armazene em cache chamadas upstream (o template
getJson/getTextpossui TTL, deduplicação em andamento, cache curto para falhas, timeout). Use TTLs curtos (minutos) para dados ativos, horas para dados estáticos. Seja gentil com APIs gratuitas. - Retorne tanto texto (para o modelo) quanto
structuredContent(para o cartão) por meio de um auxiliar comocard(texto, dados). - Sem segredos no repositório. Se uma chave for necessária, leia-a de
process.enve documente-a. - Filtre trabalho pesado no código, não na consulta upstream, quando o upstream for lento.
Servidor Stateless (amigável à Vercel)
Um novo McpServer e transporte são criados por requisição (src/handler.ts); sem sessões, sem memória entre requisições. O único estado é o cache em memória, que é de melhor esforço. CORS e um limite de tamanho de corpo estão no manipulador. api/mcp.ts exporta { fetch } e maxDuration: 30; vercel.json reescreve /mcp para /api/mcp.
Cartões (MCP Apps), versão resumida
Registre um recurso HTML ui://… (mimeType: text/html;profile=mcp-app), então dê a cada ferramenta _meta: { ui: { resourceUri }, "ui/resourceUri": resourceUri } e retorne structuredContent com um campo kind. O HTML é um único arquivo autocontido que renderiza por kind. Consulte references/mcp-apps-cards.md e templates/src/view.ts.
Saída para o usuário
Seja conciso. Relate: o que foi construído (lista de ferramentas), resultado do teste, URL e as etapas exatas para atualizar o conector. Declare as ressalvas honestamente (caminhos de UI não verificados, upstreams lentos, dados da comunidade).