Skip to main content
Glama
K4L-EL

pyon-mcp

by K4L-EL

pyon-mcp

MCP (Model Context Protocol) server for the Pyon trading platform. It lets AI agents - Claude Code, Claude Desktop, Codex, or any MCP client - drive Pyon end to end: search markets, generate research, build and edit node-graph strategies with AI, run backtests, diagnose problems, and optimize parameters with 2-D sweeps.

Runs over stdio, talks to api.pyon.io, and needs only Node 18+.

Getting an API key

  1. Sign in at app.pyon.io.

  2. Open Account > API Access.

  3. Create a personal access token. It looks like pyk_....

Set it as the PYON_API_KEY environment variable wherever the server runs.

Variable

Required

Default

Purpose

PYON_API_KEY

yes

-

Personal access token (pyk_...)

PYON_API_URL

no

https://api.pyon.io

API base URL override

Related MCP server: OpenFinClaw CLI

Setup

Claude Code

claude mcp add pyon -e PYON_API_KEY=pyk_... -- npx -y pyon-mcp

Or, from a local checkout:

npm install && npm run build
claude mcp add pyon -e PYON_API_KEY=pyk_... -- node /path/to/pyon-mcp/dist/index.js

Claude Desktop

Add to claude_desktop_config.json (Settings > Developer > Edit Config):

{
  "mcpServers": {
    "pyon": {
      "command": "npx",
      "args": ["-y", "pyon-mcp"],
      "env": {
        "PYON_API_KEY": "pyk_..."
      }
    }
  }
}

Codex

Add to ~/.codex/config.toml:

[mcp_servers.pyon]
command = "npx"
args = ["-y", "pyon-mcp"]
env = { PYON_API_KEY = "pyk_..." }

Start here: get_capabilities

Pyon turns a strategy description into a node graph literally. An indicator name the engine does not know, or a threshold outside an indicator's range, produces a strategy that backtests to zero trades and looks broken for no visible reason - an RSI > 120 entry can never fire, because RSI is bounded 0-100.

So call get_capabilities before writing any strategy description, edit instruction, or sweep bound. It returns the real catalog: 61 market indicators with their value ranges and indicatorParams, 9 portfolio indicators, 8 operators, 8 trigger types, 13 action types, the 5 supported timeframes, the 3 quantityType modes, 7 option strategyType values, and the 47 tradable tickers.

The catalog is fetched from GET /api/capabilities and falls back to a copy bundled with this server if that endpoint is unavailable. Every response names which source it used. The same catalog is readable as markdown in the pyon://capabilities resource.

Tools

Every input schema is strict: an unknown or misspelled parameter (timeFrame, start_date, limit) is rejected with an explicit error rather than silently ignored. Every rejection message states what IS allowed.

Tool

Parameter

Type

Allowed values

Default

get_capabilities

section

enum, optional

indicators, portfolio_indicators, operators, triggers, actions, timeframes, tickers, all

all

search_symbols

query

string, required

1-100 chars; ticker or name fragment

-

list_strategies

-

-

no parameters

-

get_strategy

strategyId

string, required

UUID from list_strategies or create_strategy

-

create_strategy

description

string, required

at least 10 chars after trimming, max 8000

-

analysisId

string, optional

UUID from create_research or list_research

none

edit_strategy

strategyId

string, required

UUID

-

instruction

string, required

at least 10 chars after trimming, max 8000

-

run_backtest

strategyId

string, required

UUID

-

startDate

string, optional

YYYY-MM-DD, real calendar date, not in the future

365 days ago

endDate

string, optional

YYYY-MM-DD, not in the future, after startDate, at least 7 days from it

today

timeframe

enum, optional

1m, 5m, 15m, 1h, 1d (lowercase)

the strategy's native timeframe

initialCapital

number, optional

100 to 100000000

50000

diagnose_strategy

strategyId

string, required

UUID

-

question

string, optional

at least 10 chars when given, max 2000

general health check

optimize_strategy

strategyId

string, required

UUID

-

xNodeId

string, required

a node id from get_strategy

-

xField

string, required

a numeric config key on that node

-

xMin / xMax

number, required

finite; xMax strictly greater than xMin

-

yNodeId

string, required

a node id from get_strategy; may equal xNodeId

-

yField

string, required

a numeric config key; the two axes must not be the same node and field

-

yMin / yMax

number, required

finite; yMax strictly greater than yMin

-

steps

integer, optional

3 to 10 (runs steps x steps backtests)

5

timeframe

enum, optional

1m, 5m, 15m, 1h, 1d

server's choice

create_research

prompt

string, required

at least 10 chars after trimming, max 8000

-

get_research

analysisId

string, required

UUID from create_research or list_research

-

list_research

-

-

no parameters

-

get_job_status

jobId

string, required

non-empty; a job id or a backtest id from a timeout message

-

What each tool does

Tool

Summary

Wait

get_capabilities

The indicator / operator / action / ticker catalog, with API fetch and bundled fallback

none

search_symbols

Resolve tickers and names against Pyon's market database

none

list_strategies

Saved strategies with id, name, nodeCount, updatedAt

none

get_strategy

Per-node id, type, label, and flattened config (feeds optimize_strategy)

none

create_strategy

AI-build a new strategy, optionally grounded in research

up to 300s

edit_strategy

