Skip to main content
Glama

ChatSpatial

MCP server for spatial transcriptomics analysis via natural language

Paper MLGenX @ ICLR 2026 ENAR 2026 IBC 2026 CI PyPI Python 3.11-3.14 License: MIT Docs Docker

ChatSpatial replaces ad-hoc LLM code generation with schema-enforced orchestration. Instead of generating arbitrary scripts, the LLM selects tools and parameters from a curated registry, making spatial transcriptomics workflows more reproducible across sessions and clients.

ChatSpatial exposes 20 schema-validated MCP tools that orchestrate 67 spatial transcriptomics methods across 13 analytical categories. The tools are the stable natural-language interface; the methods are the analysis backends selected through tool parameters.

The server implements MCP 2026-07-28 through the official Python SDK v2 and continues to serve 2025-11-25 clients through SDK-managed protocol negotiation. STDIO remains the secure local default; Streamable HTTP is available for explicitly configured HTTP deployments.


Start Here

Install uv once, then register ChatSpatial without creating or managing a Python environment:

Codex:

codex mcp add chatspatial -- uvx --from chatspatial chatspatial server

Claude Code:

claude mcp add --scope user chatspatial -- \
  uvx --from chatspatial chatspatial server

uvx creates an isolated environment on first launch and reuses its cache on later launches. Restart the MCP client after adding the server.

The command above installs the standard runtime. To make all 15 composable Python method families available in the same isolated MCP environment, use:

uvx --from 'chatspatial[full]' chatspatial server

full includes CellRank, FastCCC, the maintained spatial-domain and registration backends, annotation, enrichment, and the other portable Python families. R bridges, AESTETIK, and rctd-py remain separate because they have system, platform, or large-runtime requirements. See the installation guide before enabling those families.

Then:

  1. Run your first analysis — Quick Start

  2. Choose optional method families or a persistent environment — Installation Guide

  3. Configure another MCP client — Configuration Guide

  4. Reproduce the manuscript key results without an LLM — Reproduction image

Docker quick start:

docker pull cafferyyang777/chatspatial:latest

Minimal example prompt:

Load /absolute/path/to/spatial_data.h5ad and plot gene expression at the spatial coordinates

The Quick Start provides a downloadable sample and a Leiden workflow that runs with the standard installation. Its sample has spatial coordinates but no H&E image. SpaGCN requires the optional spatial-domains extra.

If you use Docker, mount host data to /data and prompt with the container path, for example /data/spatial_data.h5ad.

ChatSpatial works with any MCP-compatible client — Claude Code, Claude Desktop, Codex, OpenCode, and other MCP-capable tools.


Related MCP server: Liana-MCP

Capabilities

Current coverage includes 67 methods across 13 analytical categories, exposed through 20 MCP tools. Supports 10x Visium, Xenium, Slide-seq v2, MERFISH, seqFISH.

Category

Example methods

Data Loading & Preprocessing

Scanpy I/O, QC, Normalization, HVG, PCA, Neighbors

Visualization

Spatial plots, Embedding plots, Gene expression overlays

Spatial Domain Identification

SpaGCN, STAGATE, GraphST, BANKSY, AESTETIK, Leiden, Louvain

Deconvolution

FlashDeconv, Cell2location, RCTD (spacexr or rctd-py), DestVI, Stereoscope, SPOTlight, Tangram, CARD

Cell-Cell Communication

LIANA+, CellPhoneDB, CellChat (cellchat_r), FastCCC

Cell Type Annotation

Tangram, scANVI, CellAssign, mLLMCelltype, scType, SingleR, marker-score and threshold rules

Differential Expression

Wilcoxon, t-test, Logistic Regression, pyDESeq2

Trajectory Inference

CellRank, Palantir, DPT

RNA Velocity

scVelo, VeloVI

Spatial Statistics

Moran's I, Local Moran, Geary's C, Getis-Ord Gi*, Ripley's K, Co-occurrence, Neighborhood Enrichment, Centrality Scores, Local Join Count, Network Properties

Enrichment Analysis

GSEA, ORA, Enrichr, ssGSEA, Spatial EnrichMap

Spatially Variable Genes

SpatialDE, SPARK-X, FlashS

Multi-sample Integration

Harmony, BBKNN, Scanorama, scVI

CNV Analysis

InferCNVPy, Numbat

Spatial Registration

PASTE, STalign


Documentation

Guide

Use this when...

Installation

You need optional methods or a persistent Python environment

Docker

You want a reproducible container runtime or local dependency resolution fails

Configuration

You need exact MCP client syntax or the runtime path model

Quick Start

ChatSpatial is installed and you want the first successful analysis

Concepts

You need to choose an analysis strategy from a biological question

Examples

You want copy-pasteable natural-language workflow prompts

Methods Reference

You need canonical tool names, method names, parameters, and defaults

Troubleshooting

Setup, data loading, or analysis behavior is not working

Full Docs

You want the complete documentation site


Reproducibility

Each release publishes a reproduction image under the -repro tag. It re-executes the DLPFC spatial-domain and OSCC CARD deconvolution tool calls recorded during the manuscript experiments, without calling any LLM, and compares the results with the reported values:

docker run --rm -v "$PWD/out:/outputs" \
  cafferyyang777/chatspatial@sha256:ac3ba1ed8235c3d53ca72005d8ad2556cac007f5ddb932ae3e1d1241fa2cf9d8 \
  chatspatial-reproduce

reproducibility/ contains the image definition and describes what it checks. The experiment and analysis scripts for the manuscript are in ChatSpatial-Reproducibility.


Citation

If you use ChatSpatial in your research, please cite:

