使用说明
MCP Medium
MCP server para buscar e extrair artigos do Medium, com suporte a artigos members-only via cookie da sua conta paga.
Tools
- search_medium_articles — Busca artigos por palavras-chave
- filter_medium_articles_by_tags — Filtra artigos por tags
- get_trending_ai_articles — Artigos em alta sobre IA
- extract_medium_article — Extrai conteúdo completo de um artigo (full text para members-only quando autenticado)
- summarize_medium_article — Resume um artigo
Setup
-
Instale dependências:
npm install -
Copie
.env.examplepara.env.locale preencha:-
MEDIUM_COOKIE— string completa de cookies de medium.com. Abra https://medium.com logado, vá em DevTools → Application → Cookies → selecionehttps://medium.come copie todos os cookies como uma única stringnome=valor; nome=valor; .... Os essenciais sãosideuid; copiar tudo é mais seguro porque o Medium pode exigir cookies adicionais (comocf_clearancequando há challenge do Cloudflare). -
MCP_AUTH_TOKEN— token Bearer exigido emPOST /mcpquando deployado. Gere com:openssl rand -hex 32Em dev local, se a env não estiver setada, o gate fica desligado.
-
Desenvolvimento local
npm run dev
Endpoint MCP: http://localhost:3000/mcp
Com MCP_AUTH_TOKEN setado, todo POST /mcp precisa do header:
Authorization: Bearer <seu token>
Testes
npm test
Deploy no Vercel
-
Adicione
MEDIUM_COOKIEeMCP_AUTH_TOKENem Settings → Environment Variables do projeto Vercel (Production + Preview). -
Deploy:
vercel
O endpoint POST /mcp da produção exige o Bearer token. GET /mcp e /health permanecem públicos.
Conectar de um cliente MCP
Quase todos os clientes MCP aceitam headers customizados. Configure a URL https://<seu-projeto>.vercel.app/mcp com:
Authorization: Bearer <MCP_AUTH_TOKEN>
Exemplo (Cursor/Claude Desktop estilo):
{
"mcpServers": {
"medium": {
"url": "https://seu-projeto.vercel.app/mcp",
"headers": {
"Authorization": "Bearer SEU_TOKEN_AQUI"
}
}
}
}
Rotação do cookie
O cookie sid expira periodicamente e o Medium invalida tudo em "Sign out everywhere". Sinais de que precisa rotacionar:
extract_medium_articlevoltou a devolver só o preview de paywall em posts members-only- O fallback HTML está sendo acionado em URLs que antes funcionavam via JSON
Refresque pegando o cookie do browser de novo e atualizando a env var (local em .env.local, produção no Vercel Settings → Redeploy).
Como funciona a extração
extract_medium_article tenta primeiro o endpoint não-documentado ?format=json do Medium, que retorna uma estrutura JSON limpa (prefixada com ])}while(1);</x> por proteção XSSI) contendo o bodyModel.paragraphs com o post inteiro. Esse caminho exige o cookie sid válido para acessar conteúdo members-only.
Se o endpoint JSON falhar (Cloudflare challenge, Substack hospedado em domínio Medium, formato divergente), cai num parser HTML em cima do <article> da página renderizada — mesmo comportamento da versão anterior do scraper.
