Skip to main content
Glama

AOP MCP Server

CI DOI License Release Python

Part of ToxMCP Suite → https://github.com/ToxMCP/toxmcp

Public MCP endpoint for Adverse Outcome Pathway (AOP) discovery, scientific review, and draft-to-publication workflows.
Expose AOP-Wiki, AOP-DB, CompTox, semantic tooling, quantitative review helpers, and draft review/export flows to any MCP-aware agent (Codex CLI, Gemini CLI, Claude Code, etc.).

Architecture

flowchart LR
    subgraph Clients["Clients and Agents"]
        Codex["Codex CLI / Desktop"]
        Gemini["Gemini CLI"]
        Claude["Claude Code"]
        Scripts["Scripts / notebooks"]
    end

    subgraph API["FastAPI MCP Service"]
        Router["HTTP entrypoints\n/health and /mcp"]
        Registry["Tool registry\ninputSchema + outputSchema"]
        Tools["Tool handlers\nread, review, assay, draft"]
    end

    subgraph Semantics["Semantic and Contract Layer"]
        Normalizers["OECD-aligned normalizers\nontology terms, applicability,\nevidence blocks, provenance"]
        Contracts["JSON Schemas\n/docs/contracts/schemas"]
    end

    subgraph Adapters["External Adapters"]
        AOPWiki["AOP-Wiki RDF / SPARQL"]
        AOPDB["AOP-DB SPARQL"]
        CompTox["EPA CompTox\nDashboard + CTX APIs"]
    end

    subgraph Authoring["Draft and Authoring Path"]
        Drafts["Draft graph store\nKE / KER / stressor edits"]
        Validation["OECD draft validation\ncompleteness checks"]
    end

    subgraph Offline["Offline and QA Paths"]
        Fixtures["Fixture fallback\nAOP_MCP_ENABLE_FIXTURE_FALLBACK=1"]
        Tests["Pytest + MCP smoke\nschema regression checks"]
    end

    Clients --> Router
    Router --> Registry
    Registry --> Tools
    Tools --> Normalizers
    Normalizers --> Contracts
    Tools --> AOPWiki
    Tools --> AOPDB
    Tools --> CompTox
    Tools --> Drafts
    Drafts --> Validation
    Tools -. fixture mode .-> Fixtures
    Contracts --> Tests
    Fixtures --> Tests

The current implementation follows a layered model:

  • FastAPI + JSON-RPC expose /mcp and /health, and keep transport concerns separate from domain logic.

  • Tool handlers are the agent-facing API. They validate inputs, call adapters, and emit structured responses with JSON Schemas.

  • Semantic normalizers reshape upstream RDF/API payloads into OECD-aligned objects such as event_components, applicability, evidence_blocks, and provenance.

  • Adapters isolate AOP-Wiki, AOP-DB, and CompTox specifics so upstream changes do not leak into MCP contracts.

  • Draft tooling remains separate from the read/review path, which keeps pathway evidence, assay discovery, and authoring concerns from collapsing into one surface.

  • Fixture fallback + smoke tests let the server degrade cleanly in offline development and keep the public MCP contract regression-tested.

See docs/architecture.md for the fuller narrative and docs/contracts/oecd-aligned-schema.md for the OECD read-contract targets that now shape get_aop, get_key_event, get_ker, and assess_aop_confidence. For task-oriented walkthroughs, see docs/quickstarts/README.md, especially docs/quickstarts/oecd-draft-authoring.md for the governed draft essentiality flow.

Related MCP server: tox-antitargets-mcp-server

MCP SDK2 support

Version 0.10.0 introduced MCP SDK 2.2.0 and protocol 2026-07-28, preserving the existing legacy HTTP handler, tool schemas and scientific workflows. It also provides optional aop-mcp-stdio. See migration and hosting instructions.

The 0.10.1 patch candidate fixes confidence assessment for pathways with no KERs and includes the merged legacy capability-discovery correction. It retains all 42 tools and represents missing evidence as explicit gaps.

For modern HTTP clients behind a gateway, set AOP_MCP_ALLOWED_HOSTS to the authority clients send (for example aop.example.org). Its default is the loopback allowlist. AOP_MCP_ALLOWED_ORIGINS remains the existing browser Origin boundary; configure both for hosted use.

What's new in v0.9.2

  • Ship the installed-wheel schema, template and fixture repairs, strict local-origin validation, and complete locked dependency auditing.

  • Preserve the existing scientific contracts and research qualification boundaries.

What's new in v0.9.1

  • Automatic source labels - every tool result now includes a visible Sources: section plus machine-readable _meta.sources, while scientific structuredContent remains schema-compatible.

  • Source-aware initialization - the MCP handshake instructs assistants to preserve MCP source labels and distinguish them from separate web-search results.

  • Safer local setup - normal quickstarts bind to 127.0.0.1, avoid development auto-reload, and include an immediate AOP search demo.

What's new in v0.9.0

  • Research-grade trust layer - added a documented trust and auditability model for draft replay, durable MCP tool-call audit logs, bounded audit evidence export, and explicit regulatory limits.

  • Registry handoff support - added review_registry_handoff_bundle and attach_registry_handoff_to_draft, and now surface imported Registry support plus limitations inside normal draft review bundles and artifacts.

  • Durable MCP audit evidence - added optional AOP_MCP_AUDIT_LOG_PATH JSONL persistence, hash-chain verification with verify_tool_call_audit_log, recent process-local audit inspection with list_tool_call_audit_records, and bounded durable evidence export with export_tool_call_audit_log_evidence.

  • Replay package reproducibility - export_draft_replay_package now includes draft integrity, external support, saved artifact verification, audit persistence status, recent audit records, and a runtime_manifest with server/runtime/config posture, schema hashes, tool catalog hash, and best-effort git commit.

  • Trust docs and scenarios - added docs/trust-auditability.md, docs/evaluations/trust-scenarios.md, and README/tool-catalog guidance for reproducing and reviewing the audit trail.

What's new in v0.8.2

  • Hardened SPARQL query construction (AOP-01) — replaced unsafe template.format(**params) interpolation with TemplateCatalog.render_safe(), which escapes string literals, validates URI schemes, and separates trusted structural fragments from user-facing parameters. Fixed a CAS-URI injection path in map_chemical_to_aops.

  • Added circuit-breaker resilience (AOP-02) — per-endpoint circuit breaker with CLOSED/OPEN/HALF_OPEN states, exponential backoff + jitter between retries, and immediate surfacing of non-retryable 4xx errors.

  • Strengthened draft audit chain (AOP-03 / AOP-04) — VersionMetadata now enforces checksum and previous_checksum, records checksum_algorithm (default sha256-v1), and supports ElectronicSignature records with authored/reviewed/approved/rejected semantics. verify_audit_chain() rejects unsupported algorithms, empty checksums, and broken chains.

  • Ontology drift protection scaffold (AOP-05) — replaced hardcoded _iri_to_curie() logic with configurable CurieResolver, and added an OntologyMigrator framework with BFS pathfinding and term-mapping support.

What's new in v0.8.1

  • Expanded the scientific review surface beyond the original read path with specificity-aware assay ranking, HGNC-backed KE assay search, KER citation concordance, conservative taxonomic LCA inference, draft topology validation, directional concordance checks, and supplemental assay-cutoff ordering review.

  • Added a coherent draft review workflow: review_draft_bundle, review_draft_evidence_gaps, export_draft_review_artifact, save_draft_review_artifact, list_saved_draft_review_artifacts, and plan_linear_draft_review_document.

  • Added mechanistic discovery tooling for orphan stressor discovery across one AOP, multiple AOPs, and phenotype or mechanism queries, plus chemical trace overlays on draft graphs.

  • Hardened live operations with a refreshed MCP smoke script, stronger CompTox caching and bounded concurrency, and real-server validation for KE assay search, orphan discovery, confidence review, and draft review/export flows.

  • Added release-facing documentation for validated scientific examples in docs/quickstarts/live-scientific-examples.md.

Previous highlights from v0.8.0

v0.8.0 focused on draft-store hardening, broader schema/runtime contract coverage, improved assay-tool steering and diagnostics, and expanded regression coverage across the assay and draft integrity surfaces.

Why this project exists

AOP research depends on stitching together heterogeneous sources (AOP-Wiki, AOP-DB, CompTox, AOPOntology, MediaWiki drafts) while enforcing ontology, provenance, and publication rules. Traditional pipelines are bespoke notebooks or scripts that agents cannot safely reuse.

The AOP MCP server wraps those workflows in a secure, programmable interface:

  • Unified MCP surface – discovery, semantics, scientific review, draft authoring, and handoff utilities share a single tool catalog exposed over JSON-RPC.

  • Semantic guardrails – applicability/evidence helpers normalize identifiers and validate responses against JSON Schema.

  • Draft-to-publish path – create drafts, edit key events and KERs, run topology/evidence review, export publication-style artifacts, and feed publish planners without leaving MCP.

Already using the O-QT MCP server? This project mirrors that experience with domain adapters tuned for AOP evidence and authoring.


Feature snapshot

Capability

Description

🧬 AOP discovery adapters

Schema-validated tooling for AOP-Wiki, AOP-DB, and CompTox federation with improved phenotype search ranking, synonym expansion, and curated AOP retrieval.

🧪 Assay and chemical discovery

Reverse AOP-to-assay lookup, KE-centered CompTox assay search with HGNC-backed gene resolution, phrase-only assay fallback, specificity-aware ranking, multi-AOP aggregation, orphan stressor discovery, and query-driven assay or chemical triage.

🧭 Semantic services

CURIE normalization, applicability helper, and evidence matrix builder; enforced via JSON Schema responses.

🔬 Scientific review

OECD-oriented KE/KER review helpers, citation concordance, conservative taxonomic LCA inference, supplemental assay-cutoff ordering checks, and confidence review surfaces that combine narrative and assay-derived signals.

✍️ Draft review and authoring

Create/update drafts, key events, relationships, and stressor links with provenance and diff support, plus topology validation, directional concordance review, evidence-gap analysis, quantitative KER review, and chemical trace overlays.

📦 Artifacts and handoff

Export review bundles as JSON or Markdown, save indexed local review artifacts, build publication-style reports, review and attach Registry aop_context handoff bundles with preserved caveats/provenance, surface attached Registry support automatically inside normal draft review exports, produce Linear-ready document payloads, and export assay tables in csv/tsv.

🔎 Trust and auditability

Export replay packages with runtime manifests, verify durable MCP audit-log hash chains, list recent process-local audit records, and export bounded durable audit evidence packages for review.

⚙️ Configurable transports

FastAPI JSON-RPC service with configurable endpoints, retries, and observability hooks.

🤖 Agent friendly

Verified with Codex CLI, Gemini CLI, and Claude Code; includes quick-start snippets, live scientific examples, and an end-to-end MCP smoke script.


Table of contents

  1. Architecture

  2. Quick start

  3. Configuration

  4. Tool catalog

  5. Running the server

  6. Integrating with coding agents

  7. Output artifacts

  8. Security checklist

  9. Current limitations

  10. Development notes

  11. Contributing

  12. Security policy

  13. Code of conduct

  14. Citation

  15. Roadmap

  16. License


Quickstart TL;DR

# 1) install
python -m venv .venv
source .venv/bin/activate
pip install -e .[dev]

# 2) configure
cp .env.example .env

# 3) run
uvicorn src.server.api.server:app --host 127.0.0.1 --port 8003

# 4) verify
curl -s http://127.0.0.1:8003/health | jq .
curl -s http://127.0.0.1:8003/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_aops","arguments":{"text":"liver","limit":3}}}' \
  | jq -r '.result.content[0].text'

Quick start

git clone https://github.com/ToxMCP/aop-mcp.git
cd aop-mcp
python -m venv .venv
source .venv/bin/activate
pip install -e .[dev]
cp .env.example .env
uvicorn src.server.api.server:app --host 127.0.0.1 --port 8003

Heads-up: Federated SPARQL queries benefit from internet access. When offline, enable fixture fallbacks in .env (see Configuration).

Once the server is running:

  • HTTP MCP endpoint: http://127.0.0.1:8003/mcp

  • Health check: http://127.0.0.1:8003/health

  • Task walkthroughs: docs/quickstarts/find-aop.md, docs/quickstarts/live-scientific-examples.md, docs/quickstarts/oecd-draft-authoring.md, and docs/quickstarts/publish.md

Docker quick start

Build and run the hosted runtime image from the repository root:

docker build -t aop-mcp:local .
docker run --rm -p 8003:8000 aop-mcp:local
curl -s http://127.0.0.1:8003/health | jq .

The container listens on port 8000; the example maps it to the existing local development port 8003. The image intentionally includes docs/contracts/schemas, tests/golden, and vendor/schema-spine because schema validation, fixture fallback, and the scientific-invariants bridge depend on those review assets.