AI-edit a strategy; returns a before/after verification verdict

up to 300s

run_backtest

Metrics plus verbatim diagnostics; flags 0-trade causes and short daily windows

up to 180s

diagnose_strategy

AI debugger with sample-backtest evidence; message, issues, suggested fix

up to 300s

optimize_strategy

2-D parameter sweep; best cell, current cell, sharpe grid

up to 600s

create_research

Generate a saved research report; returns analysisId plus executive summary

up to 300s

get_research

Fetch a saved report: score, view, truncated narratives

none

list_research

List saved research reports

none

get_job_status

Escape hatch when a wait timed out; also accepts backtest ids

none

Validation rules worth knowing

  • Ids are UUIDs. A strategy name will be rejected; the message points at list_strategies.

  • Dates are YYYY-MM-DD real calendar dates, never in the future. 2025-02-30, 2024-1-5, 01/02/2024 and full timestamps are all rejected.

  • Backtest windows need endDate after startDate and at least 7 days between them. A 1d strategy tested over fewer than 300 days still runs, but the result carries a warning explaining that the window, not the strategy, may be what the metrics are measuring.

  • Timeframes are exactly 1m, 5m, 15m, 1h, 1d. 1D, daily, 1w and 30m are rejected - these are the five bar sizes the engine resolves.

  • Sweep axes must describe a real range (xMax > xMin, yMax > yMin) and must not point at the same node id and config field, which would test one dimension twice.

  • Prompts for create_strategy, edit_strategy, create_research and the optional diagnose_strategy question need at least 10 characters, because a vague prompt produces a vague strategy.

Resources

URI

Contents

pyon://getting-started

Auth setup, the typical agent workflow, enforced input rules, plan limits

pyon://capabilities

The full capability catalog as readable markdown

Errors you may see

  • 401 - invalid or revoked API key. Create a new one in Account > API Access at app.pyon.io.

  • 402 - a plan limit was hit; the message explains which. Upgrade at app.pyon.io/app/account/billing.

  • Timeouts - long AI jobs keep running server-side; the timeout message includes the job id to check with get_job_status.

  • Invalid arguments - the message names the parameter and the allowed values. Fix and retry; these never reach the API.

Development

npm install
npm run build   # tsc -> dist/
npm run smoke   # offline, keyless: tools/list, JSON Schema completeness, and the validation tables
npm run check   # build + smoke

The compiler runs at the strictest settings the code satisfies: strict, noUncheckedIndexedAccess, exactOptionalPropertyTypes, verbatimModuleSyntax, isolatedModules, noImplicitOverride, noImplicitReturns, noFallthroughCasesInSwitch, noUnusedLocals, noUnusedParameters, allowUnreachableCode: false and allowUnusedLabels: false. noPropertyAccessFromIndexSignature is deliberately left off: it only forces process.env["PYON_API_KEY"] bracket syntax and catches nothing here. Wire payloads are read through the case-insensitive helpers in src/format.ts, which return unknown, so every tool has to narrow a value before putting it in one of the interfaces in src/types.ts - a backend field rename surfaces as a compile error rather than a missing JSON key.

scripts/smoke.mjs runs entirely offline. It asserts the 13 tools and 2 resources are registered, that every published JSON Schema names its parameters and sets additionalProperties: false, and it drives every tool's zod schema with a table of bad inputs that must be rejected and good inputs that must parse. It exits non-zero on any failure.

Available Tools

13 tools
create_researchCreate research reportA

Generate a saved AI research report (thesis, risks, catalysts, scored overall view) for a company or asset from a natural-language prompt, waiting up to 300s. Use this when the user wants fundamental or thematic research, or as the first step before building a research-grounded strategy. Parameters: prompt (string, 10 to 8000 characters, required) - what to research and from which angle, e.g. 'deep dive on NVDA: AI capex cycle, risks, and valuation'. Resolve tickers with search_symbols first. Returns analysisId, title, symbol, overallScore, overallView, and a truncated executive summary. Pass the returned analysisId to create_strategy to build a strategy grounded in this research. If the wait times out, the error includes a jobId to check with get_job_status.

ParametersJSON Schema
NameRequiredDescriptionDefault
promptYesWhat to research - at least 10 characters, e.g. 'deep dive on NVDA: AI capex cycle, risks, and valuation'.

TDQS

A4.5/5.0
Behavior4/5

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

The description discloses that it waits up to 300s, may time out, and returns a jobId in error for checking status. It also mentions the action is saving a report (creating a resource), but lacks explicit statements about mutation or side effects. However, with no annotations provided, the description carries the burden and does a good job by noting the wait and jobId behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph but richly detailed, front-loaded with the core purpose. It is somewhat long, but every sentence adds value, covering usage, parameters, return values, and follow-up actions. Could be slightly more structured (e.g., bullets) but still efficient and well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has one param, no output schema, and no annotations, so the description must cover return values and error behavior. It does: returns analysisId, title, symbol, overallScore, overallView, and truncated summary, plus timeout behavior and jobId. It also guides next steps (create_strategy). Missing some details like exact error format but sufficient for a single-param tool.

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

Parameters4/5

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

Schema coverage is 100% (single prompt parameter fully described with min/max and example). The description adds semantics by explaining what the prompt should contain ('what to research and from which angle') and gives an example, plus guidance to resolve tickers with search_symbols. This adds value beyond the schema's basic min/max.

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

