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 Serveradd 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
| Name | Required | Description | Default |
|---|---|---|---|
| model_id | Yes | ||
| members | Yes | ||
| assign_var | No | set1 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses atomicity, default CHEBI term, specific relation (RO:0019003), and validation. It does not mention side effects or permissions, but for a creation tool, it is adequately transparent.
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 description is well-structured with sections (overview, args, examples, notes) and front-loads the purpose. It is slightly lengthy but every sentence adds value. Minimal redundancy.
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?
Given the lack of annotations and loose schema for members, the description is quite complete. It explains the return value (Barista API response with IDs) and provides examples. It covers all needed context for using the tool.
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 input schema has 0% description coverage, so the description compensates fully. It details each parameter: model_id, members (with nested keys), and assign_var. Examples show exact usage patterns, adding significant meaning beyond 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 clearly states the tool's purpose: adding an entity set to a GO-CAM model with validated members. It specifies the action, resource, and key characteristics (atomic operation, RO relation), and differentiates from sibling tools like add_individual and add_protein_complex by emphasizing functionally interchangeable entities.
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?
The description provides usage guidance through the 'Notes' section, including required fields, validation, and atomicity. Examples illustrate typical use cases. However, it does not explicitly state when NOT to use this tool or compare directly to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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| Name | Required | Description | Default |
|---|---|---|---|
| model_id | Yes | ||
| subject_id | Yes | ||
| object_id | Yes | ||
| predicate_id | Yes | ||
| eco_id | Yes | ||
| sources | Yes | ||
| with_from | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It mentions the tool adds evidence (mutation) and returns a Barista API response, but lacks details on side effects, idempotency, or permissions. The return value is vague.
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?
Well-structured with clear sections (short description, Args, Returns, Examples, Common codes). The examples add value, but the list of common codes is somewhat lengthy. Overall, efficient but slightly verbose.
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?
Given 7 parameters, no annotations, and an output schema that isn't detailed, the description covers the core functionality well with examples and common codes. Lacks edge cases or error handling, but adequate for most uses.
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 description must compensate. It lists all parameters in Args with brief descriptions and provides concrete examples showing their usage. However, individual parameter details (e.g., formats, constraints) are minimal.
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 the action ('Add evidence to an existing fact') and the resource (GO-CAM model), distinguishing it from sibling tools like 'add_fact' which likely adds a fact itself.
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?
Examples cover common use cases (single/multiple sources, with/from), and common evidence codes are listed. However, no explicit guidance on when not to use this tool (e.g., if fact doesn't exist) or alternatives beyond what is implicitly suggested.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")| Name | Required | Description | Default |
|---|---|---|---|
| model_id | Yes | ||
| subject_id | Yes | ||
| object_id | Yes | ||
| predicate_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey behavioral traits. It mentions 'Add a fact' and provides examples, but does not disclose whether facts can be duplicated, whether the operation is idempotent, or what happens on conflict. The return value is vaguely described as 'Barista API response'.
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 clearly states the purpose, but the description is overly long with many repetitive examples. It could be more concise by summarizing common patterns instead of listing many specific cases.
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?
The description covers many use cases through examples but does not mention error handling, the effect of existing facts, or details about the output schema (which exists but is not described). It provides enough for common scenarios but lacks completeness.
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 input schema has 0% description coverage, but the description compensates with extensive examples showing valid parameter values, especially for predicate_id with many RO identifiers. This adds significant meaning beyond the bare 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 clearly states 'Add a fact (edge/relation) between two individuals in a model', using a specific verb and resource. It distinguishes from sibling tools like 'add_individual' and 'remove_fact' through examples and the nature of the operation.
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?
The description does not explicitly state when to use this tool versus alternatives (e.g., 'remove_fact' or 'add_evidence_to_fact'). It provides examples but no context about prerequisites, conditions, or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| model_id | Yes | ||
| class_curie | Yes | ||
| class_label | Yes | ||
| assign_var | No | x1 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description fully discloses behavior: automatic rollback on label mismatch, validation logic, return fields including rolled_back. This goes beyond minimal requirements.
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?
Description is structured with sections (Args, Returns, Examples, Notes) and is front-loaded with purpose. Some redundancy in examples, but overall efficient for a complex 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?
Given no annotations and 4 parameters, description covers all essential aspects: validation, rollback, variable referencing, response structure. Output schema exists, so return values are supplemented.
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%, but description compensates with detailed Args section explaining each parameter, including label as checksum and assign_var for referencing. Examples further clarify usage.
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?
Description clearly states the verb 'add' and resource 'individual (instance) of a class' for GO-CAM models, with label validation. Distinguishes from sibling tools like add_protein_complex and add_entity_set by specifying validation behavior.
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?
Explains when to use: adding an individual with label validation to prevent wrong IDs. Provides examples for various types. Does not explicitly mention when not to use or compare to alternatives, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| model_id | Yes | ||
| components | Yes | ||
| assign_var | No | complex1 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: atomicity, automatic rollback, use of BFO:0000051 relation, and label validation to prevent hallucination. It does not cover authentication or rate limits but sufficiently describes core behavior.
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 description is well-structured with sections (Args, Returns, Examples, Notes) but is relatively long with multiple examples that are partially redundant. It could be more concise while retaining essential 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?
Given the tool's complexity (3 parameters, nested array), the description covers all input parameters, behavior, and return value. It lacks details on error responses beyond rollback but is otherwise thorough.
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 input schema has 0% description coverage, but the description adds extensive meaning: it explains model_id, components dictionary keys (entity_id required, label, evidence_type, reference optional), and assign_var default. Examples further clarify usage.
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 specifies the verb 'add', the resource 'protein complex to a GO-CAM model', and includes details like default type GO:0032991 and relation BFO:0000051. It distinctively describes a specific operation not covered by sibling tools like add_entity_set.
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?
The description explains when to use this tool (to add protein complexes), describes its atomic behavior, and provides parameter details. However, it does not explicitly state when not to use it or mention alternative tools for different entity sets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_tokenA
Configure the Barista authentication token.
Args: token: The Barista authentication token
Returns: Success status
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 discloses minimal behavioral information (configuring a token, returning success status) but does not mention side effects, persistence, or idempotency.
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 description is concise, with only necessary lines describing purpose, argument, and return. It is front-loaded with the purpose and uses a clear Args/Returns structure with no wasted words.
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?
Given the tool's simplicity (one parameter, output schema exists), the description is mostly complete. It mentions the return value, but could optionally note whether the token is persisted or used in subsequent requests.
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 description adds meaning by specifying that the token is a 'Barista authentication token,' which goes beyond the type 'string' and clarifies its purpose.
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 the tool configures the Barista authentication token, which is a specific verb+resource. It distinguishes itself from sibling tools that are primarily about data manipulation, search, or model management.
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?
The description provides no guidance on when to use this tool versus alternatives, such as prerequisites or usage context. It only states the argument and return value.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| title | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses that models are created in 'development' state by default, describes return format (model ID and editor URLs), and suggests post-creation steps. This is good behavioral transparency.
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?
Concise and well-structured with Args, Returns, Examples, and Notes sections. Every sentence adds value. No redundancy.
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?
Given the tool's simplicity (1 optional param, output schema exists), the description is complete. It covers creation, default state, return value, and next steps. No 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?
Only one optional parameter (title) with 0% schema coverage. The description adds meaning: explains title is optional, gives example usage, and notes default behavior. It compensates well for the schema gap.
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 'Create a new empty GO-CAM model' using a specific verb and resource. It distinguishes from sibling tools like add_individual or add_fact, which operate on existing models.
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?
Provides context on using the tool: models are created in 'development' state, and taxon can be added later with add_individual. Includes an example. Lacks explicit when-not-to-use or comparisons with other model-creation tools, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"
)| Name | Required | Description | Default |
|---|---|---|---|
| bioentity_id | Yes | ||
| go_terms | No | ||
| evidence_types | No | ||
| aspect | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It details input parameters, output structure (Dictionary with bioentity_id, annotations, summary), and default limit. However, it does not mention read-only behavior, error handling, or performance traits.
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 description is well-structured with a brief introductory line, Arg/Returns sections, and examples. It is concise without redundancy, front-loading the core purpose.
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?
The description covers the main behavior and return structure. Missing occasional details like pagination beyond the limit parameter or error conditions, but sufficient for a standard retrieval tool.
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?
With 0% schema description coverage, the description fully compensates by explaining each parameter's purpose, format (e.g., 'Comma-separated GO terms'), and default values. Examples illustrate valid inputs for all parameters.
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 explicitly states 'Get all GO annotations (evidence) for a specific bioentity', using a specific verb and resource. It is distinct from sibling tools like search_annotations which imply broader searches.
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?
The description provides examples showing typical usage but does not explicitly state when to use this tool versus alternatives like search_annotations or add_evidence_to_fact. Usage is implied through the examples and parameter descriptions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")| Name | Required | Description | Default |
|---|---|---|---|
| guideline_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry behavioral disclosure. It mentions the return type (dictionary with content or error) but lacks details on side effects, authentication needs, or rate limits. The read-only nature is implicit but not explicit.
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 description is well-structured with Args, Returns, and Examples sections. It is front-loaded with the purpose. While each sentence adds value, the examples could be slightly more concise without loss of clarity.
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?
Given the tool's low complexity (one string parameter) and the existence of an output schema, the description provides sufficient context. It references the sibling list_guidelines and describes the return type. No major gaps are present.
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 schema has 0% description coverage, but the description adds substantial meaning: the parameter is a filename without extension and suggests using list_guidelines() for options. This goes beyond the schema's bare type information.
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 explicitly states 'Fetch specific GO-CAM guideline content,' providing a clear verb and resource. It distinguishes itself from the sibling tool 'list_guidelines' by focusing on content retrieval given a name.
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?
The description advises using list_guidelines() to see available options, offering clear prerequisite guidance. However, it does not explicitly state when not to use this tool or discuss alternatives beyond the sister tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")| Name | Required | Description | Default |
|---|---|---|---|
| model_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 describes the return structure (individuals, facts, annotations) but does not disclose whether the operation is read-only, has side effects, requires authentication, or has rate limits. The examples imply idempotency, but this is not explicit. Additional behavioral context beyond the schema is minimal.
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 description is well-structured with sections (summary, Args, Returns, Examples) and front-loads the purpose. However, it is verbose with multiple lengthy code examples that repeat similar patterns. Some examples could be condensed without losing clarity, making it less concise than ideal.
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?
Given only one parameter and no annotations, the description provides a thorough explanation of the return structure (individuals, facts, annotations) and usage patterns. It includes examples of extracting specific data. However, it lacks information about error handling, invalid model IDs, or any prerequisites. Overall, it is mostly complete for a retrieval tool.
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%, but the description compensates by providing a clear 'Args' section: 'model_id: The GO-CAM model identifier'. It also shows the expected format in examples ('gomodel:5fce9b7300001215'), adding meaning beyond the schema field name. The single parameter is well-documented with both purpose and format.
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 'Retrieve the full JSON representation of a GO-CAM model.' It specifies the verb (retrieve), resource (GO-CAM model), and format (full JSON). The examples further clarify the exact output structure. This distinguishes it from sibling tools like 'create_model' and 'model_summary' by being a pure retrieval operation.
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?
The description includes an 'Args' section and detailed examples, showing how to use the tool. However, it does not explicitly state when to use this tool versus alternatives like 'get_model_variables' or 'model_summary'. No when-not-to-use guidance or prerequisites are provided, leaving the agent to infer from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| model_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It details the return structure (model_id, variables mapping, individual_count), describes edge cases (empty dict if no variables), and implies a read-only operation. It does not explicitly state that no model modifications occur, but this is clear from context.
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 description is well-structured with clear sections (short intro, args, returns, examples, notes). Every sentence adds value, and the information is front-loaded. No redundant content.
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?
The tool is simple (one required parameter) and the description covers usage, parameter semantics, return format with examples, and important notes about variable scoping. Given the output schema exists, the description provides sufficient completeness.
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 add parameter meaning. It explicitly defines 'model_id: The GO-CAM model identifier' in the args section and demonstrates usage with examples, fully compensating for the lack of schema descriptions.
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 'Get the currently bound variables for a GO-CAM model,' specifying the action (get) and resource (variables of a model). It distinguishes from sibling tools like add_fact or remove_individual by focusing on variable retrieval.
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?
The description provides examples and notes explaining when to use this tool (after batch operations, to identify actual IDs for cross-batch operations). It notes that variables are valid only within the same batch operation, but does not explicitly state when not to use it or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It clearly indicates a read-only list operation, returns a dictionary with a 'guidelines' key, and includes an example. No hidden side effects or destructive behavior is implied.
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 description is well-structured with a brief purpose, return description, and code example. The example is helpful but adds a few lines; it could be trimmed slightly without losing clarity.
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?
Given zero parameters and the presence of an output schema, the description covers necessary context: what the tool does, what it returns, and how it connects to a sibling tool. It is complete for a simple listing tool.
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?
There are zero parameters and input schema coverage is 100%. The description adds value by explaining the return structure and usage, but param semantics are inherently complete due to no parameters.
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 'List all available GO-CAM guideline documents' with a specific verb and resource. It also mentions the return type and links to a sibling tool (get_guideline_content), but does not explicitly differentiate from siblings like add_entity_set or search_models, leaving some ambiguity.
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?
The description hints at usage by stating the returned list can be used with get_guideline_content, but it lacks explicit when-to-use guidance or exclusion conditions. There is no mention of alternatives or when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")| Name | Required | Description | Default |
|---|---|---|---|
| model_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavior. It indicates a read operation and shows the return structure via examples. However, it does not mention authentication requirements, rate limits, or any side effects. The transparency is adequate but incomplete.
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 description is relatively long due to extensive examples and a docstring format. While structured with Args, Returns, and Examples sections, it could be more concise by reducing example redundancy. The essential information is present but at the cost of brevity.
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?
Given the tool has an output schema (indicated by context signals), the description's return value explanation via examples is sufficient. For a simple retrieval tool with one parameter, the description covers the model ID input and key output fields. No critical gaps are apparent.
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 input schema has zero description coverage (no property descriptions), but the tool's description includes an Args section that defines the parameter `model_id` as 'The GO-CAM model identifier'. This adds meaningful context beyond the schema's type-only definition. Examples further illustrate usage.
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 the tool returns a summary of a GO-CAM model with counts and key information. It specifies the resource (GO-CAM model) and action (get summary), making the purpose clear. However, it does not explicitly differentiate from the sibling 'get_model' tool, leaving potential ambiguity about when to use this vs. the full model retrieval.
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?
The description provides multiple examples that implicitly guide usage, such as checking if a model is empty or analyzing complexity. However, it lacks explicit when-to-use or when-not-to-use guidance, nor does it mention alternatives. The usage context is implied but not formally stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")| Name | Required | Description | Default |
|---|---|---|---|
| model_id | Yes | ||
| subject_id | Yes | ||
| object_id | Yes | ||
| predicate_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral traits. It only states the action, the need for an exact triple, and returns a Barista API response. It does not disclose side effects, error handling, or authorization needs.
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 description is concise, well-structured with Args, Returns, and multiple examples. Every section adds value without redundancy.
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?
Covers the core operation, parameters, and examples thoroughly. Has an output schema (though not detailed here) which helps with return values. Slight gap: no mention of error conditions or handling of non-existent facts.
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?
Despite 0% schema description coverage, the description lists all four parameters in the Args section with brief explanations and uses examples to illustrate usage. This adds meaningful context beyond the raw 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?
Clearly states the action ('Remove a fact from a GO-CAM model') with a specific verb and resource. Distinguishes from siblings like add_fact or remove_individual.
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?
Explicitly requires the exact triple (subject, predicate, object) and provides examples for different fact types. Does not explicitly state when not to use it but context from examples and siblings is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)| Name | Required | Description | Default |
|---|---|---|---|
| model_id | Yes | ||
| individual_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explicitly states that removing an individual also removes all connected facts (edges), which is a critical behavioral trait. It also provides examples showing different formats for the individual_id. However, it does not mention permissions, reversibility, or other side effects like cascading to dependent individuals or model integrity constraints.
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 description is well-structured with a lead sentence, a critical note, then Args/Returns/Examples. It is somewhat lengthy due to multiple examples, but each example adds value by illustrating common patterns. It could be slightly more concise, but the examples justify the length.
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?
The description covers the core purpose, cascading behavior, parameter formats, and return value. It lacks information about error handling, prerequisites (e.g., model existence), and whether the operation is reversible. Given the simple parameters and presence of an output schema, it is nearly complete but missing some edge-case context.
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 schema description coverage is 0%, so the description must bear the load. It includes an Args section explaining both parameters and provides rich examples showing multiple valid formats for individual_id (variable reference, full ID, evidence individual). This goes far beyond the schema's minimal info and clarifies usage patterns.
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 the action ('Remove an individual from a GO-CAM model') and notes the cascading removal of connected facts. This differentiates it from sibling tools like remove_fact (which removes a single fact) and add_individual (which adds). The verb and resource are specific, and the note adds crucial context.
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?
The description implicitly tells when to use this tool (when you want to remove an individual and all its edges) but does not explicitly state when to prefer it over alternatives like remove_fact or add_individual. The examples show usage but lack explicit 'use when' or 'do not use when' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"
)| Name | Required | Description | Default |
|---|---|---|---|
| bioentity | No | ||
| go_term | No | ||
| evidence_types | No | ||
| taxon | No | ||
| aspect | No | ||
| assigned_by | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does not explicitly state that the operation is read-only or safe, though the verb 'search' implies it. The return format is described, but missing details like authentication requirements or rate limits. The description provides useful context but lacks a full safety profile.
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 description is well-structured with an opening purpose sentence, 'Args' section, 'Returns' section, and multiple examples. Every sentence adds value, and the examples are particularly helpful for understanding parameter interaction. Despite length, it is efficiently organized and front-loaded.
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?
Given the high parameter count (7), 0% schema description coverage, no annotations, and presence of an output schema, the description is remarkably complete. It covers all parameters with semantics, defaults, examples, and return format, leaving minimal gaps for the agent to guess.
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 fully compensate. It explains each of the 7 parameters in clear language with valid values (e.g., taxon accepts '9606' or 'NCBITaxon:9606', aspect accepts 'C','F','P'), defaults (limit default 10, max 1000), and includes multiple examples demonstrating usage. This adds significant meaning beyond the bare 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 states 'Search for GO annotations (evidence) with filtering,' clearly identifying the verb (search) and resource (GO annotations). The examples further clarify the filtering capability, making the purpose specific and distinguishable from siblings like 'get_annotations_for_bioentity' which likely retrieves annotations for a specific entity without the same filtering options.
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?
The description includes multiple detailed examples showing when to use various parameter combinations, such as filtering by bioentity, GO term, evidence types, taxon, and aspect. However, it does not explicitly address when not to use this tool or mention alternatives like 'get_annotations_for_bioentity', leaving some ambiguity for the agent to decide between similar tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| taxon | No | ||
| bioentity_type | No | ||
| source | No | ||
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full burden. It discloses use of GOlr, result fields (ID, name, type, organism, source), taxon prefix normalization, and pagination. Minor omission: no mention of behavior on empty results or potential performance/rate limits.
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 description is somewhat long due to many examples and a notes section, but it is well-structured with Args, Returns, Examples, and Notes. It is front-loaded with the purpose sentence. Could trim redundant example phrases, but still concise enough.
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?
Given 6 parameters (none required) and no annotations, the description covers essential behavior: input details, examples, output structure (dictionary with bioentity info), pagination, and common organisms. However, it does not detail the output schema fields despite the tool having one, and could mention error handling.
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%, but the description provides detailed meaning for all 6 parameters: 'text' is described as text search across names/labels, 'taxon' as organism filter with prefix handling, 'bioentity_type' as type filter, 'source' as database filter, 'limit' and 'offset' for pagination. Examples reinforce usage.
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 it searches for bioentities (genes/proteins) using Gene Ontology data. It specifies the verb 'search' and the resource 'bioentities', distinguishing it from sibling tools like search_annotations which focus on annotations.
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?
The description provides extensive examples covering various use cases (e.g., by taxon, type, source) and explicit pagination guidance. It implicitly differentiates from siblings (e.g., search_annotations for annotation-based queries) but lacks direct 'when not to use' statements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.)
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| state | No | ||
| contributor | No | ||
| group | No | ||
| pmid | No | ||
| gene_product | No | ||
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully describes the tool's behavior: it performs a search, returns a dictionary with model metadata, and supports pagination. It notes that results include specific fields. No destructive actions mentioned, which is appropriate for a search 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?
The description is well-structured with sections (Args, Returns, Examples, Notes) and is thorough. However, it is somewhat lengthy with many examples; it could be slightly more concise without losing clarity.
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?
Given the presence of an output schema (context signal), the description adequately covers the return value ('dictionary with model metadata') and mentions fields included. All parameters are fully documented with examples, making it complete.
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 description provides detailed explanations for all 8 parameters, including expected formats (e.g., ORCID, UniProtKB) and default values. It includes multiple examples demonstrating parameter usage, compensating for the 0% schema description coverage.
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 'Search for GO-CAM models based on various criteria' and lists specific filtering options (title, state, contributor, etc.). It distinguishes this tool from sibling tools like 'search_annotations' and 'search_bioentities' by focusing on models.
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?
The description includes explicit examples of when to use each filter and pagination. It provides notes on combining filters and using pagination for large result sets. However, it does not explicitly state when not to use this tool or compare it to alternative search tools.
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.
18 tool updates
- First observed
add_entity_set - First observed
add_evidence_to_fact - First observed
add_fact - First observed
add_individual - First observed
add_protein_complex - First observed
configure_token - First observed
create_model - First observed
get_annotations_for_bioentity - First observed
get_guideline_content - First observed
get_model - First observed
get_model_variables - First observed
list_guidelines - First observed
model_summary - First observed
remove_fact - First observed
remove_individual - First observed
search_annotations - First observed
search_bioentities - First observed
search_models
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 gradedqualityCmaintenanceA 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.19-
- 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.45 npm8MIT
- FlicenseBqualityDmaintenanceA 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.109-
- FlicenseNot 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.2-