OpenAlex Author Disambiguation
Desambigua autores e resolve instituições usando a API do OpenAlex.org.
Documentação
Um servidor otimizado de Model Context Protocol (MCP) para desambiguação de autores e pesquisa acadêmica usando a API OpenAlex.org. Projetado especificamente para agentes de IA com estruturas de dados otimizadas e funcionalidades aprimoradas.
🎯 Principais Recursos
🔍 Capacidades Principais
- Desambiguação Avançada de Autores: Lida com transições complexas de carreira e variações de nomes
- Resolução de Instituições: Afiliações atuais e passadas com rastreamento de transições
- Recuperação de Trabalhos Acadêmicos: Artigos de periódicos, cartas e trabalhos de pesquisa
- Análise de Citações: Índice H, contagem de citações e métricas de impacto
- Integração ORCID: Correspondência de maior precisão com identificadores ORCID
🚀 Otimizado para Agentes de IA
- Dados Simplificados: Focado em informações essenciais para desambiguação
- Processamento Rápido: Estruturas de dados otimizadas para análise rápida
- Filtragem Inteligente: Opções de filtragem aprimoradas para consultas direcionadas
- Saída Limpa: Respostas estruturadas otimizadas para raciocínio de IA
🤖 Integração com Agentes
- Múltiplos Candidatos: Resultados classificados para tomada de decisão automatizada
- Respostas Estruturadas: Saída limpa e analisável otimizada para LLMs
- Tratamento de Erros: Degradação graciosa com mensagens informativas
- Filtragem Aprimorada: Somente periódicos, limites de citações e filtros temporais
🏛️ Nível Profissional
- Melhores Práticas MCP: Construído com FastMCP seguindo diretrizes oficiais
- Anotações de Ferramentas: Anotações MCP adequadas para integração ideal com clientes
- Gerenciamento de Recursos: Gerenciamento e limpeza eficientes do cliente HTTP
- Limitação de Taxa: Uso respeitoso da API com atrasos adequados
🚀 Início Rápido
Pré-requisitos
- Python 3.10 ou superior
- Cliente compatível com MCP (ex.: Claude Desktop)
- Endereço de e-mail (para cortesia da API OpenAlex)
Instalação
Para instruções detalhadas de instalação, consulte INSTALL.md.
-
Clone o repositório:
git clone https://github.com/drAbreu/alex-mcp.git cd alex-mcp -
Crie um ambiente virtual:
python3 -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate -
Instale o pacote:
pip install -e . -
Configure o ambiente:
export OPENALEX_MAILTO=your-email@domain.com -
Execute o servidor:
./run_alex_mcp.sh # Or, if installed as a CLI tool: alex-mcp
⚙️ Configuração MCP
Configuração do Claude Desktop
Adicione ao seu arquivo de configuração do Claude Desktop:
{
"mcpServers": {
"alex-mcp": {
"command": "/path/to/alex-mcp/run_alex_mcp.sh",
"env": {
"OPENALEX_MAILTO": "your-email@domain.com"
}
}
}
}
Substitua /path/to/alex-mcp pelo caminho real do repositório no seu sistema.
🤖 Uso com Agentes de IA
Integração com OpenAI Agents
Você pode carregar este servidor MCP no seu fluxo de trabalho de agente OpenAI usando a interface agents.mcp.MCPServerStdio:
from agents.mcp import MCPServerStdio
async with MCPServerStdio(
name="OpenAlex MCP For Author disambiguation and works",
cache_tools_list=True,
params={
"command": "uvx",
"args": [
"--from", "git+https://github.com/drAbreu/alex-mcp.git@4.1.0",
"alex-mcp"
],
"env": {
"OPENALEX_MAILTO": "your-email@domain.com"
}
},
client_session_timeout_seconds=10
) as alex_mcp:
await alex_mcp.connect()
tools = await alex_mcp.list_tools()
print(f"Available tools: {[tool.name for tool in tools]}")
Integração com Agente de Pesquisa Acadêmica
Este servidor MCP é especificamente otimizado para fluxos de trabalho de pesquisa acadêmica:
# Optimized for academic research workflows
from alex_agent import run_author_research
# Enhanced functionality with streamlined data
result = await run_author_research(
"Find J. Abreu at EMBO with recent publications"
)
# Clean, structured output for AI processing
print(f"Success: {result['workflow_metadata']['success']}")
print(f"Quality: {result['research_result']['metadata']['result_analysis']['quality_score']}/100")
Inicialização Direta com uvx
# Standard launch
uvx --from git+https://github.com/drAbreu/alex-mcp.git@4.1.0 alex-mcp
# With environment variables
OPENALEX_MAILTO=your-email@domain.com uvx --from git+https://github.com/drAbreu/alex-mcp.git@4.1.0 alex-mcp
🛠️ Ferramentas Disponíveis
1. autocomplete_authors ⭐ NOVO
Obtenha múltiplos candidatos a autor usando a API de autocomplete do OpenAlex para desambiguação inteligente.
Parâmetros:
name(obrigatório): Nome do autor para pesquisa (ex.: "James Briscoe", "M. Ralser")context(opcional): Contexto para desambiguação (ex.: "Francis Crick Institute biologia do desenvolvimento")limit(opcional): Máximo de candidatos (1-10, padrão: 5)
Principais Recursos:
- ⚡ Rápido: Tempo de resposta de ~200ms
- 🎯 Inteligente: Múltiplos candidatos com dicas institucionais
- 🧠 Pronto para IA: Perfeito para seleção baseada em contexto
- 📊 Rico: Contagem de trabalhos, citações, informações da instituição
Saída Simplificada:
{
"query": "James Briscoe",
"context": "Francis Crick Institute",
"total_candidates": 3,
"candidates": [
{
"openalex_id": "https://openalex.org/A5019391436",
"display_name": "James Briscoe",
"institution_hint": "The Francis Crick Institute, UK",
"works_count": 415,
"cited_by_count": 24623,
"external_id": "https://orcid.org/0000-0002-1020-5240"
}
]
}
Padrão de Uso:
# Get multiple candidates for disambiguation
candidates = await autocomplete_authors(
"James Briscoe",
context="Francis Crick Institute developmental biology"
)
# AI selects best match based on institutional context
# Much more accurate than single search result!
2. search_authors
Pesquise autores com saída simplificada para agentes de IA.
Parâmetros:
name(obrigatório): Nome do autor para pesquisainstitution(opcional): Filtro por nome da instituiçãotopic(opcional): Filtro por tópico de pesquisacountry_code(opcional): Filtro por código do país (ex.: "US", "DE")limit(opcional): Máximo de resultados (1-25, padrão: 20)
Saída Simplificada:
{
"query": "J. Abreu",
"total_count": 3,
"results": [
{
"id": "https://openalex.org/A123456789",
"display_name": "Jorge Abreu-Vicente",
"orcid": "https://orcid.org/0000-0000-0000-0000",
"display_name_alternatives": ["J. Abreu-Vicente", "Jorge Abreu Vicente"],
"affiliations": [
{
"institution": {
"display_name": "European Molecular Biology Organization",
"country_code": "DE"
},
"years": [2023, 2024, 2025]
}
],
"cited_by_count": 316,
"works_count": 25,
"summary_stats": {
"h_index": 9,
"i10_index": 5
},
"x_concepts": [
{
"display_name": "Astrophysics",
"score": 0.8
},
{
"display_name": "Machine Learning",
"score": 0.6
}
]
}
]
}
Recursos: Estrutura limpa otimizada para raciocínio de IA e desambiguação
2. retrieve_author_works
Recupere trabalhos de um autor específico com capacidades de filtragem aprimoradas.
Parâmetros:
author_id(obrigatório): ID do autor no OpenAlexlimit(opcional): Máximo de resultados (1-50, padrão: 20)order_by(opcional): "date" ou "citations" (padrão: "date")publication_year(opcional): Filtrar por ano específicotype(opcional): Filtro por tipo de trabalho (ex.: "journal-article")authorships_institutions_id(opcional): Filtrar por instituiçãois_retracted(opcional): Filtrar trabalhos retratadosopen_access_is_oa(opcional): Filtrar por status de acesso aberto
Saída Aprimorada:
{
"author_id": "https://openalex.org/A123456789",
"total_count": 25,
"results": [
{
"id": "https://openalex.org/W123456789",
"title": "A platform for the biomedical application of large language models",
"doi": "10.1038/s41587-024-02534-3",
"publication_year": 2025,
"type": "journal-article",
"cited_by_count": 42,
"authorships": [
{
"author": {
"display_name": "Jorge Abreu-Vicente"
},
"institutions": [
{
"display_name": "European Molecular Biology Organization"
}
]
}
],
"locations": [
{
"source": {
"display_name": "Nature Biotechnology",
"type": "journal"
}
}
],
"open_access": {
"is_oa": true
},
"primary_topic": {
"display_name": "Biomedical Engineering"
}
}
]
}
Recursos: Dados abrangentes de trabalhos com filtragem flexível para consultas direcionadas
📊 Otimização de Dados
Arquitetura de Informação Focada
Este servidor MCP fornece dados focados e estruturados, projetados especificamente para consumo por agentes de IA:
Recursos de Dados do Autor
- Resolução de Identidade: Nomes, ORCID, alternativas para desambiguação
- Rastreamento de Afiliações: Conexões institucionais atuais e históricas
- Métricas de Impacto: Contagem de citações, índice h e impacto acadêmico
- Contexto de Pesquisa: Campos, conceitos e expertise de domínio
- Análise de Carreira: Mudanças e transições temporais de afiliação
Recursos de Dados de Trabalhos
- Metadados de Publicação: Título, DOI, veículo e detalhes da publicação
- Avaliação de Impacto: Contagem de citações e influência acadêmica
- Informações de Acesso: Status de acesso aberto e disponibilidade
- Detalhes de Autoria: Listas completas de autores e afiliações institucionais
- Classificação de Pesquisa: Tópicos, conceitos e categorização de domínio
Filtragem Aprimorada
# Target high-impact journal articles
works = await retrieve_author_works(
author_id="https://openalex.org/A123456789",
type="journal-article", # Focus on journal publications
open_access_is_oa=True, # Open access only
order_by="citations", # Most cited first
limit=15
)
# Career transition analysis
authors = await search_authors(
name="J. Abreu",
institution="EMBO", # Current institution
topic="Machine Learning", # Research focus
limit=10
)
🧪 Exemplo de Uso
Desambiguação de Autores
from alex_mcp.server import search_authors_core
# Comprehensive author search
results = search_authors_core(
name="J Abreu Vicente",
institution="EMBO",
topic="Machine Learning",
limit=20
)
print(f"Found {results.total_count} candidates")
for author in results.results:
print(f"- {author.display_name}")
if author.affiliations:
current_inst = author.affiliations[0].institution.display_name
print(f" Institution: {current_inst}")
print(f" Metrics: {author.cited_by_count} citations, h-index {author.summary_stats.h_index}")
if author.x_concepts:
fields = [c.display_name for c in author.x_concepts[:3]]
print(f" Research: {', '.join(fields)}")
Análise de Trabalhos Acadêmicos
from alex_mcp.server import retrieve_author_works_core
# Comprehensive work retrieval
works = retrieve_author_works_core(
author_id="https://openalex.org/A5058921480",
type="journal-article", # Academic focus
order_by="citations", # Impact-based ordering
limit=20
)
print(f"Found {works.total_count} publications")
for work in works.results:
print(f"- {work.title}")
if work.locations:
journal = work.locations[0].source.display_name
print(f" Published in: {journal} ({work.publication_year})")
print(f" Impact: {work.cited_by_count} citations")
if work.open_access and work.open_access.is_oa:
print(" ✓ Open Access")
Análise de Instituições e Campos
# Analyze career transitions
def analyze_career_path(author_result):
affiliations = author_result.affiliations
if len(affiliations) > 1:
print("Career path:")
for aff in sorted(affiliations, key=lambda x: min(x.years)):
years = f"{min(aff.years)}-{max(aff.years)}"
print(f" {years}: {aff.institution.display_name}")
# Research evolution
if author_result.x_concepts:
print("Research areas:")
for concept in author_result.x_concepts[:5]:
print(f" {concept.display_name} (score: {concept.score:.2f})")
# Usage
results = search_authors_core("Jorge Abreu Vicente")
if results.results:
analyze_career_path(results.results[0])
🔧 Opções de Configuração
Variáveis de Ambiente
# Required
export OPENALEX_MAILTO=your-email@domain.com
# Optional settings
export OPENALEX_MAX_AUTHORS=100 # Maximum authors per query
export OPENALEX_USER_AGENT=research-agent-v1.0
export ALEX_MCP_VERSION=4.1.0
# Rate limiting (respectful usage)
export OPENALEX_RATE_PER_SEC=10
export OPENALEX_RATE_PER_DAY=100000
Ajuste de Desempenho
# For comprehensive research applications
config = {
"max_authors_per_query": 25, # Detailed author analysis
"max_works_per_author": 50, # Complete publication history
"enable_all_filters": True, # Full filtering capabilities
"detailed_affiliations": True, # Complete institutional data
"research_concepts": True # Detailed concept analysis
}
🧑💻 Desenvolvimento e Testes
Estrutura do Projeto
alex-mcp/
├── src/alex_mcp/
│ ├── server.py # Main MCP server
│ ├── data_objects.py # Data models and structures
│ └── utils.py # Utility functions
├── examples/
│ ├── basic_usage.py # Simple examples
│ ├── advanced_queries.py # Complex query examples
│ └── integration_demo.py # AI agent integration
├── tests/
│ ├── test_server.py # Server functionality tests
│ └── test_integration.py # Integration tests
└── docs/
└── api_reference.md # Detailed API documentation
Executando Testes
# Install test dependencies
pip install -e ".[test]"
# Run functionality tests
pytest tests/test_server.py -v
# Test with real queries
python examples/basic_usage.py
# Test AI agent integration
python examples/integration_demo.py
Exemplos de Desenvolvimento
# Test author disambiguation
python examples/basic_usage.py --query "J. Abreu" --institution "EMBO"
# Test work retrieval
python examples/advanced_queries.py --author-id "A123456789" --type "journal-article"
# Test integration patterns
python examples/integration_demo.py --workflow "career-analysis"
📈 Exemplos de Integração
Fluxos de Trabalho de Pesquisa Acadêmica
Integração perfeita com análise de pesquisa alimentada por IA:
# Enhanced academic research agent
from alex_agent import AcademicResearchAgent
agent = AcademicResearchAgent(
mcp_servers=[alex_mcp], # Streamlined data processing
model="gpt-4.1-2025-04-14"
)
# Complex research queries with structured data
result = await agent.research_author(
"Find J. Abreu at EMBO with machine learning publications"
)
# Rich, structured output for AI reasoning
print(f"Quality Score: {result.quality_score}/100")
print(f"Author disambiguation: {result.confidence}")
print(f"Research fields: {result.research_domains}")
Sistemas Multi-Agente
# Collaborative research analysis
async def research_collaboration_network(seed_author):
# Find primary author
authors = await alex_mcp.search_authors(seed_author)
primary = authors['results'][0]
# Get their works
works = await alex_mcp.retrieve_author_works(
primary['id'],
type="journal-article"
)
# Analyze co-authors and build network
collaborators = set()
for work in works['results']:
for authorship in work.get('authorships', []):
collaborators.add(authorship['author']['display_name'])
return {
'primary_author': primary,
'publication_count': len(works['results']),
'collaborator_network': list(collaborators),
'research_impact': sum(w['cited_by_count'] for w in works['results'])
}
🤝 Contribuições
Aceitamos contribuições para melhorar a funcionalidade e adicionar novos recursos:
- Faça um fork do repositório
- Crie um branch de recurso:
git checkout -b feature/enhanced-filtering - Adicione testes: Garanta que suas alterações mantenham a qualidade e estrutura dos dados
- Envie um pull request: Inclua exemplos e documentação
Prioridades de Desenvolvimento
- Capacidades de filtragem aprimoradas
- Enriquecimento adicional de dados
- Otimizações de desempenho
- Exemplos de integração
- Melhorias na documentação
📄 Licença
Este projeto é licenciado sob a Licença MIT. Consulte LICENSE para detalhes.