Purpose5/5

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

The description clearly states 'Generate a saved AI research report' with specific elements (thesis, risks, catalysts, scored overall view) and for 'a company or asset from a natural-language prompt'. It distinguishes from siblings by mentioning 'saved' (vs get_research/list_research) and as a first step before building a strategy, referencing create_strategy.

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

Usage Guidelines5/5

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

Explicit when to use: 'when the user wants fundamental or thematic research, or as the first step before building a research-grounded strategy' and mentions resolving tickers with search_symbols first. Also provides alternative: pass analysisId to create_strategy, and mentions get_job_status for timeout. Clear exclusions and alternatives.

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

create_strategyCreate strategy (AI build)A

Build a brand new trading strategy from a natural-language description using Pyon's AI builder, waiting up to 300s for the build to finish. Use this when the user wants a new strategy; pass analysisId to ground the build in a saved research report from create_research. Parameters: description (string, 10 to 8000 characters, required) - name the instrument, entry rule, exit rule and position size; analysisId (UUID, optional) from create_research or list_research. Call get_capabilities FIRST so the indicator names, operators, action types and tickers you write into the description are ones the engine supports, and so thresholds stay inside each indicator's range (an RSI entry above 100 can never fire). Returns the new strategyId, name, a summary of what was built, and a nextSteps hint. Always evaluate the result with run_backtest before editing or optimizing. If the wait times out, the error includes a jobId for get_job_status.

ParametersJSON Schema
NameRequiredDescriptionDefault
analysisIdNoOptional research report UUID from create_research or list_research; grounds the build in that research.
descriptionYesWhat to build, in plain language - at least 10 characters. Name the instrument, entry rule, exit rule and position size, e.g. 'RSI mean reversion on AAPL: buy when RSI(14) crosses below 30, sell when RSI crosses above 55, 25% of cash per entry'. Call get_capabilities first so you use real indicator names and in-range thresholds.

TDQS

A5/5.0
Behavior5/5

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

With no annotations, the description carries full burden and does so thoroughly: explains 300s wait/timeout behavior, return fields, error handling with jobId, and constraints on indicator thresholds. It also advises to run backtest before optimization, disclosing the expected workflow.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence adds value: purpose, usage, parameters, prerequisites, return value, next steps, and timeout handling are all covered without redundancy. Front-loaded with the primary action and structured logically.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a moderately complex tool with async behavior and dependencies, the description covers all essential aspects: what it does, when to use, prerequisites, parameters, return value, timeout handling, and follow-up actions. No significant gaps remain.

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

Parameters5/5

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

Even though schema coverage is 100%, the description adds crucial semantic value: it explains what to include in the description parameter (instrument, entry/exit rules, position size), provides an example, and clarifies analysisId source. This goes beyond the schema's basic definitions.

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

Purpose5/5

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

The description clearly states it builds a brand new trading strategy from natural language, using a specific verb (build), resource (trading strategy), and method (AI builder). This distinguishes it from siblings like list_strategies or edit_strategy.

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

Usage Guidelines5/5

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

Explicitly says 'Use this when the user wants a new strategy' and provides concrete prerequisites (call get_capabilities first) and post-actions (evaluate with run_backtest). It also mentions optional grounding via analysisId, giving clear context for when to use this versus alternatives.

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

diagnose_strategyDiagnose strategy (AI debugger)A

Ask Pyon's AI debugger to analyze a strategy, running a fresh sample backtest as evidence; waits up to 300s. Use this when run_backtest shows zero trades, poor returns, or confusing diagnostics and you need a causal explanation before editing. Parameters: strategyId (UUID, required); question (string, 10 to 2000 characters, optional) - ask something specific such as 'why did this take zero trades in 2025?', or omit it entirely for a general health check. Returns a diagnosis message, a structured list of up to 10 issues, and, when available, a ready-to-use edit request (agentRequest) that can be passed directly to edit_strategy as the instruction. If the wait times out, the error includes a jobId to check with get_job_status.

ParametersJSON Schema
NameRequiredDescriptionDefault
questionNoOptional specific question, at least 10 characters, e.g. 'why did this take zero trades in 2025?'. Omit it entirely for a general health check.
strategyIdYesStrategy UUID. Find it with list_strategies (it is also returned by create_strategy). Not a strategy name.

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description fully discloses behavior: it runs a fresh backtest, waits up to 300s, returns a diagnosis, up to 10 issues, and an optional agentRequest. It also explains timeout error handling with jobId, which is crucial for an async-like operation. This is thorough and honest.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact yet dense: first sentence states purpose and core behavior, second gives usage context, third details parameters, fourth explains return value, fifth explains timeout. Every sentence serves a distinct purpose, and it is organized logically.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema and no annotations, the description covers the key aspects: what it does, when to use, parameters, return structure, timeout behavior, and how to use the result with edit_strategy. It also references sibling tools for finding strategyId. This is complete for a diagnostic tool.

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

Parameters4/5

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

Schema coverage is 100% giving baseline 3, but the description adds valuable context: it explains the question is optional and gives an example, and clarifies that omitting it yields a general health check. It also reiterates the required nature of strategyId, adding practical usage nuance beyond the schema.

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

Purpose5/5

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

