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, arxiv ou all)
  • get_paper — um registro e seu resumo, por DOI, PMID, ID do arXiv ou ID de trabalho do OpenAlex
  • find_related_papers — cited_by ou references para esse identificador
  • format_citation — apa, mla, chicago ou bibtex a 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_BACKENDComportamento
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.
fileUm documento JSON em STORAGE_PATH (padrão data/accounts.json). Para um único host Docker.
blobUm 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ávelObrigatóriaFinalidade
APP_BASE_URLProduçãoOrigem pública, sem barra final. Emissor OAuth e público MCP.
AUTH_SIGNING_SECRETProduçãoSegredo HMAC para tokens OAuth e o cookie da conta.
SCHOLARLY_CONTACT_EMAILProduçãoEndereço mailto no User-Agent e parâmetros de pool educado para OpenAlex, Crossref e PubMed.
SUPPORT_EMAILNãoExibido na página de suporte. Recai para o endereço de contato acadêmico.
NCBI_API_KEYNãoLimite de taxa mais alto do PubMed.
SEMANTIC_SCHOLAR_API_KEYNãoLimite de taxa mais alto do Semantic Scholar. Enviado como x-api-key.
STRIPE_SECRET_KEYPara cobrarChave secreta do Stripe.
STRIPE_PRICE_MONTHLYPara cobrarID de preço mensal existente.
STRIPE_PRICE_YEARLYPara cobrarID de preço anual existente.
STRIPE_WEBHOOK_SECRETPara cobrarSegredo de assinatura do webhook. Aponte o Stripe para POST /billing/webhook.
STORAGE_BACKENDNãomemory, file ou blob.
STORAGE_PATHNãoArquivo JSON usado quando o backend é file.
STORAGE_BLOB_PATHNãoCaminho do Blob quando o backend é blob. Padrão para papers/accounts.json.
BLOB_READ_WRITE_TOKENCom blobToken de leitura e gravação para o armazenamento Blob do Vercel. O SDK lê isso por conta própria.
PORTNãoPadrã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