Skip to main content
Glama

tradefloor

determinism PyPI PyPI Downloads crates.io license: MIT OR Apache-2.0 python 3.11+

tradefloor is a market simulator you can run a strategy against. It has a Rust core and a Python API.

Give it a seed and a list of companies. It runs a market forward: prices, a limit order book, fills, and an economy that moves each day. Your orders match against the book's depth, so your trades move the price.

Real market data can't tell you what would have happened if you had traded differently, or what caused a move. tradefloor can, because it computed every price. You can fork a running market, change one thing in one branch (a rate rise, a liquidity crisis, a different agent), and measure where the two branches came apart. engine.truth() splits each move in the gap between a price and the model's fair value into twelve factors, and engine.explain(ticker, day) breaks down the move in the traded price, two records no historical dataset carries.

Documentation is at https://docs.tradefloor.dev.

Install

pip install tradefloor

There are wheels for Linux, macOS and Windows on CPython 3.11+, and no dependencies. The same engine is a Rust crate (cargo add tradefloor). Optional extras add the MCP server (tradefloor[mcp]), Arrow output (tradefloor[arrow]), the Gymnasium environment (tradefloor[rl]) and one extra per agent framework.

The API may change before 1.0. Model changes ship as new presets, so a market with no agent orders in it replays exactly on its named preset in later releases. tradefloor was called pretium until 0.5.0. Versions up to 0.4.3 still install under that name, and results recorded with them still replay.

Related MCP server: Sablier MCP Server

A first run

import tradefloor as tf

universe = tf.Universe.random(40, seed=111)

spec = tf.StrategySpec.momentum(lookback_days=1.0, top_k=5)
scores = tf.evaluate({"mine": spec}, seed=7, universe=universe, days=10)

scores["mine"].return_pct            # what it made
scores["mine"].impact_bps            # what its own footprint cost
scores["mine"].strategy_fingerprint  # sha256, cite this
scores["mine"].errors                # each step that raised or was refused
scores["mine"].sharpe                # annualised, from the daily closes
scores["mine"].time_in_market        # share of steps holding a position

That result comes from one random market, so it says as much about the seed as about the strategy. tf.rank runs many seeds and compares strategies with a paired sign test. Add tf.baselines.reference_agents() to the entrants and tf.versus_buy_and_hold(scores) reads each score against buy-and-hold on the same market.

A Python agent is any object with act(obs) that returns orders: a number of shares for a market order, tf.Limit(quantity, price) or tf.Cancel(). It sees a read-only view of the market and its own portfolio, and obs.history holds a daily bar per name. A bar's close is the day's last print. On pt-v21 the close then re-marks every name and the next session opens after an overnight move, so the next day starts away from that print: the close sits 11 bp from it at the median on a 20-name roster, and the open 25 bp from the close. docs/AGENTS.md covers what the view holds, how trades are charged, the framework adapters (OpenAI Agents SDK, PydanticAI, LangGraph, FinRobot) and how scoring works.

The demo

The examples are in this repository and not in the package, so clone it first:

git clone https://github.com/simoncoombes/tradefloor
cd tradefloor
python examples/rate-shock/counterfactual.py

It runs an agent in a controlled market, checkpoints the world and forks it, raises rates by 200 bp in one branch, and compares what the same agent does next. It prints nine checks that the two branches started identical, the step at which the agent's behavior changed, and the two branches side by side. The run takes under five seconds of CPU and needs no keys and no network. The walkthrough is Your first counterfactual experiment.

Contents

engine.truth()

why each price moved: twelve factors that sum to the mispricing's move, to 1e-16

engine.prints()

how each trade price came about: the shock, and the order book depth that absorbed it

counterfactual TCA

your trading cost, from the same seed run with your orders and without them

tf.rank

many seeds, paired sign tests

RunManifest

what a reader needs to replay a run, checked by reproduce()

World / compare

fork a running experiment, change one variable, and measure where the two came apart

scenarios

seven packaged shocks, and a file format for your own

MCP server

nineteen tools for a coding agent, thirteen of them read-only, with scenarios, any shipped preset, a shipped population of background traders, and market sessions you step, fork and rewind

more

a Gymnasium environment, Arrow output, checkpoints, SEC EDGAR data, simulated rate indices, a browser build

Drive it from an agent

pip install "tradefloor[mcp]"
claude mcp add tradefloor -- tradefloor-mcp

tradefloor-mcp speaks MCP over stdio, and tradefloor mcp starts the same server. Strategies, universes and scenarios are data, so a tool argument cannot reach code. Each result carries its own caveats. A session keeps one market in the server between calls, so an agent can place orders a step at a time, fork the market to try two actions, and rewind. See the MCP page.

Scenarios

engine = tf.Engine(seed=42, universe=universe)
engine.run_days(20)                                # a shared history first
scenario = tf.Scenario.load("liquidity_crisis")    # ships with the package

control, stress = tf.branch(engine, 2)
for day in range(80):
    scenario.apply(stress, day)
    ...                                  # run both branches

A scenario is a file of changes to the market and the assumptions behind them. Each change targets a field the engine reads, and the file keeps the shock apart from the knock-on effects you assume follow it:

tradefloor scenario show oil_price_spike

Exogenous shocks
----------------------------------------------------------
  day 50+            commodity.oil            x1.4

Assumed transmission
----------------------------------------------------------
  day 55..74 ramp    macro.inflation          +1.50pp
  day 55+            macro.corporate_yield    +0.50pp

at in a scenario counts days from the first day it is applied, so on a branch it counts from the branch. Most packaged files first fire on day 50. To fire one on the first day after a fork, use scenario.starting_at(0), or world.apply(scenario, at=0) on a World. The gaps between its events stay the same, and the run's record keeps the packaged file's fingerprint and the days each event fired.

tradefloor does not predict what a war, an election, an oil shock or a recession will do to markets. You state the assumptions and it measures how an agent behaves under them. tradefloor scenario list names the seven packaged scenarios, and tradefloor scenario targets lists every field a scenario can change.

Reproducibility

The same seed gives the same market on every platform. tradefloor ships its own exp, log, pow, sin and cos, so the system's math library cannot change a result, and each release runs a fixed simulation on five platforms and stops if any result differs.

A shipped preset never changes, so a market with no agent orders in it replays exactly on its named preset in every later release. Each release checks that with a digest per preset. A run with agent orders in it replays exactly on the same release. Across releases the promise is narrower. 0.8.5 changed how an agent's fills reach the market, on every preset, so a traded run recorded before 0.8.5 matches up to its first trade and differs after it. The default preset is pt-v21, and any earlier one can be named:

eng = tf.Engine(seed=42, universe=u, model="pt-v10")

To let a reader rerun a result, publish its RunManifest. It records the version, preset, seed, universe, macro state and scenario, and reproduce() stops on a mismatch. A manifest checks the market and carries no score. Its result block holds the market's digest, the number of days and draws_consumed. tf.evaluate and tf.rank write no manifest, so a published score has to be rerun to be checked. docs/REPRODUCIBILITY.md has the full contract, including what a saved engine state promises when it is restored, and docs/SUPPORT.md says which release to pin for a long study.

Realism

tradefloor checks its market against real ones with three named sets of statistics, listed in docs/STATISTICS.md. On pt-v21, the default from 0.10.0, all 19 statistics of the one-year table (volatility, fat tails, how much stocks move together, how far the VIX jumps after a fall) are inside the range real markets show over a year, on the ruled bands. The index's return and the share of days it falls 3% or more are read over 360 seeds, as the long-run criteria read them: the index falls 3% or more on 0.98% of days, against a range of 0.64 to 2.34. All 15 statistics of the two-year panel are inside their two-year ranges. The long-run criteria are 40 rows over 21 years, covering crash depth, how long fear lasts, bear markets per decade, the 2008 and 2020 replays, the rate indices and the cost of size in the book. pt-v21 meets all 40, read on 270 histories.

