
Construindo um portfólio de 18 produtos MCP em poucas semanas
Publicação cruzada para dev.to, Hashnode, Medium. URL canônica recomendada: seu blog pessoal, se você tiver um, caso contrário, dev.to.
Sugestão de imagem de capa: uma captura de tela da página inicial do hub com os 17 cartões de produto visíveis.
TL;DR
Em algumas semanas, construí 17 servidores do Modelo de Protocolo de Contexto (MCP) voltados para o cliente, além de um serviço de análise e um hub mestre. Cada um é um Worker do Cloudflare que envolve uma fonte de dados pública gratuita em uma superfície de ferramenta que os agentes de IA podem chamar. A fonte é MIT, hospedada no nível gratuito do Cloudflare, com um nível gratuito anônimo em cada produto. Hub: https://mcp-hub.atlasword.workers.dev/
Este post é sobre a arquitetura, a economia e as partes que são mais difíceis do que parecem.
Por que um portfólio de 17 em vez de um produto polido
O conselho convencional para hackers independentes é: escolha uma fatia, aprofunde-se, torne-se o melhor naquilo. Eu fiz o oposto deliberadamente. Três razões.
1. O custo marginal de um MCP adicional é pequeno. Uma vez que você tem o template — ponto de entrada do Worker, cache KV, contador de cota, webhook do Stripe, gerador OpenAPI, smithery.yaml, server.json, wrapper npm — o único código específico do produto é o cliente da API upstream e as definições da ferramenta. Para a maioria das APIs públicas, isso é de 200 a 500 linhas de TypeScript.
2. O custo marginal de uma listagem adicional também é pequeno. Submeter ao Smithery, Glama, mcp.so, o registro oficial, listas awesome-mcp, etc., é um esforço por produto. Mas você também pode modelar o conteúdo da listagem. Assim, 17 listagens em 8 diretórios são 136 envios — mas o marginal leva dois minutos uma vez que o script está escrito.
3. Eu realmente não sei qual comprador aparecerá primeiro. Um portfólio é uma proteção contra estar errado sobre o comprador. Se o SEC EDGAR não decolar, mas o validador GST sim, tudo bem — eu sigo o sinal. Construir uma fatia teria me trancado em um palpite sobre o comprador.
Essa é a tese. Se está certa, é testável, não discutível.
A arquitetura
Cada produto é um único Worker do Cloudflare. O diagrama é:
Claude / Cursor / Cline / qualquer agente compatível com MCP
|
| MCP-over-HTTP (JSON-RPC 2.0, POST /mcp)
v
Worker do Cloudflare
/ \
/ \
KV: uso KV: cache
(contador de cota) (respostas da API upstream)
\ /
\ /
v v
API pública upstream
(SEC EDGAR, openFDA, GDELT, ...)
Por worker:
-
src/index.ts— servidor MCP, rotas/mcp,/openapi.json,/llms.txt,/upgrade -
src/client.ts— cliente da API upstream com tentativas -
src/tools.ts— definições de ferramentas MCP (a parte que leva mais tempo) -
src/usage.ts— contador de cota baseado em KV (compartilhado entre todos os 17, copiado e colado) -
src/stripe.ts— manipulador de webhook do Stripe (compartilhado entre todos os 17, copiado e colado)
Total ~500-1500 LOC TypeScript por produto. O código compartilhado é de aproximadamente 300 LOC em todos os produtos.
O transporte MCP-over-HTTP
Muitos servidores MCP no mundo são pacotes npm apenas para stdio. Isso funciona, mas é complicado — cada servidor que você adiciona ao Claude Desktop gera um processo filho na inicialização, cada solicitação requer serialização JSON através de um pipe, e é difícil para clientes não desktop usá-los.
MCP-over-HTTP é apenas JSON-RPC 2.0 sobre POST. O endpoint aceita:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "edgar_search_filings",
"arguments": { "cik": "0000320193", "form": "10-K", "limit": 3 }
}
}
E retorna:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{ "type": "text", "text": "Encontrados 3 arquivos 10-K para AAPL: ..." }
]
}
}
Você pode curl isso. Você pode chamá-lo de qualquer cliente HTTP. O suporte HTTP MCP do Claude Desktop é recente; Cursor, Cline e a maioria dos agentes mais novos falam isso nativamente. Para fallback de desktop, envio um wrapper npm (@insnapsprakhar/<slug>-mcp) que conecta stdio → HTTP.
Medição de cota no KV
O Workers KV é eventualmente consistente, o que soa assustador para um contador, mas é bom na prática. Tolerância a picos > correção estrita.
async function incrementUsage(env: Env, key: string): Promise<number> {
const usage = await env.KV.get(key) || 0;
await env.KV.put(key, usage + 1);
return usage + 1;
}
A criação de múltiplos servidores MCP pode oferecer às empresas brasileiras uma maneira eficiente de integrar dados públicos em suas aplicações. Isso pode aumentar a agilidade na resposta às demandas do mercado e melhorar a interação com agentes de IA. A abordagem modular permite adaptação rápida às necessidades dos usuários.