For production deployments, configure bearer auth and origin controls rather than exposing the development defaults:

docker run --rm -p 8003:8000 \
  -e AOP_MCP_ENVIRONMENT=production \
  -e AOP_MCP_AUTH_MODE=bearer \
  -e AOP_MCP_AUTH_BEARER_TOKEN="$AOP_MCP_AUTH_BEARER_TOKEN" \
  -e AOP_MCP_ALLOWED_ORIGINS="https://example.org" \
  aop-mcp:local

Verification (smoke test)

Once the server is running, use the scripted smoke run first:

BASE_URL=http://127.0.0.1:8003 ./scripts/test_mcp_endpoints.sh

That smoke script validates the modern draft-review workflow end to end, including:

  • tools/list

  • draft creation and editing

  • review_draft_bundle

  • export_draft_review_artifact

  • save_draft_review_artifact

  • list_saved_draft_review_artifacts

  • plan_linear_draft_review_document

If you only want a lightweight manual probe, the basic health and tool-list checks still work:

curl -s http://127.0.0.1:8003/health | jq .
curl -s http://127.0.0.1:8003/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | jq .

Configuration

Settings are loaded through pydantic-settings with .env/.env.local support. Start from .env.example and keep .env untracked. Key environment variables:

Variable

Required

Default

Description

AOP_MCP_ENVIRONMENT

Optional

development

Controls defaults like permissive CORS and logging detail.

AOP_MCP_LOG_LEVEL

Optional

INFO

Application log level.

AOP_MCP_AOP_WIKI_SPARQL_ENDPOINTS

Optional

https://aopwiki.rdf.bigcat-bioinformatics.org/sparql

Comma-separated list of AOP-Wiki SPARQL endpoints.

AOP_MCP_AOP_DB_SPARQL_ENDPOINTS

Optional

https://aopwiki.rdf.bigcat-bioinformatics.org/sparql

Comma-separated list of AOP-DB SPARQL endpoints (defaults to AOP-Wiki for fallback).

AOP_MCP_COMPTOX_BASE_URL

Optional

https://comptox.epa.gov/dashboard/api/

Base URL for CompTox enrichment calls.

AOP_MCP_COMPTOX_BIOACTIVITY_URL

Optional

https://comptox.epa.gov/ctx-api/

Base URL for CompTox Bioactivity API (required for assay mapping).

AOP_MCP_COMPTOX_API_KEY

Optional

–

API key for CompTox (required for assay mapping and higher quota).

AOP_MCP_ENABLE_FIXTURE_FALLBACK

Optional

0

Set to 1 to serve fixture data when remote SPARQL endpoints are unavailable.

AOP_MCP_ALLOWED_HOSTS

Optional

Loopback hosts with any port

Comma-separated SDK2 HTTP Host allowlist, e.g. aop.example.org.

AOP_MCP_ALLOWED_ORIGINS

Required in production

Empty

Exact comma-separated browser origins; development permits exact HTTP loopback origins.

AOP_MCP_AUDIT_LOG_PATH

Optional

–

When set, appends hash-chained MCP tool-call audit records as JSONL while preserving the in-memory audit buffer used by replay packages.

See docs/contracts/endpoint-matrix.md and src/server/config/settings.py for the extended configuration surface (auth, retries, cache sizing, job service knobs).


Tool catalog

Category

Highlight tools

Notes

AOP discovery

search_aops, get_aop, list_key_events, list_kers

Federated AOP-Wiki queries with pagination, schema validation, and improved ranking for phenotype searches.

OECD review helpers

get_key_event, get_ker, get_related_aops, assess_aop_confidence, find_paths_between_events

Exposes richer KE/KER metadata, shared-AOP discovery, partial OECD-aligned heuristic confidence summaries, supplemental KER citation-concordance signals, supplemental KER assay-cutoff ordering signals derived from linked stressors plus KE assay candidates, conservative taxonomic LCA inference for KER applicability, and directed path traversal for review and network analysis workflows.

Cross-mapping

map_chemical_to_aops, map_assay_to_aops, list_assays_for_aop, get_assays_for_aop, search_assays_for_key_event

Links AOP-Wiki and AOP-DB stressor data to CompTox identifiers and bioactivity assays. search_assays_for_key_event now merges structured HGNC-backed gene resolution with existing KE text heuristics when possible. map_assay_to_aops is assay -> AOP only; use the AOP-to-assay tools when you already have AOP IDs.

Assay aggregation

list_assays_for_aops, get_assays_for_aops, list_assays_for_query, export_assays_table, discover_orphan_stressors_for_aop, discover_orphan_stressors_for_aops, discover_orphan_stressors_for_query

Deduplicates assay evidence across multiple AOPs, surfaces diagnostics for empty assay lookups, exports the ranked assay table as csv or tsv, and can now surface orphan chemical candidates that are active in an AOP's strongest assays but are not already curated as linked stressors, for one pathway, across several pathways, or from a phenotype/mechanism query. Ranked assay outputs are discovery-oriented and specificity-aware, not curated ontology truth.

Semantic helpers

get_applicability, get_evidence_matrix

CURIE normalization plus evidence matrix builder for review packages.

Draft authoring

create_draft_aop, add_or_update_ke, add_or_update_ker, link_stressor, attach_registry_handoff_to_draft, validate_draft_oecd, review_draft_assay_cutoff_ordering, review_draft_bundle, review_draft_evidence_gaps, review_registry_handoff_bundle, export_draft_review_artifact, save_draft_review_artifact, list_saved_draft_review_artifacts, plan_linear_draft_review_document, trace_chemical_on_draft

In-memory draft graph edits with provenance plus OECD-style completeness checks, draft-graph topology checks, a unified draft review bundle that now carries structured evidence-gap findings and any attached Registry support, an action-oriented evidence-gap review surface, Registry handoff review/import planning for bounded AOP-support evidence, exportable review artifacts with both review and publication-style markdown profiles, a persistent local artifact-save path plus on-disk indexing for handoff files, a connector-ready Linear document handoff planner, a detailed draft KER assay-cutoff ordering review surface, and a chemical-trace overlay that projects one chemical's CompTox activity onto draft key events.

Trust and replay

export_draft_replay_package, list_tool_call_audit_records, verify_tool_call_audit_log, export_tool_call_audit_log_evidence

Packages draft integrity, imported Registry support, saved artifact checks, recent audit records, and runtime/tool/schema fingerprints; inspects process-local audit records; verifies durable JSONL hash chains; and exports bounded durable audit evidence with verified-prefix behavior after tamper detection.

Every response is validated against JSON Schemas in docs/contracts/schemas/. Refer to docs/contracts/tool-catalog.md for full definitions and examples.

Validated live examples

The release now includes a concrete live-example guide at docs/quickstarts/live-scientific-examples.md. The examples in that guide were validated against a running server on 2026-04-12 and cover:

  • phenotype search around liver steatosis

  • HGNC-backed KE assay search for KE:239

  • orphan stressor discovery for AOP:529

  • confidence review interpretation for AOP:529

Which assay tool should I use?

Goal

Tool

Input you should pass

Start from an assay and find linked pathways

map_assay_to_aops

An assay identifier such as an AEID or assay name, not an AOP ID

Start from one or more AOPs and retrieve assay candidates

get_assays_for_aop, get_assays_for_aops

One AOP ID or a list of AOP IDs

Start from one AOP and look for uncurated mechanistic chemical candidates

discover_orphan_stressors_for_aop

One AOP ID plus optional assay and chemical scan limits

Start from several AOPs and look for recurring uncurated mechanistic chemical candidates

discover_orphan_stressors_for_aops

A list of AOP IDs plus optional per-AOP assay and chemical scan limits

Start from a phenotype or mechanism query

list_assays_for_query

A text query such as liver steatosis

Start from a phenotype or mechanism query and look for orphan chemicals

discover_orphan_stressors_for_query

A text query plus optional AOP selection and assay/chemical scan limits

Start from a key event or MIE

search_assays_for_key_event

A key_event_id such as KE:239

Example assay curation flow

For a phenotype-driven workflow such as steatosis assay curation:

  1. Call search_aops with a phenotype query such as liver steatosis.

  2. Inspect the returned AOP set or pass the same query to list_assays_for_query.

  3. Export the aggregated assay candidates with export_assays_table when you need a table for downstream review.

For an explicit AOP-ID workflow such as “retrieve assay candidates for AOP:34 and AOP:232”:

  1. Call get_assays_for_aops with the AOP ID list.

  2. Inspect the top-level diagnostics object to see how many AOPs were processed and whether any returned no assays.

  3. Inspect diagnostics.per_aop when results is empty or thinner than expected to distinguish missing CompTox access, no linked stressors, no CompTox chemical matches, and no bioactivity hits after filtering.

For an orphan-stressor discovery workflow such as “show me uncurated chemicals that light up the strongest assays behind AOP:529”:

  1. Call discover_orphan_stressors_for_aop with the AOP ID and tune assay_limit or per_assay_chemical_limit if you want broader discovery.

  2. Review results[*].supporting_assays to see which specificity-ranked AOP assays support each candidate chemical.

  3. Treat the returned chemicals as mechanistic discovery leads. The tool excludes already curated AOP stressors conservatively by DTXSID, CAS RN, and normalized name when possible, but it does not establish causality or regulatory confidence on its own.

For a cross-pathway orphan-stressor workflow such as “show me uncurated chemicals that recur across the strongest assays behind AOP:529 and AOP:517”:

  1. Call discover_orphan_stressors_for_aops with the AOP ID list.

  2. Prioritize candidates with high aop_support_count and supporting_assay_count, because they recur across multiple pathway-specific assay sets rather than only one pathway.

  3. Inspect diagnostics.per_aop when a pathway contributes no orphan candidates so you can distinguish missing CompTox access, empty assay layers, and complete exclusion by curated stressor matching.

For a query-driven orphan workflow such as “show me orphan candidates for liver steatosis”:

  1. Call discover_orphan_stressors_for_query with the phenotype or mechanism query.

  2. Inspect selected_aops to see which AOPs were chosen from the broader search result set before aggregation.

  3. Use diagnostics.warnings and diagnostics.per_aop to see whether the result is thin because the query matched few useful AOPs, because some AOP hits lacked identifiers, or because the selected pathways had no surviving orphan candidates after curated-stressor exclusion.

For a curated KE or MIE workflow:

  1. Call get_key_event to inspect the event metadata and confirm the mechanistic scope.

  2. Call search_assays_for_key_event to rank CompTox assays using KE-derived gene symbols, mechanism phrases, and KE taxonomic applicability when available. Structured gene_identifiers are resolved through HGNC when possible, then merged with heuristic title and description parsing before CTX lookup. Phrase-only events search the full CTX assay metadata set with a narrow phenotype synonym layer before AOP-Wiki measurement methods. Use key_event_id in the MCP payload; legacy ke_id remains accepted for compatibility.

  3. Review derived_search_terms, matched_terms, and applicability_match in the result to understand why an assay was surfaced.

  4. Treat the result as a first-pass assay candidate list. Ranking is specificity-aware, but it is still a discovery aid rather than a curated KE-to-assay ontology mapping.

Example OECD review flow

For an OECD-style read/review workflow:

  1. Call get_aop or search_aops to select the pathway.

  2. Use get_key_event and get_ker for detailed KE/KER inspection.

  3. Use assess_aop_confidence to assemble a heuristic confidence summary from the available KE and KER evidence text.

  4. Read confidence_dimensions as the OECD core dimensions, supplemental_signals as non-core context, and oecd_alignment for the current completeness status. supplemental_signals.citation_concordance_signal is a reference-overlap heuristic across linked KEs, not direct proof of empirical concordance. supplemental_signals.assay_cutoff_ordering_signal is a supplemental quantitative-ordering heuristic derived from linked stressor chemicals, KE assay candidates, and best observed CompTox activity cutoffs; it is not a curated qAOP model. get_ker.citation_concordance and get_ker.assay_cutoff_ordering expose the same style of local KER review context for one relationship at a time. get_ker.applicability.taxa may also use a lowest-common-ancestor taxon when upstream and downstream KE species differ but still share a conservative clade such as Mammalia.

Example draft authoring flow

