OpenAlex Author Disambiguation

Desambigua autores e resolve instituições usando a API do OpenAlex.org.

Documentação

OpenAlex MCP Server

Servidor MCP de Desambiguação de Autores OpenAlex

MCP Python OpenAlex License Optimized

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.

  1. Clone o repositório:

    git clone https://github.com/drAbreu/alex-mcp.git
    cd alex-mcp
    
  2. Crie um ambiente virtual:

    python3 -m venv venv
    source venv/bin/activate  # On Windows: venv\Scripts\activate
    
  3. Instale o pacote:

    pip install -e .
    
  4. Configure o ambiente:

    export OPENALEX_MAILTO=your-email@domain.com
    
  5. 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 pesquisa
  • institution (opcional): Filtro por nome da instituição
  • topic (opcional): Filtro por tópico de pesquisa
  • country_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 OpenAlex
  • limit (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ífico
  • type (opcional): Filtro por tipo de trabalho (ex.: "journal-article")
  • authorships_institutions_id (opcional): Filtrar por instituição
  • is_retracted (opcional): Filtrar trabalhos retratados
  • open_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:

  1. Faça um fork do repositório
  2. Crie um branch de recurso: git checkout -b feature/enhanced-filtering
  3. Adicione testes: Garanta que suas alterações mantenham a qualidade e estrutura dos dados
  4. 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.


🌐 Links