Flyrel MCP
Use Flyrel MCP to inspect broker, market, account, quote, position, and holdings data, and to exercise a local synthetic paper-order lifecycle; external broker connections are read-only and no live-order execution exists.
List configured brokers and broker capabilities.
Read accounts, quotes, positions, holdings, and portfolio summaries.
Read local paper policy limits and halt state.
Propose synthetic BUY limit orders with idempotency keys and expiring confirmation tokens.
Confirm local sandbox proposals into open synthetic orders that never fill.
List local paper orders or read-only external broker order books/open orders.
Get status for one local sandbox order.
Cancel local synthetic orders only.
Activate the kill switch to block new local paper orders without cancelling existing orders or affecting broker accounts.
Policy modification, resume, and all live/external order mutation are not available through MCP.
Provides read-only access to Zerodha Kite account and market data, including profile, quotes, raw history, cash-equity positions/holdings, and the day order book. It does not support order execution.
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., "@Flyrel MCPget quotes for US:AAPL and NSE:RELIANCE"
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.
Flyrel MCP
A self-hosted Python foundation for working with multiple brokers through one MCP server. Initial markets: India and US cash equities. Initial adapters: Zerodha Kite and Alpaca.
Status: early foundation, not a trading product. External brokers are read-only. All order mutations stay in a local synthetic sandbox. No live-order implementation or enable-live flag exists. No broker credentials are needed to run the demo.
Product direction
Flyrel is experimenting with an independent security, permissions and approval layer for agentic investing/trading. The customer segment is undecided. Candidates include companies building trading agents, brokers, quant firms if relevant needs emerge, and individual or multi-account traders. There is no committed audience order or decision to sell exclusively to companies.
The intended promise is explicitly limited trading permissions with independent approval and verifiable enforcement. Broker connectivity and portfolio reports support that workflow. The interface, deployment model, buyer and end user remain discovery questions. Reddit research can inform user needs; company integration, ownership and purchasing needs require separate evidence. Flyrel does not promise guaranteed profits, loss-free trading or "100% security".
The current local setup does not provide that independent boundary: agents with shell access can read credentials and change policy/state. Protected credentials, agent-resistant policy controls, independent approval and broker execution remain future work. Agreement on product direction does not authorize external execution or change the read-only adapters.
See the product decision, roadmap, and neutral community research drafts.
Related MCP server: Open Paper Trading MCP
Quick start
Requires Python 3.12+ and uv.
git clone https://github.com/faiznazeer/flyrel-mcp.git
cd flyrel-mcp
uv sync --locked
uv run flyrel check
uv run flyrel serveserve speaks MCP over stdio and waits for a client. Application output must not be written
to stdout while serving. See MCP client configuration; replace the example
absolute project path with your checkout. The uv --directory argument also ensures the correct
.env and state directory are used when the client starts elsewhere.
Try these tools from your MCP client:
list_brokersandget_policy.get_quoteswith{"broker_id":"paper","symbols":["US:AAPL","NSE:RELIANCE"]}.propose_orderwith the request in examples/paper-order.json.confirm_orderwith the returned token, thenlist_orders.cancel_orderwith that order ID, orkill_switchto block new sandbox orders.
The demo quotes are fixed synthetic fixtures dated January 1, 2026, not current prices. Paper orders remain open until cancelled; they never fill, change positions, reserve real cash, or reach an external broker. Only whole-share BUY limit orders are supported. This is an order lifecycle sandbox, not a realistic execution, P&L, or backtesting simulator.
For a credential-free multi-account portfolio walkthrough, run uv run flyrel demo-portfolio
or call get_demo_portfolio from MCP. It shows four invented accounts with explicit synthetic
labels, separate broker holdings, fractional/short positions and an unpriced position. The
fixtures are fixed at January 1, 2026. The CLI demo loads no credentials, connects to no broker
and writes no local state. Follow the offline walkthrough.
Optional broker connections
Copy .env.example to .env and configure your own keys locally. Never put keys in chat,
issues, examples, or commits. The server reads .env but does not create tokens or perform login.
Adapter | Credentials | Implemented access | Order execution |
| None | Synthetic accounts/quotes, empty positions/holdings, persisted local orders | Local sandbox only |
| API key + current access token | Profile, quotes, raw history, cash-equity positions/holdings, day order book | None |
| Key + secret | Account, quotes, raw history, US equity positions, open orders | None |
Kite tokens must be obtained/renewed through the broker's supported login flow. Market data and
historical access depend on broker entitlements. Alpaca defaults to the broker's paper account
endpoint and IEX stock data; FLYREL_ALPACA_PAPER=false selects a live read-only account
snapshot. It does not enable trading. Automated adapter tests use mocked HTTP. User-authorized
Alpaca paper-account read checks passed on October 29, 2026 for account access, positions,
holdings, open orders and an IEX quote. Kite Personal account/holding/position/day-order reads
also passed that day, and the owner reported that available holding values matched the UI.
Populated Alpaca and Kite position/order mappings, historical data, and private UI checks of the
new performance fields remain pending. See the dated validation record for the exact scope.
Run uv run flyrel verify-brokers to explicitly make read-only API checks for both brokers
(or add --broker kite / --broker alpaca). The report includes status and row counts, omits
account details, and creates no local state. Missing credentials or failed checks return exit
code 1. Optional --history-start and --history-end add daily-bar checks. Follow the
broker validation checklist for private broker-UI comparison and
the workflow validation guide for the first user sessions.
Multiple accounts at the same broker use named credential connections in
FLYREL_BROKER_CONNECTIONS. Read tools accept connection_id and require it when a broker has
multiple configured connections. Broker-returned account IDs, broker IDs and environments stay
separate from those local names. See multiple accounts and local instruments.
Portfolio snapshots preserve currencies and broker views. The starter does not report consolidated NAV: it excludes cash and FX conversion, and keeps Kite holdings separate to avoid silently double-counting delivery positions. Alpaca holdings alias positions. Unsupported non-equity positions fail explicitly rather than disappearing from a purported complete portfolio.
For a current-holdings review, call get_holdings_summary or run:
uv run flyrel holdings-summary --broker kiteThis uses account/holding reads only, including on Kite Personal. It shows holding count, market value and broker-reported unrealized P&L per account/currency, with explicit missing-data flags. Per-holding daily price changes are distinct from monetary daily P&L: Kite provides the former; Alpaca also supplies daily unrealized P&L. The existing portfolio summary includes holding metrics separately from position values. No historical return, account-growth calculation or NAV is implied. See holdings performance.
Snapshots now include per-account values and flag duplicate accounts exposed by different connections. A currency with an unpriced position has a null full position value, alongside an explicit partial priced value. Neither is consolidated NAV. The optional local instrument registry assigns user-maintained IDs; unknown symbols stay unregistered rather than receiving guessed identities. Registry metadata is not a live broker instrument master.
Local policy and state
Default sandbox allow-list: US:AAPL, NSE:RELIANCE. Per-order caps: USD 1,000 / INR 100,000.
Open-order aggregate caps: USD 5,000 / INR 500,000. Proposal TTL: 120 seconds. Values are checked
again at confirmation under a SQLite write transaction. Persistent idempotency keys reject
conflicting payloads and make confirmation retries return the existing order within token TTL.
uv run flyrel set-policy examples/policy.json
uv run flyrel halt
uv run flyrel resumePolicy modification and resume are local CLI operations, never MCP tools. The kill switch blocks new local orders; it does not cancel outstanding orders or affect broker accounts. Both proposal and confirmation are callable by an agent, so two calls do not establish human approval. A separately authenticated human approval channel is future work before remote execution.
State lives in ignored .state/: flyrel.sqlite3 holds proposals/orders/audit metadata,
alongside optional policy.json.
New state directories/files use restrictive permissions. Tokens are stored as hashes. Tool audit
records store action/outcome metadata, not credentials, confirmation tokens, arguments, or account
responses. This is a local diagnostic log, not a tamper-proof compliance or replay archive.
Protect local files: any agent with shell access can change local policy and state.
Development
uv sync --locked
uv run ruff check .
uv run ruff format --check .
uv run pytest -q
uv buildCI runs lint, format checks, tests (including a real MCP stdio client/server round trip), and package builds on Python 3.12 and 3.13. See architecture, tool inventory, roadmap, and regulatory research.
Scope and regulation
Self-hosting and bring-your-own keys are deployment choices, not regulatory exemptions. There is no compliance certification or automated India/US compliance engine in this release. Review the dated primary sources in the regulatory notes and your broker's requirements before expanding to order routing, distributing strategies, or operating a hosted service.
MIT licensed. Not affiliated with Zerodha, Alpaca, or any exchange. This software does not provide investment advice.
Available Tools
14 toolscancel_orderA
Cancel one synthetic local order. Cannot cancel orders at an external broker.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | ||
| broker_id | No | paper |
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 behavioral burden. It does disclose a meaningful constraint (synthetic/local-only scope) beyond the field list, but says nothing about irreversibility, what state the order ends in, idempotency, or failure behavior when an order is uncancellable. Partial coverage for a irreversible mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, scope stated first and constraint second — no filler. Slight redundancy: the external-broker exclusion largely repeats what broker_id's const 'paper' already encodes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the tool is simple (2 params, flat). Still, for an irreversible cancellation the description leaves open what happens on failure or on an already-filled order, which an agent needs before committing.
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%, so the description is expected to compensate and does not: neither order_id nor the broker_id const is explained. The broker_id parameter is self-documenting via its const/default, but order_id's format and expected source (from list_orders or get_order_status) go unstated.
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?
A specific verb (cancel) plus a precisely scoped resource (one synthetic local order). The second sentence rules out a nearby interpretation (external broker orders), so the agent can distinguish it from sibling mutations like confirm_order or the blanket kill_switch.
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 supplies one useful exclusion — external broker orders cannot be cancelled here — which implies a boundary on when to use it. However it never names an alternative path for that excluded case (e.g. kill_switch or a broker-side flow), leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_orderB
Confirm a local sandbox proposal. Creates an open synthetic order that never fills.
| Name | Required | Description | Default |
|---|---|---|---|
| token | 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 behavioral burden. It usefully discloses that this is a mutation which creates an open synthetic order that never fills, but omits token provenance, idempotency, authorization, and whether confirmation is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and immediately followed by the key behavioral effect. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be described, and the sandbox/non-filling behavior is covered. However, for a no-annotation mutation tool, the missing token provenance and usage context leave the definition only minimally 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 single required parameter is token with 0% schema description coverage. The description does not explain where the token comes from or that it is the proposal token, leaving a material gap for a required 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?
States a specific verb and resource: confirm a local sandbox proposal, then creating an open synthetic order. This distinguishes it from the sibling propose_order by being the confirmation step, 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?
Implies use after a proposal exists, but does not say when to use this instead of propose_order, cancel_order, or other sibling tools, nor does it state prerequisites such as needing a proposal token.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_capabilitiesC
Get the capabilities of one configured broker.
| Name | Required | Description | Default |
|---|---|---|---|
| broker_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and discloses nothing beyond the bare action: no statement that it is a safe read, no failure behavior for an unknown or unconfigured broker_id, no auth or rate-limit context. A reader can infer read-only from "Get", but nothing about errors or scoping is 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?
A single front-loaded sentence with zero filler; the constraint "one configured broker" is placed where it matters. It is efficient rather than padded, though its brevity leaves gaps addressed under other dimensions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, but nothing else fills the gap: no annotations, an undocumented required parameter, and no guidance on sourcing broker_id. For a lookup tool in a brokerage domain where identifier provenance matters, this is thin.
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?
One parameter at 0% schema description coverage, so the schema contributes only a type and required flag. The description says "one configured broker", not which identifier format is expected or that broker_id comes from list_brokers, so it does not compensate for the coverage 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?
A specific verb ("Get") and resource ("capabilities of one configured broker") that clearly reads as a single-broker detail lookup, distinguishing it from the list_* siblings. It stops short of 5 because "capabilities" is never defined (order types? asset classes? feature flags?), leaving the agent to guess what comes back.
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 statement of when to call this versus alternatives such as list_brokers, get_policy, or get_portfolio_summary, and no prerequisite noted. The only implicit hint is "configured broker", which suggests a broker_id obtained elsewhere, but that is inference, not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_holdingsB
Read holdings. Alpaca holdings alias positions; Kite holdings are a separate view.
| Name | Required | Description | Default |
|---|---|---|---|
| broker_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses that the operation is a read and that behavior differs by broker, which is useful context. It does not cover permissions, authentication requirements, rate limits, or other operational constraints.
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 short sentences with no wasted text. The core purpose is front-loaded, followed by the broker-specific distinction.
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-value details are not needed in the description. The description covers the basic purpose and broker nuance, but for a tool with no annotations and an undocumented required parameter, it lacks enough guidance on when to use this versus get_positions and what broker_id should contain.
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 one required parameter, broker_id, with 0% description coverage. The description mentions Alpaca and Kite, implying broker-specific behavior tied to broker_id, but it does not name the parameter, explain accepted values, or clarify how broker_id maps to those brokers.
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 gives a specific verb and resource ('Read holdings') and clarifies broker-specific semantics: Alpaca holdings alias positions, while Kite holdings are a separate view. This helps distinguish the tool from the sibling get_positions, though the distinction is indirect rather than an explicit 'use this instead of get_positions' statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the broker-specific note: Alpaca holdings alias positions and Kite holdings are separate. However, it does not explicitly say when to call get_holdings versus get_positions, nor does it state prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_order_statusA
Read one local sandbox order. External broker status lookup is not implemented.
| Name | Required | Description | Default |
|---|---|---|---|
| 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, the description carries the load and does the most important job: it corrects the expectation set by the name 'get_order_status', clarifying that only sandbox-local state is returned and live broker status is unavailable. 'Read' also conveys non-mutation. It omits error behavior for unknown or non-local order_ids, which keeps it out of the top band.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero redundancy, and the capability statement is front-loaded ahead of the limitation. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary, and with one trivial parameter the description covers the main risk: mistaking this for live broker status. Missing are error/empty-result behavior and order_id validity, minor for a single-argument read.
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%, so the lone order_id field is undocumented, and the description does not define its format. It does implicitly narrow the meaning to a local sandbox identifier rather than a broker id, which is meaningful but thin compensation for the coverage 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?
'Read one local sandbox order' gives a specific verb (Read), a specific cardinality (one), and a scoped resource (local sandbox order), which cleanly separates it from list_orders. It stops short of naming that sibling outright, so the distinction is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'External broker status lookup is not implemented' is a genuine exclusion that tells the agent this is not a route to live broker state. However, there is no positive guidance on when to pick this over list_orders or how to obtain a valid order_id, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_policyA
Read local paper limits and halt state. Policy changes require the local CLI.
| 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 behavioral burden. It discloses that the operation is a read and that policy changes are out of scope, but it does not cover authorization needs, whether values are live or cached, or any rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, with the primary read behavior front-loaded and the change restriction immediately after. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-parameter read tool with an output schema, the description covers the essential purpose and scope. The remaining gaps around return semantics are mitigated by the output schema, though more detail on halt-state meaning would help.
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 takes zero parameters, so there is nothing for the description to disambiguate. The baseline for zero-parameter tools is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it reads local paper limits and halt state. This is clear enough to distinguish it from most siblings, but it does not explicitly contrast itself with similar tools such as get_capabilities or kill_switch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence 'Policy changes require the local CLI' usefully signals that this tool is not for modification, but it does not state when to use get_policy versus alternatives like get_capabilities or kill_switch. Usage is therefore only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolio_summaryA
Read separate broker position snapshots by currency; no FX conversion or netting.
| 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 full behavioral burden. It usefully discloses that results are separate by currency and that no FX conversion or netting occurs, but it does not state read-only safety, permission requirements, or other operational constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence that front-loads the core operation and adds the key no-FX/no-netting qualifier. No wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with an output schema, the description covers the essential behavioral nuance. It could be more complete by situating the tool against get_positions/get_holdings and stating the read-only nature explicitly.
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 there are no parameter semantics to document. The baseline for a zero-parameter tool is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific read operation over broker position snapshots and clarifies the per-currency scope. It is clear what the tool does, though it does not explicitly distinguish itself from siblings like get_positions or get_holdings.
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 implies usage for per-currency snapshots without FX conversion or netting, but gives no explicit when-to-use guidance or comparison to the closely related position/holding tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_positionsB
Read broker positions. Do not add this collection to holdings without reconciliation.
| Name | Required | Description | Default |
|---|---|---|---|
| broker_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. 'Read' clearly signals a read-only operation and the reconciliation warning adds useful domain context, but permissions, freshness, and other operational traits remain undisclosed.
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 short, front-loaded sentences with no filler. The phrase 'this collection' is slightly ambiguous, but otherwise it is efficiently structured.
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 one-parameter read tool with an output schema, the description covers the basic purpose and a key reconciliation caveat. It is still missing guidance on sibling alternatives and parameter meaning, which leaves it only minimally 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?
There is one required parameter, broker_id, and schema description coverage is 0%. The description does not mention the parameter at all, so it fails to compensate for the schema gap, though the name itself is relatively self-explanatory.
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 gives a specific verb and resource: 'Read broker positions.' That is enough to distinguish it from most siblings, though it does not explicitly contrast with get_holdings or get_portfolio_summary.
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 warning 'Do not add this collection to holdings without reconciliation' provides a usage constraint, but it does not explain when to call this tool instead of get_holdings or how the two relate operationally.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quotesB
Read quotes for canonical equity symbols. Paper quotes are fixed synthetic fixtures.
| Name | Required | Description | Default |
|---|---|---|---|
| symbols | Yes | ||
| broker_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden, and it does disclose that paper quotes are fixed synthetic fixtures. It also makes clear this is a read operation, but it omits permission requirements, rate limits, and how broker_id affects whether real or paper quotes are returned.
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 compact sentences with no wasted wording. The core purpose is front-loaded, followed immediately by an important behavioral note about paper quotes.
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 output schema covers return values, and the tool is simple with only two required parameters. However, the lack of broker_id explanation and absence of annotations or usage guidance means the description is only minimally complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate, but it only indirectly explains symbols as canonical equity symbols. The required broker_id parameter is not explained at all, leaving a significant semantic 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 states a specific verb and resource: read quotes for canonical equity symbols. It is clear what the tool does, but it does not explicitly differentiate from siblings or clarify how broker_id scopes the quote lookup.
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 explicit guidance on when to use this tool, when not to, or which alternative tools might apply. The read-quote purpose implies usage, but the description provides no routing context among the many broker/account/order siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kill_switchA
Persistently block new local paper orders. Does not cancel orders or affect brokers.
| 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 full burden and does add real value: it discloses persistence and scopes the blast radius (existing orders and brokers untouched). It does not say whether the block is reversible, how it is lifted, whether it is global or per-account, or what authorization is needed — significant gaps for a state-changing safety control.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the positive effect front-loaded and the non-effects immediately after. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-argument tool with an output schema, the description covers effect, persistence, and blast radius, which is most of what an agent needs. The missing piece is the reversal path — nothing tells the agent how the block is undone or whether it is permanent.
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 takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description's 'local paper orders' wording at least frames what the no-argument call targets.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (block) plus a precise resource and scope (new local paper orders) and adds the qualifier 'persistently'. It explicitly distinguishes itself from cancel_order by saying it does not cancel orders, so an agent can separate it from the sibling set without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The negatives ('does not cancel orders or affect brokers') route the agent away from cancel_order and toward this tool when the goal is halting new order creation. There is no explicit statement of when to prefer it (e.g., emergency halt vs. routine maintenance) or of any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsC
Read accounts; synthetic, broker-paper and live balances are labelled separately.
| Name | Required | Description | Default |
|---|---|---|---|
| broker_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 of behavioral disclosure. It indicates a read operation and notes that balance types are labelled separately, but it omits permissions, rate limits, pagination, and other operational behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with the core verb-resource statement front-loaded. There is no redundant or wasted text, and the extra clause about balance labels is useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be fully explained. However, with no annotations and an undocumented required broker_id, the description is not complete enough for an agent to confidently determine scope, prerequisites, or parameter meaning.
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 one required parameter, broker_id, with 0% description coverage. The description never mentions broker_id or explains its meaning, format, or required status, so it adds no parameter semantics at all.
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 gives a specific verb and resource: 'Read accounts'. It also clarifies that synthetic, broker-paper and live balances are labelled separately, which adds useful scope. However, it does not explicitly distinguish this tool from sibling read tools such as list_brokers or get_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 implies usage by saying 'Read accounts', but it provides no explicit when-to-use guidance, no exclusions, and no alternatives compared with sibling tools. It also does not state any prerequisites such as needing a broker_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_brokersA
List configured brokers, supported markets, and capability flags.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden, but a zero-parameter enumeration tool has little behavior to disclose. It states what is enumerated, but says nothing about ordering, whether a default/active broker is marked, or whether the list can be empty or require authentication.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence naming the resource first and its returned attributes second, with zero filler. It is terse to the point of being a fragment, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters and an output schema present, the description needn't explain return values, so what remains is sufficient to call the tool correctly. The only real gap is the unresolved overlap with get_capabilities.
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 takes no parameters, so the schema-coverage baseline of 4 applies; there is nothing for the description to disambiguate. It correctly avoids inventing filter options that the empty schema does not support.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'List' plus a precise resource ('configured brokers'), and it names the returned fields (supported markets, capability flags) so the agent knows what it reveals. It does not distinguish itself from the sibling get_capabilities, which could plausibly return overlapping capability data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the 'list' verb – an agent can infer this is a discovery call to run before broker-specific operations. There is no explicit when-to-use statement and no guidance on how this differs from get_capabilities, which is the one ambiguity worth resolving.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ordersB
Read local paper orders, Alpaca open orders, or Kite's current-day order book.
| Name | Required | Description | Default |
|---|---|---|---|
| broker_id | No | paper |
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 does disclose meaningful behavioral scope differences per source — Alpaca returns only open orders while Kite returns a current-day order book — but says nothing about ordering, limits, pagination, or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though it spends its words on source enumeration rather than on the disambiguation an agent would find more useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the tool is a simple zero-required-parameter read. Still, with no annotations and 0% parameter coverage, the description should have spelled out the broker_id value set and default to be fully callable without guessing.
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% and the single broker_id parameter has no enum in the schema. The description partially compensates by naming the three order sources, but does not enumerate the actual accepted values (paper/alpaca/kite) or note that 'paper' is the default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read/list) and resource (orders), and enumerates the three distinct order sources it can return. It is distinguishable from get_order_status by being a listing operation, though the description never explicitly contrasts 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?
The three sources imply that source selection is the key decision, but there is no explicit when-to-use guidance, no mention of when to prefer get_order_status over list_orders, and no statement of which broker_id values map to which source.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_orderB
Validate a synthetic BUY limit order and return an expiring confirmation token.
| Name | Required | Description | Default |
|---|---|---|---|
| request | 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: it usefully discloses that the order is 'synthetic' (nothing real is executed) and that the token 'expires', both non-obvious traits. It omits the TTL, whether the call is idempotent-side-effect-free, and what invalidation looks like, leaving real gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; every clause (validate, synthetic, BUY limit, expiring token) carries 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?
The output schema covers the return token, so return values needn't be described, and the synthetic/expiring behavior is stated. But for an unannotated, undocumented-parameter tool, the description leaves idempotency_key and the confirm_order handoff unexplained, which is not enough to invoke confidently.
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% and all six nested OrderRequest fields are undocumented. The description only implicitly covers side=buy and limit_price; symbol format, quantity limits, broker_id='paper', and especially idempotency_key semantics are left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Validate') plus a precise resource ('synthetic BUY limit order') and states the artifact returned ('expiring confirmation token'). That distinguishes it from the write-side sibling confirm_order, though it never names that sibling explicitly.
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 two-step intent (validate, then use the token) is implied by 'confirmation token' but never spelled out, and confirm_order is not named as the follow-up. No when-not-to-use or prerequisites are given, so the agent must infer the flow.
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.
14 tool updates
v0.1.0- First observed
cancel_order - First observed
confirm_order - First observed
get_capabilities - First observed
get_holdings - First observed
get_order_status - First observed
get_policy - First observed
get_portfolio_summary - First observed
get_positions - First observed
get_quotes - First observed
kill_switch - First observed
list_accounts - First observed
list_brokers - First observed
list_orders - First observed
propose_order
TDQS
Scored across 14 tools
Tools are mostly distinct by resource and action, with clear separation between broker listing, account reads, quotes, policy, and order lifecycle operations. The only meaningful overlap is positions vs holdings vs portfolio summary, but the descriptions explicitly clarify aliasing and snapshot semantics so selection remains clear.
All tool names consistently use snake_case with a recognizable verb_noun pattern such as list_brokers, get_quotes, propose_order, confirm_order, and cancel_order. kill_switch is a slight stylistic outlier but still follows the same readable convention.
14 tools sits comfortably within the appropriate range and each tool maps to a distinct broker or paper-trading operation. There are no obvious filler tools or redundant lifecycle steps.
The surface covers broker/account discovery, quotes, positions/holdings, policy, and the local order lifecycle through propose, confirm, list, status, cancel, and kill switch. Minor gaps remain around external broker order status/cancel and historical fills, but those limitations are explicitly stated and mostly outside the local sandbox scope.
Maintenance
Related MCP Connectors
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.
Indian broker accounts for AI agents: positions, holdings, orders, P&L, option chains, 10+ brokers.
AI agents backtest, paper trade and live trade via your broker. Free to connect; OAuth.
Agentic brokerage access to a US brokerage account: quotes, orders, positions, cash and documents.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables 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
- AlicenseNot gradedqualityDmaintenanceProvides AI agents with tools for paper trading stocks, options, ETFs, and bonds, including advanced options strategies and risk analysis, using real market data without financial risk.16Apache 2.0
- AlicenseBqualityCmaintenanceProvides a safe trading toolkit for AI agents with market data, indicators, paper trading, and guarded broker integration.6318 PyPIMIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to propose stock, ETF, and crypto trades through Alpaca paper trading while enforcing deterministic policy rules and recording every decision in an audit trail.11 npmMIT