For an OECD-style draft workflow with explicit KE essentiality capture:

  1. Call create_draft_aop to create the draft root.

  2. Call add_or_update_ke for each KE and set event_role explicitly when you know whether the KE is the MIE, an intermediate event, or the AO. When you have an explicit essentiality judgment for a KE, store it under attributes.essentiality.

  3. Call add_or_update_ker and link_stressor as the draft graph matures.

  4. Call review_draft_bundle when you want the most complete draft review package in one response. It combines validate_draft_oecd, detailed draft assay-cutoff ordering review, structured evidence-gap findings, and optional chemical projection when you supply a chemical identifier.

  5. Call review_draft_evidence_gaps when you want the same draft review signals reorganized into concrete missing-data items by root metadata, key event, relationship, and linked stressor.

  6. Call validate_draft_oecd directly when you only need the compact readiness/result list. Explicit essentiality.evidence_call values of not_assessed or not_reported still count as coverage, as long as a rationale is present. The validator now also checks for draft-graph cycles, identifiable MIE and AO anchors, at least one directed MIE -> AO path, conservative directional concordance when the draft exposes enough polarity metadata, and supplemental KER assay-cutoff ordering when draft stressor links plus KE assay candidates expose enough CompTox evidence to compare upstream and downstream cutoffs.

  7. Call review_draft_assay_cutoff_ordering when you only want the per-KER quantitative-ordering details behind the validator warnings. It surfaces derived draft stressors, per-KER assay-cutoff ordering calls, and supporting shared-chemical cutoff comparisons.

  8. Call trace_chemical_on_draft when you want to see whether one chemical has CompTox assay activity that maps onto the drafted KE graph. Treat the result as a KE assay-overlay aid, not a causal proof engine.

  9. Call export_draft_review_artifact when you want a scientist-facing Markdown artifact or a JSON export built from the unified draft review bundle for downstream review workflows. The Markdown profiles now also include evidence-gap sections, imported Registry-support sections when present, and next actions derived from review_draft_evidence_gaps, while the JSON export includes both a structured evidence_gaps block and any embedded imported-support summary alongside the bundle. Use artifact_profile: "publication" when you want a more structured report with explicit findings, evidence tables, and next actions.

  10. Call save_draft_review_artifact when you want that exported artifact written to the local filesystem under AOP_MCP_ARTIFACT_OUTPUT_DIR (default output/draft_reviews/), with optional subdirectory and filename override support. The metadata sidecar now preserves both the bundle summary and the evidence-gap summary.

  11. Call list_saved_draft_review_artifacts when you want to discover previously saved draft review files by draft ID, format, profile, or subdirectory without scanning the filesystem manually.

  12. Call plan_linear_draft_review_document when you want a connector-ready Linear document payload built from either a live publication-profile export or one of the saved artifact files. Its response now preserves both the exported bundle summary and the evidence-gap summary.

To make directional concordance assessable, store KE polarity under fields such as attributes.direction_of_change when the title is not explicit enough, and store KER polarity under fields such as attributes.relationship_effect when the relationship is clearly activating versus inhibiting. To make draft assay-cutoff ordering assessable, link stressors with resolvable chemical metadata such as a recognizable label, CAS-like source value, or DTXSID-like source value.

Example trust and auditability flow

For a reproducibility review of a draft and the MCP calls around it:

  1. Set AOP_MCP_AUDIT_LOG_PATH before starting the server when durable audit evidence is needed.

  2. Call export_draft_replay_package for the draft version under review. Inspect draft_integrity, external_support, audit_records.persistence, and runtime_manifest.

  3. Call list_tool_call_audit_records when you need the recent process-local view for the current server run.

  4. Call verify_tool_call_audit_log to verify the durable JSONL hash chain.

  5. Call export_tool_call_audit_log_evidence when the durable audit envelopes themselves need to be handed off. If the chain is invalid, the export is limited to the verified prefix before the first failure.

See docs/trust-auditability.md for the trust model and current limits, docs/evaluations/trust-scenarios.md for stable read-only trust evaluation scenarios, and docs/evaluations/trust-scenarios.xml for the machine-readable Q/A pack.

Example tools/call payloads:

{
  "name": "get_assays_for_aops",
  "arguments": {
    "aop_ids": ["AOP:34", "AOP:232", "AOP:591"],
    "limit": 25,
    "per_aop_limit": 15,
    "min_hitcall": 0.95
  }
}
{
  "name": "list_assays_for_query",
  "arguments": {
    "query": "liver steatosis",
    "search_limit": 12,
    "aop_limit": 5,
    "limit": 25,
    "per_aop_limit": 15,
    "min_hitcall": 0.95
  }
}
{
  "name": "export_assays_table",
  "arguments": {
    "query": "liver steatosis",
    "format": "csv",
    "search_limit": 12,
    "aop_limit": 5,
    "limit": 25,
    "per_aop_limit": 15,
    "min_hitcall": 0.95
  }
}
{
  "name": "search_assays_for_key_event",
  "arguments": {
    "key_event_id": "KE:239",
    "limit": 10
  }
}
{
  "name": "assess_aop_confidence",
  "arguments": {
    "aop_id": "AOP:232"
  }
}
{
  "name": "create_draft_aop",
  "arguments": {
    "draft_id": "draft-steatosis-1",
    "title": "PXR activation leading to liver steatosis",
    "description": "Draft AOP assembled for OECD-style review.",
    "adverse_outcome": "Liver steatosis",
    "applicability": {
      "species": "human",
      "life_stage": "adult",
      "sex": "female"
    },
    "references": [
      {
        "title": "Example review reference"
      }
    ],
    "author": "researcher",
    "summary": "Create draft root"
  }
}
{
  "name": "add_or_update_ke",
  "arguments": {
    "draft_id": "draft-steatosis-1",
    "version_id": "v2",
    "author": "researcher",
    "summary": "Add KE with governed essentiality",
    "identifier": "KE:239",
    "title": "Activation, Pregnane-X receptor, NR1I2",
    "attributes": {
      "measurement_methods": [
        "Reporter assay"
      ],
      "taxonomic_applicability": [
        "NCBITaxon:9606"
      ],
      "essentiality": {
        "evidence_call": "moderate",
        "rationale": "Blocking or attenuating this event reduced the downstream steatosis signal in the supporting studies curated for the draft.",
        "references": [
          {
            "identifier": "PMID:123456",
            "source": "pmid",
            "label": "Example essentiality reference"
          }
        ]
      }
    }
  }
}
{
  "name": "add_or_update_ke",
  "arguments": {
    "draft_id": "draft-steatosis-1",
    "version_id": "v3",
    "author": "researcher",
    "summary": "Add KE with explicit no-data essentiality status",
    "identifier": "KE:459",
    "title": "Liver steatosis",
    "attributes": {
      "measurement": "Histopathology",
      "essentiality": {
        "evidence_call": "not_assessed",
        "rationale": "Direct perturbation evidence has not yet been curated for this KE in the current draft.",
        "references": []
      }
    }
  }
}
{
  "name": "validate_draft_oecd",
  "arguments": {
    "draft_id": "draft-steatosis-1"
  }
}

Current limitations

  • assess_aop_confidence is OECD-aligned, not OECD-complete. Key-event essentiality is only inferred when bounded text evidence and supporting path structure both exist; path structure alone is retained as context but does not produce an essentiality score. The current RDF export still does not expose a dedicated structured essentiality field. Draft authoring now supports an explicit governed KE-level essentiality object, and validate_draft_oecd checks its coverage and shape.

  • The governed draft essentiality object currently improves authoring and validate_draft_oecd, but it is not yet fed back into the live read-side assess_aop_confidence output or a downstream publish/export path.

  • Quantitative understanding is sparse in many live AOP-Wiki records, so confidence outputs often remain partial even when the tool is behaving correctly.

  • Applicability evidence calls are now structured on the read path, but they are still heuristic. They reflect source presence, cross-KE consistency, and supporting references rather than an explicit OECD applicability-strength field from upstream RDF.

  • search_assays_for_key_event is a discovery helper, not a curated KE-to-assay ontology mapping or a full assay fit-for-purpose evaluator.

  • Query-driven assay workflows depend on upstream AOP-DB stressor links and CompTox coverage. Relevant AOPs without mapped stressors or bioactivity data can legitimately return no assay candidates.

  • Phrase-only KE assay search now includes a small curated phenotype synonym layer, but that vocabulary is intentionally narrow. When the phenotype or endpoint wording is not present upstream and not covered by the curated expansions, the tool can still return no hits even though the full CTX dataset was searched.

  • Phenotype boundaries such as steatosis vs steatohepatitis / MASH still require manual scientific curation; the MCP should be used as a baseline discovery and prioritization layer rather than a final arbiter.

  • Federated SPARQL and assay aggregation calls can be slow on live infrastructure, especially for broad phenotype queries and large AOPs.


Running the server

The FastAPI app lives at src/server/api/server.py. All transports share the same JSON-RPC handlers defined in src/server/mcp/router.py.

uvicorn src.server.api.server:app --host 127.0.0.1 --port 8003
  • GET /health – environment banner, dependency status.

  • POST /mcp – JSON-RPC 2.0 endpoint exposing the MCP tool catalog.

Use scripts/test_mcp_endpoints.sh for a scripted smoke run against /mcp. It now validates the modern draft-review workflow end to end, including artifact export/save/list and Linear handoff planning.


Integrating with coding agents

Add the server to your agent’s MCP configuration. Example Codex CLI entry:

{
  "name": "aop-mcp",
  "endpoint": "http://127.0.0.1:8003/mcp"
}

Tested surfaces:

  • Codex CLI – codex mcp connect http://127.0.0.1:8003/mcp

  • Gemini CLI – add the endpoint under mcp_servers to auto-negotiate the tool catalog.

  • Claude Code – configure a custom MCP server with the base URL above.

Because the server supports initialize, tools/list, tools/call, and shutdown, agents immediately gain discovery plus structured responses (content + structuredContent).

Tool annotations accurately identify read-only operations where applicable. Whether a permission grant is remembered is controlled by Claude, Codex, or the other host client; the MCP server cannot grant or persist client permissions itself.

Every successful result includes a human-visible Sources: section and the same descriptors in _meta.sources. Assistants should retain those labels and clearly identify any information obtained through a separate web search.


Output artifacts

  • Structured MCP payloads – JSON responses aligned with schemas under docs/contracts/schemas/.

  • Saved draft review files – save_draft_review_artifact can persist review/profile exports under AOP_MCP_ARTIFACT_OUTPUT_DIR (default output/draft_reviews/) for downstream handoff.

  • Artifact inventory – list_saved_draft_review_artifacts can index those saved files, using metadata sidecars when available and filesystem inference for older artifacts.

  • Connector-ready review handoff – plan_linear_draft_review_document can turn a live or saved review artifact into a Linear document payload for downstream review systems.

  • Replay packages – export_draft_replay_package packages draft integrity, imported Registry support, saved artifact verification, recent audit records, durable audit persistence status, and a runtime manifest.

  • Audit + provenance – draft edits capture author, summary, and version metadata for downstream review queues. Optional AOP_MCP_AUDIT_LOG_PATH writes hash-chained durable MCP tool-call JSONL records.

  • Durable audit evidence – verify_tool_call_audit_log verifies the JSONL hash chain, and export_tool_call_audit_log_evidence exports a bounded verified evidence package.

  • Metrics & logs – in-process metrics recorder (src/instrumentation/metrics.py) and structured logs (src/instrumentation/logging.py) for SPARQL/cache and job lifecycle events.

  • Fixture captures – optional local fixtures for offline testing when AOP_MCP_ENABLE_FIXTURE_FALLBACK=1.


Security checklist

  • ✅ Structured logging + audit chain validation (src/instrumentation/audit.py).

  • ✅ Optional durable tool-call audit JSONL sink with hash-chain verification and bounded evidence export.

  • ✅ Replay packages include draft, artifact, audit, schema, tool-catalog, and runtime fingerprints.

  • ✅ SPARQL + CompTox clients respect retry/backoff limits; tune via settings.

  • ✅ MCP tools enforce JSON Schema validation before returning data to agents.

  • 🔲 Optional auth middleware (see docs/adr/architecture-drivers.md) – integrate with your gateway before production exposure.

  • 🔲 Review publish planners (MediaWiki / AOPOntology) before enabling automated publish jobs.


Development notes

For the reproducible development environment, run uv sync --locked --extra dev and uv run --no-sync pytest. CI uses the same committed lockfile. The weekly security workflow audits its runtime dependency export and runs Bandit; update the lock and rerun the existing regression checks when remediating advisories.

Wheels retain the documented src.server.api.server:app entrypoint and bundle schemas, SPARQL templates, and offline fixtures. CI builds through the source distribution and runs scripts/verify_installed_wheel.py with python -I in a clean wheel environment outside the checkout, including an offline MCP tool call.

  • pytest – run unit and schema validation tests.

  • scripts/test_mcp_endpoints.sh – exercise the MCP catalog end-to-end.

  • make contract – regenerate/validate JSON Schema docs (if available in your tooling setup).

  • python scripts/benchmarks.py – baseline latency testing (extend with real workloads).

  • CHANGELOG.md – release-facing summary of shipped MCP contract, trust, and review-surface changes.

  • docs/opensourcing-checklist.md – final checks before switching repository visibility to public.

  • docs/contracts/oecd-aligned-schema.md – OECD-aligned target payload model and current coverage audit for AOP, KE, KER, and assessment outputs.

  • Keep docs in sync: update docs/contracts/endpoint-matrix.md, docs/quickstarts/, and schema files when payloads change.


