Papers by Ouroboros Apps
Papers by Ouroboros Apps: Pesquisa de artigos científicos com citações reais e formatação de referências
Servidor MCP hospedado
npx add-mcp 'https://papers-mcp.vercel.app/mcp'Instala no Claude Code, Codex, Cursor e outros
Documentação
Papers by Ouroboros
Papers é um servidor MCP remoto para estudantes, pesquisadores, escritores e clínicos que desejam um assistente para pesquisar e citar artigos reais. É uma alternativa mais leve e independente ao Consensus, SciSpace e Elicit.
O assistente pode pesquisar no OpenAlex, Semantic Scholar, PubMed, Crossref e arXiv, abrir um artigo por DOI, PMID ou ID do arXiv, ver o que cita um artigo ou o que esse artigo cita, e formatar em APA, MLA, Chicago ou BibTeX. Todo resultado inclui um link de origem e um identificador que veio de uma dessas APIs. Se uma API não retornar nada, Papers não retorna nada. Ele não preenche lacunas com citações inventadas.
- Endpoint MCP:
https://<your-host>/mcp - Funciona com ChatGPT, Claude, Gemini, Grok, Cursor e qualquer cliente que fale Streamable HTTP além de OAuth 2.1 (registro dinâmico de cliente e PKCE)
server.json é o manifesto do Registro MCP (io.github.LAHutchins91/papers). Seu remotes[0].url é um espaço reservado (https://papers-mcp.vercel.app/mcp). Altere-o para a origem que você realmente implantar e defina APP_BASE_URL para essa mesma origem.
Servidor hospedado
- URL do servidor MCP:
https://papers-mcp.vercel.app/mcp(Streamable HTTP, login OAuth) - Documentação: https://ouroborosapps.com/docs/papers
- Status: acesso antecipado. Cole a URL no Claude, Cursor, Grok ou no modo de desenvolvedor do ChatGPT.
- Nome do registro:
io.github.LAHutchins91/papers
Conectar
Deixe o ID do cliente e o segredo vazios para que o cliente possa se registrar sozinho.
Cursor, em ~/.cursor/mcp.json ou em um projeto .cursor/mcp.json:
{
"mcpServers": {
"papers": {
"url": "https://<your-host>/mcp"
}
}
}
Claude Code:
claude mcp add --transport http papers https://<your-host>/mcp
Outros clientes: adicione a mesma URL e escolha OAuth. A tela de consentimento nomeia o assistente e o escopo papers. A descoberta de ferramentas (initialize, tools/list, ping) não exige token. Chamar uma ferramenta exige.
Ferramentas
search_papers— pergunta ou palavras-chave, com intervalo de anos opcional, área, sinalizador de acesso aberto e fonte (openalex,semantic_scholar,pubmed,crossref,arxivouall)get_paper— um registro e seu resumo, por DOI, PMID, ID do arXiv ou ID de trabalho do OpenAlexfind_related_papers—cited_byoureferencespara esse identificadorformat_citation—apa,mla,chicagooubibtexa partir dos metadados obtidos
Os títulos são mantidos como a fonte os escreveu. Os nomes dos autores são separados dos nomes de exibição, então partículas como "van" podem cair na parte errada e merecem uma olhada antes de você publicar a citação.
Teste e cobrança
Inicie um teste de 14 dias na página da conta depois de conectar um assistente. O Stripe Checkout é o único lugar onde um valor é exibido. Os planos mensais e anuais usam os IDs de preço que você configura. Papers não cria produtos no Stripe.
Quando STRIPE_SECRET_KEY, STRIPE_PRICE_MONTHLY e STRIPE_PRICE_YEARLY estiverem todos definidos, as chamadas de ferramenta exigem uma assinatura Stripe no status trialing ou active. Quando não estiverem definidos, GET /health reporta billingConfigured: false e um chamador assinado por OAuth pode usar as ferramentas. Defina as variáveis do Stripe antes de expor uma implantação publicamente.
Armazenamento
A pesquisa de artigos não tem estado. Snapshots de assinatura e IDs de código de autorização usados compartilham um único armazenamento:
STORAGE_BACKEND | Comportamento |
|---|---|
memory (padrão) | Local ao processo. Adequado para testes e um único processo Node. Um segundo processo ainda pode aceitar um código que este processo já usou. |
file | Um documento JSON em STORAGE_PATH (padrão data/accounts.json). Para um único host Docker. |
blob | Um Blob privado do Vercel em STORAGE_BLOB_PATH (padrão papers/accounts.json). Use isso no Vercel para que um código não possa ser reproduzido entre instâncias. Requer BLOB_READ_WRITE_TOKEN. |
O documento é { accounts, usedCodes }. Cada conta é { userId, stripeCustomerId, subscriptionId, subscriptionStatus, currentPeriodEnd, plan, updatedAt }. usedCodes mapeia um ID de código de autorização para sua expiração, em segundos unix. IDs expirados são descartados a cada gravação. Um arquivo mais antigo que seja apenas um mapa de contas ainda é lido. Não há esquema de banco de dados separado. Quando a cobrança está configurada, o Stripe é a fonte da verdade: um processo frio procura o cliente por metadata.papers_user_id se o snapshot estiver ausente.
Tokens de acesso OAuth e registros de cliente são tokens assinados, não linhas. Defina AUTH_SIGNING_SECRET em produção para que os tokens sobrevivam a uma reinicialização. No Vercel, defina STORAGE_BACKEND=blob antes que a implantação seja pública.
Ambiente
| Variável | Obrigatória | Finalidade |
|---|---|---|
APP_BASE_URL | Produção | Origem pública, sem barra final. Emissor OAuth e público MCP. |
AUTH_SIGNING_SECRET | Produção | Segredo HMAC para tokens OAuth e o cookie da conta. |
SCHOLARLY_CONTACT_EMAIL | Produção | Endereço mailto no User-Agent e parâmetros de pool educado para OpenAlex, Crossref e PubMed. |
SUPPORT_EMAIL | Não | Exibido na página de suporte. Recai para o endereço de contato acadêmico. |
NCBI_API_KEY | Não | Limite de taxa mais alto do PubMed. |
SEMANTIC_SCHOLAR_API_KEY | Não | Limite de taxa mais alto do Semantic Scholar. Enviado como x-api-key. |
STRIPE_SECRET_KEY | Para cobrar | Chave secreta do Stripe. |
STRIPE_PRICE_MONTHLY | Para cobrar | ID de preço mensal existente. |
STRIPE_PRICE_YEARLY | Para cobrar | ID de preço anual existente. |
STRIPE_WEBHOOK_SECRET | Para cobrar | Segredo de assinatura do webhook. Aponte o Stripe para POST /billing/webhook. |
STORAGE_BACKEND | Não | memory, file ou blob. |
STORAGE_PATH | Não | Arquivo JSON usado quando o backend é file. |
STORAGE_BLOB_PATH | Não | Caminho do Blob quando o backend é blob. Padrão para papers/accounts.json. |
BLOB_READ_WRITE_TOKEN | Com blob | Token de leitura e gravação para o armazenamento Blob do Vercel. O SDK lê isso por conta própria. |
PORT | Não | Padrão para 43127. |
Não faça commit de segredos. Copie o que você precisa para o ambiente do host, não para o repositório.
Executar localmente
npm install
npm run dev
Abra http://127.0.0.1:43127. A saúde é GET /health.
npm test
npm run typecheck
Os testes chamam as APIs públicas que não precisam de chaves. O Stripe não é chamado. O Semantic Scholar frequentemente responde 429 de espaço IP compartilhado; a ferramenta reporta esse limite de taxa e não substitui por um artigo inventado.
Implantar
Vercel: vercel.json compila api/index.ts e roteia cada caminho para essa função, incluindo logo.jpg no pacote da função. Arquivos do repositório como /package.json e /src/* não são servidos como arquivos estáticos. Defina as variáveis de ambiente acima, defina APP_BASE_URL para a origem da implantação, defina STORAGE_BACKEND=blob e atualize server.json remotes[0].url para https://<that-host>/mcp. Crie o armazenamento Blob no projeto Vercel e deixe seu token de leitura e gravação em BLOB_READ_WRITE_TOKEN. O endpoint do webhook do Stripe é POST /billing/webhook.
Docker:
docker build -t papers-mcp .
docker run --rm -p 43127:43127 -e APP_BASE_URL=http://127.0.0.1:43127 -e AUTH_SIGNING_SECRET=replace-me -e SCHOLARLY_CONTACT_EMAIL=you@example.com papers-mcp
O contêiner escuta em 43127.
Limites de taxa
As solicitações são espaçadas por host: OpenAlex cerca de 10/s, Crossref cerca de 4/s, PubMed cerca de 3/s sem chave NCBI, Semantic Scholar cerca de 1/s sem chave e arXiv pelo menos 3 segundos entre chamadas. Um User-Agent descritivo é sempre enviado. O e-mail de contato é incluído apenas quando SCHOLARLY_CONTACT_EMAIL está definido.
Licença
MIT. Copyright Lawrence Hutchins. Veja LICENSE.
Mais da Ouroboros: https://ouroborosapps.com