OpenAlex Author Disambiguation MCP Server
Retrieves and provides Digital Object Identifiers (DOIs) for research papers, journal articles, and other academic works to ensure unique identification and linking.
Enables filtering and identification of scholarly works based on their open access status, supporting the discovery of freely available research.
Utilizes ORCID identifiers for high-accuracy author disambiguation and profile matching, allowing for precise identification of academic researchers.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@OpenAlex Author Disambiguation MCP Server Find J. Abreu at EMBO and show their recent papers with citation counts."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
OpenAlex Author Disambiguation MCP Server
A streamlined Model Context Protocol (MCP) server for author disambiguation and academic research using the OpenAlex.org API. Specifically designed for AI agents with optimized data structures and enhanced functionality.
๐ฏ Key Features
๐ Core Capabilities
Advanced Author Disambiguation: Handles complex career transitions and name variations
Institution Resolution: Current and past affiliations with transition tracking
Academic Work Retrieval: Journal articles, letters, and research papers
Citation Analysis: H-index, citation counts, and impact metrics
ORCID Integration: Highest accuracy matching with ORCID identifiers
๐ AI Agent Optimized
Streamlined Data: Focused on essential information for disambiguation
Fast Processing: Optimized data structures for rapid analysis
Smart Filtering: Enhanced filtering options for targeted queries
Clean Output: Structured responses optimized for AI reasoning
๐ค Agent Integration
Multiple Candidates: Ranked results for automated decision-making
Structured Responses: Clean, parseable output optimized for LLMs
Error Handling: Graceful degradation with informative messages
Enhanced Filtering: Journal-only, citation thresholds, and temporal filters
๐๏ธ Professional Grade
MCP Best Practices: Built with FastMCP following official guidelines
Tool Annotations: Proper MCP tool annotations for optimal client integration
Resource Management: Efficient HTTP client management and cleanup
Rate Limiting: Respectful API usage with proper delays
Related MCP server: OpenAlex MCP Server
๐ Quick Start
Prerequisites
Python 3.10 or higher
MCP-compatible client (e.g., Claude Desktop)
Email address (for OpenAlex API courtesy)
Installation
For detailed installation instructions, see INSTALL.md.
Clone the repository:
git clone https://github.com/drAbreu/alex-mcp.git cd alex-mcpCreate a virtual environment:
python3 -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activateInstall the package:
pip install -e .Configure environment:
export OPENALEX_MAILTO=your-email@domain.comRun the server:
./run_alex_mcp.sh # Or, if installed as a CLI tool: alex-mcp
โ๏ธ MCP Configuration
Claude Desktop Configuration
Add to your Claude Desktop configuration file:
{
"mcpServers": {
"alex-mcp": {
"command": "/path/to/alex-mcp/run_alex_mcp.sh",
"env": {
"OPENALEX_MAILTO": "your-email@domain.com"
}
}
}
}Replace /path/to/alex-mcp with the actual path to the repository on your system.
๐ค Using with AI Agents
OpenAI Agents Integration
You can load this MCP server in your OpenAI agent workflow using the agents.mcp.MCPServerStdio interface:
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]}")Academic Research Agent Integration
This MCP server is specifically optimized for academic research workflows:
# 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")Direct Launch with 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๐ ๏ธ Available Tools
1. autocomplete_authors โญ NEW
Get multiple author candidates using OpenAlex autocomplete API for intelligent disambiguation.
Parameters:
name(required): Author name to search (e.g., "James Briscoe", "M. Ralser")context(optional): Context for disambiguation (e.g., "Francis Crick Institute developmental biology")limit(optional): Maximum candidates (1-10, default: 5)
Key Features:
โก Fast: ~200ms response time
๐ฏ Smart: Multiple candidates with institutional hints
๐ง AI-Ready: Perfect for context-based selection
๐ Rich: Works count, citations, institution info
Streamlined Output:
{
"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"
}
]
}Usage Pattern:
# 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
Search for authors with streamlined output for AI agents.
Parameters:
name(required): Author name to searchinstitution(optional): Institution name filtertopic(optional): Research topic filtercountry_code(optional): Country code filter (e.g., "US", "DE")limit(optional): Maximum results (1-25, default: 20)
Streamlined Output:
{
"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
}
]
}
]
}Features: Clean structure optimized for AI reasoning and disambiguation
2. retrieve_author_works
Retrieve works for a given author with enhanced filtering capabilities.
Parameters:
author_id(required): OpenAlex author IDlimit(optional): Maximum results (1-50, default: 20)order_by(optional): "date" or "citations" (default: "date")publication_year(optional): Filter by specific yeartype(optional): Work type filter (e.g., "journal-article")authorships_institutions_id(optional): Filter by institutionis_retracted(optional): Filter retracted worksopen_access_is_oa(optional): Filter by open access status
Enhanced Output:
{
"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"
}
}
]
}Features: Comprehensive work data with flexible filtering for targeted queries
๐ Data Optimization
Focused Information Architecture
This MCP server provides focused, structured data specifically designed for AI agent consumption:
Author Data Features
Identity Resolution: Names, ORCID, alternatives for disambiguation
Affiliation Tracking: Current and historical institutional connections
Impact Metrics: Citation counts, h-index, and scholarly impact
Research Context: Fields, concepts, and domain expertise
Career Analysis: Temporal affiliation changes and transitions
Work Data Features
Publication Metadata: Title, DOI, venue, and publication details
Impact Assessment: Citation counts and scholarly influence
Access Information: Open access status and availability
Authorship Details: Complete author lists and institutional affiliations
Research Classification: Topics, concepts, and domain categorization
Enhanced Filtering
# 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
)๐งช Example Usage
Author Disambiguation
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)}")Academic Work Analysis
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")Institution and Field Analysis
# 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])๐ง Configuration Options
Environment Variables
# 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=100000Performance Tuning
# 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
}๐งโ๐ป Development & Testing
Project Structure
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 documentationRunning Tests
# 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.pyDevelopment Examples
# 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"๐ Integration Examples
Academic Research Workflows
Perfect integration with AI-powered research analysis:
# 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}")Multi-Agent Systems
# 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'])
}๐ค Contributing
We welcome contributions to improve functionality and add new features:
Fork the repository
Create a feature branch:
git checkout -b feature/enhanced-filteringAdd tests: Ensure your changes maintain data quality and structure
Submit a pull request: Include examples and documentation
Development Priorities
Enhanced filtering capabilities
Additional data enrichment
Performance optimizations
Integration examples
Documentation improvements
๐ License
This project is licensed under the MIT License. See LICENSE for details.
๐ Links
Available Tools
8 toolsautocomplete_authorsAutocomplete Authors (Smart Disambiguation)ARead-only
Enhanced autocomplete authors with intelligent filtering and ranking.
Args: name: Author name to search for (e.g., "James Briscoe", "M. Ralser") context: Optional context to help with disambiguation (e.g., "Francis Crick Institute developmental biology", "Max Planck Institute Kรถln Germany") limit: Maximum number of candidates to return (default: 10, max: 15) filter_no_institution: If True, exclude candidates with no institutional affiliation (default: True) enable_institution_ranking: If True, rank candidates by institutional context relevance (default: True)
Returns: dict: Serialized AutocompleteAuthorsResponse with filtered and ranked candidate authors, including: - openalex_id: Full OpenAlex author ID - display_name: Author's display name - institution_hint: Current/last known institution - works_count: Number of published works - cited_by_count: Total citation count - external_id: ORCID or other external identifiers - search_metadata: Information about filtering and ranking applied
Example usage: # Get high-quality candidates with institutional filtering candidates = await autocomplete_authors("Ivan Matiฤ", context="Max Planck Institute Biology Ageing Kรถln Germany")
# For seasoned researchers, institution hints and ranking help disambiguation
# AI can then select the best match or retrieve works for further verificationEnhanced Features: - Filters out candidates with no institutional affiliation (reduces noise) - Institution-aware ranking when context is provided (improves accuracy) - Higher default limit (10 vs 5) for better candidate coverage - Detailed logging for debugging and optimization
Inputs: name (required), context, limit, filter_no_institution, +1 more. Returns: object
get_orcid_publicationsGet ORCID WorksARead-only
Get publications/works from an ORCID profile.
Args: orcid_id: ORCID identifier (e.g., "0000-0000-0000-0000" or full URL) max_works: Maximum number of works to retrieve (default: 20, max: 100)
Returns: dict: Publications data with: - orcid_id: Cleaned ORCID identifier - total_works: Number of works found - works: List of publications with titles, journals, DOIs, PMIDs
Example usage: # Get works for specific ORCID get_orcid_publications("0000-0000-0000-0000")
# Get limited number of works
get_orcid_publications("0000-0000-0000-0000", max_works=10)Inputs: orcid_id (required), max_works. Returns: object
pubmed_author_samplePubMed Author SampleARead-only
Get detailed author sample from PubMed with institutional information.
Args: author_name: Author name to search for (e.g., "Ivan Matic", "J Smith") sample_size: Number of recent works to analyze in detail (default: 5, max: 10)
Returns: dict: Author analysis including: - total_works: Total number of works found in PubMed - sample_works: Detailed information for sample works - institutional_keywords: Common institutional terms found - name_variants: Different name formats found - email_addresses: Email addresses extracted from affiliations
Example usage: # Get institutional profile for author pubmed_author_sample("Ivan Matic", sample_size=5)
Inputs: author_name (required), sample_size. Returns: object
retrieve_author_worksRetrieve Author Works (Peer-Reviewed Only)ARead-only
Enhanced MCP tool wrapper for retrieving author works with flexible filtering.
Args: author_id: OpenAlex Author ID (e.g., 'https://openalex.org/A123456789') limit: Maximum number of results (default: None = ALL works via pagination, max: 2000) order_by: Sort order - "date" for newest first, "citations" for most cited first publication_year: Filter by specific publication year type: Filter by work type (e.g., "journal-article", "letter") journal_only: If True, only return journal articles and letters (default: True) min_citations: Only return works with at least this many citations peer_reviewed_only: If True, apply balanced peer-review filters (default: True)
Returns: dict: Serialized OptimizedWorksSearchResponse with author's works.
Usage Patterns: # For AI validation (sample of high-impact works) retrieve_author_works(author_id, limit=20, order_by="citations")
# For complete benchmark evaluation (ALL works, minimal filtering)
retrieve_author_works(author_id, peer_reviewed_only=False, journal_only=False)
# For peer-reviewed works only (default behavior)
retrieve_author_works(author_id)Inputs: author_id (required), limit, order_by, publication_year, +4 more. Returns: object
search_authorsSearch Authors (Optimized)ARead-only
Optimized MCP tool wrapper for searching authors.
Args: name: Author name to search for. institution: (Optional) Institution name filter. topic: (Optional) Topic filter. country_code: (Optional) Country code filter. limit: Maximum number of results to return (default: 15, max: 100).
Returns: dict: Serialized OptimizedSearchResponse with streamlined author data.
Inputs: name (required), institution, topic, country_code, +1 more. Returns: object
search_orcid_authorsSearch ORCID AuthorsARead-only
Search ORCID for author profiles by name and affiliation.
Args: name: Author name to search (e.g., "John Smith", "Maria Garcia") affiliation: Optional institutional affiliation for disambiguation max_results: Maximum number of results to return (default: 10, max: 50)
Returns: dict: ORCID search results with: - total_found: Total number of matches found - results_returned: Number of results returned - results: List of author profiles with ORCID IDs, names, and affiliations
Example usage: # Basic name search search_orcid_authors("John Smith")
# Search with affiliation for better disambiguation
search_orcid_authors("Maria Garcia", "University of Barcelona")Inputs: name (required), affiliation, max_results. Returns: object
search_pubmedSearch PubMedARead-only
Search PubMed database for publications.
Args: query: Search query (author name, DOI, title, or keywords) search_type: Type of search - "author", "doi", "title", or "keywords" (default: "author") max_results: Maximum number of results to return (default: 20, max: 50)
Returns: dict: Search results with PMIDs, article metadata, and summary statistics
Example usage: # Search for author search_pubmed("Ivan Matic", search_type="author", max_results=10)
# Search by DOI
search_pubmed("10.1038/nprot.2009.36", search_type="doi")
# Search by keywords
search_pubmed("ADP-ribosylation DNA repair", search_type="keywords")Inputs: query (required), search_type, max_results. Returns: object
search_worksSearch Works (Optimized)BRead-only
Optimized MCP tool wrapper for searching works.
Args: query: Search query text author: (Optional) Author name filter institution: (Optional) Institution name filter publication_year: (Optional) Publication year filter type: (Optional) Work type filter (e.g., "article", "letter") limit: Maximum number of results (default: 25, max: 100) peer_reviewed_only: If True, apply peer-review filters (default: True) search_type: Search mode - "general" (title/abstract/fulltext), "title" (title only), or "title_and_abstract" (title and abstract only)
Returns: dict: Serialized OptimizedGeneralWorksSearchResponse with streamlined work data.
Inputs: query (required), author, institution, publication_year, +4 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogโฆ
TDQS
Scored across 8 tools
The tools have clear primary purposes but significant functional overlap exists. For example, autocomplete_authors, search_authors, and search_orcid_authors all search for authors by name, while search_pubmed and search_works both search publications. The descriptions help differentiate them (e.g., autocomplete_authors emphasizes filtering/ranking, search_orcid_authors focuses on ORCID profiles), but an agent could still misselect between similar tools without careful reading.
The naming follows a consistent verb_noun pattern throughout (e.g., autocomplete_authors, search_authors, retrieve_author_works). All tools use snake_case without deviation. The only minor inconsistency is that some tools include the data source in the name (e.g., search_orcid_authors, search_pubmed) while others do not, but this is reasonable given the domain.
With 8 tools, the count is appropriate for an author disambiguation server. It covers multiple data sources (OpenAlex, ORCID, PubMed) and both author and publication search. The number feels slightly high due to overlapping tools, but each appears to serve a distinct use case within the domain, such as autocomplete for quick filtering versus detailed retrieval for validation.
The toolset provides comprehensive coverage for author disambiguation, including search, autocomplete, and retrieval from multiple sources (OpenAlex, ORCID, PubMed). Minor gaps exist, such as no direct tool for merging author profiles or updating disambiguation results, but core workflows (finding, verifying, and analyzing authors and their works) are well-supported. The tools allow agents to cross-reference data effectively.
Maintenance
Related MCP Connectors
OpenAlex academic papers, authors and citations search via the official API. Runs on Apify.
Search 250M+ academic works, citation graphs, DOIs, and institutional research via OpenAlex.
Academic literature search, retrieval, and private library management on top of OpenAlex.
Access the OpenAlex academic research catalog โ 270M+ publications.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables academic research through the OpenAlex API, allowing users to search for papers, authors, and institutions, retrieve citations, and fetch full-text content when available. Perfect for building intelligent research assistants that can explore academic literature and related works.87MIT
- FlicenseNot gradedqualityDmaintenanceProvides academic research tools via the OpenAlex API, enabling searches for papers, authors, concepts, institutions, and citation analysis.-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to search and analyze OpenAlex scholarly database for OSINT research, including works, authors, institutions, funding, citations, and collaboration networks.MIT
- AlicenseAqualityCmaintenanceConnects AI agents to the OpenAlex scholarly database, enabling search and retrieval of works, authors, institutions, and sources via natural language.9MIT