Contributing

See CONTRIBUTING.md for local setup, test workflow, and pull request expectations.


Security policy

See SECURITY.md for reporting guidance and supported versions.


Code of conduct

This project follows CODE_OF_CONDUCT.md.


Citation

If you use toxMCP / AOP MCP Server in your work, please cite:


Roadmap

  • Persistent draft store (Redis/Postgres) with multi-user access control.

  • Automated benchmark thresholds feeding CI gating.

  • Additional MCP resources/prompts for curated applicability templates and evidence summaries.

  • Publish workflow hardening (approval queues, RBAC simulation, MediaWiki integration tests).


License

Apache-2.0. See LICENSE.

Acknowledgements / Origins

ToxMCP was developed in the context of the VHP4Safety project (see: https://github.com/VHP4Safety) and related research/engineering efforts.

Funding: Dutch Research Council (NWO) — NWA.1292.19.272 (NWA programme)

This suite integrates with third-party data sources and services (e.g., EPA CompTox, ADMETlab, AOP resources, OECD QSAR Toolbox, Open Systems Pharmacology). Those upstream resources are owned and governed by their respective providers; users are responsible for meeting any access, API key, rate limit, and license/EULA requirements described in each module.

✅ Citation

Djidrovski, I. ToxMCP: Guardrailed, Auditable Agentic Workflows for Computational Toxicology via the Model Context Protocol. bioRxiv (2026). https://doi.org/10.64898/2026.02.06.703989

@article{djidrovski2026toxmcp,
  title   = {ToxMCP: Guardrailed, Auditable Agentic Workflows for Computational Toxicology via the Model Context Protocol},
  author  = {Djidrovski, Ivo},
  journal = {bioRxiv},
  year    = {2026},
  doi     = {10.64898/2026.02.06.703989},
  url     = {https://doi.org/10.64898/2026.02.06.703989}
}

Citation metadata: CITATION.cff

Available Tools

42 tools
add_or_update_keC
Destructive

Add or update a key event within a draft.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
authorYes
summaryYes
draft_idYes
attributesNo
event_roleNo
event_typeNo
identifierYes
version_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
draft_idYes
version_idYes

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and readOnlyHint=false. The description adds only the 'within a draft' scope and implies upsert semantics via 'add or update', but says nothing about what an update overwrites, whether a version must exist, or any auth constraints — significant gaps for a destructive mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no wasted words. It is tight and readable, though its brevity reflects under-specification rather than disciplined economy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive 9-parameter mutation with 6 required fields and zero schema descriptions, one sentence is inadequate. The output schema exists so return values need not be explained, but the input contract and update semantics are left entirely unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 9 parameters and 0% schema description coverage, the description carries the full burden of explaining inputs, yet it names none of them. Required fields like draft_id, version_id, author, summary, and identifier are entirely undocumented in both the schema and the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair (add or update) and resource (key event), scoped to 'within a draft', which is concrete enough to act on. It does not, however, distinguish this from sibling tools like add_or_update_ker or get_key_event, leaving the agent to infer the distinction from names alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisite conditions, and no mention of the alternative add_or_update_ker. The agent is given no criteria for choosing this tool over its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_or_update_kerC
Destructive

Add or update a key event relationship within a draft.

ParametersJSON Schema
NameRequiredDescriptionDefault
authorYes
statusNo
summaryYes
draft_idYes
upstreamYes
attributesNo
downstreamYes
identifierYes
provenanceNo
version_idYes
plausibilityNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
draft_idYes
version_idYes

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare a destructive, non-idempotent, write operation. The description adds only the draft scope and repeats the add/update action implied by the name, without explaining what gets overwritten, permission needs, or the effect on existing relationships.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no wasted words. It is efficiently concise, though its brevity contributes to under-specification elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool with eleven parameters and many required domain fields, a one-line description is far too sparse. An output schema exists, so return values need not be covered, but parameter and behavioral context are missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description provides no parameter semantics. Eleven parameters (seven required) including identifier, upstream, downstream, status, attributes, and provenance are left entirely unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action (add or update) and resource (key event relationship) scoped to a draft. It is clearly distinguishable from the sibling add_or_update_ke, though it does not explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'within a draft' gives minimal implied context, but there is no guidance on when to prefer this tool over add_or_update_ke or list_kers, nor any prerequisites or exclusions. Usage must be inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

assess_aop_confidenceB
Read-onlyIdempotent

Build an OECD-style heuristic confidence summary for an AOP from AOP-, KE-, and KER-level evidence text.

ParametersJSON Schema
NameRequiredDescriptionDefault
aop_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
aopYes
coverageYes
rationaleYes
key_eventsYes
provenanceYes
limitationsYes
overall_callYes
oecd_alignmentYes
ker_assessmentsYes
empirical_supportYes
supplemental_signalsYes
applicability_summaryNo
confidence_dimensionsYes
overall_applicabilityYes
heuristic_overall_callYes
mechanism_role_summaryNo
biological_plausibilityYes
essentiality_of_key_eventsYes
quantitative_understandingYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this a read-only, idempotent, non-destructive, closed-world operation, so the safety profile is covered. The description usefully adds that the output is a 'heuristic' (i.e., not authoritative) summary synthesized across three evidence levels, but says nothing about how evidence is gathered, what happens when evidence is missing, or determinism.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with no filler, and the artifact being produced is front-loaded before the evidence scope. It is terse to the point of being dense with jargon, but every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover safety. However, for an analysis tool that depends on pre-existing evidence, the description omits what happens with incomplete evidence and how it relates to the sibling validation tool, leaving real gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With a single parameter at 0% schema description coverage, the description must carry the load. It implies that the lone aop_id selects the AOP and that KE/KER-level evidence is collected internally rather than passed in, which is meaningful, but it never states what identifier format is expected or whether the AOP must be a draft.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (Build) and a specific artifact (an OECD-style heuristic confidence summary for an AOP), which is clearly distinct from data-retrieval siblings like get_evidence_matrix or get_aop. It does not explicitly contrast itself with the closest sibling, validate_draft_oecd, so an agent must infer the boundary between 'validate' and 'assess confidence'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus alternatives such as validate_draft_oecd or get_evidence_matrix, and no prerequisites or trigger conditions are given. The only implicit cue is that evidence must already exist at AOP/KE/KER level.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

attach_registry_handoff_to_draftC
Destructive

Attach a validated Registry aop_context handoff bundle to a draft's provenance for later review/export.

ParametersJSON Schema
NameRequiredDescriptionDefault
authorYes
bundleYes
summaryYes
draft_idYes
version_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
draft_idYes
version_idYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation profile is known. The description adds the prerequisite that the bundle must be 'validated' and that it lands in 'provenance', which is useful. It does not disclose what is overwritten, whether re-attaching is rejected (idempotentHint=false), or any permission needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler, though it is dense with domain jargon ('aop_context', 'provenance'). Efficient, but minimal content given the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. However, for a destructive 5-parameter mutation with 0% schema coverage, the description omits the meaning of nearly every parameter and any usage context, leaving an agent under-informed about how to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 5 required parameters, so the description must carry the burden and largely fails. It obliquely references the bundle ('handoff bundle') and target draft, but says nothing about author, summary, draft_id, or version_id, leaving most parameters undocumented in both schema and text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Attach') and a specific resource ('validated Registry aop_context handoff bundle') bound to a target ('draft's provenance'). Clear what it does, though it does not distinguish itself from siblings like review_registry_handoff_bundle or review_draft_bundle that touch the same handoff/bundle domain.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for later review/export' hints at downstream purpose but gives no condition for choosing this tool over review_registry_handoff_bundle or save_draft_review_artifact. No prerequisites, no exclusions, no when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_draft_aopC
Destructive

Create a new draft AOP for write-path workflows.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
titleYes
authorYes
summaryYes
draft_idYes
referencesNo
descriptionYes
applicabilityNo
adverse_outcomeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
draft_idYes
version_idYes

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and readOnlyHint=false, so the write/replace semantics are covered. The description adds nothing beyond 'draft' and 'write-path workflows' - it does not say what gets created or overwritten, whether draft_id must be unique, or any permission/validation requirement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single front-loaded sentence with no redundancy, which is structurally clean, but its brevity reflects under-specification rather than tightness. The 'write-path workflows' clause consumes space without earning it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. But for a 9-parameter creation tool with 0% parameter documentation, the description leaves critical gaps: what an 'AOP' draft requires, what adverse_outcome and applicability mean, and how this fits other draft-authoring siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are 9 parameters with 0% schema description coverage (6 of them required), so the schema provides no meaning and the description must compensate. It mentions none of them - not draft_id, title, adverse_outcome, applicability, references, or tags - leaving an agent to guess at required content and formats.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: create a new draft AOP. This distinguishes it from read siblings like get_aop and search_aops. However, the trailing phrase 'for write-path workflows' is vague jargon that adds little and does not differentiate it from other write siblings such as add_or_update_ke or save_draft_review_artifact.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus alternatives is given. 'Write-path workflows' is not a usable condition for selection, and no prerequisites, sequencing, or alternatives are named despite many sibling tools that touch drafts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

discover_orphan_stressors_for_aopA
Read-onlyIdempotent

Start from one AOP's strongest assay candidates, pull active assay chemicals from CompTox, exclude already curated AOP stressors, and return mechanistic orphan chemical candidates with diagnostics.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
aop_idYes
assay_limitNo
min_hitcallNo
per_assay_chemical_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
diagnosticsYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful behavior beyond that: it reaches out to CompTox for active chemicals, filters out already-curated AOP stressors, and returns results with diagnostics — meaningful context about data provenance and exclusion logic that annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence that front-loads the starting point ('one AOP's strongest assay candidates') and follows the pipeline in execution order. Every clause carries information; only the trailing 'with diagnostics' is slightly vague, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the return shape need not be described. However, for a multi-step pipeline tool with five undocumented parameters and several near-identical siblings, the description leaves both the tuning knobs and the choice-of-tool question unresolved — adequate, but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for all five parameters, and the description names none of them: limit, assay_limit, min_hitcall, and per_assay_chemical_limit are never explained. The phrases 'strongest assay candidates' and 'active assay chemicals' only hint at thresholds, so an agent must guess what min_hitcall (default 0.9) or per_assay_chemical_limit actually control.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (discover), the resource (orphan chemical stressors), and the scoping unit ('one AOP'), which cleanly separates it from the plural sibling discover_orphan_stressors_for_aops. The description also outlines the four-step pipeline (assay candidates → CompTox chemicals → exclusion → candidates with diagnostics), so an agent knows exactly what work it performs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Start from one AOP's strongest assay candidates' implies the trigger condition (you have a single AOP and want novel chemical candidates), but the description never states when not to use it or names the alternatives discover_orphan_stressors_for_aops and discover_orphan_stressors_for_query. Usage is inferable rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

discover_orphan_stressors_for_aopsB
Read-onlyIdempotent

Aggregate orphan chemical candidates across multiple AOPs by combining each pathway's strongest assay evidence, excluding stressors already curated anywhere in the selected AOP set, and ranking chemicals by cross-AOP support.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
aop_idsYes
min_hitcallNo
per_aop_limitNo
per_assay_chemical_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
diagnosticsYes

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, idempotent, non-destructive) and open-world behavior. The description adds genuinely useful semantics beyond that: exclusion of stressors curated anywhere in the selected AOP set, use of each pathway's strongest assay evidence, and cross-AOP support ranking.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence that front-loads the aggregation, then the exclusion rule, then the ranking criterion. No waste, though the run-on structure makes it harder to scan than two short sentences would.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the core pipeline semantics are present. However, for a 5-parameter tool with 0% schema coverage, the absence of any parameter-level guidance leaves the definition only marginally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 5 parameters, so the description carries the full burden. It hints at the strongest-evidence threshold (relating to min_hitcall) and ranking/limits, but never explains min_hitcall, per_aop_limit, per_assay_chemical_limit, or limit, leaving four cutoffs undocumentable from the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (aggregate) plus a well-defined resource (orphan chemical candidates across multiple AOPs), with the ranking basis stated. Implicitly distinguishes itself from the singular sibling discover_orphan_stressors_for_aop via 'across multiple AOPs', but never names that alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The mechanics (excluding curated stressors, combining strongest evidence per pathway) imply the use case — finding novel candidates not yet linked to the selected AOP set — but there is no explicit when-to-use/when-not statement and no named alternative versus the single-AOP variant.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

discover_orphan_stressors_for_queryC
Read-onlyIdempotent

Given a phenotype or mechanism query, search AOPs, aggregate orphan chemical candidates across the selected AOPs, and return query plus per-AOP diagnostics.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
aop_limitNo
min_hitcallNo
search_limitNo
per_aop_limitNo
per_assay_chemical_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYes
resultsYes
diagnosticsYes
selected_aopsYes

TDQS

C2.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description usefully discloses the internal pipeline (search AOPs then aggregate across them) and that output includes per-AOP diagnostics, but adds nothing about cost, rate limits, or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence that front-loads the input condition and the action sequence with no filler. It is well structured, though its brevity is partly under-specification rather than pure economy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, but the definition is incomplete for a 7-parameter tool with 0% schema coverage and two near-duplicate siblings. The key information an agent needs, parameter meaning and which variant to choose, is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description mentions no parameter at all. Seven parameters, several cryptically named (min_hitcall, per_assay_chemical_limit, per_aop_limit, aop_limit vs search_limit vs limit), are left entirely unexplained, so an agent cannot infer their meaning or interaction from either source.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific multi-step action (search AOPs, aggregate orphan chemical candidates, return diagnostics) triggered by a phenotype/mechanism query. It is clear about what the tool does, but it never differentiates itself from the closely named siblings discover_orphan_stressors_for_aops and discover_orphan_stressors_for_aop, which is the main ambiguity an agent faces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use or when-not-to-use guidance, and no sibling is named as an alternative. Given three near-identical 'discover_orphan_stressors_*' tools in the sibling list, the absence of routing guidance is a real gap; usage is only weakly implied by the 'query' input.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_assays_tableB
Read-onlyIdempotent

Export aggregated assay candidates as CSV or TSV from a query or explicit AOP list.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
formatNocsv
aop_idsNo
aop_limitNo
min_hitcallNo
search_limitNo
per_aop_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
formatYes
contentYes
filenameYes
row_countYes
selected_aopsYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and non-destructive, so the safety profile is covered. The description adds the CSV/TSV output angle but says nothing about what 'aggregated' means, how the query and aop_ids paths interact, or any rate/size limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no waste, but it is arguably too terse for an 8-parameter tool, so it stops just short of ideal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter, zero-description-coverage tool with several similarly named limit parameters, the description is far too thin. Although an output schema exists (so return values need no explanation), the input semantics and query-vs-aop_ids behavior are unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 8 parameters, so the description must compensate and does not. It never explains limit, search_limit, aop_limit, per_aop_limit, or min_hitcall, leaving the multi-limit structure and the hitcall threshold entirely opaque; only 'CSV or TSV' loosely maps to the format enum.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (export) and resource (aggregated assay candidates) plus output formats, which cleanly distinguishes it from sibling exporters like export_draft_review_artifact and export_tool_call_audit_log_evidence. It does not explicitly name a sibling, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'from a query or explicit AOP list' implies the two input modes but gives no guidance on when to prefer one over the other, no prerequisites, and no exclusions relative to siblings like search_assays_for_key_event.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_draft_replay_packageB
Read-onlyIdempotent

Export a deterministic replay package for one draft version, including graph/provenance integrity, Registry support, optional saved artifact verification, and recent MCP audit records.

ParametersJSON Schema
NameRequiredDescriptionDefault
draft_idYes
version_idNo
artifact_pathNo
audit_record_limitNo
include_audit_recordsNo
artifact_relative_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
draft_idYes
version_idYes
limitationsYes
generated_atYes
audit_recordsYes
draft_snapshotYes
package_sha256Yes
saved_artifactYes
draft_integrityYes
external_supportYes
runtime_manifestYes
package_schema_versionYes

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive, closed-world, so the safety profile is covered. The description adds real behavioral context beyond annotations: the output is a deterministic replay package bundling provenance integrity, Registry support, optional artifact verification, and recent audit records. It does not state format, size, or determinism mechanics, but it goes meaningfully beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with the core action first and details trailing. It is efficient and contains no filler, though the long comma-separated enumeration is dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter tool with an output schema, the description need not explain return values, and annotations cover safety. However, given the cluttered sibling namespace and 0% parameter documentation, it leaves gaps: no guidance on choosing between artifact_path and artifact_relative_path, no mention of the audit limit behavior, and no differentiation from adjacent export tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for six parameters, so the schema supplies only names and types. The description references 'one draft version', 'artifact verification', and 'recent MCP audit records', which loosely maps to draft_id/version_id, artifact_path/artifact_relative_path, and audit_record_limit/include_audit_records. But it never explains the distinction between artifact_path and artifact_relative_path, the effect of audit_record_limit (including the 0-100 range), or the optional nature of version_id. With 0% schema coverage, the description should compensate more than it does.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: export a deterministic replay package for one draft version. It enumerates what the package bundles (graph/provenance integrity, Registry support, optional saved artifact verification, recent MCP audit records). It does not explicitly name which sibling export tool (e.g., export_draft_review_artifact) it differs from, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No statement of when to use this tool versus the many sibling export/review tools (export_draft_review_artifact, review_draft_bundle, export_tool_call_audit_log_evidence). There are no prerequisites or exclusions given. Usage must be inferred entirely from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_draft_review_artifactC
Read-onlyIdempotent

Export a scientist-facing draft review artifact as markdown or json by rendering the unified draft review bundle, including an optional publication-style markdown profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
casNo
nameNo
dtxsidNo
formatNomarkdown
draft_idYes
inchikeyNo
version_idNo
assay_limitNo
min_hitcallNo
stressor_limitNo
artifact_profileNoreview

Output Schema

ParametersJSON Schema
NameRequiredDescription
formatYes
contentYes
draft_idYes
filenameYes
version_idYes
bundle_summaryYes
section_titlesYes
artifact_profileNo
evidence_gap_summaryNo

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered by structured data. The description adds that it renders a 'unified draft review bundle' and supports an optional publication profile, which is useful context, but says nothing about auth needs, size limits, or side effects on the underlying draft.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that leads with the action and resource, with no filler. Slightly jargon-dense ('unified draft review bundle') but efficient overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, but with 11 parameters at 0% schema coverage the description leaves most filtering/selection inputs undefined. For a multi-parameter export tool this is a meaningful completeness gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 11 parameters, so the description must carry parameter meaning and largely does not. It only loosely gestures at format (markdown/json) and artifact_profile (publication-style profile); identifiers (cas, dtxsid, inchikey, version_id), limits (assay_limit, min_hitcall, stressor_limit), and draft_id are left undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (Export) and resource (draft review artifact) and clarifies it renders the unified draft review bundle in markdown or json. This is clear enough to distinguish it from save_draft_review_artifact and export_draft_replay_package, though it never explicitly names those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no when-to-use guidance, prerequisites, or exclusions relative to alternatives like save_draft_review_artifact, review_draft_bundle, or list_saved_draft_review_artifacts. Usage must be inferred from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_tool_call_audit_log_evidenceB
Read-onlyIdempotent

Export a bounded, chain-verified evidence package from the durable MCP tool-call audit JSONL log.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
statusNo
tool_nameNo
audit_log_pathNoOptional durable MCP audit JSONL path to export from. Defaults to AOP_MCP_AUDIT_LOG_PATH when configured.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pathYes
chainYes
existsYes
warningsYes
envelopesYes
selectionYes
configuredYes
limitationsYes
generated_atYes
exported_orderYes
evidence_sha256Yes
using_configured_pathYes
matched_envelope_countYes
evidence_schema_versionYes
exported_envelope_countYes
verified_prefix_envelope_countYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context ('bounded', 'chain-verified'), but leaves unexplained what 'chain-verified' entails, where the package is written, or whether the durable log must exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. It is efficient, though its brevity is in tension with the missing usage and parameter detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Because an output schema exists, return values needn't be explained, and annotations cover the safety profile. However, for a 4-parameter export tool with only 25% schema coverage, the description omits when-to-use routing and filter semantics, leaving real gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 25% – just audit_log_path is documented. The description adds no meaning for limit, status, or tool_name, and the low coverage means it should compensate but does not. An agent gets no hint about how these filters shape the export.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (export) and resource (a bounded, chain-verified evidence package from the MCP tool-call audit JSONL log), with qualifiers that clarify the artifact type. It doesn't explicitly differentiate itself from siblings like list_tool_call_audit_records or verify_tool_call_audit_log, but the 'evidence package' framing is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use guidance or prerequisites, and does not mention the closely related siblings (list_tool_call_audit_records, verify_tool_call_audit_log) that an agent would need to choose between. Nothing tells the agent when this export is preferred over simply listing or verifying.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_paths_between_eventsB
Read-onlyIdempotent

Find directed KE/KER paths between two events within a selected AOP.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
aop_idYes
max_depthNo
source_event_idYes
target_event_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
aop_idYes
resultsYes
path_countYes
source_event_idYes
target_event_idYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and a closed-world scope, so the safety profile is covered. The description adds the useful behavioral qualifier that paths are directed and confined to one AOP, but says nothing about traversal truncation, depth limits, or result exhaustion.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single 13-word sentence with the scope qualifier front-loaded and zero filler. Nothing to trim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not needed, and annotations cover the safety profile. What remains missing is the meaning of max_depth and limit and any hint about path-count behavior, which matters for a traversal tool with five parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so all five parameters are undocumented in the schema. The description clarifies the three required IDs implicitly but leaves limit (default 10, max 50) and max_depth (default 8, max 20) completely unexplained, and these are the non-obvious knobs for a graph traversal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (find), resource (directed KE/KER paths), and endpoints (between two events) scoped to a single AOP. It is distinguishable from read-oriented siblings like get_ker and list_kers, though it never names an alternative tool explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use guidance, no prerequisites, and no alternatives. An agent must infer from the name alone that this is the path-traversal option among siblings such as list_kers and get_ker.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_aopB
Read-onlyIdempotent

Fetch a single AOP with metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
aop_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
iriYes
graphNo
titleNo
statusNo
createdNo
abstractNo
modifiedNo
stressorsNo
provenanceNo
referencesNo
short_nameNo
adverse_outcomesNo
evidence_summaryNo
overall_applicabilityNo
molecular_initiating_eventsNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds only 'with metadata,' which hints at the return content but says nothing about auth, errors, or lookup behavior, so it adds modest value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; every word (verb, cardinality, resource, payload hint) earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained, and the annotations carry the safety profile. However, the parameter meaning and the distinction from search/list siblings remain unaddressed, leaving the definition only minimally sufficient for this low-complexity getter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single aop_id parameter has 0% schema description coverage and the description does not clarify its format, expected identifier scheme, or lookup behavior. With one undocumented parameter, the description fails to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Fetch) and resource (a single AOP) plus a hint at payload (metadata), so an agent can distinguish it from list/search siblings like search_aops. It stops short of explicitly naming those alternatives, so it earns 4 rather than 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use guidance, no prerequisites, and never mentions the sibling it competes with (search_aops, get_related_aops). An agent must infer usage from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_applicabilityC
Read-onlyIdempotent