Read those claims narrowly:

  • The one-year count is a verdict on figures pooled over 30 seeds (360 for the index's return and 3% falls). One seed's year often misses some of its 14 shape statistics. On seeds 101 to 116, all 14 were in range on 8 of the 16, and one seed had 11 of 14. If you run one market per condition, read tf.envelope.intervals() for each statistic's spread across seeds.

  • A shape statistic's range is the median of 35 real one-year windows plus or minus 2.1 trimmed standard deviations, so passing one is weak evidence. Volatility clustering is one case. abs_return_acf5 reads 0.020, below every real 2015 to 2025 window (the lowest is 0.034), and it passes because its range reaches lower than those windows do.

  • The VIX is stickier than real: its day-to-day persistence reads 0.956 against the tape's 0.930, and the sign test that grades it refuses it.

  • The one-year table helped choose many of the coefficients pt-v21 keeps, so the held-out checks are the fresh seeds and the fresh set of companies the panel is repeated on.

  • One year is the certified horizon. Two years is graded on the two-year panel, and longer runs only by the long-run criteria.

  • A driven scenario moves prices at about half to four-fifths of the real size, in the right direction. Use a scenario to detect a response, and do not read its size as a forecast.

  • Volatility memory reads 0.095 at lag 1 against a real 0.107 and fades much faster after it: at lag 20 it is under a twentieth of real. Nothing below the 65-minute step is calibrated.

  • An order sliced over a day costs a median 0.13 of a daily standard deviation for 10% of a day's volume in 36 slices, at the low end of the 0.15 to 0.3 published studies find.

  • By default no other trader reacts to you, so no liquidity spiral or predatory trading can arise. Populated mode adds background traders that trade your signals and front-run predictable flow, but they charge a predictable programme about 2.4% more, far below what real markets show.

tf.envelope.check(horizon_days=...) refuses a question that falls outside a measured limit. docs/REALISM.md has every number behind these claims and the full table of limits.

Before you publish a result

  • An agent scored on naming the factor behind each day's move gets an explanation_accuracy. On pt-v21 a constant answer scores 0.70 to 0.95, so quote explanation_edge, the accuracy minus that baseline, and never the accuracy alone.

  • Agents in one tf.evaluate or tf.rank call run one after another in one Python process, on one seed. An earlier agent can leave the price path in a class variable for a later one. An agent written to cheat can read the seed from the harness's frames through sys._getframe and run a copy of the market ahead. Nothing flags either. The read-only market view guards only against accidents, so run each agent you did not write in its own process, through the MCP server.

  • Every evaluate and rank run starts at day 0, so a rule that needs 20 days of prices sits out the first 20 while buy-and-hold is invested. Pass history_days=20 to run the market 20 days first with nobody trading.

  • In a World with several agents, orders placed at the same step execute in label order, alphabetical, for the whole run. Rotate the labels across runs when you compare different agents in one market.

  • There are no commissions, no borrow fee on a short and no stop orders. A stop you check at each step fills a median 26.5 bp past its level at six steps a day. Uninvested cash earns nothing unless you pass cash_interest=True, and a negative cash balance pays the policy rate, which is below a broker's margin rate.

docs/AGENTS.md has the measurements behind each of these.

Examples

The twelve numbered examples/ are in reading order, and the test suite runs them:

00-a-year-in-one-market

Start here: one company, one year, two crises, one chart

01-first-simulation

Universe, engine, order book, determinism

02-evaluating-a-strategy

Specs, baselines, ranking across seeds

03-why-did-the-price-move

The twelve factors that sum to the mispricing's move

04-how-realistic-is-this

The realism panel and the limits

05-training-an-agent

The Gymnasium environment, and what size costs

06-execution-and-impact

TCA and the counterfactual run

07-research-workflow.py

A whole study in one file. It takes about forty seconds of CPU and needs tradefloor[arrow]

08-claude-agent.py

An LLM agent trading the market through the harness

09-a-pandemic-shaped-market

A real 2020-21 macro path, and which fields transmit. Pinned to pt-v12, whose QE channel carries the valuation path, with the same path on the default, pt-v21, at the end

10-forking-a-market

Fork a market, raise the rate in one branch, and compare the futures

11-scenario-fork.py

A scenario file applied to one branch of a fork, and what it cost

The rate-shock/ study is the demo above, and integrations/ runs the same kind of experiment through each agent framework, offline and without an API key.

Documentation

https://docs.tradefloor.dev covers install, the API, the guides and how the model is measured. These pages in this repository have the detail behind the sections above:

Contributing and support

CONTRIBUTING.md explains how to build and test the project. Its main rule is that any change to the simulated trajectory is a breaking change, however small, so a model change ships as a new preset. RELEASING.md is the release checklist.

Report a vulnerability through GitHub's security advisory form, not a public issue. SECURITY.md says what is in scope. Bugs and questions go to GitHub issues.

0.8.5 and the 0.8 patches after it are the long-term support line, with bug and security fixes for 24 months. docs/SUPPORT.md says what a support line promises and which release to pin for a long study.

Citing tradefloor

Cite the version you ran and name the preset. The same version can run several presets, and results depend on the preset.

@software{tradefloor,
  author  = {Coombes, Simon},
  title   = {tradefloor: a deterministic market simulator with a limit order book},
  version = {0.10.2},
  year    = {2026},
  url     = {https://github.com/simoncoombes/tradefloor},
  note    = {Model preset pt-v21}
}

CITATION.cff carries the same details, and GitHub's "Cite this repository" button reads it.

In the text, say which model you used, for example: "tradefloor 0.10.2, preset pt-v21, specified in its docs/MODEL.md". docs/REPRODUCIBILITY.md says how to publish a result so a reader can rerun it, and how to show a score was not tuned to its seeds.

License

tradefloor is licensed under MIT OR Apache-2.0, at your option. See LICENSE-MIT and LICENSE-APACHE. GitHub's sidebar reads Apache-2.0 because its license detection picks one file and stops. The grant that applies is the dual one, stated in pyproject.toml, rust/Cargo.toml and this section.

Available Tools

19 tools
build_scenarioBuild and preview a custom scenarioA
Read-onlyIdempotent

Author a custom scenario and see what it resolves to before running it. Give a macro PATH as hold, ramp and step instructions in steps, or explicit INTERVENTIONS as shocks and assumed transmission. Returns the resolved document, its fingerprint and any warnings; pass that document to run_stress_scenario as scenario. Days count from 0, so an event at day 50 needs a run of at least 51 days. Runs no market.

NameRequiredDescriptionDefault
daysNoThe run length you intend, 1 to 60 (up to 252 through start_job). A path's table covers these days, and a scenario whose events all fall after them is refused.
labelNoA name for the scenario, carried into results.
stepsNoA macro PATH, pinned for the whole run. Each step is {"kind": "hold", "fields": {"vix": 30.0}}, {"kind": "ramp", "field": F, "start": X, "end": Y, "over": N, "begin": D} or {"kind": "step", "field": F, "before": X, "after": Y, "at": D}. Fields: vix, federal_funds_rate, corporate_bond_yield, inflation_rate, qe_pe_boost, qe_assets_ratio, fear_greed_index, gdp_growth, unemployment_rate, tariff_rate, oil_price, cycle, epicentre, treasury_yield_2y, treasury_yield_10y.
shocksNoINTERVENTIONS the scenario asserts happened, each {"target": T, "operation": "set|add|multiply", "value": V, "at": D, "duration": N, "shape": "impulse|hold|ramp|permanent"}. list_scenarios gives every target and what it was measured to move.
transmissionNoInterventions the scenario ASSUMES followed, in the same form as shocks. The simulator treats them alike; the split records which effects are assumptions.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, and 'Runs no market' reinforces that this is a pure build step. It adds real behavioral context beyond annotations: the returned artifacts (resolved document, fingerprint, warnings) and the day-counting rule that can cause a scenario to be refused.

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?

Three sentences, front-loaded with purpose then the two input modes then the day-count caveat and the no-market disclaimer. Dense but every clause carries information; slightly packed for a single paragraph.

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

Completeness4/5

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

An output schema exists, so return values need not be detailed, yet the description still notes what comes back. Combined with the day-count caveat and sibling routing, an agent has what it needs to invoke this correctly.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema: the day-0 offset rule ('an event at day 50 needs at least 51 days') and the purpose of the steps/shocks/transmission split. This compensates usefully for what the schema alone conveys.

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

Purpose5/5

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

States a specific verb and resource ('Author a custom scenario') plus the distinctive capability of previewing the resolution before running it. It explicitly distinguishes itself from run_stress_scenario by naming it as the downstream consumer.

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?

Explains the two authoring modes (steps as a macro PATH, or shocks/transmission as INTERVENTIONS) and that the returned document is passed to run_stress_scenario. It does not explicitly say when to prefer steps over shocks, but the context is clear.

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

build_universeBuild and preview a rosterA
Read-onlyIdempotent

Build a roster of companies and preview it, either generated from a size and seed (optionally concentrated on chosen sectors) or from explicit instruments you supply. Use it when the default random roster will not do, for example to test one sector or your own companies. Returns a universe document that every run tool takes as universe, with the roster's fingerprint and any envelope warning. Runs no market.

NameRequiredDescriptionDefault
seedNoSeed that generates the roster, 0 to 2**64 - 1.
sizeNoNames in a generated roster, 2 to 120.
limitNoHow many instruments the preview lists.
sectorsNoLowercase sector ids to concentrate a generated roster on, for example ["technology", "energy"]. The ids: technology, financial_services, healthcare, energy, consumer_discretionary, consumer_staples, industrials, materials, real_estate, utilities, telecommunications, transportation. A concentrated roster is a named envelope gap, and the result says so.
instrumentsNoExplicit rows, 2 to 120, in roster order. Each needs ticker, sector (a lowercase id), initial_price and shares_outstanding. Give eps (earnings per share, valued at a sector P/E) or, for a loss-making company, book_value_per_share: a row with neither is refused, because the model would value it at one cent. Optional: revenue_growth, avg_volume, beta, short_interest (a share count, not a fraction). When given, size, seed and sectors are ignored.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds meaningful context beyond them: 'Runs no market,' the returned `universe` document contract that every run tool consumes, the roster fingerprint, the envelope warning, and the fact that sector concentration is a 'named envelope gap' reported in the result.

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

Conciseness5/5

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

Two sentences, front-loaded with the core action and construction modes, then the return contract and the 'no market' caveat. No filler sentences; every clause carries information an agent needs.

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?

With an output schema present, the description correctly avoids detailing return values while still pointing to the `universe` key and the fingerprint/warning fields. Usage, behavior, and the downstream contract are all covered for a 5-parameter builder 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 description coverage is 100% and each parameter is richly documented in the schema itself, including the mutual-exclusion rule ('When given, size, seed and sectors are ignored'). The description only restates the same two-mode grouping at a high level, so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Build a roster of companies and preview it') and immediately names the two construction modes: generated from size/seed (optionally sector-concentrated) or from explicit instruments. This distinguishes it from the neighboring build_scenario / run_stress_scenario tools, which consume a universe rather than construct one.

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?

Gives an explicit trigger: 'Use it when the default random roster will not do, for example to test one sector or your own companies.' It also clarifies the tool runs no market, so an agent knows not to expect simulation output. It stops short of naming a sibling alternative, so it earns 4 rather than 5.

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

check_envelopeCheck a question against the realism envelopeA
Read-onlyIdempotent

Check whether a question falls inside the range the simulator's realism was measured for, BEFORE running it. Use it whenever a conclusion leans on a horizon longer than a year, on particular statistics, on a sector-concentrated roster, on the size of a scenario's effect or on a preset other than the default. Returns ok or a refusal that names the measurement behind it, and for a named preset that preset's measured record. Runs no market, so it answers at once.

NameRequiredDescriptionDefault
presetNoThe preset the run uses, by name: pt-v1, pt-v2, pt-v3, pt-v4, pt-v5, pt-v6, pt-v7, pt-v8, pt-v9, pt-v10, pt-v11, pt-v12, pt-v13, pt-v14, pt-v15, pt-v16, pt-v18, pt-v19, pt-v20, pt-v21. Omit for the shipped default, pt-v21, the only preset the envelope certifies. Any other is answered as outside, with that preset's own measured record beside the answer; the measured roster mixes are granted only on pt-v19.
statisticsNoPanel statistics your conclusion leans on. Known: abs_return_acf1, abs_return_acf20, abs_return_acf5, annualised_vol_pct, corr_asymmetry, corr_asymmetry_lagged, corr_persistence_acf1, cross_sectional_corr, excess_kurtosis, fear_gauge_dn1, fear_gauge_dn3, index_drift_pct, index_tail_dn3_pct, leverage_effect, return_acf1, sector_excess_corr, volume_abs_return_corr, volume_change_acf1. An unknown name is refused.
horizon_daysYesThe run length you are asking about, in trading days. The certified horizon is 252.
macro_regimeNotrue if the conclusion depends on the economy reaching a particular state, such as high inflation, stagflation or a policy crisis. run_stress_scenario sets this itself when a scenario drives inflation, growth or the cycle.
scenario_magnitudeNotrue if the conclusion depends on the SIZE of a scenario's effect rather than its direction.
sector_concentratedNotrue if the roster is sector-concentrated, or the name of a measured mix: all_technology, defensive, sp500_like, tech_heavy. A mix is certified only on the preset it was measured on.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world. Beyond that, the description discloses behavior the annotations don't: the outcome shape (ok or a refusal naming the measurement), that a named preset returns that preset's measured record, and that it 'Runs no market, so it answers at once' — a latency/no-side-effect guarantee. Useful added context.

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

Conciseness4/5

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

Four sentences, front-loaded with the core purpose before the usage triggers and return behavior. Dense but each sentence carries substantive information; the enumeration of trigger conditions is long but earns its space as routing guidance.

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?

Output schema exists, so return values needn't be fully specified, and the description still summarizes them (ok/refusal/measured record). Given the tool's complexity around presets and certified ranges, the description supplies enough for correct invocation, though it could say more about how partial refusals across multiple flagged dimensions combine.

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

Parameters4/5

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

Schema coverage is 100%, so the schema does the heavy lifting and baseline is 3. The description goes slightly further by tying the parameters to decision triggers (e.g., a horizon 'longer than a year' against the 252-day certified range, leaning on statistics or effect size), which helps an agent map its situation onto the arguments rather than just reading field types.

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 states a specific verb and resource ('Check whether a question falls inside the range the simulator's realism was measured for') and frames it as a pre-flight gate ('BEFORE running it'), which cleanly separates it from execution siblings like run_stress_scenario and evaluate_strategies.

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

Usage Guidelines4/5

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

It gives concrete trigger conditions ('horizon longer than a year', 'particular statistics', 'sector-concentrated roster', 'size of a scenario's effect', 'a preset other than the default'), which is strong when-to-use guidance. It does not name a specific alternative tool to prefer or an explicit when-not-to-use case, so it falls short of the top band.

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

check_jobCheck a background jobA
Read-onlyIdempotent

Check a background job started by start_job. Returns its status and, once it has finished, the full result in the same form the direct tool returns. Omit job_id to list every job this server still holds. Changes nothing, so it is safe to poll.

NameRequiredDescriptionDefault
job_idNoAn id exactly as start_job returned it. Omit to list every job this server process holds.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is largely pre-covered; the description nonetheless reinforces this with 'Changes nothing, so it is safe to poll'. It additionally discloses the result-form equivalence ('the full result in the same form the direct tool returns'), which is useful context an agent cannot get from annotations. No auth or rate-limit detail is given.

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 short sentences, each load-bearing: purpose, return behavior, fallback mode, and safety. The most important facts (what it checks, safe to poll) are front-loaded with no 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 single-optional-parameter read tool with an output schema, nothing essential is missing. It covers the create/check relationship, the empty-argument behavior, and the safety profile, and it correctly avoids re-specifying return values at length.

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 the single parameter already documents omission behavior, so the baseline is 3. The description adds provenance the schema does not ('an id exactly as start_job returned it') and restates the list-all fallback, giving slightly more than the structured field alone.

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?

Specific verb+resource ('Check a background job') with explicit lineage to the sibling tool that creates the job ('started by start_job'). It also states what is returned (status, then full result) so an agent can distinguish it from start_job or the synchronous tools.

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?

States both operating modes clearly: pass an id to check one job, omit it to enumerate all held jobs. It also notes it is 'safe to poll', which tells the agent when repeated calls are appropriate. It does not explicitly name a when-not-to-use condition or a competing alternative, so it stops short of a 5.

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

close_sessionClose a market sessionA
DestructiveIdempotent

Close an open session and free its memory, returning each agent's final portfolio and every order sent on the session's line, which is what re-runs it from open_session. The session and its checkpoints are gone afterwards. Runs no market.

NameRequiredDescriptionDefault
session_idYesA session id exactly as open_session or session_fork returned it.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=false, so the safety profile is partly covered. The description adds non-obvious specifics the annotations do not: the session's checkpoints are destroyed along with it, and it 'runs no market,' which meaningfully distinguishes its behavior from the simulation-oriented siblings.

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?

Two dense sentences with the destructive consequence front-loaded and no filler. The clause 'which is what re-runs it from open_session' is slightly convoluted, keeping it just below the ideal.

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?

Behavior, destruction scope, and side-effect profile are all covered, and an output schema exists so return-value detail is not required. The description nonetheless restates return contents, which is redundant rather than missing, and it never clarifies idempotency semantics for re-closing an already-closed session.

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?

There is a single session_id parameter with 100% schema description coverage, so the schema already carries the semantics. The description adds nothing about the id's format or origin beyond what the schema states, which is the expected baseline 3 when the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb (close) and resource (an open session) and spells out the effect: freeing memory, returning final portfolios and orders. It explicitly frames itself against the sibling open_session ('what re-runs it from open_session'), so an agent can place it in the session lifecycle without opening the schema.

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

Usage Guidelines4/5

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

The description makes clear this is the terminal counterpart to open_session and that the returned data is what you feed back into open_session for a re-run, which gives genuine context for when to call it. It stops short of explicit when-not guidance or naming other session siblings (session_fork, session_rewind) as alternatives, so it does not reach 5.

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

describe_simulatorDescribe the simulatorA
Read-onlyIdempotent

Describe what this simulator is, what its realism checks certify, what it cannot do, the caps on every tool and how long a run takes. It also lists every shipped preset with its measured record, says which one the certification covers, lists the shipped populations of background traders with what they were measured to do, and describes market sessions. Call it first, before any other tool. It takes no arguments, runs no market and returns the same text on every call.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, closed-world, non-destructive, so the safety profile is covered. The description still adds real value: 'takes no arguments, runs no market and returns the same text on every call' confirms no side effects and deterministic output, which is more than the annotations alone convey. It stops short of noting response size or whether content is versioned, so not a 5.

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

Conciseness4/5

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

Front-loaded with the core purpose and the 'call it first' directive, which is the most decision-relevant sentence. The second sentence is a long comma-run enumeration of return contents that is dense but still scannable; it could be trimmed slightly without losing meaning.

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?

An output schema exists, so return-value explanation is technically optional, yet the description still summarizes the payload categories an agent needs to decide whether to call it. With zero params and full annotation coverage, nothing needed for correct invocation is missing.

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?

Zero parameters, so the baseline is 4. The description confirms this explicitly ('takes no arguments'), which is the only parameter-level information possible for an empty schema, but adds no further detail beyond that confirmation.

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

Purpose5/5

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

States a specific verb and resource (describe the simulator) and enumerates exactly what the response covers: realism checks, limitations, per-tool caps, run duration, presets, certified preset, background-trader populations, and market sessions. This clearly separates it from siblings like explain, list_scenarios, or check_envelope, which return data rather than self-description.

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?

Gives an explicit ordering rule: 'Call it first, before any other tool.' Combined with the note that it takes no arguments and runs no market, an agent knows precisely when this tool is appropriate versus any other sibling.

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

evaluate_strategiesEvaluate strategies on one marketA
Read-onlyIdempotent

Run strategies on one simulated market, beside the baseline agents on the same market, and score each one: return, P&L, the cost of its own trading in basis points, turnover and errors. Use it first, but it runs one seed, so use rank_strategies before believing an ordering. A strategy is data, for example {"signal": {"kind": "momentum", "lookback_days": 1.0}, "portfolio": {"top_k": 5, "gross": 1.0}}, and validate_strategy checks one without running it. days 1 to 60 here (a few seconds), up to 252 through start_job; roster 2 to 120 names. preset runs another shipped model preset, outside the certification, and population adds background traders that react to each strategy. Deterministic: the same arguments give the same scores.

NameRequiredDescriptionDefault
cashNoStarting cash for each entrant, in currency.
daysNoTrading days to run: 1 to 60 in a direct call, up to 252 (the certified horizon) through start_job.
seedNoSimulation seed, an integer from 0 to 2**64 - 1. The same seed and arguments give the same result.
presetNoA shipped model preset to run, by name: pt-v1, pt-v2, pt-v3, pt-v4, pt-v5, pt-v6, pt-v7, pt-v8, pt-v9, pt-v10, pt-v11, pt-v12, pt-v13, pt-v14, pt-v15, pt-v16, pt-v18, pt-v19, pt-v20, pt-v21. Omit for the shipped default, pt-v21, the only preset the realism envelope certifies; a result under any other carries a caveat saying it is outside the certification, with that preset's own measured record. describe_simulator lists every preset's record.
universeNoA roster document, usually the `universe` field of a build_universe result. Either {"size": n, "seed": s, "sectors": [...]} or {"instruments": [...]}. When given it replaces universe_size, universe_seed and universe_sectors.
populationNoA shipped population of background traders to run beside, by name: standard, crowded. They share each strategy's market and react to its trading (populated mode), so a result says whether an edge survives other traders, and strategies no longer meet identical markets. Omit for isolated mode, the default. describe_simulator lists each population's traders.
strategiesYesStrategies to run, keyed by a name you choose. Each value is a strategy spec, for example {"signal": {"kind": "momentum", "lookback_days": 1.0}, "portfolio": {"top_k": 5, "gross": 1.0}}. Signal kinds: hold, random, momentum, mean_reversion, oracle, blend. At most 8. The baseline names (buy_and_hold, random, momentum, mean_reversion, oracle) are taken. Check a spec with validate_strategy before running it.
max_leverageNoCap on gross exposure as a multiple of net worth. null removes the cap, and the result then warns that trading size alone can win.
steps_per_dayNoDecision points per trading day, 1 to 22. Each entrant is asked for orders at each one. A step is 65 minutes, so 6 cover the trading session, and days times steps may be at most 360 in a direct call.
universe_seedNoSeed that generates the roster, separate from the simulation seed. Ignored when `universe` is given.
universe_sizeNoNames in a generated roster, 2 to 120. Ignored when `universe` is given.
universe_sectorsNoLowercase sector ids to concentrate a generated roster on, for example ["technology", "energy"]. The ids: technology, financial_services, healthcare, energy, consumer_discretionary, consumer_staples, industrials, materials, real_estate, utilities, telecommunications, transportation. A concentrated roster is a named envelope gap, and the result says so.
include_baselinesNoAdd the baseline agents (buy_and_hold, random, momentum, mean_reversion, oracle) to the same market. On by default, because a return means little without buy-and-hold's beside it.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations (readOnly, idempotent, non-destructive), it discloses determinism ('the same arguments give the same scores'), the direct-call day cap (1-60) versus 252 via start_job, the 8-strategy ceiling, that baseline names are reserved, that populated mode makes strategies no longer share identical markets, and that a null leverage cap triggers a warning. This is unusually rich behavioral context.

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

Conciseness4/5

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

Front-loaded with the core action and scoring outputs, then constraints and routing in descending priority. It is dense and mostly earns its sentences, though a few details (day/roster bounds, preset caveat) duplicate the schema and could be trimmed.

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?

With an output schema present, the description need not explain return values, and it covers the remaining gaps: determinism, run-size limits, baseline inclusion rationale, and the certification caveat for non-default presets. An agent has everything needed to call this correctly.

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 description coverage is 100%, so the schema already documents every parameter including presets, populations, roster bounds and reserved baseline names. The description mostly restates those facts (days 1-60, roster 2-120, preset certification caveat) rather than adding new parameter-level meaning, so the baseline 3 applies.

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 states a precise verb and resource ('Run strategies on one simulated market... and score each one: return, P&L, cost of its own trading in basis points, turnover and errors'), which is far more specific than the title. It also implicitly distinguishes itself from validate_strategy (checks without running) and rank_strategies (orders across seeds).

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 sequencing ('Use it first, but it runs one seed, so use rank_strategies before believing an ordering'), names validate_strategy for spec checking, and routes longer horizons to start_job. When-to-use and alternatives are both stated.

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

explainTrace a move to its random drawsA
Read-onlyIdempotent

Trace one name's price move on one day down to the random draws that caused it, as a tree: the day's log move at the top, then each factor, then the draw addresses beneath them. Every node can be replayed, and every number is measured by running the day again. Use explain_price_move to see which factors moved prices across the roster; use this for one name when you need to know which draws moved those factors. depth sets how much of the tree the render text shows. Builds and runs its own market for up to 60 days, under preset if one is named; read-only and deterministic.

NameRequiredDescriptionDefault
dayNoThe trading day to explain, 1 to 60.
seedNoSimulation seed, an integer from 0 to 2**64 - 1. The same seed and arguments give the same result.
depthNoHow many levels of the tree the `render` text shows, 0 to 4. The `tree` field is always whole.
presetNoA shipped model preset to run, by name: pt-v1, pt-v2, pt-v3, pt-v4, pt-v5, pt-v6, pt-v7, pt-v8, pt-v9, pt-v10, pt-v11, pt-v12, pt-v13, pt-v14, pt-v15, pt-v16, pt-v18, pt-v19, pt-v20, pt-v21. Omit for the shipped default, pt-v21, the only preset the realism envelope certifies; a result under any other carries a caveat saying it is outside the certification, with that preset's own measured record. describe_simulator lists every preset's record.
tickerNoOne ticker from the roster. Omit to take the largest moves (explain_price_move) or the first name (explain).
universeNoA roster document, usually the `universe` field of a build_universe result. Either {"size": n, "seed": s, "sectors": [...]} or {"instruments": [...]}. When given it replaces universe_size, universe_seed and universe_sectors.
universe_seedNoSeed that generates the roster, separate from the simulation seed. Ignored when `universe` is given.
universe_sizeNoNames in a generated roster, 2 to 120. Ignored when `universe` is given.
universe_sectorsNoLowercase sector ids to concentrate a generated roster on, for example ["technology", "energy"]. The ids: technology, financial_services, healthcare, energy, consumer_discretionary, consumer_staples, industrials, materials, real_estate, utilities, telecommunications, transportation. A concentrated roster is a named envelope gap, and the result says so.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavior: it builds and runs its own market for up to 60 days, every number is measured by re-running the day, and non-default presets return a caveat with that preset's own measured record. It doesn't describe cost or runtime, hence not a 5.

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

Conciseness4/5

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

Front-loads purpose and the tree shape, then alternatives, then parameter behavior, then operational constraints. Sentences are dense and slightly overpacked (preset caveats, build window, determinism in one clause), but every sentence carries information and nothing is redundant.

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?

An output schema exists, so return values need not be explained, and the description still covers the pieces an agent needs: determinism, read-only nature, the 60-day build, preset certification caveats, and depth's effect on rendered output. Nothing material is missing for a 9-param, zero-required 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%, so baseline is 3, but the description adds real meaning: `depth` governs only the `render` text while `tree` is always whole, `preset` determines which market gets built and whether a caveat appears, and `ticker` omission defaults to first name here vs largest moves in the sibling. That is value beyond the schema text.

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

Purpose5/5

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

States a specific verb (trace), resource (one name's price move on one day), and output shape (a tree: log move, factors, draw addresses). It explicitly distinguishes itself from explain_price_move, so an agent can route without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit when-to-use split: explain_price_move for which factors moved prices across the roster, this tool for one name when you need to know which draws moved those factors. It also points at describe_simulator for preset records, covering the adjacent decision.

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

explain_price_moveExplain a price move by factorA
Read-onlyIdempotent

Break one day's move for each name into the 12 factor contributions that sum to the day's change in the mispricing, the log gap between the model price and fair value. Use it to ask which factors moved prices; use explain to trace one name's move down to the random draws behind it. They are the simulator's own bookkeeping, and they are not the whole price move. On the default preset most of the day's news and noise moves fair value, fair_value_shift takes that part out of the mispricing, and the fair-value move itself is not split up. Without a ticker it returns the top_n largest moves. Builds and runs its own market for up to 60 days, under preset if one is named; read-only.

NameRequiredDescriptionDefault
dayNoThe trading day to explain, 1 to 60.
seedNoSimulation seed, an integer from 0 to 2**64 - 1. The same seed and arguments give the same result.
top_nNoHow many instruments to return, largest moves first, when no ticker is given. 1 or more.
presetNoA shipped model preset to run, by name: pt-v1, pt-v2, pt-v3, pt-v4, pt-v5, pt-v6, pt-v7, pt-v8, pt-v9, pt-v10, pt-v11, pt-v12, pt-v13, pt-v14, pt-v15, pt-v16, pt-v18, pt-v19, pt-v20, pt-v21. Omit for the shipped default, pt-v21, the only preset the realism envelope certifies; a result under any other carries a caveat saying it is outside the certification, with that preset's own measured record. describe_simulator lists every preset's record.
tickerNoOne ticker from the roster. Omit to take the largest moves (explain_price_move) or the first name (explain).
universeNoA roster document, usually the `universe` field of a build_universe result. Either {"size": n, "seed": s, "sectors": [...]} or {"instruments": [...]}. When given it replaces universe_size, universe_seed and universe_sectors.
universe_seedNoSeed that generates the roster, separate from the simulation seed. Ignored when `universe` is given.
universe_sizeNoNames in a generated roster, 2 to 120. Ignored when `universe` is given.
universe_sectorsNoLowercase sector ids to concentrate a generated roster on, for example ["technology", "energy"]. The ids: technology, financial_services, healthcare, energy, consumer_discretionary, consumer_staples, industrials, materials, real_estate, utilities, telecommunications, transportation. A concentrated roster is a named envelope gap, and the result says so.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive (and the description redundantly repeats 'read-only'), so the bar is lower. The description nevertheless adds real behavioral context: these contributions are the simulator's own bookkeeping and are NOT the whole price move, `fair_value_shift` removes the news/noise part on the default preset, fair-value moves aren't split up, and it builds/runs its own market for up to 60 days. That is substantial disclosure beyond the annotations.

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

Conciseness4/5

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

Purpose is front-loaded and sentences carry real information, but the prose is dense and slightly meandering ('They are the simulator's own bookkeeping, and they are not the whole price move'), and 'read-only' duplicates the annotation. Mostly earned, minor padding.

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?

An output schema exists so return values need not be explained, and the description covers the concept (mispricing), the exclusion caveat, the top_n fallback, the preset caveat, and the 60-day build limit. For a 9-parameter analytical tool nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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 day, seed, top_n, preset, ticker, and the universe fields in detail, including the preset certification caveat. The description adds only the cross-parameter behavior 'without a ticker it returns the top_n largest moves', which the schema's ticker description already states. Baseline 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 first sentence gives a specific verb (break) plus resource (one day's move per name into 12 factor contributions) and even defines the key term 'mispricing' as the log gap between model price and fair value. It explicitly contrasts the scope with the sibling `explain` (whole-cross-section vs. one name down to random draws), so an agent can select it without opening any schema.

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

Usage Guidelines5/5

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

It states the use case directly ('Use it to ask which factors moved prices') and names the alternative tool `explain` with the distinguishing condition (trace one name's move down to the random draws). When-to-use and the alternative are both explicit.

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

list_scenariosList scenarios and intervention targetsA
Read-onlyIdempotent

List the shipped stress scenarios, the scenario constructors and every intervention target, with what each target was measured to reach. Read it before build_scenario or run_stress_scenario: each shipped scenario's first_event_day sets the shortest useful run, and four targets have effects too small to see over a hundred days. Takes no arguments and runs no market.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already establish readOnly/idempotent/non-destructive, and the description adds real domain context beyond them: it runs no market (no cost/side effects) and warns that four targets have effects too small to observe over a hundred days. These are non-obvious traits an agent would not infer from the schema or annotations.

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?

Front-loaded with what it lists, then usage guidance, then the behavioral caveats. Three dense sentences with no filler; each clause carries distinct information.

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?

Output schema exists, so return format needn't be restated, and the description still summarizes the return content (targets and what each was measured to reach). Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Tool takes zero parameters and schema coverage is 100%, so baseline is 4. The description's 'Takes no arguments' simply confirms the empty schema rather than adding parameter meaning.

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

Purpose5/5

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

States a specific verb (List) and three concrete resources (shipped stress scenarios, scenario constructors, intervention targets) plus what each target was measured to reach. This clearly distinguishes it from siblings build_scenario and run_stress_scenario, which the description names directly.

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 instructs to read before build_scenario or run_stress_scenario and gives the reason (first_event_day sets the shortest useful run; four targets have imperceptible effects). Names the alternatives and the condition that selects this tool over them.

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

open_sessionOpen a market sessionA

Open a simulated market that this server keeps between calls, and get a session id back. Use a session when you want to decide each step yourself and see what happened before the next: send orders with session_step, read with session_state, try two actions from one state with session_fork, and go back with session_rewind. To score a strategy you can write as a spec, use evaluate_strategies or rank_strategies instead. agents names the traders: null for one you drive with orders, or a strategy spec for one that trades itself each step. preset and population choose the market as they do for evaluate_strategies. Opening runs no market. At most 8 sessions are open at once, in this server's memory only, and one idle for 30 minutes is closed.

NameRequiredDescriptionDefault
cashNoStarting cash for each entrant, in currency.
seedNoSimulation seed, an integer from 0 to 2**64 - 1. The same seed and arguments give the same result.
agentsNoThe traders in this market, keyed by a name you choose. null is one you drive with orders in session_step; a strategy spec, for example {"signal": {"kind": "momentum", "lookback_days": 1.0}, "portfolio": {"top_k": 5, "gross": 1.0}}, trades by itself each step. At most 8. All of them trade one market and move each other's prices. Omit for one agent called "me".
presetNoA shipped model preset to run, by name: pt-v1, pt-v2, pt-v3, pt-v4, pt-v5, pt-v6, pt-v7, pt-v8, pt-v9, pt-v10, pt-v11, pt-v12, pt-v13, pt-v14, pt-v15, pt-v16, pt-v18, pt-v19, pt-v20, pt-v21. Omit for the shipped default, pt-v21, the only preset the realism envelope certifies; a result under any other carries a caveat saying it is outside the certification, with that preset's own measured record. describe_simulator lists every preset's record.
universeNoA roster document, usually the `universe` field of a build_universe result. Either {"size": n, "seed": s, "sectors": [...]} or {"instruments": [...]}. When given it replaces universe_size, universe_seed and universe_sectors.
populationNoA shipped population of background traders to run beside, by name: standard, crowded. They share each strategy's market and react to its trading (populated mode), so a result says whether an edge survives other traders, and strategies no longer meet identical markets. Omit for isolated mode, the default. describe_simulator lists each population's traders.
max_leverageNoCap on gross exposure as a multiple of net worth. null removes the cap, and the result then warns that trading size alone can win.
steps_per_dayNoDecision points per trading day, 1 to 22. A step is 65 minutes, so 6 cover the trading session.
universe_seedNoSeed that generates the roster, separate from the simulation seed. Ignored when `universe` is given.
universe_sizeNoNames in a generated roster, 2 to 120. Ignored when `universe` is given.
universe_sectorsNoLowercase sector ids to concentrate a generated roster on, for example ["technology", "energy"]. The ids: technology, financial_services, healthcare, energy, consumer_discretionary, consumer_staples, industrials, materials, real_estate, utilities, telecommunications, transportation. A concentrated roster is a named envelope gap, and the result says so.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint=false, openWorldHint=false, non-idempotent) by disclosing behavior the schema cannot: 'Opening runs no market' (no simulation work until a step), a concurrency cap of 8 sessions, that sessions live only in server memory, and a 30-minute idle TTL. These are exactly the operational traits an agent needs to avoid losing state.

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

Conciseness4/5

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

Front-loaded with purpose, then usage, then parameter glosses, then limits and TTL. It is a dense single paragraph rather than strictly unscannable, and it mostly avoids restating schema text verbatim. Minor redundancy with the already-thorough parameter descriptions keeps it from a 5.

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?

With an output schema present, return values need not be explained, and the description compensates with everything else: purpose, alternatives, companion-tool roles, resource limits, and lifetime semantics. Nothing an agent needs to open and manage a session correctly is missing.

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, but the description still adds meaning: it glosses `agents` (null = one you drive; a spec = self-trading) and ties `preset`/`population` semantics to evaluate_strategies for consistency. It does not add much on cash/seed/steps_per_day beyond what the schema already says, keeping it just 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 first sentence gives a specific verb+resource ('Open a simulated market that this server keeps between calls') and states the return value (a session id). It explicitly distinguishes this tool from siblings like evaluate_strategies and rank_strategies, which are for spec-based scoring. An agent can tell exactly what this does without opening the schema.

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

Usage Guidelines5/5

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

Explicit when-to-use: 'Use a session when you want to decide each step yourself and see what happened before the next,' plus a named alternative for the other case ('to score a strategy you can write as a spec, use evaluate_strategies or rank_strategies instead'). It also routes the agent to the companion tools session_step/session_state/session_fork/session_rewind by describing what each is for.

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

rank_strategiesRank strategies across many seedsA
Read-onlyIdempotent

Score strategies across MANY seeds, beside the baseline agents, and rank them with a paired sign test on each pair. Use it after evaluate_strategies, because one seed's ordering is often luck. Costs about one evaluate_strategies call per seed: 2 to 12 seeds (default six), days 1 to 60 here, up to 252 through start_job. Returns each entrant's record across the seeds (median P&L, seeds ahead of buy-and-hold) and each pair's sign test. Takes preset as evaluate_strategies does. Runs isolated only and refuses population, because the paired test needs every strategy on the same market. Deterministic.

NameRequiredDescriptionDefault
daysNoTrading days to run: 1 to 60 in a direct call, up to 252 (the certified horizon) through start_job.
seedsNoSimulation seeds, 2 to 12 of them. Every entrant trades the same market on each seed. Omit for [1, 2, 3, 4, 5, 6].
presetNoA shipped model preset to run, by name: pt-v1, pt-v2, pt-v3, pt-v4, pt-v5, pt-v6, pt-v7, pt-v8, pt-v9, pt-v10, pt-v11, pt-v12, pt-v13, pt-v14, pt-v15, pt-v16, pt-v18, pt-v19, pt-v20, pt-v21. Omit for the shipped default, pt-v21, the only preset the realism envelope certifies; a result under any other carries a caveat saying it is outside the certification, with that preset's own measured record. describe_simulator lists every preset's record.
universeNoA roster document, usually the `universe` field of a build_universe result. Either {"size": n, "seed": s, "sectors": [...]} or {"instruments": [...]}. When given it replaces universe_size, universe_seed and universe_sectors.
populationNorank_strategies refuses any population, because its paired test needs every strategy on the same market. Pass population to evaluate_strategies or run_stress_scenario instead.
strategiesYesStrategies to run, keyed by a name you choose. Each value is a strategy spec, for example {"signal": {"kind": "momentum", "lookback_days": 1.0}, "portfolio": {"top_k": 5, "gross": 1.0}}. Signal kinds: hold, random, momentum, mean_reversion, oracle, blend. At most 8. The baseline names (buy_and_hold, random, momentum, mean_reversion, oracle) are taken. Check a spec with validate_strategy before running it.
max_leverageNoCap on gross exposure as a multiple of net worth. null removes the cap, and the result then warns that trading size alone can win.
steps_per_dayNoDecision points per trading day, 1 to 22. Each entrant is asked for orders at each one. A step is 65 minutes, so 6 cover the trading session, and days times steps may be at most 360 in a direct call.
universe_seedNoSeed that generates the roster, separate from the simulation seed. Ignored when `universe` is given.
universe_sizeNoNames in a generated roster, 2 to 120. Ignored when `universe` is given.
universe_sectorsNoLowercase sector ids to concentrate a generated roster on, for example ["technology", "energy"]. The ids: technology, financial_services, healthcare, energy, consumer_discretionary, consumer_staples, industrials, materials, real_estate, utilities, telecommunications, transportation. A concentrated roster is a named envelope gap, and the result says so.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent/non-destructive, and the description adds genuinely new context: cost is roughly one evaluate_strategies call per seed, execution is isolated-only, it refuses population, it is deterministic, and non-certified presets carry a caveat. That is substantial behavioral disclosure beyond the structured fields.

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

Conciseness4/5

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

Front-loaded with purpose and method, then constraints and cost, with no filler sentences. It is dense and slightly repetitive of the schema on seed/day limits, but every sentence carries real information.

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 complex 11-parameter tool with nested strategy specs, the description covers the key operating envelope: seed count, horizon limits, cost, isolation constraint, determinism, and refusal behavior. An output schema exists, so the brief note on returns is sufficient.

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 description coverage is 100%, so the schema already documents all 11 parameters including seeds, days, preset, and the refusal on population. The description adds only marginal meaning, mainly cross-referencing 'preset as evaluate_strategies does', 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?

States a specific verb and resource (rank strategies) plus the method (paired sign test across many seeds beside baseline agents), which is a distinct operation from evaluate_strategies. An agent can immediately tell this is the multi-seed ranking step, not a single-run evaluation.

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 to use it after evaluate_strategies and why (one seed's ordering is often luck), and it names the refused path (population) with the redirect to evaluate_strategies or run_stress_scenario. When-to-use, when-not, and alternatives are all present.

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

run_stress_scenarioRun strategies through a stress scenarioA
Read-onlyIdempotent

Run strategies through a macro stress scenario, always beside the same market unshocked, and compare each strategy across the two. scenario is a shipped document by name (list_scenarios gives each one's first_event_day, and the run must be longer than that), a constructor by name (vix_shock, rate_ramp, timed with peak_day), or a document from build_scenario. A scenario whose events all fall after the run is refused. Pass fork_day to run both markets together first and start the scenario on that day, as a fork of one shared history. Use the result to detect a response, not to forecast its size. days 1 to 60 here, up to 252 through start_job. Takes preset and population as evaluate_strategies does, the same in both markets. Deterministic.

NameRequiredDescriptionDefault
daysNoTrading days to run: 1 to 60 in a direct call, up to 252 (the certified horizon) through start_job.
seedNoSimulation seed, an integer from 0 to 2**64 - 1. The same seed and arguments give the same result.
presetNoA shipped model preset to run, by name: pt-v1, pt-v2, pt-v3, pt-v4, pt-v5, pt-v6, pt-v7, pt-v8, pt-v9, pt-v10, pt-v11, pt-v12, pt-v13, pt-v14, pt-v15, pt-v16, pt-v18, pt-v19, pt-v20, pt-v21. Omit for the shipped default, pt-v21, the only preset the realism envelope certifies; a result under any other carries a caveat saying it is outside the certification, with that preset's own measured record. describe_simulator lists every preset's record.
fork_dayNoRun both markets together for this many days, then split them and start the scenario on the first day after the split: day `fork_day` of the run. The scenario's events keep their spacing, and every strategy trades the shared days identically in both arms. 0 to days - 1. Only for a scenario made of interventions (a shipped document, or build_scenario with `shocks`); a macro path or a constructor pins the macro from day 0, so it has no fork point.
peak_dayNoConstructors only. vix_shock: the day the VIX jumps to its peak (default 10). rate_ramp: the day the policy rate and corporate yield reach their end level (default 30). A vix_shock peak must fall inside the run.
scenarioYesA shipped document by name (list_scenarios lists them with the day each one's first event falls on, and the run must be longer than that), a constructor by name (vix_shock, rate_ramp, timed with peak_day), or a scenario document from build_scenario.
universeNoA roster document, usually the `universe` field of a build_universe result. Either {"size": n, "seed": s, "sectors": [...]} or {"instruments": [...]}. When given it replaces universe_size, universe_seed and universe_sectors.
populationNoA shipped population of background traders to run beside, by name: standard, crowded. They share each strategy's market and react to its trading (populated mode), so a result says whether an edge survives other traders, and strategies no longer meet identical markets. Omit for isolated mode, the default. describe_simulator lists each population's traders.
strategiesNoOptional strategies to run beside the baselines, in the evaluate_strategies form. The baseline names are taken.
universe_seedNoSeed that generates the roster, separate from the simulation seed. Ignored when `universe` is given.
universe_sizeNoNames in a generated roster, 2 to 120. Ignored when `universe` is given.
universe_sectorsNoLowercase sector ids to concentrate a generated roster on, for example ["technology", "energy"]. The ids: technology, financial_services, healthcare, energy, consumer_discretionary, consumer_staples, industrials, materials, real_estate, utilities, telecommunications, transportation. A concentrated roster is a named envelope gap, and the result says so.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover read-only/idempotent/non-destructive, and the description adds real behavioral context beyond them: determinism, the refusal of scenarios whose events all fall after the run, the fork_day shared-history mechanism, and populated mode breaking identical-market assumptions. It does not discuss output shape or cost, but with an output schema present and rich annotations this is solid.

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

Conciseness4/5

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

Front-loaded with the core purpose, then constraints and routing. Dense but nearly every sentence carries information; a couple of clauses (scenario form enumeration, days limits) restate what the schema fields already say, which is mild redundancy rather than padding.

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 12-parameter simulation tool with an output schema and full annotation coverage, the description supplies everything an agent needs to call it correctly: valid scenario forms, the length-versus-first-event rule, fork_day applicability, and the certification caveat on non-default presets. Return values are delegated to the output schema appropriately.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds relational semantics the schema does not: fork_day applies only to intervention scenarios (not macro paths or constructors), preset and population must be identical in both markets, and the scenario's three accepted forms. These cross-parameter constraints go beyond the per-field schema text.

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

Purpose5/5

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

States a specific verb and resource (run strategies through a macro stress scenario) plus the defining scope: always beside the same market unshocked, comparing each strategy across the two arms. This distinguishes it from evaluate_strategies, which has no shock arm, and the sibling is named explicitly for parameter parity.

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?

Gives clear routing: days 1-60 here versus up to 252 through start_job, and 'Use the result to detect a response, not to forecast its size' sets the interpretation boundary. It also names list_scenarios and build_scenario as sources for the scenario argument. It stops short of an explicit 'use this instead of X when...' rule, so 4 rather than 5.

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

session_forkFork a market sessionA

Copy an open session, at its present state, into a new session with its own id, so you can try two different actions from the same market and compare them. The copy continues exactly as the original would: the same steps and orders give the same prices in both. The original is unchanged. Counts against the 8-session cap; runs no market.

NameRequiredDescriptionDefault
session_idYesA session id exactly as open_session or session_fork returned it.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare the safety profile (readOnly=false, destructive=false, idempotent=false), and the description adds traits they cannot express: the original is unchanged, the fork counts against the 8-session cap, and it 'runs no market' (no simulation cost). It also asserts determinism — identical steps yield identical prices in both sessions — which is exactly the kind of behavioral guarantee an agent needs when deciding to branch.

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

Conciseness4/5

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

Front-loaded with the core action and outcome, then the use case, then the constraints. Four sentences, each carrying information, though the opening sentence is dense enough to be read twice.

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?

An output schema exists, so return values need no explanation. The description covers state inheritance, side-effect profile, quota impact, and determinism — everything an agent needs to call this correctly and predict the result.

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?

Only one parameter, and schema coverage is 100% with the schema itself documenting the format ('exactly as open_session or session_fork returned it'). The description adds no further syntax or constraint detail, so baseline 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?

States a specific verb and resource ('Copy an open session ... into a new session with its own id') and pins the copied state ('at its present state'), which cleanly separates it from open_session and session_rewind in the sibling list.

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?

Gives a clear motivating scenario — 'try two different actions from the same market and compare them' — which tells the agent when branching is the right move. It stops short of naming the alternatives (session_rewind, open_session) or stating exclusions, so it is strong context rather than full routing.

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

session_rewindRewind a market sessionA
DestructiveIdempotent

Put an open session back to a checkpoint it kept, by step, and drop every checkpoint after it. Checkpoints are kept at the open and at the end of every session_step call; session_state lists them, and a session keeps at most 64. To keep the later state as well, session_fork first. Returns the session as session_state does. Runs no market.

NameRequiredDescriptionDefault
stepYesThe step to return to, one of the session's checkpoints.
session_idYesA session id exactly as open_session or session_fork returned it.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations (destructiveHint=true, idempotentHint=true, readOnlyHint=false) by disclosing what is destroyed (every later checkpoint), the checkpoint cadence and 64 cap, and 'Runs no market', all of which an agent needs before committing to an irreversible step.

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?

Four compact sentences, front-loaded with the core mutation and its destructive consequence, then checkpoint mechanics, alternative, and return shape – every sentence earns its place.

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?

Covers destruction behavior, checkpoint limits, the fork alternative, and return format ('as session_state does') despite an output schema already existing; nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are already documented; the description only echoes the step semantics ('one of the session's checkpoints') without adding format or validation detail 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?

States a precise verb and resource ('Put an open session back to a checkpoint... by step, and drop every checkpoint after it') with exact scope, clearly separating it from siblings like session_fork and session_state.

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 names the alternative and the condition that selects it: 'To keep the later state as well, session_fork first.' It also points to session_state as the way to list checkpoints, leaving nothing to inference.

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

session_stateRead a market sessionA
Read-onlyIdempotent

Read an open session without changing it: the clock, every price, the published macro figures, today's news by name, each agent's portfolio and open orders, and the checkpoints session_rewind can return to. Name tickers to add each one's open, high, low, volume and best bid and ask. It shows what a trader could see and nothing of the simulator's own state. Omit session_id to list the open sessions. Runs no market.

NameRequiredDescriptionDefault
tickersNoTickers to show in detail: the day's open, high, low and volume, the previous close, and the book's best bid and ask.
session_idNoA session id from open_session or session_fork. Omit to list the sessions this server holds.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuine value on top: the visibility boundary ('shows what a trader could see and nothing of the simulator's own state') and the fact it runs no market, which is not captured by 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.

Conciseness5/5

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

Front-loaded with the core action and scope, then the optional ticker behavior, then the session_id branch. The enumeration is dense but every clause conveys distinct content the agent needs, with no 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?

An output schema exists, so return values need no explanation, yet the description still orients the agent on what the response contains. Combined with full schema coverage and strong annotation coverage, nothing needed to call this tool correctly is missing.

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 description coverage is 100%, so both parameters are already documented. The description restates the tickers detail fields and the omit-session_id behavior rather than adding syntax, format, or edge-case guidance beyond the schema, so baseline 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?

States a specific verb and resource ('Read an open session without changing it') and enumerates exactly what the read returns: clock, prices, macro figures, news, portfolios, open orders, rewind checkpoints. It also implicitly distinguishes itself from session_step ('Runs no market') and references session_rewind, so an agent can place it among its siblings without opening a schema.

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?

Gives clear operating context: read-only, no market advance, and the key branch 'Omit session_id to list the open sessions.' It does not explicitly name the alternative to reach for when you want to mutate state (e.g. session_step/session_fork), but the constraints make the intended use unambiguous.

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

session_stepAdvance a market sessionA

Advance an open session by a number of steps or days, optionally sending orders for one of its agents at the first step, and get back the fills, each agent's portfolio, the prices and what changed. This is the one session tool that trades. An order is a signed share count (positive buys), {"quantity": q, "limit_price": p} for a limit order, or "cancel"; a malformed order is refused before anything runs, and one the market refuses (the leverage cap, a book that cannot fill) is listed and the rest trade. At most 360 steps a call and 504 days a session; a step costs about a sixth of a day of evaluate_strategies for one entrant. Keeps a checkpoint at the step it ends on. Deterministic: the same calls from the same open give the same result.

NameRequiredDescriptionDefault
daysNoAdvance through this many market closes, the day in progress counting as the first. Give steps or days, not both.
agentNoThe agent the orders are for, one opened with null. May be omitted when the session has exactly one such agent.
stepsNoDecision points to advance, 1 or more. Give steps or days, not both; with neither, one step.
ordersNoOrders sent at the first step this call runs, keyed by ticker: a signed share count for a market order (positive buys), {"quantity": q, "limit_price": p} for a limit order that waits in the book, or "cancel" to withdraw the agent's waiting orders on that ticker.
session_idYesA session id exactly as open_session or session_fork returned it.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations declare a non-idempotent, non-read-only, non-destructive mutation, and the description goes well beyond them: malformed orders are refused before execution, market-refused orders are listed while the rest trade, hard caps of 360 steps and 504 days, a cost analogy to evaluate_strategies, checkpoint retention at the ending step, and deterministic replay. This is exactly the operational context an agent needs before a mutating call.

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?

Dense but front-loaded: the core action and its order-sending option come first, followed by limits, cost, and determinism guarantees. Every clause carries information, though the paragraph format makes it a fairly heavy read for a single-sentence-style spec.

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?

An output schema exists, so the description needn't itemize return fields, and it still names the key outputs (fills, portfolios, prices, changes). Combined with caps, error handling, and determinism disclosure, nothing material is missing for a 5-parameter mutating 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 description coverage is 100%, so the schema already documents session_id, steps, days, agent, and orders. The description restates the order encoding (signed count, limit object, 'cancel') largely in parallel with the schema rather than adding new per-parameter meaning. Baseline 3 is appropriate given the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb and resource ('Advance an open session by a number of steps or days'), plus the optional order-sending behavior and the return payload. It explicitly positions itself against siblings with 'This is the one session tool that trades,' so an agent can distinguish it from session_state, session_rewind, or close_session without opening another schema.

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?

Gives clear triggering context: orders are sent for one agent 'at the first step,' steps or days are mutually exclusive, and it is the only session tool that trades. It stops short of explicitly routing the agent to alternatives (e.g. use session_state to inspect without advancing), so it is strong but not fully explicit.

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

start_jobStart a background simulationA

Start a long run of evaluate_strategies, rank_strategies or run_stress_scenario in the background and get a job id back immediately. This is the ONLY way to run to the certified 252-day horizon; a direct call is capped at 60 days so it can answer inside a conversation. The arguments are checked before the job starts, and the response estimates its run time. At most 2 jobs run at once and the last 32 are kept, in this server's memory only. A preset or population in the arguments is checked before the job starts. Poll with check_job.

NameRequiredDescriptionDefault
toolYesThe tool to run in the background.
argumentsNoThat tool's arguments, as a direct call takes them. days may go to 252. An unknown argument or a wrong type is refused before the job starts.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations (readOnly=false, non-idempotent, non-destructive), it discloses async semantics, capacity limits ('at most 2 jobs run at once'), retention ('last 32 are kept'), ephemerality ('in this server's memory only'), pre-start argument validation, and a runtime estimate in the response. This is unusually rich operational context for a mutation-style tool.

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

Conciseness4/5

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

Front-loaded with purpose, then constraints, then the polling pointer — good ordering. It loses a point for near-duplication: 'The arguments are checked before the job starts' is repeated as 'A preset or population in the arguments is checked before the job starts.'

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?

With an output schema present, return values need not be explained, and the description still covers async behavior, limits, persistence, and validation. Nothing an agent needs to invoke it correctly and then follow up is missing.

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 description coverage is 100% and both parameters are documented, so the baseline is 3. The description mostly restates schema content (the 252-day limit, refusal of unknown args/wrong types); the only added nuance is that a 'preset' or 'population' gets validated, which is marginal.

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

Purpose5/5

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

States a specific verb ('Start') plus the exact resources it wraps (evaluate_strategies, rank_strategies, run_stress_scenario) and the immediate return (a job id). This lets an agent distinguish it from the direct sibling calls without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use: it is 'the ONLY way to run to the certified 252-day horizon', contrasted against the direct call which 'is capped at 60 days so it can answer inside a conversation'. It also names check_job as the polling alternative, so both the use and follow-up path are stated.

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

validate_strategyValidate a strategy specA
Read-onlyIdempotent

Parse and fingerprint one strategy spec WITHOUT running it. Use it to iterate on a spec cheaply before evaluate_strategies or rank_strategies: a grammar error comes back naming the field that was wrong, and a valid spec comes back normalised with its fingerprint. A spec looks like {"signal": {"kind": "momentum", "lookback_days": 1.0}, "portfolio": {"top_k": 5, "gross": 1.0}}. Runs no market.

NameRequiredDescriptionDefault
specYesOne strategy spec, for example {"signal": {"kind": "momentum", "lookback_days": 1.0}, "portfolio": {"top_k": 5, "gross": 1.0}}. `spec_version` may be left out and is then set to the current version.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description goes further by disclosing failure behavior (grammar errors name the offending field) and success behavior (normalised spec plus fingerprint), and it asserts no market is run. Return format is partly carried by the output schema, so 4 rather than 5.

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

Conciseness4/5

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

Front-loads the core action and the 'without running it' constraint in the first clause, then handles alternatives and behavior in two efficient sentences. The inline example is duplicated from the schema, a minor redundancy, but each sentence otherwise earns its place.

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 validation tool with an output schema and rich annotations, the description covers purpose, alternatives, failure and success behavior, and the no-side-effect guarantee. Nothing an agent needs in order to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter is fully documented, including the optional spec_version default. The description repeats the example spec that the schema already supplies, adding no format or syntax meaning beyond it, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb pair (parse and fingerprint) and resource (one strategy spec), plus the crucial scope qualifier 'WITHOUT running it.' It explicitly differentiates from the sibling tools evaluate_strategies and rank_strategies, so an agent can select it without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit when-to-use: 'iterate on a spec cheaply before evaluate_strategies or rank_strategies.' It names the alternative tools and the condition (cheap iteration) that selects this one, leaving little to inference.

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.10.1
    • Changedcheck_envelope1 field changed
      • addedInput schema / properties / preset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The preset the run uses, by name: pt-v1, pt-v2, pt-v3, pt-v4, pt-v5, pt-v6, pt-v7, pt-v8, pt-v9, pt-v10, pt-v11, pt-v12, pt-v13, pt-v14, pt-v15, pt-v16, pt-v18, pt-v19, pt-v20, pt-v21. Omit for the shipped default, pt-v21, the only preset the envelope certifies. Any other is answered as outside, with that preset's own measured record beside the answer; the measured roster mixes are granted only on pt-v19.",
        +  "title": "Preset"
        +}
    • Changedcheck_job1 field changed
      • changedInput schema / properties / job_id / description
        Previous value: -"An id from start_job, such as \"job-1\". Omit to list every job this server process holds."New value: +"An id exactly as start_job returned it. Omit to list every job this server process holds."
    • Addedclose_session
    • Changedevaluate_strategies2 fields changed
      • addedInput schema / properties / population
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "A shipped population of background traders to run beside, by name: standard, crowded. They share each strategy's market and react to its trading (populated mode), so a result says whether an edge survives other traders, and strategies no longer meet identical markets. Omit for isolated mode, the default. describe_simulator lists each population's traders.",
        +  "title": "Population"
        +}
      • addedInput schema / properties / preset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "A shipped model preset to run, by name: pt-v1, pt-v2, pt-v3, pt-v4, pt-v5, pt-v6, pt-v7, pt-v8, pt-v9, pt-v10, pt-v11, pt-v12, pt-v13, pt-v14, pt-v15, pt-v16, pt-v18, pt-v19, pt-v20, pt-v21. Omit for the shipped default, pt-v21, the only preset the realism envelope certifies; a result under any other carries a caveat saying it is outside the certification, with that preset's own measured record. describe_simulator lists every preset's record.",
        +  "title": "Preset"
        +}
    • Changedexplain1 field changed
      • addedInput schema / properties / preset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "A shipped model preset to run, by name: pt-v1, pt-v2, pt-v3, pt-v4, pt-v5, pt-v6, pt-v7, pt-v8, pt-v9, pt-v10, pt-v11, pt-v12, pt-v13, pt-v14, pt-v15, pt-v16, pt-v18, pt-v19, pt-v20, pt-v21. Omit for the shipped default, pt-v21, the only preset the realism envelope certifies; a result under any other carries a caveat saying it is outside the certification, with that preset's own measured record. describe_simulator lists every preset's record.",
        +  "title": "Preset"
        +}
    • Changedexplain_price_move1 field changed
      • addedInput schema / properties / preset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "A shipped model preset to run, by name: pt-v1, pt-v2, pt-v3, pt-v4, pt-v5, pt-v6, pt-v7, pt-v8, pt-v9, pt-v10, pt-v11, pt-v12, pt-v13, pt-v14, pt-v15, pt-v16, pt-v18, pt-v19, pt-v20, pt-v21. Omit for the shipped default, pt-v21, the only preset the realism envelope certifies; a result under any other carries a caveat saying it is outside the certification, with that preset's own measured record. describe_simulator lists every preset's record.",
        +  "title": "Preset"
        +}
    • Addedopen_session
    • Changedrank_strategies2 fields changed
      • addedInput schema / properties / population
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "rank_strategies refuses any population, because its paired test needs every strategy on the same market. Pass population to evaluate_strategies or run_stress_scenario instead.",
        +  "title": "Population"
        +}
      • addedInput schema / properties / preset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "A shipped model preset to run, by name: pt-v1, pt-v2, pt-v3, pt-v4, pt-v5, pt-v6, pt-v7, pt-v8, pt-v9, pt-v10, pt-v11, pt-v12, pt-v13, pt-v14, pt-v15, pt-v16, pt-v18, pt-v19, pt-v20, pt-v21. Omit for the shipped default, pt-v21, the only preset the realism envelope certifies; a result under any other carries a caveat saying it is outside the certification, with that preset's own measured record. describe_simulator lists every preset's record.",
        +  "title": "Preset"
        +}
    • Changedrun_stress_scenario2 fields changed
      • addedInput schema / properties / population
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "A shipped population of background traders to run beside, by name: standard, crowded. They share each strategy's market and react to its trading (populated mode), so a result says whether an edge survives other traders, and strategies no longer meet identical markets. Omit for isolated mode, the default. describe_simulator lists each population's traders.",
        +  "title": "Population"
        +}
      • addedInput schema / properties / preset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "A shipped model preset to run, by name: pt-v1, pt-v2, pt-v3, pt-v4, pt-v5, pt-v6, pt-v7, pt-v8, pt-v9, pt-v10, pt-v11, pt-v12, pt-v13, pt-v14, pt-v15, pt-v16, pt-v18, pt-v19, pt-v20, pt-v21. Omit for the shipped default, pt-v21, the only preset the realism envelope certifies; a result under any other carries a caveat saying it is outside the certification, with that preset's own measured record. describe_simulator lists every preset's record.",
        +  "title": "Preset"
        +}
    • Addedsession_fork
    • Addedsession_rewind
    • Addedsession_state
    • Addedsession_step
  2. 1 tool updatev0.1.1
    • Changedrun_stress_scenario1 field changed
      • addedInput schema / properties / fork_day
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Run both markets together for this many days, then split them and start the scenario on the first day after the split: day `fork_day` of the run. The scenario's events keep their spacing, and every strategy trades the shared days identically in both arms. 0 to days - 1. Only for a scenario made of interventions (a shipped document, or build_scenario with `shocks`); a macro path or a constructor pins the macro from day 0, so it has no fork point.",
        +  "title": "Fork Day"
        +}
  3. 13 tool updatesv0.1.0
    • First observedbuild_scenario
    • First observedbuild_universe
    • First observedcheck_envelope
    • First observedcheck_job
    • First observeddescribe_simulator
    • First observedevaluate_strategies
    • First observedexplain
    • First observedexplain_price_move
    • First observedlist_scenarios
    • First observedrank_strategies
    • First observedrun_stress_scenario
    • First observedstart_job
    • First observedvalidate_strategy