The description clearly states the tool 'analyze a strategy, running a fresh sample backtest as evidence' and distinguishes it from siblings like run_backtest by focusing on causal diagnosis. It explicitly mentions producing an edit request for edit_strategy, making its role unique.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance: 'Use this when run_backtest shows zero trades, poor returns, or confusing diagnostics...'. It also provides a fallback for timeout via get_job_status, and implies not to use it if you only need a backtest. This is clear and actionable.

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

edit_strategyEdit strategy (AI edit)A

Modify an existing strategy with a natural-language instruction using Pyon's AI editor, waiting up to 300s. Use this to change entry/exit logic, thresholds, position sizing, symbols, or to fix issues found by diagnose_strategy. Parameters: strategyId (UUID, required; from list_strategies); instruction (string, 10 to 8000 characters, required) stating exactly what to change and to what - diagnose_strategy's agentRequest can be pasted here verbatim. Use get_capabilities to check indicator names and ranges before writing the instruction. Returns a verification verdict comparing a sample backtest before and after the edit, with before/after trade counts and return percentages, plus revertToVersion for undoing a bad edit. Verdict values: improved (better), unchanged (no measurable change), degraded (worse), broke (errored or stopped trading - revert), still_zero (zero trades before and after - root cause not fixed). If the wait times out, the error includes a jobId to check with get_job_status.

ParametersJSON Schema
NameRequiredDescriptionDefault
strategyIdYesStrategy UUID. Find it with list_strategies (it is also returned by create_strategy). Not a strategy name.
instructionYesThe change to make, in plain language - at least 10 characters, e.g. 'loosen the RSI entry threshold from 30 to 35 and add a 5% trailing stop loss'. diagnose_strategy's agentRequest can be pasted here verbatim.

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations provided, the description fully discloses behavior: the 300s wait, the verification verdict comparing backtests, return fields including revertToVersion, verdict meanings, and timeout/error handling with jobId. This goes far beyond what annotations would typically provide and gives the agent a comprehensive understanding of side effects and failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph but every sentence earns its place: purpose, parameter guidance, usage tips, return value explanation, verdict definitions, and timeout behavior. It is front-loaded with the core action and progressively details, which is appropriate given the complexity of the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must explain return values, and it does thoroughly: a verification verdict with before/after trade counts and return percentages, plus revertToVersion. It also covers all verdict values and the timeout scenario with jobId. For a 2-parameter tool with no annotations, this is complete.

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

Parameters4/5

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

The schema already covers both parameters fully (100% coverage), so the baseline is 3. The description adds extra value by clarifying where to get strategyId (from list_strategies), suggesting that diagnose_strategy's agentRequest can be pasted verbatim into instruction, and advising to use get_capabilities for valid indicator names. This enrichment pushes it above baseline.

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

Purpose5/5

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

The description opens with 'Modify an existing strategy with a natural-language instruction using Pyon's AI editor', which is a specific verb+resource pairing. It further lists exact modification targets (entry/exit logic, thresholds, position sizing, symbols) and explicitly ties to fixing issues from diagnose_strategy, clearly distinguishing it from sibling tools like create_strategy or run_backtest.

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

Usage Guidelines4/5

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

The description states when to use the tool ('Use this to change...') and references sibling tools for complementary actions ('Use get_capabilities to check indicator names', 'check with get_job_status'). It does not explicitly list when NOT to use it, but the context is clear enough to guide selection among siblings.

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

get_capabilitiesGet strategy capability catalogA

Return the catalog of everything Pyon's strategy engine understands: market indicators (with their value ranges and indicatorParams), portfolio indicators, comparison operators, trigger types, action types, backtest timeframes, order sizing modes, option strategy types, and the tradable ticker universe. CALL THIS BEFORE writing a create_strategy description, an edit_strategy instruction, or choosing optimize_strategy sweep bounds. Strategy text is turned into a node graph literally, so an indicator name the engine does not know, or a threshold outside an indicator's range, silently produces a strategy that backtests to zero trades and looks broken for no visible reason - RSI, STOCH_K, STOCH_D, ADX and MFI are bounded 0-100, so an RSI threshold above 100 can never fire; WILLR is -100 to 0 (oversold is about -80, not +20); BB is %B on a 0-100 scale, not a price. Parameters: section (optional, one of: indicators, portfolio_indicators, operators, triggers, actions, timeframes, tickers, all; default "all"). Timeframes are always 1m, 5m, 15m, 1h, 1d. The catalog is fetched from the Pyon API and falls back to a copy bundled with this server if the endpoint is unavailable; the response always names which source was used. Results are cached for the session, so calling it repeatedly is cheap.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionNoWhich slice of the catalog to return: indicators, portfolio_indicators, operators, triggers, actions, timeframes, tickers, all. Defaults to "all" (the whole catalog).all

TDQS

A4.8/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden. It discloses silent failure modes, specific indicator ranges (RSI 0-100, WILLR -100 to 0), the literal node-graph interpretation, fallback to a bundled copy, and session caching—far beyond what annotations would typically convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long (~200 words) but dense with essential operational details and organized purpose-first. The parameter listing is slightly redundant with the schema, but every sentence provides critical guidance, so the length is justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter catalog tool with no output schema and no annotations, the description is exceptionally complete. It covers return contents, error prone scenarios, parameter semantics, source fallback, caching, and fixed timeframes, leaving little ambiguity about tool behavior.

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