Normalize applicability parameters (species, sex, life stage).

ParametersJSON Schema
NameRequiredDescriptionDefault
sexNo
speciesNo
life_stageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
sexYes
speciesYes
life_stageYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds no behavioral context beyond a bare operation name — it does not explain what normalization does, how values are canonicalized, or any auth/rate-limit considerations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence with no wasted words. However, its brevity comes at the cost of under-specification rather than purposeful concision.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. But for a tool with three undocumented parameters and no schema descriptions, the description should explain what normalization means and when to use it. The current text is too thin to guide correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the burden of explaining parameters. It merely lists the three field names ('species, sex, life stage'), which are already visible in the schema titles, and provides no format, allowed values, defaults, or normalization examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb ('Normalize') and resource ('applicability parameters'), and names the specific fields involved. It distinguishes itself from the many AOP/assay siblings by operating on applicability normalization rather than retrieval or review, though it does not explicitly reference alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this tool, when not to, or what alternatives exist. The description implies it is a preprocessing step but never states that context directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_assays_for_aopC
Read-onlyIdempotent

Given one AOP identifier, return assay candidates. Use this when you have an AOP ID and want assays.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
aop_idYes
min_hitcallNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
diagnosticsYes

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, and open-world behavior, so the safety profile is covered. The description adds nothing beyond that — notably it never mentions that results are filtered by min_hitcall (default 0.9) or capped by limit, which materially affects what "assay candidates" means.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is short and front-loads the action, but the second sentence repeats the first almost verbatim and earns little. Two sentences where one would have done, with no room saved for the missing parameter context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, but the description still omits the meaning of min_hitcall and the result cap, and gives no differentiation among the many sibling assay-lookup tools. For a 3-parameter query tool at 0% schema coverage, this leaves real gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the parameter burden. It implies aop_id is the input but says nothing about limit (default 25, max 100) or min_hitcall (default 0.9, 0-1), a threshold that silently filters results — a serious omission for an agent trying to interpret the output.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource (return assay candidates for one AOP identifier), which is clear on its own. However, it does nothing to distinguish itself from near-identical siblings such as list_assays_for_aop, get_assays_for_aops, and list_assays_for_aops, so an agent cannot tell which one to pick from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use this when you have an AOP ID and want assays" is essentially a restatement of the purpose rather than guidance. With four sibling tools covering the same AOP-to-assay mapping, the description gives no criteria, exclusions, or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_assays_for_aopsB
Read-onlyIdempotent

