Starfetch
OfficialThis server is an MCP interface to Starfetch for discovering, inspecting, and querying astronomical TAP services through read-only tools.
List known service presets with
starfetch_list_presetsto choose a target before metadata inspection.Search the VO registry with
starfetch_registry_searchfor TAP services by query.Check TAP availability with
starfetch_tap_availabilityto distinguish unavailable services from empty results.Read TAP capabilities with
starfetch_tap_capabilities, including auth requirements, formats, and languages.List tables on a selected TAP service with
starfetch_tap_tables.Inspect table columns with
starfetch_tap_columnsto get names, datatypes, units, and descriptions before constructing ADQL.Run synchronous ADQL queries with
starfetch_tap_query, selecting output formats such as VOTable, CSV, TSV, JSON, or JSONL.Submit asynchronous TAP jobs with
starfetch_tap_async_submit, preserving the exact query.Monitor async jobs with
starfetch_tap_job_statusandstarfetch_tap_job_wait.Fetch async job results with
starfetch_tap_job_fetchin multiple formats, with JSON/JSONL conversion support.Delete async jobs to clean up completed or unwanted jobs.
Inputs accept either an explicit TAP base URL or a known service preset.
Operations are read-only, idempotent, non-destructive, and do not support task execution or local file paths.
The server exposes the core Starfetch MCP tools without UI resources.
Provides access to the NASA Exoplanet Archive, enabling queries of exoplanet catalogs and related data through TAP.
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., "@StarfetchShow me the 10 brightest stars in the Pleiades from Gaia DR3."
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.
Starfetch
Starfetch gives AI agents safe, reproducible access to public astronomy catalogs through the Model Context Protocol (MCP).
Ask an astronomy question in natural language. A Starfetch-enabled agent can select an appropriate service, inspect its live tables and columns, construct a bounded ADQL query, execute it, and return the result with the exact service, table, query, limit, units, and assumptions it used.
You: Find the 10 Gaia DR3 sources with the highest proper motion within 0.5
degrees of the Pleiades center at RA 56.75°, Dec +24.12°. What stands out?
Agent: selects Gaia → inspects metadata → runs bounded ADQL →
returns catalog rows, exact ADQL, units, and assumptionsRepresentative captured result:
Service: ESA Gaia Archive
Table: gaiadr3.gaia_source
Rows returned: 10
Query limit: TOP 10 / MAXREC 10
Highest returned proper motions:
- Gaia DR3 66780900298410496: 244.48 mas/yr
- Gaia DR3 66524409149512064: 184.50 mas/yr
Exact ADQL:
SELECT TOP 10 source_id, ra, dec, pm, pmra, pmdec, parallax, parallax_error,
phot_g_mean_mag, bp_rp, ruwe
FROM gaiadr3.gaia_source
WHERE CONTAINS(POINT('ICRS', ra, dec), CIRCLE('ICRS', 56.75, 24.12, 0.5)) = 1
AND pm IS NOT NULL
ORDER BY pm DESCGaia, SIMBAD, VizieR, the NASA Exoplanet Archive, and IRSA are available as built-in service presets. Agents can also discover and query other public TAP services by URL. Starfetch remains TAP-native and keeps ADQL visible, so the agent workflow is convenient without becoming a scientific black box.
Start here
Related MCP server: aqc-mcp
Connect an agent
The local npm server is Starfetch's stable public connection path. It runs on your computer and can be registered with any compatible MCP client.
Local npm server
Register Starfetch with the agent client that will launch it. Running the MCP package by itself only starts a stdio server; it does not connect that server to an agent. Starfetch is also discoverable through the official MCP Registry.
Codex
Register Starfetch for the Codex CLI, IDE extension, and ChatGPT desktop app:
codex mcp add starfetch -- npx -y @starfetch-js/mcp
codex mcp listThese Codex surfaces share MCP configuration. See the official Codex MCP documentation.
Claude Code
Register Starfetch in user scope:
claude mcp add --scope user --transport stdio starfetch -- npx -y @starfetch-js/mcp
claude mcp get starfetchSee the official Claude Code MCP documentation.
Cursor
Add this server entry to ~/.cursor/mcp.json for global use or
.cursor/mcp.json for one project:
{
"mcpServers": {
"starfetch": {
"command": "npx",
"args": ["-y", "@starfetch-js/mcp"]
}
}
}See the official Cursor MCP documentation.
Other MCP clients can use the same stdio command and arguments through their own server-registration interface:
command: npx
args: -y @starfetch-js/mcpRestart or reload the client after registration, then ask a normal astronomy question. You should not need to write ADQL or name Starfetch tools in the prompt. Starfetch requires Node.js 22 or newer.
Remote MCP
A remote MCP service runs on the internet and accepts MCP connections over HTTPS. No Starfetch package has to be installed or launched on the user's computer. Compatible clients can connect to the production endpoint:
https://starfetch-mcp-app-production-wumkqeiqaa-ew.a.run.app/mcpThe remote service is public, unauthenticated, bounded, and best effort. Do not send credentials, private archive URLs, sensitive personal data, or unbounded workloads. The local npm server remains the default when you want local control or when a client does not support remote Streamable HTTP MCP.
See the remote service's overview, privacy notice, support, and terms of use.
What the agent does
For a service-specific catalog question, Starfetch guidance teaches the agent to:
choose an explicit service preset or public TAP URL;
check service availability when appropriate;
inspect relevant tables and the selected table's columns;
construct ADQL only from discovered schema information;
bound exploratory work with ADQL
TOP, TAPMAXREC, or both;execute the smallest useful query;
return the service, table, exact ADQL, effective limit, format, units, and relevant assumptions;
return to metadata after a schema or syntax failure instead of guessing.
The agent should never present a timeout, availability failure, parse error, or query error as an empty scientific result. A successful zero-row result and a failed request are different outcomes.
Starfetch exposes tools for the complete workflow:
starfetch_list_presets
starfetch_registry_search
starfetch_tap_availability
starfetch_tap_capabilities
starfetch_tap_tables
starfetch_tap_columns
starfetch_tap_query
starfetch_tap_submit_job
starfetch_tap_job_status
starfetch_tap_job_wait
starfetch_tap_job_fetch
starfetch_tap_job_deleteQuery tools return result data separately from diagnostics. They preserve the
exact submitted ADQL and effective row limit for reproduction and review.
Synchronous queries and async submissions send TAP MAXREC=100 when maxrec
is omitted.
The remote HTTP service returns an opaque jobCapability with each async
submission. Supply that value unchanged to every remote status, wait, fetch,
or delete call. The capability remains usable while the remote job exists and
the service signing secret is unchanged. Remote deletion is marked destructive
so MCP clients can obtain user approval. The stdio MCP server and CLI keep
their existing job-reference behavior and do not advertise remote-only fields.
Why Starfetch?
Starfetch is a useful middle layer when an agent needs live public catalog data without turning the workflow into a black box:
it inspects live schemas instead of guessing table and column names;
it bounds public-service queries by default and preserves service failures;
it returns exact ADQL, limits, units, and assumptions for reproduction;
it provides one metadata-first interface across several TAP services; and
its CLI and TypeScript library can reproduce an agent's query outside the agent client.
Use an archive's own interface, PyVO/Astropy, or local analysis tools instead when you need authenticated/private archives, extensive local analysis, image data processing, or authoritative astrophysical interpretation.
Reliability without hidden assumptions
The MCP server works without installing a filesystem skill. Starfetch carries the same canonical guidance through three overlapping layers:
Layer | Role |
MCP tool descriptions | Minimum metadata-first and bounded-query contract available to every MCP client |
MCP prompts and resources | Discoverable workflows, ADQL guidance, service notes, and examples |
Optional Starfetch skill | Rich multi-step behavior across longer agent interactions |
The server exposes the retrievable prompts query_astronomy_catalog,
explore_service, run_cone_search, and troubleshoot_adql. Canonical
Markdown resources are available under starfetch://guides/,
starfetch://services/, and starfetch://examples/.
Prompt and resource support depends on the MCP client. Tool descriptions remain self-sufficient for basic safe operation when a client exposes tools only. The optional skill contains the full workflow, service references, and examples.
Optional Starfetch skill
Install the skill when the agent client supports filesystem skills and you want the strongest multi-interaction behavior. The skill is recommended, not required by the MCP server.
Install the canonical skill directly from GitHub through skills.sh:
npx skills add https://github.com/starfetch-js/starfetch/tree/main/packages/skill/skill/starfetchInspect or install the packaged skill:
npx -y @starfetch-js/cli skill print
npx -y @starfetch-js/cli skill install --target codex
npx -y @starfetch-js/cli skill install --target claude-code --scope project
npx -y @starfetch-js/cli skill install --target cursorInstall into a custom final skill directory with:
npx -y @starfetch-js/cli skill install --path ./starfetch-skillUse --dry-run to preview file actions. Default destinations are:
Codex user scope:
~/.codex/skills/starfetchClaude Code user scope:
~/.claude/skills/starfetchCodex project scope:
.codex/skills/starfetchClaude Code project scope:
.claude/skills/starfetchCursor project scope:
.cursor/rules/starfetch.mdc
Codex and Claude Code default to user scope. Cursor defaults to project scope because its rules are project files.
Supported scope
Starfetch is designed for public astronomical Table Access Protocol services. It currently provides:
built-in presets for
gaia,simbad,vizier,exoplanetarchive, andirsa;VO registry search for additional TAP endpoints;
VOSI availability, capabilities, table, and column metadata;
bounded synchronous ADQL queries;
explicit TAP/UWS async job submission, status, wait, fetch, and deletion;
VOTable, CSV, and TSV requests, plus safe JSON and JSONL conversion;
exact query and limit diagnostics.
Starfetch does not accept credentials or implement authenticated TAP workflows. The MCP server does not execute shell commands or write local result files. Starfetch retrieves catalog data; it does not validate astrophysical interpretations or reconcile scientific differences between catalogs.
VOTable TABLEDATA and inline base64 BINARY/BINARY2 rows can be converted. VOTable FITS rows, remote streams, and compressed streams remain pass-through or unsupported for local row conversion.
CLI and TypeScript
MCP is the primary agent interface. The CLI is useful for scripting, inspecting a query outside an agent, and reproducing the exact request an agent reported. The TypeScript library supports applications and custom adapters.
CLI quickstart
Install or run the CLI once:
npm install -g @starfetch-js/cli
npx -y @starfetch-js/cli tap tables --service gaiaInspect metadata before writing service-specific ADQL:
starfetch tap availability --service gaia
starfetch tap tables --service gaia
starfetch tap columns --service gaia --table gaiadr3.gaia_sourceRun a bounded query:
starfetch tap query \
--service gaia \
--query "SELECT TOP 5 source_id, ra, dec FROM gaiadr3.gaia_source" \
--format jsonADQL can come from --query, a file, or stdin. Result data can be written with
--out:
starfetch tap query --service gaia --file query.sql --format csv --out result.csv
cat query.sql | starfetch tap query --service gaia --format jsonlUse --service for a preset or --url for an explicit TAP base URL. If both
are supplied, --url selects the endpoint and the service name remains as
diagnostic context.
Discover additional services through the VO registry:
starfetch tap registry search gaia --maxrec 5 --format jsonAsync jobs
Use explicit async jobs for larger justified queries:
starfetch tap jobs submit \
--service gaia \
--query "SELECT TOP 10 source_id, ra, dec FROM gaiadr3.gaia_source" \
--maxrec 10
starfetch tap jobs status <job-url>
starfetch tap jobs wait --interval 2000 --timeout 120000 <job-url>
starfetch tap jobs fetch <job-url> --format votable --out result.xml
starfetch tap jobs delete <job-url>Absolute job URLs are sufficient for follow-up commands. Bare job IDs require
--service or --url so Starfetch can resolve the TAP /async endpoint.
TypeScript API
Install @starfetch-js/core when a script, app, or custom agent adapter needs
direct TAP access:
npm install @starfetch-js/coreimport { registry, tap } from "@starfetch-js/core";
const client = tap("gaia");
const columns = await client.columns("gaiadr3.gaia_source");
const result = await client.query(
"SELECT TOP 5 source_id, ra, dec FROM gaiadr3.gaia_source",
{ format: "votable", maxrec: 5 },
);
console.log(columns.length);
console.log(await result.fields());
console.log(await result.overflow());
console.log(await result.json());
const services = await registry().searchTapServices({
query: "gaia",
maxrec: 5,
});
console.log(services[0]?.accessUrl);tap(target) accepts a known preset, a TAP base URL, or an object containing a
service and/or URL. Metadata methods read TAP /availability, /capabilities,
and /tables; sync queries use /sync, and explicit jobs use /async.
Run the Gaia proper-motion demo
Reproduce the demo's metadata-first Gaia query and print the exact ADQL, effective limit, and returned rows:
git clone https://github.com/starfetch-js/starfetch.git
cd starfetch
npm ci
npm run build
node examples/quickstart/run.mjsThis command queries the public Gaia TAP service. For more CLI, TypeScript API, live TAP, and MCP Inspector workflows, see starfetch-js/examples. Each example includes its exact ADQL, expected columns, and a cross-platform Node.js runner.
git clone https://github.com/starfetch-js/examples.git
cd examples
npm ci
node 01-gaia-nearby-stars/run.mjsLaunch MCP Inspector from that repository with:
npm run inspect:mcpPackages
@starfetch-js/mcp: primary stdio MCP server and packaged agent guidance.@starfetch-js/skill: optional distributable Starfetch agent skill.@starfetch-js/cli: scripting, TAP inspection, query, async job, and skill installation commands.@starfetch-js/core: reusable TAP, VOSI, UWS, VOTable, registry, and output conversion primitives.
Development
Install dependencies with the committed lockfile:
npm ciRun the private Streamable HTTP development app with:
npm run dev:httpIt serves MCP at http://127.0.0.1:3000/mcp and process health at
http://127.0.0.1:3000/health. Each MCP request gets a fresh stateless
@starfetch-js/mcp server. The HTTP surface keeps the 12 canonical Starfetch
tools unchanged and adds two UI-linked tools through the immutable
ui://starfetch/table/v1 MCP Apps resource. starfetch_render_table presents
an existing table view without submitting a TAP request.
starfetch_query_table runs a synchronous JSON query for the interactive
scientific table; its full loaded table is widget-only while the model receives
a 20-row preview. Ordinary MCP clients can continue using the canonical text
and structured results without loading the widget. Configuration is
environment-only:
HOSTdefaults to127.0.0.1; set0.0.0.0explicitly for all interfaces.PORTdefaults to3000.ALLOWED_ORIGINSis a comma-separated list of exact browser origins and defaults to none.SHUTDOWN_GRACE_MSdefaults to10000and accepts1through60000.STARFETCH_JOB_CAPABILITY_SECRETis a base64url secret of at least 32 bytes. It is required whenHOSTis not loopback; loopback development uses an ephemeral per-process secret when omitted.
The anonymous HTTP policy is a fixed, tested product profile rather than a
set of independently tunable environment variables. It caps MCP requests at 2
MiB, TAP responses at 8 MiB, inline uploads at 1 MiB, MAXREC at 10,000,
redirects at 3, outbound requests at 4 concurrent operations, and tools at 60
seconds. Canonical synchronous queries still default to MAXREC=100; the
interactive table query defaults to MAXREC=1000 and caps its widget payload
at 6 MiB.
Job waits default to 30 seconds, cap at 45 seconds, and poll between 1 and 10
seconds. The process admits 100 MCP requests per minute globally; deployments
that need per-client limits should enforce them at a trusted HTTPS ingress.
The HTTP host accepts only credential-free HTTPS TAP targets whose complete DNS result is public, pins validated addresses for each request hop, keeps redirects same-origin, never automatically follows write redirects, and rejects remote-URI TAP uploads. These restrictions apply to the anonymous HTTP app, not the local stdio MCP, CLI, or TypeScript API.
To verify the protocol surface without opening the widget, start the app and run MCP Inspector's CLI in another shell:
npx -y @modelcontextprotocol/inspector@latest --cli http://127.0.0.1:3000/mcp --transport http --method tools/list
npx -y @modelcontextprotocol/inspector@latest --cli http://127.0.0.1:3000/mcp --transport http --method tools/call --tool-name starfetch_list_presetsTo render the widget in MCP Inspector's Apps tab:
Keep
npm run dev:httprunning, then start the Inspector UI without a stdio server command:npx -y @modelcontextprotocol/inspector@latestIn Inspector, select Via Proxy, choose Streamable HTTP, enter
http://127.0.0.1:3000/mcp, leave authentication empty, and connect.Open Apps, select Refresh Apps, and choose
starfetch_render_table. The Apps tab lists UI-linked tools rather than the server name.Paste a valid bounded table view into App Input and select Open App. This minimal preset view exercises the widget without making a live TAP request:
{ "contractVersion": 1, "resultKind": "presets", "title": "TAP service presets", "columns": [ { "key": "name", "label": "Name" }, { "key": "url", "label": "TAP URL" } ], "rows": [ { "name": "gaia", "url": "https://gea.esac.esa.int/tap-server/tap" } ], "source": { "tool": "starfetch_list_presets" }, "state": "populated", "clipping": { "reasons": [], "sourceRows": 1, "sourceColumns": 2 } }
The Apps tab requires the Streamable HTTP endpoint; the canonical stdio server exposes the core Starfetch tools without UI resources. Inspector's Via Proxy mode works with the default origin policy. To use Direct mode, allow Inspector's browser origins explicitly when starting the app:
ALLOWED_ORIGINS=http://localhost:6274,http://127.0.0.1:6274 npm run dev:httpThe widget uses the standard MCP Apps host bridge for tool results, theme variables, display-mode requests, model-context updates, and file downloads. It also reads ChatGPT's initial tool globals when present and uses ChatGPT's file APIs only as a download fallback. Its React UI uses semantic table markup, global TanStack Table sorting, page-scoped row selection, 100-row desktop pages, 10-row mobile pages, and fine-grained Shiki SQL highlighting for exact ADQL. Desktop tables use a capped two-axis scroll viewport; mobile tables expand to the page height and retain horizontal scrolling for wide results. An icon-only control in the action toolbar requests fullscreen or inline display mode. Another action can expose selected rows or the current page to the model for the next turn; it does not expose the whole loaded table. The action remains available, and each press replaces the previously pending model-context snapshot. The resource declares no network or static-resource domains and requests only clipboard-write permission.
Run its unit, single-file build, and browser-host acceptance checks with:
npm --workspace @starfetch-js/mcp-app run check
npm --workspace @starfetch-js/mcp-app run test:browserBuild and smoke-test the production Linux container with Docker:
npm run smoke:containerThe image workflow publishes immutable containers to
ghcr.io/starfetch-js/starfetch-mcp-app.
For ChatGPT Developer Mode or another remote MCP Apps host, expose the local MCP
endpoint through HTTPS, add the resulting /mcp URL to the host, call a
metadata tool to inspect the target, then call starfetch_query_table. Verify
light and dark themes, fullscreen and inline modes, horizontal scrolling,
sorting, paging, highlighted ADQL and copying, current-page model context, and
TSV, CSV, and JSON copy and download actions. Host-specific visual differences
should be handled through the bridge theme variables rather than a second
component implementation.
For a temporary remote URL, the development machine can run:
cloudflared tunnel --url http://127.0.0.1:3000 --http-host-header 127.0.0.1:3000The HTTP app has no authentication. It applies a coarse, per-process fixed window limit of 100 MCP requests per minute, not per-client abuse protection. A quick tunnel is public and temporary: use only non-sensitive test traffic and stop it immediately after testing. This development app is not production deployment infrastructure.
The workspace requires Node.js >=22.13.0. Run:
npm run format:check
npm run lint
npm run typecheck
npm test
npm run coverage
npm run build
npm run smoke:cliRelease-sensitive agent surface checks are:
npm --workspace packages/mcp run typecheck
npm --workspace packages/mcp run test
npm --workspace packages/mcp run build
npm --workspace packages/mcp run smoke
npm --workspace @starfetch-js/mcp-app run check
npm --workspace packages/skill run typecheck
npm --workspace packages/skill run test
npm --workspace packages/skill run buildDefault tests use local fixtures and mocks only. Optional live TAP checks are explicit:
npm run test:live:tapLicense
MIT
Available Tools
12 toolsstarfetch_list_presetsList TAP presetsARead-onlyIdempotent
List built-in TAP service presets before selecting an explicit target for metadata inspection.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful context that the presets are built-in and intended as a preliminary step, but it does not disclose additional behavioral details such as output shape or ordering.
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 a single, well-structured sentence with no wasted words. It front-loads the core action ('List built-in TAP service presets') and then adds the practical sequencing context.
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 zero-parameter, read-only listing tool with an output schema and comprehensive annotations, the description is complete. It explains what the tool does and when it should be used, which is all an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
This tool has zero parameters, so there is no parameter burden for the description to carry. The baseline of 4 is appropriate because there is nothing about parameters that could be clarified.
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 specific verb ('List') and a specific resource ('built-in TAP service presets'), making the tool's purpose immediately clear. It also distinguishes this tool from the sibling TAP tools, which focus on availability, capabilities, tables, columns, queries, and jobs rather than presets.
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 provides clear timing guidance: use this tool 'before selecting an explicit target for metadata inspection.' It does not explicitly name alternatives or state when not to use it, but the intended workflow context is evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
starfetch_registry_searchSearch TAP registryARead-onlyIdempotent
Search VO registry metadata when no built-in preset fits; inspect the selected service before querying it.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Registry search text. | |
| maxrec | No | TAP MAXREC row limit for registry results. | |
| registryUrl | No | Explicit RegTAP service URL. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds the workflow context of inspecting a service before querying, but does not disclose details like possible registry inconsistency, incomplete metadata, or response variability beyond what openWorldHint implies.
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 is front-loaded with the main action and resource, then states the usage condition and the recommended follow-up. There is no filler or redundant restatement of the tool name.
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 that the output schema is present and annotations already convey the read-only, idempotent, and open-world behavior, the description covers the essential decision point: use when no preset fits and inspect before querying. It is slightly light on what 'inspect' should include, but the sibling tools and output schema fill most of the gap.
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?
The input schema has 100% description coverage for all three parameters, so the schema already explains query, maxrec, and registryUrl. The description adds no parameter-level guidance beyond the general registry-search context, which is acceptable given the high schema coverage.
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 specific verb ('Search'), a specific resource ('VO registry metadata'), and the triggering condition ('when no built-in preset fits'). It also signals a follow-up workflow step ('inspect the selected service before querying it'), which distinguishes it from direct querying tools like starfetch_tap_query.
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 explicitly says when to use the tool ('when no built-in preset fits') and instructs to inspect the selected service before querying it. It does not name sibling alternatives directly, but the condition is clear enough for an agent to route between the registry search and the preset list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
starfetch_tap_availabilityRead TAP availabilityARead-onlyIdempotent
Check whether the selected TAP service reports itself available; an unavailable service is not an empty catalog result.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Explicit TAP base URL selected for this workflow; use this or service. | |
| service | No | Known Starfetch TAP service preset selected for this workflow; use this or url. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior, so the description adds useful context rather than repeating annotations. The caveat that an unavailable service is not an empty catalog result provides meaningful behavioral guidance beyond what annotations convey.
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 states the action and then adds one important caveat. There is no redundancy or filler; every part of the description adds value.
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 simple read-only availability check with an output schema present and annotations covering safety and idempotency, the description is complete. It tells the agent what to check and the key interpretive caveat; no additional operational details seem necessary.
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%, with both url and service parameters documented as alternatives. The description does not add significant parameter-level detail, but it does not need to because the schema already explains the parameters and their relationship. Baseline 3 is 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?
The description clearly states a specific action and resource: checking whether the selected TAP service reports itself as available. It also distinguishes itself from sibling catalog/query tools by clarifying that an unavailable service should not be interpreted as an empty catalog result.
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 conveys the clear context that this tool is for checking availability of the selected TAP service before interpreting results. It does not explicitly name alternative tools or state when-not-to-use, but the context is unambiguous enough for selection among the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
starfetch_tap_capabilitiesRead TAP capabilitiesARead-onlyIdempotent
Inspect the selected TAP service's languages, formats, and authentication requirements before using service-specific features.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Explicit TAP base URL selected for this workflow; use this or service. | |
| service | No | Known Starfetch TAP service preset selected for this workflow; use this or url. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safe read-only nature is fully covered. The description adds useful context about what is inspected (languages, formats, auth), but does not disclose additional behavioral details such as error conditions or rate limits. No annotation contradiction exists.
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, tightly worded sentence that front-loads the action, the target, the inspected details, and the intended timing. No filler or repetition of schema content.
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-only capability inspection tool with an output schema and strong annotations, the description is adequate. It explains why and when to call it without needing to describe return values. It does not explicitly state that exactly one of url/service must be supplied, though the schema descriptions already communicate the either-or relationship.
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 both 'url' and 'service' parameters have clear descriptions including the 'use this or the other' relationship. The tool description adds no new parameter-level meaning, so the baseline of 3 is 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?
The description uses a specific verb ('Inspect') and names concrete resources: languages, formats, and authentication requirements of the selected TAP service. The phrase 'before using service-specific features' also distinguishes this from sibling tools like starfetch_tap_query or starfetch_tap_submit_job, which execute operations rather than introspect capabilities.
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 gives clear usage timing: use this before service-specific features. It does not explicitly name alternatives or exclusion conditions, but the sibling list and the 'before' phrasing make the intended workflow evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
starfetch_tap_columnsList TAP columnsARead-onlyIdempotent
Inspect names, datatypes, units, and descriptions for an exact metadata-discovered table before constructing ADQL.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Explicit TAP base URL selected for this workflow; use this or service. | |
| table | Yes | Exact TAP table name returned by prior metadata inspection. | |
| service | No | Known Starfetch TAP service preset selected for this workflow; use this or url. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds the key constraint that the table must be an exact metadata-discovered table and clarifies that the operation returns column metadata instead of data. There is no contradiction with annotations.
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 dense sentence that front-loads the verb and object, states what is inspected, and situates the call in its workflow. There is no filler and no repetition of schema 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 read-only metadata-listing tool, the description, full parameter schema, output schema, and annotations together cover workflow context, safety, and expected inputs. The phrase 'exact metadata-discovered table before constructing ADQL' supplies the important contextual cue.
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?
The input schema has 100% description coverage, so all three parameters are already documented. The description reinforces that 'table' must be the exact name from prior metadata inspection, but it adds no new syntax or format details beyond what the schema provides.
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 names a specific verb (Inspect) and resource (columns for a table), lists the returned facets (names, datatypes, units, descriptions), and ties the action to a workflow stage (before constructing ADQL). This clearly separates it from sibling tools like starfetch_tap_tables, which list tables rather than one table's columns.
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?
It explicitly says when to use it: after metadata discovery, before constructing ADQL, on an exact table name. It does not explicitly enumerate alternatives or state when not to use it, but the workflow context is clear enough to guide tool selection among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
starfetch_tap_job_deleteDelete TAP async jobBDestructive
Delete a TAP async job from the remote service.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Explicit TAP base URL selected for this workflow; use this or service. | |
| service | No | Known Starfetch TAP service preset selected for this workflow; use this or url. | |
| jobIdOrUrl | Yes | TAP async job id or absolute job URL. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description only restates the deletion concept. It does not explain whether the job is cancelled if running, whether deletion is permanent, or what happens on repeated deletion attempts, so it adds no behavior beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with the verb 'Delete' front-loaded and no wasted words. It is concise, though it largely repeats the title and could have used the space to include behavioral or usage context.
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?
The schema fully covers parameters and annotations cover the destructive profile, so basic invocation is sufficiently supported. However, the description is thin on when to use the tool and what deletion actually entails, leaving the agent to infer important selection context from the tool name and sibling names 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?
The input schema fully documents all three parameters, including the url/service alternatives and jobIdOrUrl format, with 100% coverage. The description adds no parameter-level detail, so the baseline of 3 is 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?
The description uses a specific verb, 'Delete', names the exact resource, 'TAP async job', and notes the remote scope. This clearly differentiates it from sibling tools that submit, query, wait, or fetch jobs.
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 gives no explicit guidance on when to use deletion versus alternatives like job_status, job_wait, or job_fetch, and no preconditions are stated. The appropriate usage is only implied by the verb 'Delete'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
starfetch_tap_job_fetchFetch TAP async job resultARead-onlyIdempotent
Fetch a TAP async job result. JSON and JSONL conversion supports VOTable, CSV, and TSV rows.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Explicit TAP base URL selected for this workflow; use this or service. | |
| format | Yes | MCP result output format. | |
| service | No | Known Starfetch TAP service preset selected for this workflow; use this or url. | |
| jobIdOrUrl | Yes | TAP async job id or absolute job URL. | |
| sourceFormat | No | Actual TAP result format for async job output. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds useful behavioral context about format conversion, going beyond what annotations provide. It does not cover error behavior or whether the fetch blocks on completion, but the annotation coverage lowers the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with the primary action front-loaded. The second sentence adds a meaningful capability without unnecessary detail. Every sentence 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?
Rich input schema, output schema, and annotations cover most invocation concerns. The main gap is explicit sequencing guidance—mentioning that the job should be finished before fetching, or pointing to job_status/job_wait—but the tool is still adequately usable as described.
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 the baseline applies. The description's conversion sentence vaguely relates to format and sourceFormat, but it does not add parameter-specific meaning beyond what the schema already documents.
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 uses a specific verb and resource ('Fetch a TAP async job result') and adds a distinguishing capability: JSON/JSONL conversion from VOTable, CSV, and TSV rows. This clearly separates it from siblings like job_status, job_wait, and job_delete.
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 implies it should be used to retrieve the output of an already-submitted async TAP job, but it does not explicitly say to call it only after the job is complete, nor does it contrast with job_status or job_wait. Usage context is present but largely inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
starfetch_tap_job_statusRead TAP async job statusBRead-onlyIdempotent
Read the current phase and links for a TAP async job.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Explicit TAP base URL selected for this workflow; use this or service. | |
| service | No | Known Starfetch TAP service preset selected for this workflow; use this or url. | |
| jobIdOrUrl | Yes | TAP async job id or absolute job URL. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is known. The description adds the useful behavioral fact that it exposes the current phase and links, which clarifies what the read operation returns. No contradiction exists, and no additional side-effect or auth context is needed beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short, front-loaded sentence with no filler. Every word contributes to the tool's purpose, and it is appropriately minimal for a simple read operation.
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 the simple read-only nature, full parameter schema coverage, rich annotations, and presence of an output schema, the description is nearly complete. It lacks explicit workflow context about when to poll status versus wait or fetch results, but the sibling names partially compensate for that.
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?
The input schema already documents all three parameters with clear descriptions, and schema coverage is 100%, so the baseline is 3. The description does not add extra semantics for jobIdOrUrl, url, or service beyond what the schema provides, but it does not need to because coverage is complete.
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 specific verb ('Read'), a clear resource ('TAP async job'), and the exact information returned ('current phase and links'). It is clear and unlikely to be confused with submit/wait/fetch/delete operations, though it does not explicitly name a sibling or state how it differs from job_fetch.
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?
There is no guidance on when to use this tool versus alternatives such as starfetch_tap_job_wait, starfetch_tap_job_fetch, or starfetch_tap_job_delete. The sibling names imply a workflow, but the description does not state conditions like 'after submitting a job' or 'to check progress without fetching results'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
starfetch_tap_job_waitWait for TAP async jobARead-onlyIdempotent
Poll a TAP async job until completion, timeout, or terminal failure. This is an explicit wait and never starts a background job.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Explicit TAP base URL selected for this workflow; use this or service. | |
| backoff | No | Increase the poll interval. | |
| service | No | Known Starfetch TAP service preset selected for this workflow; use this or url. | |
| timeoutMs | No | Wait timeout in milliseconds. | |
| intervalMs | No | Poll interval in milliseconds. | |
| jobIdOrUrl | Yes | TAP async job id or absolute job URL. | |
| maxIntervalMs | No | Maximum backoff interval in milliseconds. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already signal read-only, idempotent, and non-destructive behavior. The description adds meaningful behavioral context beyond those annotations: it polls until completion/timeout/failure, is an explicit wait, and never creates a background job. No contradiction with annotations.
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 concise sentences with no filler. The core polling behavior is front-loaded, and the second sentence earns its place by ruling out the common misconception that this tool starts background work.
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 tool with an output schema, full parameter coverage, and strong safety annotations, the description covers the essential operational contract: blocking wait, exit conditions, and no job creation. The only small gap is lack of explicit guidance on when to prefer job_status over this tool, but that is not critical to correct invocation.
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 the schema already documents all 7 parameters, including jobIdOrUrl, timeoutMs, intervalMs, and backoff. The description does not add parameter-level detail, but it is not required because coverage is complete; 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: 'Poll a TAP async job' until three explicit terminal conditions. The sentence also differentiates from the submit sibling by asserting it 'never starts a background job', so an agent can place it among the sibling tools.
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?
Provides clear context: use this when you need an explicit, blocking wait on an existing async job, and it explicitly says this tool is not for launching work. It does not name sibling alternatives like job_status, so it falls just short of the 'explicit when/when-not/alternatives' bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
starfetch_tap_queryRun bounded TAP queryAIdempotent
Run a small bounded synchronous TAP ADQL query after inspecting the exact table and columns. Use TOP in ADQL and/or maxrec, and treat tool errors as failures rather than empty scientific results.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Explicit TAP base URL selected for this workflow; use this or service. | |
| query | Yes | Exact metadata-backed ADQL query text. Use TOP for a query-level bound; do not use LIMIT. | |
| runId | No | Optional TAP RUNID request value. | |
| format | Yes | MCP result output format. | |
| maxrec | No | TAP MAXREC row limit. Defaults to 100 when omitted. | |
| service | No | Known Starfetch TAP service preset selected for this workflow; use this or url. | |
| uploads | No | TAP uploads forwarded to the service; local file paths are not supported. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds useful behavioral context beyond annotations by stating the query is synchronous and by explicitly warning that tool errors should be treated as failures rather than empty scientific results. This helps the agent avoid misinterpreting an error as a legitimate empty result.
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 only two sentences and every clause earns its place. It front-loads the core action and scope, then gives the two most important execution rules: boundedness via TOP/maxrec and error interpretation. There is no filler or redundancy.
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 the rich input schema, presence of an output schema, and annotations, the description covers the key operational guidance: query scope, boundedness, prior inspection of tables/columns, and error handling. It does not explicitly mention the async job submission alternative for larger queries, but 'small bounded synchronous' sufficiently implies that boundary in most cases.
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 the schema already explains every parameter in detail. The description reinforces the query parameter guidance with 'Use TOP in ADQL and/or maxrec,' but this largely repeats what the schema already states. It adds little new parameter-level meaning 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?
The description opens with a specific verb and resource: 'Run a small bounded synchronous TAP ADQL query.' It clearly distinguishes this tool from sibling starfetch_tap_submit_job by emphasizing 'synchronous' and 'small bounded', and it also signals the correct workflow by saying 'after inspecting the exact table and columns.' This is a precise, non-tautological purpose statement.
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 gives clear usage context: use this tool for small, bounded, synchronous queries after verifying table and column names, and use TOP/maxrec to keep the query bounded. It does not explicitly name the async alternative starfetch_tap_submit_job or state when not to use this tool, so it misses the highest level of guidance, but the implied workflow is still clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
starfetch_tap_submit_jobSubmit TAP async jobA
Submit metadata-backed bounded ADQL as an explicit TAP async job when synchronous querying is insufficient. Preserve the exact query and use starfetch_tap_query for small work.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Explicit TAP base URL selected for this workflow; use this or service. | |
| query | Yes | Exact metadata-backed ADQL query text. Use TOP for a query-level bound; do not use LIMIT. | |
| runId | No | Optional TAP RUNID request value. | |
| maxrec | No | TAP MAXREC row limit. Defaults to 100 when omitted. | |
| service | No | Known Starfetch TAP service preset selected for this workflow; use this or url. | |
| uploads | No | TAP uploads forwarded to the service; local file paths are not supported. | |
| requestFormat | No | TAP RESPONSEFORMAT request value for the async job result. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotence, and destructive hints, and the description adds useful behavioral context: the job is asynchronous, the exact query text is preserved, and the ADQL should be bounded. It does not contradict the annotations and respects the open-world hint.
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 compact sentences with the core purpose and trigger condition front-loaded, followed by a necessary preservation warning. There is no redundant repetition of schema details.
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?
The description, rich schema, output schema, and sibling job tools (job_status, job_wait, job_fetch, job_delete) together cover the async job lifecycle without bloating this definition. It could explicitly mention that submission returns a job identifier for follow-up, but the output schema and sibling names make that discoverable.
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 all seven parameters are already documented, including the query guidance 'Use TOP for a query-level bound; do not use LIMIT.' The description reinforces that the query should be bounded and exact but adds little beyond what the schema provides.
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 identifies the specific action (submit), the resource (TAP async job), and the scope (metadata-backed bounded ADQL). It explicitly distinguishes this tool from starfetch_tap_query, making its role immediately recognizable.
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?
It states the trigger condition 'when synchronous querying is insufficient' and names the alternative for small work: 'use starfetch_tap_query.' This gives an agent explicit decision criteria before opening the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
starfetch_tap_tablesList TAP tablesARead-onlyIdempotent
List tables on the selected TAP service before choosing an exact table for ADQL.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Explicit TAP base URL selected for this workflow; use this or service. | |
| service | No | Known Starfetch TAP service preset selected for this workflow; use this or url. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and nondestructive hints, so the description does not need to restate safety behavior. It adds the workflow reason for listing tables, but it does not disclose additional behavioral traits such as pagination, limits, or completeness of the table list beyond what annotations and output schema already cover.
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 a single sentence that front-loads the action and outcome with no filler. It is appropriately compact for a simple list tool and includes the important workflow-stage context.
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 the output schema, rich annotations, and two optional parameters with full descriptions, the definition is functionally complete for invoking the tool. It captures the purpose and the stage in the ADQL workflow; a minor gap is not explicitly saying that exactly one of url/service should be provided, but the schema already conveys that.
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 both url and service parameters already explain that one should be used and that they are workflow-selected. The description adds no further meaning to the parameters, so it earns the baseline score for schema-covered parameters.
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?
Description uses a specific verb and resource ('List tables on the selected TAP service') and adds workflow context ('before choosing an exact table for ADQL'). This clearly distinguishes it from sibling tools like starfetch_tap_columns, though it does not explicitly name the alternative.
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 implies when to use it: before selecting an exact table for ADQL on an already-chosen TAP service. However, it does not explicitly state when not to use it or direct the agent to related tools such as starfetch_tap_columns or starfetch_tap_capabilities, leaving the guidance implied rather than fully explicit.
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.
12 tool updates
v0.1.0- First observed
starfetch_list_presets - First observed
starfetch_registry_search - First observed
starfetch_tap_availability - First observed
starfetch_tap_capabilities - First observed
starfetch_tap_columns - First observed
starfetch_tap_job_delete - First observed
starfetch_tap_job_fetch - First observed
starfetch_tap_job_status - First observed
starfetch_tap_job_wait - First observed
starfetch_tap_query - First observed
starfetch_tap_submit_job - First observed
starfetch_tap_tables
TDQS
Scored across 12 tools
Each tool targets a distinct TAP workflow step—service discovery, metadata inspection, synchronous query, or async job lifecycle—and the descriptions clearly separate near-neighbors like availability vs capabilities and query vs submit_job. No two tools appear interchangeable.
All tools share a consistent starfetch_ prefix and snake_case style, but the suffix pattern is mixed: list_presets and submit_job use verb-noun order, registry_search and job_wait/fetch/delete use noun-verb order, and availability/capabilities/tables/columns are bare nouns. The grouping is readable, but verb placement is not uniform.
Twelve tools is well-scoped for a TAP client; each tool covers a necessary step from service discovery and metadata inspection through synchronous queries and async job cleanup. There is no obvious redundancy.
The tool set covers the main TAP workflow comprehensively: discovery, capabilities, tables, columns, synchronous queries, and async job lifecycle. Minor gaps such as missing explicit job abort/cancel or job listing exist, but agents can work around them using wait and delete.
Maintenance
Related MCP Connectors
Gateway between LLM agents and world data through eight tools and a bundled endpoint catalog.
Reproducible benchmarks and reliability evidence for agent tools.
List datasets, schemas, run APL queries, and use prompts for exploration, anomalies, and monitoring.
Search, inspect, recommend, and explain rated AI tools through Agent Radar.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides unified natural language access to 40+ astronomical databases and surveys including DESI, SIMBAD, SDSS, and Gaia, enabling researchers to search, retrieve, and analyze astronomical data without learning complex APIs.6-
- AlicenseNot gradedqualityDmaintenanceMCP server that provides tools to query 17+ astronomical databases (e.g., SIMBAD, VizieR, Gaia) via HTTP/TAP APIs, enabling AI applications to access astronomical data through natural language.132BSD 3-Clause
- AlicenseNot gradedqualityCmaintenanceEnables querying NASA Exoplanet Archive data using ADQL TAP, planet search, composite parameters, Kepler candidates, and microlensing events.19MIT
- AlicenseNot gradedqualityCmaintenanceEnables querying the SIMBAD astronomical database for object resolution, script execution, ADQL TAP queries, and cone searches using natural language.14MIT