Image Label MCP Server
This MCP server lets an AI assistant manage, view, annotate, analyze, and export histopathology and other images through Image Label.
List, retrieve, update, and upload images from a local path or URL.
View images with scaling, coordinate grids, region zoom, and optional annotation overlays.
Add, replace, or remove annotations such as pins, polygons, circles, rectangles, and arrows.
Segment objects with Segment Anything or MedSAM from rough boxes or points.
Detect and outline nuclei with StarDist, including size/density metrics and enlarged-nucleus labeling.
Classify nuclei into cell types with HoVer-Net, including counts, percentages, and immune-to-tumour ratio.
Normalize H&E stain colors and run HistoQC-style slide quality checks.
Warm up SAM, MedSAM, or nuclei models ahead of use.
Upload and analyze whole-slide images, retrieve slide-level and per-tile results, and export nuclei as QuPath GeoJSON.
Share image links viewable/editable in the Image Label web app.
Export annotations or datasets as COCO JSON, YOLO labels/classes, or QuPath GeoJSON.
Use guest or account credentials; there is deliberately no tool for deleting images.
Connects through langchain-mcp-adapters to expose the image annotation tools as LangChain-compatible tools for agents.
Ships a LangGraph agent (label-image-agent) that uses the server's annotation, nuclei detection, slide QC and export tools, so an agent can drive a slide-to-training-data workflow end to end.
Exports an image's polygons and circles as YOLO label files and class lists, and merges multiple images into one YOLO dataset with a single consistent class ordering.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Image Label MCP Serverupload nest.jpg and add a rectangle around the bird"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Image, Histopathology Annotation MCP
Image Annotation, including Histopathology slides; From H&E slide to training data in one conversation: nuclei, outlines and slide QC, exported to QuPath, COCO or YOLO. No GPU needed.