Given multiple AOP identifiers, return aggregated assay candidates. Use this when you have a list of AOP IDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
aop_idsYes
min_hitcallNo
per_aop_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
diagnosticsYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds only the notion of aggregation across multiple AOPs; it says nothing about how per_aop_limit or min_hitcall shape the result set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the core action front-loaded and no filler. Efficient, though it is lean to the point of omitting useful parameter detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. But for a 4-parameter aggregation tool with 0% schema coverage, the parameters that control result breadth (per_aop_limit, min_hitcall, limit) are undocumented, leaving the definition materially incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for 4 parameters. The description only implicitly covers aop_ids ('multiple AOP identifiers'); limit, per_aop_limit, and min_hitcall go entirely unexplained in both schema and description, leaving the agent no basis to set the hitcall threshold.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (return) and resource (aggregated assay candidates) scoped to multiple AOP identifiers. The word 'aggregated' plus 'multiple' implicitly separates it from the singular get_assays_for_aop, though it does not explicitly distinguish itself from the near-identical list_assays_for_aops sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this when you have a list of AOP IDs' gives clear triggering context. However, siblings list_assays_for_aops and list_assays_for_aop are functionally close, and the description offers no exclusion or routing rule to pick between them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_evidence_matrixC
Read-onlyIdempotent

Build an evidence matrix from KER facets.

ParametersJSON Schema
NameRequiredDescriptionDefault
entriesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
matrixYes

TDQS

C2.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds nothing beyond that — no note on what a matrix contains, whether computation is deterministic, or expected input shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence is technically concise, but here brevity reflects under-specification rather than economy. Nothing is front-loaded because there is essentially no content to front-load.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, but the input contract is completely opaque and the description does nothing to compensate. For a tool whose only parameter is an undocumented array-of-objects, the definition is inadequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single required parameter 'entries' is an array of objects with arbitrary string/null values, so the schema offers no semantic help. The phrase 'from KER facets' hints only weakly at what entries represent and does not describe structure, keys, or format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Build an evidence matrix') but 'from KER facets' is unexplained domain jargon. It gives a rough sense of purpose but does not distinguish this tool from siblings or clarify what a KER facet is.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives, no prerequisites, and no conditions. The agent must infer usage entirely from the name and the broader toolset.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_kerB
Read-onlyIdempotent

Fetch a single key event relationship with plausibility, evidence, and quantitative-support text.

ParametersJSON Schema
NameRequiredDescriptionDefault
ker_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
iriYes
titleNo
createdNo
modifiedNo
upstreamYes
downstreamYes
provenanceYes
referencesYes
descriptionNo
applicabilityYes
evidence_blocksYes
referenced_aopsNo
gene_identifiersNo
shared_aop_countNo
empirical_supportNo
citation_concordanceNo
assay_cutoff_orderingYes
biological_plausibilityNo
quantitative_understandingNo

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so safety and repeatability are covered. The description's mention of plausibility, evidence, and quantitative-support text is response-content color, but since an output schema exists this is largely redundant and adds little behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence that is front-loaded with the action and resource. Efficient, though the trailing list of returned fields is largely covered by the output schema and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with full annotations and an output schema, the definition is minimally adequate. The notable gap is the unexplained ker_id parameter, which an agent must guess the format and source of.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single required parameter ker_id is never mentioned in the description. There is no indication of what form a ker_id takes or where to obtain one (e.g. from list_kers), so the description fails to compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Fetch) and resource (a single key event relationship), which implicitly distinguishes it from the plural list_kers sibling. It does not explicitly contrast with get_key_event or get_aop, so differentiation relies on the reader knowing the KER vs KE distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no prerequisites, and no named alternatives. It never says when to reach for get_ker versus list_kers or the bulk KER-related siblings, leaving routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_key_eventB
Read-onlyIdempotent

Fetch a single key event with OECD-style metadata fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
key_event_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
iriYes
titleNo
provenanceYes
referencesYes
short_nameNo
ao_specificNo
descriptionNo
mie_specificNo
part_of_aopsNo
applicabilityYes
organ_contextNo
event_componentsYes
gene_identifiersNo
shared_aop_countNo
cell_type_contextNo
sex_applicabilityNo
biological_contextYes
direction_of_changeNo
measurement_methodsNo
protein_identifiersNo
biological_processesNo
taxonomic_applicabilityNo
life_stage_applicabilityNo
measurement_method_detailsYes
level_of_biological_organizationNo

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, covering the safety profile. The description adds a small amount of context by mentioning 'OECD-style metadata fields,' hinting at the return content, but does not disclose any other behavioral traits such as error handling or authentication needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no wasted words. It is appropriately sized for a simple retrieval tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. However, the description fails to compensate for the complete lack of input parameter documentation and provides no usage context, making it incomplete for an agent to invoke the tool confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description provides no information about the key_event_id parameter beyond implying it identifies a single event. It does not explain the ID format, source, or any constraints, leaving the parameter largely undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Fetch'), resource ('key event'), and scope ('single'), which distinguishes it from list_key_events and search_aops. However, it does not explicitly name or contrast with those siblings, so it falls short of the highest clarity tier.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no guidance on when to use this tool versus alternatives like list_key_events or get_ker. It only implies usage by mentioning a single fetch, but there are no explicit conditions, exclusions, or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_assays_for_aopB
Read-onlyIdempotent

List assay candidates for one AOP using linked stressor chemicals and CompTox bioactivity, with diagnostics explaining empty results.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
aop_idYes
min_hitcallNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
diagnosticsYes

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuine behavioral context beyond them: results are derived from linked stressor chemicals plus CompTox bioactivity, and empty results are accompanied by diagnostics rather than being silently empty. It stops short of describing pagination or the shape of those diagnostics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence with the scope front-loaded and no filler. It is efficient, though the trailing 'with diagnostics explaining empty results' clause is slightly dangling and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and annotations cover safety. The remaining gaps are meaningful: two of three parameters are undocumented anywhere and the crowded sibling space is not disambiguated, leaving an agent with open questions about both invocation and tool selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden, and it does not deliver: limit and min_hitcall (a domain-specific hit-call threshold defaulting to 0.9) are never explained, and the bioactivity mention does not clarify what min_hitcall filters. Only aop_id is implicitly covered by 'for one AOP'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (list) plus resource (assay candidates) and scope (one AOP), with the underlying mechanism named (linked stressor chemicals, CompTox bioactivity). The singular 'one AOP' implicitly separates it from the plural sibling list_assays_for_aops, but no sibling is named explicitly, so the agent must still infer the boundary against get_assays_for_aop and list_assays_for_query.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description never states when to choose this over the many near-duplicate siblings (get_assays_for_aop, list_assays_for_aops, get_assays_for_aops, list_assays_for_query). It hints at context by scoping to 'one AOP' and mentioning empty-result diagnostics, but there is no explicit when-to-use, when-not, or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_assays_for_aopsB
Read-onlyIdempotent

Aggregate and deduplicate assay candidates across multiple AOPs, with per-AOP diagnostics for empty results.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
aop_idsYes
min_hitcallNo
per_aop_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
diagnosticsYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered. The description adds useful behavior beyond that (deduplication and per-AOP empty-result diagnostics), but omits how the min_hitcall threshold filters results, which is the operationally significant trait for this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence with the aggregation behavior front-loaded and no filler. It earns its place, though the trailing 'with per-AOP diagnostics' clause could be integrated more tightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, and annotations cover the safety profile. However, for a four-parameter aggregation tool with zero parameter documentation, the description leaves meaningful gaps around filtering and pagination behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description explains none of the four parameters. It hints that aop_ids is a collection via 'multiple AOPs', but limit, min_hitcall, and per_aop_limit are undocumented in both schema and description, leaving an agent to guess their effect.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific compound verb and resource: 'Aggregate and deduplicate assay candidates across multiple AOPs.' The 'across multiple AOPs' and 'deduplicate' framing differentiates it from the singular siblings list_assays_for_aop / get_assays_for_aop, though it never names them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by 'across multiple AOPs' — an agent can infer this is for multi-AOP batch queries. There is no explicit when-to-use statement, no exclusion, and no named alternative (e.g. the singular list_assays_for_aop) to route between.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_assays_for_queryB
Read-onlyIdempotent

Given a phenotype or mechanism query, search AOPs and return aggregated assay candidates with query and per-AOP diagnostics.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
aop_limitNo
min_hitcallNo
search_limitNo
per_aop_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYes
resultsYes
diagnosticsYes
selected_aopsYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, open-world, non-destructive, so the safety profile is covered. The description adds that results are aggregated across AOPs with query and per-AOP diagnostics, which is useful, but it discloses nothing about thresholding behavior (e.g., min_hitcall), limits, or what 'diagnostics' concretely contains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that states input and output without padding. It is efficient, though a hint about parameter behavior would have been a worthwhile addition rather than a redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, but a six-parameter tool with a nontrivial threshold parameter (min_hitcall) is left with zero parameter documentation. For a multi-AOP aggregation tool the description is too thin to guide correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across six parameters, and the description explains none of them. Non-obvious knobs like min_hitcall (a hitcall threshold), search_limit, aop_limit, and per_aop_limit are left entirely uninterpreted, so an agent cannot reason about their effect from either schema or description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (search AOPs from a phenotype/mechanism query, returning aggregated assay candidates) and hints at scope via 'aggregated' and 'per-AOP diagnostics'. The AOP-search framing implicitly separates it from per-AOP siblings, but no sibling is named to make the distinction explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The trigger ('given a phenotype or mechanism query') implies when it applies, but there is no guidance on when to prefer this over list_assays_for_aop, list_assays_for_aops, or search_assays_for_key_event, and no stated prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_kersC
Read-onlyIdempotent

List key event relationships for an AOP.

ParametersJSON Schema
NameRequiredDescriptionDefault
aop_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, fully covering the safety profile. The description adds nothing beyond that – no note on result scope, pagination, or ordering – so it earns little credit beyond the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero wasted words. It is efficient, though its brevity is partly under-specification rather than tight editing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover safety. For a simple one-parameter list tool the description is minimally adequate, but it omits usage guidance and any meaning for aop_id.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and there is one parameter (aop_id) that the description never explains. The AOP scope is inferable from the tool's purpose, but no format, source, or constraint for aop_id is provided anywhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List), resource (key event relationships), and scope (for an AOP), which is enough to distinguish it from get_ker (single relationship) and add_or_update_ker (mutation). However, it does not explicitly name or contrast with those siblings, leaving the agent to infer the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisites, and no alternatives named. The usage is only implied by the verb 'List' and the AOP scope; the agent gets no help deciding between this and get_ker or add_or_update_ker.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_key_eventsC
Read-onlyIdempotent

List key events for an AOP.

ParametersJSON Schema
NameRequiredDescriptionDefault
aop_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered by structured data. The description adds nothing behavioral on top of that — no mention of ordering, completeness of the list, or whether it includes only accepted key events versus all key events.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler, which is appropriately tight for a one-parameter listing tool. It is efficient, though its brevity is also part of what leaves the gaps noted elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the read-only annotations cover safety. The minimum needed to invoke the tool correctly is present, but the absence of sibling differentiation and any parameter context leaves it only just adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single aop_id parameter carries no title-level explanation beyond 'Aop Id'. The description hints that aop_id scopes the listing to an AOP but adds no format, source, or lookup guidance to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List key events') and the scoping entity ('for an AOP'), so the agent knows exactly what it returns. It does not distinguish itself from siblings such as get_key_event or list_kers, which an agent could easily confuse for the same data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisite or ordering note, and no named alternative. The description never explains how this differs from get_key_event or why an agent would call this instead of fetching a single key event.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_saved_draft_review_artifactsA
Read-onlyIdempotent