Parameters4/5

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

The schema already documents the single `section` parameter with 100% coverage, so the baseline is 3. The description adds extra context by explaining what each section contains and clarifying that timeframes are always 1m/5m/15m/1h/1d, going slightly beyond the schema.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Return the catalog of everything Pyon's strategy engine understands' and enumerates all catalog sections (indicators, operators, triggers, actions, timeframes, tickers, etc.), clearly distinguishing it from sibling tools like create_strategy or search_symbols.

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

Usage Guidelines5/5

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

Explicit usage guidance is provided: 'CALL THIS BEFORE writing a create_strategy description, an edit_strategy instruction, or choosing optimize_strategy sweep bounds.' It also explains the consequence of not doing so (silently producing a broken strategy), which is actionable and clear.

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

get_job_statusGet job statusA

Check a Pyon async job directly - the escape hatch when a waiting tool timed out. create_strategy, edit_strategy, diagnose_strategy, optimize_strategy, and create_research keep running server-side after a client timeout, and their timeout errors include the jobId to pass here; run_backtest timeouts name a backtest id, which this tool also accepts (it falls back to the backtest endpoint when the id is not a job). Parameters: jobId (non-empty string, required) - copy it verbatim from the timeout error message; job ids stay resolvable indefinitely, so a not-found error means the id is wrong, not expired. Returns the job status plus, when completed, a compact view of the result, or the error message when failed. Call it again after a short wait if the job is still running.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYesJob id copied from a timeout error message. A backtest id from a run_backtest timeout is also accepted.

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and does so thoroughly. It discloses job id persistence ('stay resolvable indefinitely'), error semantics ('not-found error means the id is wrong'), return behavior (status, compact result, or error message), and advises retry after a wait if still running—all beyond basic 'get status'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph, but every sentence earns its place—no fluff. It is front-loaded with the core purpose and then systematically covers usage, parameters, and behavior. Slightly long for a single-tool description, but well structured and informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Contextually complete: one parameter, no output schema, and no annotations. The description covers what the tool does, when to use it, parameter semantics, return values, error cases, and retry behavior. There is nothing meaningful missing for an agent to select and invoke it correctly.

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

Parameters5/5

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

Although schema coverage is 100%, the description enriches the parameter meaning significantly: 'copy it verbatim from the timeout error message', the indefinite resolvability, and the backtest-id fallback. This goes well beyond the schema's simple text, making the parameter's intent and usage crystal clear.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Check a Pyon async job directly.' It explicitly distinguishes it from siblings by positioning it as the 'escape hatch when a waiting tool timed out' and explains which tools it applies to, making the purpose unambiguous.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: 'use when a waiting tool timed out' and enumerates the tools whose jobs can be checked. It also clarifies the run_backtest backtest-id fallback, providing clear context for when this tool is appropriate versus alternatives.

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

get_researchGet research reportA

Fetch a saved research report by analysisId. Use this to re-read research created earlier (find ids with list_research) before building or editing strategies based on it. Parameters: analysisId (UUID, required; from create_research or list_research). Returns title, symbol, overall score and view, and truncated narrative sections: executive summary, thesis, risks, catalysts, and conclusion. Full layouts and raw data are never dumped.

ParametersJSON Schema
NameRequiredDescriptionDefault
analysisIdYesResearch report UUID from create_research or list_research.

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It usefully warns that narrative sections are truncated and that full layouts and raw data are never dumped, which are key behavioral traits. It doesn't explicitly state read-only status, but as a fetch operation this is largely implied; the added truncation warning adds significant value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the primary action, then usage context, then parameter and return information. Every sentence earns its place, and there is no waste or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (one parameter, no nested objects, no output schema). The description adequately explains return structure (title, symbol, score, view, truncated narrative sections) and key limitations, providing all essential context for an agent to use it correctly. No output schema means the description appropriately covers return values.

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

Parameters3/5

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

The schema already documents analysisId as a UUID with the same origin hint (from create_research or list_research), providing 100% coverage. The description restates this information without adding new semantics, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('Fetch') and resource ('saved research report by analysisId'), clearly distinguishing it from siblings like list_research (which lists reports) and get_strategy (which gets strategies). It explicitly identifies the key parameter and the operation's scope.

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

Usage Guidelines5/5

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

The description explicitly states when to use the tool: 'to re-read research created earlier' and 'before building or editing strategies'. It also names the alternative tool (list_research) for finding IDs, providing clear context and an alternative without ambiguity.

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

get_strategyGet strategy detailA

Fetch a single strategy's structure: name, description, native timeframe, and a per-node summary with each node's id, type, label, and flattened numeric/string config values. Use this before optimize_strategy - the node ids and config field names shown here are exactly what optimize_strategy needs as xNodeId/xField and yNodeId/yField - or to understand what a strategy actually does before editing it. Parameters: strategyId (UUID, required; find it with list_strategies). Returns compact JSON; the raw graph is never dumped.

