Skip to main content
Glama
Noctua MCP Server

Noctua MCP Server

Official
by geneontology

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-mcp

For development:

uv run noctua-mcp serve

Related 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-mcp

Environment Variables

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):

  1. Install the noctua-mcp server from smithery.ai

  2. Configure your BARISTA_TOKEN in your MCP client settings

  3. The 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:

  1. Users provide their credentials in their MCP client configuration

  2. The client passes these credentials to the server when starting it

  3. 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

  1. Configure the MCP server: The project includes a .mcp.json configuration file that tells Claude Code how to run the server.

  2. 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-mcp
  3. Verify 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-mcp

  • Pass through the BARISTA_TOKEN environment variable

  • Configure the default Barista endpoints

Environment Variables

  • BARISTA_TOKEN (required) – Barista API token for privileged operations

  • BARISTA_BASE (default: http://barista-dev.berkeleybop.org) – Barista server URL

  • BARISTA_NAMESPACE (default: minerva_public_dev) – Minerva namespace

  • BARISTA_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 term

  • add_fact(model_id, subject_id, object_id, predicate_id) – Add a relation between individuals

  • add_evidence_to_fact(model_id, subject_id, object_id, predicate_id, eco_id, sources, with_from) – Add evidence to a fact

  • remove_individual(model_id, individual_id) – Remove an individual

  • remove_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 unit

  • add_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 JSON

  • model_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 / Noctua

All core logic resides in the noctua-py library. This MCP server only:

  1. Exposes noctua-py functionality through MCP tools

  2. Manages client singleton

  3. 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-missing

Tests are divided into:

  • Unit tests (test_unit.py): Direct function testing with mocks

  • MCP tests (test_mcp.py): Server startup and tool invocation via FastMCP client

  • Live tests: Optional tests that require BARISTA_TOKEN and 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 tools
add_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 evidence

Inputs: 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 operation

Notes: - 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

    A4.1/5.0

    Scored across 18 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count5/5

    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.

    Completeness4/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers