NCBI Gene MCP Server
# NCBI Gene MCP Client
๐งฌ **MCP client for fetching gene and protein metadata from NCBI Entrez API**
This project provides a Model Context Protocol (MCP) client that interfaces with the NCBI Entrez API to fetch detailed information about genes and proteins. It's designed to be used both as a standalone command-line tool and as an MCP server for integration with MCP-compatible clients.
## ๐ Features
- **Gene Search**: Search for genes using flexible queries
- **Gene Information**: Fetch detailed gene metadata by NCBI Gene ID
- **Protein Information**: Fetch protein details by NCBI Protein ID
- **Symbol Search**: Search genes by symbol with optional organism filtering
- **Rate Limiting**: Built-in respect for NCBI API rate limits
- **MCP Server**: JSON-RPC server for MCP protocol integration
- **CLI Interface**: Easy-to-use command-line interface
## ๐ฆ Installation
### From Source (Development)
```bash
# Clone the repository
git clone <repository-url>
cd ncbi_gene_mcp_client
# Install in development mode
pip install -e .
```
### From PyPI (when available)
```bash
pip install ncbi_gene_mcp_client
```
## ๐ง Usage
### Command Line Interface
After installation, you can use the CLI commands:
#### Demo (Quick Start)
```bash
ncbi-gene-client demo
```
#### Search for genes
```bash
ncbi-gene-client search-genes "BRCA1"
ncbi-gene-client search-genes "breast cancer" --max-results 10
```
#### Get gene information by ID
```bash
ncbi-gene-client gene-info 672 # BRCA1 gene
```
#### Search by gene symbol
```bash
ncbi-gene-client search-symbol BRCA1 --organism human
ncbi-gene-client search-symbol TP53
```
#### Get protein information
```bash
ncbi-gene-client protein-info <protein_id>
```
#### With NCBI credentials (recommended)
```bash
ncbi-gene-client --email your@email.com --api-key YOUR_API_KEY demo
```
### Python API
```python
from ncbi_gene_mcp_client.main import NCBIGeneMCPClientBridge
# Initialize the client
client = NCBIGeneMCPClientBridge(
email="your@email.com", # Recommended by NCBI
api_key="your_api_key" # Optional, for higher rate limits
)
# Search for genes
results = client.search_genes("BRCA1[gene] AND human[organism]")
print(f"Found {results.count} genes")
# Get detailed gene information
gene_info = client.fetch_gene_info("672") # BRCA1
print(f"Gene: {gene_info.name}")
print(f"Description: {gene_info.description}")
print(f"Organism: {gene_info.organism}")
# Search by gene symbol
genes = client.search_by_gene_symbol("BRCA1", organism="human")
for gene in genes:
print(f"{gene.name}: {gene.description}")
```
### MCP Server
Run as an MCP server for integration with MCP-compatible clients:
```bash
ncbi-gene-mcp-server
```
The MCP server provides the following tools:
- **search_genes**: Search for genes using a query
- **fetch_gene_info**: Get detailed gene information by ID
- **fetch_protein_info**: Get protein information by ID
- **search_by_gene_symbol**: Search genes by symbol with optional organism filter
## ๐งช Examples
### Example 1: Basic Gene Search
```python
from ncbi_gene_mcp_client.main import NCBIGeneMCPClientBridge
client = NCBIGeneMCPClientBridge()
# Search for BRCA1 gene
results = client.search_genes("BRCA1")
print(f"Found {results.count} results")
# Get details for the first result
if results.ids:
gene_info = client.fetch_gene_info(results.ids[0])
print(f"Gene: {gene_info.name}")
print(f"Chromosome: {gene_info.chromosome}")
```
### Example 2: Disease Gene Search
```python
# Search for genes related to a disease
results = client.search_genes("diabetes[disease] AND human[organism]")
for gene_id in results.ids[:5]: # First 5 results
gene = client.fetch_gene_info(gene_id)
print(f"{gene.name}: {gene.description}")
```
### Example 3: Cross-species Gene Comparison
```python
# Compare BRCA1 across species
for organism in ["human", "mouse", "rat"]:
genes = client.search_by_gene_symbol("BRCA1", organism=organism)
if genes:
gene = genes[0]
print(f"{organism}: {gene.name} on chromosome {gene.chromosome}")
```
## ๐ Data Models
### GeneInfo
```python
{
"gene_id": "672",
"name": "BRCA1",
"description": "BRCA1 DNA repair associated",
"organism": "Homo sapiens",
"chromosome": "17",
"map_location": "17q21.31",
"gene_type": "protein-coding",
"other_aliases": ["BRCAI", "BRCC1", "BROVCA1"],
"summary": "This gene encodes a 190 kD nuclear phosphoprotein..."
}
```
### SearchResult
```python
{
"count": 1,
"ids": ["672"],
"query_translation": "BRCA1[gene]"
}
```
## โ๏ธ Configuration
### NCBI API Guidelines
It's recommended to provide your email address when using the NCBI API:
```python
client = NCBIGeneMCPClientBridge(email="your@email.com")
```
For higher rate limits, you can also provide an API key:
```python
client = NCBIGeneMCPClientBridge(
email="your@email.com",
api_key="your_ncbi_api_key"
)
```
### Rate Limiting
The client automatically handles NCBI's rate limiting requirements:
- Without API key: 3 requests per second
- With API key: 10 requests per second
## ๐งช Testing
Run the test suite:
```bash
# Install test dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run with coverage
pytest --cov=ncbi_gene_mcp_client
# Run integration tests (requires internet)
pytest -m integration
```
## ๐ Development
### Setting up for development
```bash
# Clone and install in development mode
git clone <repository-url>
cd ncbi_gene_mcp_client
pip install -e ".[dev]"
# Run linting
flake8 ncbi_gene_mcp_client/
mypy ncbi_gene_mcp_client/
# Format code
black ncbi_gene_mcp_client/
```
### Project Structure
```
ncbi_gene_mcp_client/
โโโ ncbi_gene_mcp_client/
โ โโโ __init__.py
โ โโโ main.py # Main client class
โ โโโ bridge.py # NCBI API bridge
โ โโโ models.py # Data models
โ โโโ mcp_server.py # MCP server implementation
โ โโโ cli.py # Command-line interface
โโโ tests/
โ โโโ __init__.py
โ โโโ test_main.py # Test suite
โโโ pyproject.toml # Project configuration
โโโ README.md # This file
โโโ LICENSE # MIT License
```
## ๐ NCBI Resources
- [NCBI Entrez Programming Utilities](https://www.ncbi.nlm.nih.gov/books/NBK25501/)
- [NCBI Gene Database](https://www.ncbi.nlm.nih.gov/gene/)
- [E-utilities API Documentation](https://www.ncbi.nlm.nih.gov/books/NBK25499/)
## ๐ License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## ๐จโ๐ป Author
**Mohammad Najeeb**
๐ง mona00002@uni-saarland.de
## ๐ค Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## Features
- **Feature 1**: Description of feature 1
- **Feature 2**: Description of feature 2
- **Feature 3**: Description of feature 3
- **MCP Integration**: Full Model Context Protocol server implementation
## API Methods
### Core Methods
- `method1()`: Description of method1
- `method2()`: Description of method2
- `method3()`: Description of method3
### Configuration
The package uses a configuration class for settings:
```python
from ncbi_gene_mcp_client.main import NCBIGeneMCPClientConfig, NCBIGeneMCPClientBridge
config = NCBIGeneMCPClientConfig(
base_url="https://api.example.com",
api_key="your_api_key",
timeout=30.0
)
bridge = NCBIGeneMCPClientBridge(config)
```
## MCP Server Configuration
To use the MCP server with an MCP client, configure it as follows:
```json
{
"mcpServers": {
"ncbi_gene_mcp_client": {
"command": "ncbi_gene_mcp_client-server",
"env": {}
}
}
}
```
The server will automatically handle:
- JSON-RPC communication
- Tool discovery and invocation
- Error handling and reporting
## Development
### Setup Development Environment
```bash
# Install in development mode with dev dependencies
pip install -e .[dev]
# Run tests
pytest
# Format code
black ncbi_gene_mcp_client/
# Type checking
mypy ncbi_gene_mcp_client/
```
### Project Structure
```
ncbi_gene_mcp_client/
โโโ pyproject.toml # Package configuration
โโโ README.md # This file
โโโ LICENSE # MIT License
โโโ ncbi_gene_mcp_client/ # Main package
โ โโโ __init__.py # Package initialization
โ โโโ main.py # Core functionality
โ โโโ mcp_server.py # MCP server implementation
โโโ tests/ # Test files
โโโ __init__.py
โโโ test_main.py # Tests for main functionality
```
## License
MIT License - see LICENSE file for details.
## Contributing
1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests
5. Run the test suite
6. Submit a pull request
## Support
For issues and questions, please use the GitHub issue tracker. TDQS
Scored across 4 tools
The tools have some overlap that could cause confusion, particularly between 'search_by_gene_symbol' and 'search_genes' which both search for genes but with different parameters. However, 'fetch_gene_info' and 'fetch_protein_info' are clearly distinct from each other and from the search tools, providing some clarity.
The naming follows a consistent snake_case pattern with clear verb_noun structure (e.g., fetch_gene_info, search_genes). The only minor deviation is 'search_by_gene_symbol' which includes a preposition, but it still maintains readability and overall consistency with the other tools.
With 4 tools, the count is borderline thin for a gene database server, as it might lack operations like updating or deleting data, but it covers basic fetch and search functionalities. It's reasonable for a focused scope but could benefit from more comprehensive coverage.
The server provides fetch and search operations for genes and proteins, but there are notable gaps such as no update, delete, or creation tools, which might be expected in a full CRUD lifecycle. It covers basic retrieval and search, but agents may hit dead ends for more complex tasks.