Click on "Install 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., "@UniProt MCP Serverfetch the protein entry for P12345"
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.
UniProt MCP Server
A Model Context Protocol (MCP) server that provides seamless access to UniProtKB protein data. Query protein entries, sequences, Gene Ontology annotations, and perform ID mappings through a typed, resilient interface designed for LLM agents.
β¨ 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
pip install uniprot-mcpRun the Server
Local development (stdio):
uniprot-mcpRemote deployment (HTTP):
uniprot-mcp-http --host 0.0.0.0 --port 8000The HTTP server provides:
MCP endpoint:
http://localhost:8000/mcpHealth check:
http://localhost:8000/healthzMetrics:
http://localhost:8000/metrics(Prometheus format)
Test with MCP Inspector
npx @modelcontextprotocol/inspector uniprot-mcpπ MCP Primitives
Resources
Access static or dynamic data through URI patterns:
URI | Description |
| Raw UniProtKB entry JSON for any accession |
| Documentation for search query syntax |
Tools
Execute actions and retrieve typed data:
Tool | Parameters | Returns | Description |
|
|
| Fetch complete protein entry with all annotations |
|
|
| Get protein sequence with length and metadata |
|
|
| Full-text search with advanced filtering |
|
|
| Convert identifiers between 200+ databases |
|
|
| 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 |
| unset | Request minimal field subsets to reduce payload size |
|
| Logging level: |
|
| Log format: |
|
| Max concurrent UniProt API requests |
|
| HTTP server bind address |
|
| HTTP server port |
|
| Uvicorn log level |
|
| Enable auto-reload: |
|
| CORS allowed origins (comma-separated) |
|
| CORS allowed methods |
|
| CORS allowed headers |
CLI Flags
# HTTP server flags
uniprot-mcp-http --host 127.0.0.1 --port 9000 --log-level debug --reloadπ Usage Examples
Fetching a Protein Entry
# 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 databasesSearching for Proteins
# 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 scoresMapping Identifiers
# 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 (recommended) or pip
Setup
# 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 mypyRunning Tests
# 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/ -vCode Quality
# 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 pytestLocal Development Server
# 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
MCP Registry: io.github.josefdc/uniprot-mcp
Building and Publishing
# 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 publishSee docs/registry.md for detailed registry publishing instructions.
π€ Contributing
Contributions are welcome! Please:
Read our Contributing Guidelines
Follow our Code of Conduct
Check the Security Policy for vulnerability reporting
Review the Changelog for recent changes
Quick start for contributors:
Fork the repository
Create a feature branch (
git checkout -b feature/amazing-feature)Make your changes with tests
Run quality checks:
uv tool run ruff check . && uv tool run mypy src && uv run pytestCommit using Conventional Commits (
feat:,fix:,docs:, etc.)Push and open a Pull Request
π License
This project is licensed under the MIT License - see the 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
UniProt API: REST API Documentation
MCP Specification: Model Context Protocol
Issues & Support: GitHub 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 when using their data.
Built with β€οΈ for the bioinformatics and AI communities