Noctua MCP Server
OfficialClick 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., "@Noctua MCP Server add a basic pathway for insulin signaling to model GO:1234567"
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.
noctua-mcp
MCP server for GO-CAM model editing via the Barista API.
This package provides a thin MCP (Model Context Protocol) wrapper around the noctua-py library, exposing GO-CAM editing capabilities through a standardized interface.
Quick Start
Once published:
uvx noctua-mcpFor development:
uv run noctua-mcp serveRelated MCP server: GeneOntology MCP Server
Docker Deployment
Building the Container
docker build -t noctua-mcp .Running with Docker
docker run -e BARISTA_TOKEN="your-token" noctua-mcpEnvironment Variables
BARISTA_TOKEN: Authentication token for Barista API (required)BARISTA_BASE: Barista base URL (default: http://barista-dev.berkeleybop.org)BARISTA_NAMESPACE: Minerva namespace (default: minerva_public_dev)BARISTA_PROVIDED_BY: Provided-by agent (default: http://geneontology.org)
Smithery.ai Deployment
This server is configured for deployment on smithery.ai using the included smithery.yaml configuration.
How it Works
When installed via smithery.ai, users configure their credentials through their MCP client (like Claude Desktop):
Install the noctua-mcp server from smithery.ai
Configure your
BARISTA_TOKENin your MCP client settingsThe token is passed to the server when it starts
The smithery.yaml configuration:
Defines how users provide their Barista API token
Specifies Docker-based deployment
Uses stdio-based MCP protocol communication
Allows users to optionally configure the Barista server URL and namespace
How MCP Servers Work with Credentials
MCP servers receive configuration from the client (e.g., Claude Desktop, Claude Code), not from environment variables on the server side. This means:
Users provide their credentials in their MCP client configuration
The client passes these credentials to the server when starting it
The server receives credentials as environment variables at startup
This keeps credentials secure and user-specific - each user provides their own API token.
Using with Claude Code
Configure the MCP server: The project includes a
.mcp.jsonconfiguration file that tells Claude Code how to run the server.Set your Barista token in your MCP configuration:
For Claude Desktop, add to your config:
{ "noctua-mcp": { "type": "stdio", "command": "uvx", "args": ["noctua-mcp"], "env": { "BARISTA_TOKEN": "your-barista-token-here" } } }Or set it in your shell before starting Claude Code:
export BARISTA_TOKEN="your-barista-token-here" claude-code /path/to/noctua-mcpVerify the connection: Once Claude Code starts, the MCP server will be available. You can ask Claude to use the Noctua tools to interact with GO-CAM models.
The .mcp.json configuration is already set up to:
Run the server using
uv run noctua-mcpPass through the
BARISTA_TOKENenvironment variableConfigure the default Barista endpoints
Environment Variables
BARISTA_TOKEN(required) – Barista API token for privileged operationsBARISTA_BASE(default: http://barista-dev.berkeleybop.org) – Barista server URLBARISTA_NAMESPACE(default: minerva_public_dev) – Minerva namespaceBARISTA_PROVIDED_BY(default: http://geneontology.org) – Provider identifier
Available Tools
Model Editing
add_individual(model_id, class_curie, assign_var)– Add an instance of a GO/ECO termadd_fact(model_id, subject_id, object_id, predicate_id)– Add a relation between individualsadd_evidence_to_fact(model_id, subject_id, object_id, predicate_id, eco_id, sources, with_from)– Add evidence to a factremove_individual(model_id, individual_id)– Remove an individualremove_fact(model_id, subject_id, object_id, predicate_id)– Remove a fact
Model Patterns
add_basic_pathway(model_id, pathway_curie, mf_curie, gene_product_curie, cc_curie)– Add a basic GO-CAM unitadd_causal_chain(model_id, mf1_curie, mf2_curie, gp1_curie, gp2_curie, causal_relation)– Add causally linked activities
Model Query
get_model(model_id)– Retrieve full model JSONmodel_summary(model_id)– Get model statistics and summary
Configuration
configure_token(token)– Set Barista token at runtime (not echoed)
Architecture
This server is designed as a thin shim layer:
MCP Client (e.g., Claude)
↓
noctua-mcp (this package)
↓
noctua-py library
↓
Barista API / NoctuaAll core logic resides in the noctua-py library. This MCP server only:
Exposes noctua-py functionality through MCP tools
Manages client singleton
Provides prompts for common patterns
Testing
The package includes comprehensive tests:
# Run all tests
uv run pytest
# Run unit tests only
uv run pytest tests/test_unit.py
# Run MCP integration tests
uv run pytest tests/test_mcp.py
# Run with coverage
uv run pytest --cov=noctua_mcp --cov-report=term-missingTests are divided into:
Unit tests (
test_unit.py): Direct function testing with mocksMCP tests (
test_mcp.py): Server startup and tool invocation via FastMCP clientLive tests: Optional tests that require
BARISTA_TOKENand network access
Development
# Install dependencies including noctua-py from local path
uv sync
# Run the server
uv run noctua-mcp serve
# Run tests
uv run pytest
# Type checking
uv run mypy src/
# Linting
uv run ruff check src/Protocol Overview
This project implements an MCP server using FastMCP. MCP (Model Context Protocol) standardizes how tools/resources are exposed to LLMs and agent clients.
Useful links:
Best Practices
stdio transport by default with single entry point
Rich docstrings for all tools (parameters, returns, examples)
No secrets echoed in outputs (Barista token handled securely)
Comprehensive async testing using fastmcp.Client
Thin wrapper pattern - core logic in upstream library
Credits
This project uses the monarch-project-copier template.
Available Tools
18 toolsadd_entity_setA
Add an entity set to a GO-CAM model with validated members.
Creates an entity set (CHEBI:33695 "information biomacromolecule" by default) representing functionally interchangeable entities. Links members using RO:0019003 (has substitutable entity) relation. The operation is atomic - either all members are added successfully or the entire operation is rolled back.
Args: model_id: The GO-CAM model identifier members: List of member dictionaries with keys: - entity_id (required): Entity ID (e.g., "UniProtKB:P12345") - label (optional): Member label for validation - evidence_type (optional): ECO code (e.g., "ECO:0000353") - reference (optional): Source reference (e.g., "PMID:12345678") assign_var: Variable name for the set (default: "set1")
Returns: Barista API response with set ID and member IDs
Examples: # Create a set of functionally equivalent kinases add_entity_set( "gomodel:12345", [ {"entity_id": "UniProtKB:P31749", "label": "AKT1"}, {"entity_id": "UniProtKB:P31751", "label": "AKT2"}, {"entity_id": "UniProtKB:Q9Y243", "label": "AKT3"} ], assign_var="akt_isoforms" )
# Create set with evidence
add_entity_set(
"gomodel:12345",
[
{
"entity_id": "UniProtKB:P04637",
"label": "TP53",
"evidence_type": "ECO:0000314",
"reference": "PMID:87654321"
},
{
"entity_id": "UniProtKB:P04049",
"label": "RAF1",
"evidence_type": "ECO:0000314",
"reference": "PMID:87654321"
}
],
)Notes: - All members must have entity_id specified - Label validation prevents ID hallucination - Evidence and references are optional but recommended - Uses RO:0019003 (has substitutable entity) to link members - Atomic operation with automatic rollback on failure - Entity sets represent functionally interchangeable entities
Inputs: model_id (required), members (required), assign_var. Returns: object
add_evidence_to_factA
Add evidence to an existing fact in a GO-CAM model.
Args: model_id: The GO-CAM model identifier subject_id: Subject of the fact object_id: Object of the fact predicate_id: Predicate of the fact eco_id: Evidence code (e.g., "ECO:0000353") sources: List of source references (e.g., ["PMID:12345"]) with_from: Optional list of with/from references
Returns: Barista API response
Examples: # Add experimental evidence from a paper add_evidence_to_fact( "gomodel:12345", "mf1", "gp1", "RO:0002333", "ECO:0000353", # physical interaction evidence ["PMID:12345678"] )
# Add multiple sources
add_evidence_to_fact(
"gomodel:12345", "mf1", "gp1", "RO:0002333",
"ECO:0000314", # direct assay evidence
["PMID:12345678", "PMID:87654321", "doi:10.1234/example"]
)
# Add evidence with with/from (e.g., for IPI)
add_evidence_to_fact(
"gomodel:12345", "mf1", "gp1", "RO:0002333",
"ECO:0000353", # IPI
["PMID:12345678"],
["UniProtKB:Q9Y6K9", "UniProtKB:P38398"] # interacting partners
)
# Common evidence codes:
# ECO:0000314 - direct assay evidence
# ECO:0000353 - physical interaction evidence (IPI)
# ECO:0000315 - mutant phenotype evidence (IMP)
# ECO:0000316 - genetic interaction evidence (IGI)
# ECO:0000318 - biological aspect of ancestor evidence (IBA)
# ECO:0000269 - experimental evidenceInputs: model_id (required), subject_id (required), object_id (required), predicate_id (required), +3 more. Returns: object
add_factB
Add a fact (edge/relation) between two individuals in a model.
Args: model_id: The GO-CAM model identifier subject_id: Subject individual ID or variable object_id: Object individual ID or variable predicate_id: Relation predicate (e.g., "RO:0002333" for enabled_by)
Returns: Barista API response
Examples: # Connect molecular function to gene product (enabled_by) add_fact("gomodel:12345", "mf1", "gp1", "RO:0002333")
# Connect molecular function to cellular component (occurs_in)
add_fact("gomodel:12345", "mf1", "cc1", "BFO:0000066")
# Connect molecular function to biological process (part_of)
add_fact("gomodel:12345", "mf1", "bp1", "BFO:0000050")
# Add causal relationship between activities
add_fact("gomodel:12345", "mf1", "mf2", "RO:0002411") # causally upstream of
add_fact("gomodel:12345", "mf1", "mf2", "RO:0002629") # directly positively regulates
add_fact("gomodel:12345", "mf1", "mf2", "RO:0002630") # directly negatively regulates
add_fact("gomodel:12345", "mf1", "mf2", "RO:0002413") # provides input for
# Add regulates relationships
add_fact("gomodel:12345", "mf1", "bp1", "RO:0002211") # regulates
add_fact("gomodel:12345", "mf1", "bp1", "RO:0002213") # positively regulates
add_fact("gomodel:12345", "mf1", "bp1", "RO:0002212") # negatively regulates
# Add indirect regulation relationships
add_fact("gomodel:12345", "mf1", "mf2", "RO:0002407") # indirectly positively regulates
add_fact("gomodel:12345", "mf1", "mf2", "RO:0002409") # indirectly negatively regulates
# Add causal relationships with effects
add_fact("gomodel:12345", "mf1", "mf2", "RO:0002304") # causally upstream of, positive effect
add_fact("gomodel:12345", "mf1", "mf2", "RO:0002305") # causally upstream of, negative effect
# Add small molecule regulation relationships
add_fact("gomodel:12345", "sm1", "mf1", "RO:0012005") # is small molecule activator of
add_fact("gomodel:12345", "sm1", "mf1", "RO:0012006") # is small molecule inhibitor of
# Use with existing individual IDs from model
add_fact("gomodel:12345", "gomodel:12345/abc123", "gomodel:12345/def456", "RO:0002333")Inputs: model_id (required), subject_id (required), object_id (required), predicate_id (required). Returns: object
add_individualA
Add an individual (instance) of a class to a GO-CAM model with label validation.
This tool requires providing the expected label for the class to prevent accidental use of wrong IDs (e.g., GO:0003924 vs GO:0003925). The operation will automatically rollback if the created individual doesn't match the expected label.
Args: model_id: The GO-CAM model identifier (e.g., "gomodel:12345") class_curie: The class to instantiate (e.g., "GO:0003674") class_label: The expected rdfs:label of the class (e.g., "molecular_function") assign_var: Variable name for referencing in the same batch
Returns: Barista API response with message-type and signal fields. If validation fails, includes rolled_back=true and validation error.
Examples: # Add a molecular function activity with validation add_individual("gomodel:12345", "GO:0004672", "protein kinase activity", "mf1")
# Add a protein/gene product with validation
add_individual("gomodel:12345", "UniProtKB:P38398", "BRCA1", "gp1")
# Add a cellular component with validation
add_individual("gomodel:12345", "GO:0005737", "cytoplasm", "cc1")
# Add a biological process with validation
add_individual("gomodel:12345", "GO:0016055", "Wnt signaling pathway", "bp1")
# Add an evidence instance with validation
add_individual("gomodel:12345", "ECO:0000353", "physical interaction evidence", "ev1")
# Variables like "mf1", "gp1" can be referenced in subsequent
# add_fact calls within the same batch operationNotes: - The label acts as a checksum to prevent ID hallucination - If the label doesn't match, the operation is automatically rolled back - This prevents corrupt models from incorrect IDs
Inputs: model_id (required), class_curie (required), class_label (required), assign_var. Returns: object
add_protein_complexA
Add a protein complex to a GO-CAM model with validated components.
Creates a protein-containing complex (GO:0032991 by default) and links all components using BFO:0000051 (has part) relation. The operation is atomic - either all components are added successfully or the entire operation is rolled back.
Args: model_id: The GO-CAM model identifier components: List of component dictionaries with keys: - entity_id (required): Protein/gene product ID (e.g., "UniProtKB:P12345") - label (optional): Component label for validation - evidence_type (optional): ECO code (e.g., "ECO:0000353") - reference (optional): Source reference (e.g., "PMID:12345678") assign_var: Variable name for the complex (default: "complex1")
Returns: Barista API response with complex ID and component IDs
Examples: # Create a simple dimer complex add_protein_complex( "gomodel:12345", [ {"entity_id": "UniProtKB:P04637", "label": "TP53"}, {"entity_id": "UniProtKB:P04637", "label": "TP53"} ], )
# Create complex with evidence
add_protein_complex(
"gomodel:12345",
[
{
"entity_id": "UniProtKB:P68400",
"label": "CSNK1A1",
"evidence_type": "ECO:0000353",
"reference": "PMID:12345678"
},
{
"entity_id": "UniProtKB:P49841",
"label": "GSK3B",
"evidence_type": "ECO:0000353",
"reference": "PMID:12345678"
}
],
assign_var="destruction_complex"
)
# Create a complex with specific assignment variable
add_protein_complex(
"gomodel:12345",
[
{"entity_id": "UniProtKB:P62191", "label": "PSMC1"},
{"entity_id": "UniProtKB:P62195", "label": "PSMC5"}
],
assign_var="proteasome"
)Notes: - All components must have entity_id specified - Label validation prevents ID hallucination - Evidence and references are optional but recommended - Uses BFO:0000051 (has part) to link components - Atomic operation with automatic rollback on failure
Inputs: model_id (required), components (required), assign_var. Returns: object
configure_tokenA
Configure the Barista authentication token.
Args: token: The Barista authentication token
Returns: Success status
Inputs: token (required). Returns: object
create_modelA
Create a new empty GO-CAM model.
Args: title: Optional title for the model
Returns: Barista API response containing the new model ID and editor URLs
Examples:
create_model("RAS-RAF signaling pathway")
Notes: - The returned model_id can be used with other tools like add_individual - Models are created in "development" state by default - To add taxon information, use add_individual after creating the model
Inputs: title. Returns: object
get_annotations_for_bioentityA
Get all GO annotations (evidence) for a specific bioentity.
Args: bioentity_id: The bioentity ID (e.g., "UniProtKB:P12345") go_terms: Comma-separated GO terms to filter (includes child terms) evidence_types: Comma-separated evidence codes to filter (e.g., "IDA,IPI") aspect: GO aspect filter - "C", "F", or "P" limit: Maximum number of results (default: 100)
Returns: Dictionary containing: - bioentity_id: The queried bioentity - annotations: List of annotation results - summary: Count by aspect and evidence type
Examples: # Get all annotations for a protein get_annotations_for_bioentity("UniProtKB:P53762")
# Get only experimental evidence
get_annotations_for_bioentity(
"UniProtKB:P53762",
evidence_types="IDA,IPI,IMP"
)
# Get annotations for specific GO terms
get_annotations_for_bioentity(
"UniProtKB:P53762",
go_terms="GO:0005634,GO:0005737"
)
# Get only molecular function annotations
get_annotations_for_bioentity(
"UniProtKB:P53762",
aspect="F"
)Inputs: bioentity_id (required), go_terms, evidence_types, aspect, +1 more. Returns: object
get_guideline_contentA
Fetch specific GO-CAM guideline content.
Args: guideline_name: Name of guideline file (without .md extension). Use list_guidelines() to see available options.
Returns: Dictionary with guideline content or error message
Examples: # Get a specific guideline content = get_guideline_content("E3_ubiquitin_ligases")
# Get transcription factor guidelines
content = get_guideline_content("DNA-binding_transcription_factor_activity_annotation_guidelines")Inputs: guideline_name (required). Returns: object
get_modelA
Retrieve the full JSON representation of a GO-CAM model.
Args: model_id: The GO-CAM model identifier
Returns: Full model data including individuals and facts
Examples: # Get a production model model = get_model("gomodel:5fce9b7300001215") # Returns complete model with: # - data.id: model ID # - data.individuals: list of all individuals # - data.facts: list of all relationships # - data.annotations: model-level annotations
# Extract specific information
model = get_model("gomodel:12345")
individuals = model["data"]["individuals"]
facts = model["data"]["facts"]
# Find all molecular functions
mfs = [i for i in individuals
if any("GO:0003674" in str(e.id) for e in i.type if hasattr(e, 'id'))]
# Find all enabled_by relationships (facts are Pydantic objects)
enabled_by = [f for f in facts if f.property == "RO:0002333"]
# Check model state
state = model["data"].get("state")Inputs: model_id (required). Returns: object
get_model_variablesA
Get the currently bound variables for a GO-CAM model.
Returns a mapping of variable names to their actual individual IDs. This is useful for understanding what variables are available in the current model context, especially after batch operations.
Args: model_id: The GO-CAM model identifier
Returns: Dictionary with variable mappings and model information
Examples: # Get variables after creating individuals vars = get_model_variables("gomodel:12345") # Returns: # { # "model_id": "gomodel:12345", # "variables": { # "mf1": "gomodel:12345/68dee4d300000481", # "gp1": "gomodel:12345/68dee4d300000482", # "cc1": "gomodel:12345/68dee4d300000483" # }, # "individual_count": 3 # }
# Use the variables in subsequent operations
vars = get_model_variables("gomodel:12345")
mf_id = vars["variables"]["mf1"]
add_fact("gomodel:12345", mf_id, vars["variables"]["gp1"], "RO:0002333")Notes: - Variables are only valid within the same batch operation - This tool helps identify actual IDs for cross-batch operations - If the model has no tracked variables, returns empty dict
Inputs: model_id (required). Returns: object
list_guidelinesA
List all available GO-CAM guideline documents.
Returns a list of available guideline names that can be accessed using the get_guideline_content tool.
Returns: Dictionary with 'guidelines' key containing list of available guidelines
Examples: # List all available guidelines result = list_guidelines() for guide in result['guidelines']: print(guide)
Inputs: no named parameters. Returns: object
model_summaryA
Get a summary of a GO-CAM model including counts and key information.
Args: model_id: The GO-CAM model identifier
Returns: Summary with individual count, fact count, and predicate distribution
Examples: # Get summary of a model result = model_summary("gomodel:5fce9b7300001215") # Returns: # { # "model_id": "gomodel:5fce9b7300001215", # "state": "production", # "individual_count": 42, # "fact_count": 67, # "predicate_distribution": { # "RO:0002333": 15, # enabled_by (note: not in vetted list) # "RO:0002411": 8, # causally upstream of # "BFO:0000066": 12, # occurs_in # "BFO:0000050": 5 # part_of # } # }
# Check if a model is empty
result = model_summary("gomodel:new_empty_model")
if result["individual_count"] == 0:
print("Model is empty")
# Analyze model complexity
result = model_summary("gomodel:12345")
causal_edges = result["predicate_distribution"].get("RO:0002411", 0)
causal_edges += result["predicate_distribution"].get("RO:0002413", 0) # provides input for
causal_edges += result["predicate_distribution"].get("RO:0002629", 0) # directly positively regulates
causal_edges += result["predicate_distribution"].get("RO:0002630", 0) # directly negatively regulates
print(f"Model has {causal_edges} causal relationships")Inputs: model_id (required). Returns: object
remove_factA
Remove a fact from a GO-CAM model.
You must specify the exact triple (subject, predicate, object) to remove.
Args: model_id: The GO-CAM model identifier subject_id: Subject of the fact object_id: Object of the fact predicate_id: Predicate of the fact
Returns: Barista API response
Examples: # Remove an enabled_by relationship remove_fact( "gomodel:12345", "gomodel:12345/mf_123", "gomodel:12345/gp_456", "RO:0002333" )
# Remove a causal relationship
remove_fact(
"gomodel:12345",
"gomodel:12345/activity1",
"gomodel:12345/activity2",
"RO:0002413" # provides input for
)
# Remove occurs_in relationship
remove_fact(
"gomodel:12345",
"gomodel:12345/mf_123",
"gomodel:12345/cc_789",
"BFO:0000066" # occurs_in
)
# Remove using variable references (within same batch)
remove_fact("gomodel:12345", "mf1", "gp1", "RO:0002333")Inputs: model_id (required), subject_id (required), object_id (required), predicate_id (required). Returns: object
remove_individualA
Remove an individual from a GO-CAM model.
Note: This will also remove all facts (edges) connected to this individual.
Args: model_id: The GO-CAM model identifier individual_id: The individual to remove
Returns: Barista API response
Examples: # Remove using a variable reference (within same batch) remove_individual("gomodel:12345", "mf1")
# Remove using full individual ID
remove_individual("gomodel:12345", "gomodel:12345/5fce9b7300001215")
# Remove an evidence individual
remove_individual("gomodel:12345", "gomodel:12345/evidence_123")
# Clean up after testing
for ind_id in ["test1", "test2", "test3"]:
remove_individual("gomodel:12345", ind_id)Inputs: model_id (required), individual_id (required). Returns: object
search_annotationsA
Search for GO annotations (evidence) with filtering.
Args: bioentity: Specific bioentity ID to filter by (e.g., "UniProtKB:P12345") go_term: Specific GO term ID to filter by (e.g., "GO:0008150") evidence_types: Comma-separated evidence codes (e.g., "IDA,IPI,IMP") taxon: Organism filter - accepts numeric (9606) or full ID (NCBITaxon:9606) aspect: GO aspect filter - "C" (cellular component), "F" (molecular function), or "P" (biological process) assigned_by: Annotation source filter (e.g., "GOC", "UniProtKB", "MGI") limit: Maximum number of results (default: 10, max: 1000)
Returns: Dictionary containing: - annotations: List of annotation results with evidence details - total: Number of results returned
Examples: # Find all evidence for a specific protein search_annotations(bioentity="UniProtKB:P53762")
# Find proteins with experimental evidence for a GO term
search_annotations(go_term="GO:0005634", evidence_types="IDA,IPI")
# Find human proteins in nucleus with experimental evidence
search_annotations(
go_term="GO:0005634",
taxon="9606",
evidence_types="IDA,IPI,IMP",
aspect="C"
)
# Find all UniProt annotations for apoptosis
search_annotations(
go_term="GO:0006915",
assigned_by="UniProtKB"
)Inputs: bioentity, go_term, evidence_types, taxon, +3 more. Returns: object
search_bioentitiesA
Search for bioentities (genes/proteins) using Gene Ontology data.
Searches across gene and protein names/labels with optional taxonomic filtering. Provides access to comprehensive bioentity information from GOlr.
Args: text: Text search across names and labels (e.g., "insulin", "kinase") taxon: Organism filter - accepts NCBI Taxon ID with or without prefix (e.g., "9606", "NCBITaxon:9606" for human) bioentity_type: Type filter (e.g., "protein", "gene") source: Source database filter (e.g., "UniProtKB", "MGI", "RGD") limit: Maximum number of results to return (default: 10) offset: Starting offset for pagination (default: 0)
Returns: Dictionary containing search results with bioentity information
Examples: # Search for human insulin proteins results = search_bioentities( text="insulin", taxon="9606", bioentity_type="protein" )
# Find mouse kinases from MGI
results = search_bioentities(
text="kinase",
taxon="NCBITaxon:10090",
source="MGI",
limit=20
)
# Search for any human genes/proteins
results = search_bioentities(
taxon="9606",
limit=50
)
# Find specific protein types
results = search_bioentities(
text="receptor",
bioentity_type="protein",
limit=25
)
# Search across all organisms
results = search_bioentities(text="p53")
# Pagination example
page1 = search_bioentities(text="kinase", limit=10, offset=0)
page2 = search_bioentities(text="kinase", limit=10, offset=10)
# Common organisms:
# Human: "9606" or "NCBITaxon:9606"
# Mouse: "10090" or "NCBITaxon:10090"
# Rat: "10116" or "NCBITaxon:10116"
# Fly: "7227" or "NCBITaxon:7227"
# Worm: "6239" or "NCBITaxon:6239"
# Yeast: "559292" or "NCBITaxon:559292"Notes: - Results include ID, name, type, organism, and source information - Text search covers both short names/symbols and full descriptions - Taxon IDs automatically handle NCBITaxon: prefix normalization - Use pagination for large result sets - Sources include UniProtKB, MGI, RGD, ZFIN, SGD, and others
Inputs: text, taxon, bioentity_type, source, +2 more. Returns: object
search_modelsA
Search for GO-CAM models based on various criteria.
Allows searching models by title, state, contributor, group, publication, or gene product. Returns a list of matching models with their metadata.
Args: title: Search for models containing this text in their title state: Filter by model state (production, development, internal_test) contributor: Filter by contributor ORCID (e.g., 'https://orcid.org/0000-0002-6601-2165') group: Filter by group/provider (e.g., 'http://www.wormbase.org') pmid: Filter by PubMed ID (e.g., 'PMID:12345678') gene_product: Filter by gene product (e.g., 'UniProtKB:Q9BRQ8', 'MGI:MGI:97490') limit: Maximum number of results to return (default: 50) offset: Offset for pagination (default: 0)
Returns: Dictionary containing search results with model metadata
Examples: # Search for all production models results = search_models(state="production")
# Find models containing "Wnt signaling" in title
results = search_models(title="Wnt signaling")
# Find models for a specific gene product
results = search_models(gene_product="UniProtKB:P38398")
# Find models from a specific paper
results = search_models(pmid="PMID:30194302")
# Find models by a specific contributor
results = search_models(
contributor="https://orcid.org/0000-0002-6601-2165"
)
# Combine filters
results = search_models(
state="production",
title="kinase",
limit=10
)
# Pagination example
page1 = search_models(limit=50, offset=0)
page2 = search_models(limit=50, offset=50)
# Find models from specific research group
results = search_models(group="http://www.wormbase.org")
# Search for development models with specific gene
results = search_models(
state="development",
gene_product="MGI:MGI:97490"
)Notes: - Results include model ID, title, state, contributors, and dates - Use pagination (offset/limit) for large result sets - Filters can be combined for more specific searches - Gene products can be from various databases (UniProt, MGI, RGD, etc.)
Inputs: title, state, contributor, group, +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 18 tools
Each tool has a clearly distinct purpose. Overlaps like add_entity_set vs add_protein_complex are well-differentiated by descriptions, and search_annotations vs get_annotations_for_bioentity serve different use cases. No tools are truly interchangeable.
All tools follow snake_case with a consistent verb_noun pattern (e.g., create_model, add_fact, remove_individual, search_models). No mixing of styles or cryptic abbreviations.
The 18 tools cover the full lifecycle of GO-CAM model creation, editing, querying, and searching without being excessive. Each tool addresses a specific need in the domain.
The tool set covers essential CRUD operations and queries but lacks tools for updating model state or modifying existing individuals/facts. Minor gaps exist but core modeling workflows are well supported.
Maintenance
Related MCP Connectors
Manage products, EU Digital Product Passports, operator parties, and GS1 EPCIS supply-chain events.
Knowledge graph ingestion, entity search, ontology analysis, and CoPass scoring.
Knowledge graph ingestion, entity search, ontology analysis, and CoSync scoring.
Search biomedical papers, inspect publication records, and traverse citation or semantic graphs.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA Model-Context-Protocol server that enables AI assistants to create, edit, and manage Web Ontology Language (OWL) ontologies through function calls using OWL functional syntax.21-
- AlicenseBqualityDmaintenanceA comprehensive Model Context Protocol server for accessing Gene Ontology (GO) data, enabling AI systems to perform ontology-based analysis, gene annotation research, and functional enrichment studies.43 npm7MIT
- AlicenseBqualityDmaintenanceA production-ready Model Context Protocol (MCP) server that provides comprehensive access to the BioOntology API for searching, annotating, and exploring over 1,200 biological ontologies.1010MIT
- AlicenseNot gradedqualityDmaintenanceEnables creation and management of knowledge graphs with entities, relationships, and observations through HTTP streaming. Supports persistent storage, search functionality, and CRUD operations for building and querying interconnected knowledge bases.2MIT