Keel — Hyperliquid trading strategies
The Keel MCP server enables AI agents to build, backtest, and deploy Hyperliquid trading strategies programmatically, using a DSL and a deterministic execution engine.
Authentication & Diagnostics:
keel_auth_login,keel_auth_logout,keel_status,keel_doctor— manage OAuth login, check auth state, and diagnose CLI/MCP connectivity.Strategy Lifecycle:
keel_strategy_compose,keel_strategy_search,keel_strategy_get,keel_strategy_delete,keel_strategy_fork— create, edit, search, and manage strategies.Local Workspace (Git-like):
keel_strategy_checkout,keel_strategy_push,keel_strategy_pull,keel_strategy_status,keel_strategy_discard,keel_strategy_workspaces,keel_strategy_log,keel_strategy_diff,keel_strategy_restore— version-control strategies like a git workflow.Strategy Memory:
keel_strategy_memory_read,keel_strategy_memory_write— attach and read notes on strategies.Component Discovery:
keel_components_search,keel_components_detail_batch,keel_components_compose_help— browse and inspect pipeline components (indicators, transforms, sizers, etc.).Backtesting:
keel_backtest_run,keel_backtest_summarize,keel_backtest_watch— submit backtests against real Hyperliquid data, retrieve metrics (Sharpe, drawdown, return), and poll for completion.Live Monitoring:
keel_live_monitor— read live deployment state: positions, equity, P&L, orders, trades, funding, and portfolio summary. (Live-write tools available via opt-in toolset.)Accounts:
keel_accounts_list— list Hyperliquid accounts and their details.Sharing:
keel_share_create— publish a strategy or backtest result at a public URL.Audit:
keel_audit_list_last— review recent audit events for the current org.Help & Knowledge:
keel_help— fetch documentation on DSL syntax, component usage, best practices, and more.
What is Keel?
Keel is a quantitative crypto trading platform built around Hyperliquid — strategy development, backtesting, live execution, and portfolio management on the venue with the deepest on-chain perpetual order book. The full platform includes:
A web app for composing strategies, running backtests, and deploying live (app.usekeel.io)
A deterministic backtest engine with real Hyperliquid funding + price + slippage, walk-forward, and Monte Carlo
Bit-for-bit live execution — the same compiled strategy artifact runs in backtest and on Hyperliquid
A strategy library of documented, forkable trading strategies
A screener + calculator suite at usekeel.io/lab (funding leaderboard, momentum, overfit-check, walk-forward visualizer, more)
This package —
keel-trade— the agent-native research surface
This repository is the public mirror of the keel-trade Python package: a single pipx install gives you both a CLI and a stdio MCP server, so the same tools work from a terminal or from any MCP-capable agent.
Related MCP server: hyperliquid-info-mcp
Why agents create strategies, not trade them
Most agent-trading projects put an LLM in the execution loop. That makes systems slow, inconsistent, and hard to audit. Keel does the opposite:
You ──── compose ────► Strategy graph ──── compile ────► Deterministic artifact
▲ │
│ ▼
Agent edits Backtest engine
via MCP tools (real HL data)
│
▼
Live execution
(same artifact)Three properties drive the design:
Bit-for-bit parity between backtest and live. Same compiled artifact, same engine, same data path. There is no second implementation that can drift.
Typed composition over freeform code. Strategies are graphs of versioned components. Compile errors catch bugs at author time instead of in production.
Agents compose, the deterministic engine executes. Claude / Cursor / Codex help you build the strategy. They are not in the trade loop.
Choose your surface
keel-trade (this package) is the CLI + local MCP path. Keel is one product
with several places to use it — pick by where you are:
You are… | Default path (shown first) | Also works |
Using Claude/ChatGPT on web or phone | Hosted endpoint — paste the URL (directory one-click coming) | CLI + local MCP |
Working in Claude Code / Cursor / terminal |
| hosted endpoint |
Going live with a strategy | Keel web app (connect account, review sizing, go live) | reads on every surface |
Building your own agent/scripts | SDK + API key | CLI |
Just browsing/running strategies | Web app + library | hosted endpoint |
Hosted endpoint — the remote MCP at
https://mcp.usekeel.io/mcp: one 23-tool research/backtest/read surface (compose, backtest, share, read-only monitoring — no live-write, no local files). Paste the URL into any remote-MCP client; the one-click directory listing is coming. Going live is a handoff into the Keel web app.CLI + local MCP — this package (install below).
SDK + API key — the REST API for building your own agents and scripts.
Per-surface zero-to-first-backtest runbook: usekeel.io/agents.
Install
Claude Desktop — one-click (MCPB)
Download keel-trade-<version>.mcpb from the latest release and drag onto Claude Desktop. Cross-platform single bundle — works on macOS, Windows, and Linux.
The MCPB bundle requires system Python 3.11+ (same prerequisite as the terminal install path below). First launch takes ~10-30 seconds while the bundle pip-installs runtime deps to ~/.keel/mcpb-lib/py3.X/; subsequent launches are instant.
Terminal — pipx / uv (Claude Code, Codex, Cursor, Windsurf, etc.)
pipx install keel-tradeuv tool install keel-trade also works. Python 3.11+.
Then register the stdio MCP command with your agent host:
# Claude Code
claude mcp add keel -- keel mcp serve
# Codex
codex mcp add keel -- keel mcp serveFor Cursor, Windsurf, and generic MCP clients, see usekeel.io/keel-mcp#install or the agent setup guide.
First conversation with your agent
After install, sign in once via the agent (no terminal commands needed):
You: "Connect to Keel."
Agent: Calls
keel_auth_login. Browser opens to app.usekeel.io, you click Allow, tokens land in~/.keel/config.yaml. Authenticated for 30 days with transparent refresh.
Then describe what you want:
You: "Find me momentum signals for Hyperliquid top-30 perps and compose a backtest from 2024-08-15 to today."
Agent: Calls
keel_components_search→keel_components_detail_batch→keel_strategy_compose→keel_backtest_run. Returns a share URL with the full tearsheet (equity curve, Sharpe, max drawdown, per-asset attribution).
Concrete example: this share URL is a funding-carry backtest produced through exactly this flow — Sharpe 2.17 over 2024-08-15 → 2026-04-30 on real Hyperliquid data.
What the MCP exposes
The default toolset spans status, auth, components, strategy lifecycle, backtest, audit, accounts, sharing, and read-only live monitoring. Live-write tools (keel_live_deploy, keel_live_control) require an explicit opt-in toolset plus a local arming step — agents can't deploy your account without you authorizing it twice.
Full per-tool reference: usekeel.io/docs/sdk/tool-reference.
CLI usage
Every MCP outcome tool has a CLI mirror. Useful for terminals, SSH sessions, CI, scripts, or agents that prefer subprocess calls:
# Auth + status
keel auth login
keel status
# Search components, compose, backtest
keel components search "momentum"
keel strategy compose --source-file my-strategy.py --dry-run
keel backtest run str_abc123 --start-date 2024-08-15 --wait
# Inspect a strategy
keel strategy get str_abc123
keel strategy log str_abc123Full CLI reference: usekeel.io/docs/sdk/cli-reference.
What you can do with Keel
Task | Surface |
Backtest a Hyperliquid strategy — real fees, funding, slippage, ~220 perps | |
Screen HL perps — momentum, funding, volume, breakout, regime | |
Use AI to build strategies — typed composition, not freeform code | |
Backtest portfolios across the HL universe | |
Robustness diagnostics — walk-forward, Monte Carlo, deflated Sharpe, PBO | |
Deploy a strategy live on Hyperliquid (non-custodial) | |
Compare strategies + venues | |
Browse documented trading strategies |
Documentation
Product page: usekeel.io/keel-mcp
Getting started: usekeel.io/docs/getting-started
Agent setup (per host): usekeel.io/docs/sdk/agent-setup
CLI reference: usekeel.io/docs/sdk/cli-reference
MCP tool reference: usekeel.io/docs/sdk/tool-reference
REST API reference: usekeel.io/docs/api-reference
Agent instructions (canonical, machine-readable):
AGENTS.md
Status
Alpha. The CLI and MCP surface are stable and ship to PyPI on a regular cadence; the underlying engine and component library are actively developed.
How to contribute / report a bug
See CONTRIBUTING.md. Short version:
Bug report → open an issue using the bug template
Feature request, question, or pattern share → use Discussions
Security issue → email
team@usekeel.io(do not open a public issue)Patches → PRs are welcome; we maintain in a private monorepo so PRs may take longer to land — see CONTRIBUTING for the porting process
Related
License
MIT. See LICENSE.
Available Tools
38 toolskeel_accounts_listList Hyperliquid AccountsARead-onlyIdempotent
List your Hyperliquid accounts (id, label, wallet_address, status, account_mode, agent_address, expires_at, attached strategy/deployment) — read-only enumeration to find the account you need. Pass an account_id to fetch detail for a single account; omit it to list them all. Do NOT use to authorize a new account — that's a web-only flow where the user signs an EIP-712 challenge with their wallet. Do NOT use to deploy to a live account — call keel_live_deploy with the chosen account_id.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results when listing (default 20). | |
| cursor | No | Pagination cursor returned by a previous list call. | |
| account_id | No | Optional account id. When set, returns the single account's detail; otherwise lists all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint, idempotentHint, destructiveHint, so the description adds value by specifying the dual list/detail behavior based on account_id and listing the returned fields. It aligns with annotations and provides useful contextual behavior beyond the structured metadata.
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 and fields, then explains the parameter-based behavior, then gives exclusions. Every sentence contributes value—no fluff or repetition. It is compact yet complete.
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 and annotations covering safety, the description covers usage, parameter behavior, exclusions, and field summary. It omits pagination details but those are in the schema. It is sufficient for correct invocation without being overlong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented. The description restates the account_id behavior (list vs detail) but adds no new meaning for limit or cursor. It provides marginal added value over the schema, hence the baseline 3.
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 the exact resource and operation: 'List your Hyperliquid accounts' with the enumeration fields, and clearly distinguishes from deploy/authorization siblings. The verb 'list' plus the scope 'accounts' is unambiguous and does not repeat the title verbatim.
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 tells the agent when to use the tool ('to find the account you need') and what NOT to use it for (authorization, deployment), naming the alternative keel_live_deploy directly. This leaves no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_audit_list_lastList Recent Audit EventsARead-onlyIdempotent
Read the most recent N audit events for the current org — the agent's own trail for self-debugging and recovery. Use it to see what was just done (tool/action name, decision permit/deny, and best-effort args/result_ref metadata when the API recorded it) — e.g. to recover the run id of a backtest you lost track of. Do NOT assume args or result_ref is complete; empty values mean the event carried no replay-safe metadata. Do NOT use to mutate state — call the relevant outcome tool directly. Do NOT use to fetch full backtest results — read keel://backtest/<id>/results after locating the run id in the audit event's result_ref.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Max events to return. Server clamps to 1..100. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the description is not obligated to restate the safety profile — and it does not contradict them (description's 'Read' aligns with readOnlyHint). The description adds genuinely useful context beyond the annotations: that args/result_ref metadata is best-effort and may be empty, meaning the agent should not treat returned data as replay-safe. This disclosure of data-reliability limitations is valuable behavioral transparency that structured fields do not provide.
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 core purpose is front-loaded in the first clause, and each subsequent sentence carries essential operational guidance (the Do NOT clauses, the best-effort caveat, the alternative routing). It is longer than a minimal description, but the length is justified by the important reliability caveats and usage exclusions. Slightly verbose for a single-parameter tool, but no wasted sentences.
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 optional param, zero required) and the description covers everything an agent needs: what the audit trail contains, why to use it, its reliability limits, and which alternatives to reach for when the audit trail is not the right path. An output schema exists to document the return structure, so not describing it in prose is fine. Nothing an agent needs to call it correctly or interpret its results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — the 'n' parameter is fully documented (default 20, 'Max events to return', 'Server clamps to 1..100'). The description references 'most recent N audit events' which aligns with the parameter but adds no syntax or semantics beyond what the schema already states. With full schema coverage, the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read'), a clear resource ('most recent N audit events for the current org'), and an explicit purpose ('the agent's own trail for self-debugging and recovery'). The tool is naturally distinct from all siblings — none of the 38 sibling tools are audit-related — so the description's framing of it as the org's action trail makes selection 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?
The description gives explicit when-to-use ('see what was just done', 'recover the run id of a backtest you lost track of'), explicit when-not-to-use ('Do NOT use to mutate state', 'Do NOT use to fetch full backtest results'), and names the correct alternatives (call the relevant outcome tool directly; read keel://backtest/<id>/results after locating the run id). It also warns against assuming args/result_ref completeness. This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_auth_loginLog In to KeelAIdempotent
Run the OAuth 2.1 + PKCE browser-loopback login flow against Keel and persist tokens to ~/.keel/config.yaml so subsequent tool calls are authenticated. Opens the user's browser and waits up to 5 minutes for sign-in. Call this when keel_status returns authenticated: false, or whenever another tool's error envelope points here as the next action. If the current session was an anonymous grant, its workspace is auto-claimed into the signed-in account (best-effort — a failed claim degrades to a notice, never a failed login). Optional scope='live' pre-checks the live-trading consent box; optional api_url=... targets a non-default Keel deployment such as staging. Returns the same concise summary as the CLI's keel auth login. Do NOT use to refresh an existing session (the client refreshes transparently). Do NOT use for headless environments (CI, SSH without browser forwarding) — there the user should run keel auth login --key <token> from their terminal instead. If the result carries pending_claim, the signed-in account already has strategies: ask the user whether to attach the anonymous workspace, then call this tool again with attach_anonymous_work true/false — that resolves the pending claim without re-opening the browser.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | OAuth scope tier. 'live' pre-checks the live-trading consent on the browser page; the user can still untick it. | base |
| api_url | No | Override Keel API URL (e.g. a self-hosted instance or staging). Default reads from ~/.keel/config.yaml or env KEEL_API_URL. | |
| attach_anonymous_work | No | Spec 09 CL-8: the user's decision on attaching the anonymous workspace to an account that already has strategies. Pass true/false ONLY after asking the user; with a pending claim stored, this resolves it without re-running the browser flow. Omit on a first login — fresh accounts claim automatically. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond annotations: it discloses opening the user's browser, waiting up to 5 minutes, persisting tokens to config, the anonymous-grant auto-claim behavior (with best-effort degradation to a notice rather than a failed login), and the pending_claim resolution workflow that avoids re-opening the browser — consistent with idempotentHint=true. No contradiction with readOnlyHint=false or destructiveHint=false.
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 long but every sentence earns its place — protocol, side effects, timing, when-to-use, when-not-to-use, fallback, and edge-case handling. The core action is front-loaded before the routing guidance. Length is justified by the genuine complexity of an auth flow with claim semantics, though it borders on verbose.
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 executes a complex interactive flow with browser interaction, token persistence, anonymous-workspace claiming, and a pending_claim state — and the description covers all of it: what it does, side effects, failure modes ('never a failed login'), timing, exclusion cases with alternatives, and the pending_claim decision loop. An output schema exists so return values need no elaboration, and it still notes the return format matches the CLI's summary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters. The description still adds value: it explains that scope='live' pre-checks the consent box (adding behavioral context), that api_url targets non-default deployments like staging, and — most valuably — the workflow condition for attach_anonymous_work ('Pass true/false ONLY after asking the user; with a pending claim stored, this resolves it without re-running the browser flow'). This is meaningful context beyond the schema's field 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 names the specific protocol (OAuth 2.1 + PKCE), flow type (browser-loopback), resource (Keel), and concrete side effect (persisting tokens to ~/.keel/config.yaml for subsequent authentication). This precisely identifies the operation and structurally distinguishes it from the sibling keel_auth_logout and the status-checking keel_status.
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?
Explicit when-to-use is given ('Call this when keel_status returns authenticated: false, or whenever another tool's error envelope points here'), plus two explicit exclusions: do NOT use for refreshing an existing session (client refreshes transparently) and do NOT use in headless environments — with the CLI alternative `keel auth login --key <token>` named. This is textbook routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_auth_logoutLog Out of KeelADestructiveIdempotent
Clear stored Keel credentials from ~/.keel/config.yaml so the next tool call is unauthenticated — use it to sign the user out, or to switch accounts (logout → keel_auth_login). Wipes the api_key, refresh_token, token_expires_at, and client_name; preserves api_url so the next login targets the same deployment. Idempotent — safe to call when already logged out. Do NOT use to recover from a transient auth error — the client refreshes tokens transparently on 401; only log out when the user explicitly asks, or to switch identity before keel_auth_login.
| 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?
While annotations already declare idempotentHint and destructiveHint, the description adds valuable specifics by itemizing exactly which fields are wiped and that api_url is preserved. It also reinforces idempotency ('safe to call when already logged out') and adds context about the auth error recovery behavior, exceeding what annotations alone provide.
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 yet information-dense, with the primary action front-loaded. Each sentence adds distinct value—what it does, when to use it, what it affects, and a crucial caveat—without 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 no-parameter, destructive, idempotent tool, the description fully covers usage context, safety considerations, and relationship to siblings. It also mentions the output schema exists externally, so no return value explanation is needed, making the description 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?
The tool has zero parameters and the schema coverage is 100%, so no parameter explanation is required. The description adds no parameter semantics, but the baseline for zero-parameter tools is 4, and the lack of params makes this appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool does: clears stored Keel credentials from ~/.keel/config.yaml, and explicitly distinguishes it from the login sibling by naming keel_auth_login as the counterpart. It also clarifies what is affected (api_key, refresh_token, etc.) and what is preserved (api_url), leaving no ambiguity about its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: to sign the user out or switch accounts, with a pointer to keel_auth_login. It also specifies when not to use it for transient auth errors, explaining that the client auto-refreshes on 401, and instructs to log out only on explicit user request or for identity switching.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_backtest_runRun BacktestA
Submit a backtest for a strategy over a date range. Returns run_id (= backtest_id), status_url, and — when wait=true (default) and the run finishes within the polling budget — tearsheet_url plus summary_metrics (Sharpe, total return, max drawdown, …). On polling timeout the envelope still returns cleanly with status and status_url set. Each call queues a NEW run — this tool is non-idempotent. DEFAULTS: when the user says "backtest X" without specifics, just run it — do not interrogate them first. start_date defaults to 2024-08-15 (earliest cached HL data), end_date to today's UTC date, and config (starting capital, fees, slippage, and other execution settings) to realistic platform values (taker-realistic ~4.5 bps fees + ~4.5 bps slippage). Always apply these platform defaults without asking; override only when the user explicitly asks for a different window, capital, or cost model, or you have a specific stated reason. Mention the window (and any non-default config) you used so the user can narrow it. Do NOT ask the user to pick a date range, capital, or fees first. Pass commit_id to backtest a historical commit (find via keel_strategy_log); otherwise runs server HEAD. Write-through (server HEAD is the source of truth): if the strategy is checked out locally with unpushed edits, they are pushed automatically first (generated commit message, or pass push_message) and the backtest pins to the new commit — so you always test what you actually have. Set auto_push=False to opt out (raises local_ahead instead). A true conflict (local edited AND server moved) always stops with recovery options — never force-overwrites. Do NOT use to re-fetch results for an already-completed run — read the keel://backtest/<id>/results resource instead, or call keel_backtest_summarize.
| Name | Required | Description | Default |
|---|---|---|---|
| wait | No | Block up to ~90s polling for completion. On timeout the result still returns with `status_url` set so the agent can come back later. | |
| config | No | Validated worker financial overrides. | |
| end_date | No | Inclusive end date, YYYY-MM-DD. Optional; defaults to today's UTC date when omitted. | |
| auto_push | No | Write-through default (true): if the local workspace has unpushed edits, push them first and backtest the resulting commit. Set false to opt out — an unpushed local copy then raises `local_ahead` instead of silently testing old server code. Conflicts (server moved too) always stop regardless. | |
| commit_id | No | Pin to a specific commit; defaults to strategy HEAD. Find historical commits via `keel_strategy_log`. | |
| start_date | No | Inclusive start date, YYYY-MM-DD. Optional; defaults to 2024-08-15 (earliest cached HL data) when omitted. | |
| strategy_id | Yes | Strategy to backtest. Use `keel_strategy_search` to discover. | |
| push_message | No | Commit message to use when the write-through guard pushes before the backtest. Defaults to 'Auto-push before backtest'. | |
| no_ownership_hint | No | Omit first-session ownership guidance fields. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is highly transparent about the non-idempotent behavior (each call queues a new run), the write-through push behavior, auto_push opt-out, and conflict handling. It also discloses polling timeout behavior. The annotations only declare non-idempotence and non-read-only; the description adds significant behavioral context about side effects (pushing commits), defaults, and edge cases. However, given the annotations already hint at non-idempotence, and the description doesn't contradict them, a 4 is appropriate — it adds substantial context but doesn't fully describe all possible failure modes or the output 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 lengthy but packed with important behavioral details. It front-loads the return fields and defaults, but the write-through and push behavior comes later. It could be restructured into clearer sections, and some sentences are dense. However, every sentence earns its place — there's no filler. Still, it's on the long side for a tool description, so a 3 is appropriate.
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 (9 params, nested config, non-idempotent, write-through behavior, multiple edge cases), the description is remarkably complete. It covers return values, defaults, alternatives, usage guidance, and edge cases. The output schema exists, so it doesn't need to enumerate output fields. The only minor gap is not describing the exact format of summary_metrics, but the output schema likely covers that. For a tool this complex, this is near-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?
Schema description coverage is 100%, meaning the schema already documents every parameter with descriptions. The description adds value by explaining the default behavior (start_date defaults to 2024-08-15, end_date to today, config to platform values) and the write-through push behavior tied to commit_id and auto_push. It also explains the deprecated initial_capital alias. Since the schema does the heavy lifting and the description adds meaningful context on defaults and interactions, a 4 is justified — it goes beyond the baseline 3.
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 submits a backtest for a strategy over a date range, with specific return fields. It also distinguishes itself from keel_backtest_summarize and keel_backtest_watch, which are the obvious sibling tools for related operations.
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 explicit when-to-use guidance: it defaults to running a backtest without interrogation when user says 'backtest X', and explicitly says not to re-fetch results (use keel_backtest_summarize instead). It also explains when to override defaults (only when user explicitly asks). This is strong usage guidance with exclusions and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_backtest_summarizeSummarize Backtest ResultsARead-onlyIdempotent
Summarize a completed backtest: Sharpe / max drawdown / total return / turnover / funding-attribution, plus period info and a presigned results.json URL when the run is complete. Returns hero_url deep-linked to the tearsheet view. BE PROACTIVE: after keel_backtest_run returns successfully, call this automatically with the same backtest_id to enrich your reply to the user. Don't ask 'do you want the full metrics?' first — they almost always do. Then READ the result and reason about WHY: diagnose the mechanism, not the outcome — 'mean-reversion shorts in a parabolic breakout with no trend filter' is a mechanism; 'shorts lost money in Nov 2024' is an outcome. Any change you propose must have a principled reason independent of this backtest; prefer adding robustness (trend filter, sizing, regime gate) over removing exposure to dodge one bad window — that's curve-fitting. Do NOT use mid-run — agent should poll status_url or wait for the post-run hook. Call keel_backtest_run (with wait=true) for live submission + completion.
| Name | Required | Description | Default |
|---|---|---|---|
| backtest_id | Yes | The backtest_id returned by `keel_backtest_run`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds behavioral context beyond these: it returns a 'presigned `results.json` URL' (implying temporary access), only works 'when the run is complete', and expects the agent to be proactive and read the result to reason about mechanisms. This enriches what annotations alone do not convey. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than typical, but it is front-loaded with the core purpose and then provides structured, purposeful guidance on proactive usage, interpretation, and restrictions. Every sentence contributes to correct usage, and the structure is logical. It is not concise, but it is well-organized and not redundant.
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 when to use (after successful run), when not to use (mid-run), what it returns (including the presigned URL and hero_url), and how to interpret results (reason about mechanisms, avoid curve-fitting). Given an output schema exists, it does not need to list all return fields. The description is complete for an agent to call it correctly and interpret the output effectively.
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 already documents the single parameter `backtest_id` as 'The backtest_id returned by `keel_backtest_run`.' The description repeats this origin but adds no new semantic meaning—only the proactive instruction to use 'the same backtest_id'. With 100% schema description coverage, the description adds minimal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool summarizes a completed backtest and lists the specific metrics it returns (Sharpe, max drawdown, total return, turnover, funding-attribution, period info, results.json URL, hero_url). It also distinguishes itself from siblings by explicitly noting 'Do NOT use mid-run' and referencing `keel_backtest_run` and `keel_backtest_watch` as 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?
The description gives explicit when-to-use instructions: 'after `keel_backtest_run` returns successfully, call this automatically' and warns against using it mid-run, directing the agent to poll status_url or wait for the post-run hook. It also names the alternative `keel_backtest_run` with `wait=true` for live submission, leaving no ambiguity about when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_backtest_watchWatch Backtest ProgressARead-onlyIdempotent
Poll an already-running backtest until it reaches a terminal status (succeeded/failed/cancelled) or the timeout elapses — the bounded way to wait on a run started by keel_backtest_run. Pass the run_id; the watch clamps its own interval and timeout and returns the latest snapshot even if the run is still going, so if terminal is false just call it again. Returns status, final metrics and results_url when complete, and the stable tearsheet hero_url; once it succeeds, read and interpret the result with keel_backtest_summarize (reason about the mechanism, not just the number). Do NOT use to start a new run — call keel_backtest_run first. Do NOT hand-roll a polling loop around keel_backtest_summarize; use this bounded watch helper.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout_s | No | Maximum watch duration in seconds. Clamped to 0-600. | |
| interval_s | No | Seconds between status checks. Clamped to 1-60. | |
| backtest_id | Yes | The run_id returned by `keel_backtest_run`. | |
| no_ownership_hint | No | Omit first-session ownership guidance fields. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and no-destructiveness, and the description contradicts none of them (polling is indeed read-only and idempotent). Beyond the annotations, it discloses rich behavioral context: it clamps its own interval/timeout, returns the latest snapshot even when the run is still going (so 'call it again' if terminal is false), and reports stable tearsheet hero_url plus status/metrics/results_url on completion. This adds real value over the annotation flags.
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 core purpose and terminal-status semantics are front-loaded in the first sentence, and the follow-up routing plus two exclusions are placed at the end. It is longer than average (about eight sentences), but every sentence earns its place — the poll semantics, return behavior, and the important do-not warnings would each be costly if omitted. Slightly verbose given the schema already covers parameter details, but not padded.
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, the description is not burdened with exhaustively defining the return shape, yet it still covers what an agent needs to act correctly: the terminal states, the timeout/interval clamping, the non-blocking return when a run is still active, the stable hero_url, and the explicit handoff to keel_backtest_summarize. Nothing an agent needs to invoke or reason about this polling tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents all four parameters, including clamp ranges on timeout_s and interval_s and the meaning of backtest_id and no_ownership_hint. The description adds marginal color — it tells the agent to 'pass the run_id' and reiterates the clamping behavior — but does not introduce meaning beyond what the schema provides. No penalty, no bonus beyond baseline.
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 ('Poll an already-running backtest until it reaches a terminal status'), names the exact terminal states, and distinguishes itself from siblings by calling itself 'the bounded way to wait' on a run from keel_backtest_run. An agent can immediately tell this apart from keel_backtest_run and keel_backtest_summarize without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidance is explicit: use it to wait on a run already started by keel_backtest_run, and it gives two hard 'Do NOT' exclusions — do not use to start a new run (call keel_backtest_run first) and do not hand-roll a polling loop around keel_backtest_summarize. It also names the follow-up tool (keel_backtest_summarize) to read results, leaving no ambiguity about when to reach for it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_components_compose_helpComponent Composition HelpARead-onlyIdempotent
Fetch the full schema/detail contract for ONE known pipeline component: parameter list, type signature, slot reads/writes, examples, and common pitfalls. Call this once discovery has narrowed to a single component you're about to wire — use keel_components_search first to find candidates, and keel_components_detail_batch when you're verifying SEVERAL at once. The returned contract is the source of truth for authoring that component's ComponentRef(...): read the exact parameter names, types, and slot reads/writes here so the DSL you pass to keel_strategy_compose fits on the first try, not after a dry-run bounce. Do NOT use to discover components — use keel_components_search. Do NOT use to look up DSL syntax topics — call keel_help.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Component name (case-sensitive), e.g. `RSI`, `RollingZScoreTransform`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds value beyond that by disclosing the richness of the returned contract (parameter names, types, slot reads/writes, examples, pitfalls) and its role as the 'source of truth' for authoring ComponentRef(...), including why it matters — the DSL should fit on the first try rather than after a dry-run bounce. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, and the structure flows logically: what → when → why → exclusions. There is slight redundancy — the instruction to use keel_components_search for discovery appears twice, once in the workflow sentence and once in the explicit 'Do NOT use' clause — but every other sentence earns its place with concrete routing and workflow guidance.
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 single-parameter lookup tool with an output schema, the description is complete: it covers what the tool returns, when to call it versus two alternatives, how to use the result (authoring ComponentRef for keel_strategy_compose), and what it should not be used for. The output schema carries the return-format burden, and annotations carry the safety profile, so nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; the schema already documents `name` as a case-sensitive component name with examples (RSI, RollingZScoreTransform). The description adds mild context that the name must map to a known pipeline component and that the returned contract's exact parameter names matter for ComponentRef authoring, but this does not materially extend the schema's parameter documentation. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pairing — "Fetch the full schema/detail contract for ONE known pipeline component" — and enumerates exactly what the contract contains (parameter list, type signature, slot reads/writes, examples, pitfalls). It also explicitly differentiates itself from sibling tools by naming keel_components_search (discovery) and keel_components_detail_batch (batch verification), so an agent can distinguish them without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('once discovery has narrowed to a single component you're about to wire'), names the tool to call first (keel_components_search), names the alternative for multi-component verification (keel_components_detail_batch), and provides two 'Do NOT use' exclusions with correct alternatives (keel_components_search, keel_help). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_components_detail_batchGet Component Details (Batch)ARead-onlyIdempotent
Fetch the full spec (schema, parameter list, examples, slot reads/writes, type signature) for SEVERAL components in one call. The CANONICAL second step of the REQUIRED two-step discovery: after keel_components_search surfaces candidates, batch-fetch details for ALL components you plan to wire — search hits AND standard components (PriceDataLoader, TargetTimeframeResampler, Store) — BEFORE drafting DSL. This verifies input/output types, slot dependencies, and parameter constraints in one round-trip, and applies to new strategies AND every edit. Plan wiring from the real type signatures and slot requirements, not names or pattern memory. Prevents the common 'wrong-shape component → dry-run fails → re-search → re-draft' loop.
Returns components as a dict keyed by name. Unknown names become {"error": "..."} entries rather than failing the whole call — partial result is the norm. found and missing counts surface in the envelope for quick triage.
Recommended pattern (per strategy-creation skill): (1) decompose the user thesis into roles, (2) keel_components_search for each role, (3) mock the pipeline as a list of intended component refs, (4) keel_components_detail_batch(names=[...]) to verify they fit together, (5) draft DSL, (6) dry-run. Do NOT use for ONE component — call keel_components_compose_help instead (cheaper).
| Name | Required | Description | Default |
|---|---|---|---|
| names | Yes | List of component names to look up. Case-sensitive — names must match the registry exactly (e.g. `['ROC', 'EWMA', 'ForecastScaler']`). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses key behavioral traits: unknown names produce per-entry error objects rather than failing the call, partial results are normal, and found/missing counts appear in the envelope. It also explains the intended workflow consequence when shapes don't fit. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then layers usage, return behavior, and workflow pattern in a readable order. It is verbose and repeats a few points (canonical step, before drafting DSL), but the extra length mostly carries actionable guidance rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only batch lookup with strong annotations and an output schema, the description leaves nothing essential missing: what it returns, how errors are handled, when to call it, what to do before/after, and which alternative to choose for single components.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents the sole parameter with a clear case-sensitivity warning and example. The description reinforces that names should reflect planned components and that the call takes a batch list, but it does not add substantial semantic meaning beyond the schema's existing 100% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: fetch full specs for several components in one call. It explicitly distinguishes itself from the single-component alternative (keel_components_compose_help) and from the search sibling, making its 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?
The description is explicit about when to use it: as the canonical second step after keel_components_search and before drafting DSL, for both new strategies and edits. It also gives a clear exclusion: do NOT use it for one component, and names the cheaper alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_components_searchSearch ComponentsARead-onlyIdempotent
Search the Keel pipeline component catalog by keyword, semantic query, category, input/output type, or pipeline position (after/before) — the REQUIRED first step of the two-step discovery every build turn starts with.
Decompose the thesis into roles (universe, signal, entry/exit, filter, sizing, normalize) and search each role — plus every domain concept the user names (beta hedge, vol targeting, risk parity, trailing stop, regime) — in natural language BEFORE selecting anything. This holds for new strategies AND every edit. When the user names a concept, ALWAYS search for it rather than hand-rolling from memory: a manual ConstantForecast(-10) is a static short, not the BetaHedgeAllocator that was asked for.
Keel re-clocks in one direction — resample raw data fine → coarse, project signals coarse → fine. Filter by clock_direction for the operator in the direction you want.
Returns compact entries (name, category, description, input/output type) to triage; feed the set you pick straight into keel_components_detail_batch to verify types and slots before drafting DSL. Do NOT plan a pipeline from names or pattern memory alone — search is not optional. Do NOT use to fetch the full schema of ONE component — use keel_components_compose_help. Do NOT use to enumerate strategies — call keel_strategy_search.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Return components that can FOLLOW the named component (their input type accepts that component's output). | |
| limit | No | Maximum number of results. | |
| query | No | Free-text semantic query — tokens are matched against name, category, and description with weighted scoring (name ×3, category ×2, description ×1). Returns components scored > 0 ranked by relevance. Pair with `keyword` (or the CLI positional keyword) to first narrow by substring, then rank. | |
| before | No | Return components that can PRECEDE the named component (their output type matches that component's input). | |
| keyword | No | Case-insensitive substring match against name or description. The CLI positional arg maps here — `keel components search momentum` filters to components mentioning 'momentum'. For weighted token-scoring across name/category/description, use `--query` instead. | |
| category | No | Restrict to one component category. | |
| input_type | No | Restrict to components consuming this type (e.g. `SignalSeries`). | |
| output_type | No | Restrict to components producing this type (e.g. `ForecastSeries`). | |
| clock_direction | No | Restrict to components that change the bar clock in one direction. `resample` = fine → coarse aggregation of raw data (e.g. 1h OHLCV → 1d). `project` = coarse → fine, holding the last COMPLETED coarse bar across the finer grid (e.g. a 1d regime signal driving 1h execution) — the only safe way to move a signal down. `synth` = a data loader minting the entry clock. `keep` = leaves the clock untouched (most components). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark this as read-only, idempotent, and non-destructive, and the description adds substantial behavioral context beyond those hints. It explains that results are compact triage entries with name/category/description/input-output type, that returned sets should feed into `keel_components_detail_batch`, that Keel re-clocks in only one direction, and that hand-rolled components from memory can misrepresent the requested concept (e.g., `ConstantForecast(-10)` vs `BetaHedgeAllocator`). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but nearly every sentence carries operational value: primary purpose, workflow rules, clock-direction caveat, return-format expectation, and explicit exclusions. It is front-loaded with the most important fact (REQUIRED first step) and then structured logically. Minor redundancy in repeated emphasis on 'search is not optional' keeps it from a 5, but it is far from bloated given the tool's complexity.
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 a search tool with 9 optional parameters, 100% schema coverage, an output schema, and read-only annotations, the description covers everything an agent needs to invoke it correctly: when it is mandatory, how to decompose queries, what results look like, how to follow up, and which sibling tools handle adjacent cases. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is already high; the schema documents every parameter including weighted scoring for `query` and direction semantics for `clock_direction`. The description goes beyond the schema by tying parameters to the discovery workflow (e.g., filter by `clock_direction` for the desired operator direction, pair `keyword` with `query` for narrowing, use `after`/`before` for pipeline position). This adds practical selection guidance rather than merely restating schema fields.
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 action ('Search the Keel pipeline component catalog') and the full set of search dimensions (keyword, semantic query, category, input/output type, pipeline position). It also explicitly distinguishes itself from siblings like `keel_components_compose_help` (single-component schema) and `keel_strategy_search` (strategy enumeration), so an agent can disambiguate without opening their schemas.
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 guidance is unusually explicit: it declares this tool the REQUIRED first step in every build turn, instructs decomposing the thesis into roles and searching each role, mandates searching whenever the user names a concept, and warns against planning from memory. It also provides concrete exclusions ('Do NOT use to fetch the full schema of ONE component', 'Do NOT use to enumerate strategies') with named alternatives, leaving no ambiguity about when to use this tool versus its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_doctorDiagnose Keel SetupARead-onlyIdempotent
Diagnose the Keel CLI/MCP installation in one read-only pass: auth, API reachability, and the active tool surface. Reach for this when a tool fails in a way that looks environmental — auth rejected, API unreachable, an expected tool missing — instead of retrying the same call: a tool that errors twice with the same root cause won't fix itself on a third try, so read its structured error, then run keel_doctor to confirm setup before changing tactics. Exits non-zero when any check fails, so keel doctor && … gates cleanly in scripts. Do NOT use to enumerate strategies or accounts — call keel_strategy_search or keel_accounts_list instead.
| 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?
Beyond the annotations, the description discloses that the tool is a single read-only pass, what it checks, and that it exits non-zero when any check fails so it can gate scripts. This adds real behavioral context beyond the readOnly/idempotent/destructive hints, and nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with the core purpose and each sentence earns its place: one for scope, one for when to use it, one for exit-code scripting behavior, and one for exclusions. It is dense but not padded.
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-input diagnostic tool with an output schema and rich annotations, the description covers purpose, triggers, behavioral consequences, and alternative routing. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters and the schema is a closed empty object, so there is nothing for the description to clarify. The baseline of 4 applies because no parameter compensation is needed.
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 precise verb–resource pairing: 'Diagnose the Keel CLI/MCP installation in one read-only pass' and names the checked areas (auth, API reachability, active tool surface). It also closes with explicit 'Do NOT use' language that distinguishes it from keel_strategy_search and keel_accounts_list.
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 gives specific environmental-failure triggers (auth rejected, API unreachable, expected tool missing) and explicitly advises against blind retries. It also names the alternative tools for enumeration, so the when-to-use versus when-not-to-use decision is fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_feedbackSend FeedbackA
Send product feedback about Keel to the team: friction, praise, or a bug report from this session. File it at the END of a session, and any time the same friction repeats — a tool erroring twice on the same root cause, a confusing result, a missing capability — capture it here rather than silently working around it. Provide goal (what you were trying to accomplish), kind (friction | praise | bug), and text (the feedback itself); optionally severity and context_ref (the id or tool name it concerns). This tool NEVER fails: delivery problems return success with a note, so it is always safe to call and no workflow should wait on or gate on it. Do NOT use for support questions — nothing is returned and no human replies in-session; for connectivity problems call keel_doctor.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | What you were trying to accomplish when the feedback arose. | |
| kind | No | Feedback category: friction | praise | bug. | |
| text | No | The feedback itself, in your own words. Markdown allowed. | |
| severity | No | Optional severity: low, medium, or high. | |
| context_ref | No | Optional reference this feedback concerns — a strategy id (str_...), a backtest run id (btr_...), or a tool name (keel_backtest_run). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by revealing that the tool never fails, that delivery problems are reported as success with a note, and that it is always safe to call and should not be gated upon. It also clarifies that nothing is returned in-session for support-style inquiries. These are critical behavioral traits not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat long but well structured, front-loading the purpose and then covering usage, parameters, and exceptions. Each sentence contributes useful information; no filler. It could be tightened, but the clarity benefits from the detail.
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 simple nature and that the output schema exists, the description covers everything an agent needs: what it does, when to use it, what parameters to provide, and the safety/behavior guarantee. It also handles edge cases (never fails, no support replies) comprehensively. Nothing is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all five parameters with descriptions (100% coverage), so the bar is set at 3. The description adds meaningful context by explicitly telling the agent to provide `goal`, `kind`, and `text` (effectively indicating they are required despite not being marked as such in the schema) and clarifying the meaning of `context_ref`. This lifts it above the baseline.
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 sends product feedback (friction, praise, or bug) to the Keel team. It is specific about the resource (Keel) and the action (send feedback), and it explicitly contrasts with support questions and names keel_doctor as the alternative for connectivity problems, distinguishing it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when: at the end of a session and whenever the same friction repeats. It also states when NOT to use: for support questions (nothing is returned, no human replies) and names the alternative tool (keel_doctor) for connectivity issues. This leaves no ambiguity about appropriate invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_helpKeel HelpARead-onlyIdempotent
Fetch a Keel knowledge or DSL-reference document by topic name — the way to pull depth on demand instead of reasoning about DSL syntax, phases, or composition rules from memory. Reference topics mirror keel://dsl/reference/<topic>; knowledge topics mirror keel://knowledge/<section>. Call with no topic first to list every bundled topic, then fetch the one that fits — handy when a host doesn't browse MCP resources well, or when the user asks a general 'how does X work?' and you want the authoritative doc rather than a guess. Do NOT use to search components — call keel_components_search. Do NOT use to look up a specific component's params — call keel_components_compose_help.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Topic slug. Optional; when omitted, the tool returns the list of available topics. Examples: `phases`, `types`, `slots`, `composition`, `normalization`, `best_practices`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds useful behavioral context: the topic slug maps to keel:// URLs, the no-topic call returns a list, and it encourages listing before fetching. This goes beyond annotations without contradicting them.
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 bit long, but each sentence earns its place: it front-loads the core purpose, then gives usage pattern, then explicit exclusions. It is well-paragraphed and flows logically from what to how to when-not. Minor trimming could improve conciseness, but no sentence is redundant.
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 only one optional parameter and an existing output schema (not shown but present), the description covers everything an agent needs: what the tool does, how to call it (including the list-first pattern), when to use alternatives, and the underlying topic model. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a description and example slugs, but the description adds meaning: it explains that omitting the topic returns the list of available topics, and maps topics to keel:// reference and knowledge paths. This is value beyond the raw schema field description.
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 verb (fetch) and resource (Keel knowledge or DSL-reference document), and explicitly names the sibling tools it is NOT (keel_components_search, keel_components_compose_help). An agent can distinguish this from siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use scenarios (when a host doesn't browse MCP resources well, or for general 'how does X work?' questions) and when-not-to-use with concrete alternatives (search components -> keel_components_search, component params -> keel_components_compose_help). It also recommends the workflow of listing topics first, then fetching the specific one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_library_forkFork Library EntryA
Fork a verified Keel Library entry into the caller's org as a normal, editable strategy — the supported way to start from something proven instead of composing from scratch. For a first strategy, ma-crossover-crypto is the simple default new web users get. The fork is a full copy — edit it and run backtests like any other strategy. The entry's published metrics belong to the library's verified run — produce the fork's own evidence with keel_backtest_run. To fork one of YOUR strategies or a share link, use keel_strategy_fork (it takes ids, not slugs).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional name for the forked strategy. | |
| slug | Yes | Library entry slug (kebab-case, from `keel_library_list`). | |
| variant_id | No | Optional variant preset from `keel_library_get`; omit for the entry's default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it non-read-only (mutation) but non-destructive, and the description adds genuinely useful context on top: the fork is a 'full copy' that behaves like any other strategy, and critically it warns that the library's published metrics belong to the verified run, not the fork — routing the agent to keel_backtest_run for the fork's own evidence. This matches and enriches the annotations with no contradiction.
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?
Four sentences, each earning its place: the purpose, the default suggestion, the full-copy/metrics caveat, and the sibling routing. It's somewhat long but not bloated, and the core purpose is front-loaded ahead of the exclusions.
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?
Complete for a mutation tool with an output schema and 100% parameter coverage. It covers the sibling distinction, the metrics caveat, the default entry, and the full-copy semantics. Nothing an agent needs to correctly invoke it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — name, slug, and variant_id all carry descriptions. The description adds marginal value by suggesting ma-crossover-crypto as a concrete default slug value and confirming slug provenance from keel_library_list. Baseline 3 is appropriate since the schema already documents all parameters adequately.
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 ('fork') + resource ('verified Keel Library entry') + outcome ('normal, editable strategy in caller's org'). It clearly differentiates from the primary sibling (keel_strategy_fork) by specifying it targets YOUR strategies/share links, while this targets library entries. The purpose is unambiguous and scoped.
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 names the alternative tool and the selection condition: 'To fork one of YOUR strategies or a share link, use keel_strategy_fork (it takes ids, not slugs).' It also frames the tool as 'the supported way to start from something proven instead of composing from scratch' and calls out ma-crossover-crypto as the default for first strategies. When-to-use and when-not-to-use are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_library_getGet Library EntryARead-onlyIdempotent
Read one Keel Library entry's verified facts: headline metrics, backtest window, data freshness, and the published variants (parameter presets with their own metrics). Use this as the evidence source BEFORE forking — the numbers are the library's verified run, not a promise about any fork.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Library entry slug (kebab-case, from `keel_library_list`). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds meaningful context by specifying that the numbers are verified from the library's run, not a promise for any fork, which is a behavioral nuance not captured in the structured fields. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each earning its place: the first defines the tool's scope and content, the second gives usage guidance. No filler or unnecessary complexity, and the key guidance is front-loaded.
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 simplicity (one parameter) and the presence of an output schema, the description sufficiently covers the content (headline metrics, backtest window, data freshness, variants) and provides important context about data verification. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage for the single parameter 'slug', including its description referencing keel_library_list. The tool description adds no additional parameter detail beyond what the schema already states, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the verb 'Read' and the resource 'one Keel Library entry's verified facts' with a specific list of data (headline metrics, backtest window, data freshness, variants). It also distinguishes from sibling tools like keel_library_fork and keel_library_list by emphasizing its role as the evidence source before forking, making it unambiguous which tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: 'Use this as the evidence source BEFORE forking' and clarifies that the data is 'the library's verified run, not a promise about any fork.' This gives a clear when-to-use and implicitly contrasts with alternative actions (forking), leaving no ambiguity about its place.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_library_listList Library EntriesARead-onlyIdempotent
List the Keel Library — the verified, backtested strategy entries published in the product. Each row carries the slug, name, category, risk band, and headline metrics from the entry's verified run. Read an entry's full facts with keel_library_get; start from one with keel_library_fork.
| 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?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful context by specifying the row contents, such as slug, name, category, risk band, and headline metrics from the verified run, and that entries are published/backtested.
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 sentences with no wasted words. It front-loads the action, then gives the row contents and cross-references to the two most relevant sibling tools, all in a compact, scannable structure.
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 parameterless listing tool with no required inputs, an output schema, and annotations covering side effects, the description is complete. It conveys what is listed, what each row contains, and how to perform related follow-up actions, leaving no critical gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema completely covers this with an empty properties object. The description does not need to explain parameter behavior; a baseline of 4 is appropriate for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: it lists the Keel Library, the verified, backtested strategy entries published in the product. It also differentiates itself from sibling tools by clarifying that keel_library_get reads full facts and keel_library_fork starts from an entry.
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 routes the agent to alternatives: use keel_library_get for full facts and keel_library_fork to start from an entry. This makes it clear when the list tool is the right choice versus those siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_live_monitorMonitor Live DeploymentsARead-onlyIdempotent
Read-only observability for live deployments: overview, positions, equity, P&L, stats, weights, weights-history, executions, orders, trades, funding events, or portfolio summary — one view enum in place of ~13 separate live_* read endpoints. This tool only observes; it never changes a deployment, and going live with a new strategy is a web-app step (keel_live_deploy hands off to it), not something done here. DEFAULTS: when the user asks 'how are my live deployments doing' without naming one, just call with no args — returns the portfolio summary across all deployments. Pass deployment_id to drill into a single deployment. Read the returned freshness before interpreting the data: positions is an on-demand exchange snapshot, while portfolio/history views are recorded backend state that can lag the web dashboard's live-service stream — this is not a real-time tail. Do NOT use to change deployment state — call keel_live_control. Do NOT use to deploy a new strategy — call keel_live_deploy.
| Name | Required | Description | Default |
|---|---|---|---|
| side | No | Trades view: filter by trade side (BUY/SELL). | |
| view | No | Which slice to fetch. 'overview' returns the deployment metadata; 'portfolio' ignores deployment_id. | overview |
| limit | No | Page size for paginated views (orders, trades, executions, weights-history). Ignored for other views. | |
| cursor | No | Trades view: pagination cursor. | |
| symbol | No | Trades view: filter to one instrument symbol. | |
| sort_by | No | Trades view: sort column (notional, closed_pnl). | |
| sort_dir | No | Trades view: 'asc' or 'desc'. | |
| start_time | No | Trades view: ISO-8601 lower bound on trade_time. | |
| deployment_id | No | Deployment to inspect. Optional; omit (or pass 'all') with view='portfolio' (the default in this case) to fetch the portfolio summary across every deployment. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description adds material behavioral context: it never changes a deployment, positions is an on-demand exchange snapshot, portfolio/history views may lag the live-service stream, and the tool is not a real-time tail. This significantly helps the agent interpret results correctly.
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 every sentence earns its place: purpose, defaults, freshness caveat, and exclusions are all packed into a compact paragraph. The safety-critical 'Do NOT use' guidance is clearly front-loaded with alternatives named.
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 complex multi-view tool with 9 parameters and no required fields, the description covers default behavior, per-view semantics, freshness/lag caveats, and routing to sibling tools. The output schema already exists, so return structure does not need to be repeated. Nothing essential is missing for correct 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 100%, so the baseline is 3. The description adds extra meaning by documenting the no-args default behavior, the deployment_id omit/'all' behavior for portfolio, and that some views ignore certain parameters. This goes beyond the schema's per-field descriptions, though not exhaustively for every view combination.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Read-only observability for live deployments' followed by an explicit list of supported slices. It also distinguishes itself from keel_live_control and keel_live_deploy, so an agent can immediately tell what this tool is and what it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete invocation guidance: call with no args for a cross-deployment portfolio summary, pass deployment_id to drill down, and read freshness before interpreting data. It also explicitly states when NOT to use the tool and names the alternatives: keel_live_control for state changes and keel_live_deploy for deploying new strategies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_open_in_appOpen in Keel AppARead-onlyIdempotent
Returns a link to view and manage this strategy in the Keel web app. This is the bridge from the agent surface to the interactive product: give it a strategy id (str_...) for the strategy overview page, a backtest run id (btr_...) for the full interactive tearsheet and charts, or a share id (shr_...) for the public share page. Reach for it whenever the user wants to see the visual result or continue with the strategy in the app beyond what these tools do; it is read-only navigation — it builds the canonical URL and changes nothing. Present the returned url to the user as a clickable link. Do NOT use to fetch strategy data or metrics — call keel_strategy_get or keel_backtest_summarize for those.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Strategy id (str_...), backtest run id (btr_...), or share id (shr_...). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint. The description adds context beyond annotations: 'it builds the canonical URL and changes nothing' and clarifies it is read-only navigation. It also explains the return value is a URL to present. This adds value without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately long but every sentence adds value: purpose, id variations, use case, read-only note, presentation instruction, and exclusions. It is front-loaded with the core purpose and structured logically, though it could be tightened slightly without losing 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 one-parameter read-only navigation tool, the description is complete. It explains what it returns (a URL), how to present it, and explicitly covers what it does not do. Given the output schema likely documents the url field, nothing an agent needs to call correctly is missing.
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 already describes the id parameter with the three possible prefixes. The description goes further by explaining that the id type determines which page is returned (strategy overview, backtest tearsheet, or share page). This adds meaningful semantic detail beyond the schema, which is worth more than the baseline 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool does: 'Returns a link to view and manage this strategy in the Keel web app.' It identifies the specific resource (strategy/backtest/share) and distinguishes itself from siblings like keel_strategy_get and keel_backtest_summarize by clarifying it only builds a URL. The purpose is unambiguous and specific.
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 when to use this tool ('whenever the user wants to see the visual result or continue with the strategy in the app') and when not to ('Do NOT use to fetch strategy data or metrics'), and names the alternatives (keel_strategy_get, keel_backtest_summarize). This is exactly what an agent needs to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_ownership_statusStrategy Ownership StatusARead-onlyIdempotent
Fetch the read-only first-session ownership projection for one strategy — where it sits in its maturation arc and what to do next. Returns next_recommended_action, missing_evidence (e.g. strategy brief, baseline evidence, failure modes), and live_readiness_blockers (no baseline, no diagnosis, no readiness review) so you can steer the strategy toward being understood and ready rather than guessing the next step. Read it, then act with the build-loop tools. Do NOT use to run a backtest or change strategy source — call keel_backtest_run or keel_strategy_compose for those.
| Name | Required | Description | Default |
|---|---|---|---|
| strategy_id | Yes | Strategy id (e.g. `str_abc123`). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not repeat those. It adds useful behavioral context beyond the annotations by detailing the projection's purpose and what it returns (`next_recommended_action`, `missing_evidence`, `live_readiness_blockers`), and frames the tool as a steering aid. It does not mention auth, rate limits, or side effects, but for a simple read operation with those annotations, the added context 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?
Two sentences, zero filler. The first sentence states the action and purpose, the second lists return fields and then gives clear exclusions. Every clause earns its place, and the most important info (read-only, projection) is front-loaded. Structure is optimal for an agent scanning descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter, full schema coverage, and rich annotations (read-only, idempotent, non-destructive), the description is complete. It explains what the output represents, when to use it, and when not to, without needing to re-explain return structure (which the output schema covers). The 'maturation arc' concept is briefly contextualized by the listed outputs. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter `strategy_id` is already documented with type and an example ('e.g. `str_abc123`'). The description adds no extra parameter-level detail (e.g., constraints, encoding, or special values) beyond what the schema provides, so it stays at the baseline for high 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 names a specific verb ('Fetch'), a clearly defined resource ('first-session ownership projection for one strategy'), and the purpose ('where it sits in its maturation arc and what to do next'). It distinguishes from siblings by explicitly saying it is NOT for backtests or changing strategy source, pointing to `keel_backtest_run` and `keel_strategy_compose`. This fully separates it from the sibling tools, especially `keel_strategy_status`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('Read it, then act with the build-loop tools') and clear exclusions ('Do NOT use to run a backtest or change strategy source') with named alternatives. It leaves no ambiguity about when this tool is appropriate versus its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_plan_statusPlan StatusARead-onlyIdempotent
Report the org's current Keel plan as enforced numbers: plan name, per-plan limits, remaining quota this period (backtest runs, compute seconds, live strategy slots), the builder fee in bps, and upgrade_options — the other available plans with USD prices and exact limit differences, returned as data, not a recommendation. Read-only: calling it never changes the plan and never spends quota. Check it before a large backtest sweep to stay within the remaining allowance, and when a high-turnover strategy's live cost comes up — the builder fee in bps is the per-order cost a higher plan tier lowers, so these figures are what to reason from. Do NOT use to check auth state or visible tools — call keel_status.
| 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?
Annotations already carry readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the safety profile is covered. The description adds value beyond annotations with the specific 'never spends quota' disclosure, which is a concrete behavioral trait not present in the annotations. The 'read-only' phrasing is consistent with the annotations — no contradiction.
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 purpose is front-loaded in sentence one, followed by behavioral note, usage contexts, and a caution. Three sentences cover a lot of ground with no filler, but it is slightly more verbose than the minimal two-sentence gold standard. Every sentence earns its place, so it is efficient rather than bloated.
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 reporting tool with an output schema present, the description is fully complete. It covers what is returned, the read-only/quota-free guarantee, when to consult it (before backtest sweeps, for live cost reasoning), and what it is NOT for (auth state, via keel_status). Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline of 4 applies per rubric. Schema coverage is 100% with an empty properties object; there is nothing to document. The description focuses its energy on what the tool returns, which is appropriate given there are no inputs to disambiguate.
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 leads with a specific verb ("Report") and precise resource ("the org's current Keel plan as enforced numbers"), then enumerates exactly what is returned: plan name, per-plan limits, remaining quota components, builder fee in bps, and upgrade_options with prices and limit differences. It explicitly distinguishes itself from the sibling keel_status, so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: "Check it before a large backtest sweep to stay within the remaining allowance" and "when a high-turnover strategy's live cost comes up". It also states a hard when-not and names the alternative: "Do NOT use to check auth state or visible tools — call keel_status". This is textbook usage guidance with alternatives and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_statusKeel StatusARead-onlyIdempotent
Report Keel CLI/MCP status in one call: auth state and identity, API URL, the toolsets and MCP tools visible under the current KEEL_TOOLSETS, remaining plan quota (backtest runs, compute seconds, live slots), and cross-surface hints. Start here when wiring up a new agent or when you're unsure what's authorized — it orients you before you reach for a lower-level tool, and the quota block lets you check headroom before a large backtest sweep instead of hitting a limit mid-run. Do NOT use to enumerate strategies — call keel_strategy_search. Do NOT use to diagnose an error — call keel_doctor.
| 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?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds valuable context about the scope and contents of the status report (auth, quota, toolsets) and implies a snapshot behavior. It doesn't contradict annotations and supplements them with operational details, though it doesn't disclose any hidden traits like latency or network dependencies—minor 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 well-structured and front-loaded with the core purpose. Every sentence contributes: the report contents, the scenarios for use, and explicit exclusions with alternative tools. No fluff or redundancy, and the do-not-use lines are clearly separated.
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. It covers the tool's purpose, contents, usage scenarios, and sibling exclusions, giving an agent everything needed to decide when and how to call it correctly. It is complete for a status-reporting 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 tool has zero parameters, and schema description coverage is 100% (vacuous). Baseline is 4 for no parameters; the description correctly avoids repeating any param info since none exist. No additional semantic value is needed.
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 clear verb and resource: 'Report Keel CLI/MCP status in one call' and enumerates exactly what is included (auth state, identity, API URL, toolsets, quota, cross-surface hints). It explicitly distinguishes itself from siblings by naming keel_strategy_search and keel_doctor as alternatives for different purposes, so an agent can easily tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('Start here when wiring up a new agent or when you're unsure what's authorized') and a concrete scenario (checking quota before a large backtest sweep). It also states what NOT to use it for and names the correct tools, making the routing unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_checkoutCheck Out Strategy LocallyA
Pull a platform strategy into a local workspace so you can edit, validate, and version-control it. Server HEAD stays the single source of truth — the checkout is a WORKING COPY (disposable, always reconcilable); runnable actions (backtest/deploy) resolve server commits and write through local edits by default. Writes strategy.py + .keel-meta.json to the workspace dir (defaults to ~/.keel/workspace/<id>/; project-local when cwd has .keel/workspace.yaml). Subsequent edits stay local until keel_strategy_push commits them back — check keel_strategy_status for the local-vs-server delta any time. Use this BEFORE iterating on an existing strategy — even small edits should go through checkout → edit → push, NOT raw keel_strategy_compose calls that bypass version history. Do NOT use to CREATE a new strategy — call keel_strategy_compose. Do NOT use for backtest artifacts — those are read-only resources.
| Name | Required | Description | Default |
|---|---|---|---|
| dir | No | Override target dir. Defaults to `<project>/strategies/<id>/` when cwd has `.keel/workspace.yaml`, else `~/.keel/workspace/<id>/`. Pass an absolute path to land the checkout somewhere specific. | |
| strategy_id | Yes | Platform strategy id (e.g. `str_01knsm...`). Discover via `keel_strategy_search`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral traits beyond the annotations: it is a WORKING COPY (disposable and always reconcilable), server HEAD is the single source of truth, runnable actions write through local edits by default, and edits stay local until push. It also specifies the files written and directory defaults. This gives the agent a clear mental model of checkout semantics, far exceeding what annotations provide.
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 relatively long but every clause earns its place. It front-loads the core purpose and then layers in working-copy semantics, file outputs, push/status flow, and usage exclusions. The structure is logical and dense, though it could be slightly trimmed without losing 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 tool with significant contextual nuance (working copy vs server, local edits, default directories, interplay with push/status/compose), the description covers all key aspects. It explains what happens to edits, where files go, and which sibling tools to use for other operations. An output schema exists to describe return values, so not describing them is fine. The description is complete enough for an agent to call this 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?
Schema coverage is 100%, so the baseline is 3. The description adds some practical context (e.g., default dir resolution based on workspace.yaml, example strategy_id format) but most parameter meaning is already in the schema. It does not meaningfully expand on the schema's parameter descriptions, so a 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Pull a platform strategy into a local workspace') and immediately clarifies its scope as working-copy management. It explicitly differentiates from siblings by stating it is NOT for creating new strategies (keel_strategy_compose) and NOT for backtest artifacts, leaving no ambiguity about its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('Use this BEFORE iterating on an existing strategy') and when-not-to-use guidance with named alternatives ('Do NOT use to CREATE a new strategy — call keel_strategy_compose'). It also explains the recommended workflow (checkout → edit → push) and references keel_strategy_status and keel_strategy_push, so the agent knows exactly how this tool fits into the broader toolset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_composeCompose StrategyAIdempotent
Create or update a strategy from DSL source. With dry_run=true, validates + tries to compile without persisting — use this first to iterate cheaply. With strategy_id set, updates an existing strategy; otherwise creates a new one. Pass exactly one of source (DSL text) or source_file (path).
Compose only AFTER the required two-step discovery: keel_components_search each role and named concept, then keel_components_detail_batch the full set you'll wire — so the DSL is planned from real component types and slots, not memory. The pipeline MUST reach WeightSeries (end with a normalizer) or it's incomplete — never persist or backtest an incomplete pipeline; fix what's missing first.
FIRST-TIME COMPOSING in this session? Invoke the strategy-creation MCP prompt FIRST (see prompts/list). It auto-loads the full decompose → discover → reason → draft workflow plus ~7 knowledge files (reasoning_principles, composition_mechanics, dsl_syntax, mistakes, tool_usage, universe_selection, pipeline_system) — the same knowledge chat-api keeps always-on. Without it you're composing blind and will likely hit common mistakes the skill catalogs. For modifying an existing strategy, invoke strategy-fork-and-iterate instead, and iterate — don't rewrite: make the SMALLEST change that answers the request, one at a time; never rearchitect a working strategy or add unrequested signals without asking first.
DEFAULTS: if the user gave no asset scope, default the Universe to mode='top_volume', top_n=30, market='perp' and target_timeframe='1d' — do not ask them to choose a universe or timeframe first; state what you used.
Server HEAD is the source of truth: updates commit directly to the server. If the strategy is also checked out locally on this machine, the update is written back into the working copy in the same operation (workspace_sync in the response) unless the local file has uncommitted edits — those are never overwritten. Validation feedback (errors + warnings + type-flow) always surfaces in the response under validation.errors and validation.warnings. Validation does NOT block the save — matches the web app editor + chat-api policy where the user sees issues inline but compile is the actual gate. Only parse and compile errors block. DSL constraints: NO Python import statements (component names like ROC, PriceDataLoader, ForecastScaler are pre-resolved — use them directly). The pipeline must end with a normalizer (ForecastWeightNormalizer or equivalent). Call keel_help(topic='dsl_syntax') for the full DSL reference, or keel_components_search to discover available components. Do NOT use to fork an existing strategy — call keel_strategy_fork. Do NOT use to run a backtest — call keel_backtest_run.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name for the new strategy (create mode). | |
| source | No | DSL source (raw text). Exactly one of `source` or `source_file` required. | |
| dry_run | No | Only validate + compile, do not persist. | |
| source_file | No | Path to a .py DSL file. Exactly one of `source` or `source_file` required. | |
| strategy_id | No | If set, updates the named strategy; otherwise creates a new one. | |
| parent_version | No | Optional commit/version ref this update is based on. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=true, destructiveHint=false) carry only a general safety profile, and the description adds far beyond them: validation does NOT block the save (only parse/compile errors do), updates commit to server HEAD and write back into local working copies via workspace_sync unless there are uncommitted edits (never overwritten), and DSL constraints (no Python import statements; pipeline must end with a normalizer). This gives the agent accurate expectations for side effects and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and dry_run guidance, which is good, but it is a long, dense wall of text with no visual structure. It is somewhat redundant — the no-fork/no-backtest exclusions and the pointer to keel_help(dsl_syntax) appear more than once, and the 'same knowledge chat-api keeps always-on' aside adds little. Most content is necessary given the tool's complexity, but tightening and sectioning would make it easier for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema covers return values and the tool is highly complex, the description is remarkably complete: it covers purpose, create/update modes, workflow prerequisites, defaulting behavior, server/local sync semantics, validation response shape (validation.errors/warnings), DSL constraints, and explicit routing to alternatives. Nothing an agent needs to call this correctly is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully documents all six parameters, giving a baseline of 3. The description adds meaning on top: the source/source_file exclusivity ('Pass exactly one'), the strategic use of dry_run ('use this first to iterate cheaply'), the create-vs-update semantics of strategy_id, and the default-universe behavior when name/asset scope is absent. This exceeds the baseline without duplicating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific operation and resource: 'Create or update a strategy from DSL source.' It distinguishes the two modes (create with empty strategy_id vs. update with strategy_id) and explicitly excludes sibling tools ('Do NOT use to fork an existing strategy — call keel_strategy_fork. Do NOT use to run a backtest — call keel_backtest_run'). An agent can immediately tell this apart from keel_strategy_fork, keel_strategy_get, and keel_backtest_run.
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?
Exceptional when-to-use guidance: it mandates a two-step discovery prerequisite (keel_components_search then keel_components_detail_batch), instructs first-time composers to invoke the strategy-creation MCP prompt, tells modifiers to use strategy-fork-and-iterate with minimal changes, and names exclusions (fork → keel_strategy_fork, backtest → keel_backtest_run). It even specifies the default universe when the user gives no asset scope, so the agent doesn't stall on an undecided parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_deleteDelete StrategyADestructive
Hard-delete a strategy on the platform — IRREVERSIBLE. Once deleted, the strategy_id can't be reused and its entire version history is gone. Prefer recovery over deletion: to undo a bad edit use keel_strategy_restore (history is preserved), to drop only the LOCAL working copy use keel_strategy_discard, and to stop a live deployment use keel_live_control with action=stop. Reach for delete only when the user explicitly wants the strategy gone for good. Local workspace files are NOT removed — clean those up separately. Do NOT use to stop a live deployment — call keel_live_control with action=stop. Do NOT use to remove a local workspace — call keel_strategy_discard.
| Name | Required | Description | Default |
|---|---|---|---|
| strategy_id | Yes | Strategy id to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive, but the description adds crucial behavioral details: strategy_id cannot be reused, entire version history is removed, and local workspace files are NOT deleted. It also clarifies that deletion does not stop live deployments, which is a meaningful side-effect boundary.
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 longer than average, but every sentence adds either a consequence, an alternative, or a misuse guard. The most critical information (irreversibility) is front-loaded, and even the repeated do-not-use statements reinforce high-risk exclusions.
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 destructive nature of this tool, the description fully covers consequences, scope, alternatives, and exclusions. An output schema exists, so return-value details are unnecessary, and nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents strategy_id with 100% coverage, so the description need not repeat parameter details. The description does not add new syntax or format guidance for the parameter, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Hard-delete a strategy on the platform.' It clearly distinguishes this from related operations by naming restore, discard, and live control as separate tools. The irreversible nature and scope are explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('only when the user explicitly wants the strategy gone for good') and names concrete alternatives for related scenarios. It also provides explicit do-not-use conditions, including which tool to call instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_diffDiff Strategy VersionsARead-onlyIdempotent
Compute the structural diff between two strategy versions or two sources: added, removed, and modified steps, per-parameter changes (such as ROC.period 20→42), reordering, and component version changes, plus a one-line summary. With strategy_id set, both refs are commit/tag refs on that strategy (find them via keel_strategy_log); without it, both refs are local file paths. Use it to confirm an iteration changed ONLY what you intended — one change at a time — or to see exactly what moved between two commits before restoring or forking. Do NOT use to fetch the actual source — call keel_strategy_get. Do NOT use to merge or apply a change — call keel_strategy_compose.
| Name | Required | Description | Default |
|---|---|---|---|
| ref_a | Yes | File path (file mode) or version ref (version mode). | |
| ref_b | Yes | File path (file mode) or version ref (version mode). | |
| strategy_id | No | If set, diff two versions of this strategy. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond that: it explains the two operating modes (version mode vs file mode) and how refs are interpreted based on strategy_id. It also describes the output structure (added/removed/modified steps, per-parameter changes) which is beyond annotations. No contradictions. Slightly short of a 5 because it doesn't mention any edge cases or error conditions, but with annotations carrying the safety burden, this is strong.
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 longer than average but every sentence contributes. The first sentence front-loads the core result, the second clarifies parameter interpretation, the third gives the primary use case, and the final sentence gives explicit exclusions with alternatives. It's well-structured and avoids fluff, though it could be trimmed slightly with proofreading. A 4 is fair.
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 is complete for a read-only diff tool. It explains the modes, how parameters interact, when to use it, and when not to. It even tells where to find the refs (keel_strategy_log). Since an output schema exists, the description doesn't need to detail return values. Given the tool's moderate complexity (3 params), nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (each parameter has a description), so the baseline is 3. The description adds meaning beyond the schema by clarifying that ref_a and ref_b are ambiguous between file paths and version refs depending on whether strategy_id is set, and that strategy_id itself determines the mode. It also points to keel_strategy_log for discovering refs. This adds value over the schema's terse descriptions, so a 4 is warranted.
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 action (Compute) and the resource (structural diff between two strategy versions or two sources), and enumerates exactly what the diff includes: added, removed, modified steps, per-parameter changes, reordering, and version changes, plus a summary. It explicitly contrasts with siblings by saying 'Do NOT use to fetch the actual source — call keel_strategy_get' and 'Do NOT use to merge or apply a change — call keel_strategy_compose', which fully distinguishes it.
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 gives explicit when-to-use guidance ('Use it to confirm an iteration changed ONLY what you intended — one change at a time — or to see exactly what moved between two commits before restoring or forking') and explicit when-not-to-use with named alternatives (keel_strategy_get for fetching source, keel_strategy_compose for merging/applying). This leaves no ambiguity about the tool's niche.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_discardDiscard Local WorkspaceADestructiveIdempotent
Remove a local workspace — the checked-out strategy.py + .keel-meta.json. Local-only: the server-side strategy is untouched and still available via keel_strategy_get or keel_strategy_checkout. Use it to clean up after you're done iterating, or to reset a diverged workspace by re-checking out fresh (a clean re-checkout beats a manual merge). Do NOT use to delete a strategy on the platform — call keel_strategy_delete (destructive + irreversible). This tool only touches local filesystem state.
| Name | Required | Description | Default |
|---|---|---|---|
| strategy_id | No | Strategy workspace to discard. Auto-detected if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, and the description reinforces this by specifying what is removed (local files) and that the server-side strategy is 'untouched and still available'. It adds context about the local-only scope and the benefit of re-checkout, which goes beyond the annotations. No contradiction, but it could also mention idempotency explicitly (though the annotation covers it).
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 four sentences, each adding distinct value: action/scope, server-state clarification, usage scenarios, and an explicit negative instruction. The most important information (what it does and local-only nature) is front-loaded, with no redundancy or padding.
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 is simple (one optional parameter) and has an output schema, the description fully covers what an agent needs: what it does, what it doesn't do, when to use it, and its local-only scope. There are no missing critical details 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 coverage is 100% and the parameter description 'Strategy workspace to discard. Auto-detected if omitted.' already conveys semantics. The description does not add further details about the parameter or its usage, so the baseline of 3 is appropriate because the schema carries the load.
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 ('Remove') and a precise resource ('local workspace — the checked-out strategy.py + .keel-meta.json'). It clearly distinguishes itself from the sibling keel_strategy_delete by stating it only touches local filesystem state, and mentions alternatives like keel_strategy_get/checkout. This makes the tool's purpose unmistakable.
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 says when to use: 'clean up after you're done iterating, or to reset a diverged workspace by re-checking out fresh'. Also gives a clear exclusion: 'Do NOT use to delete a strategy on the platform — call keel_strategy_delete'. This provides concrete guidance on alternatives and triggers, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_forkFork StrategyAIdempotent
Fork a strategy into your org to iterate on a COPY — the safe way to improve or adapt an existing strategy (yours, or one from a share link) without touching the original. The source argument accepts either a Keel strategy id (str_*) or a share-link id; the tool auto-detects which endpoint to call. Once forked, iterate — don't rewrite: make the SMALLEST change that answers the request, one at a time, and re-backtest between changes; never rearchitect a working strategy or add unrequested signals without asking first. Discovery still applies to every edit — keel_components_search the concept, then keel_components_detail_batch, before wiring it in via keel_strategy_compose. Do NOT use to compose a new strategy from scratch — call keel_strategy_compose. Do NOT use to create a share link — call keel_share_create.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional new name for the fork. | |
| source | Yes | Strategy id (`str_*`) or share-link id. | |
| target_workspace_id | No | Workspace to place the fork in (default: org default). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (destructiveHint=false, idempotentHint=true, readOnlyHint=false), and the description adds real behavioral context beyond them: fork produces a non-destructive COPY, the source argument accepts either a str_* id or a share-link id, and the tool auto-detects which endpoint to call. This is genuinely useful and not contradictory — no annotation conflict.
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?
Purpose is front-loaded in the first sentence, followed by usage and exclusions. It reads long, but most sentences earn their place — especially the sibling routing. The iteration/never-rearchitect guidance is arguably workflow policy beyond the tool's function, which costs a point, but the structure is strong and well-ordered.
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?
Complete for a mutation tool with an output schema and rich sibling context. It covers when to use, when not to use, source format, workflow for edits, and the alternative tools. An agent has everything needed to call it correctly without further queries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters (source, name, target_workspace_id) are already documented in the schema. The description adds marginal value by clarifying the source argument formats (str_* vs share-link id) and auto-detection, but the heavy lifting is done by the schema — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb (Fork) + resource (strategy) and states the outcome precisely: a safe copy in your org, never touching the original. It explicitly differentiates from siblings by naming what it is NOT for — composing from scratch (keel_strategy_compose) or creating share links (keel_share_create) — so the agent can disambiguate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (iterating on an existing strategy via a COPY) and when-not-to-use with named alternatives: do NOT compose from scratch, call keel_strategy_compose; do NOT create a share link, call keel_share_create. It even prescribes the post-fork workflow (smallest change, re-backtest, discovery via keel_components_search/detail_batch before compose). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_getGet StrategyARead-onlyIdempotent
Fetch one strategy by id — metadata by default; pass include_source=true to also read the DSL source at a given version (default HEAD), and include_versions=true to list every commit. Use this to READ the actual pipeline before you adapt it: fetch the source first so you plan the edit from the real component wiring and types, not from memory of what the strategy 'probably' does. Pair with keel_strategy_search (to find the id) and keel_strategy_fork (to iterate on a copy). Do NOT use to enumerate strategies — call keel_strategy_search. Do NOT use to mutate the strategy — call keel_strategy_compose.
| Name | Required | Description | Default |
|---|---|---|---|
| version | No | Version ref (HEAD, tag, sequence number, or commit id). | HEAD |
| strategy_id | Yes | Strategy id (e.g. `str_abc123`). | |
| include_source | No | Also fetch the DSL source at `version`. | |
| include_versions | No | Also list all versions. | |
| no_ownership_hint | No | Omit first-session ownership guidance fields. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already fully cover the safety profile (readOnlyHint, idempotentHint, destructiveHint false), so the bar is lower. The description adds workflow-context value beyond the annotations: the 'read before you adapt' strategy and the version/HEAD semantics. It does not contradict any annotation.
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?
Dense but well-organized: core function first, then flag semantics, then workflow, then exclusions. The length is justified because every sentence adds either behavioral context or alternative routing. Slightly long relative to strict conciseness, 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?
For a read-only, idempotent tool with a rich output schema and full annotation coverage, this description is complete. It covers what it returns (metadata/source/versions), how the flags modify behavior, the correct siblings for finding ids and iterating, and what NOT to use it for.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining the intended usage of the optional flags ('pass include_source=true to also read the DSL source', 'include_versions=true to list every commit'), giving them practical meaning rather than just repeating the field 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?
States a specific verb-resource pair ('Fetch one strategy by id') and immediately scopes the variants (metadata by default, source with include_source, versions list). The scope is unambiguous and clearly distinguishes this from keel_strategy_search (enumeration) and keel_strategy_compose (mutation).
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?
Exceptional guidance: names the exact workflow ('fetch the source first so you plan the edit'), explicitly pairs with keel_strategy_search for finding the id and keel_strategy_fork for iteration, and gives two hard exclusions with the correct alternative tool for each. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_logStrategy Version HistoryARead-onlyIdempotent
Show a strategy's commit history — the 'git log' of the sync model over the server's canonical timeline, where server HEAD is the source of truth. Each entry carries sequence number, commit id, parent, source hash, message, timestamp, tags, and surface attribution (modified_via — which client made each commit, such as 'modified via claude.ai, 2h ago'). Reverse-chronological, newest first. Use it to audit how a strategy evolved, find the ref to restore or diff against, or see what's moved since you last looked. Do NOT use to fetch source for one commit — that's a future keel://strategy/{id}/versions/{ref}/source resource. Do NOT use to see what changed STRUCTURALLY between two versions — call keel_strategy_diff for that. Default limit=50; max 200 (server-enforced).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max commits to return. Clamped to 1..200. | |
| strategy_id | Yes | Strategy id whose history to show. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false. The description adds valuable behavioral context beyond annotations: reverse-chronological ordering, default limit (50), server-enforced max of 200, and the 'server HEAD is source of truth' nuance. It also describes the entry fields. Since annotations cover the safety profile, the description's additional context earns a high score, though it stops short of pagination or error behavior 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 moderately long but well-structured, front-loading the primary purpose and then detailing fields, use cases, and exclusions. Each sentence contributes value; the 'git log' analogy aids comprehension. It could slightly trim the field enumeration, but overall it is efficient for the complexity.
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 an output schema exists (so return format is handled), the description covers the essential contexts: what each entry contains, ordering, use cases, and exclusions. It doesn't mention pagination, but for a log list tool with a default and max limit, this is adequate. The description is complete enough for an agent to decide 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?
Schema coverage is 100%, with both parameters (limit and strategy_id) described in the schema. The description repeats the default and max limit values already in the schema, adding only a note that the limit is server-enforced. It doesn't add substantial new meaning beyond what the schema provides, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the core function: showing a strategy's commit history, analogized as the 'git log' of the sync model. It specifies the verb (show), resource (strategy's commit history), and distinguishes it from siblings like keel_strategy_diff (for structural changes) and a future source resource. This is specific and 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?
The description provides explicit when-to-use scenarios (audit evolution, find ref to restore/diff, see what moved) and explicit when-not-to-use cases (for single-commit source, for structural diffs). It names alternatives directly (keel_strategy_diff, future resource). This leaves no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_memory_readRead Strategy MemoryARead-onlyIdempotent
Read the agent/user notes attached to a strategy — the durable context that outlives a single session. Returns the most recent limit notes (default 10), newest first. Read this at the START of working on an existing strategy to recover the reasoning trail — why prior changes were made, the baseline metrics, the known risks — so you build on that context instead of re-deriving it. Do NOT use to fetch strategy source or metadata — call keel_strategy_get. Do NOT use to write notes — call keel_strategy_memory_write.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max notes to return (newest first). | |
| strategy_id | Yes | Strategy id whose memory to fetch. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint. The description adds context about returning notes newest first, default limit, and the durable nature of the context. It does not contradict annotations and adds useful behavioral context beyond the structured metadata.
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 with purpose first, then usage guidance and exclusions. It is longer than minimal but every sentence serves a purpose; no redundancy. It could be slightly more concise but is front-loaded and effective.
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 only 2 simple parameters and an output schema present, the description covers purpose, usage timing, return behavior, and exclusions. Nothing needed for correct invocation is missing. The output schema handles return format details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are documented in the schema. The description adds a bit of context (e.g., 'newest first' for limit) but this is already in the schema's limit description. No significant new meaning added, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the verb 'Read' and resource 'agent/user notes attached to a strategy' clearly, and distinguishes from siblings by explicitly naming keel_strategy_get and keel_strategy_memory_write. It is specific and 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 explicitly guides when to use ('at the START of working on an existing strategy') and when not to use, naming the alternate tools for source/metadata and writing notes. This is exactly what's needed for correct tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_memory_writeWrite Strategy MemoryA
Append a durable note to a strategy's memory — the place to capture WHY, not what. Record the reasoning behind a change, a baseline metric, or a known risk so the next session, teammate, or agent inherits the context instead of re-deriving it; a note that explains a decision is worth far more than a transcript of steps. Defaults to role='agent'; pass role='user' for human-authored notes. Do NOT use to mutate strategy source — call keel_strategy_compose. Do NOT use to read existing notes — call keel_strategy_memory_read.
| Name | Required | Description | Default |
|---|---|---|---|
| note | Yes | The note body (markdown allowed). | |
| role | No | Who authored the note. | agent |
| strategy_id | Yes | Strategy id to attach the note to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false. The description adds value by specifying the 'Append' behavior (non-destructive, non-idempotent) and the default role='agent' with a note on how to override. It does not contradict annotations and provides context about persistence ('durable') beyond the flags.
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?
Four sentences with zero redundancy. The core action and purpose are front-loaded, followed by concrete examples and clear exclusions. 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?
Given the simple 3-parameter schema (100% coverage), available output schema, and annotations, the description fully equips an agent to call the tool correctly. It covers content guidance, exclusions, and default behavior; nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already documented. The description goes further by explaining the semantic intent of the `note` (capture reasoning, not steps) and the `role` default/override, which adds meaning beyond the schema's brief field 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 states a specific verb ('Append') and resource ('a strategy's memory'), and immediately distinguishes itself from siblings by naming `keel_strategy_compose` and `keel_strategy_memory_read` as alternatives for mutation and reading. The purpose is clear and non-tautological.
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 gives explicit guidance on when to use (capture WHY, baseline metrics, risks) and when not to use (mutating strategy source, reading existing notes), explicitly naming the alternative tools. No inference is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_pullPull Strategy UpdatesAIdempotent
Re-fetch the server HEAD into the local working copy — the 'git pull' of the sync model. Refuses when local has uncommitted changes (diverged) so you don't silently lose work; push first, or pass force=True to overwrite local (LOSES local edits). Use it when someone else — a teammate, the web editor, a fork, a restore — may have moved the strategy while you were working locally; check keel_strategy_status first to see whether a pull is even needed. Do NOT use to send local edits UP — call keel_strategy_push. Do NOT use to inspect what changed — call keel_strategy_log.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite local changes with server HEAD. LOSES local edits — only use after explicit confirmation. | |
| strategy_id | No | Strategy to pull. Auto-detected from workspace if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal readOnlyHint=false, openWorldHint=true, idempotentHint=true, destructiveHint=false. The description adds crucial context beyond that: it refuses when local has uncommitted changes, warns that force overwrites and 'LOSES local edits', and explicitly frames this as preventing silent work loss. This is valuable behavioral detail that the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and every sentence carries information: purpose, refusal behavior, when to use, and what not to use. Though slightly long, it is well-organized and front-loads the core action. No filler or repetition; it earns its 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?
The description covers the primary use case, the safety guardrail, the force escape hatch, and explicitly routes to sibling tools for other operations. For a pull/sync operation with only two optional parameters, this is complete enough for an agent to invoke correctly. The presence of an output schema also reduces the need to describe returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (force and strategy_id) are already documented in the schema. The description's mention of force=True reinforces the loss warning, but it does not add new semantic meaning beyond the schema. With full schema coverage, a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Re-fetch the server HEAD into the local working copy' and explicitly names the git pull analogy. It clearly distinguishes itself from siblings by stating what it is not: 'Do NOT use to send local edits UP — call keel_strategy_push. Do NOT use to inspect what changed — call keel_strategy_log.' This makes the tool's purpose unambiguous and separates it from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use context: 'Use it when someone else — a teammate, the web editor, a fork, a restore — may have moved the strategy while you were working locally' and advises a preceding status check. It also gives negative guidance (when not to use) and alternatives (push, log), making the decision process clear for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_pushPush Local Strategy ChangesA
Commit local strategy.py changes back to the platform as a new version — the 'git push' of the sync model. Server HEAD is the source of truth, and pushing is how local edits become runnable: it reads the local working copy, validates it, and creates a new commit (new HEAD). Conflict-safe by default (sends expected_source_hash against what the server had at last checkout/pull); pass force=True only when you've verified no concurrent work — it overwrites the server HEAD. Auto-detects strategy_id from the current workspace when omitted. Push AFTER editing strategy.py, BEFORE running a backtest — backtests run against server HEAD, so unpushed local changes won't be tested; include a commit message so keel_strategy_log stays readable. Do NOT use to CREATE a new strategy from scratch — call keel_strategy_compose. Do NOT use to publish a strategy publicly — call keel_share_create.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Skip conflict detection. Overwrites server HEAD even if it moved since checkout. Use only when you've verified there's no concurrent work. | |
| message | No | Commit message. Highly recommended — shows in `keel_strategy_log` and the web app version history. Like a git commit message. | |
| strategy_id | No | Strategy to push. If omitted, auto-detects from the workspace (set via `keel_strategy_checkout` or by being in the workspace directory). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds rich context beyond annotations: conflict-safety through expected_source_hash, the overwrite behavior of force=True, auto-detection of strategy_id, and the critical fact that unpushed local changes won't be tested. Annotations only state readOnlyHint=false and destructiveHint=false; the description explains the actual write mechanics and safety model.
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?
Every sentence earns its place. The opening is a clear verb+resource, the analogy is immediate, workflow instructions are front-loaded, and exclusions come at the end. It covers a lot of ground without redundancy. The length is justified by the tool's complexity.
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 mutation tool with three parameters involving conflict handling and a workflow dependency on backtests, the description covers all needed information: what, when, why, how to stay safe, what not to do, and the relationship to backtests and history. The existing output schema reduces the need to describe 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?
Schema coverage is 100% and each parameter already has a solid description. The tool description adds marginal but useful context: clarifies that force should only be used after verifying no concurrent work (echoing schema), that message impacts keel_strategy_log readability, and details the auto-detection of strategy_id. This goes slightly beyond the schema's plain definitions.
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 precise verb-resource pair: 'Commit local strategy.py changes back to the platform as a new version' and immediately uses the memorable 'git push' analogy. It names two sibling tools it is NOT (keel_strategy_compose, keel_share_create), making differentiation explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete workflow timing: 'Push AFTER editing strategy.py, BEFORE running a backtest' and explains why (backtests run against server HEAD). Explicitly lists when NOT to use and redirects to keel_strategy_compose and keel_share_create. Also notes the message requirement for log readability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_restoreRestore Strategy VersionA
Restore a historical commit as the new HEAD — the safe undo of the sync model. Server-side: reads the source at the named ref (sequence number, commit_id, or tag), then creates a NEW commit on HEAD with that source, so history is preserved (the restore itself shows up in keel_strategy_log) — the 'git revert' rather than a destructive rewind. Use it when an edit should be undone, or when an older version backtested better and you want to go back; find the ref with keel_strategy_log first. After restore, a checked-out local workspace is 'behind' — run keel_strategy_pull to catch up. Do NOT use to fork into a new strategy — call keel_strategy_fork. Do NOT use to discard local edits — that's keel_strategy_pull force=True or keel_strategy_discard.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Which commit to restore. Accepts: sequence number (e.g. `3`), commit_id (`cmt_xyz`), or tag (`v1.0`). Find via `keel_strategy_log`. | |
| message | No | Commit message for the new HEAD. Defaults to 'Restore version <ref>'. | |
| strategy_id | Yes | Strategy to restore. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are sparse (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the description carries the behavioral burden. It fully discloses that the operation creates a new commit preserving history, explains the server-side flow, states that the restore appears in the log, and warns that local workspaces become 'behind' requiring keel_strategy_pull. It also explicitly contrasts with a destructive rewind. This enriches the agent's mental model beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place. The description is front-loaded with the core behavior and safety framing, then moves to usage and exclusions. No repetition, no fluff. The structure flows naturally from 'what' to 'when' to 'when not', 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?
For a tool with non-trivial semantics (history-preserving restore, ref types, post-conditions) and an output schema, the description covers all necessary operational details: how to find the ref, what the operation does, what side effects occur on local workspaces, and valid alternatives. An agent has everything needed to decide and execute 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 coverage is 100%, but the description adds meaningful semantics: it explains that 'ref' accepts sequence numbers, commit IDs, or tags with concrete examples, and tells the agent to discover it via keel_strategy_log. It also clarifies the default for 'message'. These details are not present in the raw schema and are essential for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Restore a historical commit as the new HEAD'. It distinguishes itself from siblings by explicitly naming keel_strategy_fork, keel_strategy_pull, and keel_strategy_discard as alternatives for different intents, and frames the tool as the 'safe undo' versus destructive rewinding. This makes the tool's distinct purpose unmistakable.
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 precise when-to-use conditions (undo an edit, revert to a better-backtested version) and prerequisite workflow (find ref with keel_strategy_log first). It also names three clear when-not-to-use cases with specific alternative tools/parameters: fork uses keel_strategy_fork, discarding local edits uses keel_strategy_pull force=True or keel_strategy_discard. No ambiguity remains.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_searchSearch StrategiesARead-onlyIdempotent
Search and list strategies in the current org by query (name substring), tag, owner, or share_id — the entry point when the user wants to work on an EXISTING strategy rather than build a new one. Find the strategy here, then keel_strategy_get (with include_source=true) to inspect its actual pipeline before proposing a change, and keel_strategy_fork to iterate on a copy without touching the original. On CLI (TTY) calls with no filters, also includes locally checked-out workspaces. Do NOT use to fetch a strategy's full source or version history — call keel_strategy_get. Do NOT use to look up pipeline component metadata — call keel_components_search.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Filter by strategy tag. | |
| limit | No | Max results. | |
| owner | No | Filter by owner principal/org. | |
| query | No | Name substring filter. | |
| cursor | No | Pagination cursor from prior call. | |
| share_id | No | Filter by share-link id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds behavioral nuance beyond annotations: it discloses that on CLI (TTY) calls with no filters, locally checked-out workspaces are also included, which is a runtime behavior an agent would not infer from the schema or annotations. It also clarifies that this tool searches/lists but does not return full source (that belongs to get). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat lengthy (about 120 words) but every sentence serves a purpose: purpose, workflow, TTY caveat, and exclusions. It is front-loaded with the core behavior and includes the most important differentiators early. While not terse, it is well-structured and avoids redundancy, earning a strong score.
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 (6 optional filters, pagination via cursor, output schema, and interactions with siblings), the description covers all essential aspects: what it returns (search results), when to use it, what it does not do, and the TTY-specific behavior. An output schema exists, so return format details are not required. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter already has a description. The tool description adds meaning above that: it clarifies that `query` is a 'name substring' filter and groups all filter parameters into a cohesive filter set. This helps an agent understand that these parameters are used for filtering rather than for other purposes, adding modest value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair — 'Search and list strategies in the current org' — and enumerates the exact filter dimensions (`query`, `tag`, `owner`, `share_id`). It distinguishes itself from sibling tools by explicitly naming `keel_strategy_get`, `keel_strategy_fork`, and `keel_components_search` as alternatives, leaving no ambiguity about what this tool does versus others.
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 explicit when-to-use guidance: it is 'the entry point when the user wants to work on an EXISTING strategy rather than build a new one.' It also gives a concrete workflow — find here, then `keel_strategy_get` (with `include_source=true`), then `keel_strategy_fork` — and includes two direct 'Do NOT use' exclusions with named alternative tools. This fully covers usage selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_statusLocal Workspace StatusARead-onlyIdempotent
Compare a local workspace's strategy.py against the server's current HEAD — the 'git status' of the sync model. Returns one of: clean (in sync), ahead (local has uncommitted edits — push first), behind (server moved — pull to catch up), diverged (both moved — needs explicit resolution). By default also returns the last 5 commits in recent_commits for 'what just happened' context (set include_recent=False for hot polling loops). Call this BEFORE keel_backtest_run — backtests use server HEAD, so unpushed local changes won't be tested — and after coming back from the web editor, where someone else may have edited. Auto-detects the strategy from the current workspace when strategy_id is omitted. Do NOT use to list ALL workspaces — call keel_strategy_workspaces. Do NOT use to inspect full history — call keel_strategy_log.
| Name | Required | Description | Default |
|---|---|---|---|
| strategy_id | No | Strategy to check. Auto-detected from workspace if omitted. | |
| include_recent | No | Include the most recent commits in the response (default: last 5). Lets the agent see 'what just happened' alongside sync state. Set False for hot polling loops where one extra GET is too expensive. | |
| recent_commits | No | How many recent commits to include when `include_recent=True`. Clamped to 0..20. | |
| no_ownership_hint | No | Omit first-session ownership guidance fields. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds substantial behavioral context beyond that: the meaning of each status, auto-detection of strategy_id, default inclusion of recent commits, and the recommendation to set include_recent=False for hot polling. It also explains why unpushed changes won't be tested (backtests use server HEAD). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place. It front-loads the core purpose and return values, then moves to usage guidance and exclusions. Despite length, it is efficiently structured with no fluff — each clause adds information the 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?
The description covers all necessary context for correct invocation: return statuses, their implications, when to call, exclusions, parameter behavior, and auto-detection. With an output schema present and annotations covering safety, nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. However, the description adds value by explaining the strategic use of include_recent (hot polling loops), clarifying the default behavior of recent_commits, and noting auto-detection when strategy_id is omitted. This goes beyond the schema's bare descriptions, justifying a 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 opens with a precise verb and resource: 'Compare a local workspace's strategy.py against the server's current HEAD'. It explicitly lists the four possible return values (clean, ahead, behind, diverged) and names the two siblings it is not (keel_strategy_workspaces, keel_strategy_log), making differentiation 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?
The description gives explicit temporal guidance: 'Call this BEFORE keel_backtest_run' and 'after coming back from the web editor'. It also states clear exclusions: 'Do NOT use to list ALL workspaces' and 'Do NOT use to inspect full history', naming the correct alternatives. This is exactly the when/when-not/alternatives structure expected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keel_strategy_workspacesList Local WorkspacesARead-onlyIdempotent
List every locally checked-out strategy workspace — strategy id, name, and sync metadata (source hash, checkout time, sequence at checkout). Pure filesystem read of ~/.keel/workspace/ (plus any project-local .keel/workspace.yaml-scoped workspaces); no server call. Use it when you've lost track of what's checked out, or to enumerate work-in-progress across strategies before pushing or cleaning up. Do NOT use to list strategies on the server — call keel_strategy_search. Do NOT use to check the sync state of one workspace — call keel_strategy_status.
| 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?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint. The description adds useful context: 'Pure filesystem read' and the specific directories scanned (~/.keel/workspace/ plus project-local .keel/workspace.yaml-scoped workspaces), and 'no server call'. This complements annotations without contradicting them.
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 sentences. The first sentence front-loads the core purpose and return fields, the second gives usage and exclusions. No wasted words or filler.
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 read tool with an output schema, the description is complete. It covers scope, return contents, usage scenarios, and alternative tools. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and schema coverage is 100% by default. With no parameters to explain, the baseline is 4. The description correctly omits 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 states a specific verb ('List'), resource ('locally checked-out strategy workspace'), and specifies the returned fieldsstrategy id, name, sync metadata). It also clarifies it's a pure filesystem read with no server call, distinguishing it from server-side listing 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?
Explicitly states when to use (lost track of checkouts, enumerate WIP before push/cleanup) and when NOT to use, naming alternative tools `keel_strategy_search` and `keel_strategy_status`. This gives clear guidance for selection.
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.
9 tool updates
v0.7.0- Changed
keel_auth_login1 field changed- added
Input schema / properties / attach_anonymous_workAdded value: +{ + "description": "Spec 09 CL-8: the user's decision on attaching the anonymous workspace to an account that already has strategies. Pass true/false ONLY after asking the user; with a pending claim stored, this resolves it without re-running the browser flow. Omit on a first login — fresh accounts claim automatically.", + "type": "boolean" +}
- Changed
keel_backtest_run7 fields changed- changed
Input schema / properties / auto_push / defaultPrevious value: -falseNew value: +true - changed
Input schema / properties / auto_push / descriptionPrevious value: -"If the local workspace has unpushed edits, push them first and backtest the resulting commit. Without this, an unpushed local copy raises `local_ahead` to prevent silently testing old server code."New value: +"Write-through default (true): if the local workspace has unpushed edits, push them first and backtest the resulting commit. Set false to opt out — an unpushed local copy then raises `local_ahead` instead of silently testing old server code. Conflicts (server moved too) always stop regardless." - added
Input schema / properties / config / additionalPropertiesAdded value: +false - changed
Input schema / properties / config / descriptionPrevious value: -"Worker config overrides (slippage, fees, initial_capital)."New value: +"Validated worker financial overrides." - added
Input schema / properties / config / propertiesAdded value: +{ + "fees": { + "default": 0.00045, + "description": "Per-trade fee rate as a decimal (default: 0.00045).", + "maximum": 1, + "minimum": 0, + "title": "Fees", + "type": "number" + }, + "init_cash": { + "default": 10000, + "description": "Starting capital in USD (default: 10000).", + "maximum": 1000000000, + "minimum": 0, + "title": "Init Cash", + "type": "number" + }, + "initial_capital": { + "default": 10000, + "deprecated": true, + "description": "Deprecated alias for init_cash; do not provide both.", + "maximum": 1000000000, + "minimum": 0, + "title": "Init Cash", + "type": "number" + }, + "leverage": { + "default": 20, + "description": "Maximum leverage cap; must be greater than 0 and at most 100 (default: 20).", + "exclusiveMinimum": 0, + "maximum": 100, + "title": "Leverage", + "type": "number" + }, + "slippage": { + "default": 0.00045, + "description": "Per-trade adverse slippage as a decimal (default: 0.00045).", + "maximum": 1, + "minimum": 0, + "title": "Slippage", + "type": "number" + } +} - added
Input schema / properties / config / titleAdded value: +"BacktestConfig" - changed
Input schema / properties / push_message / descriptionPrevious value: -"Commit message to use when `auto_push=True` triggers a pre-backtest push. Defaults to 'Auto-push before backtest'."New value: +"Commit message to use when the write-through guard pushes before the backtest. Defaults to 'Auto-push before backtest'."
- Changed
keel_components_search1 field changed- added
Input schema / properties / clock_directionAdded value: +{ + "description": "Restrict to components that change the bar clock in one direction. `resample` = fine → coarse aggregation of raw data (e.g. 1h OHLCV → 1d). `project` = coarse → fine, holding the last COMPLETED coarse bar across the finer grid (e.g. a 1d regime signal driving 1h execution) — the only safe way to move a signal down. `synth` = a data loader minting the entry clock. `keep` = leaves the clock untouched (most components).", + "enum": [ + "keep", + "synth", + "resample", + "project" + ], + "type": "string" +}
- Added
keel_feedback - Added
keel_library_fork - Added
keel_library_get - Added
keel_library_list - Added
keel_open_in_app - Added
keel_plan_status
5 tool updates
v0.6.1- Changed
keel_backtest_run1 field changed- added
Input schema / properties / no_ownership_hintAdded value: +{ + "default": false, + "description": "Omit first-session ownership guidance fields.", + "type": "boolean" +}
- Changed
keel_backtest_watch1 field changed- added
Input schema / properties / no_ownership_hintAdded value: +{ + "default": false, + "description": "Omit first-session ownership guidance fields.", + "type": "boolean" +}
- Added
keel_ownership_status - Changed
keel_strategy_get1 field changed- added
Input schema / properties / no_ownership_hintAdded value: +{ + "default": false, + "description": "Omit first-session ownership guidance fields.", + "type": "boolean" +}
- Changed
keel_strategy_status1 field changed- added
Input schema / properties / no_ownership_hintAdded value: +{ + "default": false, + "description": "Omit first-session ownership guidance fields.", + "type": "boolean" +}
31 tool updates
v0.1.0- First observed
keel_accounts_list - First observed
keel_audit_list_last - First observed
keel_auth_login - First observed
keel_auth_logout - First observed
keel_backtest_run - First observed
keel_backtest_summarize - First observed
keel_backtest_watch - First observed
keel_components_compose_help - First observed
keel_components_detail_batch - First observed
keel_components_search - First observed
keel_doctor - First observed
keel_help - First observed
keel_live_monitor - First observed
keel_share_create - First observed
keel_status - First observed
keel_strategy_checkout - First observed
keel_strategy_compose - First observed
keel_strategy_delete - First observed
keel_strategy_diff - First observed
keel_strategy_discard - First observed
keel_strategy_fork - First observed
keel_strategy_get - First observed
keel_strategy_log - First observed
keel_strategy_memory_read - First observed
keel_strategy_memory_write - First observed
keel_strategy_pull - First observed
keel_strategy_push - First observed
keel_strategy_restore - First observed
keel_strategy_search - First observed
keel_strategy_status - First observed
keel_strategy_workspaces
TDQS
Scored across 38 tools
Most tools are clearly distinct by domain and action, with detailed descriptions preventing major overlap. The main exceptions are keel_status, keel_plan_status, and keel_doctor, which share quota/auth/environment diagnostics and could be confused, plus the backtest watch/summarize pair which both return metrics. Overall, the boundaries are mostly clear.
The vast majority follow the pattern keel_<domain>_<action> (e.g. strategy_get, backtest_run, library_fork) with consistent snake_case. Minor deviations like keel_help, keel_status, keel_doctor, and keel_feedback drop the domain prefix, but these are few and the pattern is otherwise highly regular.
At 38 tools, the server is well beyond the 25+ threshold where a toolset starts to feel heavy. The strategy lifecycle alone contributes 16 tools, and some could be consolidated (e.g. components_compose_help vs components_detail_batch, or the git-like sync tools). While the scope is broad, the count is excessive for a single MCP server.
Core strategy creation, versioning, backtesting, and sharing are well covered, but live trading is incomplete: the set includes keel_live_monitor but lacks keel_live_deploy and keel_live_control, which are referenced in several tool descriptions. This leaves agents unable to deploy, stop, or change live deployments, creating significant dead ends for a trading-strategy platform.
Maintenance
Related MCP Connectors
Non-custodial Hyperliquid perp trading: live markets, account state, user-armed order execution
Hyperliquid - 2 tools for perpetuals, options, and position data
Polymarket + Hyperliquid + macro for AI agents. 38 tools, signal backtest, SSE streaming. Free tier.
Research-only MCP server: your AI as a quant research desk. 90 tools, no trades, no brokers.
Related MCP Servers
- AlicenseBqualityFmaintenanceAn MCP server implementation that integrates with Hyperliquid exchange, providing access to crypto market data including mid prices, historical candles, and L2 order books.328 npm44MIT
- AlicenseAqualityFmaintenanceAn MCP server that provides real-time data and insights from the Hyperliquid perp DEX for use in bots, dashboards, and analytics.1730MIT

Purple Flea Tradingofficial
AlicenseNot gradedqualityDmaintenancePerpetual futures trading API for AI agents. Access 275+ markets (crypto, stocks, commodities, forex) via Hyperliquid. Copy trading, leaderboard, up to 50x leverage. No KYC. 20% referral commissions.29 npmMIT- AlicenseNot gradedqualityCmaintenanceLocal-first backtesting engine with built-in overfitting detection (PBO, deflated Sharpe, bootstrap CI, walk-forward) and a native MCP server for AI agents to validate trading strategies.4Apache 2.0