Skip to main content
Glama
sbl-sdsc

MCP GeneLab Server

by sbl-sdsc

create_volcano_plot

Generate a volcano plot for differential expression, methylation, or abundance data from an assay, labeling top significant points and returning a summary and image. Handles thousands of features.

Instructions

Create a volcano plot for differential data from the given assay.

Works for three differential measurement types:

  • 'expression': -[MEASURED_DIFFERENTIAL_EXPRESSION_ASmMG]-> MGene x = log2fc, y = -log10(adj_p_value), labels = gene symbol Magnitude filter: log2fc_threshold (default 1.0 = 2-fold)

  • 'methylation': -[MEASURED_DIFFERENTIAL_METHYLATION_ASmMR]-> MethylationRegion x = methylation_diff, y = -log10(q_value), labels = gene symbol (joined via METHYLATED_IN_MGmMR back to MGene for labeling) Magnitude filter: methylation_diff_threshold (default 10.0 = 10%)

  • 'abundance': -[MEASURED_DIFFERENTIAL_ABUNDANCE_ASmO]-> Organism x = log2fc, y = -log10(significance), labels = organism name Magnitude filter: log2fc_threshold (default 1.0 = 2-fold) Significance is method-aware: DESeq2 rows use adj_p_value, ANCOM-BC rows use q_value.

Points are colored by significance:

  • Red: positive direction (upregulated / hypermethylated / increased)

  • Blue: negative direction (downregulated / hypomethylated / decreased)

  • Gray: not significant

Returns a markdown summary, an inline PNG image (if small enough), and the saved file path. Designed to handle assays with thousands of features without timing out.

Input Schema

