Skip to main content
Glama
josefdc

UniProt MCP Server

by josefdc
README.md
# UniProt MCP Server

<!-- mcp-name: io.github.josefdc/uniprot-mcp -->

[![PyPI version](https://img.shields.io/pypi/v/uniprot-mcp.svg)](https://pypi.org/project/uniprot-mcp/)
[![Python versions](https://img.shields.io/pypi/pyversions/uniprot-mcp.svg)](https://pypi.org/project/uniprot-mcp/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![MCP Registry](https://img.shields.io/badge/MCP-Registry-blue)](https://registry.modelcontextprotocol.io/v0/servers?search=uniprot-mcp)

A Model Context Protocol (MCP) server that provides seamless access to [UniProtKB](https://www.uniprot.org/) protein data. Query protein entries, sequences, Gene Ontology annotations, and perform ID mappings through a typed, resilient interface designed for LLM agents.

<a href="https://glama.ai/mcp/servers/@josefdc/Uniprot-MCP">
  <img width="380" height="200" src="https://glama.ai/mcp/servers/@josefdc/Uniprot-MCP/badge" alt="UniProt Server MCP server" />
</a>

## ✨ Features

- **šŸ”Œ Dual Transport**: Stdio for local development and Streamable HTTP for remote deployments
- **šŸ“Š Rich Data Access**: Fetch complete protein entries with sequences, features, GO annotations, cross-references, and taxonomy
- **šŸ” Advanced Search**: Full-text search with filtering by review status, organism, keywords, and more
- **šŸ”„ ID Mapping**: Convert between 200+ database identifier types with progress tracking
- **šŸ›”ļø Production Ready**: Automatic retries with exponential backoff, CORS support, Prometheus metrics
- **šŸ“ Typed Responses**: Structured Pydantic models ensure data consistency
- **šŸŽÆ MCP Primitives**: Resources, tools, and prompts designed for agent workflows

## šŸš€ Quick Start

### Installation

```bash
pip install uniprot-mcp
```

### Run the Server

**Local development (stdio)**:
```bash
uniprot-mcp
```

**Remote deployment (HTTP)**:
```bash
uniprot-mcp-http --host 0.0.0.0 --port 8000
```

The HTTP server provides:
- MCP endpoint: `http://localhost:8000/mcp`
- Health check: `http://localhost:8000/healthz`
- Metrics: `http://localhost:8000/metrics` (Prometheus format)

### Test with MCP Inspector

```bash
npx @modelcontextprotocol/inspector uniprot-mcp
```


## šŸ“š MCP Primitives

### Resources

Access static or dynamic data through URI patterns:

| URI | Description |
|-----|-------------|
| `uniprot://uniprotkb/{accession}` | Raw UniProtKB entry JSON for any accession |
| `uniprot://help/search` | Documentation for search query syntax |

### Tools

Execute actions and retrieve typed data:

| Tool | Parameters | Returns | Description |
|------|-----------|---------|-------------|
| `fetch_entry` | `accession`, `fields?` | `Entry` | Fetch complete protein entry with all annotations |
| `get_sequence` | `accession` | `Sequence` | Get protein sequence with length and metadata |
| `search_uniprot` | `query`, `size`, `reviewed_only`, `fields?`, `sort?`, `include_isoform` | `SearchHit[]` | Full-text search with advanced filtering |
| `map_ids` | `from_db`, `to_db`, `ids` | `MappingResult` | Convert identifiers between 200+ databases |
| `fetch_entry_flatfile` | `accession`, `version`, `format` | `string` | Retrieve historical entry versions (txt/fasta) |

**Progress tracking**: `map_ids` reports progress (0.0 → 1.0) for long-running jobs.

### Prompts

Pre-built templates for common workflows:

- **Summarize Protein**: Generate a structured summary from a UniProt accession, including organism, function, GO terms, and notable features.

## šŸ”§ Configuration

### Environment Variables

| Variable | Default | Description |
|----------|---------|-------------|
| `UNIPROT_ENABLE_FIELDS` | unset | Request minimal field subsets to reduce payload size |
| `UNIPROT_LOG_LEVEL` | `info` | Logging level: `debug`, `info`, `warning`, `error` |
| `UNIPROT_LOG_FORMAT` | `plain` | Log format: `plain` or `json` |
| `UNIPROT_MAX_CONCURRENCY` | `8` | Max concurrent UniProt API requests |
| `MCP_HTTP_HOST` | `0.0.0.0` | HTTP server bind address |
| `MCP_HTTP_PORT` | `8000` | HTTP server port |
| `MCP_HTTP_LOG_LEVEL` | `info` | Uvicorn log level |
| `MCP_HTTP_RELOAD` | `0` | Enable auto-reload: `1` or `true` |
| `MCP_CORS_ALLOW_ORIGINS` | `*` | CORS allowed origins (comma-separated) |
| `MCP_CORS_ALLOW_METHODS` | `GET,POST,DELETE` | CORS allowed methods |
| `MCP_CORS_ALLOW_HEADERS` | `*` | CORS allowed headers |

### CLI Flags

```bash
# HTTP server flags
uniprot-mcp-http --host 127.0.0.1 --port 9000 --log-level debug --reload
```

## šŸ“– Usage Examples

### Fetching a Protein Entry

```python
# Using MCP client
result = await session.call_tool("fetch_entry", {
    "accession": "P12345"
})

# Returns structured Entry with:
# - primaryAccession, protein names, organism
# - sequence (length, mass, sequence string)
# - features (domains, modifications, variants)
# - GO annotations (biological process, molecular function, cellular component)
# - cross-references to other databases
```

### Searching for Proteins

```python
# Search reviewed human proteins
result = await session.call_tool("search_uniprot", {
    "query": "kinase AND organism_id:9606",
    "size": 50,
    "reviewed_only": True,
    "sort": "annotation_score"
})

# Returns list of SearchHit objects with accessions and scores
```

### Mapping Identifiers

```python
# Convert UniProt IDs to PDB structures
result = await session.call_tool("map_ids", {
    "from_db": "UniProtKB_AC-ID",
    "to_db": "PDB",
    "ids": ["P12345", "Q9Y6K9"]
})

# Returns MappingResult with successful and failed mappings
```

## šŸ› ļø Development

### Prerequisites

- Python 3.11 or 3.12
- [uv](https://docs.astral.sh/uv/) (recommended) or pip

### Setup

```bash
# Clone the repository
git clone https://github.com/josefdc/Uniprot-MCP.git
cd Uniprot-MCP

# Install dependencies
uv sync --group dev

# Install development tools
uv tool install ruff
uv tool install mypy
```

### Running Tests

```bash
# Run all tests with coverage
uv run pytest --maxfail=1 --cov=uniprot_mcp --cov-report=term-missing

# Run specific test file
uv run pytest tests/unit/test_parsers.py -v

# Run integration tests only
uv run pytest tests/integration/ -v
```

### Code Quality

```bash
# Lint
uv tool run ruff check .

# Format
uv tool run ruff format .

# Type check
uv tool run mypy src

# Run all checks
uv tool run ruff check . && \
uv tool run ruff format --check . && \
uv tool run mypy src && \
uv run pytest
```

### Local Development Server

```bash
# Stdio server
uv run uniprot-mcp

# HTTP server with auto-reload
uv run python -m uvicorn uniprot_mcp.http_app:app --reload --host 127.0.0.1 --port 8000
```


## šŸ—ļø Architecture

```
src/uniprot_mcp/
ā”œā”€ā”€ adapters/           # UniProt REST API client and response parsers
│   ā”œā”€ā”€ uniprot_client.py  # HTTP client with retry logic
│   └── parsers.py         # Transform UniProt JSON → Pydantic models
ā”œā”€ā”€ models/
│   └── domain.py       # Typed data models (Entry, Sequence, etc.)
ā”œā”€ā”€ server.py           # MCP stdio server (FastMCP)
ā”œā”€ā”€ http_app.py         # MCP HTTP server (Starlette + CORS)
ā”œā”€ā”€ prompts.py          # MCP prompt templates
└── obs.py              # Observability (logging, metrics)

tests/
ā”œā”€ā”€ unit/               # Unit tests for parsers, models, tools
ā”œā”€ā”€ integration/        # End-to-end tests with VCR fixtures
└── fixtures/           # Test data (UniProt JSON responses)
```

## šŸ“¦ Publishing

This server is published to:
- **PyPI**: [uniprot-mcp](https://pypi.org/project/uniprot-mcp/)
- **MCP Registry**: [io.github.josefdc/uniprot-mcp](https://registry.modelcontextprotocol.io/v0/servers?search=uniprot-mcp)

### Building and Publishing

```bash
# Build distribution packages
uv build

# Publish to PyPI (requires token)
uv publish --token pypi-YOUR_TOKEN

# Publish to MCP Registry (requires GitHub auth)
mcp-publisher login github
mcp-publisher publish
```

See [docs/registry.md](docs/registry.md) for detailed registry publishing instructions.

## šŸ¤ Contributing

Contributions are welcome! Please:

1. Read our [Contributing Guidelines](CONTRIBUTING.md)
2. Follow our [Code of Conduct](CODE_OF_CONDUCT.md)
3. Check the [Security Policy](SECURITY.md) for vulnerability reporting
4. Review the [Changelog](CHANGELOG.md) for recent changes

Quick start for contributors:
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Make your changes with tests
4. Run quality checks: `uv tool run ruff check . && uv tool run mypy src && uv run pytest`
5. Commit using [Conventional Commits](https://www.conventionalcommits.org/) (`feat:`, `fix:`, `docs:`, etc.)
6. Push and open a Pull Request

## šŸ“„ License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## šŸ™ Acknowledgments

- **UniProt Consortium**: For providing comprehensive, high-quality protein data through their REST API
- **Anthropic**: For the Model Context Protocol specification and Python SDK
- **Community**: For feedback, bug reports, and contributions

## šŸ”— Links

- **Documentation**: [GitHub Repository](https://github.com/josefdc/Uniprot-MCP)
- **UniProt API**: [REST API Documentation](https://www.uniprot.org/help/api)
- **MCP Specification**: [Model Context Protocol](https://modelcontextprotocol.io/)
- **Issues & Support**: [GitHub Issues](https://github.com/josefdc/Uniprot-MCP/issues)

## āš ļø Disclaimer

This is an independent project and is not officially affiliated with or endorsed by the UniProt Consortium. Please review UniProt's [terms of use](https://www.uniprot.org/help/license) when using their data.

---

**Built with ā¤ļø for the bioinformatics and AI communities**

TDQS

B3.4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: fetch_entry retrieves structured data, fetch_entry_flatfile provides flatfile formats, get_sequence focuses on sequence metadata, map_ids handles identifier mapping, and search_uniprot performs searches. There is no overlap or ambiguity between these functions.

Naming Consistency4/5

The naming is mostly consistent with a verb_noun pattern (e.g., fetch_entry, get_sequence, map_ids, search_uniprot), but fetch_entry_flatfile deviates slightly by including an extra descriptor. Overall, the pattern is readable and predictable.

Tool Count5/5

With 5 tools, this server is well-scoped for the UniProt domain. Each tool serves a specific, essential function without redundancy, making the count appropriate for typical use cases like data retrieval, mapping, and searching.

Completeness4/5

The toolset covers core operations for UniProt access: fetching entries in different formats, getting sequences, mapping IDs, and searching. A minor gap might be the lack of update or delete tools, but these are likely unnecessary for a read-only biological database, so agents can work effectively with the provided tools.

Maintenance

ActivityInactive
ResponsivenessNo issues