desk
This server provides a comprehensive equity research and paper trading platform. Key capabilities include:
Retrieving financial statements, historical financial series, and derived metrics with full XBRL provenance.
Performing technical analysis covering trends, momentum, volatility, and key levels.
Accessing and searching SEC filings, including insider Form 4 transactions.
Tracking institutional holdings (13F) and congressional trades (STOCK Act).
Monitoring macro conditions with current snapshots and historical series.
Forecasting price distributions and path probabilities (without directional calls).
Screening markets for movers, most active stocks, and ranking candidates by relative strength.
Managing risk with desk-limit position sizing and a static risk policy.
Journaling trade theses with evidence, tracking them through open/close lifecycle.
Executing paper trades via a broker, with forced risk-approval flow, and reconciling positions.
Auditing performance with book scoring, individual thesis review, and desk health checks.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@deskanalyze AAPL with fundamentals, technicals, and macro"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Trading Desk
Multi-agent equity research for US markets, running on Claude Code subagents over MCP. Analysis-first: real money is never touched, and order flow goes to an Alpaca paper account.
Why this exists
Financial data is easy to fetch and easy to get wrong. US-GAAP XBRL concepts drift per company and over time, so reading a single hardcoded concept returns figures that are years stale with no error raised:
Ticker | Live concept | Correct FY revenue | Naive |
AAPL |
| $416.2B (FY25) | $62.9B — a 2018 figure |
NVDA |
| $215.9B (FY26) | correct, coincidentally |
MSFT |
| $331.8B (FY26) | $16.0B — a 2010 figure |
An agent given $62.9B for Apple writes a confident, completely wrong thesis. The whole design follows from preventing that.
Operating rules
Agents never compute and never recall. Every number comes from a tool call; ratios and indicators are calculated in Python.
Every value carries provenance — XBRL concept, period, form, accession, filing date — so any figure can be traced back to the filing.
Stale data raises. A number too old to answer the question is an error, not a footnote.
Concept resolution is code with tests, not a prompt instruction.
Related MCP server: ReadyTrader-Stocks
Status
Complete. Research, sizing, a scoreable record, the context around a name, paper execution that cannot be reached except through an approved thesis, and a loop that grades the calls afterwards.
EDGAR client — rate limited, disk cached, no API key required
Concept resolver with provenance and staleness enforcement
Golden tests (23) pinned to filed 10-Ks
deskMCP server, verified over stdioPhase 1 —
fundamentals+chartistagents,/analyzePhase 2 —
risk(veto) + journal,/journalPhase 3 —
filings,macro,screenerPhase 4 —
pilot, Alpaca paper execution behind risk approvalPhase 5 —
/postmortemcalibration loopPhase 6 —
capitol,oracle,ledgerPhase 7 —
/nimbusorchestrator
The agents
Ten specialists, each with a narrow remit and a matching tool allowlist. None of them computes anything; every figure comes from a tool call.
Agent | Answers | Explicitly does not |
| Is this a business worth owning? | Price, timing |
| Is this a reasonable moment? | Business quality |
| What did the company actually say? | Compute ratios |
| Does the environment support this? | Individual companies |
| Which names are worth researching? | Analyse them |
| What are better-informed holders doing? | Business, chart, price |
| How far, and how likely? | Which way |
| How large, and may it be taken at all? | Judge the thesis |
| What did the broker actually do? | Hold any view |
| What does the book say, and is it intact? | Hold any view |
Orchestration
/nimbus is the front door. It takes any request — a ticker, a question, a
half-formed worry — routes it to the specialists that can answer it, and
reconciles what comes back into one view.
It runs in the main thread rather than as a subagent, deliberately: an agent dispatching agents nests badly, and parallel dispatch is only available where the conversation is. Independent specialists go out in a single message and come back concurrently; their independence is what makes agreement between them worth anything.
Nimbus holds no view of its own. Every claim in its output came back from a
specialist in that session, and a figure it cannot attribute to a tool call is
one it must not state. It also defers rather than rebuilds — a full research
pass on a ticker is handed to /analyze, not reimplemented.
Command | Does |
| Routes anything to the right specialists and reconciles the answers |
| Full research pass on one ticker, sized and journalled |
| Reads, records and closes calls |
| Grades the closed book and reports what to change |
Money moves through exactly one sequence, and the orchestrator never shortens it:
research → risk approves → thesis journalled → place_order(thesis_id)A request to "just buy 100 shares" has no way to be expressed — place_order
takes a thesis id and nothing else.
The dashboard
A local Streamlit app over the same desk_mcp modules the agents call:
uv run --extra ui streamlit run desk_ui/Home.pyNo language model runs in it. Everything it shows — financials, metrics, technicals, sizing, forecasts, 13F and congressional disclosures, the journal, the scoreboard, desk health — is deterministic Python. Judgement stays in Claude Code, where the agents live; the dashboard is for the parts that were never judgement to begin with.
Page | Shows |
Home | Open calls, capital at risk, book integrity, missing credentials |
Research | Financials with their XBRL concepts, derived metrics, technicals, filings |
Scoreboard | Expectancy, calibration, per-call review |
Sizing & odds | Position sizing against the limits, and the probabilities the levels imply |
Smart money | 13F books with quarter-over-quarter changes, congressional trades, Form 4 |
Market | Macro snapshot, movers, relative strength, expected move |
Journal | Record and close calls |
The app inherits the desk's rules rather than restating them. Figures carry the
period and the concept they came from. A failed call renders as a named gap,
because an empty table reads as an answer. limitations are rendered inline
and never behind a collapsed panel — a limitation nobody reads is one that does
not exist.
Two journal rules are enforced in the form, since this is the one place a call can be written without an agent having read them first: a thesis will not record without a falsifier, and a position will not close without an exit price. Both are tested.
Exposing it
It binds to 127.0.0.1 via .streamlit/config.toml. Streamlit's own default
is 0.0.0.0, which publishes an external URL — unsuitable here, because the
app writes to the journal and Streamlit ships no authentication. Anyone
reaching the URL would be the operator.
Hosting it later means a reverse proxy with real authentication in front, and
DESK_UI_READONLY=1 unless writes are genuinely needed:
DESK_UI_READONLY=1 uv run --extra ui streamlit run desk_ui/Home.pyChanging the bind address alone is not enough.
Setup
uv sync
uv run pytest tests/golden -q # must be green before any agent workCredentials
Keys live in the environment, never in the repo — .mcp.json reads them via
${VAR} expansion. Put them in ~/.zshrc so they cannot be committed by
accident.
Variable | Where to get it | Needed by |
| app.alpaca.markets — switch the dashboard to Paper, then API Keys → Generate. Secret shows once. | Phase 1 ( |
| fredaccount.stlouisfed.org/apikeys — instant, free |
|
| Your own | optional; defaults in |
Paper trading needs no funding, identity check or approval — that applies only to live accounts.
Verify without exposing anything (the script prints presence and a masked prefix only, never a secret):
uv run python scripts/check_keys.pyData sources
Source | Provides | Auth |
SEC EDGAR | XBRL financials, filings, Form 4 insider, 13F institutional | none (User-Agent only) |
Alpaca | Bars, quotes, news, paper orders/positions | free API key |
FRED | Rates, curve, inflation | free API key |
House Clerk | Congressional STOCK Act disclosures | none |
Deliberately not used: yfinance (unofficial endpoints, silent empty
responses) and Stooq (now behind a JS proof-of-work wall). EDGAR is preferred
for fundamentals because it is the source of record rather than a scrape of it.
MCP tools
Tool | Returns |
| Full statement, 17 line items, each with provenance |
| Historical series for one line item |
| Margins, returns, growth, leverage, cash conversion |
| Trend, momentum, volatility, support and resistance |
| Supported line item keys |
| Recent filings, optionally filtered by form |
| A filing's text as filed, markup stripped, in windows |
| Verbatim passages around a term in a filing |
| Form 4 insider transactions |
| Rates, curve, inflation, jobs, vol, dollar — with changes |
| One macro series in detail |
| Discovery lists from the tape |
| Orders a symbol list by relative strength |
| Share count, capital at risk, every limit checked, verdict |
| The standing limits, each with its rationale |
| Records a call with its evidence and falsifiers |
| The book, open or closed |
| Resolves a call and computes realised R |
| Paper account equity, cash, buying power |
| Sends an approved thesis to the paper broker |
| Broker state |
| Unwind |
| Broker positions against journalled theses |
| Expectancy, win rate, payoff and calibration across closed calls |
| One call with its plan, its result and the gap between them |
| A manager's 13F book and its quarter-over-quarter changes |
| STOCK Act disclosures, filtered by ticker or member |
| Names appearing most across recent congressional filings |
| Expected move and terminal distribution over a horizon |
| Odds of target before stop, and the breakeven win rate |
| The desk's own record-keeping, audited for silent failures |
Risk limits
The risk agent holds a veto and does not exercise judgement about it — the
limits are policy, checked in Python, and quoted back with the reason they
exist. get_risk_policy returns them at runtime.
Limit | Value | Why |
Risk per trade | 1% of equity | Ten consecutive losses cost a tenth of the account, which is survivable |
Position size | 20% of equity | A tight stop makes a huge position look cheap; gaps do not respect stops |
Portfolio heat | 6% of equity | The total loss accepted if every open thesis fails at once |
Reward:risk | 2:1 minimum | Below it the strategy needs a win rate nobody here has demonstrated |
Stop distance | 1.5x ATR(14) | A stop inside daily noise is an exit schedule, not protection |
Correlation is the one call the checks cannot make: three 1% positions on the same driver are one 3% position in disguise, and the agent is instructed to veto that even when every numeric limit passes.
The journal
Theses are JSON files under theses/, one per call, written at the moment the
call is made — greppable, diffable, and reviewable alongside the code that
produced them. A thesis will not record without at least one falsifier, and
direction="watch" calls are recorded too: a watchlist name that ran away
without you is as informative as a trade that failed, and only one of the two
tends to get remembered. Realised R is computed on close from the recorded
entry and stop, so outcomes compare across positions of different sizes.
Set DESK_THESES_DIR to keep the book somewhere other than the repository.
Smart money
Three populations, three different signals, and conflating them is how this data gets misread. All of it is disclosed late; the discipline is refusing to describe stale filings in the present tense.
Source | Lag | What the filer knows |
Form 4 insider | 2 business days | Legally presumed to know something |
13F institutional | Quarter end, filed up to 45 days later | Managed the position six weeks ago |
Congress PTR | Up to 45 days, often late | Frequently an outside manager, not the member |
13Fs are aggregated per security. A manager with sub-advisers files the
same issuer on many lines — Berkshire reports Apple twelve times — so reading
the table row-wise reports a twelfth of the real position. Changes are computed
from share counts, never values: a holding marked down by the market is not
a sale, and treating it as one is simply wrong. Each position carries
implied_price_per_share as a self-check, because filings before 2023 reported
value in thousands rather than dollars.
Congressional amounts are statutory bands. $1,001 - $15,000 is what was
filed; a midpoint is a number nobody reported. Transactions live inside filing
PDFs, so they are parsed from extracted text and every row carries the document
link. Scanned filings that extract to nothing are reported under
unreadable_filings rather than dropped — a member whose filing cannot be read
is not a member who did not trade.
Forecasting
oracle produces distributions, never predictions, and the reason is worth
stating plainly.
Drift is assumed to be zero. Not because stocks do not rise, but because drift cannot be estimated from the data available: the standard error of a mean return measured from a year of daily data is roughly the annual volatility itself, so a measured 12% drift on a 30%-vol name carries an error bar of about ±30%. Volatility is estimable from the same sample to within a few percent. So the model forecasts the spread and refuses to forecast direction — which makes it useless for picking sides and useful for the questions intuition gets wrong.
Two models run on every question. Gaussian is analytically clean and wrong in the tails; bootstrap resamples the name's own history and carries its real skew. Where they disagree, the normal assumption is doing damage, and the gap is reported rather than averaged away.
The most decision-useful output is edge_vs_breakeven. A 2:1 setup must reach
target a third of the time simply to break even. When the modelled probability
sits below that, the geometry does not pay under zero drift and the entire case
has to come from the thesis — which the model cannot see and will not pretend
to.
analytic_unlimited_time is the closed form for a driftless walk, where the
odds depend only on the log distances to each barrier. Simulated figures sit
below it because the horizon expires; a large gap means the trade is not wrong,
it is being given too little time.
Barriers are checked at daily closes, so an intraday spike through the stop that closes back inside is not counted — real stop-outs are somewhat more likely than reported. Results are seeded, so the same question returns the same answer; a probability that moved on refresh could not be quoted in a thesis or checked afterwards.
Desk health
get_desk_health audits the desk rather than a company, because the failures
that corrupt every other number here are silent ones:
Finding | What it corrupts |
Unparseable thesis file |
|
Closed without an exit price | No realised R, ever; permanently outside every |
Open position with no dollar risk | Real exposure contributing nothing to portfolio heat |
Open thesis past its horizon | Still consuming heat while nobody watches it |
Missing credential | Names which tools will fail, before an agent commits to reasoning that needs them |
It runs offline and checks credentials for presence, not validity — a revoked key passes here and fails at the call site. Values are never read into a response.
The calibration loop
/postmortem grades what the journal recorded. It asks two questions that are
routinely confused for one:
Was the call right? Expectancy in R, win rate, payoff ratio — all computed in Python, all quoted rather than derived by an agent.
Was it right for the reason given? Every thesis stores falsifiers, and
review_thesis returns them unchecked. Answering them means dispatching the
chartist at the price level, or the filings agent at the disclosure, and
finding out what actually happened. A thesis that worked because of something
nobody in the evidence predicted is a losing process with a winning outcome,
and it is the result most likely to be repeated.
Three numbers do the calibration work:
Reading | What it means when it breaks |
|
|
| Realised R over planned R. Well below 1 means targets sit beyond where positions really get exited, and every approved reward:risk was optimistic |
| A swing call held four months was re-labelled after the fact, usually by not selling |
Nothing that produced no R is quietly counted as a scratch. Watch calls have no
R by design; a position closed without an exit price is a record-keeping
failure. Both appear under unscored with the reason, and both are excluded
from every performance figure rather than dragging it toward zero.
minimum_meaningful_sample is 20. Below it the skill is instructed to report
the numbers as descriptive and draw no inference — three losing trades is not
evidence of a broken process, and changing the rules on that basis is worse
than doing nothing.
Findings propose changes; they do not make them. A limit that should move is a
change to desk_mcp/risk.py, argued for separately — a rule rewritten in the
same pass that discovered it has never been argued with.
Execution
Paper only. The base URL is the paper endpoint, hardcoded with no environment
variable that redirects it, and the account number is checked for Alpaca's
PA prefix before any order is sent — live keys against the paper URL fail
closed rather than trading.
The gate is the shape of the function rather than an instruction to an agent:
place_order(thesis_id) # and nothing elseThere is no symbol parameter, no quantity, no price. All of it is read back out of the journal entry, which exists only because the risk officer approved it and only carries a share count the risk officer computed. An agent asked to buy 100 shares of something has no way to express that.
An order is refused when the thesis is closed, is a watch call, carries a vetoed verdict, was sized at zero shares, lacks an entry or stop, or already has an order attached — the last of which is what stops a retried call from opening a second position in the same name.
Orders go out as brackets, so the stop the risk officer sized against is
submitted with the entry rather than left to a later call that might never
happen. reconcile_positions compares what the broker holds against what the
journal knows about, which is the only way to see the untracked exposure that
portfolio heat is blind to.
Known limitations
Q4 quarterly gaps. Q4 gets no standalone 10-Q; it must be derived as FY minus Q1–Q3. Not yet implemented — quarterly series skip Q4.
Alpaca free tier is IEX-only (~2% of consolidated volume), so daily-bar volume is unreliable for swing setups. The price layer sits behind an adapter so Tiingo or another EOD source can be swapped in without touching agent code. Same seam later carries a non-US broker.
Non-US-GAAP filers (foreign issuers on IFRS) are not covered by the current concept registry.
The screener has no universe. It ranks a list you give it and reads the venue's movers and most-active tables. It cannot screen "all US software above $2B" — there is no fundamental universe behind it, and a themed list assembled by an agent is a recollection, not a screen. The
screeneragent is instructed to say which it is.Filing text is text.
get_filing_textstrips markup and returns what was filed. Tables survive as readable rows, but nothing is parsed into figures — a number read out of filing prose has no XBRL concept behind it, so preferget_financialswhenever the figure exists there.Macro needs its own key. Without
FRED_API_KEYthe macro tools fail with a message saying where to get one. Nothing else on the desk depends on them.A submitted order is not a filled one. A limit entry may never fill, and the position does not exist until it does. The
pilotagent is instructed never to describe one as the other.Portfolio heat only sees the journal. A position taken without recording it is invisible to the risk checks, so the heat number is exposure as recorded rather than exposure as held.
size_positionsays so in itslimitationson every call.13Fs are long US equity only. No shorts, no cash, no bonds, no foreign listings. Portfolio weights are weights within the reported slice, so a manager described as "22% in Apple" is 22% of the part they had to disclose.
Congress coverage is House-only and partial. The Senate publishes separately and is not read. Only the reports actually opened are searched, so an absent ticker means "not in the reports read", never "not traded" — the response states how many of how many were parsed.
Congressional trades are parsed from PDF text, with no structured source behind them. The same caveat as filing text, one step weaker: follow the document link before quoting a specific transaction.
Forecasts assume volatility persists and drift is zero. Neither holds across an earnings date, and the bands are wrong in both directions over one. The bootstrap resamples days independently, so it reproduces fat tails but not volatility clustering — real drawdowns arrive in consecutive sessions more often than the model allows.
get_desk_healthis offline. A reachable-but-broken API looks healthy, and a revoked credential passes a presence check.
Not financial advice
A research tool, not a prediction engine. /postmortem exists because calls
need to be scored honestly rather than remembered selectively — and a good
scoreboard is not a reason to trade larger. The limits do not move because
recent results were pleasant.
Available Tools
27 toolscancel_orderA
Cancel a working order.
Does not close a filled position — if the entry already filled, the
position remains open and must be closed explicitly.
Args:
broker_order_id: Order id returned by `place_order`.
| Name | Required | Description | Default |
|---|---|---|---|
| broker_order_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It adds a crucial caveat that cancelling a working order does not close a filled position, which is non-obvious and valuable. It does not cover all edge cases (e.g., idempotency, errors), but the disclosed behavior is significant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-line purpose, a critical caveat, and a simple Args section. Every sentence adds value with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and an output schema, the description covers the essential aspects: purpose, behavioral caveat, and parameter meaning. The caveat about filled positions is an important contextual edge case. The output schema handles return values, so no further description is necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only defines 'broker_order_id' as a string. The description adds essential semantics by stating it is 'Order id returned by `place_order`,' clarifying the parameter's origin and role, which fully compensates for the 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb and resource: 'Cancel a working order.' It also distinguishes itself from the sibling 'close_broker_position' by explicitly noting that this tool does not close filled positions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: when the order is still 'working.' It explicitly states when not to use it ('if the entry already filled') and implies an alternative (closing the position explicitly), though it does not name a specific alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_broker_positionA
Close an open position at market.
Closing at the broker does not close the thesis. Follow this with
`close_thesis` and the fill price so realised R is recorded.
Args:
symbol: Stock symbol of the position to close.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden. It discloses that the close executes at market and that it does not close the thesis, adding valuable context about side effects and next steps. It does not mention error cases, but for a simple one-parameter operation this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the core action in the first sentence and a critical workflow note immediately after. The Args section is simple and redundant with the schema, but does not add unnecessary length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only one parameter and an output schema exists, the description covers the essential workflow and key caveat (broker close vs thesis close). It does not describe behavior for invalid symbols or partial closes, but these are not critical for a straightforward market close operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds basic meaning to the `symbol` parameter by calling it a 'Stock symbol of the position to close', which clarifies the role of the parameter beyond the schema title. However, it largely restates the parameter name and does not provide format or validation details, so it only partially compensates for the 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states specifically 'Close an open position at market' with a clear verb and resource. It distinguishes from the sibling tool `close_thesis` by explicitly noting that closing at the broker does not close the thesis, making the tool's role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit sequential guidance: follow this tool with `close_thesis` and the fill price to record realised R. This clearly indicates when and how to use the tool in context, though it doesn't enumerate exclusions or alternative tools beyond the implied workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_thesisA
Close a thesis, recording how it actually resolved.
Realised R is computed from the recorded entry and stop, so the result is
comparable across positions of different sizes.
Args:
thesis_id: Identifier returned by `journal_thesis`.
outcome: One of "target_hit", "stopped_out", "closed_manual",
"expired", "invalidated".
exit_price: Fill price, where there was one.
note: What actually happened, especially if the thesis was right for
the wrong reason.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| outcome | Yes | ||
| thesis_id | Yes | ||
| exit_price | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses a key behavioral trait: 'Realised R is computed from the recorded entry and stop, so the result is comparable across positions of different sizes.' It also clarifies the outcome parameter with allowed values and explains the note field's purpose. It does not mention side effects or error conditions, but it provides meaningful insight into how the tool behaves beyond the mere action of closing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It starts with a one-sentence purpose, adds a brief note about Realised R for context, then lists parameters in a clear arg format. There is no verbose filler. Every sentence earns its place, and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has moderate complexity with four parameters and an output schema. The description explains the core purpose, parameter meanings, and a calculation detail. It does not explain the return value, but an output schema exists, so that's acceptable. It could be improved by clarifying side effects or differences from close_broker_position, but overall it is sufficiently complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, so the description fully compensates by documenting all four parameters: thesis_id (identifier from journal_thesis), outcome (with enumerated strings), exit_price (fill price, where there was one), and note (actual events, especially for wrong-reason cases). This adds significant meaning beyond the bare schema, making parameter usage clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Close a thesis, recording how it actually resolved.' This uses a specific verb ('close') and resource ('thesis'), and adds the purpose of recording resolution. The name alone is unambiguous, and the description distinguishes it from sibling tools like close_broker_position by focusing on the thesis lifecycle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: you use this tool when you need to close a thesis and record its outcome. It does not explicitly mention alternatives or exclusions, such as when to use close_broker_position instead. However, the purpose is clear enough that an agent can infer the appropriate context, but explicit guidance on when not to use it is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountA
Paper account state: equity, cash, buying power, positions value.
Refuses to return anything for an account it cannot prove is a paper
account. Use the `equity` here as the input to `size_position` rather than
assuming a figure.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses a notable behavioral trait: refusing to return data for accounts it cannot prove are paper accounts. It does not mention safety, permissions, or rate limits, but for a simple read-only tool this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with the main purpose, followed by a behavioral warning and practical usage advice. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the zero-parameter input and existing output schema, the description covers the essential purpose, the paper-account restriction, and how to use the result. It could mention what happens when it refuses, but overall it is complete for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters and the input schema is empty. The description mentions the output fields rather than parameters, but with no schema coverage burden, the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as providing paper account state including equity, cash, buying power, and positions value. It distinguishes from siblings like get_broker_positions by specifying 'paper account,' though it lacks an explicit verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides context that this is for paper accounts and recommends using the returned equity as input to size_position. However, it does not explicitly state when to prefer this over alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_broker_ordersA
Orders at the paper broker, newest first.
Args:
status: "open", "closed" or "all".
limit: Maximum orders to return.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| status | No | open |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It states the ordering (newest first) but does not explicitly confirm this is a read-only operation, mention any side effects, or describe pagination behavior. For a getter, the absence of explicit read-only disclosure or note about absence of side effects is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and front-loaded. The first line states the core purpose and ordering, followed by a compact parameter list. Every sentence earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter retrieval tool with an output schema, the description covers essential usage aspects: what is returned (orders), ordering, and parameter meanings. It lacks explicit return-structure details, but the output schema compensates. No critical gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description fully explains both parameters, going beyond the schema: status lists accepted values ('open', 'closed' or 'all') and limit defines a maximum count. This is essential given 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (orders at the paper broker) and provides an ordering (newest first), which distinguishes it from sibling tools like get_broker_positions. However, it lacks an explicit verb like 'retrieves' or 'lists', relying on the tool name to convey the action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the tool name and description (retrieving broker orders), but no explicit guidance is given about when to use this tool versus alternatives such as get_broker_positions or place_order. No exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_broker_positionsA
Open positions at the paper broker, with unrealised P&L.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It adds useful context: the operation is at the 'paper broker' and includes unrealised P&L, indicating a read-only snapshot. However, it does not disclose potential return format, ordering, pagination, or data freshness, which would be valuable for a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, front-loaded with 'Open positions', and contains no filler or redundant terms. It is concise and structurally ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema, the description sufficiently explains what is returned. It includes useful context about the paper broker and unrealised P&L. However, it does not mention potential limitations like the current date range or position status, which could be relevant in some contexts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so the baseline is 4. The description correctly implies no arguments are needed and adds no conflicting information. No additional parameter semantics are required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Open positions at the paper broker, with unrealised P&L' uses a specific verb ('get') and resource ('broker positions'), and adds scope ('paper broker') and content details ('unrealised P&L'). This clearly distinguishes it from sibling tools like get_broker_orders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or alternative guidance is provided. The description implies retrieval of open positions, which is a clear context, but it does not name alternatives such as get_broker_orders or close_broker_position. This is adequate but could be improved with explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_filingsB
Recent SEC filings for a company, newest first.
Args:
ticker: Stock symbol.
forms: Optional filter, e.g. ["10-K", "8-K"]. Omit for all forms.
limit: Maximum filings to return.
| Name | Required | Description | Default |
|---|---|---|---|
| forms | No | ||
| limit | No | ||
| ticker | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only mentions ordering ('newest first') but omits other behaviors like pagination, error handling, or rate limits. The read-only nature is implied but not explicitly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with a one-line summary followed by a labeled Args section. Each parameter explanation is brief and useful, with no superfluous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essentials for a simple list tool, but lacks usage context and any mention of alternatives. Since no annotations are present, the description could do more to clarify behavior, though the existence of an output schema reduces the need to explain return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides clear meanings for all three parameters: ticker is a stock symbol, forms is an optional filter with an example, and limit is the maximum count. This fully compensates for the 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns recent SEC filings for a company, ordered newest first. It is specific about the resource and action, but does not explicitly differentiate from sibling tools like get_filing_text or search_filing_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of use cases, prerequisites, or exclusions, leaving the agent to infer when this is the appropriate choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_filing_textA
The text of a filing as filed, markup stripped, in windows.
Use this when the numbers raise a question they cannot answer — a margin
that moved, a quarter that beat and sold off anyway, a net income figure
that outran operating income. `get_filings` gives you the date; this gives
you what the company actually said.
Large filings are returned in windows. `truncated` and `next_offset` tell
you whether there is more; a silently cut filing reads like a complete one.
Prefer `search_filing_text` when you know what you are looking for.
Args:
ticker: Stock symbol.
accession: Specific filing accession number. Takes precedence.
form: Read the newest filing of this form instead, e.g. "10-Q".
offset: Character offset to start from, for paging.
max_chars: Characters to return, capped at 100,000.
| Name | Required | Description | Default |
|---|---|---|---|
| form | No | ||
| offset | No | ||
| ticker | Yes | ||
| accession | No | ||
| max_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and excels. It discloses key behaviors: markup stripping, pagination via windows, truncation signaling through `truncated` and `next_offset`, and the hierarchy of `accession` over `form`. Also notes the `max_chars` cap of 100,000, preventing silent data loss.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, starting with a one-sentence summary, followed by usage context, important pagination behavior, and an Args list. Every sentence adds value—no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema (not shown), the description still provides essential context: purpose, usage scenarios, pagination mechanics, and parameter semantics. It covers all aspects an agent needs to correctly select and invoke the tool, making it complete for practical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description fully compensates. Each parameter is explained with its role, including special behaviors: `accession` takes precedence, `form` selects newest filing of that form, `offset` for paging, and `max_chars` with an explicit cap. This adds significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence clearly states what the tool does: retrieves filing text as filed, with markup stripped, in windows. It distinguishes itself from siblings by noting that `get_filings` provides dates while this tool provides the actual text, and `search_filing_text` is for targeted searches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool: 'Use this when the numbers raise a question they cannot answer' with concrete examples. It also gives an alternative: 'Prefer `search_filing_text` when you know what you are looking for.' This provides clear decision rules for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_financial_historyA
Historical series for one line item, oldest to newest.
Use this for growth rates and trends. Each point states its own fiscal
year and source filing, so a restated figure is visible as such.
Args:
ticker: Stock symbol, e.g. "NVDA".
line_item: One of the supported keys, e.g. "revenue", "net_income".
period: "annual" or "quarterly".
limit: Maximum number of periods to return.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| period | No | annual | |
| ticker | Yes | ||
| line_item | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It adds meaningful behavioral context: ordering ('oldest to newest'), per-point fiscal year and source filing, and visibility of restated figures. This goes well beyond what the schema provides, though it omits failure or availability details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a one-sentence summary, followed by a brief use-case sentence and a structured Args list. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple data-retrieval nature and presence of an output schema, the description covers purpose, usage, parameters, and key behavioral details. It is complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description's Args section documents every parameter with examples ('NVDA', 'revenue', 'net_income', 'annual' vs 'quarterly', maximum periods). This fully compensates for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Historical series for one line item, oldest to newest.' It clearly distinguishes from sibling tools by emphasizing 'one line item' and the chronological ordering, which sets it apart from broader financials or metrics tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states 'Use this for growth rates and trends,' conveying when the tool is appropriate. However, it does not name alternative tools or exclusions, so it lacks explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_financialsA
Latest full financial statement for a company, from SEC XBRL filings.
Returns every available line item (revenue, margins, cash flow, balance
sheet) with the concept, period and filing each value came from. Line
items a company does not report appear under `unavailable` rather than
causing an error.
Args:
ticker: Stock symbol, e.g. "AAPL".
period: "annual" or "quarterly".
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | annual | |
| ticker | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden of behavioral disclosure. It does reveal that missing line items appear under 'unavailable' and states the data source and return fields (concept, period, filing). However, it omits potential behaviors like authentication requirements, rate limits, or data freshness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured with a clear summary paragraph followed by an Args list. Every sentence serves a purpose—covering what it does, what it returns, how missing items behave, and parameter definitions—without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool, the description covers the primary return structure (concept, period, filing) and the 'unavailable' behavior for missing items. Combined with an output schema, this is sufficiently complete, though it doesn't address edge cases like invalid tickers or empty financial statements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The Args section explicitly defines ticker with an example and period with allowed values ('annual' or 'quarterly'), compensating for the schema's 0% description coverage. This adds practical meaning beyond the bare schema properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves the latest full financial statement from SEC XBRL filings, listing all line items. It distinguishes from siblings by emphasizing 'full' and 'every available line item,' though it does not explicitly name alternative tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives such as get_financial_history or get_metrics. The description only explains what it does, leaving usage decisions to the agent without any exclusions or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_insider_activityA
Recent Form 4 insider transaction filings for a company.
Args:
ticker: Stock symbol.
limit: Maximum Form 4 filings to return.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| ticker | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It explains that 'limit' controls the maximum number of filings returned, which adds some behavioral context. However, it does not disclose any side effects, privileges, or additional behavior, though as a read-only operation this is less critical. The description offers minimal but adequate transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with a two-sentence purpose followed by a compact arg list. It front-loads the main purpose and avoids any wasted words, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is an output schema present, so return values are covered externally. The description gives the essential purpose and parameter details, but it does not clarify what 'Recent' means (e.g., time window) or any sorting/ordering. For a simple retrieval tool, this is nearly complete, with only a minor gap about the recency definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage, the description clearly explains both parameters: 'ticker: Stock symbol' and 'limit: Maximum Form 4 filings to return.' This adds meaningful semantics beyond the bare schema types and defaults, fully compensating for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific resource: 'Recent Form 4 insider transaction filings for a company.' It uses a specific verb 'get' and distinguishes itself from sibling tools like get_filings and get_filing_text by focusing on insider activity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for insider transaction data based on the Form 4 specificity, but it does not explicitly mention when to use this tool versus alternatives, nor does it provide exclusions or alternative tool names. This is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_macro_seriesA
One macro series in detail, with its 1-, 3- and 12-month changes.
Args:
key: Series key, e.g. "treasury_10y", "core_cpi", "vix". Call
`get_macro_snapshot` to see them all.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It discloses that the response includes 1-, 3-, and 12-month changes, but it does not mention error handling, data source, or explicitly confirm read-only behavior (though the name 'get' implies it). This is minimal but not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: two sentences plus a compact args block. It is front-loaded with the main purpose and includes only essential information without redundancy. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter getter with an output schema, the description covers the essentials: what it does, parameter meaning, and how to discover keys. The phrase 'in detail' is slightly vague, but the output schema likely specifies the return structure. It is complete enough for a simple retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only specifies 'key' as a string, but the description gives concrete examples ('treasury_10y', 'core_cpi', 'vix') and directs users to get_macro_snapshot to see all valid keys. This fully compensates for the 0% schema description coverage and makes the parameter semantics clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves one macro series in detail, including 1-, 3-, and 12-month changes. This verb+resource structure distinguishes it from siblings like get_macro_snapshot, and the example keys (e.g., 'treasury_10y') add clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (for a specific series) versus get_macro_snapshot (to see all series). It provides example keys and advises calling the sibling to discover available keys, but does not explicitly state exclusions or alternative conditions beyond that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_macro_snapshotA
Current macro conditions from FRED: rates, curve, inflation, jobs, vol.
Every reading carries its FRED series id, observation date and 1-, 3- and
12-month changes, computed against the last real print rather than a
calendar date. Series that fail are listed under `unavailable` rather than
taking the whole snapshot down.
Rates and inflation recalled from memory are wrong by whole percentage
points. Always read them here.
Args:
series: Optional subset, e.g. ["treasury_10y", "curve_10y_2y"]. Omit
for all of them.
| Name | Required | Description | Default |
|---|---|---|---|
| series | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility. It discloses the data content (FRED series id, observation date, 1/3/12-month changes), the computation basis (last real print vs calendar date), and failure handling (unavailable list). This is exemplary behavioral transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then provides essential details in a compact, structured way. Every sentence adds value: data content, computation nuance, failure handling, and parameter guidance. No redundant text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values need not be explained. The description covers data provenance, change calculations, error resilience, and parameter usage. It is complete for the tool's complexity, with no obvious gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains the `series` parameter with an example (["treasury_10y", "curve_10y_2y"]) and states that omitting it returns all series. This adds meaningful semantics beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns current macro conditions from FRED, listing specific categories (rates, curve, inflation, jobs, vol). This is a specific verb+resource (get + macro snapshot) and distinguishes itself from siblings like get_macro_series by being a composite snapshot with computed changes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs to always read rates and inflation here, warning that memory is wrong by whole percentage points. This provides a strong when-to-use directive and a when-not-to-use (memory). It also explains the optional `series` parameter for subsetting, giving clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_moversA
Today's largest percentage gainers and losers.
A starting list, not a signal — most large single-day moves are news the
market has already priced.
Args:
top: How many of each to return, capped at 50.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the cap of 50 and that 'top' returns 'each' (gainers and losers), and adds a caveat about the data's nature. But it does not describe pagination, sorting, or what happens with no arguments, though an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and well-structured: a one-line purpose, a relevant caveat, and a clear args section. Every sentence earns its place, and it is front-loaded with the main action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and an output schema, the description covers purpose, parameter semantics, and a key behavioral caveat. It lacks explicit alternative references but is otherwise complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates by explaining 'top' as 'How many of each to return, capped at 50,' adding meaning beyond the raw schema fields. This is sufficient for the single parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns today's largest percentage gainers and losers, which is a specific verb+resource+scope. It distinguishes from siblings like get_most_active by focusing on percentage moves rather than volume or activity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers context with 'A starting list, not a signal' and notes that large single-day moves are already priced, implicitly warning against overuse. However, it does not name alternative tools or explicitly state when to use this versus another tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metricsA
Derived financial metrics for a company: margins, returns, growth, leverage.
Computed from SEC filings rather than estimated. Covers gross/operating/net
margin, R&D intensity, free cash flow and FCF margin, cash conversion,
debt/equity, net debt, ROE and ROA (on average balances where available),
and YoY plus CAGR growth for revenue, net income and operating cash flow.
Each metric lists the line items it was computed from and the period it
covers. Prefer this over deriving ratios yourself from `get_financials`.
Args:
ticker: Stock symbol, e.g. "AAPL".
history_years: Periods to span when computing growth rates.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | ||
| history_years | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full disclosure burden. It reveals methodology ('Computed from SEC filings rather than estimated'), notes a caveat ('on average balances where available'), and discloses output transparency ('Each metric lists the line items it was computed from and the period it covers'). It does not mention rate limits, error behavior, or update frequency, but these are less critical for a read-only metrics tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized: a one-line summary, a methodology paragraph, a line about output structure, an explicit usage preference, and a concise Args list. Every sentence provides distinct value, with no fluff or repetition. Front-loading with the core purpose makes it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has moderate complexity (2 params, no nested objects) and an output schema, so the description need not detail return values. It covers data source, metric list, methodology caveats, output transparency, and sibling differentiation. This is complete for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, but the description's Args section compensates fully. It explains 'ticker' as a stock symbol with an example, and clarifies 'history_years' as 'Periods to span when computing growth rates,' which adds meaning beyond the schema's name and default. This is high-value parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Derived financial metrics for a company' and enumerates exact metric categories (margins, returns, growth, leverage). It clearly distinguishes from siblings by stating 'Prefer this over deriving ratios yourself from get_financials,' naming the alternative tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool: whenever derived ratios are needed, and when not to use it (don't derive ratios yourself from get_financials). It also states the data source (SEC filings rather than estimated), giving context for trustworthiness. This is clear usage guidance with a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_most_activeA
The day's most heavily traded names.
Args:
by: "volume" or "trades".
top: How many to return, capped at 50.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | volume | |
| top | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It adds useful constraints (top capped at 50 and by options), but does not explicitly state that this is a read-only operation or describe any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and front-loaded, with a one-sentence purpose and two bullet-point argument explanations. No unnecessary content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple getter with two parameters and an output schema, the description covers the core purpose and parameter semantics. It lacks usage guidance, but that is addressed in a separate dimension; overall it is adequate for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are meaningfully explained beyond the schema: 'by' is defined as 'volume' or 'trades', and 'top' is described as how many to return with a cap of 50. This fully compensates for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns the day's most heavily traded names, which is a specific resource and action. However, it does not distinguish this from sibling tools such as get_market_movers, so it lacks sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description only defines the output and parameters, with no mention of use cases, exclusions, or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_risk_policyA
The desk's standing risk limits, each with the reasoning behind it.
Quote these when explaining a veto, rather than paraphrasing them.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden of disclosure. It explains the content and gives a usage directive, but it does not mention whether this is a read-only operation, any rate limits, or how the data should be interpreted. This is adequate but sparse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the primary purpose and followed by a practical usage note. Every word earns its place, with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with an output schema, the description is complete enough: it states what is returned and how to use it. It could optionally note that it is a safe read-only call, but this is not essential given the output schema and lack of parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema is empty, so the description needs to add no parameter-level meaning. The baseline of 4 applies here because there is nothing to describe beyond what the schema already shows.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: it retrieves the desk's standing risk limits along with the reasoning behind each. This specific verb+resource framing distinguishes it from sibling tools like get_financials or place_order, which address different domains.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit usage context: quote these limits verbatim when explaining a veto. While it does not name alternative tools, the veto-explanation scenario gives a concrete 'when to use' signal, which is more than many tool descriptions offer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_technicalsA
Technical picture for a symbol: trend, momentum, volatility, key levels.
Computed from daily bars on the consolidated SIP tape, so volume is the
full market rather than a single venue. Returns moving-average structure,
RSI, ATR (with stop-distance guidance), relative strength versus a
benchmark, drawdown from the one-year high, and clustered support and
resistance annotated with what each level does at the current price.
Anything that could not be computed from the available history is null and
explained under `limitations` rather than approximated.
Args:
ticker: Stock symbol, e.g. "NVDA".
benchmark: Symbol for relative strength, default "SPY".
lookback_days: Calendar days of history to pull. 500 gives a 200-day
moving average enough trading sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | ||
| benchmark | No | SPY | |
| lookback_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It transparently explains data source (SIP tape), the fact that volume is full-market, and the null-handling behavior under `limitations`. It lacks explicit read-only confirmation or rate-limit information, but the read-only nature is strongly implied by the tool name and content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the purpose. Each paragraph earns its place, covering data source, return contents, null behavior, and parameters. The Args list is concise yet informative, with no repetition of schema defaults.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the presence of an output schema, the description is thorough. It covers data source, parameter semantics, null handling, and expected return components, making it fully sufficient for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% coverage, but the description's Args section provides meaningful explanations for all three parameters, including the role of benchmark and how lookback_days relates to the 200-day moving average. This goes well beyond the bare schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose as providing a 'technical picture for a symbol' and enumerates specific components (trend, momentum, volatility, key levels). It differentiates from sibling tools like get_financials and get_metrics by focusing on technical analysis from daily bars, with details such as moving-average structure, RSI, and ATR.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for obtaining daily-bar technicals, emphasizing the consolidated SIP tape and full-market volume, which is useful context. However, it does not explicitly state when to prefer this tool over alternatives or provide exclusions, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_thesisA
One recorded thesis in full, including its evidence and falsifiers.
Args:
thesis_id: Identifier returned by `journal_thesis`.
| Name | Required | Description | Default |
|---|---|---|---|
| thesis_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It adds that the result includes evidence and falsifiers, but doesn't state whether this is a read-only operation, error behavior, or any prerequisites. The verb 'get' implies retrieval, but that is minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, directly states purpose and parameter origin, with no filler. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one required param) and an output schema exists, so the description adequately describes the return envelope. It covers the key contextual link to journal_thesis, though it could mention when to use it relative to list_theses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by defining thesis_id as 'Identifier returned by journal_thesis,' providing provenance. This adds meaning beyond the bare string schema, though it doesn't detail format or validation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'get' and names the resource ('recorded thesis') with its scope ('in full, including its evidence and falsifiers'). It distinguishes from sibling list_theses/journal_theses by indicating a single full thesis, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides context: use with a thesis_id returned by journal_thesis, which implies a workflow. However, it lacks explicit exclusions or comparison to list_theses or close_thesis, so the guidance is only implied rather than clearly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
journal_thesisA
Record a call so it can be scored later, and return the stored thesis.
Write this at the moment the call is made. Evidence and falsifiers cannot
be reconstructed honestly once the outcome is known, which is the whole
reason the journal exists.
Record `direction="watch"` when the conclusion was to take no position —
a watch call that would have worked is as informative as a trade that did.
Args:
ticker: Stock symbol.
thesis: The call, in plain language. What this is and what to do.
falsifiers: Observations that would prove the thesis wrong — price
levels, a filing, a metric crossing a threshold. Required.
direction: "long", "short" or "watch".
horizon: "swing", "positional" or "long_term".
conviction: Free text, e.g. "low", "medium", "high".
entry: Entry price. Required for a long or short.
stop: Stop price. Required for a long or short.
target: Target price.
reward_risk: Reward:risk, as reported by `size_position`.
shares: Share count, as sized by `size_position`.
dollar_risk: Capital at risk, as sized by `size_position`.
risk_verdict: The `verdict` returned by `size_position`.
evidence: Supporting figures, each ideally {"claim", "source",
"period"}, so the thesis can be audited against the filings.
gaps: Data that was unavailable, stale or unresolved at the time.
| Name | Required | Description | Default |
|---|---|---|---|
| gaps | No | ||
| stop | No | ||
| entry | No | ||
| shares | No | ||
| target | No | ||
| thesis | Yes | ||
| ticker | Yes | ||
| horizon | No | swing | |
| evidence | No | ||
| direction | No | watch | |
| conviction | No | medium | |
| falsifiers | Yes | ||
| dollar_risk | No | ||
| reward_risk | No | ||
| risk_verdict | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the persistence behavior ('stored thesis'), the requirement that falsifiers be provided, and the ethical rationale for immediate recording. It could further clarify whether this overwrites existing entries or is append-only, but for a journaling tool the described side effect is sufficiently clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is divided into an opening purpose/ethics paragraph and a labeled Args list. There is no fluff; every line adds semantic value. For a tool with 15 parameters, the length is justified and the format makes it scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 15 parameters with conditional requirements and an output schema. The description covers all parameters, provides usage timing, explains return value, and integrates references to sibling tools like size_position. It is complete enough for an agent to invoke and understand the result without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description fully compensates. Every parameter is explained: falsifiers are defined with examples, evidence suggests a structure, entry/stop are marked conditionally required, and direction/horizon/conviction list their allowed values. This surpasses the schema's bare structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Record a call so it can be scored later, and return the stored thesis.' This clearly states the verb (record), resource (call/thesis), and purpose (scoring later). It also distinguishes itself from sibling tools like list_theses and get_thesis by focusing on the write operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong timing guidance: 'Write this at the moment the call is made' and explains why that matters. It also clarifies when to use direction='watch'. However, it does not explicitly state when NOT to use the tool or name alternative tools for retrieval, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_line_itemsC
Financial line items this server can resolve.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden of behavioral disclosure. It only mentions a capability ('can resolve') without describing what the tool actually does, whether it's read-only, what it returns, or any side effects. This is essentially no behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely short but under-specified. It's a vague fragment rather than a concise, informative statement. It doesn't earn its place because it fails to communicate the tool's function effectively.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no parameters and an output schema, the description is incomplete because it doesn't clearly state what the line items are, how they are sourced, or how to interpret the result. A simple list tool still needs a clear purpose statement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema provides full coverage. Per the rubric, 0 params warrants a baseline of 4; the description doesn't need to add parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is a noun phrase, not a clear verb+resource. It essentially restates the tool name with the qualifier 'this server can resolve,' which doesn't clearly state the action of listing or returning line items. It doesn't distinguish from sibling tools like get_financials.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no context, prerequisites, or examples. The intended usage is only implied by the name and vague description, but no explicit direction is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_thesesB
Recorded theses, newest first.
Args:
ticker: Optional symbol filter.
status: Optional "open" or "closed" filter.
limit: Maximum theses to return.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| status | No | ||
| ticker | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose the ordering behavior ('newest first') and optional filtering (ticker, status, limit), which is useful. However, it does not explicitly state that the operation is read-only or describe any side effects, error conditions, or scope limitations beyond the listed arguments.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exceptionally concise, using a short opening phrase and a clean 'Args:' block to document parameters. There is no wasted wording or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with three optional parameters and an output schema, the description covers the core purpose, ordering, and parameters. However, it omits any usage guidance or contextual examples, making it slightly incomplete for an agent that needs to decide when to invoke this tool over others.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must compensate. It provides clear meanings for all three parameters: ticker as an optional symbol filter, status as an optional 'open' or 'closed' filter, and limit as the maximum number to return. This adds significant value beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Recorded theses, newest first,' identifying the resource and ordering. The tool name 'list_theses' clarifies the action, and it is distinguishable from siblings like get_thesis or close_thesis. However, the description lacks an explicit verb like 'List' or 'Retrieve,' making it slightly less direct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as get_thesis or close_thesis. The description only lists parameters and does not mention use cases, exclusions, or preferred scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
place_orderA
Send a journalled, risk-approved thesis to the paper broker.
Takes a thesis id and nothing else, by design. Symbol, share count, entry,
stop and target all come from the journal entry, which exists only because
the risk officer approved it. There is no way to place an order this desk
did not size.
Refuses when: the thesis is closed, is a watch call, carries a vetoed risk
verdict, was sized at zero shares, lacks an entry or stop, or already has
an order attached. Orders go out as brackets, so the stop is submitted with
the entry rather than left to a later call.
A submitted order is not a filled one. Check `get_broker_orders`.
Args:
thesis_id: Identifier returned by `journal_thesis`.
| Name | Required | Description | Default |
|---|---|---|---|
| thesis_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It clearly states that orders are sent to a paper broker, that they go out as brackets, and that submission does not mean fill. It also enumerates refusal conditions, providing transparency about failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured: a one-line purpose, then key constraints, refusal conditions, a note on bracket behavior, and a pointer to a related tool. No sentence is wasted; the length is justified by the richness of safety-critical information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity as a side-effecting order placement, the description covers the preconditions (risk approval), the exact input, the operational behavior (brackets), and the post-submission expectation (check get_broker_orders). The presence of an output schema means return-value details are handled separately, so the description is appropriately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only the parameter name and type with no description. The tool description compensates by explaining that thesis_id is 'the identifier returned by journal_thesis.' This gives the agent exactly the semantic information needed to invoke the tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Send a journalled, risk-approved thesis to the paper broker.' This clearly distinguishes the tool from siblings like journal_thesis (creates the thesis) and size_position (sizes it). It states exactly what the tool does and its scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use the tool (for placing orders from approved theses) and lists refusal conditions that act as when-not-to-use guidance. It also points to get_broker_orders for checking fills, effectively directing users away from using this tool for that purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rank_candidatesA
Order a candidate list by relative strength, with supporting measures.
Turns a raw list into a shortlist worth spending the research agents on.
Returns trend structure, distance from the 50-day, RSI, ATR as a percentage
of price and drawdown from the one-year high for each name. Symbols whose
history could not be retrieved appear under `unavailable` rather than
quietly dropping out.
This orders candidates; it does not judge them.
Args:
symbols: Up to 40 symbols. Each costs a separate history request.
benchmark: Symbol for relative strength, default "SPY".
lookback_days: Calendar days of history per symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| symbols | Yes | ||
| benchmark | No | SPY | |
| lookback_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses concrete behavioral details: symbols with missing history appear under 'unavailable' rather than being silently dropped, each symbol costs a separate history request (rate/cost implication), and the tool returns specific metrics (trend, RSI, ATR, drawdown). This goes well beyond a generic read-only expectation, though it does not mention edge cases like invalid symbols or network errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a one-sentence summary, a supporting paragraph on usage and outputs, a clear non-goal statement, and a compact Args section. Every sentence adds information; there is no fluff or repetition. The front-loading makes the core purpose immediately obvious.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description enriches context by explaining the 'unavailable' behavior, the nature of the metrics, and the per-symbol cost. The tool has only three parameters and no nested objects, so the description covers the full decision-making surface. It is complete for both selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain all parameters, and it does so thoroughly. 'symbols' is described with a limit and per-symbol cost, 'benchmark' is explained as the relative-strength reference with default SPY, and 'lookback_days' is defined as calendar days of history. This adds meaning the raw schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb phrase 'Order a candidate list by relative strength', immediately distinguishing this as a ranking/screening tool compared to sibling data-retrieval tools. It further clarifies the output purpose ('shortlist worth spending the research agents on') and explicitly states what it does not do ('does not judge them').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Turns a raw list into a shortlist worth spending the research agents on' provides clear context for when to use this tool (as a pre-research screening step). It also gives an explicit non-use ('does not judge them') to set expectations. However, it does not name alternative tools, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reconcile_positionsA
Compare broker positions against open journalled theses.
Portfolio heat is computed from the journal, so a position held without a
thesis is exposure the risk checks cannot see. This reports both kinds of
mismatch: untracked positions, and theses whose entry never filled.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It clearly states the tool 'reports' mismatches and enumerates the two kinds reported. The verb 'Compare' and 'reports' imply a read-only operation, though it doesn't explicitly confirm no side effects. The added context about portfolio heat is useful 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the main purpose. The subsequent sentences add valuable rationale and detail about mismatch types without waste. Every sentence contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema, the description fully explains what it does, why it matters, and what it reports. It is complete for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema confirms complete coverage. The description therefore doesn't need to explain parameter usage; it adds meaning by describing what is compared and reported, which is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resources: 'Compare broker positions against open journalled theses.' This clearly distinguishes it from siblings like get_broker_positions or list_theses, as it focuses on reconciliation between the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains why this tool is needed — portfolio heat comes from the journal, so positions without theses are invisible to risk checks. This implies when to use it (to find untracked positions or unfilled theses), but it doesn't explicitly state exclusions or name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_filing_textA
Passages of a filing around every occurrence of a term, verbatim.
Far cheaper than paging a 10-K to find the one paragraph that explains a
tax benefit or a goodwill charge. No match means the term is absent from
this document, not that the fact is absent from the company's filings.
Args:
ticker: Stock symbol.
query: Term to find, e.g. "stock-based compensation".
accession: Specific filing accession number. Takes precedence.
form: Search the newest filing of this form instead, e.g. "10-K".
context: Characters of surrounding text per hit.
max_hits: Maximum passages to return.
| Name | Required | Description | Default |
|---|---|---|---|
| form | No | ||
| query | Yes | ||
| ticker | Yes | ||
| context | No | ||
| max_hits | No | ||
| accession | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that results are verbatim passages, highlights that this is cheaper than paging a full filing, and explains the meaning of a no-match result. It also documents behavioral nuances like accession precedence, which is valuable context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is purpose-first and concise, with the core function stated in the first sentence. The cost comparison sentence adds practical value, and the Args section is a compact, scannable list. It is slightly longer than strictly necessary but every sentence contributes to understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This description is highly complete for a search tool with 6 parameters and an output schema. It explains all parameters, provides usage guidance, defines no-match semantics, and clarifies precedence. The presence of an output schema means the return structure need not be described. Minor omissions like error handling are not critical for tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides a meaningful definition for each of the 6 parameters, including real-world examples (query: 'stock-based compensation'), precedence semantics (accession takes precedence), and the unit for context (characters). Since schema description coverage is 0%, this fully compensates and goes beyond the schema's bare property titles and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Passages of a filing around every occurrence of a term, verbatim,' which clearly states the tool's function and output. This distinguishes it from sibling tools like get_filing_text or get_filings, which likely return full documents rather than targeted passages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a concrete use case (finding a specific paragraph in a 10-K) and explains cost advantages over paging through the full document. It also clarifies that a no-match result means the term is absent from this document, not the company's filings. However, it does not explicitly name alternative tools or state when not to use this tool, which would make it a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
size_positionA
Size a trade against the desk's risk limits and rule on whether it passes.
Returns the share count, the capital genuinely at risk, current portfolio
heat from open journalled theses, and every limit checked with its observed
value and threshold. The `verdict` is one of `approved`,
`approved_with_warnings` or `vetoed`; a veto is a refusal, not a preference.
Never work a share count out yourself — this is where a correct thesis
loses money. Anything that could not be checked, such as a missing ATR or
target, appears under `limitations` rather than being assumed to pass.
Args:
ticker: Stock symbol, e.g. "NVDA".
direction: "long" or "short".
entry: Intended entry price.
stop: Stop price. Must sit below entry for a long, above for a short.
account_equity: Total account equity the risk budget is drawn from.
target: Intended exit. Omit only if the chartist gave none.
atr: ATR(14) from `get_technicals`, to check the stop against noise.
risk_pct: Requested % of equity at risk. Clamped to the policy maximum.
| Name | Required | Description | Default |
|---|---|---|---|
| atr | No | ||
| stop | Yes | ||
| entry | Yes | ||
| target | No | ||
| ticker | Yes | ||
| risk_pct | No | ||
| direction | Yes | ||
| account_equity | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and discloses key behaviors: returns multiple computed values, verdict types, handling of missing data via limitations, clamping of risk_pct, and stop/direction constraints. This is rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured: purpose sentence, return summary, critical caveat, limitation note, then Args. Every sentence adds value and no information is repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters and an output schema, the description covers all essential aspects: return values, limit checks, verdict semantics, missing data handling, and parameter constraints. The context of the desk risk framework and sibling tools makes its role clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 0% description coverage, but the Args section gives meaningful explanations for all parameters, including constraints (stop relative to entry), sources (ATR from get_technicals), and defaults (target omitted only if none given). This fully compensates for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: sizing a trade against desk risk limits and returning a verdict. It distinguishes this from siblings by focusing on risk assessment rather than execution or data retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs 'Never work a share count out yourself', positioning this tool as the authoritative sizing mechanism. The directive makes the intended use obvious and implies when not to use it (manual calculation).
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.
27 tool updates
v0.1.0- First observed
cancel_order - First observed
close_broker_position - First observed
close_thesis - First observed
get_account - First observed
get_broker_orders - First observed
get_broker_positions - First observed
get_filing_text - First observed
get_filings - First observed
get_financial_history - First observed
get_financials - First observed
get_insider_activity - First observed
get_macro_series - First observed
get_macro_snapshot - First observed
get_market_movers - First observed
get_metrics - First observed
get_most_active - First observed
get_risk_policy - First observed
get_technicals - First observed
get_thesis - First observed
journal_thesis - First observed
list_line_items - First observed
list_theses - First observed
place_order - First observed
rank_candidates - First observed
reconcile_positions - First observed
search_filing_text - First observed
size_position
TDQS
Scored across 27 tools
Each tool targets a distinct resource or action. Similar-sounding tools like get_financials, get_financial_history, and get_metrics have clearly separated purposes (full statement, single line-item series, derived ratios), and research vs. trading vs. journaling groups are unmistakable.
All tool names follow the verb_noun snake_case pattern (get_risk_policy, list_theses, place_order, reconcile_positions, close_thesis, etc.). Verb prefixes vary by operation but are consistently used, with no mixing of camelCase or other conventions.
At 27 tools, this is slightly over the 25-tool threshold, but the server covers a broad domain: market data, SEC filings, macro data, technical analysis, risk sizing, journaling, and broker integration. Each tool earns its place with a distinct function; no obvious redundancy.
The tool set provides a complete research-to-execution pipeline: gather data, size positions, journal theses, place orders, monitor positions, and close trades. Small gaps like lacking an explicit update-thesis or order-modification tool are acceptable because close/cancel and re-journaling cover those cases.
Maintenance
Related MCP Connectors
Portfolio analytics + US-equity market research for AI clients. ChatGPT deep-research compat.
Unified financial infrastructure connecting AI agents directly to trade live/demo brokerage accounts, Web3 non-custodial wallets, real-time market data across equities, ETFs, crypto, forex, options, DeFi swaps, and prediction markets, institutional research feeds, and algorithmic strategy backtesters.
Real SEC, 13F, insider, congress & macro data your AI agent can cite. Hosted MCP, 24 tools.
Investment research superagent: podcasts, SEC filings, and no-code research pipelines.
Related MCP Servers
- AlicenseCqualityDmaintenanceProvides AI agents with institutional-grade quantitative finance tools including real-time market data, paper trading via Alpaca, risk analysis with Monte Carlo simulations, backtesting, and multi-source news sentiment analysis for portfolio management and trading strategy development.315MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to execute stock trading operations with built-in risk controls and human approval workflows. Supports paper trading simulation, real brokerage integration (Alpaca, Tradier), backtesting, sentiment analysis, and portfolio management while maintaining strict separation between AI intelligence and trade execution.MIT
- FlicenseNot gradedqualityDmaintenanceA multi-agent MCP server for comprehensive stock research and analysis using natural language queries, backed by SEC filings and real-time market data.-
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to perform grounded equity research by analyzing tickers from SEC filings and market data, producing citation-guarded memos with pre-computed fundamentals.MIT