NameRequiredDescriptionDefault
top_nNoHow many significant points to label in the plot (selected by smallest p/q-value).
assay_idYesAssay identifier (e.g., 'OSD-253-6c5f9f37b9cb2ebeb2743875af4bdc86')
data_typeNoWhich kind of differential data to plot. Options: 'expression' (differentially expressed genes), 'methylation' (differentially methylated regions), 'abundance' (differentially abundant organisms; works for both DESeq2 and ANCOM-BC). Default: 'expression'.expression
session_idNoSession id returned by `create_session()`. This server serves many users from one process; the session id is what keeps your output directory and generated plots private to you. Pass the SAME value on every tool call. If the server replies that the session is unknown or expired, call `create_session()` again and use the new id.
figsize_widthNoFigure width in inches
figsize_heightNoFigure height in inches
adj_p_thresholdNoAdjusted p-value (DESeq2) / q-value (ANCOM-BC, methylation) threshold for significance. For abundance, both fields are checked in a method-aware way.
log2fc_thresholdNoLog2 fold change threshold (default 1.0 = 2-fold). Applies to data_type='expression' and data_type='abundance'. Ignored for data_type='methylation' (use methylation_diff_threshold instead).
label_avoid_overlapNoIf True, use adjustText to reposition labels to avoid overlap. Disable on very large assays for faster rendering.
methylation_diff_thresholdNoMethylation difference threshold in percentage points (default 10.0 = |diff| > 10%). Applies only to data_type='methylation'. Ignored for other data types.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changedv1.0.0
    • changedInput schema / properties / adj_p_threshold / description
      Previous value: -"Adjusted p-value threshold for significance"New value: +"Adjusted p-value (DESeq2) / q-value (ANCOM-BC, methylation) threshold for significance. For abundance, both fields are checked in a method-aware way."
    • addedInput schema / properties / data_type
      Added value: +{
      +  "default": "expression",
      +  "description": "Which kind of differential data to plot. Options: 'expression' (differentially expressed genes), 'methylation' (differentially methylated regions), 'abundance' (differentially abundant organisms; works for both DESeq2 and ANCOM-BC). Default: 'expression'.",
      +  "title": "Data Type",
      +  "type": "string"
      +}
    • addedInput schema / properties / label_avoid_overlap
      Added value: +{
      +  "default": true,
      +  "description": "If True, use adjustText to reposition labels to avoid overlap. Disable on very large assays for faster rendering.",
      +  "title": "Label Avoid Overlap",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / log2fc_threshold / description
      Previous value: -"Log2 fold change threshold for highlighting significant genes"New value: +"Log2 fold change threshold (default 1.0 = 2-fold). Applies to data_type='expression' and data_type='abundance'. Ignored for data_type='methylation' (use methylation_diff_threshold instead)."
    • addedInput schema / properties / methylation_diff_threshold
      Added value: +{
      +  "default": 10,
      +  "description": "Methylation difference threshold in percentage points (default 10.0 = |diff| > 10%). Applies only to data_type='methylation'. Ignored for other data types.",
      +  "title": "Methylation Diff Threshold",
      +  "type": "number"
      +}
    • addedInput schema / properties / session_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Session id returned by `create_session()`. This server serves many users from one process; the session id is what keeps your output directory and generated plots private to you. Pass the SAME value on every tool call. If the server replies that the session is unknown or expired, call `create_session()` again and use the new id.",
      +  "title": "Session Id"
      +}
    • changedInput schema / properties / top_n / description
      Previous value: -"How many significant genes to label in the plot"New value: +"How many significant points to label in the plot (selected by smallest p/q-value)."
    • changedOutput schema / (root)
      Previous value: -{
      -  "$defs": {
      -    "Annotations": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "audience": {
      -          "anyOf": [
      -            {
      -              "items": {
      -                "enum": [
      -                  "user",
      -                  "assistant"
      -                ],
      -                "type": "string"
      -              },
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Audience"
      -        },
      -        "priority": {
      -          "anyOf": [
      -            {
      -              "maximum": 1,
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Priority"
      -        }
      -      },
      -      "title": "Annotations",
      -      "type": "object"
      -    },
      -    "AudioContent": {
      -      "additionalProperties": true,
      -      "description": "Audio content for a message.",
      -      "properties": {
      -        "_meta": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Meta"
      -        },
      -        "annotations": {
      -          "anyOf": [
      -            {
      -              "$ref": "#/$defs/Annotations"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null
      -        },
      -        "data": {
      -          "title": "Data",
      -          "type": "string"
      -        },
      -        "mimeType": {
      -          "title": "Mimetype",
      -          "type": "string"
      -        },
      -        "type": {
      -          "const": "audio",
      -          "title": "Type",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "type",
      -        "data",
      -        "mimeType"
      -      ],
      -      "title": "AudioContent",
      -      "type": "object"
      -    },
      -    "BlobResourceContents": {
      -      "additionalProperties": true,
      -      "description": "Binary contents of a resource.",
      -      "properties": {
      -        "_meta": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Meta"
      -        },
      -        "blob": {
      -          "title": "Blob",
      -          "type": "string"
      -        },
      -        "mimeType": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Mimetype"
      -        },
      -        "uri": {
      -          "format": "uri",
      -          "minLength": 1,
      -          "title": "Uri",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "uri",
      -        "blob"
      -      ],
      -      "title": "BlobResourceContents",
      -      "type": "object"
      -    },
      -    "EmbeddedResource": {
      -      "additionalProperties": true,
      -      "description": "The contents of a resource, embedded into a prompt or tool call result.\n\nIt is up to the client how best to render embedded resources for the benefit\nof the LLM and/or the user.",
      -      "properties": {
      -        "_meta": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Meta"
      -        },
      -        "annotations": {
      -          "anyOf": [
      -            {
      -              "$ref": "#/$defs/Annotations"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null
      -        },
      -        "resource": {
      -          "anyOf": [
      -            {
      -              "$ref": "#/$defs/TextResourceContents"
      -            },
      -            {
      -              "$ref": "#/$defs/BlobResourceContents"
      -            }
      -          ],
      -          "title": "Resource"
      -        },
      -        "type": {
      -          "const": "resource",
      -          "title": "Type",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "type",
      -        "resource"
      -      ],
      -      "title": "EmbeddedResource",
      -      "type": "object"
      -    },
      -    "Icon": {
      -      "additionalProperties": true,
      -      "description": "An icon for display in user interfaces.",
      -      "properties": {
      -        "mimeType": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Mimetype"
      -        },
      -        "sizes": {
      -          "anyOf": [
      -            {
      -              "items": {
      -                "type": "string"
      -              },
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Sizes"
      -        },
      -        "src": {
      -          "title": "Src",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "src"
      -      ],
      -      "title": "Icon",
      -      "type": "object"
      -    },
      -    "ImageContent": {
      -      "additionalProperties": true,
      -      "description": "Image content for a message.",
      -      "properties": {
      -        "_meta": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Meta"
      -        },
      -        "annotations": {
      -          "anyOf": [
      -            {
      -              "$ref": "#/$defs/Annotations"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null
      -        },
      -        "data": {
      -          "title": "Data",
      -          "type": "string"
      -        },
      -        "mimeType": {
      -          "title": "Mimetype",
      -          "type": "string"
      -        },
      -        "type": {
      -          "const": "image",
      -          "title": "Type",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "type",
      -        "data",
      -        "mimeType"
      -      ],
      -      "title": "ImageContent",
      -      "type": "object"
      -    },
      -    "ResourceLink": {
      -      "additionalProperties": true,
      -      "description": "A resource that the server is capable of reading, included in a prompt or tool call result.\n\nNote: resource links returned by tools are not guaranteed to appear in the results of `resources/list` requests.",
      -      "properties": {
      -        "_meta": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Meta"
      -        },
      -        "annotations": {
      -          "anyOf": [
      -            {
      -              "$ref": "#/$defs/Annotations"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null
      -        },
      -        "description": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Description"
      -        },
      -        "icons": {
      -          "anyOf": [
      -            {
      -              "items": {
      -                "$ref": "#/$defs/Icon"
      -              },
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Icons"
      -        },
      -        "mimeType": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Mimetype"
      -        },
      -        "name": {
      -          "title": "Name",
      -          "type": "string"
      -        },
      -        "size": {
      -          "anyOf": [
      -            {
      -              "type": "integer"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Size"
      -        },
      -        "title": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Title"
      -        },
      -        "type": {
      -          "const": "resource_link",
      -          "title": "Type",
      -          "type": "string"
      -        },
      -        "uri": {
      -          "format": "uri",
      -          "minLength": 1,
      -          "title": "Uri",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "name",
      -        "uri",
      -        "type"
      -      ],
      -      "title": "ResourceLink",
      -      "type": "object"
      -    },
      -    "TextContent": {
      -      "additionalProperties": true,
      -      "description": "Text content for a message.",
      -      "properties": {
      -        "_meta": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Meta"
      -        },
      -        "annotations": {
      -          "anyOf": [
      -            {
      -              "$ref": "#/$defs/Annotations"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null
      -        },
      -        "text": {
      -          "title": "Text",
      -          "type": "string"
      -        },
      -        "type": {
      -          "const": "text",
      -          "title": "Type",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "type",
      -        "text"
      -      ],
      -      "title": "TextContent",
      -      "type": "object"
      -    },
      -    "TextResourceContents": {
      -      "additionalProperties": true,
      -      "description": "Text contents of a resource.",
      -      "properties": {
      -        "_meta": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Meta"
      -        },
      -        "mimeType": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Mimetype"
      -        },
      -        "text": {
      -          "title": "Text",
      -          "type": "string"
      -        },
      -        "uri": {
      -          "format": "uri",
      -          "minLength": 1,
      -          "title": "Uri",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "uri",
      -        "text"
      -      ],
      -      "title": "TextResourceContents",
      -      "type": "object"
      -    }
      -  },
      -  "properties": {
      -    "result": {
      -      "items": {
      -        "anyOf": [
      -          {
      -            "$ref": "#/$defs/TextContent"
      -          },
      -          {
      -            "$ref": "#/$defs/ImageContent"
      -          },
      -          {
      -            "$ref": "#/$defs/AudioContent"
      -          },
      -          {
      -            "$ref": "#/$defs/ResourceLink"
      -          },
      -          {
      -            "$ref": "#/$defs/EmbeddedResource"
      -          }
      -        ]
      -      },
      -      "title": "Result",
      -      "type": "array"
      -    }
      -  },
      -  "required": [
      -    "result"
      -  ],
      -  "title": "create_volcano_plotOutput",
      -  "type": "object"
      -}New value: +null
  2. First observedv0.4.0

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false and openWorldHint=false, so the write/non-idempotent nature is covered. The description adds genuine context beyond that: the return payload (markdown summary, inline PNG, saved path), the color encoding scheme, method-aware significance handling, and a performance note about large assays not timing out.

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 content is long but front-loaded with the purpose and organized as scannable bullets per data type, with axis and color conventions grouped logically. Some of the per-type detail restates schema content, but nothing is wasteful enough to impede comprehension and the structure aids fast scanning.

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 no output schema, the description correctly steps in to describe return values (markdown, PNG, file path) and rendering behavior. For a 10-parameter plotting tool it covers data types, thresholds, coloring and performance adequately; the only gap is the absence of prerequisite/session orchestration guidance, which the schema's session_id description partly carries.

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 baseline is 3, and the description meaningfully reinforces it by explaining that thresholds are magnitude filters with real units (default 1.0 = 2-fold, methylation diff in percentage points) and that the abundance significance field is method-aware. This adds interpretive value beyond the schema's field-level text, though it does overlap with several schema descriptions.

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?

Opens with a specific verb+resource: 'Create a volcano plot for differential data from the given assay.' It then enumerates exactly which measurement types it supports and how each maps to axes, clearly distinguishing it from sibling finders (find_differentially_*) and create_venn_diagram. An agent knows precisely what this tool produces without opening the schema.

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 per-data-type breakdown tells the agent which data_type to choose and which threshold applies, which is useful internal guidance. However, it never states when to prefer this over adjacent tools (e.g., the differential finders that would precede plotting) or any preconditions such as which assay types are plottable. Usage is implied through the data-type taxonomy rather than explicitly framed as when/when-not.

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