List saved local draft review artifacts from the configured artifact output directory, with optional draft, profile, format, and subdirectory filters.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
formatNo
draft_idNo
subdirectoryNo
artifact_profileNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
diagnosticsYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds that listing is scoped to the configured artifact output directory, but does not cover ordering, what happens when the directory is missing/empty, or result shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with the resource and scope stated before the optional filters. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. For a read-only listing tool with annotations covering safety, the description is nearly complete; only the undocumented limit parameter keeps it short of fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description names the filter axes (draft, profile, format, subdirectory) that map to draft_id, artifact_profile, format and subdirectory. It leaves limit undocumented and gives no syntax or value hints, so it partially compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) plus resource (saved local draft review artifacts) and scope (from the configured artifact output directory). It is clearly distinguishable from the mutating sibling save_draft_review_artifact and from export_draft_review_artifact.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Describes what is listed and the available filters, implying the tool is for browsing previously saved artifacts. It does not state when to prefer this over save_draft_review_artifact or export_draft_review_artifact, nor any prerequisites for the configured directory.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tool_call_audit_recordsA
Read-onlyIdempotent

List recent process-local MCP tool-call audit records with optional tool-name and status filters, plus durable audit persistence status.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
statusNo
tool_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitYes
scopeYes
filtersYes
recordsYes
limitationsYes
persistenceYes
returned_orderYes
matched_record_countYes
returned_record_countYes
available_record_countYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, closed-world, non-destructive behavior. Beyond that, the description adds meaningful context: records are 'process-local' and the response also includes durable audit persistence status, which distinguishes this view from persisted-log tooling. Return shape itself is deferred to the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with zero filler, front-loading the verb and resource and appending the filters and persistence status. Nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value explanation is not required, and annotations cover the safety profile. The description covers scope, filters, and the persistence-status detail, leaving only the 'limit' parameter's meaning unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it only maps two of the three params ('tool-name and status filters') while saying nothing about the 'limit' parameter or its bounds (0-100). Types, defaults, and constraints are self-documenting in the schema, so baseline 3 is fair.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (MCP tool-call audit records) with clear scope ('recent', 'process-local') and names the two filters. It does not differentiate itself from the related audit siblings (export_tool_call_audit_log_evidence, verify_tool_call_audit_log), so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description is purely declarative about what it returns; it offers no when-to-use framing, no prerequisites, and no mention of the sibling audit tools (export/verify) as alternatives. The agent must infer the use case entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

map_assay_to_aopsA
Read-onlyIdempotent

Given an assay identifier, return related AOPs. Do not pass AOP IDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
assay_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered structurally. The description adds the input-type restriction (assay IDs, not AOP IDs), which is genuinely new behavioral context, but says nothing about result shape, cardinality, or lookup failure behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero waste, with the core action stated first and the constraint second. Nothing is padded or repeated from the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers the input domain and its exclusion. It is essentially complete for a simple one-parameter read tool, missing only a note on what 'related' means or how many AOPs typically come back.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single parameter, so the description must carry the burden. It clarifies that the input is an assay identifier and warns against passing AOP IDs, which meaningfully constrains usage, but adds no format, prefix, or ID-syntax detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: given an assay identifier, return related AOPs. This clearly distinguishes it from direction-reversed siblings like get_related_aops and from map_chemical_to_aops, though it does not name any sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The negative constraint 'Do not pass AOP IDs' implicitly routes the agent toward AOP-first tools for the reverse direction, which is useful. However, there is no positive statement of when to prefer this over list_assays_for_aop, get_assays_for_aop, or get_related_aops, so guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

map_chemical_to_aopsC
Read-onlyIdempotent

Map a chemical to related AOPs using AOP-DB and CompTox.

ParametersJSON Schema
NameRequiredDescriptionDefault
casNo
nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered. The description adds only the data sources and nothing about auth, rate limits, or result behavior, so it contributes little beyond structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. It is efficient, though its brevity is partly under-specification rather than disciplined concision.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation. However, for a tool with two optional, undocumented parameters and silent routing against several sibling tools, the description is too thin to let an agent invoke it correctly without guessing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and both parameters (cas, name) are undocumented in the schema. The description never mentions either parameter, so it fails to compensate for the coverage gap and gives no hint whether cas, name, or both are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (map) and resource (chemical to related AOPs), and names the sources (AOP-DB, CompTox). It is distinguishable from the sibling map_assay_to_aops by resource, though it does not explicitly contrast with get_related_aops.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance and no alternatives named. With siblings like get_related_aops and map_assay_to_aops in the same namespace, the agent gets no help choosing between them; usage is only inferable from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_linear_draft_review_documentC
Read-onlyIdempotent

Build a connector-ready Linear document payload from either a live draft review export or a previously saved draft review artifact.

ParametersJSON Schema
NameRequiredDescriptionDefault
casNo
iconNo:microscope:
nameNo
issueNo
dtxsidNo
projectNo
draft_idNo
inchikeyNo
version_idNo
assay_limitNo
min_hitcallNo
artifact_pathNo
stressor_limitNo
artifact_profileNopublication
artifact_relative_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
sourceYes
warningsYes
linear_documentYes
artifact_summaryYes
evidence_gap_summaryNo
suggested_create_document_argumentsYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description usefully clarifies that this only BUILDS a payload rather than posting to Linear (reinforcing the 'plan_' prefix), which is meaningful behavioral context. It does not, however, explain the live-export vs saved-artifact resolution behavior or any failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. It is efficient in form, though that efficiency borders on under-specification for a 15-parameter tool. No structural problems.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter tool with zero schema coverage, no required-parameter guidance, and no explanation of how the two input-source modes map to specific fields, the description is far too thin. An output schema exists so return values needn't be described, but the input side is badly under-documented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 15 parameters and 0% schema description coverage, the schema provides titles only and the description adds no parameter meaning whatsoever. Critical parameters like artifact_path, artifact_relative_path, artifact_profile, cas, dtxsid, inchikey, and the hitcall/stressor_limit tuning knobs are entirely unexplained. This is a substantial gap the description should have compensated for.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and artifact: 'Build a connector-ready Linear document payload.' The dual source (live draft review export vs saved artifact) is named, which is informative. However, it does not distinguish itself from sibling export/save tools like export_draft_review_artifact or save_draft_review_artifact, leaving the agent to infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions two input modes but gives no guidance on when to choose one over the other, nor when this planning step should be used versus the many adjacent export/artifact siblings. No prerequisites, no exclusions. Usage must be inferred entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

review_draft_assay_cutoff_orderingB
Read-onlyIdempotent

Review per-KER assay-cutoff ordering evidence for a draft by combining draft stressor links, KE assay candidates, and CompTox bioactivity cutoffs.

ParametersJSON Schema
NameRequiredDescriptionDefault
draft_idYes
version_idNo
assay_limitNo
min_hitcallNo
stressor_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
draftYes
summaryYes
draft_idYes
stressorsYes
key_eventsYes
version_idYes
limitationsYes
relationshipsYes
review_parametersYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds useful context that the tool aggregates three distinct external data sources (draft stressor links, KE assay candidates, CompTox bioactivity cutoffs), consistent with openWorldHint, but says nothing about cost, latency, or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the purpose leads immediately. It is somewhat dense with domain jargon but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description conveys the conceptual inputs. However, for a five-parameter review tool with zero schema descriptions and no usage routing among many review siblings, the definition is only minimally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so all five parameters (draft_id, version_id, assay_limit, min_hitcall, stressor_limit) are undocumented. The description mentions concepts like assay candidates and stressor links but never maps them to the limit/threshold parameters, so it fails to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Review') and a precise resource ('per-KER assay-cutoff ordering evidence for a draft'), and even enumerates the inputs it combines (draft stressor links, KE assay candidates, CompTox bioactivity cutoffs). It is distinguishable from generic siblings like review_draft_bundle or review_draft_evidence_gaps, though it never names them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use, when-not-to-use, or alternative-selection guidance. The description explains what the tool composes but not when an agent should reach for this review tool over the many other review_* siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

review_draft_bundleC
Read-onlyIdempotent

Build a unified draft review bundle that combines draft validation, structured evidence-gap findings, per-KER assay-cutoff ordering review, and optional chemical projection into one response.

ParametersJSON Schema
NameRequiredDescriptionDefault
casNo
nameNo
dtxsidNo
draft_idYes
inchikeyNo
version_idNo
assay_limitNo
min_hitcallNo
stressor_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
draftYes
draft_idYes
validationYes
version_idYes
limitationsYes
evidence_gapsYes
bundle_summaryYes
chemical_queryYes
chemical_traceYes
external_supportYes
review_parametersYes
quantitative_reviewYes
evidence_gap_summaryYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds that this is a composite bundle and that chemical projection is optional, which is useful scope context, but it discloses nothing about cost, response size, or what 'chemical projection' entails.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that names the resource first and lists the components without filler. Slightly dense, but every clause earns its place in conveying what the bundle contains.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, but with 9 parameters at 0% schema coverage and no usage guidance, the definition is under-specified for a tool this broad. Critical inputs like assay_limit, min_hitcall, stressor_limit, and the draft/version identifiers are never explained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 9 parameters, so the description carries the full burden. It only hints at chemical projection (loosely tied to cas/name/dtxsid/inchikey) and says nothing about draft_id, version_id, assay_limit, min_hitcall, or stressor_limit, leaving most parameters semantically opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Build') and resource ('unified draft review bundle') and enumerates the four components it aggregates (validation, evidence-gap findings, per-KER assay-cutoff ordering, chemical projection). The enumeration maps onto sibling tools like review_draft_evidence_gaps and review_draft_assay_cutoff_ordering, so an agent can infer the aggregate nature, though those siblings are never named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use, when-not-to-use, or alternative guidance. The phrase 'combines ... into one response' only weakly implies this is a convenience wrapper over the individual review tools; the agent is left to infer that it should prefer this over calling the specialized siblings separately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

review_draft_evidence_gapsB
Read-onlyIdempotent

Mine one draft for concrete evidence gaps across root metadata, topology, KE assay coverage, KER evidence fields, and linked stressor resolvability.

ParametersJSON Schema
NameRequiredDescriptionDefault
draft_idYes
version_idNo
assay_limitNo
min_hitcallNo
stressor_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
draftYes
summaryYes
draft_idYes
stressorsYes
key_eventsYes
version_idYes
global_gapsYes
limitationsYes
relationshipsYes
bundle_summaryYes
recommendationsYes
review_parametersYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is fully covered structurally and there is no contradiction. The description adds only the scope of what is mined, with nothing about cost, rate limits, or result shape; with annotations carrying the behavioral load, this is an adequate but unremarkable 3.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence with the verb front-loaded and no filler. It is jargon-heavy but every clause earns its place by naming a gap category.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and annotations cover the safety profile. However, for a five-parameter tool with zero schema coverage, the description leaves the agent without any guidance on parameter behavior or when this review should be run relative to sibling review tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and none of the five parameters (version_id, assay_limit, min_hitcall, stressor_limit) are explained in the description. Only draft_id is obliquely implied by 'one draft', leaving the tuning parameters completely undocumented in prose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('mine') tied to a resource ('one draft') and enumerates the five dimensions of gaps it surfaces (root metadata, topology, KE assay coverage, KER evidence fields, stressor resolvability). It is clearly distinguishable from sibling tools like validate_draft_oecd or review_draft_bundle in intent, though it never explicitly contrasts itself with those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus alternatives such as review_draft_bundle, review_draft_assay_cutoff_ordering, or validate_draft_oecd, and no prerequisites or exclusions. Usage is only loosely implied by 'one draft' and the gap-analysis framing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

review_registry_handoff_bundleB
Read-onlyIdempotent

Review a Registry aop_context handoff bundle and return bounded-use import guidance for AOP draft review.

ParametersJSON Schema
NameRequiredDescriptionDefault
bundleYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
sourceYes
summaryYes
limitationsYes
evidence_itemsYes
draft_import_planYes
bounded_use_warningsYes
scientific_review_flagsYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, and destructiveHint=false, so the full safety profile is covered structurally. The description adds only the output intent ('bounded-use import guidance'), and says nothing extra about validation failure modes or what 'bounded-use' actually constrains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the action and states the output goal, with no filler. It is dense with domain jargon but wastes no words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the annotations fully cover behavior. However, for a tool whose sole input is a nested freeform object at 0% schema coverage, the description does not provide enough guidance to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one parameter with 0% schema description coverage; the schema types it only as a freeform object with additionalProperties=true. The description names the concept ('Registry aop_context handoff bundle') but gives no indication of the expected fields or shape, so an agent has almost nothing to construct a valid bundle from.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Review') and resource ('Registry aop_context handoff bundle') and clarifies the output ('bounded-use import guidance for AOP draft review'). It distinguishes itself from attach_registry_handoff_to_draft by reviewing rather than attaching, but the jargon-heavy noun phrase leaves the actual subject matter somewhat opaque.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It says the bundle is for AOP draft review, which implies a context, but there is no explicit when-to-use, when-not-to-use, or routing to alternatives. The closely related sibling attach_registry_handoff_to_draft is never mentioned, so an agent gets no help choosing between reviewing and attaching.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_draft_review_artifactC
Destructive

