Skip to main content
Glama
Ajey95

ImmunoGraph MCP

validate_compound

Read-onlyIdempotent

Parse and canonicalize SMILES with RDKit to validate chemical syntax and identity, including explicit fixture records, before deduplication, descriptors, or ligand preparation.

Instructions

Parse and canonicalize supplied SMILES with RDKit for live-sourced compounds, or validate an explicit fixture record. Use before deduplication, descriptors, or ligand preparation; this checks chemical syntax and identity, not biological activity. RDKit unavailability returns a structured failure for the live path.

Input Schema

NameRequiredDescriptionDefault
runIdYesCaller-chosen identifier linking this call to one research run.
smilesYesChemical structure encoded as a SMILES string.
compoundIdYesStable identifier for the supplied compound within this run.
sourceStatusYesProvenance label for the supplied structure or compound.

Output Schema

NameRequiredDescriptionDefault
okYesWhether execution completed successfully.
dataNoTool-specific result fields on success.
metaYesRun identifiers, timings, and input/output hashes.
errorNoStructured failure on unsuccessful execution.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changedv0.2.1
    • addedInput schema / properties / compoundId / description
      Added value: +"Stable identifier for the supplied compound within this run."
    • addedInput schema / properties / runId / description
      Added value: +"Caller-chosen identifier linking this call to one research run."
    • addedInput schema / properties / smiles / description
      Added value: +"Chemical structure encoded as a SMILES string."
    • addedInput schema / properties / sourceStatus / description
      Added value: +"Provenance label for the supplied structure or compound."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": {},
      +  "properties": {
      +    "data": {
      +      "additionalProperties": {},
      +      "description": "Tool-specific result fields on success.",
      +      "properties": {},
      +      "type": "object"
      +    },
      +    "error": {
      +      "additionalProperties": false,
      +      "description": "Structured failure on unsuccessful execution.",
      +      "properties": {
      +        "category": {
      +          "type": "string"
      +        },
      +        "code": {
      +          "type": "string"
      +        },
      +        "details": {
      +          "additionalProperties": {},
      +          "properties": {},
      +          "type": "object"
      +        },
      +        "message": {
      +          "type": "string"
      +        },
      +        "retryable": {
      +          "type": "boolean"
      +        }
      +      },
      +      "required": [
      +        "code",
      +        "category",
      +        "message",
      +        "retryable"
      +      ],
      +      "type": "object"
      +    },
      +    "meta": {
      +      "additionalProperties": {},
      +      "description": "Run identifiers, timings, and input/output hashes.",
      +      "properties": {
      +        "completedAt": {
      +          "type": "string"
      +        },
      +        "durationMs": {
      +          "type": "number"
      +        },
      +        "inputHash": {
      +          "type": "string"
      +        },
      +        "outputHash": {
      +          "type": "string"
      +        },
      +        "requestId": {
      +          "type": "string"
      +        },
      +        "runId": {
      +          "type": "string"
      +        },
      +        "startedAt": {
      +          "type": "string"
      +        },
      +        "toolName": {
      +          "type": "string"
      +        },
      +        "toolVersion": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "requestId",
      +        "runId",
      +        "toolName",
      +        "toolVersion",
      +        "startedAt",
      +        "inputHash"
      +      ],
      +      "type": "object"
      +    },
      +    "ok": {
      +      "description": "Whether execution completed successfully.",
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "ok",
      +    "meta"
      +  ],
      +  "type": "object"
      +}
  2. First observedv0.2.0

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds behavior the annotations cannot express: canonicalization via RDKit and that RDKit unavailability yields a structured failure on the live path. What is not disclosed is whether the fixture path skips RDKit entirely or what 'explicit fixture record' validation 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?

Three tightly packed sentences that front-load the operation, then usage ordering, then failure behavior — no filler. Slightly dense phrasing ('live-sourced compounds, or validate an explicit fixture record') requires a second read, which keeps it just below the top mark.

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 ordering, scope, and RDKit failure handling. The remaining gap is the difference in behavior between the LIVE/CACHED and FIXTURE paths, which an agent must infer.

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 coverage is 100%, so the baseline is 3, but the description adds semantic linkage: it explains that the two modes correspond to the sourceStatus LIVE vs FIXTURE distinction, which the schema merely enumerates without explaining consequences. runId and compoundId remain solely covered by the schema.

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 concrete verb and resource ('Parse and canonicalize supplied SMILES with RDKit') plus the dual mode: live-sourced compounds vs an explicit fixture record. This distinguishes it clearly from sibling tools like calculate_molecular_descriptors or deduplicate_compounds, which operate downstream of validation.

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

Usage Guidelines5/5

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

Explicitly positions the tool in the workflow ('Use before deduplication, descriptors, or ligand preparation'), naming the sibling tools that require its output. It also draws a clear scope boundary ('checks chemical syntax and identity, not biological activity'), telling the agent when this tool is the wrong choice.

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