ParametersJSON Schema
NameRequiredDescriptionDefault
strategyIdYesStrategy UUID. Find it with list_strategies (it is also returned by create_strategy). Not a strategy name.

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It discloses the return format ('compact JSON') and an important negative behavior ('the raw graph is never dumped'), which helps set expectations. It stops short of stating read-only semantics or error conditions, but for a fetch operation this is reasonable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tightly written: one sentence for purpose, one for usage context, one for parameters/return format. It front-loads the core action and every clause adds value, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter fetch tool with no output schema, the description fully covers what is returned, where to get the ID, and how it connects to optimize_strategy. It is sufficient for an agent to correctly select and invoke the tool.

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

Parameters3/5

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

Schema coverage is 100% and the schema already explains the parameter ('Strategy UUID. Find it with list_strategies... Not a strategy name.'). The description adds only 'find it with list_strategies', which overlaps with schema text. No new meaning is added beyond the schema, 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.

Purpose5/5

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

The description clearly states 'Fetch a single strategy's structure' and enumerates the specific contents (name, description, native timeframe, per-node summary), using a specific verb and resource. It also distinguishes from siblings by naming optimize_strategy as the downstream consumer and list_strategies for finding IDs.

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

Usage Guidelines5/5

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

Explicitly warns 'Use this before optimize_strategy' and explains the exact relationship between node IDs/config field names and the xNodeId/xField parameters. It also mentions 'or to understand what a strategy actually does before editing it', providing clear when-to-use context and implicitly distinguishing from list_strategies.

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

list_researchList research reportsA

List the user's saved research reports. Use this to find an analysisId for get_research or to check whether relevant research already exists before generating a new report with create_research. Parameters: none - the arguments object may be empty or omitted entirely. Returns a compact list of up to 25 reports with analysisId, title, symbol, and timestamps where available.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses the return format ('compact list of up to 25 reports with analysisId, title, symbol, and timestamps') and parameter expectations ('arguments object may be empty or omitted'). However, it does not explicitly state the operation has no side effects (read-only), though 'List' strongly implies it. A explicit note would push this to 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences plus a parameter note, front-loaded with the core action and resource. Every phrase provides actionable information (purpose, usage, return details) with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless tool with no output schema, the description sufficiently covers return values (fields and limit), use cases, and relationship to sibling tools. It addresses all critical aspects an agent needs to invoke and interpret results correctly.

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

Parameters5/5

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

The schema has zero properties, so baseline is 4. The description adds valuable invocation guidance: 'Parameters: none - the arguments object may be empty or omitted entirely.' This clarifies that the agent can omit the arguments object altogether, which is not evident from the schema alone. Explicitly handling the absence of parameters earns a 5.

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

Purpose5/5

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