Accuracy: see Benchmark. Your data: see Your data. Changes: see CHANGELOG.
An MCP server for annotating histopathology and other images in Image Label, a free annotation tool. It lets Claude and other AI assistants upload images, outline every nucleus in an H&E slide automatically (StarDist), trace regions from rough boxes (Segment Anything, or MedSAM for medical images), check slide quality, normalize stain colours, clean up annotations, and export training data as COCO JSON, YOLO labels, YOLO classes or QuPath GeoJSON. A LangGraph agent is included.
Built for: Whole Slide Imaging (WSI) · Digital Pathology · Computational Pathology · Bioinformatics · Tumor Microenvironment (TME) analysis (tumour, immune and stromal cell types, immune-to-tumour ratio) · MLOps Data Labeling (COCO, YOLO and QuPath training data) · Nuclei and Cell Segmentation · Cell Classification · Medical Image Annotation · Stain Normalization and Slide Quality Control · Cancer Research · Computer Vision datasets.
Try it in the browser: https://agent.sachin-kale.com/#annotate: upload a slide and annotate it, detect nuclei, check its quality or get an AI interpretation, with no setup.
Published as label-image-mcp (PyPI) and io.github.sachinbkale27/label-image-mcp (MCP Registry).
Use cases and setup guide: https://labels.sachin-kale.com/mcp
LangGraph agent (label-image-agent) Claude Desktop / Claude Code / any MCP client
│ langchain-mcp-adapters │
└──────────────┬──────────────────────┘
▼
label-image-mcp (stdio or HTTP)
│
▼
Image Label API (/api/images ...)Account (optional)
No account needed to try it. Without credentials the server works as a guest: it gets a guest
identity on first use, saves it in ~/.config/label-image-mcp/, and keeps using it, so your images are
there next time.
Guest (no sign-up) | Account (request one, free) | |
Images kept | 7 days, up to 50 | 90 days |
Upload size | 20 MB per image | 20 MB per image; whole slides up to 5 GB |
Analyses (nuclei, outlines, cell types, …) | 200 a day | No daily cap |
Whole slides | No | Yes |
The tools see, change and upload only the images of the identity they use (guest or account). Set
LABEL_USERNAME and LABEL_PASSWORD to use an account, or LABEL_GUEST=0 to turn guests off.
Related MCP server: Luma MCP
Install
Claude Desktop: download label-image-mcp.mcpb from the
latest release and open it. Leave
username and password empty to start as a guest.
Claude Code:
claude mcp add label-image -e LABEL_USERNAME=... -e LABEL_PASSWORD=... -- uvx label-image-mcpAny MCP client (needs uv):
{
"mcpServers": {
"label-image": {
"command": "uvx",
"args": ["label-image-mcp"],
"env": { "LABEL_USERNAME": "...", "LABEL_PASSWORD": "..." }
}
}
}Benchmark
detect_nuclei checked against expert outlines on NuInsSeg (CC BY 4.0):
H&E images of 31 human and mouse tissues, 30,698 hand-segmented nuclei. The detection threshold was chosen on
the even-numbered images of each tissue; these results are on the other 332 images (15,701 nuclei), which were
not used for any choice. A nucleus counts as found when its outline overlaps the expert's by IoU ≥ 0.5.
Settings | Precision | Recall | F1 | Panoptic quality | Pixel Dice |
0.5.0, resized by nucleus size (default) | 0.78 | 0.55 | 0.64 | 0.48 | 0.65 |
0.5.0, with | 0.81 | 0.52 | 0.64 | 0.47 | 0.66 |
Before 0.5.0 | 0.81 | 0.33 | 0.47 | 0.35 | 0.43 |
Better on human tissue (F1 0.67) than mouse (0.50 to 0.53). Best on pancreas, cerebellum, placenta and tongue (0.73 to 0.81); weakest on umbilical cord, brain, mouse heart and bone (0.13 to 0.34), where nuclei are sparse, thin or faint. Per-tissue results are in benchmarks/results.
The model is StarDist's pretrained H&E model, not trained on NuInsSeg: models trained on a dataset score higher on it. Read these as what to expect on new images, and review outlines before training on them.
Reproduce: benchmarks/nuinsseg.py runs the same method locally.
Cell types (
classify_cells) are not benchmarked here yet: NuInsSeg has no cell-type labels. HoVer-Net's published results on PanNuke are the reference until then.
Your data
What happens to images you upload through this server (hosted on AWS in us-east-1):
Private to your account. Only you can list, read or change your images; the storage bucket blocks all public access, and viewing links are signed and expire after 24 hours.
Deleted after 90 days, automatically: files, slides, annotations and analysis results. Deleting an image removes it straight away.
Encrypted at rest (AES-256) and in transit (HTTPS).
Not used to train models, and not sent to other AI services by this server: StarDist, Segment Anything and MedSAM run on the service itself. Your AI assistant sees what its tools return (
view_imagereturns the picture), under that assistant's own terms.Usage counts. Each call to the service names the AI client (for example
claude-ai/0.1.0, from the MCP handshake) and the server version, so usage can be counted by client; the account is logged only as a hash. The service also logs the approximate place of each call (city, region, country and time zone, from its CDN) and the local hour, and counts distinct IP addresses by a keyed hash; the addresses themselves are not kept. Nothing from your conversation is sent.No patient identifiers, please. Remove names, record numbers and slide labels (crop the label area or use a de-identified copy) before uploading. Results are for research and education, not diagnosis.
Agent skill
skills/label-image/SKILL.md teaches the agent when and how to
use these tools: which annotation types end up in exports, cleaning up labels safely, and
merging per-image exports into one COCO or YOLO dataset with consistent class ids (bundled
scripts/merge_exports.py). It follows the open SKILL.md format, so it works in Claude Code and
other agents that support skills.
# Claude Code: install for all your projects (or copy into a project's .claude/skills/)
git clone --depth 1 https://github.com/sachinbkale27/label-image-mcp /tmp/label-image-mcp
mkdir -p ~/.claude/skills && cp -r /tmp/label-image-mcp/skills/label-image ~/.claude/skills/Configuration
Variable | Default | Purpose |
| unset | Account credentials. Without them the tools see no images |
|
| API base URL, for another deployment or |
Tools
Tool | What it does |
| Image summaries with annotation counts |
| Metadata, annotations and a signed viewing URL |
| The picture itself, for the assistant to look at: scaled down, with a grid labelled in image pixels, optionally with the annotations drawn on, or zoomed into a region. Use it to place boxes for |
| Edit image details |
| Append pins, polygons, circles, rectangles or arrows |
| Replace all annotations |
| Remove annotations by id |
| Upload a local image file |
| Download an image from an https URL (up to 20 MB) and upload it |
| Trace exact outlines with Segment Anything from a rough box or a point per object, and save them as polygons. |
| Find and outline every nucleus in an H&E image with StarDist, automatically (no boxes). Returns count, density, median area and size variation; nuclei over 2.5x the median area are labelled |
| Types the nuclei |
| Macenko stain normalization: a copy with standard H&E colours, saved as a new image |
| HistoQC-style checks (tissue fraction, blur, marker pen, exposure, faint staining) with a verdict and warnings |
| Start loading a model without waiting: |
| A link (valid 7 days) that opens the image and its annotations in the Image Label web app in anyone's browser, copied into their own workspace to edit and export; no account needed |
| COCO JSON or YOLO, same output as the web app's export, or |
| Many images (a category, or up to 100 ids) as ONE dataset with one class list: a COCO file, YOLO classes plus a label file per image, or a QuPath GeoJSON per image. |
Every tool declares all four hints (read-only, destructive, idempotent, open-world) and describes every
parameter. Clients can ask before the destructive ones: replace_annotations, remove_annotations, and
detect_nuclei, which replaces its own earlier nuclei. The server also offers three prompts: Analyse a histology slide,
Outline objects in an image and Build a training dataset.
Whole slides
Tool | What it does |
| Upload a whole-slide file (.svs, .ndpi, pyramidal .tif/.tiff, up to 5 GB; streamed, never loaded into memory) and start its analysis. Local server only |
| The same from an https URL, copied straight into storage |
| Background analysis: finds the tissue, then runs the quality check, StarDist nuclei and cell types on tiles of 256 × 256 µm at 40x. |
| Status, or the results: nuclei per mm², median nuclear area in µm², size variation, enlarged nuclei and cell-type percentages across the slide, per-tile values and quality |
After the analysis the slide's image in the library is its overview, with the analysed tiles marked (the
three densest in red; with full coverage, a density heatmap and the ten densest tiles), so view_image and
the web app show it. The three densest tiles are saved as
images of their own, with their nuclei outlined, for a close look or further annotation. Every nucleus
is in a QuPath GeoJSON in slide coordinates: open the slide in QuPath, then File > Import objects.
Slides are read with tifffile (Aperio SVS including JPEG 2000, Hamamatsu NDPI, pyramidal TIFF and
OME-TIFF), decoding only the tiles needed. Other images are up to 20 MB.
There is deliberately no tool for deleting images.
segment_objects calls the API's POST /images/{id}/segment, which runs SAM
(facebook/sam-vit-base) or MedSAM
(wanglab/medsam-vit-base) in a Lambda container
(backend/segment). After a quiet spell the model takes a while to start; the client retries then.
Results are for research and dataset building, not diagnosis.
The histopathology tools call POST /images/{id}/pathology, which runs
StarDist (BSD-3; its pretrained 2D_versatile_he model was trained
on public H&E datasets, some under non-commercial terms, so check them before commercial use),
torchstain (MIT) and OpenCV quality measures in a second Lambda
container (backend/pathology). Microscope photos come at many magnifications, so detect_nuclei also
tries the image enlarged 2x and 3x and keeps the scale that finds the most nuclei.
HTTP mode
label-image-mcp --http [--host 127.0.0.1] [--port 8765] serves Streamable HTTP at
http://HOST:PORT/mcp, so several clients can share one running server:
claude mcp add --transport http label-image http://127.0.0.1:8765/mcpHosted mode
label-image-mcp --http --hosted --host 0.0.0.0 is for running the server remotely, for example on
AWS Lambda behind the Lambda Web Adapter. It keeps no session state, answers with JSON, and requires
Authorization: Bearer <token> on every request; with no token configured it refuses all requests.
Variable | Purpose |
| The bearer token clients must send |
| AWS Secrets Manager secret with |
| Comma-separated hosts |
LangGraph agent
A terminal chat agent that uses these tools. The graph is START → agent ⇄ tools, with
conversation memory kept for the session.
uv tool install "label-image-mcp[agent]"
export ANTHROPIC_API_KEY=... LABEL_USERNAME=... LABEL_PASSWORD=...
label-image-agentVariable | Default | Purpose |
|
| Model as |
| unset | Connect to a running HTTP server instead of starting one |
Development
uv sync --extra agent
uv run pytest
npx @modelcontextprotocol/inspector uv run label-image-mcpIn the Image Label app repo, ./start.sh runs this server in HTTP mode next to the web app.
It reads credentials from mcp-server/.env. Releases are described in PUBLISHING.md.
License
MIT
Available Tools
22 toolsadd_annotationsAdd annotationsA
Append annotations to an image, keeping the existing ones.
| Name | Required | Description | Default |
|---|---|---|---|
| image_id | Yes | Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload. | |
| annotations | Yes | Annotations to add (polygon, circle, rectangle, pin or arrow, in image pixels); existing annotations are kept. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false and idempotent=false; the description corroborates the additive/non-destructive nature with 'append...keeping the existing ones.' It does not disclose the non-idempotent consequence (repeated calls duplicate annotations) or any validation behavior, which is the main thing an agent needs to know beyond the annotation flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero waste; the key behavioral qualifier is in the same clause as the action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the input schema is fully described, so much is already covered. However, the description omits type-dependent requirements (polygon needs points, circle needs radius, arrow needs arrowTarget) and the duplication risk of a non-idempotent append, leaving an agent to work those out from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the nested AnnotationInput documents coordinates, per-type fields and defaults, so the schema carries the parameter burden. The description adds no parameter-level meaning beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (append annotations to an image) and adds a scope qualifier ('keeping the existing ones') that implicitly separates it from replace_annotations. It could be stronger only by naming that sibling outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'keeping the existing ones' hints at when to prefer this over replace_annotations, but no alternative tool is named and no explicit when/when-not guidance is given. Usage must be inferred from the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_slideAnalyse a whole slideAIdempotent
Analyse a whole-slide image in the background and wait up to wait_seconds for the result.
coverage "sample" (default) analyses up to max_tiles tiles spread over the tissue in a few minutes. "full" analyses every tissue tile (up to 3,000, about 200 mm2) in parallel parts and tints the overview as a density heatmap: a few minutes for a biopsy, longer for big resections. Cell types are on by default for a sample and off for full coverage (they take about 15x longer per tile); set cell_types to change that.
Finds the tissue, samples up to max_tiles tiles of it (256 x 256 um each at 40x) and runs the quality check and StarDist nuclei on each: nuclei per mm2, nuclear size in um2, size variation and enlarged nuclei across the slide, plus per-tile values. With cell_types (default) each nucleus is also typed as tumour, immune, connective tissue, dead or normal epithelial (HoVer-Net, PanNuke weights: research and education only), about 40 seconds a tile, so max_tiles defaults to 12 (16 without cell types). Allow a minute more when the models start. If it's still running when the wait ends, call get_slide_analysis later. An analysis already running is waited for; restart=true starts a new one (e.g. with more tiles).
| Name | Required | Description | Default |
|---|---|---|---|
| restart | No | Start a new analysis even if one already exists for this slide. | |
| coverage | No | 'sample': up to max_tiles tiles spread over the tissue, in minutes; 'full': every tissue tile in parallel, with a density heatmap. | sample |
| image_id | Yes | Id of a whole slide: the imageId (a UUID string) returned by upload_slide or upload_slide_from_url. | |
| max_tiles | No | Tiles to analyse for a sample (default 12 with cell types, 16 without). | |
| cell_types | No | Also type each nucleus (tumour, immune, connective tissue, dead, normal epithelial); default on for a sample, off for full coverage. | |
| wait_seconds | No | How long to wait for the result; if it isn't ready, get_slide_analysis reads it later. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and idempotentHint=true, but the description goes well past that: it discloses asynchronous background execution, that a running analysis is reused rather than duplicated, restart semantics, wall-clock estimates (~40s/tile with cell types, ~15x longer, a minute of model warm-up), and a licensing/research-use caveat on the PanNuke weights.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the wait contract, then cost/tradeoff guidance — a sensible ordering for an agent. It loses a little to redundancy, since the tissue-finding and tile-sampling mechanics are explained twice in overlapping paragraphs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter, long-running, expensive pipeline with an output schema present, the description covers timing, cost, defaults, resumption and licensing — everything needed to call it correctly and set agent expectations. Return-value detail is properly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by supplying concrete quantities the schema omits — 256x256 um tiles at 40x, the 3,000-tile / ~200 mm2 ceiling for full coverage, and the 12 vs 16 max_tiles defaults tied to cell_types. It does not add cost or format detail for wait_seconds beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Analyse a whole-slide image') and immediately scopes it as a background operation with a bounded wait. It is cleanly separable from siblings like detect_nuclei, classify_cells, check_image_quality and get_slide_analysis, which each cover a subset of what this composite pipeline does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly contrasts the two coverage modes by cost and output ('sample' in a few minutes vs 'full' with heatmap, longer for big resections), states the cell_types default flips between modes, and tells the agent exactly what to do if the wait expires ('call get_slide_analysis later') and how to force re-analysis (restart=true).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_image_qualityCheck slide qualityARead-onlyIdempotent
Check a histology image's quality before analysing it (HistoQC-style checks).
Measures how much of the image is tissue, blur, marker-pen ink, over- and under-exposure and faint staining. Returns a verdict (good, check or poor), the measurements and plain-language warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| image_id | Yes | Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent and non-destructive behavior. The description adds useful behavioral detail by listing the measured quality dimensions and explaining that results include a verdict, measurements and plain-language warnings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences, front-loaded with the core action and followed by measurement details and return information. Every sentence contributes useful information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only quality check with an output schema and complete annotations, the description provides enough context to invoke it correctly. It explains what is measured and what kind of result to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required parameter and schema coverage is 100%, so the schema fully documents image_id. The description does not add meaning beyond the schema, making the baseline score appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: checking a histology image's quality before analysis. It clearly describes the quality dimensions measured and the returned verdict, though it does not explicitly name a sibling tool such as analyze_slide for differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: run this before analysing an image. It implies the pre-analysis workflow but does not specify when not to use it or explicitly compare it with analyze_slide or get_slide_analysis.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
classify_cellsClassify cell typesAIdempotent
Classify the nuclei detect_nuclei saved on an H&E image as tumour, immune, connective tissue, dead or normal epithelial cells, and wait up to wait_seconds for the result.
Runs HoVer-Net (PanNuke weights, CC BY-NC-SA 4.0: research and education only) in the background, about 30 to 90 seconds per image: each nucleus annotation is relabelled with its type, and the result has counts, percentages and the immune-to-tumour ratio. Run detect_nuclei first. Needs a 20x or 40x image: coarser images are refused, because enlarging them can't add the detail the model reads. If it's still running when the wait ends, call it again (it waits for the same run).
| Name | Required | Description | Default |
|---|---|---|---|
| image_id | Yes | Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload. | |
| wait_seconds | No | How long to wait for the result; if it isn't ready, call again later to read it. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the mutation/idempotency profile; the description adds the substance: background execution, 30–90s per image, relabelling of existing nucleus annotations, result contents (counts, percentages, immune-to-tumour ratio), and that a repeat call attaches to the same run. The licensing restriction (CC BY-NC-SA 4.0, research/education only) is a behavioral constraint an agent cannot infer from any structured field. This is consistent with readOnlyHint=false and idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and target, then constraints, then retry behavior. Despite being four sentences, each carries distinct operational information (classes, runtime, prerequisite, resolution floor, retry semantics) with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything needed to invoke correctly: prerequisite tool, resolution requirement, expected latency, polling strategy, and a licensing constraint. Output schema exists, yet the brief return summary (counts, percentages, ratio) usefully sets expectations without duplicating the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds real meaning by framing wait_seconds as an upper bound on blocking and explaining that a second call with the same image waits on the same run rather than starting new work. image_id semantics are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Classify the nuclei detect_nuclei saved on an H&E image') plus the exact output classes, so the agent can distinguish it from detect_nuclei (which only finds nuclei) and segment_objects. The dependency on a prior detect_nuclei run is embedded in the first sentence, making the tool's role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit prerequisite ('Run detect_nuclei first') and an explicit when-not ('Needs a 20x or 40x image: coarser images are refused'), plus retry guidance when the wait expires. It does not name alternative siblings (e.g. segment_objects or analyze_slide) that an agent might consider, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_nucleiDetect nuclei (StarDist)ADestructiveIdempotent
Find and outline every cell nucleus in an H&E-stained histology image with StarDist, automatically.
No boxes needed: the model finds the nuclei itself (it is trained on H&E; other stains and non-histology images give poor results). Returns the count, density, median nuclear area and how much nuclear size varies (a rough measure of pleomorphism). With mark_enlarged, nuclei over 2.5x the median area are labelled "enlarged nucleus" (in red), the rest "nucleus". The most confident max_nuclei outlines are saved. By default (replace_previous) nuclei saved by an earlier detect_nuclei run on this image are deleted first, so running it again replaces them rather than doubling them; other annotations are never touched. Pass replace_previous=false to keep the earlier nuclei. With microns_per_pixel (the scanner's resolution: often 0.25 at 40x, 0.5 at 20x) the image is resized to the model's best resolution and sizes are also given in square microns and density per square millimetre; without it, the image is resized by the size of its nuclei. The first run after a quiet spell takes up to a minute while the model starts (warm_up("nuclei") avoids the wait).
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | Save the outlines as annotations; false only returns the measurements. | |
| image_id | Yes | Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload. | |
| max_nuclei | No | Most nuclei to save, the most confident first. | |
| mark_enlarged | No | Label nuclei over 2.5x the median area 'enlarged nucleus' (in red); the rest are 'nucleus'. | |
| replace_previous | No | Delete nuclei saved by an earlier detect_nuclei run on this image before saving the new ones (other annotations are kept). False adds to them. | |
| microns_per_pixel | No | Scanner resolution in microns per pixel (often 0.25 at 40x, 0.5 at 20x); adds sizes in square microns and density per square millimetre. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag a destructive, idempotent write; the description supplies the crucial scope of that destruction: only nuclei from an earlier detect_nuclei run are removed, other annotations are never touched, and replace_previous=false preserves them. It further discloses the up-to-one-minute cold start, the confidence-ordered capping at max_nuclei, and stain-related accuracy limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and default behavior are front-loaded and no sentence is filler, but the prose is a dense paragraph with several clauses chained by semicolons; splitting the replace_previous and microns_per_pixel behaviors into distinct sentences would scan faster.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, output-schema-backed analysis tool, the description covers input assumptions, default side effects, performance latency, measurement outputs, and the escape hatch for reruns. Nothing an agent needs in order to call it correctly and interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: microns_per_pixel changes how the image is resized (model-optimal resolution vs. nucleus-size heuristic) and unlocks area/density units, and max_nuclei selection is described as most-confident-first. Practical resolution values (0.25 at 40x, 0.5 at 20x) help the agent reason about when to pass it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: find and outline every cell nucleus in an H&E-stained histology image using StarDist. It also states the input assumption (H&E, no bounding boxes required), so an agent knows exactly what it produces. It never names the closest sibling (segment_objects), so the differentiation is left implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions: works on H&E, poor on other stains and non-histology images; use microns_per_pixel when scanner resolution is known, omit it otherwise; warm_up("nuclei") avoids the cold-start wait. It also explains that reruns replace rather than double annotations. It stops short of explicit 'use this instead of segment_objects/classify_cells when...' routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_annotationsExport annotationsARead-onlyIdempotent
Export an image's annotations: COCO JSON or YOLO (polygons and circles, as the web app exports), or QuPath GeoJSON (File > Import objects in QuPath; nuclei found by StarDist come in as detections).
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | 'coco' (COCO JSON), 'yolo' (YOLO labels and classes) or 'qupath' (QuPath GeoJSON, nuclei as detections). | coco |
| image_id | Yes | Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior. The description adds genuine behavioral detail beyond that: YOLO exports polygons and circles as the web app does, and QuPath nuclei from StarDist arrive as detections. It doesn't discuss error conditions, but the output schema covers returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Parentheticals are dense but each earns its place by clarifying a format's export behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full parameter documentation, and rich annotations, the description is nearly complete for a read-only export tool. It could add one line about when to choose this over export_dataset, but nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema's enum: 'as the web app exports' clarifies YOLO semantics, and the QuPath parenthetical explains how nuclei appear as detections, which the schema does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Export an image's annotations') and enumerates the exact output formats, which distinguishes it from export_dataset (a dataset-level export). An agent can identify the operation and scope without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Format-specific context is provided ('as the web app exports', QuPath import steps), which implies when each format is appropriate. However, it never explicitly names alternatives (e.g., export_dataset) or states when not to use this tool, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_datasetExport a datasetAIdempotent
Export several images as ONE training dataset, with one class list so ids mean the same everywhere.
Choose the images by category (case-insensitive) or image_ids (up to 100). coco: one COCO file for all images; yolo: classes plus a label file per image, named after it; qupath: a GeoJSON file per image. classes fixes the class order; other labels follow in first-seen order. With output_dir (a folder on the machine running this server; not available when hosted) the files are written there and only a summary is returned, which suits large datasets such as nuclei.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | 'coco' (COCO JSON), 'yolo' (YOLO labels and classes) or 'qupath' (QuPath GeoJSON, nuclei as detections). | coco |
| classes | No | Class names in the order to number them; other labels follow in first-seen order. | |
| category | No | Export every image in this category (case-insensitive); give this or image_ids. | |
| image_ids | No | Export these images (up to 100); give this or category. | |
| output_dir | No | Folder on the machine running this server to write the files to (not when hosted); omit to return them. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, so the safety profile is already carried; the description adds genuinely new context: files are written to a folder on the server machine, that option is unavailable when hosted, and only a summary is returned in that case. It does not cover the returned-payload-vs-files tradeoff beyond that or any size/perf limits besides the 100-image cap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then format/selection/output details in a compact block. Some phrasing duplicates schema descriptions (classes ordering, output_dir folder semantics), but each clause still carries operational information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, and the description still notes that only a summary comes back when writing to disk. The one gap is that with zero required parameters, the behavior when neither category nor image_ids is given (error? export all?) is never stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema: how classes fixes numbering and that other labels follow first-seen order, what each format produces ('one COCO file for all images', 'a label file per image, named after it'), and the hosted-server restriction on output_dir. Only the all-optional default case is left unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with its defining scope: 'Export several images as ONE training dataset, with one class list so ids mean the same everywhere.' The three output formats are named, and the distinction from export_annotations is implicit in the resource (multi-image dataset vs annotations) and made concrete by the format list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear selection guidance ('by category (case-insensitive) or image_ids (up to 100)') and a situational recommendation ('output_dir ... suits large datasets such as nuclei'). It does not name a sibling alternative or state what happens when neither category nor image_ids is supplied, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_imageGet image detailsARead-onlyIdempotent
Get one image's metadata, all annotations, and a signed viewing URL (valid 24h).
| Name | Required | Description | Default |
|---|---|---|---|
| image_id | Yes | Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds real value beyond them by disclosing that the returned viewing URL is signed and expires after 24h and that the full annotation set is included — a detail an agent must know before caching or reusing the URL.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the return payload and ends with the operationally important 24h URL caveat. No filler, no redundancy with the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with a full output schema and strong annotations, the description covers purpose, payload contents, and the URL expiry caveat. The only shortfall is the unaddressed overlap with view_image, which an agent choosing between the two would still have to guess at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single image_id parameter is fully documented in the schema, including its UUID format and provenance. The description adds nothing beyond 'one image', so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource ('Get one image') plus an explicit enumeration of the payload: metadata, all annotations, and a signed viewing URL. That is far more informative than the title. It does not, however, distinguish itself from the nearby sibling view_image, leaving the boundary between the two implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to call this instead of list_images or view_image, nor does it state prerequisites (an existing image_id from a listing or upload). The only usage signal is the singular 'one image', which an agent could infer from the required image_id anyway.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_slide_analysisGet a slide's analysisARead-onlyIdempotent
A whole slide's analysis: its status (queued, running with the current step, done or failed), and when done the slide-level summary, each analysed tile (position, nuclei per mm2, enlarged nuclei, quality), the images made from the densest tiles, and a link to every nucleus as QuPath GeoJSON.
| Name | Required | Description | Default |
|---|---|---|---|
| image_id | Yes | Id of a whole slide: the imageId (a UUID string) returned by upload_slide or upload_slide_from_url. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds real value on top: the four lifecycle states, that tile-level metrics and densest-tile images are included, and that nucleus output is QuPath GeoJSON. It stops short of the one behavior an agent most needs — whether a call with status 'queued' or 'running' returns immediately or blocks until completion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single sentence, front-loaded with the resource ('A whole slide's analysis') and then the contents. The parenthetical tile-field list is dense but each item is informative; only the trailing GeoJSON detail could be trimmed given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with full annotations, full schema coverage and an output schema, the description is nearly complete: it covers the state machine and the payload shape. The remaining gap is polling/blocking semantics for queued and running states, which the output schema cannot convey.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema coverage, the schema already explains that image_id is the UUID returned by upload_slide or upload_slide_from_url. The description adds nothing about the parameter, which is acceptable given the schema does the work, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description makes clear this retrieves the analysis record for a whole slide and enumerates exactly what that record contains (status, tile metrics, densest-tile images, nucleus GeoJSON). It is specific about the resource and payload, but it never names the sibling it is distinct from — notably analyze_slide, which presumably triggers the work this tool reads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the enumeration of statuses (queued, running with current step, done, failed) hints that this is the tool to poll after kicking off an analysis, but the description never says so explicitly and names no alternative. There is no statement of when not to use it or what to call instead to start an analysis.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_imagesList imagesARead-onlyIdempotent
List images saved in Image Label, optionally filtered by category (case-insensitive). Returns summaries; use get_image for annotations and the viewing URL.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Only images in this category (case-insensitive); omit to list all images. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower. The description still adds value beyond them by disclosing that results are summaries only and that full annotations and viewing URLs live elsewhere, which prevents an agent from assuming a rich return payload.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste: the operation and filter come first, the pointer to get_image second. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape detail is not required, and the description correctly signals that returns are summaries. Combined with annotations covering safety and a single fully-documented parameter, an agent has what it needs; only pagination/ordering behavior is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents the category parameter, its null default, and case-insensitivity. The description restates the case-insensitivity but adds no new syntax or semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List images saved in Image Label') plus the scope of the optional filter. It is clearly distinguishable from get_image, view_image, and the upload/mutation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to get_image when annotations or the viewing URL are needed, which is the key sibling decision for this tool family. It doesn't state exclusions (e.g., use export_dataset for bulk export), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
normalize_stainNormalize H&E stainA
Make an H&E image's colours standard (Macenko stain normalization), saved as a NEW image.
Slides from different labs and scanners differ in pink and purple tones; normalizing them makes images comparable and helps models such as detect_nuclei. The original is unchanged. Returns the new image.
| Name | Required | Description | Default |
|---|---|---|---|
| image_id | Yes | Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds meaningful context beyond annotations: names the algorithm (Macenko), states the original is unchanged and a new image is created, which is consistent with readOnlyHint=false and destructiveHint=false. It does not address idempotency (annotations say non-idempotent) or failure modes, so it stops short of full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the key fact (saved as a NEW image) in the first line; the method and rationale follow. Slightly wordy with a redundant closing 'Returns the new image,' but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be described, and the non-destructive behaviour plus algorithm name are supplied. For a single-parameter mutation tool with annotations covering safety profile, the only missing piece is idempotency/failure behaviour.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single image_id parameter is fully documented there, including that it comes from list_images or an upload. The description adds no parameter-level detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (normalize an H&E image's colours via Macenko) and immediately clarifies the output is a NEW image, distinguishing it from transformation-in-place siblings like update_image_metadata. An agent can tell exactly what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when it is useful: slides from different labs/scanners differ in pink and purple tones, and normalizing makes them comparable and helps models such as detect_nuclei. This implicitly routes the agent (run before detection/classification), though it does not state explicit exclusions or prerequisites (e.g. requires an H&E slide).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_annotationsRemove annotationsADestructiveIdempotent
Remove specific annotations from an image by their ids, keeping all the others.
Use it to delete a few annotations; to change many at once (rename labels, fix shapes) use replace_annotations instead. Get the ids from get_image (each annotation's id field). Ids that are not on the image are ignored, and the rest are removed in one save. Returns the number removed and the new annotation count.
| Name | Required | Description | Default |
|---|---|---|---|
| image_id | Yes | Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload. | |
| annotation_ids | Yes | Ids of the annotations to delete (the id field of each annotation from get_image); ids not on the image are ignored. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=false, so the safety profile is covered. The description adds genuine value beyond that: unknown ids are silently ignored rather than erroring, and all removals happen in a single atomic save. It does not explicitly restate irreversibility, but the destructive hint covers that ground.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and scope, then the alternative, then edge-case behavior. The final sentence on return values is somewhat redundant given an output schema exists, but the rest of the text is dense and waste-free.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive mutation with full schema coverage, annotations, and an output schema, the description covers scope, alternative routing, id sourcing, and unknown-id handling. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are already documented in detail, including the UUID format and the 'ids not on the image are ignored' note. The description's mention of get_image's id field largely duplicates the schema, so it adds little beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove) plus resource (annotations) and the scoping qualifier 'by their ids, keeping all the others,' which makes the partial-deletion semantics unambiguous. It is clearly distinguishable from add_annotations and replace_annotations without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('delete a few annotations') and names the alternative plus its selecting condition ('to change many at once ... use replace_annotations instead'). It also routes the agent to get_image for id acquisition, closing the prerequisite loop.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_annotationsReplace all annotationsADestructive
Replace ALL annotations on an image with the given list. Pass an empty list to clear them.
| Name | Required | Description | Default |
|---|---|---|---|
| image_id | Yes | Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload. | |
| annotations | Yes | The complete new list of annotations; every existing annotation not in it is deleted. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false. The description adds useful behavioral detail by emphasizing that ALL annotations are replaced and that an empty list clears them, though it does not discuss reversibility or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences front-load the key action and then provide the important empty-list edge case. There is no redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given rich annotations, a fully described schema, and an output schema, the description provides everything needed to understand the tool's effect. Return values need not be explained because an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already well documented. The description reinforces that the annotations list is the complete replacement set and that an empty list clears, but adds little syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (replace), resource (annotations), and scope (ALL on an image). The all-caps scope and empty-list clearing behavior distinguish it from add_annotations and remove_annotations without needing sibling names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly establishes when to use it: replacing the entire annotation set, with an explicit note that an empty list clears annotations. It does not explicitly name add_annotations or remove_annotations as alternatives for append or partial deletion, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
segment_objectsOutline objects (Segment Anything)A
Trace precise outlines with Segment Anything and add them as polygon annotations.
Give each object a rough box (or a point on it) in image pixels; the model finds the object's exact edges, so the box only has to contain the object. Prefer this to drawing polygons yourself. model: "sam" for photos and general images; "medsam" for medical images (CT, MRI, X-ray, ultrasound, endoscopy, pathology), which takes boxes only. Up to 20 objects per call. With save=false the outlines are returned without being saved. Each result has the model's quality score (0-1).
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | Save the outlines as polygon annotations; false only returns them. | |
| model | No | 'sam' for everyday images; 'medsam' for medical images (CT, MRI, X-ray, ultrasound, endoscopy, pathology), which needs a box for every object. | sam |
| objects | Yes | Objects to outline, each with a label and a rough box (x, y, width, height) or a point on it, in image pixels. | |
| image_id | Yes | Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the write/safety profile; the description adds the operational context an agent would otherwise learn by failing: a 20-object batch cap, that a loose box suffices, that medsam accepts boxes only, that save=false is a dry run returning outlines unsaved, and that each result carries a 0-1 quality score. No contradiction with readOnlyHint=false / destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the key insight about rough boxes, and the operational limits come next. It loses a little by restating the model enum description almost verbatim from the schema, which is duplicated text rather than new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation tool with an output schema and full annotation coverage, this is complete: batch limit, dry-run mode, model semantics, input units and quality-score presence are all covered. Return-value detail is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by explaining that the box 'only has to contain the object' (removing the most common calling error) and by tying model choice to image domain. It does not add much about color/notes, but those are self-evident from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Trace precise outlines with Segment Anything and add them as polygon annotations') and explicitly distinguishes itself from the manual alternative in the sibling set ('Prefer this to drawing polygons yourself'). An agent can tell it apart from add_annotations without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives selection criteria for the model parameter ('sam' for photos, 'medsam' for CT/MRI/X-ray/ultrasound/endoscopy/pathology), states the box-only restriction for medsam, and defines the save=false path. It also names the alternative workflow (hand-drawing polygons) and says to prefer this tool, which is real routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_image_metadataUpdate image detailsAIdempotent
Update an image's name, category, sub-category or description. Omitted fields are left unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New display name; omit to keep it. | |
| category | No | New category; omit to keep it. | |
| image_id | Yes | Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload. | |
| description | No | New description; omit to keep it. | |
| sub_category | No | New sub-category; omit to keep it. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds the patch-style 'omitted fields unchanged' contract, which is useful, but it is silent on what happens when a field is explicitly set to null (the schema permits null) and on any permission requirements — an ambiguity that matters for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler; the mutable field list comes first and the partial-update rule is front-loaded immediately after. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the safety profile for a low-complexity 5-parameter flat tool. The only real omissions are the null-versus-omit distinction and any authorization expectations, which are minor but not negligible for a write operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every property already carries an 'omit to keep it' description plus a UUID explanation for image_id, so the schema does the heavy lifting. The description merely enumerates the same four editable fields and adds the aggregate patch rule, which is a baseline-level contribution rather than new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Update') and resource ('an image's name, category, sub-category or description'), so the agent knows exactly what changes. It is the only metadata-mutation tool among the siblings, but the description never says so explicitly, leaving differentiation to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence 'Omitted fields are left unchanged' establishes partial-update semantics, which is real usage guidance for calling it correctly. However, there is no explicit when-to-use framing versus siblings such as add_annotations or replace_annotations, and no stated prerequisites (e.g., whether the image must exist or be owned by the caller).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imageUpload a local imageA
Upload a local image file (path on the machine running this server) to Image Label.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name; defaults to the file name. | |
| path | Yes | Absolute path of an image file (up to 20 MB) on the machine running this server. | |
| category | No | Category to file the image under (list_images filters by it). | |
| description | No | Free-text description stored with the image. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the write semantics are covered. The description's only added behavioral detail is that the path resolves on the server host, not the client; it says nothing about the 20 MB cap, storage location, or whether a repeated upload duplicates the image.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action, with the parenthetical caveat placed exactly where it is needed. No padding, though it is arguably too terse for a mutating upload tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and all four parameters are documented in the schema, so return values and argument details are not the description's burden. The remaining gap is routing guidance against upload_image_from_url, which an agent would have to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – path, name, category and description each carry their own schema-level explanation including the 20 MB limit. The description restates the path constraint but adds no syntax or format meaning beyond the schema, so the baseline applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Upload a local image file ... to Image Label') and the parenthetical clarifies the source is a filesystem path, which implicitly separates it from upload_image_from_url. Sibling differentiation is only implied by 'local' rather than stated explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'path on the machine running this server' note tells the agent where the file must live, which rules out remote files, but it never names upload_image_from_url as the alternative for URL-based uploads or states any other when-to-use condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_image_from_urlUpload an image from a URLA
Download an image from an https URL and upload it to Image Label (PNG, JPEG, WebP, GIF, BMP or TIFF, up to 20 MB). Use this for images that are online, e.g. ones attached in a chat.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public http(s) URL of the image (up to 20 MB); the server downloads it. | |
| name | No | Display name; defaults to the file name in the URL. | |
| category | No | Category to file the image under (list_images filters by it). | |
| description | No | Free-text description stored with the image. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, open-world, non-idempotent, non-destructive. The description adds genuinely new facts the annotations cannot convey: the server performs the fetch, accepted formats, and the 20 MB ceiling — the failure modes an agent would otherwise hit blind. It doesn't mention auth/SSRF restrictions or that repeated calls duplicate the image.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and followed by the content constraints, then the usage cue. No filler and nothing an agent would have to re-read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full param coverage, the description need only carry constraints and selection guidance, and it does both. The remaining gap is that it treats this as the only URL-based image ingest path without pointing at upload_image for local files.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so name, category and description are already documented, giving a baseline of 3. The description only restates the format and size constraints already attached to the url property, adding nothing new; note it says 'https URL' where the schema says 'public http(s) URL'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific two-step verb chain (download from URL, upload to Image Label) plus the resource, which an agent can distinguish from upload_image and upload_slide_from_url by the 'from an https URL' qualifier. It never names those siblings explicitly, so the differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this for images that are online, e.g. ones attached in a chat' gives a clear positive selection condition. It stops short of the inverse rule (e.g. 'for local files use upload_image') or any note that each call creates a new image rather than replacing one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_slideUpload a whole slideA
Upload a whole-slide file (.svs, .ndpi, pyramidal .tif/.tiff, up to 5 GB) from the machine running this server, and start its analysis in the background (see analyze_slide).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name; defaults to the file name. | |
| path | Yes | Absolute path of a whole-slide file (.svs, .ndpi or pyramidal .tif / .ome.tif, up to 5 GB) on the machine running this server. | |
| analyze | No | Start a sample analysis (analyze_slide) as soon as the upload finishes. | |
| category | No | Category to file the slide under (list_images filters by it). | |
| max_tiles | No | Tiles to analyse for a sample (default 12 with cell types, 16 without). | |
| cell_types | No | Also type each nucleus (tumour, immune, connective tissue, dead, normal epithelial); default on for a sample, off for full coverage. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag a non-read-only, non-idempotent write; the description adds real value by disclosing the background analysis kickoff and the size ceiling. It does not say what happens on a name collision or whether a re-upload duplicates or overwrites the slide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, format-and-limit constraint front-loaded, and the pointer to analyze_slide at the end. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and annotations carry the safety profile. The only meaningful gap is failure/overwrite behavior on an existing slide name.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so formats, path semantics, analyze, max_tiles, cell_types and category are all already documented in the schema. The description adds no syntax or default detail beyond what the schema fields provide, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource (upload a whole-slide file), with accepted formats and the 5 GB cap stated inline. The phrase 'from the machine running this server' separates it from the sibling upload_slide_from_url without naming it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The local-file constraint plus the note that analysis starts in the background (see analyze_slide) gives clear usage context. It never explicitly says to prefer upload_slide_from_url for remote files, so an exclusion 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.
upload_slide_from_urlUpload a whole slide from a URLA
Copy a whole-slide file (.svs, .ndpi, pyramidal .tif/.tiff, up to 5 GB) from an https URL into Image Label, and start its analysis in the background (see analyze_slide).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public http(s) URL of a whole-slide file (.svs, .ndpi or pyramidal .tif / .ome.tif, up to 5 GB). | |
| name | No | Display name; defaults to the file name in the URL. | |
| analyze | No | Start a sample analysis (analyze_slide) as soon as the upload finishes. | |
| category | No | Category to file the slide under (list_images filters by it). | |
| max_tiles | No | Tiles to analyse for a sample (default 12 with cell types, 16 without). | |
| cell_types | No | Also type each nucleus (tumour, immune, connective tissue, dead, normal epithelial); default on for a sample, off for full coverage. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), so the description's added value is the async behavior: analysis is kicked off 'in the background' rather than returned inline, which an agent must know. It also bounds the operation with accepted formats and a 5 GB ceiling. It does not mention that repeat uploads are non-idempotent (duplicates), which annotations flag but the description never reinforces.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the core action first and the side effect second; every clause carries information an agent needs. No padding or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and all six parameters are fully described in the schema. The async nature of the analysis is disclosed. Gaps are minor but real: failure/partial-upload behavior and the duplicate-creation risk of a non-idempotent upload go unmentioned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter is documented inline, so the schema carries the semantics. The description's format and size details largely restate the 'url' parameter's own description and add no syntax or behavioral nuance beyond it. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Copy ... from an https URL into Image Label') and a specific resource ('whole-slide file'), plus the side effect of starting analysis. The 'whole-slide' qualifier implicitly separates it from upload_image_from_url, but the sibling tools upload_slide and upload_image_from_url are never named, so the distinction is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the file-type and size constraints (use this for large pyramidal slide formats from a remote URL), and it points to analyze_slide for the follow-on behavior. There is no explicit when-to-use vs. when-not guidance, and no mention of when to prefer the local-file sibling upload_slide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
view_imageView imageARead-onlyIdempotent
Look at an image: returns the picture itself, scaled to at most max_size pixels, with a yellow grid labelled in the ORIGINAL image's pixel coordinates.
Use it before segment_objects or add_annotations to read where objects are (boxes and points are in those coordinates), and with with_annotations=true afterwards to check the outlines. region zooms into part of a large image (x, y, width, height in image pixels), e.g. to see individual nuclei.
| Name | Required | Description | Default |
|---|---|---|---|
| grid | No | Draw the yellow coordinate grid, labelled in original image pixels. | |
| region | No | Zoom into this part of the image (x, y, width, height in original image pixels); omit for the whole image. | |
| image_id | Yes | Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload. | |
| max_size | No | Longest side of the returned picture, in pixels. | |
| with_annotations | No | Draw the image's saved annotations on the picture, to check them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds genuinely non-obvious behavior: the image is downscaled to at most max_size, the grid labels use the original image's pixel coordinates rather than the scaled ones, and region performs a zoom. That coordinate-frame disclosure is exactly the kind of detail an agent cannot infer from structured fields and would otherwise misread when consuming boxes or points.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: what it returns and in what coordinate frame first, then when to call it, then the zoom case. Every clause carries information an agent needs to place the call in a workflow; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly carries the burden of describing the return value (the rendered picture plus grid) and the coordinate convention. It leaves minor gaps — e.g., the image_id source is only in the schema, and behavior when annotations exist but with_annotations is false is unstated — but nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description goes further by explaining the purpose of region ("zooms into part of a large image ... to see individual nuclei") and tying grid and max_size to their rendered effect. It adds intent-level meaning beyond the per-field schema text without restating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource ("Look at an image: returns the picture itself") and specifies the exact artifact returned — a scaled picture with a yellow grid labelled in the ORIGINAL image's pixel coordinates. This implicitly separates it from get_image, which by name suggests metadata/id retrieval rather than a rendered view, and the coordinate-frame detail tells an agent precisely what it will see.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit workflow routing: "Use it before segment_objects or add_annotations" and "with with_annotations=true afterwards to check the outlines," plus the condition for region ("e.g. to see individual nuclei"). It lacks an explicit when-not statement or a named alternative such as get_image for metadata-only needs, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
warm_upWarm up a modelARead-onlyIdempotent
Start loading a model ahead of use, without waiting for it: "sam" or "medsam" for segment_objects, "nuclei" for detect_nuclei.
After a quiet spell a model takes a minute or two to start; call this as soon as you know you will need it (for example right after uploading), and do other work meanwhile.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Model to start: 'sam' or 'medsam' (for segment_objects) or 'nuclei' (for detect_nuclei and classify_cells). | sam |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, idempotent=true, non-destructive, closed-world, so the safety profile is covered. The description adds genuinely new behavioral context that annotations cannot express: the call is fire-and-forget, it exists to mask a one-to-two minute cold-start latency, and it should be overlapped with other work. It stops short of stating what happens if the model is already warm or what the response confirms, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both front-loaded with the action and the model-value mapping before the rationale. No filler, though the second sentence's clause buries the strongest usage instruction ("call this as soon as you know") after the latency explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, zero-required, idempotent pre-load tool with a full output schema and rich annotations, the description supplies exactly the missing piece: when to fire it and how to overlap it with other work. Nothing an agent needs in order to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the enum is self-documenting, so the baseline is 3. The description earns above baseline by tying each value to the downstream tool that benefits from the warm-up (sam/medsam → segment_objects, nuclei → detect_nuclei), which tells the agent how to pick a value from intent rather than from the string alone. It is marginally less complete than the schema, which also mentions classify_cells for 'nuclei'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — "Start loading a model ahead of use, without waiting for it" — and immediately maps each model value to the sibling operation that will consume it (segment_objects, detect_nuclei). An agent can distinguish this pre-loading tool from the actual segmentation/detection tools without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ("call this as soon as you know you will need it (for example right after uploading)") and an explicit behavioral instruction for the interim ("do other work meanwhile"). It also justifies the advice with the condition that motivates it — a quiet spell causing a one-to-two minute cold start.
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.
22 tool updates
v0.8.1- Changed
add_annotations2 fields changed- added
Input schema / properties / annotations / descriptionAdded value: +"Annotations to add (polygon, circle, rectangle, pin or arrow, in image pixels); existing annotations are kept." - added
Input schema / properties / image_id / descriptionAdded value: +"Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload."
- Changed
analyze_slide6 fields changed- added
Input schema / properties / cell_types / descriptionAdded value: +"Also type each nucleus (tumour, immune, connective tissue, dead, normal epithelial); default on for a sample, off for full coverage." - added
Input schema / properties / coverage / descriptionAdded value: +"'sample': up to max_tiles tiles spread over the tissue, in minutes; 'full': every tissue tile in parallel, with a density heatmap." - added
Input schema / properties / image_id / descriptionAdded value: +"Id of a whole slide: the imageId (a UUID string) returned by upload_slide or upload_slide_from_url." - added
Input schema / properties / max_tiles / descriptionAdded value: +"Tiles to analyse for a sample (default 12 with cell types, 16 without)." - added
Input schema / properties / restart / descriptionAdded value: +"Start a new analysis even if one already exists for this slide." - added
Input schema / properties / wait_seconds / descriptionAdded value: +"How long to wait for the result; if it isn't ready, get_slide_analysis reads it later."
- Changed
check_image_quality1 field changed- added
Input schema / properties / image_id / descriptionAdded value: +"Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload."
- Changed
classify_cells2 fields changed- added
Input schema / properties / image_id / descriptionAdded value: +"Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload." - added
Input schema / properties / wait_seconds / descriptionAdded value: +"How long to wait for the result; if it isn't ready, call again later to read it."
- Changed
detect_nuclei6 fields changed- added
Input schema / properties / image_id / descriptionAdded value: +"Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload." - added
Input schema / properties / mark_enlarged / descriptionAdded value: +"Label nuclei over 2.5x the median area 'enlarged nucleus' (in red); the rest are 'nucleus'." - added
Input schema / properties / max_nuclei / descriptionAdded value: +"Most nuclei to save, the most confident first." - added
Input schema / properties / microns_per_pixel / descriptionAdded value: +"Scanner resolution in microns per pixel (often 0.25 at 40x, 0.5 at 20x); adds sizes in square microns and density per square millimetre." - added
Input schema / properties / replace_previous / descriptionAdded value: +"Delete nuclei saved by an earlier detect_nuclei run on this image before saving the new ones (other annotations are kept). False adds to them." - added
Input schema / properties / save / descriptionAdded value: +"Save the outlines as annotations; false only returns the measurements."
- Changed
export_annotations2 fields changed- added
Input schema / properties / format / descriptionAdded value: +"'coco' (COCO JSON), 'yolo' (YOLO labels and classes) or 'qupath' (QuPath GeoJSON, nuclei as detections)." - added
Input schema / properties / image_id / descriptionAdded value: +"Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload."
- Changed
export_dataset5 fields changed- added
Input schema / properties / category / descriptionAdded value: +"Export every image in this category (case-insensitive); give this or image_ids." - added
Input schema / properties / classes / descriptionAdded value: +"Class names in the order to number them; other labels follow in first-seen order." - added
Input schema / properties / format / descriptionAdded value: +"'coco' (COCO JSON), 'yolo' (YOLO labels and classes) or 'qupath' (QuPath GeoJSON, nuclei as detections)." - added
Input schema / properties / image_ids / descriptionAdded value: +"Export these images (up to 100); give this or category." - added
Input schema / properties / output_dir / descriptionAdded value: +"Folder on the machine running this server to write the files to (not when hosted); omit to return them."
- Changed
get_image1 field changed- added
Input schema / properties / image_id / descriptionAdded value: +"Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload."
- Changed
get_slide_analysis1 field changed- added
Input schema / properties / image_id / descriptionAdded value: +"Id of a whole slide: the imageId (a UUID string) returned by upload_slide or upload_slide_from_url."
- Changed
list_images1 field changed- added
Input schema / properties / category / descriptionAdded value: +"Only images in this category (case-insensitive); omit to list all images."
- Changed
normalize_stain1 field changed- added
Input schema / properties / image_id / descriptionAdded value: +"Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload."
- Changed
remove_annotations2 fields changed- added
Input schema / properties / annotation_ids / descriptionAdded value: +"Ids of the annotations to delete (the id field of each annotation from get_image); ids not on the image are ignored." - added
Input schema / properties / image_id / descriptionAdded value: +"Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload."
- Changed
replace_annotations2 fields changed- added
Input schema / properties / annotations / descriptionAdded value: +"The complete new list of annotations; every existing annotation not in it is deleted." - added
Input schema / properties / image_id / descriptionAdded value: +"Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload."
- Changed
segment_objects4 fields changed- added
Input schema / properties / image_id / descriptionAdded value: +"Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload." - added
Input schema / properties / model / descriptionAdded value: +"'sam' for everyday images; 'medsam' for medical images (CT, MRI, X-ray, ultrasound, endoscopy, pathology), which needs a box for every object." - added
Input schema / properties / objects / descriptionAdded value: +"Objects to outline, each with a label and a rough box (x, y, width, height) or a point on it, in image pixels." - added
Input schema / properties / save / descriptionAdded value: +"Save the outlines as polygon annotations; false only returns them."
- Changed
share_image1 field changed- added
Input schema / properties / image_id / descriptionAdded value: +"Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload."
- Changed
update_image_metadata5 fields changed- added
Input schema / properties / category / descriptionAdded value: +"New category; omit to keep it." - added
Input schema / properties / description / descriptionAdded value: +"New description; omit to keep it." - added
Input schema / properties / image_id / descriptionAdded value: +"Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload." - added
Input schema / properties / name / descriptionAdded value: +"New display name; omit to keep it." - added
Input schema / properties / sub_category / descriptionAdded value: +"New sub-category; omit to keep it."
- Changed
upload_image4 fields changed- added
Input schema / properties / category / descriptionAdded value: +"Category to file the image under (list_images filters by it)." - added
Input schema / properties / description / descriptionAdded value: +"Free-text description stored with the image." - added
Input schema / properties / name / descriptionAdded value: +"Display name; defaults to the file name." - added
Input schema / properties / path / descriptionAdded value: +"Absolute path of an image file (up to 20 MB) on the machine running this server."
- Changed
upload_image_from_url4 fields changed- added
Input schema / properties / category / descriptionAdded value: +"Category to file the image under (list_images filters by it)." - added
Input schema / properties / description / descriptionAdded value: +"Free-text description stored with the image." - added
Input schema / properties / name / descriptionAdded value: +"Display name; defaults to the file name in the URL." - added
Input schema / properties / url / descriptionAdded value: +"Public http(s) URL of the image (up to 20 MB); the server downloads it."
- Changed
upload_slide6 fields changed- added
Input schema / properties / analyze / descriptionAdded value: +"Start a sample analysis (analyze_slide) as soon as the upload finishes." - added
Input schema / properties / category / descriptionAdded value: +"Category to file the slide under (list_images filters by it)." - added
Input schema / properties / cell_types / descriptionAdded value: +"Also type each nucleus (tumour, immune, connective tissue, dead, normal epithelial); default on for a sample, off for full coverage." - added
Input schema / properties / max_tiles / descriptionAdded value: +"Tiles to analyse for a sample (default 12 with cell types, 16 without)." - added
Input schema / properties / name / descriptionAdded value: +"Display name; defaults to the file name." - added
Input schema / properties / path / descriptionAdded value: +"Absolute path of a whole-slide file (.svs, .ndpi or pyramidal .tif / .ome.tif, up to 5 GB) on the machine running this server."
- Changed
upload_slide_from_url6 fields changed- added
Input schema / properties / analyze / descriptionAdded value: +"Start a sample analysis (analyze_slide) as soon as the upload finishes." - added
Input schema / properties / category / descriptionAdded value: +"Category to file the slide under (list_images filters by it)." - added
Input schema / properties / cell_types / descriptionAdded value: +"Also type each nucleus (tumour, immune, connective tissue, dead, normal epithelial); default on for a sample, off for full coverage." - added
Input schema / properties / max_tiles / descriptionAdded value: +"Tiles to analyse for a sample (default 12 with cell types, 16 without)." - added
Input schema / properties / name / descriptionAdded value: +"Display name; defaults to the file name in the URL." - added
Input schema / properties / url / descriptionAdded value: +"Public http(s) URL of a whole-slide file (.svs, .ndpi or pyramidal .tif / .ome.tif, up to 5 GB)."
- Changed
view_image5 fields changed- added
Input schema / properties / grid / descriptionAdded value: +"Draw the yellow coordinate grid, labelled in original image pixels." - added
Input schema / properties / image_id / descriptionAdded value: +"Id of an image in Image Label: the imageId (a UUID string) returned by list_images or an upload." - added
Input schema / properties / max_size / descriptionAdded value: +"Longest side of the returned picture, in pixels." - added
Input schema / properties / region / descriptionAdded value: +"Zoom into this part of the image (x, y, width, height in original image pixels); omit for the whole image." - added
Input schema / properties / with_annotations / descriptionAdded value: +"Draw the image's saved annotations on the picture, to check them."
- Changed
warm_up1 field changed- added
Input schema / properties / model / descriptionAdded value: +"Model to start: 'sam' or 'medsam' (for segment_objects) or 'nuclei' (for detect_nuclei and classify_cells)."
12 tool updates
v0.8.0- Added
analyze_slide - Added
classify_cells - Changed
detect_nuclei1 field changed- added
Input schema / properties / microns_per_pixelAdded value: +{ + "anyOf": [ + { + "maximum": 2, + "minimum": 0.05, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Microns Per Pixel" +}
- Added
export_dataset - Added
get_slide_analysis - Added
share_image - Added
upload_slide - Added
upload_slide_from_url - Added
view_image - Added
warm_up - Removed
warm_up_pathology - Removed
warm_up_segmentation
8 tool updates
v0.3.3- Added
check_image_quality - Added
detect_nuclei - Changed
export_annotations1 field changed- changed
Input schema / properties / format / enumPrevious value: -[ - "coco", - "yolo" -]New value: +[ + "coco", + "yolo", + "qupath" +]
- Added
normalize_stain - Added
segment_objects - Added
upload_image_from_url - Added
warm_up_pathology - Added
warm_up_segmentation
8 tool updates
v0.1.0- First observed
add_annotations - First observed
export_annotations - First observed
get_image - First observed
list_images - First observed
remove_annotations - First observed
replace_annotations - First observed
update_image_metadata - First observed
upload_image
TDQS
Scored across 22 tools
Most tools have clearly distinct purposes: upload, view, annotate (add/replace/remove), segment, detect, classify, analyze slide, export. The main potential confusion is between segment_objects and detect_nuclei (both add polygon annotations) and between export_annotations/export_dataset, but the descriptions draw the boundaries sharply enough. A couple of verbs like get_image vs view_image vs list_images require reading descriptions to distinguish, keeping it just under a perfect score.
Nearly all tools follow a consistent snake_case verb_noun pattern: get_image, list_images, update_image_metadata, add_annotations, upload_image, segment_objects, detect_nuclei, analyze_slide, export_dataset. The only slight outlier is warm_up (verb-only), but it still fits the lowercase snake_case convention. No mixing of camelCase or vague verb styles.
22 tools is on the heavy end but each maps to a real, non-redundant operation (upload file/url/slide, annotate, segment, detect, classify, analyze, export, share). The domain is genuinely broad (image management + pathology analysis + dataset export), so the count is justified rather than padded. It sits just above the ideal 3-15 window.
Coverage is strong: uploads (file/URL/slide), metadata update, viewing, full annotation lifecycle (add/replace/remove), segmentation, nuclei detection, classification, whole-slide analysis, quality/stain tools, and export both single-image and dataset. The one notable gap is the absence of any delete_image or delete_slide operation, leaving a dead end for removing content. Otherwise the lifecycle is well covered.
Maintenance
Related MCP Connectors
Roboflow computer vision for AI agents: datasets, annotation, versioning, workflows, inference.
LLM chat, text tools, image generation, editing, batch image jobs, and asynchronous video generation
FFmpeg as a service for AI agents: typed video editing tools, async jobs, downloadable outputs.
Image and video AI tools and your own pipelines, run from any AI assistant.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables Claude to generate and edit images through a live-discovered model catalog, including masked edits and exact output sizes, with browser-based sign-in and cost-annotated saved results. It runs locally over stdio and stores images in a configurable directory.7MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI coding assistants without native vision to analyze screenshots, errors, UI designs, and documents through a unified image understanding tool backed by multiple vision model providers. Supports local files, remote URLs, Data URIs, OCR, multi-crop processing, and stdio or HTTP deployment for shared access.866 npmMIT
- FlicenseNot gradedqualityAmaintenanceEnables AI agents to generate images, list available models, and view generation history over stdio, SSE, and Streamable HTTP transports.-
- FlicenseNot gradedqualityAmaintenanceEnables AI agents to generate images from text prompts, list available models, and view generation history through stdio, SSE, or Streamable HTTP transports.-