TDQS

A4.3/5.0

Scored across 19 tools

Disambiguation5/5

Despite many 'run' tools, the boundaries are explicitly drawn: evaluate_strategies (one seed) vs rank_strategies (many seeds, sign test) vs run_stress_scenario (shocked vs unshocked) vs start_job (only way to 252 days). explain vs explain_price_move are contrasted (roster-wide factors vs one name's draws), and the session family (step/state/fork/rewind/close) each has a distinct verb of effect. An agent can reliably pick the right tool.

Naming Consistency4/5

Mostly a clean snake_case verb_noun pattern (validate_strategy, evaluate_strategies, run_stress_scenario, build_universe, list_scenarios, check_job). The session tools use a noun_verb namespace (session_step, session_fork, session_rewind) while their brackets are verb_noun (open_session, close_session), and bare 'explain' breaks the pattern, but the deviations are minor and readable.

Tool Count4/5

19 tools is slightly heavy but each earns its place: 6 cover a full interactive session lifecycle, 3 cover strategy scoring at different fidelities, plus jobs, scenario/universe authoring, explanation, and read-only orientation tools. Nothing looks redundant enough to drop, though the surface is dense.

Completeness4/5

Coverage is strong: cheap validation, single- and multi-seed evaluation, stressed runs, causal explanation, background jobs for long horizons, envelope/realism checks, and full session control with forking/rewinding. Only marginal gaps (e.g. no consolidated cross-preset comparison or result export beyond jobs/session_state), which agents can work around.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server that provides AI agents with financial tools including real-time quotes, backtesting, technical analysis, and multi-exchange data via a simple CLI interface.
    2
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    An MCP server exposing a registry of paper-backed quantitative trading methods plus a deterministic, no-LLM decision helper for reproducible trading research.
    13
    39 PyPI
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that lets you talk to your AI trading assistant in plain English to research stocks, generate trade recommendations, manage a portfolio, and execute trades through natural language.
    MIT