The description clearly specifies the action ('List') and the resource ('the user's saved research reports'), distinguishing it from siblings like list_strategies (strategies) and get_research (specific report retrieval). The phrase 'saved research reports' unambiguously identifies the scope.

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

Usage Guidelines5/5

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

Explicitly states when to use: 'to find an analysisId for get_research' and 'to check whether relevant research already exists before generating a new report with create_research'. This names sibling tools and provides concrete decision context, fully satisfying the dimension.

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

list_strategiesList strategiesA

List the user's saved trading strategies on Pyon. Use this to find an existing strategy's id before calling get_strategy, run_backtest, edit_strategy, diagnose_strategy, or optimize_strategy, or to check what already exists before building something new with create_strategy. Parameters: none - the arguments object may be empty or omitted entirely. Returns id (UUID), name, nodeCount, and updatedAt for up to 100 strategies; call get_strategy for the native timeframe and node-level detail.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses the return fields (id, name, nodeCount, updatedAt), the limit of 100 strategies, and points to get_strategy for more detail. It does not mention behavior beyond the 100 limit (e.g., ordering), but this is a simple read/list operation and the disclosure is strong enough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences: the first states the purpose, the second gives usage guidance, the third covers parameters and return values. All information is essential, front-loaded, and free of fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with no mandatory parameters, the description is complete. It explains what it returns, how many results, and when to use a different tool for more detail. No output schema exists, but the description fully compensates.

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

Parameters4/5

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

The schema has zero parameters, and the description explicitly states 'Parameters: none - the arguments object may be empty or omitted entirely.' This goes beyond the schema by confirming the parameters can be omitted entirely, which is helpful for an agent deciding how to invoke the tool.

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

Purpose5/5

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

The description uses a specific verb and resource: 'List the user's saved trading strategies on Pyon.' It clearly distinguishes from siblings by explicitly naming which tools to use it before (get_strategy, run_backtest, etc.), making the purpose unambiguous.

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

Usage Guidelines5/5

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

Provides explicit when-to-use guidance: 'Use this to find an existing strategy's id before calling...' and 'to check what already exists before building something new with create_strategy.' This clearly tells the agent when to use this tool versus alternatives.

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

optimize_strategyOptimize strategy (2-D parameter sweep)A

Run a 2-D parameter sweep over two numeric config fields of a strategy's nodes, backtesting a steps x steps grid of value combinations; waits up to 600s. Use this after a strategy already trades sensibly (verify with run_backtest) to tune thresholds, periods, or sizes. Call get_strategy FIRST to obtain the exact node ids and config field names, and get_capabilities to keep the bounds inside the indicator's real range (sweeping an RSI threshold from 80 to 140 wastes half the grid on cells that can never fire). Parameters: strategyId (UUID, required); xNodeId and xField, yNodeId and yField (strings from get_strategy, required) - the two axes must not be the same node id AND field; xMin/xMax and yMin/yMax (finite numbers, required) with xMax > xMin and yMax > yMin - the steps values are spaced linearly and include both endpoints (xMin 10, xMax 30, steps 5 tests 10, 15, 20, 25, 30); steps (whole number 3 to 10, default 5); timeframe: one of 1m, 5m, 15m, 1h, 1d - optional override, defaults to what the server picks. Returns the best cell (highest sharpe, preferring cells that actually traded), the strategy's current cell, the sharpe grid as compact rows of numbers (rows = y values top to bottom, columns = x values left to right), the sweep window and timeframe, and a verbatim warning when every cell produced zero trades. If the wait times out, the error includes a jobId to check with get_job_status.

ParametersJSON Schema
NameRequiredDescriptionDefault
xMaxYesHighest x value to test. Must be strictly greater than xMin.
xMinYesLowest x value to test. Must be strictly less than xMax.
yMaxYesHighest y value to test. Must be strictly greater than yMin.
yMinYesLowest y value to test. Must be strictly less than yMax.
stepsNoGrid resolution per axis; steps x steps backtests are run. Whole number 3 to 10, default 5.
xFieldYesNumeric config field on the x node, e.g. 'period' or 'threshold'.
yFieldYesNumeric config field on the y node. Must differ from xField when yNodeId equals xNodeId.
xNodeIdYesNode id whose config field varies along the x axis. Exactly as returned by get_strategy.
yNodeIdYesNode id whose config field varies along the y axis. May be the same node as xNodeId.
timeframeNoOptional bar timeframe override: one of 1m, 5m, 15m, 1h, 1d (lowercase). Defaults to what the server picks for the strategy.
strategyIdYesStrategy UUID. Find it with list_strategies (it is also returned by create_strategy). Not a strategy name.

TDQS

A5/5.0
Behavior5/5

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

With no annotations provided, the description carries full burden and excels: it discloses the 600s wait, timeout error with jobId, grid orientation, the 'preferring cells that actually traded' tie-break, and the verbatim zero-trade warning. It also explains default timeframe behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded, stating the core purpose first, then prerequisites, parameter rules, return values, and error handling. Every sentence adds operational value with no filler or repetition of schema text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter, long-running optimization tool with no output schema, this description is thorough: it covers requirements, edge cases (zero trades), result contents, timeout behavior, and related tool calls. It leaves little room for misinterpretation or missing steps.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds substantial meaning: it explains the axis constraint (must not be same node id AND field), linear endpoint-inclusive spacing with a concrete example, bounds strictness (xMax > xMin), steps range/default, and how to source node ids/fields from get_strategy. This goes well beyond the schema.

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

Purpose5/5

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

The description names the specific action ('Run a 2-D parameter sweep'), the target resource (a strategy's nodes), and the method (backtests a steps x steps grid). It clearly distinguishes this from siblings like run_backtest by framing it as a tuning tool to use after a strategy is sensible.

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

Usage Guidelines5/5

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

Explicitly states when to use ('Use this after a strategy already trades sensibly'), prereqs (call get_strategy first, get_capabilities for bounds), and even warns against nonsensical ranges. It names alternative/companion tools (run_backtest, get_strategy, get_capabilities, get_job_status) and gives concrete conditions.

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

run_backtestRun backtestA

Backtest a strategy over a historical window and wait up to 180s for it to finish. Use this after create_strategy or edit_strategy to measure real performance, and before optimize_strategy to establish a baseline. Parameters: strategyId (UUID, required); startDate and endDate (YYYY-MM-DD, optional, must be real past dates with endDate after startDate and at least 7 days between them - default is the last 365 days); timeframe: one of 1m, 5m, 15m, 1h, 1d - defaults to the strategy's native timeframe, fetched automatically; initialCapital in USD (number 100 to 100000000, default 50000). Returns metrics (totalTrades, totalOrders, totalReturnPct, sharpeRatio, maxDrawdownPct, winRate) plus up to 8 diagnostic messages verbatim - read these, they carry gate pass-rate evidence explaining WHY the strategy did or did not trade - and an explicit note when 0 trades closed but orders were opened (the strategy entered and is still holding, which is not the same as a dead strategy). A warning is added when a 1d strategy is tested over fewer than 300 days, since that is too few bars to judge it. On timeout the error names the backtest id, which get_job_status accepts as a fallback.

ParametersJSON Schema
NameRequiredDescriptionDefault
endDateNoWindow end, YYYY-MM-DD. Must be a real calendar date no later than today, after startDate, and at least 7 days from it. Defaults to today.
startDateNoWindow start, YYYY-MM-DD (2000-01-01 or later). Defaults to 365 days before endDate.
timeframeNoBar timeframe: one of 1m, 5m, 15m, 1h, 1d (lowercase). Defaults to the strategy's native timeframe, fetched automatically.
strategyIdYesStrategy UUID. Find it with list_strategies (it is also returned by create_strategy). Not a strategy name.
initialCapitalNoStarting cash for the backtest. Number between 100 and 100000000; defaults to 50000.

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden. It discloses the 180-second wait, timeout behavior, diagnostic message contents, zero-trade nuance, short-window warning, and automatic timeframe fetching—all non-obvious behavioral traits beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but logically structured: action, workflow placement, parameters, return values, diagnostics, timeout fallback. While dense, every sentence carries useful information; only a slight trimming could improve directness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description fully enumerates return metrics, diagnostic messages, edge cases like holding positions, and timeout fallback. It also accounts for all 5 parameters and their defaults, making it complete for safe invocation.

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

Parameters4/5

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

Schema coverage is 100% and each parameter already has a rich description. The description adds modest extra context like 'not a strategy name', 'fetched automatically', and the 7-day minimum gap, reinforcing but not dramatically extending schema info. This justifies a 4 above the 3 baseline.

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

Purpose5/5

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

The description opens with a specific action—'Backtest a strategy over a historical window and wait up to 180s'—clearly naming the verb and resource. It is distinguished from siblings like optimize_strategy and diagnose_strategy by focusing on strategy performance measurement over historical data.

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

Usage Guidelines5/5

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

The description explicitly states when to use the tool: 'after create_strategy or edit_strategy to measure real performance, and before optimize_strategy to establish a baseline.' It also names get_job_status as a fallback on timeout, providing clear workflow context and alternatives.

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

search_symbolsSearch symbolsA

Search Pyon's market database for tradable instruments by ticker or company name fragment. Use this first whenever you need an exact symbol to mention in a research prompt or strategy description, for example resolving 'Apple' to AAPL or checking whether Pyon covers a given asset. Parameters: query (string, 1-100 characters, required) - a ticker or name fragment. Returns up to 20 matches as compact JSON with symbol, name, exchange, and assetClass. Note that Pyon only trades a fixed universe: call get_capabilities(section='tickers') for the definitive tradable list.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesTicker or name fragment to search for, e.g. 'AAPL', 'apple', 'bitcoin'. 1-100 characters.

TDQS

A4.7/5.0
Behavior4/5

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

No annotations are provided, so the description must disclose behavioral traits. It does: it limits results to 'up to 20 matches', specifies the return structure ('compact JSON with symbol, name, exchange, and assetClass'), and notes the fixed-universe limitation. It does not mention pagination or error handling, but for a simple lookup tool this is a solid disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured: it opens with the core search capability, follows with when-to-use and an illustrative example, then parameter constraints, return format, and a key caveat. Every sentence earns its place; no redundant phrasing or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a single parameter, no output schema, and limited complexity, the description is complete. It covers the input, output format, result limit, and a critical limitation (fixed universe) with a pointer to the authoritative list. The agent can invoke this tool confidently with the expected result described well enough.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds value by providing concrete examples ('resolving Apple to AAPL', 'checking whether Pyon covers a given asset') and restating the parameter range ('1-100 characters'). This helps the agent understand the intended use beyond the schema's literal definition.

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

Purpose5/5

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

The description clearly states the tool's function: 'Search Pyon's market database for tradable instruments by ticker or company name fragment.' It uses a specific verb (search), names the resource (market database), and indicates the query type (ticker or name fragment). It also differentiates from sibling tools by positioning this as the first step for resolving symbols, for example 'resolving Apple to AAPL'.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: 'Use this first whenever you need an exact symbol to mention in a research prompt or strategy description.' It also provides a concrete alternative: 'call get_capabilities(section='tickers') for the definitive tradable list,' which clarifies when not to rely solely on this tool (fixed universe). This exceeds baseline with clear context and exclusions.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv0.2.0
    • First observedcreate_research
    • First observedcreate_strategy
    • First observeddiagnose_strategy
    • First observededit_strategy
    • First observedget_capabilities
    • First observedget_job_status
    • First observedget_research
    • First observedget_strategy
    • First observedlist_research
    • First observedlist_strategies
    • First observedoptimize_strategy
    • First observedrun_backtest
    • First observedsearch_symbols

TDQS

A4.7/5.0

Scored across 13 tools

Disambiguation5/5

Each tool targets a distinct action/resource combination: list/get/create/edit for strategies and research, plus dedicated tools for backtesting, optimizing, diagnosing, capability lookup, symbol search, and async job status. There is no overlap or ambiguity between tool purposes.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using snake_case (e.g., list_strategies, get_research, create_strategy, run_backtest). The pattern is uniform across the entire set, making it predictable and easy to navigate.

Tool Count5/5

13 tools is well within the ideal range for a domain-specific server. Each tool serves a clear purpose in the strategy management and research workflow, with no redundant or unnecessary additions.

Completeness4/5

The tool set provides strong lifecycle coverage for strategies (create, read, edit, test, optimize, diagnose) and research (create, read, list). The only notable gap is the absence of a delete/archive operation for strategies, which is a minor omission given the otherwise complete workflow.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Full-lifecycle algorithmic trading MCP server. AI strategy generation from plain English, backtesting, live bot deployment to 10+ brokers, portfolio monitoring, and prediction markets. Stocks, options, crypto, futures. 32 tools. Free tier.
    -
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that enables autonomous AI agents to connect to Tastytrade for market scanning, option strategies, account management, and optionally placing trades with built-in safety controls.
    9
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    The MCP server for AlphaForge — the agent-native quant CLI: write strategies in JSON, optimize with Optuna TPE, validate with walk-forward, export to TradingView Pine v6. This server lets your AI agent drive the whole pipeline over MCP.
    17
    1
    Apache 2.0