@article{Yang2026.02.26.708361,
  author = {Yang, Chen and Zhang, Xianyang and Chen, Jun},
  title = {ChatSpatial: Schema-Enforced Agentic Orchestration for Reproducible and Cross-Platform Spatial Transcriptomics},
  elocation-id = {2026.02.26.708361},
  year = {2026},
  doi = {10.64898/2026.02.26.708361},
  publisher = {Cold Spring Harbor Laboratory},
  URL = {https://www.biorxiv.org/content/early/2026/03/01/2026.02.26.708361},
  journal = {bioRxiv}
}

ChatSpatial orchestrates many excellent third-party methods. Please also cite the original tools your analysis used.


Contributing

Documentation improvements, bug reports, and new analysis methods are all welcome. See CONTRIBUTING.md.

MIT License · GitHub · Issues

Available Tools

20 tools
analyze_cell_communicationB
DestructiveIdempotent

Analyze cell-cell communication and ligand-receptor interaction patterns.

Args:
    data_id: Dataset ID
    params: Required - species, cell_type_key, and method. For mouse with liana, set liana_resource='mouseconsensus'.

subset_key + subset_categories restrict the analysis to those observations
(e.g. tc_le_region in ['TC', 'LE']).
NameRequiredDescriptionDefault
paramsYes
data_idYes

Output Schema

NameRequiredDescription
methodYes
data_idYes
speciesYes
databaseYes
warningsNoNon-fatal conditions that may affect result interpretation.
n_lr_pairsYes
results_keyNo
top_lr_pairsNo
analysis_typeYes
n_obs_analyzedNo
n_autocrine_loopsNo
n_significant_pairsYes
top_autocrine_loopsNo

TDQS

B3.2/5.0
Behavior2/5

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

Annotations declare destructiveHint=true, openWorldHint=true and readOnlyHint=false, yet the description says nothing about what is written, what may be overwritten, or where results go. For a long-running permutation-based analysis (1000 iterations default) it also omits runtime/cost expectations, so the most consequential behaviors are left entirely to the annotations.

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?

Short and front-loaded with the purpose, but the pseudo-docstring 'Args:' block wastes a line restating data_id, and the subset_key sentence is dangling after it with no framing. Content is minimal but the ordering is slightly disjointed.

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 required inputs plus the most error-prone configuration choices. What remains missing is guidance on spatial vs cluster mode and the destructive/write behavior, but the essentials for invoking it correctly are present.

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?

The description highlights the required params (species, cell_type_key, method) and adds a genuinely useful dependency rule (mouse + liana → liana_resource='mouseconsensus', subset_key paired with subset_categories). But the params object carries dozens of method-specific knobs that the description never characterizes, and the 'data_id: Dataset ID' line merely restates the schema.

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: 'Analyze cell-cell communication and ligand-receptor interaction patterns', which is clearly distinct from siblings like analyze_enrichment or analyze_trajectory_data. However it does not explicitly distinguish itself from analyze_spatial_statistics or note that it can run in both cluster and spatial modes.

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?

Offers practical routing hints ('For mouse with liana, set liana_resource=mouseconsensus') and a filtering example, but never says when to choose this tool over alternatives or when to enable/disable spatial analysis. Usage is implied rather than stated.

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

analyze_cnvA
DestructiveIdempotent

Analyze copy number variations (CNVs) in spatial transcriptomics data.

Args:
    data_id: Dataset identifier
    params: Required - reference_key, reference_categories, and optional method/thresholds.

Gene positions missing from adata.var are annotated from bundled Ensembl 110
tables (species: human GRCh38 or mouse GRCm39). exclude_gene_classes removes
immunoglobulin, ribosomal, mitochondrial or HLA genes from the CNV input;
query_categories restricts CNV clustering to those reference_key categories.
NameRequiredDescriptionDefault
paramsYes
data_idYes

Output Schema

NameRequiredDescription
methodYes
data_idYes
warningsNoNon-fatal conditions that may affect result interpretation.
cnv_score_keyNo
n_chromosomesYes
n_query_cellsNoObservations clustered when query_categories restricts clustering.
reference_keyYes
gene_positionsNoSource of gene positions: 'adata.var', or the bundled table with the number of genes matched by Ensembl ID and by symbol.
n_genes_analyzedYes
n_genes_excludedNoGenes matched by each excluded gene class or name pattern.
reference_categoriesYes
visualization_availableNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations declare destructiveHint=true and readOnlyHint=false, yet the description never says that the dataset is modified or what results get written (cnv_clusters labels are only mentioned in passing via query_categories). It does add real value on gene-position sourcing from bundled Ensembl 110 tables and on what exclude_gene_classes strips from the input, but the mutation surface remains undisclosed.

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?

One-sentence purpose up front, then a compact Args block, then behavior notes. A few sentences restate schema-level detail (gene_positions source, exclude_gene_classes contents) but nothing is filler.

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 and the nested params model is richly annotated, so return values need not be explained. The gap is behavioral: for a destructive, non-read-only operation, the description gives no warning that analysis results are persisted or that re-running may overwrite existing labels.

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?

Top-level schema coverage is 0% (data_id undocumented, params is a bare $ref), so the description must carry weight; it names the required fields and explains gene_positions fallback and query_categories filtering semantics. However, the nested CNVParameters schema already documents most of these in depth, so the description's marginal gain is modest.

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 and resource — 'Analyze copy number variations (CNVs) in spatial transcriptomics data' — which is unique among the siblings (none of which touch CNV). An agent can distinguish it immediately from find_markers, deconvolve_data, or identify_spatial_domains.

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 Args block flags which params are required (reference_key, reference_categories) and which are optional, giving implied preconditions. But it never says when to choose this tool over alternatives, nor when CNV analysis is inappropriate (e.g. no reference labels, no allele data for numbat).

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

analyze_enrichmentC
DestructiveIdempotent

Perform gene set enrichment analysis.

Args:
    data_id: Dataset ID
    params: Required - species must be specified. See EnrichmentParameters for methods and gene_set_database options.
NameRequiredDescriptionDefault
paramsYes
data_idYes

Output Schema

NameRequiredDescription
methodYes
warningsNoNon-fatal conditions that may affect result interpretation.
n_gene_setsYes
n_significantNo
top_gene_setsYes
top_depleted_setsYes
spatial_scores_keyNo
n_successful_signaturesNo

TDQS

C2.9/5.0
Behavior2/5

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

Annotations include destructiveHint=true and idempotentHint=true, but the description provides no additional behavioral context. It does not mention potential side effects, modifications to the dataset, or any safety considerations. While it doesn't contradict annotations, it adds no value beyond what the annotations already convey, leaving the agent uninformed about the tool's actual behavior on data.

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 extremely concise: a single sentence and two argument placeholders. It avoids redundancy and gets straight to the point. Every word earns its place, though it may be too sparse for a complex tool. However, for conciseness, it is exemplary—no fluff, no filler.

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?

Despite having an output schema, the description is minimal and does not explain the overall context of use. It fails to mention the type of data expected, the output interpretation, or any preconditions (e.g., data must be loaded and preprocessed). It also does not relate to the analysis pipeline or when to apply this analysis. For a tool with many configurable parameters and complex behavior, this is incomplete and leaves the agent without sufficient guidance.

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?

The schema provides detailed descriptions for most parameters (e.g., method, species, max_genes), and the description adds only a note that species must be specified and points to EnrichmentParameters for details. Given high schema coverage, the description adds marginal value. However, it does highlight the required nature of species, which is helpful, but does not explain semantics beyond that. Baseline of 3 is appropriate as the description slightly supplements the schema but does not compensate for deeper meaning.

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 the tool 'Performs gene set enrichment analysis' which is a specific verb and resource. It clearly distinguishes from generic analysis tools but doesn't explicitly differentiate from sibling tools like analyze_spatial_statistics or deconvolve_data, though the enrichment focus is evident. It lacks a clear scope or mention of input/output context, but the core purpose is unambiguous.

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 only a minimal usage hint: 'Required - species must be specified.' It does not explain when to use this tool over alternatives, what scenarios it suits, or when not to use it. There is no reference to the relevant analysis workflow or comparison with sibling tools like find_markers or compute_embeddings. This guidance is insufficient for an agent to make an informed selection.

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

analyze_spatial_statisticsA
DestructiveIdempotent

Analyze spatial statistics and autocorrelation patterns.

Args:
    data_id: Dataset ID
    params: Analysis parameters (analysis_type, cluster_key, genes). See SpatialStatisticsParameters for all types.

gene_selection='all' computes moran/geary for every gene; the full per-gene
table (rank, statistic, p, FDR) is stored at results_key, only top genes are returned.
NameRequiredDescriptionDefault
paramsNo
data_idYes

Output Schema

NameRequiredDescription
data_idYes
warningsNoNon-fatal conditions that may affect result interpretation.
results_keyNo
top_featuresNo
analysis_typeYes
n_significantNo
spatial_graphNo
summary_metricsNo
n_features_analyzedNo

TDQS

A3.6/5.0
Behavior4/5

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

The description adds meaningful behavioral context by explaining that gene_selection='all' computes Moran/Geary for every gene and stores the full per-gene table at results_key while returning only top genes. This aligns with the destructive/non-readOnly annotations because it discloses that results are written into the data object, though it does not elaborate on permissions or mutation scope.

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 compact and front-loads the core purpose before the Args block and the gene_selection note. It wastes little space, though the Args formatting is somewhat redundant with the schema.

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?

Given the tool's complexity, rich nested parameter schema, and presence of an output schema, the description covers the essential call shape and one important storage/return behavior. It still omits enough about analysis-type selection and cluster_key requirements that an agent must rely heavily on the schema.

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?

The top-level Args block briefly maps data_id to Dataset ID and params to analysis parameters, and points to SpatialStatisticsParameters for the full set. However, most parameter semantics live in the nested schema, which is richly documented, so the description itself adds only marginal meaning beyond the structured definition.

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: analyze spatial statistics and autocorrelation patterns. It is clear enough to distinguish this from most sibling tools, but it does not explicitly contrast with closely related tools such as find_spatial_genes or identify_spatial_domains.

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 guidance is implied through the parameter model and the note about gene_selection='all', but the description itself does not say when to choose this tool over siblings or when specific analysis types are appropriate. The schema carries much of the routing detail via analysis_type's enum description, leaving the prose only partially helpful.

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

analyze_trajectory_dataC
Destructive

Infer cellular trajectories and pseudotime ordering.

Args:
    data_id: Dataset ID
    params: Trajectory parameters (method, root_cell, spatial_weight, etc.)
NameRequiredDescriptionDefault
paramsNo
data_idYes

Output Schema

NameRequiredDescription
methodYes
data_idYes
warningsNoNon-fatal conditions that may affect result interpretation.
pseudotime_keyYes
spatial_weightYes
velocity_computedYes
pseudotime_computedYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already communicate readOnlyHint=false and destructiveHint=true, so the risk profile is known. The description adds no side-effect context, such as whether trajectory results overwrite existing data or require prior preprocessing, but it does not contradict the 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?

The description is short, front-loaded, and free of fluff. The args lines add minimal value because the schema already defines the parameters, but overall this is a compact, readable description.

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?

This is a complex trajectory-analysis tool with multiple methods, method-specific parameters, and a destructive hint, but the description only provides a one-line purpose. Important selection context—such as method-specific data requirements and expected inputs—is buried in the nested schema rather than presented in the description.

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 description only lists 'method, root_cell, spatial_weight, etc.' in passing and does not provide meaningful parameter semantics. It also uses 'root_cell' while the schema defines the field as 'root_cells'. The actual parameter understanding relies on the rich nested schema descriptions, not the tool 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?

The sentence 'Infer cellular trajectories and pseudotime ordering' names a specific analysis task with a clear action and object. It is distinct from most sibling tools, though it does not explicitly contrast with related tools like analyze_velocity_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?

No when-to-use guidance is provided: there are no hints about velocity prerequisites, when to choose palantir/dpt over cellrank, or when another analysis tool would be more appropriate. Some guidance exists only in the nested schema description, not in the tool description.

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

analyze_velocity_dataB
Destructive

Analyze RNA velocity to understand cellular dynamics. Requires 'spliced' and 'unspliced' layers.

Args:
    data_id: Dataset ID
    params: Velocity parameters (method, scvelo_mode, etc.)
NameRequiredDescriptionDefault
paramsNo
data_idYes

Output Schema

NameRequiredDescription
modeYes
data_idYes
warningsNoNon-fatal conditions that may affect result interpretation.
velocity_computedYes
velocity_graph_keyNo

TDQS

B3.4/5.0
Behavior2/5

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

The annotations already include destructiveHint=true and readOnlyHint=false, but the description adds no additional behavioral context such as what data might be modified, whether results are stored, or any side effects. The only extra information is the data prerequisite (spliced/unspliced layers), which is more about applicability than behavior. Thus, it contributes minimal value beyond the 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?

The description is concise and front-loaded, stating the main purpose in the first sentence. It then lists the arguments in a simple format. It avoids unnecessary fluff but could be slightly more structured, e.g., by using a numbered list or table for the args. Overall, it earns a 4 for economy of words.

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?

Despite having an output schema and annotations, the description is incomplete for a tool with this complexity. It only names two parameters, while the params parameter contains a large nested object with a dozen fields. There is no guidance on how to choose between methods (scvelo vs velovi), what the output contains, or what happens if certain layers are missing. A more complete description would help an agent correctly configure and invoke the tool.

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 compensate. It provides only terse definitions: 'data_id: Dataset ID' and 'params: Velocity parameters (method, scvelo_mode, etc.)'. While it gives examples of sub-parameters, it does not explain the many nested parameters or how they affect the analysis. The params object is a complex nested model with a dozen properties, and the description adds little meaning beyond what the schema already shows.

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?

The description clearly states the tool's purpose: 'Analyze RNA velocity to understand cellular dynamics.' This includes a specific verb ('analyze'), a specific resource ('RNA velocity'), and biological context. It distinguishes itself from sibling tools like analyze_trajectory_data by focusing specifically on RNA velocity, and it mentions the technical prerequisite of needing 'spliced' and 'unspliced' layers.

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?

The description gives a clear context for when the tool is applicable by specifying the requirement for 'spliced' and 'unspliced' layers, which is a key prerequisite. However, it does not mention alternative tools or explicitly state when not to use this tool, so it does not fully meet the 'explicit alternatives' criterion.

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

annotate_cell_typesA
Destructive

Annotate cell types in spatial transcriptomics data.

Args:
    data_id: Dataset ID
    params: Annotation parameters (method, reference_data_id, cell_type_key, etc.)

Note: Reference methods (tangram, scanvi) require reference_data_id to be preprocessed first.
Rule-based methods: marker_score labels the groups of cluster_label (e.g. spatial
domains) by mean log-normalized marker expression; threshold labels observations
by a cutoff on a numeric obs column (e.g. deconvolution_rctd_<cell type>).
Both write to output_key.
NameRequiredDescriptionDefault
paramsNo
data_idYes

Output Schema

NameRequiredDescription
countsYes
methodYes
data_idYes
warningsNoNon-fatal conditions that may affect result interpretation.
cell_typesYes
output_keyYes
group_labelsNomarker_score: label given to each group of cluster_label.
group_scoresNomarker_score: score of each group for each label.
markers_usedNomarker_score: marker genes found in the data for each label.
confidence_keyNo
confidence_scoresNo
tangram_mapping_scoreNo

TDQS

A3.8/5.0
Behavior3/5

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

The description adds meaningful behavioral context: rule-based methods write labels to output_key, reference methods require preprocessed reference data, and marker_score assigns labels in order. However, it does not warn about overwriting existing obs columns or discuss computational cost, even though annotations mark the tool destructive and open-world.

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 front-loaded with the purpose and then structured into Args and a Note. It is dense but efficient; a few details such as the full method list are left to the schema rather than repeated.

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 complex annotation tool with an output schema and destructive annotations, the description covers the main method families, prerequisites, and output-key behavior. It is not fully complete because it omits overwrite warnings and does not explain every method family, but the schema covers many parameter-level details.

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?

Although the top-level schema lists only data_id and params, the description adds real meaning beyond the schema by summarizing method categories, required reference_data_id, cell_type_key, marker_score/threshold behavior, and output_key. Many nested parameters are left to schema descriptions, but the key decision parameters are explained.

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: annotate cell types in spatial transcriptomics data. It is clear what the tool does, but it does not explicitly distinguish it from related siblings such as deconvolve_data or identify_spatial_domains.

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?

It gives useful usage guidance by explaining that reference-based methods tangram and scanvi require reference_data_id to be preprocessed first, and by explaining marker_score versus threshold behavior. It still does not explicitly state when to choose this tool over sibling annotation or domain-identification tools.

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

compare_conditionsA
DestructiveIdempotent

Compare experimental conditions using pseudobulk differential expression (DESeq2).

Args:
    data_id: Dataset ID
    params: Required - condition_key, condition1, condition2, sample_key, etc.
NameRequiredDescriptionDefault
paramsYes
data_idYes

Output Schema

NameRequiredDescription
methodYes
data_idYes
warningsNoNon-fatal conditions that may affect result interpretation.
comparisonYes
condition1Yes
condition2Yes
sample_keyYes
statisticsYes
results_keyYes
cell_type_keyNo
condition_keyYes
cell_type_resultsNo
global_n_significantNo
n_samples_condition1Yes
n_samples_condition2Yes
global_top_upregulatedNo
global_top_downregulatedNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations indicate readOnlyHint=false and destructiveHint=true, so the safety profile is declared. The description adds context by specifying DESeq2 and pseudobulk aggregation, and the schema mentions 'Requires 2+ samples per condition.' However, it does not explain what destructive side effects may occur or what state changes are involved, leaving a transparency gap despite 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?

The description is short and front-loaded with the core purpose, followed by a concise Args block. The 'etc.' and redundant parameter list slightly reduce precision, but there is no filler or unnecessary elaboration.

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?

Given the complexity of the tool, the rich input schema and output schema carry most of the burden. The nested schema includes thresholds, defaults, and usage differentiation. The top-level description is minimal but sufficient for basic selection; a bit more context about prerequisites or side effects would make it more 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?

The description lists required parameter names (condition_key, condition1, condition2, sample_key) but adds no semantics beyond the names. The input schema provides rich descriptions for every parameter, so the description adds minimal value beyond what the schema already covers.

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 clearly states the tool's purpose: 'Compare experimental conditions using pseudobulk differential expression (DESeq2).' This provides a specific verb, resource, and method. It does not explicitly name sibling tools, but the scope ('conditions' vs 'cell types') distinguishes it from tools like find_markers.

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?

The top-level description lacks usage guidance, but the input schema's nested ConditionComparisonParameters description explicitly contrasts compare_conditions with find_markers ('compares conditions ACROSS samples' vs 'cell types/clusters WITHIN a dataset'). This is useful but limited to one alternative and does not provide exclusions or other sibling comparisons.

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

compute_embeddingsB
Destructive

Compute dimensionality reduction (PCA, UMAP), clustering, and neighbor graphs.

Args:
    data_id: Dataset ID
    params: Embedding parameters (PCA, UMAP, clustering, etc.)
NameRequiredDescriptionDefault
paramsNo
data_idYes

Output Schema

NameRequiredDescription
data_idYes
skippedYes
computedYes
warningsNoNon-fatal conditions that may affect result interpretation.
n_clustersNo
pca_variance_ratioNo

TDQS

B3.1/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, so there is no contradiction. However, the description adds no behavioral context beyond the annotation—it does not mention overwriting existing results, storing outputs in the dataset, or dependencies like UMAP requiring neighbors.

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 concise sentences with the core operations front-loaded. No filler or redundant content.

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?

Given the complex nested params object and destructive behavior, the description is only a brief headline. It omits parameter dependencies, side effects, and usage context, leaving the agent under-informed for such a configurable tool.

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?

Top-level schema coverage is 0%, and the description only provides one-line glosses for data_id and params. The rich descriptions live inside the nested EmbeddingParameters schema, which the description does not surface or summarize effectively.

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?

The description opens with 'Compute dimensionality reduction (PCA, UMAP), clustering, and neighbor graphs,' which uses a specific verb and names concrete resources. It clearly distinguishes this from sibling tools focused on trajectory or spatial analysis.

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 siblings like analyze_trajectory_data or preprocess_data. The description lists operations but does not mention prerequisites, typical use cases, or exclusions.

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

deconvolve_dataC
Destructive

Deconvolve spatial spots to estimate cell type proportions.

Args:
    data_id: Dataset ID
    params: Required - method, cell_type_key, reference_data_id. See DeconvolutionParameters for all methods and options.
NameRequiredDescriptionDefault
paramsYes
data_idYes

Output Schema

NameRequiredDescription
methodYes
data_idYes
n_spotsNo
warningsNoNon-fatal conditions that may affect result interpretation.
cell_typesYes
genes_usedNo
n_cell_typesYes
proportions_keyYes
dominant_type_keyYes

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the agent knows this mutates state. The description adds nothing beyond that: no mention of runtime cost, GPU requirements (despite use_gpu param), reference data prerequisites, or that destructive behavior may involve writing/overwriting results.

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?

Front-loaded purpose sentence followed by a compact Args block. Efficient, though the Args block restates schema field names with little added value.

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, open-world tool with a large nested parameter object, the description omits prerequisites (must load a reference dataset first?), method selection guidance, and any behavioral caveats. The output schema existing removes the need to explain returns, but core missing context remains.

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 effectively 0% at the top level; the description only names three nested fields (method, cell_type_key, reference_data_id) without explaining method tradeoffs, required reference loading, or which methods support what. It points the agent to DeconvolutionParameters without surfacing any of its ~60 options.

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: 'Deconvolve spatial spots to estimate cell type proportions.' Clear and distinguishable from siblings like annotate_cell_types or identify_spatial_domains, though it doesn't explicitly contrast with them.

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 stated, no mention of choosing among the eight deconvolution methods beyond pointing out that method lives in params. No alternative tool is named.

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

export_dataA
DestructiveIdempotent

Export dataset to disk for external script access.

Args:
    data_id: Dataset ID to export
    path: Custom path (default: ~/.chatspatial/active/{data_id}.h5ad)

Returns:
    Absolute path where data was exported
NameRequiredDescriptionDefault
pathNo
data_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=false, destructiveHint=true, and idempotentHint=true, so the agent knows it's a non-read-only, possibly destructive, idempotent operation. The description adds value by specifying the default export path and the return value (absolute path). However, it does not elaborate on what 'destructive' means (e.g., overwriting existing files), which would enhance transparency.

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 concise and well-structured: a one-sentence summary, followed by an Args list and Returns line. Every line is informative, with no filler words or redundant information.

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 simple export tool with two parameters, the description covers the purpose, parameters, default path, and return format. The output schema is present, so return value details are not fully required in the description. It is complete enough for an agent to use the tool, though it could mention overwrite behavior given the destructive hint.

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?

The schema has no descriptions beyond titles, so the description carries the full burden of explaining parameters. The Args section explains both 'data_id' as the dataset ID and 'path' as the custom path with a default, which adds meaningful semantic context beyond 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?

The description starts with 'Export dataset to disk for external script access', which uses a specific verb (export) and resource (dataset), and clearly states the purpose. It naturally distinguishes itself from sibling tools that analyze, visualize, or preprocess data, as this is the only export tool.

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?

The description clearly states the use case: 'for external script access', which implies when to use it. It does not explicitly mention when not to use it or provide alternatives, but given the distinct purpose among siblings, the context is clear enough.

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

find_markersC
DestructiveIdempotent

Find differentially expressed genes between groups.

Args:
    data_id: Dataset ID
    params: Required - group_key and optional method, group1/group2, n_top_genes, etc.
NameRequiredDescriptionDefault
paramsYes
data_idYes

Output Schema

NameRequiredDescription
data_idYes
n_genesYes
warningsNoNon-fatal conditions that may affect result interpretation.
comparisonYes
n_genes_excludedNoGenes removed before testing by each excluded gene class or pattern.
top_genes_by_groupNo

TDQS

C2.6/5.0
Behavior2/5

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

Annotations declare destructiveHint=true and readOnlyHint=false, implying this operation can modify data, but the description says only 'Find' and gives no warning about what is written or overwritten. It does not add behavioral context beyond the annotations and leaves the side-effect profile undisclosed.

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?

The description is short and front-loads the purpose, but the Args block is an incomplete duplicate of schema information and ends with a vague 'etc.' rather than useful 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?

For a differential expression tool with a destructive annotation, many optional parameters, and an output schema, the description is missing critical context: what happens to the dataset, how groups are handled, and how to choose methods or parameters. It is not complete enough to support correct invocation beyond the schema.

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 description names data_id, group_key, method, group1/group2, and n_top_genes, but then falls back to 'etc.' and omits sample_key, min_cells, pseudocount, and exclusion parameters. With schema_description_coverage reported as 0%, the description does not compensate by explaining parameter meanings or interactions.

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 first sentence states a specific verb and resource: find differentially expressed genes between groups. It is clear what the tool does, but it does not distinguish itself from nearby siblings such as compare_conditions or find_spatial_genes.

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 guidance on when to use this tool versus alternatives, nor any prerequisites or exclusions. The Args section only restates required inputs rather than explaining the selection context.

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

find_spatial_genesC
DestructiveIdempotent

Identify spatially variable genes.

Args:
    data_id: Dataset ID
    params: Spatial variable gene parameters (method, n_top_genes, etc.)
NameRequiredDescriptionDefault
paramsNo
data_idYes

Output Schema

NameRequiredDescription
methodYes
data_idYes
warningsNoNon-fatal conditions that may affect result interpretation.
results_keyYes
spatial_genesYes
n_genes_analyzedYes
n_significant_genesYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already indicate destructiveHint: true and idempotentHint: true, but the description adds no behavioral detail such as side effects (e.g., modifying the dataset, storing results), runtime implications, or auth requirements. It merely states the action without any disclosure beyond the 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?

The description is extremely concise with no wasted words, and the Args section provides a clear structure. However, it is almost too terse, borderline under-specified. It earns a high score for lack of fluff but loses a point for being overly minimalist.

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?

Despite having an output schema, the description is incomplete for a tool with 18 parameters and destructive behavior. It does not mention expected outputs, potential runtime (e.g., SpatialDE slow), or side effects. Given the complexity, the description is far from sufficient for an agent to fully understand when and how to use it effectively.

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% because the description only mentions 'params' generically with examples like 'method, n_top_genes, etc.' It does not clarify parameter formats, defaults, or relationships. The schema itself has rich descriptions, but the description fails to add high-level guidance or summary beyond listing a couple of examples.

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?

The description clearly states the verb 'Identify' and the resource 'spatially variable genes', which is specific and distinguishable from siblings like find_markers and analyze_spatial_statistics. It concisely captures the tool's primary function.

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 is provided on when to use this tool versus alternatives. It does not mention conditions like needing spatial transcriptomics data, nor does it differentiate from related analysis tools. The description lacks any contextual hints for selection.

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

identify_spatial_domainsC
Destructive

Identify spatial domains and tissue architecture.

Args:
    data_id: Dataset ID
    params: Spatial domain parameters (method, n_domains, resolution, etc.)
NameRequiredDescriptionDefault
paramsNo
data_idYes

Output Schema

NameRequiredDescription
methodYes
data_idYes
warningsNoNon-fatal conditions that may affect result interpretation.
n_domainsYes
domain_keyYes
domain_countsYes
embeddings_keyNo
refined_domain_keyNo

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, but the description adds nothing behavioral: it does not say the tool writes domain labels back into the dataset, does not warn that some methods train neural networks (long runtime, GPU), and does not mention seed/reproducibility semantics. No contradiction, but negligible added value.

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?

Front-loads the purpose sentence, then a compact Args block with no filler. Well-sized, though the Args block is arguably redundant with the rich nested schema.

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 highly complex tool (30+ nested parameters, multiple methods, GPU training) the description is thin, but the nested schema is exhaustively documented and an output schema exists, so the biggest gaps are usage context and behavioral disclosure rather than parameter knowledge.

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?

Top-level schema description coverage is 0%, but the nested SpatialDomainParameters def documents every field in detail. The description names the key knobs (method, n_domains, resolution), giving a useful entry point, though it does not explain that method selection changes which of those knobs matter.

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: 'Identify spatial domains and tissue architecture.' This clearly distinguishes it from sibling analysis tools like find_spatial_genes or analyze_spatial_statistics. It stops short of naming any sibling explicitly, so no differentiation credit beyond the resource name.

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 mention of prerequisites (e.g. data must be loaded/preprocessed, histology requirements for spagcn), and no comparison to alternative spatial tools. The Args block only restates the two top-level parameters.

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

integrate_samplesB
Destructive

Integrate multiple spatial transcriptomics samples into a unified dataset.

Args:
    data_ids: List of dataset IDs to integrate
    params: Integration parameters (method, batch_key, n_pcs, etc.)

batch_correction=False pools the samples without correction (shared genes,
counts in layers['counts'], obs and coordinates kept), e.g. to pool sections
for analyze_cell_communication.
NameRequiredDescriptionDefault
paramsNo
data_idsYesTwo or more distinct dataset IDs.

Output Schema

NameRequiredDescription
data_idYes
n_cellsYes
n_genesNo
warningsNoNon-fatal conditions that may affect result interpretation.
batch_keyYes
n_samplesYes
embedding_keyNo
integration_methodYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds real behavioural detail for the batch_correction=False path (shared genes retained, counts into layers['counts'], X = log1p scaled to 10k, obs and coordinates preserved, batch_key holds source dataset ID). But the default integration path is behaviourally opaque, and the destructive side effects flagged by the annotations are never explained.

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?

The purpose is front-loaded in a single sentence and the Args block is terse. The final paragraph, however, restates the batch_correction=False schema description almost verbatim, so a large fraction of the description duplicates a structured field instead of adding new 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 explained, and the uncorrected pooling mode is covered thoroughly. What remains missing is the behaviour of the primary integration path, whether preprocessing is required before the default call, and what the destructive hint actually implies for existing datasets.

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?

Despite only 50% schema coverage, the description names the key knobs (method, batch_key, n_pcs) and explains the most consequential one, batch_correction, in operational terms rather than just its name. The nested IntegrationParameters object is largely self-documenting in the schema, so the description's contribution is proportionate rather than exhaustive.

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 opening sentence gives a specific verb plus resource ('Integrate multiple spatial transcriptomics samples into a unified dataset'), which is unambiguous and matches nothing else in the sibling list. It does not explicitly differentiate itself from near-neighbours such as register_spatial_data or preprocess_data, which is the only thing keeping it from 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 description supplies one concrete usage scenario ('pool sections for analyze_cell_communication') for the batch_correction=False path, which is genuinely helpful routing. However, it gives no guidance on when to use the default corrected path, no prerequisites, and no statement of when this tool should be chosen over registering or preprocessing data instead.

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

load_dataA

Load spatial transcriptomics data with comprehensive metadata profile.

Args:
    data_path: Path to data file or directory
    data_type: 'visium', 'xenium', 'slide_seq', 'merfish', 'seqfish', or 'generic'
    name: Optional dataset name

Returns:
    SpatialDataset with cell/gene counts and metadata profiles
NameRequiredDescriptionDefault
nameNo
data_pathYes
data_typeYes

Output Schema

NameRequiredDescription
idYes
nameYes
n_cellsNo
n_genesNo
uns_keysNo
data_typeYes
obsm_keysNo
descriptionNo
obs_columnsNo
var_columnsNo
top_expressed_genesNo
tissue_image_availableNo
top_highly_variable_genesNo
spatial_coordinates_availableNo

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is clear. The description adds that loading returns a SpatialDataset with cell/gene counts and metadata profiles, but does not disclose additional side effects or external access behavior beyond what annotations imply.

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 well-structured with Args and Returns sections, providing all necessary information in a compact and easily scannable format. No redundant or filler content.

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?

Given the output schema and annotations, the description covers the essential aspects: loading data, supported data types, and return type. It doesn't address edge cases like error handling or file format details, but it is sufficient for a data loading tool.

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?

The description's Args block explains all three parameters, including allowed values for data_type, which compensates for the schema's empty parameter descriptions (0% coverage). This adds meaningful context beyond the raw schema.

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

Purpose5/5

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

The description uses a specific verb ('Load') and names the resource ('spatial transcriptomics data'), making it clear what the tool does. It is distinct from sibling tools like reload_data and preprocess_data, and the Args section further specifies data types and behaviors.

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 description implies this is the entry point for loading spatial data but does not explicitly state when to use it over reload_data or other alternatives. The data_type enum provides some context, but there is no when-to-use/when-not-to-use guidance or exclusions.

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

preprocess_dataA
Destructive

Run QC, filtering, normalization, and highly variable gene selection.

This tool does not compute PCA, UMAP, clustering, or neighbor graphs. Run
compute_embeddings() afterward when downstream tools require those artifacts.

Args:
    data_id: Dataset ID
    params: Preprocessing parameters (all have sensible defaults)
NameRequiredDescriptionDefault
paramsNo
data_idYes

Output Schema

NameRequiredDescription
n_hvgsYes
data_idYes
n_cellsYes
n_genesYes
clustersYesClusters computed during preprocessing. This is zero because clustering is performed by compute_embeddings.
warningsNoNon-fatal conditions that may affect result interpretation.
qc_metricsNo

TDQS

A3.7/5.0
Behavior2/5

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

Annotations indicate destructiveHint=true, but the description does not elaborate on what is destroyed or modified (e.g., whether it overwrites existing data, irreversibility, or side effects). The only behavioral note is a negative scope (not computing embeddings), which is more purpose-related than a behavioral disclosure. With a destructive hint, the description should warn about data overwrite or similar consequences.

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 concise and well-structured: it opens with the primary purpose, then clarifies scope limits, and ends with a compact Args section. Every sentence adds value without redundancy, making it easy for an agent to quickly grasp the tool's core function.

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?

Given the tool's complexity (many parameters, destructive behavior) and the lack of output schema details, the description is somewhat minimal. It covers purpose and the boundary with compute_embeddings, but it omits prerequisites (e.g., data must already be loaded), side effects of the destructive operation, and what the function returns. This is adequate but with clear 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?

The input schema itself provides detailed descriptions for each parameter, so the baseline is 3. The description adds only minimal value by saying 'all have sensible defaults,' which helps convey that params can be omitted, but it does not explain any parameter semantics beyond that. The schema carries the heavy lifting for parameter understanding.

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?

The description clearly states the tool's function with a specific verb and resource: 'Run QC, filtering, normalization, and highly variable gene selection.' It also explicitly differentiates itself from a sibling tool by stating it does not compute PCA, UMAP, clustering, or neighbor graphs, and directs users to compute_embeddings() when those artifacts are needed.

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?

The description provides clear context by stating that compute_embeddings() should be run afterward when downstream tools require those artifacts. This implies the tool's role in the analysis pipeline, but it does not explicitly mention when not to use this tool or list alternative preprocessors, so there is room for improvement.

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

register_spatial_dataC
Destructive

Register/align spatial transcriptomics data across sections

Args:
    source_id: Source dataset ID
    target_id: Target dataset ID to align to
    params: Registration parameters (method, alignment settings, etc.)

Returns:
    Registration result with method, dataset IDs, spot counts, and registered spatial key
NameRequiredDescriptionDefault
paramsNo
source_idYes
target_idYes

Output Schema

NameRequiredDescription
methodYes
warningsNoNon-fatal conditions that may affect result interpretation.
source_idYes
target_idYes
n_source_spotsYes
n_target_spotsYes
registration_completedNo
spatial_key_registeredYes

TDQS

C2.7/5.0
Behavior2/5

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

Annotations indicate destructiveHint=true, but the description does not disclose what side effects occur, such as modifying datasets, overwriting existing spatial keys, or requiring GPU resources. The return value mentions a 'registered spatial key' but does not explain whether it alters the input data. Since destructive behavior is likely, the description should clarify the nature of these changes, but it remains silent.

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 concise and uses a clear structured format with Args and Returns sections. It avoids unnecessary verbiage and conveys the core purpose in two lines. It could be slightly more informative, but the structure is efficient and scannable, earning a high score.

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?

Given the tool's complexity (nested parameters, two algorithms with distinct behaviors) and destructive hint, the description is incomplete. It does not mention prerequisites like loaded data, differences between method options ('paste' vs 'stalign'), or potential side effects. While an output schema exists, the description still needs to provide usage context and behavioral expectations, which it largely omits.

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 compensate, but it provides only minimal information: source_id, target_id, and a vague 'params: Registration parameters (method, alignment settings, etc.)'. Source and target IDs are self-explanatory, but the nested params object contains many fields (method, stalign_a, paste_alpha, etc.) with detailed schema descriptions that are not reflected in the tool description. The agent gets insufficient guidance on parameter selection or meaning beyond the raw schema.

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 clearly states the tool's function: 'Register/align spatial transcriptomics data across sections.' This specifies a verb (register/align), resource (spatial transcriptomics data), and scope (across sections), which helps distinguish it from generic analysis tools. However, it does not explicitly differentiate from sibling tools like integrate_samples, so it falls slightly short of a perfect score.

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 explicit guidance on when to use this tool versus alternatives. It only describes the action and parameters, with no mention of prerequisites, exclusions, or when registration is appropriate. Usage must be inferred entirely from the tool name and general context, leaving the agent without clear direction.

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

reload_dataA
DestructiveIdempotent

Reload dataset from disk after external script modifications.

Args:
    data_id: Dataset ID to reload (must exist in MCP memory)
    path: Custom path (default: ~/.chatspatial/active/{data_id}.h5ad)

Returns:
    Summary of reloaded dataset
NameRequiredDescriptionDefault
pathNo
data_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructive and idempotent hints; description adds prerequisite (must exist in MCP memory) and default path behavior. No contradiction; adds useful 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?

Compact with Args/Returns sections; every sentence provides necessary detail, no redundancy.

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?

Covers purpose, parameters, return, and prerequisite. With output schema and annotations present, description is sufficient, though it could explicitly state the destructive overwrite behavior.

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

Parameters5/5

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

Schema has no descriptions (0% coverage); description explains both data_id (must exist in memory) and path (custom path with default), fully compensating.

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?

Clearly states 'Reload dataset from disk after external script modifications' - a specific verb, resource, and context. Distinguishes from load_data by emphasizing reloading after modifications.

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?

Implies usage after external script modifications, which is a clear context, but doesn't explicitly name alternatives or exclusions. Provides enough to know when to apply.

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

visualize_dataB
Destructive

Visualize spatial transcriptomics data. Set plot_type and subtype in params; see VisualizationParameters schema for all options.

Args:
    data_id: Dataset ID
    params: Visualization parameters (plot_type, subtype, genes, output_format, dpi, etc.)
NameRequiredDescriptionDefault
paramsNo
data_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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

Annotations flag destructiveHint=true and readOnlyHint=false, so this tool may have side effects, but the description only mentions visualization and parameters. It does not disclose overwriting behavior, file side effects, or any other consequences. This is not a direct contradiction, but the description misses important 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?

The description is short and front-loaded with the purpose, followed by a pointer to the schema. The Args block is mostly redundant with the schema but remains concise and does not significantly bloat the description.

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?

Given the very large VisualizationParameters schema, the pointer to that schema is helpful, and the output schema covers return values. However, the description lacks workflow context, side-effect awareness, and guidance on how visualization relates to upstream analysis steps. It is minimally viable but has clear 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?

The schema itself is highly detailed with property descriptions, so the description does not need to duplicate that information. It usefully highlights plot_type and subtype as primary controls and points to the VisualizationParameters schema. However, the example 'genes' does not exactly match the schema property 'feature', adding slight ambiguity.

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?

The description begins with a specific verb and resource: 'Visualize spatial transcriptomics data.' This clearly distinguishes it from sibling tools like load_data, preprocess_data, and find_markers. The added instruction to set plot_type and subtype further scopes the tool's functionality.

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 tells users to set plot_type and subtype and reference the schema, but it does not explain when to use this tool versus alternatives, prerequisites, or when not to use it. No exclusions or alternative tool references are provided.

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. 6 tool updatesv1.6.0
    • Changedanalyze_cell_communication3 fields changed
      • addedInput schema / $defs / CellCommunicationParameters / properties / subset_categories
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Values of subset_key to keep, e.g. ['TC', 'LE'].",
        +  "title": "Subset Categories"
        +}
      • addedInput schema / $defs / CellCommunicationParameters / properties / subset_key
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "obs column that restricts the analysis to observations whose value is in subset_categories (e.g. 'tc_le_region'). Set both or neither.",
        +  "title": "Subset Key"
        +}
      • addedOutput schema / properties / n_obs_analyzed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "N Obs Analyzed"
        +}
    • Changedanalyze_cnv8 fields changed
      • addedInput schema / $defs / CNVParameters / properties / exclude_gene_classes
        Added value: +{
        +  "description": "Gene classes removed from the CNV input before inference: immunoglobulin (IGH/IGK/IGL V, D, J and constant genes, JCHAIN, IGLL1, IGLL5), ribosomal (RPL*/RPS* except RPS6K* and RPS19BP1), mitochondrial (MT-*), hla (HLA-*, mouse H2-*). Names match case-insensitively. infercnvpy only.",
        +  "items": {
        +    "enum": [
        +      "immunoglobulin",
        +      "ribosomal",
        +      "mitochondrial",
        +      "hla"
        +    ],
        +    "type": "string"
        +  },
        +  "title": "Exclude Gene Classes",
        +  "type": "array"
        +}
      • addedInput schema / $defs / CNVParameters / properties / exclude_gene_patterns
        Added value: +{
        +  "description": "Gene-name wildcard patterns removed from the CNV input before inference (case-sensitive, e.g. ['IGH*', 'MALAT1']). infercnvpy only.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Exclude Gene Patterns",
        +  "type": "array"
        +}
      • addedInput schema / $defs / CNVParameters / properties / gene_positions
        Added value: +{
        +  "default": "auto",
        +  "description": "Source of gene chromosome/start/end. 'provided': adata.var columns. 'annotate': bundled Ensembl 110 table for species (GRCh38 or GRCm39), matched on Ensembl gene ID when var has one, otherwise on gene symbol. 'auto': provided if all three columns exist, otherwise annotate. infercnvpy only.",
        +  "enum": [
        +    "auto",
        +    "provided",
        +    "annotate"
        +  ],
        +  "title": "Gene Positions",
        +  "type": "string"
        +}
      • addedInput schema / $defs / CNVParameters / properties / query_categories
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Categories of reference_key whose observations are clustered by CNV profile (cluster_cells=True), e.g. ['tumor_enriched']. Inference still uses every observation; others get no cnv_clusters label. None clusters all observations.",
        +  "title": "Query Categories"
        +}
      • addedInput schema / $defs / CNVParameters / properties / species
        Added value: +{
        +  "default": "human",
        +  "description": "Species of the bundled gene-position table used by gene_positions.",
        +  "enum": [
        +    "human",
        +    "mouse"
        +  ],
        +  "title": "Species",
        +  "type": "string"
        +}
      • addedOutput schema / properties / gene_positions
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Source of gene positions: 'adata.var', or the bundled table with the number of genes matched by Ensembl ID and by symbol.",
        +  "title": "Gene Positions"
        +}
      • addedOutput schema / properties / n_genes_excluded
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "integer"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Genes matched by each excluded gene class or name pattern.",
        +  "title": "N Genes Excluded"
        +}
      • addedOutput schema / properties / n_query_cells
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Observations clustered when query_categories restricts clustering.",
        +  "title": "N Query Cells"
        +}
    • Changedanalyze_spatial_statistics2 fields changed
      • addedInput schema / $defs / SpatialStatisticsParameters / properties / gene_selection
        Added value: +{
        +  "default": "hvg",
        +  "description": "Genes analyzed when genes is None. 'hvg': top n_top_genes highly variable genes. 'all': every gene of the expression matrix (moran and geary only); the per-gene table (rank, statistic, p, FDR q) is stored in adata.uns[results_key], and only the top genes are returned.",
        +  "enum": [
        +    "hvg",
        +    "all"
        +  ],
        +  "title": "Gene Selection",
        +  "type": "string"
        +}
      • addedOutput schema / properties / spatial_graph
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Spatial Graph"
        +}
    • Changedannotate_cell_types16 fields changed
      • addedInput schema / $defs / AnnotationParameters / properties / cluster_label / description
        Added value: +"Categorical obs column with cluster or domain labels (e.g. 'spatial_domains_leiden'). Required for mllmcelltype and marker_score."
      • addedInput schema / $defs / AnnotationParameters / properties / marker_genes / description
        Added value: +"Label -> marker genes. Required for cellassign and marker_score. For marker_score the order matters: labels are assigned in the given order."
      • addedInput schema / $defs / AnnotationParameters / properties / marker_score_exclusion
        Added value: +{
        +  "default": "rank_then_drop",
        +  "description": "marker_score: handling of groups already given an earlier label. 'rank_then_drop': take the top marker_score_n_top groups by this label's score, then drop those already labeled (the label may get fewer groups). 'drop_then_rank': remove labeled groups first, then take the top groups of the rest.",
        +  "enum": [
        +    "rank_then_drop",
        +    "drop_then_rank"
        +  ],
        +  "title": "Marker Score Exclusion",
        +  "type": "string"
        +}
      • addedInput schema / $defs / AnnotationParameters / properties / marker_score_n_top
        Added value: +{
        +  "default": 2,
        +  "description": "marker_score: number of top-scoring groups assigned to each label.",
        +  "maximum": 50,
        +  "minimum": 1,
        +  "title": "Marker Score N Top",
        +  "type": "integer"
        +}
      • addedInput schema / $defs / AnnotationParameters / properties / marker_score_unassigned_label
        Added value: +{
        +  "default": "Other",
        +  "description": "marker_score: label for groups that no label claims.",
        +  "minLength": 1,
        +  "title": "Marker Score Unassigned Label",
        +  "type": "string"
        +}
      • changedInput schema / $defs / AnnotationParameters / properties / method / description
        Previous value: -"tangram/scanvi: require reference_data_id. cellassign: requires marker_genes. singler: uses celldex reference."New value: +"tangram/scanvi: require reference_data_id. cellassign: requires marker_genes. singler: uses celldex reference. marker_score: labels the groups of cluster_label (e.g. spatial domains) by marker_genes scores. threshold: labels observations by a cutoff on a numeric obs column (e.g. a deconvolved proportion)."
      • changedInput schema / $defs / AnnotationParameters / properties / method / enum
        Previous value: -[
        -  "tangram",
        -  "scanvi",
        -  "cellassign",
        -  "mllmcelltype",
        -  "sctype",
        -  "singler"
        -]New value: +[
        +  "tangram",
        +  "scanvi",
        +  "cellassign",
        +  "mllmcelltype",
        +  "sctype",
        +  "singler",
        +  "marker_score",
        +  "threshold"
        +]
      • addedInput schema / $defs / AnnotationParameters / properties / output_key
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "marker_score/threshold: obs column that receives the labels. Default: cell_type_marker_score or cell_type_threshold.",
        +  "title": "Output Key"
        +}
      • addedInput schema / $defs / AnnotationParameters / properties / threshold_comparison
        Added value: +{
        +  "default": ">=",
        +  "description": "threshold: an observation passes when <value> <comparison> threshold_value.",
        +  "enum": [
        +    ">=",
        +    ">",
        +    "<=",
        +    "<"
        +  ],
        +  "title": "Threshold Comparison",
        +  "type": "string"
        +}
      • addedInput schema / $defs / AnnotationParameters / properties / threshold_fail_label
        Added value: +{
        +  "default": "fail",
        +  "description": "threshold: label for observations that fail the comparison.",
        +  "minLength": 1,
        +  "title": "Threshold Fail Label",
        +  "type": "string"
        +}
      • addedInput schema / $defs / AnnotationParameters / properties / threshold_key
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "threshold: numeric obs column to compare with threshold_value. deconvolve_data writes one proportion column per cell type, named deconvolution_<method>_<cell type>.",
        +  "title": "Threshold Key"
        +}
      • addedInput schema / $defs / AnnotationParameters / properties / threshold_pass_label
        Added value: +{
        +  "default": "pass",
        +  "description": "threshold: label for observations that pass the comparison.",
        +  "minLength": 1,
        +  "title": "Threshold Pass Label",
        +  "type": "string"
        +}
      • addedInput schema / $defs / AnnotationParameters / properties / threshold_value
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "threshold: cutoff compared with threshold_key. Required for threshold.",
        +  "title": "Threshold Value"
        +}
      • addedOutput schema / properties / group_labels
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "marker_score: label given to each group of cluster_label.",
        +  "title": "Group Labels"
        +}
      • addedOutput schema / properties / group_scores
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "additionalProperties": {
        +          "type": "number"
        +        },
        +        "type": "object"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "marker_score: score of each group for each label.",
        +  "title": "Group Scores"
        +}
      • addedOutput schema / properties / markers_used
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "marker_score: marker genes found in the data for each label.",
        +  "title": "Markers Used"
        +}
    • Changedfind_markers3 fields changed
      • addedInput schema / $defs / DifferentialExpressionParameters / properties / exclude_gene_classes
        Added value: +{
        +  "description": "Gene classes removed before testing, so they are never reported as markers: immunoglobulin (IGH/IGK/IGL V, D, J and constant genes, JCHAIN, IGLL1, IGLL5), ribosomal (RPL*/RPS* except RPS6K* and RPS19BP1), mitochondrial (MT-*), hla (HLA-*, mouse H2-*). Same rules as analyze_cnv; case-insensitive.",
        +  "items": {
        +    "enum": [
        +      "immunoglobulin",
        +      "ribosomal",
        +      "mitochondrial",
        +      "hla"
        +    ],
        +    "type": "string"
        +  },
        +  "title": "Exclude Gene Classes",
        +  "type": "array"
        +}
      • addedInput schema / $defs / DifferentialExpressionParameters / properties / exclude_gene_patterns
        Added value: +{
        +  "description": "Gene-name wildcard patterns removed before testing (case-sensitive, e.g. ['IGH*', 'MALAT1']).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Exclude Gene Patterns",
        +  "type": "array"
        +}
      • addedOutput schema / properties / n_genes_excluded
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "integer"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Genes removed before testing by each excluded gene class or pattern.",
        +  "title": "N Genes Excluded"
        +}
    • Changedintegrate_samples2 fields changed
      • addedInput schema / $defs / IntegrationParameters / properties / batch_correction
        Added value: +{
        +  "default": true,
        +  "description": "False: concatenate the samples without batch correction (method and n_pcs are ignored; inputs need not be preprocessed). Keeps the genes shared by all samples, their counts (layers['counts'], else X, else adata.raw) in layers['counts'], X = log1p of counts scaled to 10,000 per observation, every obs column and the spatial coordinates; batch_key holds the source dataset ID. Use it to pool sections, e.g. for cell communication.",
        +  "title": "Batch Correction",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / n_genes
        Added value: +{
        +  "anyOf": [
        +    {
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "N Genes"
        +}
  2. 2 tool updatesv1.5.10
    • Changeddeconvolve_data6 fields changed
      • addedInput schema / $defs / DeconvolutionParameters / properties / flashdeconv_lambda_spatial / anyOf
        Added value: +[
        +  {
        +    "const": "auto",
        +    "type": "string"
        +  },
        +  {
        +    "minimum": 0,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / $defs / DeconvolutionParameters / properties / flashdeconv_lambda_spatial / default
        Previous value: -5000New value: +"auto"
      • changedInput schema / $defs / DeconvolutionParameters / properties / flashdeconv_lambda_spatial / description
        Previous value: -"Spatial regularization. 5000 for Visium, 50000+ for high-res. FlashDeconv only."New value: +"Spatial regularization: auto adapts to the data scale; 0 disables smoothing. FlashDeconv only."
      • removedInput schema / $defs / DeconvolutionParameters / properties / flashdeconv_lambda_spatial / exclusiveMinimum
        Removed value: -0
      • removedInput schema / $defs / DeconvolutionParameters / properties / flashdeconv_lambda_spatial / type
        Removed value: -"number"
      • changedInput schema / $defs / DeconvolutionParameters / properties / flashdeconv_sketch_dim / description
        Previous value: -"Sketched space dimension. FlashDeconv only."New value: +"Bucket count used to compute deterministic gene weights. FlashDeconv only."
    • Changedidentify_spatial_domains28 fields changed
      • changedInput schema / $defs / SpatialDomainParameters / properties / cluster_n_neighbors / anyOf
        Previous value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 200,
        +    "minimum": 2,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / SpatialDomainParameters / properties / cluster_n_neighbors / description
        Previous value: -"Neighbors for clustering (leiden/louvain)."New value: +"k of the expression k-NN graph (leiden/louvain only). None reuses an existing neighbour graph (e.g. from compute_embeddings) or builds one with k=15; a value rebuilds the graph unless the stored one already has this k."
      • changedInput schema / $defs / SpatialDomainParameters / properties / cluster_spatial_weight / description
        Previous value: -"Spatial information weight (leiden/louvain)."New value: +"Weight of the spatial graph when combined with the expression graph (leiden/louvain only). None uses 0.3."
      • addedInput schema / $defs / SpatialDomainParameters / properties / graphst_clustering_method / description
        Added value: +"Clustering of GraphST embeddings (graphst only). 'mclust' fits a Gaussian mixture with the cluster count; 'leiden'/'louvain' search the resolution that yields the cluster count. 'louvain' requires the louvain package."
      • changedInput schema / $defs / SpatialDomainParameters / properties / graphst_n_clusters / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 50,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / $defs / SpatialDomainParameters / properties / graphst_n_clusters / description
        Added value: +"Cluster count for GraphST (graphst only). None uses n_domains."
      • addedInput schema / $defs / SpatialDomainParameters / properties / graphst_radius / description
        Added value: +"Number of nearest spots in GraphST's refinement vote; a count, not a distance, so it does not depend on coordinate units. Used only when graphst_refinement=True (graphst only)."
      • addedInput schema / $defs / SpatialDomainParameters / properties / graphst_radius / maximum
        Added value: +500
      • addedInput schema / $defs / SpatialDomainParameters / properties / graphst_radius / minimum
        Added value: +1
      • addedInput schema / $defs / SpatialDomainParameters / properties / graphst_random_seed / description
        Added value: +"Seed for GraphST training and clustering (graphst only); identical calls give identical domains."
      • addedInput schema / $defs / SpatialDomainParameters / properties / graphst_random_seed / minimum
        Added value: +0
      • addedInput schema / $defs / SpatialDomainParameters / properties / graphst_refinement / description
        Added value: +"Apply GraphST's own label refinement (majority vote over the graphst_radius nearest spots) after clustering (graphst only)."
      • addedInput schema / $defs / SpatialDomainParameters / properties / graphst_use_gpu / description
        Added value: +"Use CUDA/MPS when available, else CPU (graphst only)."
      • changedInput schema / $defs / SpatialDomainParameters / properties / n_domains / description
        Previous value: -"Number of spatial domains to identify."New value: +"Number of spatial domains to identify. Used by spagcn, stagate, graphst (unless graphst_n_clusters is set) and aestetik with kmeans/bgm. Ignored by leiden, louvain and banksy, which are controlled by a resolution."
      • addedInput schema / $defs / SpatialDomainParameters / properties / refine_domains / description
        Added value: +"Post-process the labels of any method by relabelling a spot to the majority label of its 10 nearest spots when the share of differing neighbours reaches refinement_threshold. Stored as an extra '<domain_key>_refined' column."
      • changedInput schema / $defs / SpatialDomainParameters / properties / refinement_threshold / description
        Previous value: -"Neighbor agreement threshold for domain refinement."New value: +"Share of the 10 nearest spots that must carry a different label before refine_domains relabels a spot. Used only when refine_domains=True."
      • addedInput schema / $defs / SpatialDomainParameters / properties / resolution / description
        Added value: +"Clustering resolution (higher = more domains). Used by leiden, louvain and aestetik with leiden/louvain. Not used by graphst, which searches the resolution that yields n_domains, or by banksy (see banksy_cluster_resolution)."
      • addedInput schema / $defs / SpatialDomainParameters / properties / resolution / exclusiveMinimum
        Added value: +0
      • addedInput schema / $defs / SpatialDomainParameters / properties / resolution / maximum
        Added value: +5
      • addedInput schema / $defs / SpatialDomainParameters / properties / spagcn_compat
        Added value: +{
        +  "default": "spagcn-1.2.7",
        +  "description": "SpaGCN model behavior. 'spagcn-1.2.7' reproduces the published SpaGCN 1.2.7 results (fixed cluster centers, Louvain initialization). 'modern' trains the cluster centers with the DEC Student's t kernel; the default hyperparameters were tuned for 1.2.7 and give different domains.",
        +  "enum": [
        +    "spagcn-1.2.7",
        +    "modern"
        +  ],
        +  "title": "Spagcn Compat",
        +  "type": "string"
        +}
      • changedInput schema / $defs / SpatialDomainParameters / properties / stagate_rad_cutoff / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / $defs / SpatialDomainParameters / properties / stagate_rad_cutoff / description
        Added value: +"Radius of the STAGATE spatial graph, as a distance in the units of obsm['spatial'] (stagate only). None derives it from the spot spacing (3**0.25 x the median distance to the 6th nearest spot), which links about 6 neighbours per Visium spot as in STAGATE's Visium analyses, in array, pixel or micron coordinates alike."
      • changedInput schema / $defs / SpatialDomainParameters / properties / stagate_random_seed / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / $defs / SpatialDomainParameters / properties / stagate_random_seed / description
        Added value: +"Seed for STAGATE training and its GMM clustering (stagate only). None uses 42."
      • addedInput schema / $defs / SpatialDomainParameters / properties / stagate_use_gpu / description
        Added value: +"Use CUDA/MPS when available, else CPU (stagate only)."
      • changedInput schema / $defs / SpatialDomainParameters / properties / timeout / anyOf
        Previous value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 86400,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / SpatialDomainParameters / properties / timeout / description
        Previous value: -"Maximum backend runtime in seconds. None uses 600 seconds."New value: +"Maximum backend runtime in seconds (all methods except leiden/louvain, which run in-process). None uses 3600 seconds for stagate and graphst (neural network training) and 600 seconds otherwise."
      • addedInput schema / $defs / SpatialDomainParameters / properties / use_highly_variable / description
        Added value: +"Restrict the input to adata.var['highly_variable'] genes when that column exists (all methods)."
  3. 8 tool updatesv1.5.3
    • Changedanalyze_cell_communication1 field changed
      • changedInput schema / $defs / CellCommunicationParameters / properties / method / default
        Previous value: -"fastccc"New value: +"liana"
    • Changedanalyze_enrichment4 fields changed
      • addedOutput schema / properties / n_significant / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / n_significant / default
        Added value: +null
      • removedOutput schema / properties / n_significant / type
        Removed value: -"integer"
      • changedOutput schema / required
        Previous value: -[
        -  "method",
        -  "n_gene_sets",
        -  "n_significant",
        -  "top_gene_sets",
        -  "top_depleted_sets"
        -]New value: +[
        +  "method",
        +  "n_gene_sets",
        +  "top_gene_sets",
        +  "top_depleted_sets"
        +]
    • Changedanalyze_spatial_statistics3 fields changed
      • addedOutput schema / properties / n_significant / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / n_significant / default
        Previous value: -0New value: +null
      • removedOutput schema / properties / n_significant / type
        Removed value: -"integer"
    • Changedanalyze_trajectory_data1 field changed
      • addedInput schema / $defs / TrajectoryParameters / properties / cellrank_stability_threshold
        Added value: +{
        +  "default": 0.96,
        +  "description": "Minimum macrostate stability for a state to count as terminal (CellRank only). Lower it when no macrostate is stable enough; otherwise the run falls back to macrostate-based pseudotime.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 1,
        +  "title": "Cellrank Stability Threshold",
        +  "type": "number"
        +}
    • Changedfind_markers3 fields changed
      • changedOutput schema / description
        Previous value: -"Result of differential expression analysis\n\nNote on serialization:\n    For consistency with other result models, the statistics dict is excluded\n    from JSON serialization. Key summary info is in explicit fields.\n\n    Fields included in MCP response:\n    - data_id, comparison (basic info)\n    - n_genes (count)\n    - top_genes (top differentially expressed genes)\n\n    Fields excluded from MCP response:\n    - statistics (detailed DE metrics per group)"New value: +"Result of differential expression analysis\n\nNote on serialization:\n    For consistency with other result models, the statistics dict is excluded\n    from JSON serialization. Key summary info is in explicit fields.\n\n    Fields included in MCP response:\n    - data_id, comparison (basic info)\n    - n_genes (count of distinct genes returned)\n    - top_genes_by_group (top genes keyed by the group they mark)\n\n    Fields excluded from MCP response:\n    - statistics (detailed DE metrics per group)\n\n    Markers are keyed by group because a flat list cannot say which group a\n    gene marks. One-vs-rest runs compare every group at once, so a flat list\n    would silently collapse to whichever group happened to come first."
      • removedOutput schema / properties / top_genes
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Top Genes",
        -  "type": "array"
        -}
      • addedOutput schema / properties / top_genes_by_group
        Added value: +{
        +  "additionalProperties": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "title": "Top Genes By Group",
        +  "type": "object"
        +}
    • Changedfind_spatial_genes2 fields changed
      • addedInput schema / $defs / SpatialVariableGenesParameters / properties / max_genes_tested
        Added value: +{
        +  "anyOf": [
        +    {
        +      "exclusiveMinimum": 0,
        +      "maximum": 50000,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Cap on how many genes are tested, applied after the mitochondrial/ribosomal/HVG filters by keeping the highest-expressed genes. None = test everything that passes the filters. Use to bound runtime on slow backends (SpatialDE benchmarks at ~10 min per 14,000 genes). This limits the input; n_top_genes limits the output.",
        +  "title": "Max Genes Tested"
        +}
      • changedInput schema / $defs / SpatialVariableGenesParameters / properties / n_top_genes / description
        Previous value: -"Top spatial variable genes to return. None = all significant."New value: +"Top spatial variable genes to return, ranked by effect size where the backend reports one. None = all significant. This limits the output; use max_genes_tested to limit how many genes are tested."
    • Changedintegrate_samples4 fields changed
      • addedOutput schema / properties / batch_key
        Added value: +{
        +  "title": "Batch Key",
        +  "type": "string"
        +}
      • addedOutput schema / properties / embedding_key
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Embedding Key"
        +}
      • addedOutput schema / properties / n_cells
        Added value: +{
        +  "minimum": 0,
        +  "title": "N Cells",
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "data_id",
        -  "n_samples",
        -  "integration_method"
        -]New value: +[
        +  "data_id",
        +  "n_samples",
        +  "integration_method",
        +  "n_cells",
        +  "batch_key"
        +]
    • Changedvisualize_data3 fields changed
      • addedInput schema / $defs / VisualizationParameters / properties / colormap / description
        Added value: +"Colormap for continuous values. Categorical features automatically use a qualitative palette; set a qualitative palette such as 'tab20' to override that selection."
      • changedInput schema / $defs / VisualizationParameters / properties / subplot_wspace / default
        Previous value: -0New value: +0.3
      • changedInput schema / $defs / VisualizationParameters / properties / subplot_wspace / description
        Previous value: -"Horizontal subplot spacing. Lower for tighter, higher for looser."New value: +"Horizontal subplot spacing as a fraction of axis width. The default leaves room for y-axis tick labels; lower it for tighter panels once axes are hidden."
  4. 20 tool updatesv1.3.2
    • Changedanalyze_cell_communication7 fields changed
      • addedInput schema / $defs / CellCommunicationParameters / additionalProperties
        Added value: +false
      • changedInput schema / $defs / CellCommunicationParameters / properties / cellphonedb_debug_seed / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / $defs / CellCommunicationParameters / properties / cellphonedb_debug_seed / description
        Added value: +"Optional CellPhoneDB testing seed. Enabling it forces single-threaded permutations because the upstream seed contract is single-thread only."
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / statistics
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Statistics",
        -  "type": "object"
        -}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Non-fatal conditions that may affect result interpretation.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Warnings",
        +  "type": "array"
        +}
    • Changedanalyze_cnv6 fields changed
      • addedInput schema / $defs / CNVParameters / additionalProperties
        Added value: +false
      • changedInput schema / $defs / CNVParameters / properties / numbat_genome / enum
        Previous value: -[
        -  "hg38",
        -  "hg19",
        -  "mm10",
        -  "mm39"
        -]New value: +[
        +  "hg38",
        +  "hg19",
        +  "mm10"
        +]
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / statistics
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Statistics"
        -}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Non-fatal conditions that may affect result interpretation.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Warnings",
        +  "type": "array"
        +}
    • Changedanalyze_enrichment8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / adjusted_pvalues
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "additionalProperties": {
        -        "type": "number"
        -      },
        -      "type": "object"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Adjusted Pvalues"
        -}
      • removedOutput schema / properties / enrichment_scores
        Removed value: -{
        -  "additionalProperties": {
        -    "type": "number"
        -  },
        -  "title": "Enrichment Scores",
        -  "type": "object"
        -}
      • removedOutput schema / properties / gene_set_statistics
        Removed value: -{
        -  "additionalProperties": {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  "title": "Gene Set Statistics",
        -  "type": "object"
        -}
      • removedOutput schema / properties / pvalues
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "additionalProperties": {
        -        "type": "number"
        -      },
        -      "type": "object"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Pvalues"
        -}
      • removedOutput schema / properties / spatial_metrics
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Spatial Metrics"
        -}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Non-fatal conditions that may affect result interpretation.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Warnings",
        +  "type": "array"
        +}
    • Changedanalyze_spatial_statistics5 fields changed
      • addedInput schema / $defs / SpatialStatisticsParameters / additionalProperties
        Added value: +false
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / statistics
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Statistics"
        -}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Non-fatal conditions that may affect result interpretation.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Warnings",
        +  "type": "array"
        +}
    • Changedanalyze_trajectory_data4 fields changed
      • addedInput schema / $defs / TrajectoryParameters / additionalProperties
        Added value: +false
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Non-fatal conditions that may affect result interpretation.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Warnings",
        +  "type": "array"
        +}
    • Changedanalyze_velocity_data10 fields changed
      • addedInput schema / $defs / RNAVelocityParameters / properties / velovi_dropout_rate / exclusiveMaximum
        Added value: +1
      • addedInput schema / $defs / RNAVelocityParameters / properties / velovi_dropout_rate / minimum
        Added value: +0
      • addedInput schema / $defs / RNAVelocityParameters / properties / velovi_learning_rate / exclusiveMinimum
        Added value: +0
      • addedInput schema / $defs / RNAVelocityParameters / properties / velovi_n_epochs / exclusiveMinimum
        Added value: +0
      • addedInput schema / $defs / RNAVelocityParameters / properties / velovi_n_hidden / exclusiveMinimum
        Added value: +0
      • addedInput schema / $defs / RNAVelocityParameters / properties / velovi_n_latent / exclusiveMinimum
        Added value: +0
      • addedInput schema / $defs / RNAVelocityParameters / properties / velovi_n_layers / exclusiveMinimum
        Added value: +0
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Non-fatal conditions that may affect result interpretation.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Warnings",
        +  "type": "array"
        +}
    • Changedannotate_cell_types4 fields changed
      • addedInput schema / $defs / AnnotationParameters / additionalProperties
        Added value: +false
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Non-fatal conditions that may affect result interpretation.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Warnings",
        +  "type": "array"
        +}
    • Changedcompare_conditions8 fields changed
      • addedInput schema / $defs / ConditionComparisonParameters / additionalProperties
        Added value: +false
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / $defs / CellTypeComparisonResult / additionalProperties
        Added value: +false
      • removedOutput schema / $defs / CellTypeComparisonResult / properties / all_de_genes
        Removed value: -{
        -  "items": {
        -    "$ref": "#/$defs/DEGene"
        -  },
        -  "title": "All De Genes",
        -  "type": "array"
        -}
      • addedOutput schema / $defs / DEGene / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
      • changedOutput schema / properties / statistics / additionalProperties
        Previous value: -trueNew value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "string"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Non-fatal conditions that may affect result interpretation.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Warnings",
        +  "type": "array"
        +}
    • Changedcompute_embeddings7 fields changed
      • addedInput schema / $defs / EmbeddingParameters / additionalProperties
        Added value: +false
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / additionalProperties
        Previous value: -trueNew value: +false
      • addedOutput schema / description
        Added value: +"Result of dimensionality reduction and clustering computation."
      • addedOutput schema / properties
        Added value: +{
        +  "computed": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "title": "Computed",
        +    "type": "array"
        +  },
        +  "data_id": {
        +    "title": "Data Id",
        +    "type": "string"
        +  },
        +  "n_clusters": {
        +    "anyOf": [
        +      {
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "default": null,
        +    "title": "N Clusters"
        +  },
        +  "pca_variance_ratio": {
        +    "anyOf": [
        +      {
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "default": null,
        +    "title": "Pca Variance Ratio"
        +  },
        +  "skipped": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "title": "Skipped",
        +    "type": "array"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal conditions that may affect result interpretation.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "title": "Warnings",
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "data_id",
        +  "computed",
        +  "skipped"
        +]
      • changedOutput schema / title
        Previous value: -"compute_embeddingsDictOutput"New value: +"EmbeddingResult"
    • Changeddeconvolve_data25 fields changed
      • addedInput schema / $defs / DeconvolutionParameters / additionalProperties
        Added value: +false
      • removedInput schema / $defs / DeconvolutionParameters / properties / cell2location_early_stopping_threshold / exclusiveMinimum
        Removed value: -0
      • addedInput schema / $defs / DeconvolutionParameters / properties / cell2location_early_stopping_threshold / minimum
        Added value: +0
      • addedInput schema / $defs / DeconvolutionParameters / properties / cell2location_gene_filter_cell_count_cutoff / minimum
        Added value: +0
      • addedInput schema / $defs / DeconvolutionParameters / properties / cell2location_gene_filter_cell_percentage_cutoff2 / maximum
        Added value: +1
      • addedInput schema / $defs / DeconvolutionParameters / properties / cell2location_gene_filter_cell_percentage_cutoff2 / minimum
        Added value: +0
      • addedInput schema / $defs / DeconvolutionParameters / properties / cell2location_gene_filter_nonz_mean_cutoff / minimum
        Added value: +0
      • addedInput schema / $defs / DeconvolutionParameters / properties / destvi_dropout_rate / exclusiveMaximum
        Added value: +1
      • addedInput schema / $defs / DeconvolutionParameters / properties / destvi_dropout_rate / minimum
        Added value: +0
      • addedInput schema / $defs / DeconvolutionParameters / properties / destvi_learning_rate / exclusiveMinimum
        Added value: +0
      • addedInput schema / $defs / DeconvolutionParameters / properties / destvi_n_hidden / exclusiveMinimum
        Added value: +0
      • addedInput schema / $defs / DeconvolutionParameters / properties / destvi_n_latent / exclusiveMinimum
        Added value: +0
      • addedInput schema / $defs / DeconvolutionParameters / properties / destvi_n_layers / exclusiveMinimum
        Added value: +0
      • addedInput schema / $defs / DeconvolutionParameters / properties / rctd_backend
        Added value: +{
        +  "default": "r",
        +  "description": "RCTD implementation. 'r' preserves the spacexr backend; 'python' uses rctd-py.",
        +  "enum": [
        +    "r",
        +    "python"
        +  ],
        +  "title": "Rctd Backend",
        +  "type": "string"
        +}
      • addedInput schema / $defs / DeconvolutionParameters / properties / rctd_batch_size
        Added value: +{
        +  "anyOf": [
        +    {
        +      "exclusiveMinimum": 0,
        +      "type": "integer"
        +    },
        +    {
        +      "const": "auto",
        +      "type": "string"
        +    }
        +  ],
        +  "default": "auto",
        +  "description": "Spot batch size for the rctd-py backend, or 'auto'.",
        +  "title": "Rctd Batch Size"
        +}
      • addedInput schema / $defs / DeconvolutionParameters / properties / rctd_device
        Added value: +{
        +  "default": "auto",
        +  "description": "Compute device for the rctd-py backend. Ignored by the R backend.",
        +  "enum": [
        +    "auto",
        +    "cpu",
        +    "cuda"
        +  ],
        +  "title": "Rctd Device",
        +  "type": "string"
        +}
      • addedInput schema / $defs / DeconvolutionParameters / properties / rctd_dtype
        Added value: +{
        +  "default": "float64",
        +  "description": "Numerical precision for the rctd-py backend.",
        +  "enum": [
        +    "float64",
        +    "float32"
        +  ],
        +  "title": "Rctd Dtype",
        +  "type": "string"
        +}
      • addedInput schema / $defs / DeconvolutionParameters / properties / rctd_sigma_override
        Added value: +{
        +  "anyOf": [
        +    {
        +      "exclusiveMinimum": 0,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional fixed sigma for rctd-py. None estimates sigma from the data.",
        +  "title": "Rctd Sigma Override"
        +}
      • addedInput schema / $defs / DeconvolutionParameters / properties / stereoscope_batch_size / exclusiveMinimum
        Added value: +0
      • addedInput schema / $defs / DeconvolutionParameters / properties / stereoscope_learning_rate / exclusiveMinimum
        Added value: +0
      • addedInput schema / $defs / DeconvolutionParameters / properties / stereoscope_n_epochs / exclusiveMinimum
        Added value: +0
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / statistics
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Statistics",
        -  "type": "object"
        -}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Non-fatal conditions that may affect result interpretation.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Warnings",
        +  "type": "array"
        +}
    • Changedexport_data2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedfind_markers5 fields changed
      • addedInput schema / $defs / DifferentialExpressionParameters / additionalProperties
        Added value: +false
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / statistics
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Statistics",
        -  "type": "object"
        -}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Non-fatal conditions that may affect result interpretation.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Warnings",
        +  "type": "array"
        +}
    • Changedfind_spatial_genes10 fields changed
      • addedInput schema / $defs / SpatialVariableGenesParameters / additionalProperties
        Added value: +false
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / flashs_results
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Flashs Results"
        -}
      • removedOutput schema / properties / gene_statistics
        Removed value: -{
        -  "additionalProperties": {
        -    "type": "number"
        -  },
        -  "title": "Gene Statistics",
        -  "type": "object"
        -}
      • removedOutput schema / properties / p_values
        Removed value: -{
        -  "additionalProperties": {
        -    "type": "number"
        -  },
        -  "title": "P Values",
        -  "type": "object"
        -}
      • removedOutput schema / properties / q_values
        Removed value: -{
        -  "additionalProperties": {
        -    "type": "number"
        -  },
        -  "title": "Q Values",
        -  "type": "object"
        -}
      • removedOutput schema / properties / sparkx_results
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Sparkx Results"
        -}
      • removedOutput schema / properties / spatialde_results
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Spatialde Results"
        -}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Non-fatal conditions that may affect result interpretation.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Warnings",
        +  "type": "array"
        +}
    • Changedidentify_spatial_domains17 fields changed
      • addedInput schema / $defs / SpatialDomainParameters / additionalProperties
        Added value: +false
      • addedInput schema / $defs / SpatialDomainParameters / properties / aestetik_clustering_method
        Added value: +{
        +  "default": "kmeans",
        +  "description": "Clustering applied to AESTETIK embeddings. 'kmeans'/'bgm' use n_domains; 'leiden'/'louvain' use resolution.",
        +  "enum": [
        +    "bgm",
        +    "kmeans",
        +    "louvain",
        +    "leiden"
        +  ],
        +  "title": "Aestetik Clustering Method",
        +  "type": "string"
        +}
      • addedInput schema / $defs / SpatialDomainParameters / properties / aestetik_latent_dim
        Added value: +{
        +  "default": 16,
        +  "description": "AESTETIK latent embedding dimension.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 512,
        +  "title": "Aestetik Latent Dim",
        +  "type": "integer"
        +}
      • addedInput schema / $defs / SpatialDomainParameters / properties / aestetik_max_epochs
        Added value: +{
        +  "default": 100,
        +  "description": "AESTETIK training epochs.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 10000,
        +  "title": "Aestetik Max Epochs",
        +  "type": "integer"
        +}
      • addedInput schema / $defs / SpatialDomainParameters / properties / aestetik_morphology_key
        Added value: +{
        +  "default": "X_pca_morphology",
        +  "description": "obsm key holding the precomputed per-spot morphology embedding (AESTETIK only).",
        +  "title": "Aestetik Morphology Key",
        +  "type": "string"
        +}
      • addedInput schema / $defs / SpatialDomainParameters / properties / aestetik_morphology_weight
        Added value: +{
        +  "default": 1.5,
        +  "description": "Morphology weight in the AESTETIK joint loss.",
        +  "maximum": 3,
        +  "minimum": 0,
        +  "title": "Aestetik Morphology Weight",
        +  "type": "number"
        +}
      • addedInput schema / $defs / SpatialDomainParameters / properties / aestetik_random_seed
        Added value: +{
        +  "default": 2023,
        +  "title": "Aestetik Random Seed",
        +  "type": "integer"
        +}
      • addedInput schema / $defs / SpatialDomainParameters / properties / aestetik_transcriptomics_key
        Added value: +{
        +  "default": "X_pca",
        +  "description": "obsm key holding the precomputed expression embedding (AESTETIK only).",
        +  "title": "Aestetik Transcriptomics Key",
        +  "type": "string"
        +}
      • addedInput schema / $defs / SpatialDomainParameters / properties / aestetik_window_size
        Added value: +{
        +  "default": 3,
        +  "description": "Odd side length of the AESTETIK neighborhood grid.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 15,
        +  "title": "Aestetik Window Size",
        +  "type": "integer"
        +}
      • changedInput schema / $defs / SpatialDomainParameters / properties / method / description
        Previous value: -"'spagcn' uses histology. 'banksy' uses spatial feature augmentation. 'stagate'/'graphst' use deep learning."New value: +"'spagcn' uses histology. 'banksy' uses spatial feature augmentation. 'stagate'/'graphst' use deep learning. 'aestetik' fuses precomputed expression and morphology embeddings."
      • changedInput schema / $defs / SpatialDomainParameters / properties / method / enum
        Previous value: -[
        -  "spagcn",
        -  "leiden",
        -  "louvain",
        -  "stagate",
        -  "graphst",
        -  "banksy"
        -]New value: +[
        +  "spagcn",
        +  "leiden",
        +  "louvain",
        +  "stagate",
        +  "graphst",
        +  "banksy",
        +  "aestetik"
        +]
      • changedInput schema / $defs / SpatialDomainParameters / properties / timeout / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / $defs / SpatialDomainParameters / properties / timeout / description
        Added value: +"Maximum backend runtime in seconds. None uses 600 seconds."
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / statistics
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Statistics",
        -  "type": "object"
        -}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Non-fatal conditions that may affect result interpretation.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Warnings",
        +  "type": "array"
        +}
    • Changedintegrate_samples13 fields changed
      • addedInput schema / $defs / IntegrationParameters / additionalProperties
        Added value: +false
      • changedInput schema / $defs / IntegrationParameters / properties / n_epochs / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / $defs / IntegrationParameters / properties / scvi_dropout_rate / exclusiveMaximum
        Added value: +1
      • addedInput schema / $defs / IntegrationParameters / properties / scvi_dropout_rate / minimum
        Added value: +0
      • addedInput schema / $defs / IntegrationParameters / properties / scvi_n_hidden / exclusiveMinimum
        Added value: +0
      • addedInput schema / $defs / IntegrationParameters / properties / scvi_n_latent / exclusiveMinimum
        Added value: +0
      • addedInput schema / $defs / IntegrationParameters / properties / scvi_n_layers / exclusiveMinimum
        Added value: +0
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / data_ids / description
        Added value: +"Two or more distinct dataset IDs."
      • addedInput schema / properties / data_ids / minItems
        Added value: +2
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / properties / n_samples / minimum
        Added value: +2
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Non-fatal conditions that may affect result interpretation.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Warnings",
        +  "type": "array"
        +}
    • Changedload_data4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / data_type / enum
        Added value: +[
        +  "visium",
        +  "xenium",
        +  "slide_seq",
        +  "merfish",
        +  "seqfish",
        +  "generic"
        +]
      • addedOutput schema / $defs / ColumnInfo / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedpreprocess_data10 fields changed
      • addedInput schema / $defs / PreprocessingParameters / additionalProperties
        Added value: +false
      • removedInput schema / $defs / PreprocessingParameters / properties / clustering_key
        Removed value: -{
        -  "default": "leiden",
        -  "description": "Key name for clustering results in obs.",
        -  "title": "Clustering Key",
        -  "type": "string"
        -}
      • removedInput schema / $defs / PreprocessingParameters / properties / clustering_resolution
        Removed value: -{
        -  "default": 1,
        -  "description": "Leiden clustering resolution. Higher (1.5-2.0) for more clusters, lower (0.2-0.5) for fewer.",
        -  "exclusiveMinimum": 0.1,
        -  "maximum": 2,
        -  "title": "Clustering Resolution",
        -  "type": "number"
        -}
      • removedInput schema / $defs / PreprocessingParameters / properties / n_neighbors
        Removed value: -{
        -  "default": 15,
        -  "description": "Neighbors for k-NN graph. Larger (20-50) for global structure, smaller (5-10) for local patterns.",
        -  "exclusiveMinimum": 2,
        -  "maximum": 100,
        -  "title": "N Neighbors",
        -  "type": "integer"
        -}
      • removedInput schema / $defs / PreprocessingParameters / properties / n_pcs
        Removed value: -{
        -  "default": 30,
        -  "description": "Number of principal components for PCA.",
        -  "exclusiveMinimum": 0,
        -  "maximum": 100,
        -  "title": "N Pcs",
        -  "type": "integer"
        -}
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / properties / clusters / description
        Added value: +"Clusters computed during preprocessing. This is zero because clustering is performed by compute_embeddings."
      • changedOutput schema / properties / qc_metrics / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {
        +      "anyOf": [
        +        {
        +          "type": "integer"
        +        },
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "boolean"
        +        },
        +        {
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Non-fatal conditions that may affect result interpretation.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Warnings",
        +  "type": "array"
        +}
    • Changedregister_spatial_data8 fields changed
      • addedInput schema / $defs / RegistrationParameters / additionalProperties
        Added value: +false
      • addedInput schema / $defs / RegistrationParameters / properties / stalign_image_size / items / exclusiveMinimum
        Added value: +0
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / additionalProperties
        Previous value: -trueNew value: +false
      • addedOutput schema / description
        Added value: +"Result of bilateral spatial-coordinate registration."
      • addedOutput schema / properties
        Added value: +{
        +  "method": {
        +    "enum": [
        +      "paste",
        +      "stalign"
        +    ],
        +    "title": "Method",
        +    "type": "string"
        +  },
        +  "n_source_spots": {
        +    "minimum": 0,
        +    "title": "N Source Spots",
        +    "type": "integer"
        +  },
        +  "n_target_spots": {
        +    "minimum": 0,
        +    "title": "N Target Spots",
        +    "type": "integer"
        +  },
        +  "registration_completed": {
        +    "const": true,
        +    "default": true,
        +    "title": "Registration Completed",
        +    "type": "boolean"
        +  },
        +  "source_id": {
        +    "title": "Source Id",
        +    "type": "string"
        +  },
        +  "spatial_key_registered": {
        +    "title": "Spatial Key Registered",
        +    "type": "string"
        +  },
        +  "target_id": {
        +    "title": "Target Id",
        +    "type": "string"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal conditions that may affect result interpretation.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "title": "Warnings",
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "method",
        +  "source_id",
        +  "target_id",
        +  "n_source_spots",
        +  "n_target_spots",
        +  "spatial_key_registered"
        +]
      • changedOutput schema / title
        Previous value: -"register_spatial_dataDictOutput"New value: +"SpatialRegistrationResult"
    • Changedreload_data2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedvisualize_data8 fields changed
      • addedInput schema / $defs / VisualizationParameters / properties / alpha / maximum
        Added value: +1
      • addedInput schema / $defs / VisualizationParameters / properties / alpha / minimum
        Added value: +0
      • addedInput schema / $defs / VisualizationParameters / properties / dpi / exclusiveMinimum
        Added value: +0
      • changedInput schema / $defs / VisualizationParameters / properties / figure_size / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "integer"
        -    },
        -    "maxItems": 2,
        -    "minItems": 2,
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "exclusiveMinimum": 0,
        +      "type": "integer"
        +    },
        +    "maxItems": 2,
        +    "minItems": 2,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / VisualizationParameters / properties / panel_layout / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "integer"
        -    },
        -    "maxItems": 2,
        -    "minItems": 2,
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "exclusiveMinimum": 0,
        +      "type": "integer"
        +    },
        +    "maxItems": 2,
        +    "minItems": 2,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / VisualizationParameters / properties / spot_size / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
  5. 2 tool updatesv1.2.10
    • Changedannotate_cell_types2 fields changed
      • addedInput schema / $defs / AnnotationParameters / properties / sctype_allow_remote
        Added value: +{
        +  "default": false,
        +  "description": "Allow scType to load remote R scripts and the default remote marker database for this call.",
        +  "title": "Sctype Allow Remote",
        +  "type": "boolean"
        +}
      • addedInput schema / $defs / AnnotationParameters / properties / sctype_allow_runtime_r_install
        Added value: +{
        +  "default": false,
        +  "description": "Allow scType to install missing R packages at runtime for this call.",
        +  "title": "Sctype Allow Runtime R Install",
        +  "type": "boolean"
        +}
    • Changeddeconvolve_data3 fields changed
      • changedInput schema / $defs / DeconvolutionParameters / properties / spotlight_n_top_genes / default
        Previous value: -2000New value: +50
      • changedInput schema / $defs / DeconvolutionParameters / properties / spotlight_n_top_genes / description
        Previous value: -"Number of HVGs for deconvolution. SPOTlight only."New value: +"Marker genes per cell type for SPOTlight deconvolution."
      • changedInput schema / $defs / DeconvolutionParameters / properties / spotlight_n_top_genes / maximum
        Previous value: -5000New value: +500
  6. 3 tool updatesv1.2.8
    • Changedanalyze_enrichment4 fields changed
      • addedInput schema / properties / params / $ref
        Added value: +"#/$defs/EnrichmentParameters"
      • removedInput schema / properties / params / anyOf
        Removed value: -[
        -  {
        -    "$ref": "#/$defs/EnrichmentParameters"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / params / default
        Removed value: -null
      • changedInput schema / required
        Previous value: -[
        -  "data_id"
        -]New value: +[
        +  "data_id",
        +  "params"
        +]
    • Changedanalyze_spatial_statistics1 field changed
      • addedInput schema / $defs / SpatialStatisticsParameters / properties / neighborhood_n_perms
        Added value: +{
        +  "default": 100,
        +  "description": "Permutations for neighborhood enrichment. Use 1000+ for publication.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 10000,
        +  "title": "Neighborhood N Perms",
        +  "type": "integer"
        +}
    • Changedvisualize_data1 field changed
      • changedInput schema / $defs / VisualizationParameters / properties / subtype / description
        Previous value: -"Visualization subtype. Options by plot_type:\n- expression: 'heatmap'|'violin'|'dotplot'|'correlation'\n- deconvolution: 'spatial_multi'|'pie'|'dominant'|'diversity'|'umap'|'imputation'\n- communication: 'dotplot'|'tileplot'|'circle_plot'\n- trajectory: 'pseudotime'|'circular'|'fate_map'|'gene_trends'|'fate_heatmap'|'palantir'\n- velocity: 'stream'|'phase'|'proportions'|'heatmap'|'paga'\n- statistics: 'neighborhood'|'co_occurrence'|'ripley'|'moran'|'centrality'|'getis_ord' (required)\n- enrichment: 'barplot'|'dotplot'\n- cnv: 'heatmap'|'spatial'\n- integration: 'batch'|'cluster'|'highlight'"New value: +"Visualization subtype. Options by plot_type:\n- expression: 'heatmap'|'violin'|'dotplot'|'correlation'\n- deconvolution: 'spatial_multi'|'pie'|'dominant'|'diversity'|'umap'|'imputation'\n- communication: 'spatial'|'dotplot'|'tileplot'|'circle_plot'\n- trajectory: 'pseudotime'|'circular'|'fate_map'|'gene_trends'|'fate_heatmap'|'palantir'\n- velocity: 'stream'|'phase'|'proportions'|'heatmap'|'paga'\n- statistics: 'neighborhood'|'co_occurrence'|'ripley'|'moran'|'centrality'|'getis_ord' (required)\n- enrichment: 'barplot'|'dotplot'\n- cnv: 'heatmap'|'spatial'\n- integration: 'batch'|'cluster'|'highlight'"
  7. 20 tool updatesv1.2.7
    • First observedanalyze_cell_communication
    • First observedanalyze_cnv
    • First observedanalyze_enrichment
    • First observedanalyze_spatial_statistics
    • First observedanalyze_trajectory_data
    • First observedanalyze_velocity_data
    • First observedannotate_cell_types
    • First observedcompare_conditions
    • First observedcompute_embeddings
    • First observeddeconvolve_data
    • First observedexport_data
    • First observedfind_markers
    • First observedfind_spatial_genes
    • First observedidentify_spatial_domains
    • First observedintegrate_samples
    • First observedload_data
    • First observedpreprocess_data
    • First observedregister_spatial_data
    • First observedreload_data
    • First observedvisualize_data

TDQS

B3.4/5.0

Scored across 20 tools

Disambiguation4/5

Most tools target clearly distinct stages of spatial transcriptomics analysis, such as loading, preprocessing, embeddings, domain detection, deconvolution, and communication. A few pairs have overlapping scope—find_markers versus compare_conditions for differential expression, and analyze_spatial_statistics versus find_spatial_genes for spatial gene statistics—but descriptions and parameter differences help distinguish them.

Naming Consistency5/5

All tool names use snake_case and follow a verb_noun or verb_object convention (load_data, preprocess_data, find_markers, analyze_cnv, export_data). Verb choices vary appropriately by operation, with no inconsistent casing or mixed naming styles.

Tool Count4/5

The suite has 20 tools, slightly above the ideal 3-15 range, but this matches a comprehensive spatial transcriptomics workflow with many distinct analysis stages. Each tool earns its place, though the surface is somewhat heavy for an MCP server.

Completeness4/5

The tools cover the full analysis lifecycle: loading, preprocessing, embeddings, visualization, spatial statistics/domains/genes, deconvolution, annotation, cell communication, CNV, velocity, trajectory, and export/reload. Minor lifecycle gaps such as listing or deleting datasets prevent a perfect completeness score.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    C
    maintenance
    An MCP server that enables single-cell RNA sequencing analysis through natural language, supporting data processing, visualization, and analysis tasks without requiring coding knowledge.
    52
    12
    BSD 3-Clause
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables natural language interface for single-cell RNA-Seq analysis using Liana. Supports reading/writing scRNA-Seq data, cell-cell communication analysis, and visualization through circle plots and dotplots.
    36 PyPI
    1
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that enables scRNA-Seq analysis through natural language, providing tools for data preprocessing, clustering, and biological visualization. It supports both predefined function execution and a flexible code mode powered by a Jupyter backend for automated single-cell transcriptomics workflows.
    16
    BSD 3-Clause
  • F
    license
    Not graded
    quality
    C
    maintenance
    Provides a natural language interface for single-cell RNA-Seq analysis using the decoupleR framework. It enables users to perform biological pathway inference, data clustering, and visualization through MCP-compatible AI clients.
    47 PyPI
    4
    -