Render and save a draft review artifact to the local artifact output directory, with optional subdirectory, filename override, and publication-style markdown profile support.

ParametersJSON Schema
NameRequiredDescriptionDefault
casNo
nameNo
dtxsidNo
formatNomarkdown
draft_idYes
filenameNo
inchikeyNo
overwriteNo
version_idNo
assay_limitNo
min_hitcallNo
subdirectoryNo
stressor_limitNo
artifact_profileNoreview

Output Schema

ParametersJSON Schema
NameRequiredDescription
pathYes
formatYes
sha256Yes
draft_idYes
filenameYes
saved_atYes
version_idYes
bytes_writtenYes
metadata_pathYes
relative_pathYes
bundle_summaryYes
section_titlesYes
artifact_profileYes
output_directoryYes
artifact_integrityYes
evidence_gap_summaryNo
draft_version_integrityYes
overwrote_existing_fileYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations declare destructiveHint=true, readOnlyHint=false and idempotentHint=false, so the description's job is to add context. It does disclose that writing happens to a local output directory, but it never mentions the overwrite behavior (the schema has an 'overwrite' param defaulting to false) nor what happens to existing files—material for a destructive write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence that front-loads the core action and destination before listing optional variations. No filler, though the trailing 'publication-style markdown profile support' phrasing is slightly opaque.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, 14-parameter mutation tool, this description is far too thin: no overwrite semantics, no parameter explanations, and no routing against sibling artifact tools. An output schema exists so return values need not be covered, but the call-side gaps remain significant.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 14 parameters, so the description must carry the burden. It only gestures at three of them (subdirectory, filename override, profile) and says nothing about draft_id, version_id, overwrite, format, or the assay/stressor limit and hitcall thresholds—most parameters remain unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb ('render and save') and resource ('draft review artifact') and states the destination ('local artifact output directory'). However, it does not differentiate itself from close siblings like export_draft_review_artifact or list_saved_draft_review_artifacts, leaving the agent to guess which of these artifact tools to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance and no mention of the sibling alternatives (export_draft_review_artifact, list_saved_draft_review_artifacts). An agent cannot infer from this text when this tool is the right choice versus exporting or listing artifacts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_aopsC
Read-onlyIdempotent

Search Adverse Outcome Pathways by text query.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true, covering the safety and idempotency profile. The description adds nothing beyond that, such as ranking behavior, whether an empty/null text lists everything, or the effect of limit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler and no trailing explanation, so it is efficiently structured. It is arguably under-specified rather than over-long.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and annotations cover safety. What is missing is everything an agent needs to call it correctly: the meaning of a null/omitted text, the limit semantics, and how results relate to the other AOP retrieval tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries full responsibility for parameter meaning. 'By text query' loosely maps to the text parameter, but it never addresses that text is nullable with a null default (is it list-all?) or what limit does.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Search) and resource (Adverse Outcome Pathways) with the method (text query), so the agent knows the operation. However, it does nothing to distinguish itself from siblings like get_aop, get_related_aops, or the many list_* tools that also surface AOP data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this search versus get_aop or get_related_aops, nor on what a text query matches. The agent must infer the routing decision entirely on its own.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_assays_for_key_eventA
Read-onlyIdempotent

Given a key event, return candidate assays using KE-derived gene and phrase terms. This is a discovery helper, not a curated KE-to-assay mapping.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
key_event_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
key_eventYes
limitationsYes
derived_search_termsYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world). The description adds genuine value beyond them by disclosing that results are heuristic candidates derived from gene/phrase terms rather than curated mappings — an important reliability signal for the agent. It stops short of describing result ordering or volume behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with zero waste; the core action is front-loaded and the caveat follows immediately as supporting context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only discovery tool with annotations covering safety and an output schema covering return shape, the description supplies what is missing: purpose, mechanism, and the candidate-vs-curated caveat. The unexplained limit parameter is the only real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden, yet it only obliquely implies the meaning of key_event_id ("Given a key event") and says nothing about the limit parameter, its default of 25, or its 1-100 range. Half the parameters remain unexplained by either schema or description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (return candidate assays), resource (assays), and mechanism (KE-derived gene and phrase terms), and explicitly demarcates the boundary against a curated KE-to-assay mapping. An agent can tell this apart from the AOP-oriented siblings like list_assays_for_aop without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"This is a discovery helper, not a curated KE-to-assay mapping" gives clear context for when the tool is appropriate (exploratory candidate generation rather than authoritative lookup). However, it does not name an explicit alternative tool or state when-not conditions beyond that single contrast.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trace_chemical_on_draftB
Read-onlyIdempotent

Project one chemical's CompTox bioactivity onto draft key events by matching each KE to candidate assays and returning a draft graph activity overlay.

ParametersJSON Schema
NameRequiredDescriptionDefault
casNo
nameNo
dtxsidNo
draft_idYes
inchikeyNo
version_idNo
assay_limitNo
min_hitcallNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
draftYes
summaryYes
chemicalYes
draft_idYes
key_eventsYes
version_idYes
limitationsYes
relationshipsYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds the matching mechanism (each KE matched to candidate assays) but says nothing about cost, latency, or what happens when a chemical matches no assay, and output schema handles returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with the core action front-loaded and no filler. It is dense but appropriately sized for the operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers the return value and annotations cover safety, but for an 8-parameter tool with zero schema descriptions, the definition omits identifier-selection rules and threshold semantics that an agent needs to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 8 parameters, so the description must compensate and does not. It never explains that cas/name/dtxsid/inchikey are alternative chemical identifiers, nor what version_id, assay_limit (default 10, max 25), or min_hitcall (default 0.9) control.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Project') and a specific resource ('one chemical's CompTox bioactivity onto draft key events'), including the intermediate step of matching KEs to candidate assays. It is distinguishable from siblings like map_chemical_to_aops, though the phrase 'draft graph activity overlay' is jargon-heavy.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No indication of when to use this versus map_chemical_to_aops, search_assays_for_key_event, or get_evidence_matrix, nor any prerequisite (e.g., a draft must exist). The choice among four chemical identifier parameters is left entirely unguided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_draft_oecdB
Read-onlyIdempotent

Validate a draft against OECD AOP handbook-style completeness expectations.

ParametersJSON Schema
NameRequiredDescriptionDefault
draft_idYes
version_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
summaryYes
draft_idYes
version_idYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a safe, idempotent, non-destructive, closed-world read, so the safety profile is covered. The description adds only the notion of 'handbook-style completeness expectations', which hints at the check performed but does not disclose what a failure looks like or which rule set is enforced. Adequate but thin given annotations carry most of the burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no wasted words. The tradeoff is that its brevity comes from under-specification rather than tight expression of complete information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. But for a validation tool whose value hinges on the criteria applied, the phrase 'OECD AOP handbook-style completeness expectations' is too vague, and the version_id semantics are unexplained, leaving real gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for two parameters, and the description says nothing about either. In particular it never explains that version_id is optional or whether omitting it validates the latest version versus the whole draft — meaningfully important semantics left undocumented in both places.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb (validate) and resource (a draft) scoped to OECD AOP handbook-style completeness. However, it does not distinguish itself from the many sibling review_draft_* tools (e.g. review_draft_evidence_gaps, review_draft_bundle), so an agent cannot tell which sibling applies from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use, when-not-to-use, or alternative guidance is given. With several sibling draft-review tools available, the description leaves the agent to guess when 'validate' should be preferred over 'review_draft_evidence_gaps' or 'review_draft_bundle'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_tool_call_audit_logB
Read-onlyIdempotent

Verify the durable MCP tool-call audit JSONL hash chain from the configured audit log path or an explicit local path.

ParametersJSON Schema
NameRequiredDescriptionDefault
audit_log_pathNoOptional durable MCP audit JSONL path to verify. Defaults to AOP_MCP_AUDIT_LOG_PATH when configured.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pathYes
chainYes
existsYes
warningsYes
configuredYes
using_configured_pathYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the agent knows this is a safe, repeatable read operation on local data. The description adds that it operates on a 'durable' hash chain and mentions the default path source, which is useful context, but doesn't describe what verification returns (e.g., pass/fail, tamper detection details) or error behavior. The baseline is lower because annotations carry the safety profile, and the description adds some but not rich behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that states the action, the target, and the path options. No waste, no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. The annotations cover safety and idempotency. However, with no usage guidance and minimal behavioral context beyond what structured fields provide, the description is adequate but leaves gaps for an agent deciding when and why to invoke verification. For a tool with a single optional parameter and full schema coverage, this is minimally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents the single parameter including its default behavior. The description mentions 'the configured audit log path or an explicit local path,' which reinforces the parameter's purpose without adding schema-level details. With one well-documented parameter, this is appropriately covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (Verify) and a specific resource (the durable MCP tool-call audit JSONL hash chain). It's clear and unambiguous. It doesn't explicitly distinguish itself from siblings like list_tool_call_audit_records or export_tool_call_audit_log_evidence, but 'verify' + 'hash chain' is a distinct operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives. Is verification expected before export? Is it part of a compliance workflow? The description offers no when-to-use or prerequisite information. It leaves the agent to infer usage entirely.

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.

  1. 42 tool updatesv0.10.0
    • First observedadd_or_update_ke
    • First observedadd_or_update_ker
    • First observedassess_aop_confidence
    • First observedattach_registry_handoff_to_draft
    • First observedcreate_draft_aop
    • First observeddiscover_orphan_stressors_for_aop
    • First observeddiscover_orphan_stressors_for_aops
    • First observeddiscover_orphan_stressors_for_query
    • First observedexport_assays_table
    • First observedexport_draft_replay_package
    • First observedexport_draft_review_artifact
    • First observedexport_tool_call_audit_log_evidence
    • First observedfind_paths_between_events
    • First observedget_aop
    • First observedget_applicability
    • First observedget_assays_for_aop
    • First observedget_assays_for_aops
    • First observedget_evidence_matrix
    • First observedget_ker
    • First observedget_key_event
    • First observedget_related_aops
    • First observedlink_stressor
    • First observedlist_assays_for_aop
    • First observedlist_assays_for_aops
    • First observedlist_assays_for_query
    • First observedlist_kers
    • First observedlist_key_events
    • First observedlist_saved_draft_review_artifacts
    • First observedlist_tool_call_audit_records
    • First observedmap_assay_to_aops
    • First observedmap_chemical_to_aops
    • First observedplan_linear_draft_review_document
    • First observedreview_draft_assay_cutoff_ordering
    • First observedreview_draft_bundle
    • First observedreview_draft_evidence_gaps
    • First observedreview_registry_handoff_bundle
    • First observedsave_draft_review_artifact
    • First observedsearch_aops
    • First observedsearch_assays_for_key_event
    • First observedtrace_chemical_on_draft
    • First observedvalidate_draft_oecd
    • First observedverify_tool_call_audit_log

TDQS

C2.7/5.0

Scored across 42 tools

Disambiguation2/5

The set contains multiple near-duplicate tools with overlapping purposes, especially the list_assays_for_aop vs get_assays_for_aop and list_assays_for_aops vs get_assays_for_aops pairs, plus three discover_orphan_stressors variants. An agent could easily misselect among assay discovery and draft-review/export tools despite descriptions. Some distinctions exist, but boundaries are blurred.

Naming Consistency4/5

Most names follow a snake_case verb_noun pattern (get_aop, list_key_events, create_draft_aop), which is predictable. Some deviations like add_or_update_ke, plan_linear_draft_review_document, and trace_chemical_on_draft introduce minor inconsistency, and the list_/get_ synonym split weakens consistency.

Tool Count2/5

42 tools is excessive for a single domain and includes many input-variant duplicates (single vs multiple AOPs, query vs explicit) that could be consolidated. This exceeds the 25+ threshold for 'too many' per the rubric.

Completeness4/5

The surface covers core AOP lifecycle operations: search/get AOPs, key events, KERs, assays, chemical mapping, draft creation, KE/KER editing, validation, evidence review, and export/audit. Missing delete/remove operations and draft-level metadata updates are minor gaps agents can work around.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that reproduces the results of Nikitin et al., 'Towards Explainable Computational Toxicology: Linking Antitargets to Rodent Acute Toxicity' as callable tools, enabling users to compute toxicity predictions and mechanistic analyses deterministically from a bundled dataset.
    -
  • A
    license
    B
    quality
    A
    maintenance
    MCP server that exposes the Open Targets Platform GraphQL API as a set of tools for querying biomedical data such as targets, diseases, drugs, and genetic evidence.
    68
    266 PyPI
    19
    MIT