eggnog-mcp
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., "@eggnog-mcpannotate protein P12345 with KEGG KO and GO terms"
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.
eggNOG-MCP
中文文档 | English
⚠️ Disclaimer: This is a community-maintained, unofficial MCP server for the eggNOG database. It is not affiliated with, endorsed by, or maintained by the eggNOG team or EMBL. The official eggNOG database is available at https://eggnogdb.org/.
A Model Context Protocol (MCP) server that provides AI assistants with access to the eggNOG 7 database — a comprehensive resource for orthology assignments and functional predictions for comparative genomics.
Table of Contents
Related MCP server: Bio-MCP BLAST
Overview
eggNOG (evolutionary genealogy of genes: Non-supervised Orthologous Groups) is a database of orthology relationships, functional annotations, and phylogenetic trees covering 12,000+ annotated species, 59 million+ protein sequences, and 3.1 million+ orthologous groups.
eggNOG-MCP bridges the eggNOG database and Large Language Models (LLMs) by implementing the Model Context Protocol. Once configured, any MCP-compatible AI assistant (such as Claude Desktop, Cursor, or custom agents) can query eggNOG directly through natural language.
The server communicates with eggNOG's native JSON API (/e7api/) for reliable, structured data access — no HTML scraping required.
What can you do with eggNOG-MCP?
🔬 Look up a protein by its eggNOG ID and retrieve its functional annotation
🧬 Query an orthologous group (OG) to understand evolutionary relationships
📋 List all proteins within an OG, grouped by species
🔗 Retrieve pairwise orthologs for a protein across species
🔍 Search the eggNOG database by protein name, UniProt ID, or family name
📊 Get database statistics (species, proteins, trees, OGs counts)
📥 List all downloadable bulk data files
🏷️ Annotate a protein with KEGG KO terms and GO terms with confidence scores
🧫 Browse all members of a protein family
Features
Feature | Description |
Protein Lookup | Retrieve protein family, predicted functions, and OGs for any eggNOG protein ID |
OG Query | Look up orthologous group details including evolutionary origin, member counts, and functional annotation |
OG Content | List all proteins within an OG, grouped by species |
Orthologs | Retrieve pairwise orthologs for a protein across all species |
Protein Family | Browse all species and proteins within a protein family cluster |
Database Search | Search by protein name, UniProt ID, or family name |
Functional Annotation | Get structured KEGG KO and GO term annotations with confidence scores |
Database Statistics | Access current eggNOG 7 release statistics |
Downloads Index | List all bulk-downloadable data files with URLs and descriptions |
Taxon Lookup | Look up taxonomic information by NCBI taxonomy ID |
MCP Resources | Expose version info, stats, and downloads as MCP resources |
JSON API | Uses eggNOG's native |
Async HTTP | Built on |
Error Resilient | All tools return structured error messages instead of crashing |
Quick Start
# Install
pip install eggnog-mcp
# Run (stdio transport — for use with MCP clients)
eggnog-mcpOr run directly with Python:
python -m eggnog_mcp.serverInstallation
Option 1: Install from source (recommended for development)
git clone https://github.com/ZengZichao/eggNOG-MCP.git
cd eggNOG-MCP
pip install -e .Option 2: Install dependencies only
pip install -r requirements.txtRequirements
Python ≥ 3.10
mcp≥ 2.0.0 (Model Context Protocol SDK)httpx≥ 0.27.0 (async HTTP client)
Configuration
Claude Desktop
Add the following to your claude_desktop_config.json file:
{
"mcpServers": {
"eggnog-mcp": {
"command": "eggnog-mcp",
"args": []
}
}
}If you installed from source without adding to PATH, use the full path:
{
"mcpServers": {
"eggnog-mcp": {
"command": "python",
"args": ["-m", "eggnog_mcp.server"],
"env": {
"PYTHONPATH": "/path/to/eggNOG-MCP/src"
}
}
}
}Cursor IDE
Add to your Cursor MCP settings:
{
"mcpServers": {
"eggnog-mcp": {
"command": "eggnog-mcp"
}
}
}Generic MCP Client
The server uses stdio transport by default. Start it with:
eggnog-mcpThe server communicates via stdin/stdout using the MCP protocol.
TLS / Network Issues
If you encounter TLS connection errors when connecting to https://eggnogdb.org, you can modify the client initialization in src/eggnog_mcp/client.py to use HTTP or disable SSL verification:
# Option 1: Use HTTP
_global_client = eggNOGClient(base_url="http://eggnogdb.org")
# Option 2: Disable SSL verification (HTTPS)
_global_client = eggNOGClient(verify_ssl=False)Available Tools
1. get_protein
Look up detailed information for a protein in the eggNOG database.
Parameter | Type | Required | Description |
|
| Yes | eggNOG protein ID in |
Example:
protein_id = "9606.ENSP00000269305"Returns: Protein name, species, taxid, UniProt ID, Pfam domains, KEGG KO terms, orthologous groups list, predicted functions (KEGG KO + GO terms with confidence), selected OG details.
2. get_orthologous_group
Look up information for an orthologous group (OG).
Parameter | Type | Required | Description |
|
| Yes | OG ID in |
Example:
og_id = "P53@33154|A-1"Returns: OG ID, protein family, evolutionary origin, taxonomic lineage, protein count, species count, functional annotation (KEGG KO + GO slim), all OGs in the same family.
3. get_og_content
Retrieve the list of proteins within an orthologous group.
Parameter | Type | Required | Description |
|
| Yes | OG ID in |
|
| No | Maximum number of species to include (default: 50) |
Example:
og_id = "P53@33154|A-1", max_species = 10Returns: Total species count, total protein count, species list with protein IDs.
4. get_orthologs
Retrieve pairwise orthologs for a protein.
Parameter | Type | Required | Description |
|
| Yes | eggNOG protein ID in |
|
| No | Maximum number of species to include (default: 50) |
Example:
protein_id = "9606.ENSP00000269305", max_species = 10Returns: Total ortholog species count, orthologs grouped by species with protein IDs.
5. search_eggnog
Search the eggNOG database for proteins or orthologous groups.
Parameter | Type | Required | Description |
|
| Yes | Search query (≥ 3 characters) |
Example:
query = "P53"
query = "P04637"
query = "TP53"Returns: List of matching proteins and OGs with type, ID, label, and URL.
6. annotate_protein
Annotate a protein with functional information (KEGG KO + GO terms).
Parameter | Type | Required | Description |
|
| Yes | eggNOG protein ID in |
Example:
protein_id = "9606.ENSP00000269305"Returns: Structured annotation with KEGG KO terms, GO slim terms, KEGG gene symbols, protein family, Pfam domains, orthologous groups, and selected OG details.
7. get_protein_family
Retrieve protein family (cluster) content from eggNOG.
Parameter | Type | Required | Description |
|
| Yes | Protein family / cluster name |
|
| No | Maximum number of species to include (default: 50) |
Example:
family_name = "P53", max_species = 10Returns: Total species count, total protein count, species list with protein IDs, species summary.
8. get_database_stats
Retrieve summary statistics of the eggNOG 7 database.
Parameters: None
Returns: Annotated species count, protein sequences count, phylogenetic trees count, orthologous groups count.
9. list_downloads
List all downloadable bulk data files.
Parameters: None
Returns: List of files with filenames, URLs, and descriptions (protein sequences, OG info, trees, taxonomic info, etc.).
10. get_taxid_info
Look up taxonomic information for an NCBI taxonomy ID.
Parameter | Type | Required | Description |
|
| Yes | NCBI taxonomy ID |
Example:
taxid = 9606Returns: Taxonomic lookup guidance, download URL for the taxid info TSV file, and column format description.
Available Resources
Resource URI | Description |
| Server version and database info |
| Cached database statistics |
| List of downloadable files |
Usage Examples
Example 1: Annotate Human P53
User: "What is the functional annotation of human P53 in eggNOG?"
Assistant: [calls annotate_protein with protein_id="9606.ENSP00000269305"]Result includes:
Protein family:
P53KEGG KO terms:
K04451(TP53, 11.47%),K10148(TP73, 14.34%),K10149(TP63, 19.80%)GO terms:
GO:0006355(regulation of transcription, 68.83%),GO:0006351(transcription, 68.83%)Pfam domains:
P53_TAD,TAD2,P53,P53_tetramer35 orthologous groups spanning 438 species
Example 2: Search for P53
User: "Search eggNOG for P53"
Assistant: [calls search_eggnog with query="P53"]Result: 10 matches including proteins (e.g. PPP5_HUMAN) and OGs (e.g. P53@33154|A-1).
Example 3: Query an Orthologous Group
User: "Tell me about the P53 orthologous group at the Opisthokonta level"
Assistant: [calls get_orthologous_group with og_id="P53@33154|A-1"]Result: Evolutionary origin (Opisthokonta), 1,081 proteins, 438 species, KEGG KO and GO annotations, full family OG list.
Example 4: List Proteins in an OG
User: "Show me the proteins in the P53 OG at the Opisthokonta level"
Assistant: [calls get_og_content with og_id="P53@33154|A-1", max_species=5]Example 5: Get Orthologs
User: "What are the orthologs of human P53?"
Assistant: [calls get_orthologs with protein_id="9606.ENSP00000269305"]Example 6: Database Statistics
User: "How many species are in eggNOG?"
Assistant: [calls get_database_stats]Result: 12k+ annotated species, 59M+ protein sequences, 1.1M+ phylogenetic trees, 3.1M+ orthologous groups.
Project Structure
eggNOG-MCP/
├── pyproject.toml # Project configuration & dependencies
├── requirements.txt # pip requirements
├── LICENSE # MIT License
├── .gitignore # Git ignore rules
├── README.md # English documentation (this file)
├── README_zh.md # Chinese documentation
├── src/
│ └── eggnog_mcp/
│ ├── __init__.py # Package initialization
│ ├── version.py # Version info
│ ├── client.py # eggNOG API client (async HTTP, JSON API)
│ └── server.py # MCP server & tool definitions (10 tools)
└── tests/
└── test_client.py # Unit tests for the API clientDevelopment
Setup
# Clone and install in development mode
git clone https://github.com/ZengZichao/eggNOG-MCP.git
cd eggNOG-MCP
pip install -e ".[dev]"Linting
ruff check src/
ruff format src/Running Tests
# Run the full test suite
pytest tests/ -vTesting the Server
# Run the server and verify it starts
eggnog-mcp
# Or test with the MCP inspector
npx @modelcontextprotocol/inspector eggnog-mcpAPI Endpoints Used
The client communicates with eggNOG's native JSON API:
Endpoint | Description |
| Protein details + OGs + functions |
| Orthologous group details |
| Proteins within an OG |
| Proteins within a family cluster |
| Pairwise orthologs for a protein |
| Search / autocomplete |
| Database statistics (HTML) |
License
This project is licensed under the MIT License.
The eggNOG database itself is maintained by the eggNOG Team at EMBL. Please refer to https://eggnogdb.org/ for database usage terms and citation requirements.
Note: This is an unofficial, community-maintained project. It is not affiliated with or endorsed by the eggNOG team or EMBL.
Acknowledgements
eggNOG Team — For creating and maintaining the eggNOG database. Visit https://eggnogdb.org/ for more information.
Anthropic — For the Model Context Protocol specification and SDK.
Huerta-Cepas J, et al. — eggNOG 7.0: comparative genomics at the scale of 12,000+ genomes. Please cite the original eggNOG publications when using this tool in research.
Key References
Huerta-Cepas, J., et al. (2023). eggNOG 7.0: comparative genomics at the scale of 12,000+ genomes. Briefings in Bioinformatics, 24(1), bbac483.
The Model Context Protocol specification: https://modelcontextprotocol.io/
Available Tools
10 toolsannotate_proteinA
Annotate a protein with functional information from eggNOG.
Returns a structured functional annotation for the given protein,
including KEGG KO terms, GO slim terms, protein family, Pfam domains,
and orthologous groups. This is a higher-level convenience wrapper
around get_protein that emphasises the annotation results.
Parameters
protein_id : str
The eggNOG protein identifier in the format taxid.seqid.
Examples:
- 9606.ENSP00000269305 (human P53)
- 4932.YJR154W (yeast)
Returns
str JSON string with KEGG KO terms, GO terms, and cross-references.
| Name | Required | Description | Default |
|---|---|---|---|
| protein_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose that this is a wrapper delegating to get_protein and lists the annotation categories returned, but it says nothing about read-only safety, authentication, rate limits, or error behavior for an unknown protein_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return content, then a compact parameter block. Slightly redundant: the 'Parameters' and 'Returns' sections restate the input schema and output schema rather than adding new information, which costs a little space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with an existing output schema, the description covers purpose, the identifier format, the wrapper relationship, and return categories. Only minor behavioral detail (safety/permissions, failure on malformed IDs) is absent, which is acceptable given the simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema gives only a bare 'string' title, so the description must compensate — and it does fully: it defines the required 'taxid.seqid' format and supplies two concrete examples (human P53, yeast). An agent can construct a valid identifier from the description alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Annotate a protein with functional information from eggNOG') and enumerates the annotation content (KEGG KO, GO slim, family, Pfam, orthologous groups). It also distinguishes itself from the sibling 'get_protein' by declaring it is a higher-level convenience wrapper that emphasises annotation results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the sibling it overlaps with ('get_protein') and implies the selection criterion: use this when you want the annotation results surfaced. It stops short of an explicit when-not or a fuller routing rule among the other siblings (get_orthologs, get_protein_family, get_orthologous_group).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_database_statsA
Retrieve summary statistics of the eggNOG 7 database.
Returns the number of annotated species, protein sequences, phylogenetic trees, and orthologous groups in the current eggNOG release.
Returns
str JSON string with database statistics.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it says nothing about read-only/side-effect status, authentication, rate limits, or caching. The only behavioral hint is that figures reflect the 'current eggNOG release', which is thin for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and reasonably short, but the word 'Returns' is used three times across a prose sentence, an enumerated list, and a NumPy-style Returns block, creating redundant restatement of the same return information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-argument, read-only statistics tool with an output schema present, the description covers what the tool does and what the payload contains. Given the output schema exists, the explicit Returns block is not strictly needed, and the absence of behavioral/annotation context is the only notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; there is no parameter semantics to document or omit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (retrieve summary statistics of the eggNOG 7 database) and enumerates the exact contents of those statistics (species, sequences, trees, orthologous groups). No sibling tool (get_protein, get_orthologous_group, search_eggnog, etc.) does this, so the tool is unambiguously distinguishable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives or fallbacks. The only usage signal is implied by the verb 'Retrieve', leaving the agent to guess the context in which database-level statistics are wanted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_og_contentA
Retrieve the list of proteins within an orthologous group.
Returns the species and their protein members for the specified OG.
The result is capped at max_species to avoid excessively large
responses.
Parameters
og_id : str
The orthologous group identifier in family@taxid|level format.
Example: P53@33154|A-1
max_species : int, optional
Maximum number of species to include (default 50).
Returns
str JSON string with species list, protein counts, and protein IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| og_id | Yes | ||
| max_species | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that results are capped at max_species to avoid large responses and that the return includes species, protein counts, and protein IDs, but it omits permissions, error behavior, and explicit read-only safety context beyond the implied 'Retrieve'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The docstring is structured and front-loads the purpose, cap behavior, and parameter explanations. The Returns section is slightly redundant given the output schema, but the description remains efficient and well organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with no annotations and no schema descriptions, the description provides enough to call it correctly: parameter formats, cap behavior, and a return summary. The main remaining gap is lack of explicit sibling differentiation or usage guidance, and the output schema already covers detailed return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: og_id is documented with its family@taxid|level format and an example, while max_species is explained as an optional cap with default 50. This adds substantial meaning beyond the bare schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: retrieve the list of proteins within an orthologous group. It is easy to distinguish from generic protein or ortholog tools by the phrase 'within an orthologous group,' but it does not explicitly differentiate from siblings such as get_orthologous_group or get_orthologs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives, and no sibling tools are mentioned. Usage is only implied by the purpose statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_orthologous_groupA
Look up information for an orthologous group (OG) in eggNOG.
Retrieves the evolutionary origin, protein count, species count, functional annotation (KEGG KO and GO slim terms), and the list of all OGs in the same protein family.
Parameters
og_id : str
The orthologous group identifier in the format
family@taxid|level.
Examples:
- P53@33154|A-1 (P53 family, Opisthokonta level)
- P53@7742|IM-18 (P53 family, Gnathostomata level)
Returns
str JSON string with OG details including evolutionary origin, counts, and functional annotation.
| Name | Required | Description | Default |
|---|---|---|---|
| og_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose the fundamental read-only nature implicitly ('Look up'), the return type (JSON string), and the content shape. It omits error behavior for malformed og_id, validation rules, and any rate/limit characteristics, leaving real gaps for a lookup tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and content are front-loaded in the first two sentences, and the NumPy-style parameter/returns blocks are scannable. The Returns section restates what an existing output schema already carries, which is mild redundancy, but overall there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter lookup with an output schema present, the description covers purpose, input format with examples, and a return summary. The return-format block is largely redundant against the output schema, and error/validation behavior is absent, but nothing essential for calling the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does thoroughly: it specifies the exact format ('family@taxid|level') and gives two concrete labeled examples with taxonomic level semantics (Opisthokonta A-1, Gnathostomata IM-18). This is meaningfully more than the bare 'Og Id' string title in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Look up information for an orthologous group (OG) in eggNOG') and enumerates exactly what is retrieved: evolutionary origin, protein and species counts, KEGG KO/GO slim annotation, and same-family OGs. This lets an agent distinguish it from retrieval siblings like get_og_content or get_protein. However, it never explicitly contrasts itself with those siblings, so the differentiation is inferred from content rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the content ('look up information for an OG'), which signals a detail-fetch against a known OG id. There is no explicit when-to-use versus get_og_content/get_orthologs/get_protein_family guidance and no stated preconditions, so the agent must infer routing from the sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_orthologsB
Retrieve pairwise orthologs for a protein.
Returns the orthologous proteins grouped by species for the given eggNOG protein ID.
Parameters
protein_id : str
The eggNOG protein identifier in taxid.seqid format.
Example: 9606.ENSP00000269305
max_species : int, optional
Maximum number of species to include (default 50).
Returns
str JSON string with orthologs grouped by species.
| Name | Required | Description | Default |
|---|---|---|---|
| protein_id | Yes | ||
| max_species | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not state whether this is read-only, whether authentication or rate limits apply, or — importantly for max_species — whether results are truncated and how ties are broken. Only the 'grouped by species' return shape is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The numpydoc-style layout is front-loaded and scannable, with purpose first and parameters clearly enumerated. The Returns block is somewhat redundant given the output schema exists, but the whole is short and earns most of its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter retrieval tool with an output schema, the essential call information (id format, species cap) is present. What is missing is routing guidance versus sibling tools and any statement about truncation behavior or safety profile, leaving modest gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description compensates well: it documents the required protein_id format (``taxid.seqid``) with a concrete example and the optional max_species default. This adds real meaning the bare schema lacks, though it does not explain the consequence of raising or lowering max_species.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve pairwise orthologs for a protein') with the required identifier. It is distinguishable from get_protein and search_eggnog, but it never explicitly names how it differs from the closely related get_orthologous_group, so sibling differentiation is incomplete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of alternatives, despite a sibling (get_orthologous_group) covering the conceptually adjacent task. The agent must infer that this tool is for pairwise orthologs per protein from the purpose statement alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_proteinB
Look up detailed information for a protein in the eggNOG database.
Retrieves protein family membership, predicted functions (KEGG KO terms and GO terms with confidence scores), and the list of orthologous groups (OGs) associated with the protein.
Parameters
protein_id : str
The eggNOG protein identifier in the format taxid.seqid.
Examples:
- 9606.ENSP00000269305 (human P53 / TP53)
- 9606.ENSP00000330696 (human P2RX7)
- 460265.Mnod_3996 (nitrogen fixation protein)
Returns
str JSON string with protein family, function predictions, and OG list.
| Name | Required | Description | Default |
|---|---|---|---|
| protein_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does establish that this is a read/lookup operation and discloses the returned content categories (including that function predictions carry confidence scores), which is useful behavioral context. It says nothing about error behavior for invalid IDs, database coverage, or whether the lookup is precise vs. fuzzy.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence, then parameters, then returns — cleanly structured and easy to scan. The Returns block is somewhat redundant given an output schema exists, but it is brief and does not bloat the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool, the description is nearly complete: purpose, exact ID format with examples, and return content. An output schema already exists, so the return prose is a bonus rather than a necessity. The only real omission is guidance distinguishing it from lookalike sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: it states the identifier format 'taxid.seqid' and provides three concrete, varied examples (human P53, human P2RX7, a bacterial gene). This meaningfully exceeds what the bare string schema conveys, though it omits edge cases like case sensitivity or whether the taxid must exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Look up detailed information for a protein in the eggNOG database') and enumerates the retrieved content (family membership, KEGG KO/GO predictions with confidence, OG list). This distinguishes it from generic lookup siblings, but it does not explicitly say how it differs from close siblings like get_protein_family or get_orthologs, which overlap in scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, prerequisites, or named alternatives. With nine siblings including get_orthologs, get_protein_family, annotate_protein, and search_eggnog, the agent gets no routing help about which to pick for a given question. Usage is only weakly implied by the lookup phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_protein_familyB
Retrieve protein family (cluster) content from eggNOG.
Returns the list of species and proteins grouped under the given protein family name (also called a cluster).
Parameters
family_name : str
The protein family / cluster name.
Examples: P53, P53_tetramer, P53_TAD
max_species : int, optional
Maximum number of species to include (default 50).
Returns
str JSON string with species list, protein counts, and protein IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| family_name | Yes | ||
| max_species | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implies a read-only retrieval and discloses the default species cap (50), but says nothing about permissions, rate limits, or pagination behavior. Functional but light on behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence and the docstring-style Parameters/Returns sections are scannable and free of filler. The Returns block is partly redundant given an output schema exists, costing a little tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with an output schema present, the description covers the resource, both parameters, and the default limiting behavior. Only the missing usage/alternative guidance keeps it from being fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it largely does: it explains family_name is the cluster name and gives concrete examples (P53, P53_tetramer, P53_TAD), and documents max_species with its default of 50. It adds real meaning beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve protein family (cluster) content from eggNOG') and clarifies that a family is also called a cluster, plus what the return contains. It does not explicitly differentiate itself from close siblings like get_orthologous_group or get_protein, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusions, and no mention of alternative tools such as get_orthologous_group or get_og_content. The reader must infer the appropriate context from the name and description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taxid_infoA
Look up taxonomic information for an NCBI taxonomy ID.
Provides guidance on retrieving taxonomic information for a given
NCBI taxonomy ID from the eggNOG database. The full taxonomic
data is available in the downloadable e7.taxid_info.tsv.gz file.
Parameters
taxid : int
NCBI taxonomy ID.
Examples:
- 9606 (Homo sapiens)
- 4932 (Saccharomyces cerevisiae)
- 44689 (Danio rerio)
Returns
str JSON string with taxonomic lookup information and download URL.
| Name | Required | Description | Default |
|---|---|---|---|
| taxid | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose that the result is a JSON string containing taxonomic lookup information and a download URL, which is useful behavioral context. It says nothing about permissions, rate limits, or behavior for unknown taxids, leaving real gaps for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is well front-loaded, but the second sentence largely restates it ("Provides guidance on retrieving taxonomic information..."), and the Parameters/Returns blocks duplicate what the input and output schemas already express. There is avoidable repetition, though the examples earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one required parameter, an output schema present, and no annotations, the description covers what an agent needs to invoke the tool: the meaning of taxid, concrete examples, and the shape of the return. Only edge-case behavior and the bulk-download alternative remain underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% — the taxid property has no description in the schema — so the description must compensate, and it does: it defines taxid as an int NCBI taxonomy ID and supplies three concrete examples (9606, 4932, 44689). That is meaningfully more than the schema offers, though it doesn't note valid ranges or behavior on invalid IDs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line states a specific verb and resource: "Look up taxonomic information for an NCBI taxonomy ID." This is clearly distinguishable from sibling tools like get_protein or get_orthologs, which operate on different resources. However, no sibling is named, so it does not earn a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the note that "the full taxonomic data is available in the downloadable e7.taxid_info.tsv.gz file" hints at an alternative path (bulk download via list_downloads) without stating when to prefer this tool over that one. There is no explicit when-to-use or when-not-to-use guidance, so it lands at implied usage rather than clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_downloadsA
List downloadable data files from the eggNOG 7 database.
Returns a list of all bulk-downloadable files (protein sequences, OG info, phylogenetic trees, taxonomic info, etc.) with their URLs and descriptions.
Returns
str JSON string with download file information.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses what the call returns (files with URLs and descriptions) which is genuinely useful, but says nothing about read-only semantics, authentication, rate limits, or the size of the listing. Adequate but leaves clear gaps for an annotation-free tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and the follow-up sentence adds real detail about returned content. The trailing numpydoc 'Returns' block restates what the output schema already declares, which is minor redundancy but not wasteful enough to hurt much.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-argument listing tool with an output schema present, the description covers the essential purpose and return content. It identifies the database version (eggNOG 7), which is useful context an agent would otherwise lack.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline for a parameterless tool is 4. No parameter-related misinformation is present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('List downloadable data files from the eggNOG 7 database') and enumerates the content categories (protein sequences, OG info, trees, taxonomic info). It is unambiguous and does not overlap any sibling, though it never explicitly names a sibling to differentiate against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool to call when it needs bulk-download URLs rather than a single record lookup. There is no explicit when-to-use statement, no mention of when NOT to use it, and no reference to alternatives like get_database_stats.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_eggnogA
Search the eggNOG database for proteins or protein families.
Performs a text search across the eggNOG database. The query must be
at least 3 characters long. The query can be a protein name
(e.g. P53), a UniProt ID (e.g. P04637), or a protein family
name.
Parameters
query : str
Search query string (minimum 3 characters).
Examples:
- P53
- P04637
- TP53
- P2RX7
Returns
str JSON string with a list of search results (type, ID, label, URL).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses a real behavioral constraint (3-character minimum) and the shape of results, but says nothing about matching semantics (substring vs exact, case sensitivity), result caps, pagination, or that the operation is read-only and side-effect free.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a one-line statement of what it does, followed by usable detail. The reStructuredText Parameters/Returns blocks duplicate schema information, and the second sentence restates the first, but the overall size is proportionate to a one-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter search tool whose output schema already defines the return structure, the description covers purpose, accepted input forms, and the minimum-length rule. The remaining gap is matching/pagination behavior, which is a modest omission rather than a blocker.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: the single query parameter is documented with a length constraint and four concrete example values spanning gene names and UniProt IDs. Only the exact matching semantics remain unspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: a text search across the eggNOG database for proteins or protein families. It is distinguishable from retrieval siblings like get_protein or get_orthologous_group, though it never explicitly contrasts itself with them or notes that it matches by name/ID text rather than by exact identifier lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete precondition (query must be at least 3 characters) and enumerates acceptable query forms via examples (protein name, UniProt ID, family name). It does not, however, say when to prefer this over get_protein or get_protein_family, nor what happens on no match — usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
annotate_protein - First observed
get_database_stats - First observed
get_og_content - First observed
get_orthologous_group - First observed
get_orthologs - First observed
get_protein - First observed
get_protein_family - First observed
get_taxid_info - First observed
list_downloads - First observed
search_eggnog
TDQS
Scored across 10 tools
Most tools target distinct resources (protein, OG, family, taxid, stats, downloads, search), and descriptions give concrete examples. However, annotate_protein is explicitly a 'convenience wrapper around get_protein' returning overlapping data for the same protein_id, and get_og_content vs get_orthologs/get_protein_family all return species/protein lists with similar shapes, creating mild risk of misselection.
Consistent snake_case verb_noun pattern throughout (get_*, list_*, search_*, annotate_*). Minor terminology drift between 'orthologous_group' and 'orthologs' but the convention is clear and predictable.
10 tools is well-scoped for a read-only database API, with each tool covering a distinct lookup or listing need. No bloat and nothing obviously trivial.
Core lifecycle is well covered: search, protein annotation, OG detail, OG content, orthologs, family, stats, and downloads. Minor gaps remain (no sequence/FASTA retrieval), and get_taxid_info is effectively a stub that only points to a downloadable file rather than returning the taxonomy data.
Maintenance
Related MCP Connectors
Knowledge graph ingestion, entity search, ontology analysis, and CoPass scoring.
Protein analysis: ESM-2/ESMC embeddings, mutation scoring, landscape scans, ESMFold structure.
Official STRING database MCP server. Query for protein-protein interactions, enrichment, annotations, homology, and PPI networks.
Connect AI clients to biomedical data and tools.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables AI assistants to access protein information directly from UniProt, allowing retrieval of protein names, functions, sequences, and organism data by accession number.214MIT

Bio-MCP BLASTofficial
AlicenseNot gradedqualityDmaintenanceEnables AI assistants to perform NCBI BLAST sequence similarity searches through natural language, supporting nucleotide and protein searches, custom database creation, and multiple output formats.10MIT- AlicenseBqualityDmaintenanceProvides access to the STRING protein-protein interaction database for mapping identifiers, retrieving interaction networks, and performing functional enrichment analysis. It enables users to explore protein partners, pathways, and cross-species homology through natural language interactions.91ISC
- AlicenseCqualityFmaintenanceProvides AI-powered access to major biological databases for GWAS and bioinformatics research. Enables natural language queries for protein, gene, variant, pathway, and drug discovery analysis.441MIT