OctoBot MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@OctoBot MCP ServerCan you compare the backtest results from my last two strategies?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
OctoBot MCP Server
An MCP (Model Context Protocol) server that wraps a single OctoBot instance's web API so an AI agent (e.g. Claude Code) can manage trading profiles, run and compare backtests, and drive OctoBot's portfolio/trading, exchange, and tentacle-config surfaces — all through OctoBot's existing HTTP API, without you hand-writing a client for it.
Use this if you already run an OctoBot instance and want an agent to operate it (list/create/switch profiles, kick off and compare backtests, check positions and PnL, tweak tentacle/trading config) instead of clicking through OctoBot's web UI yourself. It is not a trading strategy, a replacement for OctoBot itself, or a multi-instance fleet manager (see "Design docs" below for what's explicitly out of scope and why).
Status: v1 complete, plus several post-v1 addenda. All 14 original
tasklist milestones, and additional addenda closing gaps found after v1
shipped (historical data collection, evaluator config, this server's own
logging, and a scoped OctoBot-restart capability), are implemented,
judge-verified, and committed — see docs/tasklist.md for the full,
numbered history. The server registers 47 tools across profiles, async
backtesting/strategy comparison/historical data collection, portfolio &
trading, exchanges, tentacle/trading config, and instance lifecycle. See
"Available tools" below for the full list, or connect a client and read
mcp.instructions/each tool's own description — both are written to stand
alone without this file.
Requirements
Python 3.10+
A running OctoBot instance reachable over plain HTTP, with
login_required_when_activateddisabled (session-login support is out of scope for v1 — see ADR-0005)The
mcppackage and its other runtime dependencies (httpx2,beautifulsoup4,python-socketio) — installed automatically as dependencies
Related MCP server: freqtrade-mcp-server
Install
From the repo root, in a virtual environment:
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"The dev extra adds pytest (for the test suite) and the mcp CLI extra
(for mcp dev, useful for manual poking with the MCP Inspector).
Configure
The server targets exactly one OctoBot instance for its whole process lifetime (ADR-0004) — no tool takes an instance/base-URL parameter. Set its base URL via an environment variable before launching:
export OCTOBOT_BASE_URL=http://192.168.178.100:5001The server fails fast at startup with a clear error if this is unset or not
a valid http(s):// URL.
Run
Per ADR-0001, this server speaks MCP over stdio only: it is meant to be launched by an MCP client (e.g. Claude Code), not run standalone. Any of these are equivalent launch commands:
python -m octobot_mcp
# or, if installed:
octobot-mcp
# or, via the SDK's own CLI:
mcp run src/octobot_mcp/server.pyOnce running, the process blocks silently waiting for a client to speak
first on stdin — that's expected, not a hang. Ctrl-C to stop it.
Register with Claude Code
claude mcp add octobot --env OCTOBOT_BASE_URL=http://192.168.178.100:5001 -- /absolute/path/to/.venv/bin/python -m octobot_mcpThen run /mcp inside a Claude Code session to confirm octobot is
connected and lists 47 tools.
Available tools
Profiles:
list_profiles,get_profile,create_profile,update_profile,select_profile,export_profile,delete_profile(confirm-gated),convert_profile_to_live(confirm-gated)Backtesting & strategy comparison (async —
start_backtest/compare_strategiesreturn ajob_idimmediately; pollget_job_statusuntilstateis terminal, then callget_job_result):start_backtest,compare_strategies,get_job_status,list_jobs,cancel_job,get_job_resultPortfolio & trading:
get_orders,get_positions,get_trades,get_pnl_history,get_historical_portfolio_value,cancel_order,close_position,refresh_portfolio,clear_orders_history(confirm-gated),clear_trades_history(confirm-gated),clear_portfolio_history(confirm-gated),clear_transactions_history(confirm-gated)Exchanges:
get_currency_list,get_all_currencies,get_all_symbols,check_accounts_compatible,get_exchange_details,update_exchange_credentials(confirm-gated)Tentacle & trading config:
get_tentacle_config,update_tentacle_config,update_trading_config,update_evaluator_config,list_evaluators(task 19, ADR-0009 — a third Tier-B HTML-scrape read adapter, originally recommended NO-GO then reversed to GO by explicit user decision; enumerates every evaluator's name/activation state/category, closingupdate_evaluator_config's own companion-read gap),export_logs,list_tentacles(stub — no JSON API exists),get_logs(stub — no JSON API exists)Historical data collection (async —
start_data_collectionreuses the samejob_id/get_job_status/cancel_job/get_job_resultpattern asstart_backtest, above):start_data_collection,list_data_files,delete_data_file(confirm-gated),import_data_file,get_available_timeframes_for_collection. There is no separateget_available_symbols_for_collectiontool — the existingget_all_symbolstool already returns equivalent data for this purpose.Instance lifecycle (task 18, ADR-0010 — narrow, explicit reversal of this project's own "reboot" out-of-scope exclusion):
restart_octobot(confirm-gated) triggers a full OctoBot process restart;wait_for_octobot_readypolls for the instance becoming reachable again afterward, with real measured timing behind its defaults (60s timeout/2s poll interval — two live restarts measured ~2.1s until the old process goes down, ~6.3–6.7s of real outage, ~8.5–8.9s total until reachable again) and a real readiness-check race bug found and fixed (an early poll could catch the still-alive old process and falsely reportready: truebefore anything had restarted).restart_octobotcan never be made fully safe or graceful — OctoBot's own restart mechanism is an abrupt kill-and-re-exec, not a clean shutdown. This capability was built to unblock evaluator/strategy-composition-tuning backtest validation, and live testing has since CONFIRMED it does not achieve that — the restart mechanism itself works correctly, but aprofile_id-targeted backtest still doesn't reflect strategy-composition config changes (which/how-many evaluators must agree) after a restart, confirmed on two separate OctoBot instances. Order-execution config (sizing, stop-loss/ take-profit) is unaffected and applies correctly without a restart. Seedocs/adr/0010-octobot-restart-capability.md's "Negative finding" for the full account, including an open question of whether to keep this capability at all now that its stated purpose doesn't hold.
Any tool marked "confirm-gated" refuses to act unless called with
confirm=true, returning a structured explanation instead (ADR-0003) — see
mcp.instructions' "Safety" section for the full rationale. delete_data_file
is confirm-gated alongside delete_profile/convert_profile_to_live/the
clear_*_history tools/update_exchange_credentials/restart_octobot.
Logging
The server's own structured logs (one line per tool call, one per job state
transition — see docs/specs/octobot-mcp-tool-spec.md's "Observability"
section) are written to a local rotating log file, not exposed through any
MCP tool. Configured once, in main(), before the transport starts:
Env var | Default | Purpose |
|
| Log file path (parent directory created if missing) |
|
| Root logger level for the file handler |
|
| Rotation size threshold |
|
| Number of rotated backups kept |
A separate stderr handler, fixed at WARNING+ regardless of
OCTOBOT_MCP_LOG_LEVEL, ensures a crashing process still surfaces something
to whatever the MCP client captures from the subprocess.
Test
pytest371 tests, no live instance required — every test mocks the OctoBot HTTP/ Socket.IO layer. Live verification against a real instance was done per-milestone during development (see each milestone's commit message). CI runs this same suite on every push and pull request (see the CI badge above).
Design docs
docs/adr/— architectural decisions (transport/SDK choice, async job model, confirm-flag gating, single-instance config, no-auth v1 scope, read-model acquisition strategy)docs/requirements/octobot-mcp-requirements.md— functional/non-functional requirementsdocs/specs/octobot-mcp-tool-spec.md— the tool inventory, job store design, and ETA algorithmdocs/tasklist.md— the build roadmap, in the order it was actually implemented
Contributing
Bug reports and pull requests are welcome — see
CONTRIBUTING.md for how to set up a dev environment, the
project's conventions, and how to submit a change. Please also read the
CODE_OF_CONDUCT.md. Found a security issue,
especially anything touching exchange credential handling? See
.github/SECURITY.md instead of filing a public
issue.
License
MIT — see LICENSE.
Available Tools
47 toolscancel_jobA
Cancel a job, or report its existing terminal state if already finished.
Not confirm-gated (ADR-0003's explicit non-gated list): reversible, no data loss. Idempotent: cancelling an already-terminal job just returns its existing status, never an error.
This milestone implements only the state-machine transitions that don't require calling OctoBot (no HTTP/Socket.IO call happens here, or anywhere else in this module):
queued(waiting onbacktest_execution_lock, never started): cancelled directly.running: only setscancel_requested = Trueon the record. Milestone 8's watcher loop is what will actually notice the flag, tell OctoBot to stop, and transition the record tocancelledonce that's confirmed -- this tool deliberately does NOT fabricate an immediatestate="cancelled"for a running job, since nothing here is actually stopping it.
Raises JobNotFoundError for an unknown job_id (same as
get_job_status).
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully covers behavioral expectations: idempotency, no data loss, not confirm-gated, no HTTP/Socket.IO call, and the important limitation that a running job only gets cancel_requested set rather than an immediate cancelled state. It also discloses the JobNotFoundError behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place; it is front-loaded with purpose and safety and uses bullets for state-specific behavior. The structure makes complex milestone-specific behavior easy 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 no annotations and no output schema, the description is remarkably complete: it covers purpose, idempotence, side effects, state transitions, async behavior, and error conditions. Nothing needed for correct invocation or expectation-setting 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 only defines job_id as a string with zero description coverage, so the description must carry the burden. It adds meaning by explaining how unknown job_id values are handled and referencing get_job_status for the same error behavior, though it could further clarify where valid job IDs come from.
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: 'Cancel a job, or report its existing terminal state if already finished.' It distinguishes the tool's behavior across job states and separates it from siblings like get_job_status and cancel_order by describing its state-transition scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states this tool is for canceling jobs and describes what happens for queued vs running jobs, giving an agent a solid basis for when to invoke it. It does not explicitly enumerate alternatives or exclusions, but the intended context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_orderA
Cancel one order by id.
Maps to POST /api/orders?action=cancel_order -- action is a query
parameter, not a JSON body field (confirmed against source, the same
pattern octobot_mcp.tools.tentacles.update_tentacle_config already
documents for its own route). The JSON body is the raw order_id value
itself, NOT wrapped in an object: confirmed against source
(Services/Interfaces/web_interface/api/trading.py::orders() does
interfaces_util.cancel_orders([flask.request.get_json()]), and
cancel_orders(order_ids) -- packages/services/octobot_services/ interfaces/util/order.py -- iterates its argument directly as a list of
order ids). Use the id field from get_orders()'s own response items
for this value.
Success: OctoBot returns HTTP 200 with the literal JSON string "Order cancelled", returned unchanged (NFR-8). Failure -- the order wasn't
found on any connected exchange, including the case where every
exchange manager tried raised an internal cancel error OctoBot itself
silently swallows rather than propagating (see this module's docstring)
-- raises OrderCancelRejectedError with OctoBot's own extracted error
text (always, in practice, the literal "Impossible to cancel order: order not found.").
Not confirm-gated: the user was explicitly asked about the spec's own
footnote flagging this tool as "revisitable" given its irreversible
effect, and chose to keep it ungated (milestone 13.6), per ADR-0003's
original reasoning that this is routine, expected trading-bot activity.
No confirm parameter exists on this tool at all.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral disclosure and does so thoroughly: exact HTTP success behavior, literal success string, failure mode including OctoBot's swallowed internal errors, the raised exception, and the irreversibility/confirm-gating rationale. This goes far beyond a generic 'cancels an order' statement.
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 organized into clear route/body, success/failure, and confirmation-gating sections. It is somewhat verbose with source-code citations and internal references, but most of that detail directly supports correct invocation and behavioral expectations.
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 single parameter, no annotations, and no output schema, this description is exceptionally complete. It covers parameter construction, HTTP details, success and failure behavior, exception types, and the absence of a confirm parameter, leaving little ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must fully explain the parameter, and it does. It clarifies that order_id is sent as the raw JSON body rather than wrapped in an object, that action is a query parameter, and that the value should come from get_orders() responses.
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 opening sentence 'Cancel one order by id' names a specific verb, a specific resource (one order), and the identifying input. It is clearly distinguishable from sibling tools like cancel_job, close_position, and clear_orders_history.
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 explains how to obtain the correct value ('Use the id field from get_orders()'s own response items'), which is key usage guidance. It does not explicitly contrast this tool with sibling alternatives or state when not to use it, but the context is strong and the invocation path is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_accounts_compatibleA
Check whether each named exchange's already-configured account is usable.
Maps to POST /api/are_compatible_accounts. OctoBot's real request
body for this route is more general than this tool's input -- it
expects a dict keyed by exchange, each value an object with
exchange/apiKey/apiSecret/apiPassword/sandboxed fields meant
for OctoBot's own "test these credentials" UI form (confirmed against
OctoBot source models/configuration.py::are_compatible_accounts()
and octobot_commons.constants, [V] this session -- this is a
correction of this tool's spec entry, which only names
exchange_names; see the implementation report for detail).
This tool deliberately narrows that to just exchange_names and
always submits OctoBot's own masked-placeholder value ("******")
for the credential fields, so it checks compatibility using whatever
credentials are already stored on the OctoBot instance for each
named exchange, never a credential supplied through this call.
Confirmed from source: OctoBot only treats a non-placeholder value as
a real credential update (_is_real_exchange_value) and otherwise
falls back to the exchange's already-configured encrypted value, so a
placeholder-only request checks the existing configuration without
ever transmitting or requiring a real credential. No credential value
passes through this tool's input or output. Read-only in effect, not
confirm-gated. Returns OctoBot's own JSON body unchanged (NFR-8).
CAVEAT: sandboxed is currently hardcoded to False for every
exchange checked, regardless of how that exchange is actually
configured on the instance. It is unconfirmed whether OctoBot's
credential-fallback path uses this value to pick which environment
(testnet vs. production) to validate stored credentials against; if
it does, a genuinely sandboxed exchange may be checked against the
wrong environment. Treat this tool's result with caution for any
exchange you know to be configured in sandbox/testnet mode until this
is confirmed against source.
| Name | Required | Description | Default |
|---|---|---|---|
| exchange_names | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden, and it excels: it reveals the underlying endpoint, explains the masked-placeholder credential behavior, confirms no credential passes through input/output, states it is read-only in effect, and discloses the sandboxed-hardcoded caveat. This is exemplary transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than typical but every paragraph adds value, especially given the absence of annotations and the nuanced behavior. It front-loads the purpose and then provides necessary caveats. Slight over-inclusion of source-verification detail prevents a 5 for conciseness.
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 no annotations, no output schema, and a single parameter, the description is remarkably complete: it explains the request mapping, credential handling, return behavior, and a serious caveat about sandbox mode. An agent has sufficient context to invoke it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clearly explains that exchange_names is the list of exchanges to check compatibility for, and that the tool deliberately narrows its input to just this field. It doesn't specify accepted name formats or edge cases, but the core semantic is well-covered.
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: 'Check whether each named exchange's already-configured account is usable.' This clearly distinguishes it from sibling tools like update_exchange_credentials or get_exchange_details by emphasizing it validates existing stored credentials rather than accepting new ones. The scope is 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 clearly implies when to use this tool: to verify compatibility of already-configured exchanges without supplying credentials. It explicitly states that credentials cannot be passed through this call and that it falls back to stored credentials. However, it does not explicitly name an alternative tool or provide a direct when-not-to-use statement, so it falls short of full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_orders_historyA
Permanently clear OctoBot's stored orders history. Confirm-gated (ADR-0003).
If confirm is not exactly true, no OctoBot call is made at all --
this returns require_confirmation's structured refusal (a normal
return, not an error) instead.
Once confirmed, maps to POST /api/clear_orders_history ([V],
re-confirmed against source this session -- see this module's
docstring). Returns OctoBot's own JSON body unchanged (NFR-8):
{"title": "Cleared orders history"}.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so thoroughly. It reveals the destructive nature ('Permanently clear'), the confirm-gating logic, the exact behavior when confirmation is false (a structured refusal, not an error), the underlying POST call, and the unchanged JSON response.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact but every sentence contributes: purpose, confirmation gate, no-op behavior, endpoint mapping, and response format. It is front-loaded and free of filler, with technical references that add verification 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 destructive, confirm-gated tool with no annotations and no output schema, the description is complete. It explains prerequisites, runtime behavior, side effects, and the exact return value, leaving no ambiguity for an agent deciding whether and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines `confirm` with a default of false and no description, so 0% schema coverage leaves the description to carry the meaning. The description fully explains that `confirm` must be exactly `true` and what happens otherwise, making the parameter behavior completely clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Permanently clear OctoBot's stored orders history' – a specific verb and resource that immediately distinguishes it from sibling tools like clear_trades_history and clear_portfolio_history. The wording also conveys irreversibility, further clarifying intent.
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 clearly states the operation and the critical prerequisite: 'If `confirm` is not exactly `true`, no OctoBot call is made at all'. It doesn't explicitly contrast with alternative clear_* siblings, but the resource is unambiguous and the confirmation gate is a concrete usage condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_portfolio_historyA
Permanently clear OctoBot's stored historical portfolio values. Confirm-gated (ADR-0003).
If confirm is not exactly true, no OctoBot call is made at all --
this returns require_confirmation's structured refusal (a normal
return, not an error) instead.
Once confirmed, maps to POST /api/clear_portfolio_history ([V],
re-confirmed against source this session -- see this module's
docstring). Returns OctoBot's own JSON body unchanged (NFR-8):
{"title": "Cleared portfolio history"}.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does so thoroughly. It discloses the permanent/destructive nature, the confirm-gating mechanism, the fact that a false confirm results in a structured refusal rather than an error, the exact HTTP endpoint, and the unchanged response body. This is exemplary transparency for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded, with the core purpose in the first sentence. However, it contains some internal references (ADR-0003, NFR-8, module docstring, '[V]') that are likely noise for an AI agent and add little actionable value for tool selection or invocation.
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 destructive nature, lack of annotations, and lack of an output schema, the description is remarkably complete. It covers the action, the confirmation requirement, the no-op behavior when unconfirmed, the endpoint mapping, and the expected response body. An agent has everything needed to invoke it correctly and understand the consequences.
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 lone parameter confirm has 0% schema description coverage, so the description must supply all meaning. It explains that confirm must be exactly true for any OctoBot call to occur, and that otherwise a refusal is returned normally. This gives the agent far more than the schema's default value of false could.
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 begins with a specific verb and resource: 'Permanently clear OctoBot's stored historical portfolio values.' This clearly distinguishes it from sibling clear tools like clear_orders_history and clear_trades_history by narrowing the target to portfolio history only.
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?
While the description does not explicitly name alternative tools, it provides strong contextual guidance: it is the tool for permanently clearing portfolio history, and it requires confirm to be exactly true before any call is made. The confirm-gated behavior is a clear operational condition, though no when-not-to-use or alternative comparisons are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_trades_historyA
Permanently clear OctoBot's stored trades history. Confirm-gated (ADR-0003).
If confirm is not exactly true, no OctoBot call is made at all --
this returns require_confirmation's structured refusal (a normal
return, not an error) instead.
Once confirmed, maps to POST /api/clear_trades_history ([V],
re-confirmed against source this session -- see this module's
docstring). Returns OctoBot's own JSON body unchanged (NFR-8):
{"title": "Cleared trades history"}.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it excels: it discloses permanent destruction, confirms no side effects unless `confirm` is true, explains that the refusal path is a normal return rather than an error, maps to the exact endpoint, and specifies the response body.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized and front-loaded with the core purpose, followed by confirmation semantics, endpoint mapping, and return shape. Minor internal references such as ADR-0003, NFR-8, and module docstring are not strictly actionable for an agent, so the prose is slightly less lean than it could be.
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 destructive tool with no output schema, this description is complete: it covers the required confirmation flag, side effects, non-error refusal behavior, endpoint, and exact successful response. An agent has everything needed to invoke 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 coverage is 0%, so the description must explain the `confirm` parameter, and it does: `true` triggers clearing, anything else returns a structured refusal without calling OctoBot. This adds substantial meaning beyond the bare boolean 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 uses a specific verb+resource pair ('Permanently clear OctoBot's stored trades history') and leaves no doubt about the target data. It also naturally distinguishes this tool from sibling clear_* tools by naming 'trades history' specifically.
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?
Clear invocation conditions are provided: the call is confirm-gated, and if `confirm` is not exactly `true` no OctoBot call occurs. However, it does not explicitly contrast this tool with alternatives like `clear_orders_history` or `clear_transactions_history`; the differentiation is left to the name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_transactions_historyA
Permanently clear OctoBot's stored transactions history. Confirm-gated (ADR-0003).
If confirm is not exactly true, no OctoBot call is made at all --
this returns require_confirmation's structured refusal (a normal
return, not an error) instead.
Once confirmed, maps to POST /api/clear_transactions_history ([V],
re-confirmed against source AND reproduced live this session against
the OctoBot 2.1.1 test instance -- see this module's docstring). Returns
OctoBot's own JSON body unchanged (NFR-8):
{"title": "Cleared transactions history"}.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses the destructive permanent effect, the no-op when unconfirmed, the mapping to `POST /api/clear_transactions_history`, and the exact return body. It even clarifies that the unconfirmed refusal is a normal return, not an error.
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, then gating behavior, then endpoint/return details. The verification notes about re-confirming against source and 'reproduced live this session' are informative but slightly verbose for an agent selecting the tool; they could be trimmed without losing action-guiding 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 single-parameter tool with no annotations and no output schema, the description is complete. It covers the operation, the confirmation requirement, the exact HTTP mapping, the refusal path, and the exact success response body. An agent has everything needed 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 0%, so the description must compensate for the single `confirm` parameter. It fully explains the semantics: `confirm` must be exactly `true` for any action, otherwise no call is made and a structured refusal is returned. This is sufficient despite the schema's lack of property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('clear') and resource ('OctoBot's stored transactions history'), and adds the critical qualifier 'permanently'. This distinguishes it from sibling clear-tools by resource and permanence without requiring schema inspection.
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 confirm-gating behavior is explicitly described: if `confirm` is not exactly `true`, no OctoBot call is made and a structured refusal is returned. This is clear usage guidance, though it does not explicitly name sibling alternatives like `clear_trades_history` or `clear_orders_history`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_positionA
Close one open position, identified by symbol and side.
Maps to POST /api/positions?action=close_position -- action is a
query parameter, not a JSON body field (same pattern as cancel_order
above). A genuine spec correction: the spec names this tool's
parameter position_id, but OctoBot positions have no id concept at
all -- confirmed against source (Services/Interfaces/web_interface/ models/trading.py::_dump_position, the exact function behind
get_positions()'s response, builds each position dict with
symbol/side/contract/... keys but no id key, unlike
_dump_order's sibling function which does include "id": order.order_id). The real route calls interfaces_util.close_positions( [{"symbol": ..., "side": ...}]) -- packages/services/ octobot_services/interfaces/util/position.py -- which reads exactly
positions_desc["symbol"]/positions_desc["side"]. side is submitted
as OctoBot's own PositionSide enum's literal value ("long"/
"short"/"both"/"unknown", confirmed against
octobot_trading.enums.PositionSide) -- the exact same string
get_positions()'s own side field already uses, so a value read from
that response can be passed straight through as both symbol and
side here.
Success: OctoBot returns HTTP 200 with the literal JSON string
"Position closed", returned unchanged (NFR-8). Failure -- no matching
open position on any connected exchange -- raises
PositionCloseRejectedError with OctoBot's own extracted error text
(always, in practice, the literal "Impossible to close position: position already closed.").
Not confirm-gated: the user was explicitly asked about the spec's own
footnote flagging this tool as "revisitable" given its irreversible
effect, and chose to keep it ungated (milestone 13.6), per ADR-0003's
original reasoning that this is routine, expected trading-bot activity.
No confirm parameter exists on this tool at all.
| Name | Required | Description | Default |
|---|---|---|---|
| side | Yes | ||
| symbol | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries behavioral disclosure. It details the exact HTTP route, the fact that action is a query parameter, the success response literal, the failure exception type and message, the absence of a confirm parameter, and the irreversible nature of the operation. This is far beyond the minimum.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a crisp purpose statement, followed by detailed sections. While the spec-correction and source-code references add length, they are informative and serve to prevent misuse. There is some redundancy in the repeated 'confirmed against' phrasing, so it is not perfectly concise, but every paragraph 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 lack of annotations, output schema, and schema-level parameter descriptions, this description is unusually complete. It covers the endpoint, parameter semantics, success behavior, failure behavior, and confirm-gating decision. An agent has everything needed to invoke the tool correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does thoroughly. It explains that symbol and side are the actual keys used by OctoBot, corrects the spec's position_id misconception, and lists the valid side enum values ('long'/'short'/'both'/'unknown'). It also tells the agent that values from get_positions() can be fed directly into this 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 opens with a concrete action and resource: 'Close one open position, identified by symbol and side.' It clearly names the tool's function and distinguishes it from sibling tools like get_positions (which reads) and cancel_order (which cancels orders). The resource and identifier mechanism are 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?
The description provides clear context for when to use the tool: to close a position, with symbol and side as input. It even instructs that values can be passed straight through from get_positions() output. It does not explicitly name alternative tools or exclusions, but given the tool name and the absence of a sibling close-position operation, usage context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_strategiesA
Compare 2+ backtest configs sequentially and return one combined job.
Not confirm-gated (ADR-0003): same reasoning as start_backtest --
only ever starts simulations. configs is a list (len(configs) >= 2)
of dicts, each shaped exactly like one of start_backtest's own
mode-specific input shapes ({"mode": "data_files", "files": [...], ...} or {"mode": "current_bot_data", "exchange_id": ..., ...}), plus
an optional "label" key used as that config's own config_label in
get_job_result's later comparison/diff output (see
_child_config_label) -- stripped before being validated/passed to
start_backtest's own mode builders, which know nothing about it.
name is accepted (per the spec's input shape) but not otherwise used:
neither this tool's own output nor get_job_result's compare_strategies
output shape (both fully spec'd) has anywhere to put it.
Every config is validated (same rules start_backtest itself applies)
BEFORE any job -- parent or child -- is created, so a bad configs
entry never leaves a dangling queued job behind: raises
CompareStrategiesStartFailedError naming the offending configs[i]
for len(configs) < 2, an unknown mode, a missing required field for
that mode, or an unrecognized field name.
Creates one parent job (kind: "compare_strategies") with one child
kind: "backtest" job per config (job.child_job_ids, in the same
order as configs), then spawns ONE background asyncio.Task (tracked
via store.track_watcher_task, same as start_backtest) running
_run_compare_strategies, which submits each child sequentially
through the shared backtest_execution_lock -- see that function's own
docstring for the full sequencing/failure-isolation/cancellation
behavior.
Output: {"job_id": str, "state": "queued"|"running", "sub_job_count": int} -- returns immediately, same non-blocking pattern as
start_backtest (always "queued" in practice, since
asyncio.create_task never runs any of the background task
synchronously before this function returns). Poll get_job_status(job_id)
for combined progress/ETA and each child's own live state
(sub_jobs); call get_job_result(job_id) once state == "completed".
Progress notifications (milestone 11, ADR-0002 decision point 3): if
THIS call (the parent) carries a progressToken, notifications report
the COMBINED progress across all children (the exact same formula
get_job_status already uses for polling reads), never one child's own
raw percentage -- see _run_compare_strategies/
_make_compare_strategies_on_tick's own docstrings. Children are never
independently callable, so they never carry their own token.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| configs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it delivers extensively: it states the tool is not confirm-gated, only starts simulations, validates all configs before creating jobs, avoids dangling queued jobs, returns immediately, always reports 'queued' in practice, and submits children sequentially through a shared lock. It also explains combined progress notification semantics and that children are never independently callable.
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 well-structured: it opens with a one-sentence summary, then adds parameter semantics, validation behavior, job structure, output shape, polling guidance, and progress notification details in labeled sections. It could be slightly tighter around internal docstring references and ADR details, but every part contributes to correct invocation.
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 absence of both annotations and output schema, the description is remarkably complete. It specifies the output JSON shape, error conditions and exception behavior, job hierarchy, asynchronous non-blocking behavior, polling/result instructions, and progress token semantics—everything an agent needs to invoke the tool correctly and interpret its immediate result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides almost no parameter meaning—configs is just an array of generic objects and name is loosely typed. The description compensates fully by specifying configs must be a list of length >= 2, each shaped like start_backtest's mode-specific inputs, with an optional label key that is stripped before validation, and by explicitly stating name is accepted but unused.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence, 'Compare 2+ backtest configs sequentially and return one combined job,' uses a specific verb, resource, and result. It clearly distinguishes compare_strategies from siblings like start_backtest by emphasizing the multi-config and combined-job behavior.
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 explains the tool is for comparing multiple backtest configs and explicitly references polling via get_job_status and retrieving results via get_job_result. It does not explicitly state 'use start_backtest for a single config,' but the '2+' constraint and repeated comparison to start_backtest make the usage context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_profile_to_liveA
Relabel a profile as OctoBot's internal ProfileType.LIVE and select it. Confirm-gated (ADR-0003).
This tool does NOT enable real-money trading -- confirmed against
OctoBot source, not just suspected (resolves requirements doc open
question #5). Whether OctoBot actually places real orders is governed
entirely by a separate config flag, config.trader.enabled, checked by
OctoBot's own is_real_trading(profile) (semantically: returns
trading_util.is_trader_enabled(profile.config), itself
config[CONFIG_TRADER][CONFIG_ENABLED_OPTION] -- both confirmed against
source, not a verbatim one-line quote of the actual multi-statement
function body). models.convert_to_live_profile and models.select_profile
(the two functions this tool's route calls -- see "Spec correction #1"
below) both leave config.trader/config.trader-simulator completely
untouched; only profile.profile_type (a label) changes. The one
HTTP-visible route this project found that DOES set config.trader.enabled
(_save_distribution_user_config, reached via save_prediction_market_configuration
in OctoBot's web-interface source) is registered only when the running
OctoBot instance's distribution is OctoBotDistribution.PREDICTION_MARKET
-- an elif branch mutually exclusive with the DEFAULT distribution
this project assumes throughout (confirmed against
controllers/__init__.py::register()); it has nothing to do with
OctoBot's onboarding wizard (a separate, always-registered
controllers/welcome.py). This route is therefore unreachable on the
ordinary/default OctoBot instance this server targets, not because of
this project's own "onboarding" out-of-scope exclusion (a previous
version of this docstring cited that exclusion; it was the wrong
reason, even though the practical conclusion below still holds).
As of this writing, this server has NO tool that can actually toggle
real-vs-simulated trading on a default OctoBot instance. If you need
that, it currently requires editing config.trader/config.trader-simulator
in the profile's own saved config file directly (outside this server)
and re-importing/re-selecting the profile -- there is no safer,
HTTP-API-driven path this server can offer today.
If confirm is not exactly true, no OctoBot call is made at all --
this returns require_confirmation's structured refusal (a normal
return, not an error) instead.
Once confirmed, maps to GET /profiles_management/use_as_live?profile_id=<id>
(confirmed against source controllers/configuration.py's
"use_as_live" action).
Spec correction #1, verified against source and reproduced live:
this route's one non-raising code path calls
models.convert_to_live_profile(profile_id) then
models.select_profile(profile_id), flashes an HTML-only session
message, and returns flask.redirect(flask.url_for("profile")) -- an
HTTP 302 to /profile with no informative body at all, whether or not
the conversion actually took effect. This is the same
uninformative-GET-response category milestone 5 already found for
duplicate (also a bare success marker) and select_profile (a 200
that can silently mean "nothing changed"). Following the same pattern
select_profile established, this tool never trusts the response
status alone: it re-fetches via the same scrape list_profiles/
get_profile use afterward and raises ProfileConversionFailedError
if profile_id isn't selected there (see spec correction #2 for why
only is_selected, not profile_type, is re-checked this way).
Spec correction #2 -- a genuine terminology collision in OctoBot's own
data model, found live and confirmed against source, NOT just a
misreading of this milestone's own instructions: is_selected/
profile_type were expected to both be independently re-verifiable
post-hoc via the same scrape list_profiles uses (mirroring
select_profile's pattern). is_selected is: the
profile-overview-selected CSS class this scrape already parses
reliably reflects models.select_profile(profile_id)'s effect.
profile_type, however, is NOT reverified here, because the scrape's
profile_type field (list_profiles/get_profile's "LIVE"/
"SIMULATOR"/"UNKNOWN") and the profile.profile_type attribute
models.convert_to_live_profile actually sets are two unrelated
OctoBot concepts that merely share a confusingly similar name:
The scrape's
profile_typecomes from thebadge-infobadge text, which is the return value ofget_enabled_trader(profile)(confirmed against sourceflask_util/context_processor.py):"Real trading"ifftrading_util.is_trader_enabled(profile.config), else"Simulated trading"iffis_trader_simulator_enabled, else no badge at all -- entirely about whether a real (vs. simulated) trader is enabled in that profile's OWN trading config.models.convert_to_live_profile(confirmed against sourcemodels/profiles.py) only doesprofile.profile_type = commons_enums.ProfileType.LIVE; profile.validate_and_save_config().octobot_commons.enums.ProfileType(confirmed against source) has exactly two members,LIVE = "live"andBACKTESTING = "backtesting"-- there is noSIMULATORmember at all, and this attribute is never rendered anywhere in/profiles_selector's HTML (confirmed by readingcomponents/config/profiles.htmlandcontext_processor.py: neither referencesprofile.profile_type).
Concretely (reproduced live against a freshly-duplicated, default
SIMULATOR-trader profile): after a successful convert_profile_to_live
call, the scrape's profile_type for that profile is still
"SIMULATOR" -- convert_to_live_profile never touches the
trader-enabled config the badge reflects. Gating this tool's success on
profile_type == "LIVE" (as this milestone's own instructions
originally called for) would therefore make it report failure on
essentially every real invocation, which is worse than not checking it
at all. There is no OctoBot HTTP-visible signal (Tier A or B) this
server can use to independently confirm profile.profile_type flipped
-- an acknowledged, documented gap (the same category as
update_profile's undeliverable config field from milestone 5), not
a silently-accepted assumption. This tool's "profile_type": "LIVE" in
its own output below is therefore an echo of what was requested (and,
per convert_to_live_profile's unconditional, non-branching
implementation, reliably applied whenever this call doesn't raise --
see spec correction #3), not an independently re-scraped fact.
Spec correction #3, on why a non-5xx response is nonetheless a
reasonably strong signal for the profile_type half specifically:
unlike remove_profile's check-and-return-(result, err) pattern,
convert_to_live_profile's body (confirmed against source) has no
conditional branch that could skip the profile.profile_type = ProfileType.LIVE assignment -- it either runs to completion (assigns,
then saves) or raises (propagating to the uncaught-500 path this tool
already classifies as OctoBotServerError). A non-5xx response
therefore does mean that assignment executed and was saved; the
remaining genuine uncertainty this tool resolves by re-checking is only
whether the immediately-following models.select_profile(profile_id)
call (a separate function with its own historically-silent-failure mode
for unknown ids, per select_profile's docstring) actually took
effect -- which is exactly what the is_selected re-check above
verifies.
An exception raised inside OctoBot's own handling (e.g. an unrecognized
profile_id, which makes the underlying get_profile() raise) is not
caught by this route at all, so it propagates to OctoBot's global error
handler as an HTTP 500 -- classified here as OctoBotServerError, with
the Content-Type: application/json request-header hint (same
established technique as duplicate/select_profile/export_profile)
so that handler's message is readable JSON instead of an HTML page.
Output on success: {"profile_id": str, "profile_type": "LIVE", "selected": true}.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| profile_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it is exceptionally transparent. It discloses the confirm-gating behavior, the underlying HTTP route, the non-informative 302 response, the post-hoc re-check via is_selected, the profile_type verification gap, the conditions under which errors are raised, and the fact that non-5xx responses are only a reasonably strong signal rather than definitive proof.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely overlong and repetitive. It includes extensive source-code archaeology, multiple 'spec correction' sections, repeated phrases like 'confirmed against source,' and lengthy tangential explanations that go far beyond what is needed for an agent to call the tool. The front-loaded purpose is good, but almost every sentence after the first few could be substantially condensed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite its excessive length, the description is highly complete: it covers the tool's exact behavior, confirmation requirements, HTTP mapping, response limitations, error classification, verification strategy, known gaps, and success output shape. An agent has enough context to call the tool correctly and to understand the limits of what the result means.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains that profile_id is used in the underlying route and re-check, and it explains that confirm must be exactly true and that anything else produces a structured refusal. It does not provide a full formal parameter reference, but it gives enough operational meaning for both parameters.
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 opening sentence states exactly what the tool does: 'Relabel a profile as OctoBot's internal ProfileType.LIVE and select it.' It is a specific verb+resource statement that clearly differentiates this tool from siblings like select_profile, and the bold warning that it does NOT enable real-money trading removes a likely source of confusion.
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 clearly explains when confirm is required, what happens if confirm is not exactly true, and explicitly warns that no server tool can toggle real-vs-simulated trading on a default OctoBot instance. It could be slightly stronger by explicitly naming select_profile as the alternative when only selection is needed, but the guidance is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_profileA
Create a new profile, one of 4 ways, discriminated by mode.
Not confirm-gated (ADR-0003): creates new state, never destroys
anything or touches credentials/live trading. Every mode's exact
request shape was verified against OctoBot source
(controllers/configuration.py's profiles_management route) and,
where practical, against the live test instance -- see each
_create_profile_* helper's docstring for the per-mode detail and the
two spec corrections found along the way (import_file never returns
JSON; import_url is presently broken upstream). Only the arguments
relevant to the chosen mode need to be supplied; the rest are
ignored:
mode="duplicate": requiressource_profile_id.mode="import_file": requiresfile_base64(the file's raw bytes, base64-encoded) andfilename.mode="import_url": requiresurl.mode="import_cloud_strategy": requiresstrategy_idandname;descriptionis optional (defaults to"").
Output: {"profile_id": str, "name": str, "message": str}.
Raises ProfileImportFailedError for any failure in any mode
(including a missing required argument for the chosen mode, or an
unrecognized mode) -- OctoBot's own error text is included where one
exists.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| mode | Yes | ||
| name | No | ||
| filename | No | ||
| description | No | ||
| file_base64 | No | ||
| strategy_id | No | ||
| source_profile_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it excels: it discloses side effects ('creates new state, never destroys anything or touches credentials/live trading'), non-confirm-gating behavior, error semantics (raises ProfileImportFailedError), and known upstream issues (import_url broken, import_file never returns JSON). This is far more transparency than typical tool descriptions.
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 given the four-mode complexity. It is front-loaded with the core purpose, structured with bullets for each mode, and includes only high-value caveats such as known spec corrections and upstream breakage. No redundant listing of schema types; all prose adds operational meaning.
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 8-parameter tool with no annotations, no output schema, and no per-parameter descriptions, this description is complete. It covers per-mode required arguments, optional arguments, output shape, error behavior, and safety profile. An agent has everything needed to select the correct mode and construct a valid call, including awareness of the broken import_url mode.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does thoroughly. It maps every parameter to its relevant mode, defines file_base64 as raw bytes base64-encoded, clarifies that description defaults to empty string, and states that irrelevant arguments are ignored. Each of the 8 parameters is effectively explained through the mode-based requirements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create a new profile, one of 4 ways, discriminated by mode.' The four modes are enumerated, making the tool's scope unmistakable and distinguishing it from sibling profile tools like update_profile, delete_profile, and list_profiles. The resource is clearly a profile and the action is creation.
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 clear context on when to use the tool: it creates a new profile and is not confirm-gated, emphasizing it never destroys state or touches credentials/live trading. It also explains that only mode-relevant arguments need to be supplied. However, it does not explicitly name sibling alternatives or state when to choose this over another profile-related tool, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_data_fileA
Permanently delete a historical data file. Confirm-gated (ADR-0003/FR-25).
Deliberately gated, reversed from this addendum's original
not-gated draft -- see the tool spec/requirements doc FR-25 for the
full reasoning: unlike cancel_order/close_position (instantly
correctable), an erroneous delete means re-running a collection that
can take minutes to hours, placing this closer to clear_*_history's
risk profile. If confirm is not exactly true, no OctoBot call is
made at all -- this returns require_confirmation's structured
refusal (a normal return, not an error).
Once confirmed, maps to POST /data_collector?action_type= delete_data_file with the raw file string as the JSON body
(confirmed against source AND live this session: flask.request. get_json()'s raw value is passed straight through to
backtesting_api.delete_data_file(file_name), no wrapping object).
Output on success: {"file": str, "deleted": true, "message": str}
(OctoBot's own confirmed live success body: f"{file} deleted").
Errors: DataFileDeleteRejectedError wrapping OctoBot's own f"Can't delete {file_name} ({error})" text -- confirmed verbatim live this
session for a nonexistent file ("Can't delete does_not_exist.data (file can't be found)").
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | ||
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so excellently. It discloses the permanent destructive nature, the confirm-gated behavior, the structured refusal when confirm is not true, the exact HTTP mapping, the JSON body format, the success response, and the error wrapper with a verbatim example.
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 essential purpose and gating behavior, and it is well-structured across intent, behavior, success output, and errors. It is somewhat verbose with provenance details like 'reversed from this addendum's original not-gated draft' that are not needed for tool invocation, but this is a minor deduction given the complexity of the destructive behavior.
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 no output schema and no annotations, the description is remarkably complete: it covers preconditions, confirmation semantics, endpoint mechanics, success return shape, and error behavior. An agent could safely understand and invoke this tool correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does thoroughly. It explains that confirm must be exactly true to execute and otherwise returns a structured refusal, and that file is passed raw as the JSON body rather than inside a wrapping object.
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: 'Permanently delete a historical data file.' This is immediately unambiguous and clearly distinguishes the tool from history-clearing and order-cancellation siblings by naming the risk profile it shares with clear_*_history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear risk comparison with cancel_order/close_position and clear_*_history, explaining when this destructive action is warranted versus the instantly-correctable operations. It does not give an explicit 'use this when...' rule, but the context and exclusions are reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_profileA
Permanently delete a profile. Confirm-gated (ADR-0003): irreversible.
If confirm is not exactly true, no OctoBot call is made at all --
this returns require_confirmation's structured refusal (a normal
return, not an error) instead.
Once confirmed, maps to POST /profiles_management/remove with JSON
body {"id": profile_id} (confirmed against source
controllers/configuration.py's "remove" action, which reads exactly
flask.request.get_json()["id"] -- the spec's documented body shape is
correct here, unlike update_profile's in milestone 5).
Two failure modes confirmed against source
(models/profiles.py::remove_profile), both surfaced as
ProfileDeleteRejectedError:
profile_idis the currently-selected/active profile: OctoBot itself rejects this ("Can't remove the active profile"), returned as HTTP 400 with that exact string as the JSON body.profile_idnames a profile whose removal aProfileRemovalErrorblocks (e.g. an in-use profile): also HTTP 400, wrapping that error's text. An unrecognizedprofile_idisn't checked byremove_profilebefore this tool ever reaches OctoBot: it's rejected locally asProfileNotFoundError(via the same pre-fetched scrape used to look upname, below) rather than let OctoBot's own uncaughtKeyErrorproduce an HTTP 500.
Extra safety check, not strictly required by OctoBot's own response
but added anyway: OctoBot's 200 success body for this action is the
same uninformative literal string "Profile created" copied from the
unrelated duplicate action (confirmed against source) -- not
"Profile deleted" or anything that actually confirms removal. Given
that copy-paste bug, this tool re-checks via the same scrape
list_profiles/get_profile use that profile_id is genuinely gone
afterward, raising ProfileDeleteRejectedError (not trusting the 200)
if it is still present.
The profile's name is captured from a scrape taken before deletion
(per this tool's spec entry), since after a real deletion it can no
longer be found by scraping.
Output on success: {"profile_id": str, "name": str, "deleted": true}.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| profile_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral burden. It discloses irreversibility, the confirm gate, that no OctoBot call is made without confirmation, two failure modes, local rejection of unknown IDs, the OctoBot success-body bug, the extra post-deletion safety check, and name capture before deletion. This is exceptionally transparent.
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?
Though lengthy, the description is well-structured and front-loaded with the core action. Each paragraph addresses a distinct concern: confirmation behavior, API mapping, failure modes, safety verification, and return shape. The detail about source-code confirmation and the copy-paste bug is justified given the tool's destructive and surprising behavior.
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 no output schema and no annotations, the description is remarkably complete. It covers exact invocation conditions, error modes, success output shape, and the fallback safety check. There are no significant gaps that would prevent an agent from calling 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 description coverage is 0%, but the description compensates fully. It explains that confirm must be exactly true, describes what happens if false, defines profile_id semantics (active profile, blocked removal, unrecognized ID), and even documents the JSON body shape sent to the API.
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 'Permanently delete a profile', which is a specific verb+resource statement. It goes on to specify the exact endpoint and body mapping, and is clearly distinct from sibling tools like create_profile, update_profile, and select_profile.
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 clearly establishes when this tool applies: confirm-gated, irreversible profile deletion, with a structured refusal if confirm is not exactly true. It does not explicitly enumerate alternatives or when-not-to-use, but the uniqueness of the destructive operation makes the usage context unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_logsA
Export OctoBot's full logs as a zip archive, base64-encoded.
Maps to GET /export_logs -- the exact same binary-file-download
pattern as octobot_mcp.tools.profiles.export_profile (flask.send_file,
not JSON): this tool bypasses octobot_mcp.client.request_json for the
same reason and base64-encodes the raw response body. See this module's
docstring for the source/live verification detail, including why the
downloaded filename (unlike export_profile's) is not dynamic.
filename is read from the response's Content-Disposition header via
the shared octobot_mcp.tools._shared._parse_content_disposition_filename
helper -- the same one export_profile uses -- rather than hardcoding
OctoBot's own literal "logs_export.zip" locally.
On failure, OctoBot's own controller (confirmed against source) catches
every export exception internally, flashes an HTML-only session
message, and 302-redirects back to /logs -- never a 4xx/5xx status.
This tool cannot distinguish that redirect from a genuine success at
the HTTP-status level alone, so -- the same fail-loud approach
export_profile uses for its own missing-header case -- it raises
OctoBotMalformedResponseError whenever no parsable filename is found
in the response, rather than ever returning a fabricated filename or
empty content.
Output: {"filename": str, "content_base64": str}. Read-only, not
confirm-gated (ADR-0003).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it delivers: base64 encoding, bypass of request_json, Content-Disposition filename parsing, redirect-on-failure behavior, and the explicit OctoBotMalformedResponseError fallback. It also discloses read-only, non-confirm-gated behavior via ADR-0003.
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 necessary for a zero-parameter tool, but it is front-loaded with the core purpose and each paragraph addresses a meaningful concern (wire format, filename handling, failure semantics, output shape). Some meta-references to module docstrings and source verification could be trimmed without loss.
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 no output schema and no annotations, the description fully specifies the return format, error behavior, and read-only/gating status. An agent has everything needed to invoke and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4 and there is nothing for the description to add about arguments. It instead documents the output contract, which is the relevant semantic content for this 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?
Opens with a clear verb+resource statement: 'Export OctoBot's full logs as a zip archive, base64-encoded.' The format and scope are explicit, but it never contrasts the tool with sibling get_logs, relying on the name and first sentence for differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage—call this when a full logs export is needed—and draws a useful analogy to export_profile. It does not, however, state when to prefer this over get_logs or mention any exclusions/prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_profileA
Export a profile as a zip archive, base64-encoded.
Maps to GET /profiles_management/export?profile_id=<profile_id>
(spec [V]; profile_id confirmed as the exact query-param name against
source controllers/configuration.py, action "export" -- not id).
This route returns the zip's raw bytes directly (flask.send_file),
not JSON, so this tool bypasses octobot_mcp.client.request_json
(same reason as _fetch_profiles_selector_html) and base64-encodes the
raw response body instead.
filename is read from the response's Content-Disposition header
(confirmed live: attachment; filename=<profile name>_<YYYYMMDD-HHMMSS>.zip,
quoted only when the profile name isn't already a single HTTP token --
e.g. it contains a space -- per RFC 6266/2183; both forms confirmed
live, see octobot_mcp.tools._shared._parse_content_disposition_filename,
moved there in milestone 13 so octobot_mcp.tools.tentacles.export_logs
shares this same implementation) rather than reconstructed locally, so
it always matches exactly what OctoBot named the file. Raises
OctoBotMalformedResponseError if that header is missing or
unparseable -- never returns a fabricated filename.
Output: {"profile_id": str, "filename": str, "content_base64": str}.
Read-only, not confirm-gated (ADR-0003). An unknown profile_id raises
an uncaught NoProfileError inside OctoBot (HTTP 500, confirmed live
with the Content-Type: application/json request header this call
always sends for a readable error message).
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure and does so thoroughly. It reveals that the response is raw bytes, that the body is base64-encoded, that filename is derived from Content-Disposition rather than fabricated, that malformed headers raise OctoBotMalformedResponseError, and that unknown profile_id yields an HTTP 500 with NoProfileError. This is exemplary transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with a clear purpose and organized into focused paragraphs. It is verbose, and some implementation archaeology such as 'moved there in milestone 13' and RFC references is more detail than an agent needs to invoke the tool. Still, the structure is logical and the length mostly serves genuine behavioral transparency 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?
Despite the absence of annotations and output schema, the description defines the exact output shape, error behavior, read-only nature, confirmation-gating status, and endpoint mapping. An agent has everything needed to invoke the tool correctly and interpret its result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only the parameter name with no description, so schema coverage is 0%. The description compensates by confirming the exact query-param name (profile_id, not id) and by documenting the failure mode for an unknown profile_id. It does not elaborate on where to obtain a valid profile_id or its format, but for a single self-explanatory parameter this is sufficient added meaning.
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 opening sentence states a specific verb and resource: 'Export a profile as a zip archive, base64-encoded.' This unambiguously distinguishes it from sibling profile tools like get_profile, which retrieves profile details rather than producing a downloadable archive. The endpoint mapping reinforces the purpose without introducing ambiguity.
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 clearly implies the tool is for exporting a profile archive, and it notes the operation is read-only and not confirm-gated. However, it does not explicitly say when to prefer this over alternatives such as get_profile or list_profiles, nor does it state any exclusions or prerequisites. Usage context is present but only by implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_all_currenciesA
List every currency OctoBot knows about for one exchange.
Maps to GET /api/get_all_currencies/<exchange> ([V], confirmed
against OctoBot source api/config.py). Read-only, not
confirm-gated. Returns OctoBot's own JSON body unchanged (NFR-8).
| Name | Required | Description | Default |
|---|---|---|---|
| exchange | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does it well: it explicitly states the operation is read-only, not confirm-gated, and returns OctoBot's own JSON body unchanged. It also adds provenance by referencing the OctoBot source file for confirmation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the primary purpose. The additional sentences each add useful behavioral or technical context without unnecessary 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 simple one-parameter tool, the description covers the operation, endpoint mapping, safety behavior, confirmation requirement, and return behavior. The main missing piece is validation of the exchange parameter value, but overall the context is largely sufficient without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds some meaning beyond the bare schema by clarifying that the 'exchange' parameter selects the single exchange whose currency list is returned. However, it does not specify accepted exchange identifiers, formats, or how to obtain them, which is a gap given 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a clear resource ('every currency OctoBot knows about'), and a scope ('for one exchange'). It also maps to a concrete endpoint, which makes the tool's purpose unambiguous and distinguishes it from exchange-wide or symbol-focused 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 implies usage when an agent needs all currencies for a particular exchange, and the 'for one exchange' wording provides some context. However, it does not explicitly name alternatives or state when not to use this tool, especially relative to the similar-looking sibling get_currency_list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_all_symbolsA
List every trading symbol/pair OctoBot knows about for one exchange.
Maps to GET /api/get_all_symbols/<exchange> ([V], confirmed
against OctoBot source api/config.py). Read-only, not
confirm-gated. Returns OctoBot's own JSON body unchanged (NFR-8).
| Name | Required | Description | Default |
|---|---|---|---|
| exchange | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It explicitly states the operation is read-only, not confirm-gated, maps to a GET endpoint, and returns OctoBot's JSON body unchanged. This goes well beyond a generic tool description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and well-structured: one purpose sentence, one endpoint/source sentence, and one behavioral/return sentence. Every sentence adds distinct value with no repetition 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 simple single-parameter read-only tool, the description covers the main operational aspects: purpose, endpoint, read-only safety, and response handling. It is slightly incomplete in not detailing the exchange parameter's accepted values or the exact JSON output structure, but the core usage is adequately covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has only one parameter, 'exchange', with 0% description coverage. The description merely implies the parameter's role with 'for one exchange' but does not specify valid values, format, or how exchanges are identified in OctoBot. This is insufficient compensation for the missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List every trading symbol/pair OctoBot knows about for one exchange.' This clearly distinguishes the tool from sibling names like get_currency_list or get_all_currencies by focusing on symbol/pair data scoped to a single exchange.
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 usage context is implied rather than explicit: use it when you need all trading symbols/pairs for one exchange. However, it does not mention alternatives, exclusions, or how it differs from related listing tools such as get_all_currencies or get_exchange_details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_available_timeframes_for_collectionA
List the time frames OctoBot's data collector supports for one exchange.
Maps to GET /data_collector?action_type=available_timeframes_list &exchange=<name> [V, confirmed live this session]. Read-only, not
confirm-gated. No dedicated exception class -- a plain read with no
domain-specific failure mode, matching this project's existing
convention for read-only tools (e.g. get_all_symbols).
Output: {"time_frames": [str]} -- direct passthrough of OctoBot's own
sorted JSON array (NFR-8), e.g. ["1m", "3m", "5m", ..., "1M"].
See this module's docstring for why there is no sibling
get_available_symbols_for_collection tool: get_all_symbols(exchange)
(already shipped) was confirmed this session to return identical data.
| Name | Required | Description | Default |
|---|---|---|---|
| exchange | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it delivers: it states read-only behavior, absence of confirm gating, no dedicated exception class, direct passthrough of OctoBot's sorted JSON array, and the exact output shape. This goes well beyond a minimal description and gives the agent clear 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 then provides endpoint mapping, output format, and behavioral notes. The paragraph explaining why there is no sibling symbols tool is somewhat tangential to actually invoking this tool, but it is still useful for tool-set navigation. It is longer than strictly necessary but every section contributes context.
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 tool with no output schema and no annotations, the description covers the essential facts: endpoint, request parameter, output structure with an example, read-only nature, exception behavior, and relationship to existing tools. There are no obvious gaps that would prevent an agent from making a correct call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the undocumented `exchange` parameter. It only shows `exchange` appearing in the endpoint query string and says 'for one exchange,' but it does not explain valid exchange names, identifier vs. display name, or any expected format. Some meaning is added beyond the bare schema, but it is not enough for reliable parameter construction.
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: 'List the time frames OctoBot's data collector supports for one exchange.' It also maps to a concrete endpoint, which removes ambiguity. The purpose is further distinguished from sibling tools by explaining why a similar symbols-listing tool does not exist, so the agent can place this tool in the overall collection.
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 clear operational context: it is read-only, not confirm-gated, and returns time frames for one exchange. It does not explicitly state 'use this before start_data_collection' or list alternative tools for the same purpose, but it does explain why no sibling `get_available_symbols_for_collection` exists and references `get_all_symbols` as a conventional analog. This is sufficient context though not a full when-to-use/when-not-to-use guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_currency_listA
List OctoBot's globally configured trading currencies/symbols.
Maps to GET /api/currency_list. exchange is accepted for
forward-compatibility with this tool's spec entry, but the currently
deployed OctoBot route (api/trading.py::currency_list(), master
branch, confirmed by reading its body this session) takes no request
arguments at all and always returns the same global list regardless
of this value -- it is a no-op filter on today's OctoBot. Read-only,
not confirm-gated. Returns OctoBot's own JSON body unchanged (NFR-8).
| Name | Required | Description | Default |
|---|---|---|---|
| exchange | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden and does so exceptionally well. It discloses the read-only nature, the no-op exchange parameter, the lack of request arguments, that it is not confirm-gated, and that it returns the server's JSON unchanged. It also grounds the claim in the actual route and session verification.
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?
Though longer than average, every sentence earns its place. The core purpose is front-loaded, and the rest adds critical behavioral and compatibility context that prevents misuse. There is no fluff or repetition.
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 read-only listing tool with one optional parameter and no output schema, the description is complete. It covers purpose, endpoint, parameter behavior, safety profile, and return behavior. 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 0%, and the description fully compensates. It explains that exchange is accepted only for forward-compatibility, that the deployed route takes no arguments, and that the parameter has no effect on the result. This is exactly the meaning an agent needs beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists OctoBot's globally configured trading currencies/symbols and maps to a specific endpoint. It is clear about the resource and scope, but it does not explicitly differentiate from similar siblings like get_all_currencies or get_all_symbols.
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 clear context: the tool always returns the same global list and the exchange parameter is a no-op filter on the current OctoBot route. This tells the agent when the tool is appropriate, though it does not explicitly name alternative tools for filtered or exchange-specific lists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_exchange_detailsA
Fetch ONE exchange's name and internal id.
Maps to GET /api/first_exchange_details ([V]). IMPORTANT: this
endpoint only ever returns a single exchange -- the one matching
exchange_name if given, or OctoBot's own notion of "the first
exchange" otherwise -- confirmed against OctoBot source
(api/exchanges.py::first_exchange_details()). It does NOT enumerate
every exchange configured on the instance; do not call this tool
expecting a full exchange list, and do not assume its result is the
only configured exchange. Read-only, not confirm-gated. Returns
OctoBot's own JSON body unchanged (NFR-8).
| Name | Required | Description | Default |
|---|---|---|---|
| exchange_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so thoroughly. It discloses that the operation is read-only, not confirm-gated, returns exactly one exchange, never enumerates all exchanges, and returns OctoBot's JSON body unchanged. This is far beyond minimal and gives the agent accurate behavioral expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a clear one-sentence summary, then proceeds with important caveats. It is somewhat long, but nearly every sentence contributes necessary behavioral or usage nuance. Minor extras like the source file reference and 'NFR-8' are acceptable context rather than 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?
For a tool with one optional parameter and no output schema, this description is complete. It covers the endpoint mapping, parameter semantics, single-result guarantee, read-only nature, confirmation requirements, and return behavior. An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does. It explains that exchange_name, when provided, selects the matching exchange, and when omitted, the tool returns OctoBot's 'first exchange.' This adds real meaning to the otherwise bare schema definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence uses a specific verb and resource: 'Fetch ONE exchange's name and internal id.' It clearly scopes the tool to a single exchange and distinguishes it from any list-style tool by emphasizing 'ONE' and later 'It does NOT enumerate every exchange.'
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 clear context about when the tool is appropriate, including the optional exchange_name behavior and the fallback to 'the first exchange.' It also provides a strong exclusion: do not call this tool expecting a full exchange list. However, it does not name a specific alternative tool to use when a full list is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_historical_portfolio_valueA
Fetch historical portfolio value samples, optionally filtered.
Maps to GET /api/historical_portfolio_value -- query parameters
confirmed against OctoBot source
(api/trading.py::historical_portfolio_value(), master branch, [V]
this session): currency (OctoBot defaults this to "USDT"
server-side if omitted), time_frame, from_timestamp,
to_timestamp, and exchange are all optional query-string filters.
Read-only, not confirm-gated. Returns OctoBot's own JSON body
unchanged (NFR-8).
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | ||
| exchange | No | ||
| time_frame | No | ||
| to_timestamp | No | ||
| from_timestamp | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It explicitly discloses that the operation is read-only, is not confirm-gated, returns OctoBot's JSON body unchanged, and that currency defaults to USDT server-side. This is strong transparency for a simple fetch tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and stays reasonably compact. The source-confirmation detail is useful but makes the second sentence dense; still, every sentence contributes relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only GET-like tool with five optional parameters and no output schema, the description covers endpoint, parameter optionality, default behavior, and response identity. It could be more complete about return value structure and parameter formats, but it is sufficient for correct invocation in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It names all five query parameters and states they are optional filters, and it adds the useful currency default behavior. However, it does not explain timestamp formats, time_frame units, or valid exchange values, leaving meaningful semantic gaps.
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 starts with a specific verb and resource: 'Fetch historical portfolio value samples, optionally filtered.' It also names the exact endpoint, making the tool's scope unambiguous and distinct from sibling tools like get_pnl_history or get_orders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful invocation context: all query parameters are optional, and the call is read-only. However, it does not explicitly say when to prefer this tool over sibling tools or when not to use it, leaving some selection reasoning to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_resultA
Fetch a completed backtest job's final report.
Requires state == "completed"; raises JobNotCompletedError naming
the current state otherwise -- never returns partial results, even if
OctoBot itself would technically serve a report for an in-progress
run (or, for compare_strategies, if some but not all children have
finished). Raises JobNotFoundError for an unknown job_id (same as
get_job_status).
For kind: "backtest", output is {"report": <passthrough>, "trades": <passthrough>} from OctoBot's own GET /backtesting?update_type= backtesting_report response (NFR-8: no renaming/reshaping).
For kind: "compare_strategies" (milestone 10, docs/tasklist.md item
10), output is {"comparison": [...], "diff": ...} -- both already
fully computed and stored (once, at completion -- INV-3) by
_run_compare_strategies as this job's own result, so this function
simply passes them through unchanged; see that function and
_build_comparison_entry/_build_diff below for exactly how each is
built.
Real report/trades shape, captured live against the OctoBot
2.1.1 test instance this milestone (resolves open question #3) --
data_files mode, DailyTradingMode profile, BTC/EUR on
binance, exactly as OctoBot returned it (field names/nesting
verbatim, values are example data from that one run):
{
"report": {
"bot_report": {
"starting_portfolio": {"binance": {"BTC": {"available": 10.0, "total": 10.0}, "USDT": {...}}},
"end_portfolio": {"binance": {"BTC": {...}, "EUR": {...}, "USDT": {...}}},
"profitability": {"binance": -15.223942726263024},
"market_average_profitability": {"binance": -16.839423647357034},
"reference_market": "EUR",
"trading_mode": "DailyTradingMode"
},
"chart_identifiers": [
{"exchange_id": "...", "exchange_name": "binance", "symbol": "BTC/EUR", "time_frames": ["1m", "1h", "4h", "1d"]}
],
"errors_count": 0,
"symbol_report": [{"BTC/EUR": 0.8013392638261951}]
},
"trades": [
{
"SoR": "Simulated", "amount": "7.99127178", "cost": "535066.3103340852",
"date": "2026-05-02 16:00:00", "exchange": "binance", "fee_cost": "535.0663103340852",
"fee_currency": "EUR", "id": "b5eb50fd-...", "market": "EUR", "price": "66956.34",
"ref_market_cost": 535066.3103340853, "symbol": "BTC/EUR", "time": 1777737600,
"type": "SELL MARKET"
},
...
]
}Confirms the spec's own explicit warning was correct: profitability
genuinely exists, but nested three levels deep
(report.bot_report.profitability, itself keyed by exchange name, not
a bare float) -- NOT at the top level of report as a naive read of
the spec's placeholder field list (profitability/max_drawdown/
win_rate) might have assumed; max_drawdown/win_rate were not
observed anywhere in this real payload at all. amount/cost/
fee_cost/price in each trade are numeric-looking strings, not
JSON numbers (ref_market_cost IS a JSON number) -- passed through
exactly as OctoBot sent them (NFR-8), not coerced. This tool does not
hardcode or validate against any of these field names anywhere in its
own code (per NFR-8/the spec's own instruction not to assume a field
list) -- this is documentation of what was observed, not a schema this
tool depends on.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries full responsibility and delivers thoroughly: error cases, no-partial-results guarantee, passthrough semantics, exact output structure, field types (strings vs numbers), and the fact that the tool does not validate or hardcode field names. This is exemplary behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and precondition, and the sections are logically organized. However, it is overlong, with internal references (milestone, NFR-8, INV-3, docs/tasklist) and a large live JSON example plus lengthy meta-commentary that could be trimmed without sacrificing essential 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?
Given there is no output schema or annotations, the description is exceptionally complete: it covers prerequisites, all error behavior, output shapes for both job kinds, passthrough guarantees, and real observed field types. An agent has essentially everything needed to call the tool and interpret its result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for the single job_id parameter. The description mentions job_id only in the error context ('Raises JobNotFoundError for an unknown job_id'), adding limited meaning beyond the schema. However, the tool name and the rest of the description make the parameter's purpose unambiguous, so minimal compensation is acceptable.
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: 'Fetch a completed backtest job's final report.' It also clarifies the two job kinds (backtest and compare_strategies) and their distinct output shapes, making it easy to differentiate from sibling tools like get_job_status or list_jobs.
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 clearly states when to use the tool: requires state == 'completed', otherwise raises JobNotCompletedError and never returns partial results. It also explains the two output variants. It doesn't explicitly name alternatives like get_job_status for checking state, but the precondition itself gives strong contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_statusA
Fetch one job's current status from the in-memory job store.
Maps to no OctoBot route at all -- purely an in-memory lookup
(docs/specs/octobot-mcp-tool-spec.md's job inventory table lists this
tool's "Maps to" as "in-memory job store only"). Read-only, not
confirm-gated. Raises JobNotFoundError (surfaced as a ToolError by
with_error_handling) for an unknown job_id, noting the server may
have restarted (ADR-0002 risk table) -- an unknown id is expected in
that case, not a bug.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly: it declares read-only, not confirm-gated, no route (in-memory only), and details error behavior for unknown job_id, including the server-restart caveat. This is exemplary transparency for an MCP tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main action is front-loaded and each major behavior gets a sentence. The parenthetical doc-spec reference and ADR mention add traceability but are somewhat redundant/verbose, so it isn't maximally concise.
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, side-effect-free lookup, the description covers purpose, storage scope, read-only safety, and error semantics. The main missing piece is the success return value shape, which matters because no output schema exists, but the tool is simple enough that the gap is minor.
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 for job_id is 0%, so the description must compensate. It adds that job_id selects one job and that an unknown job_id raises JobNotFoundError, which is useful. But it doesn't explain the expected format of job_id or how to obtain valid ids, leaving a partial gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a specific verb+resource: 'Fetch one job's current status from the in-memory job store.' It clearly states the tool is a single-job lookup, not a list or result fetch, and distinguishes itself by explicitly noting it maps to no OctoBot route. This separates it from siblings like list_jobs and get_job_result.
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 clear context: this is a read-only, non-confirm-gated, in-memory-only lookup for one job. However, it never explicitly names alternatives or states when not to use it, so an agent must infer the boundary against siblings such as list_jobs and get_job_result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_logsA
Tier C stub (ADR-0006): structured/filterable log listing has no JSON API in OctoBot.
Never makes an HTTP call to OctoBot and never raises -- this is a
static, instant response explaining the gap, not a failure (ctx is
accepted only for interface consistency with every other registered
tool; it is never read). Use export_logs() instead to retrieve
OctoBot's full log history as a downloadable zip archive.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral burden and excels: it discloses 'Never makes an HTTP call to OctoBot and never raises,' states the response is 'static, instant... not a failure,' and even notes that 'ctx is accepted only for interface consistency... never read.' This is rich, honest behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place. The first sentence front-loads the stub status and root cause, the second explains behavior precisely, and the third gives the actionable alternative. No filler, no repetition.
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, no-output-schema stub, the description covers everything an agent needs: what happens when called, what does not happen, and which sibling tool to use instead. The ADR-0006 reference adds provenance. 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?
There are no schema parameters (0 params, 100% schema coverage), so the baseline is 4. The description adds meaningful extra context by explaining the otherwise invisible 'ctx' parameter: it is accepted only for interface consistency and is never read. This goes beyond the empty 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 explicitly identifies this as a 'Tier C stub' that exists because 'structured/filterable log listing has no JSON API in OctoBot.' It clearly states what the tool does—returns a static response explaining the gap—rather than pretending to fetch logs. This distinguishes it from sibling tools like export_logs.
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 direct routing guidance: 'Use export_logs() instead to retrieve OctoBot's full log history as a downloadable zip archive.' This names the alternative and the condition selecting it, leaving no ambiguity about when this stub is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ordersA
List every order OctoBot currently knows about (open and historical).
Maps to GET /api/orders. Read-only, not confirm-gated. Returns
OctoBot's own JSON body unchanged (NFR-8).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and largely meets it: it declares 'Read-only, not confirm-gated' and states the passthrough return behavior ('Returns OctoBot's own JSON body unchanged (NFR-8)'). Minor gaps remain, such as result ordering or volume limits, but for a zero-parameter read tool this is strong disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core purpose front-loaded before the endpoint mapping and behavioral notes. Every sentence carries distinct information — scope, HTTP mapping, safety, and return behavior — with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless list tool with no output schema and no annotations, the description covers scope ('every order... open and historical'), the underlying endpoint, side effects (read-only), the confirmation model, and the return contract. Nothing an agent needs to know before calling 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?
The tool takes zero parameters and schema description coverage is trivially 100%, so there are no parameter semantics the description must document. Per the zero-parameter baseline, the description's silence on parameters is acceptable; nothing is left unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List every order OctoBot currently knows about,' and explicitly scopes coverage to 'open and historical.' This distinguishes it from sibling tools like get_trades and get_positions by naming the resource, and from clear_orders_history and cancel_order by framing the operation as a read-only listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit alternatives or when-to-use/when-not-to-use guidance is given. The resource scope and 'Read-only, not confirm-gated' phrasing imply this is the safe read path for orders, but the description never points to siblings like clear_orders_history or cancel_order for mutating needs — the agent must infer that separation itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pnl_historyA
Fetch realized PnL history, optionally filtered.
Maps to GET /api/pnl_history -- query parameters confirmed against
OctoBot source (api/trading.py::pnl_history(), master branch, [V]
this session): exchange, symbol, quote, since, and scale are
all optional filters OctoBot itself reads from the query string. Omit
any you don't want to filter by. Read-only, not confirm-gated. Returns
OctoBot's own JSON body unchanged (NFR-8).
| Name | Required | Description | Default |
|---|---|---|---|
| quote | No | ||
| scale | No | ||
| since | No | ||
| symbol | No | ||
| exchange | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and handles it well: it explicitly states 'Read-only, not confirm-gated' and that OctoBot's JSON body is returned unchanged. This tells the agent the call is safe, requires no confirmation, and preserves the upstream response.
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 action and then gives endpoint mapping, filter guidance, and behavioral notes. The source-verification and 'NFR-8' details add provenance but are slightly internal/jargon-heavy, preventing a perfect 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?
For a simple read-only filtered endpoint, it covers the endpoint, optional parameters, safety profile, and response handling. It does not describe the JSON body's contents, and there is no output schema to fill that gap, so it is not fully 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 0%, so the description must compensate, but it only lists the five parameter names and calls them optional filters. It does not define the meaning or accepted format of 'since' or 'scale', nor clarify the values for exchange, symbol, and quote beyond their self-evident names.
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 opening sentence uses a specific verb and resource: 'Fetch realized PnL history, optionally filtered.' This clearly states what the tool does, but it does not explicitly contrast it with sibling tools like get_trades or get_historical_portfolio_value, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear operational context: all five query parameters are optional filters and users should omit any they don't want to filter by. It does not name alternative tools or give when-not-to-use conditions, so it doesn't reach the top of the scale.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_positionsA
List every trading position OctoBot currently knows about.
Maps to GET /api/positions. Read-only, not confirm-gated. Returns
OctoBot's own JSON body unchanged (NFR-8).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It explicitly states 'Read-only, not confirm-gated' and that it returns OctoBot's own JSON body unchanged (NFR-8), providing important safety and response-shape context beyond a mere endpoint listing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with zero filler. The main purpose is front-loaded, followed by endpoint mapping and behavioral guarantees, each sentence adding distinct 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 parameterless, read-only list endpoint, the description covers all essential aspects: what it lists, the HTTP mapping, safety profile, and response behavior. 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 has zero parameters and schema description coverage is 100%, so there are no parameter semantics for the description to add. Per the baseline for parameterless tools, a 4 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 a specific verb ('List') and resource ('every trading position OctoBot currently knows about'), making the tool's purpose unambiguous. It also distinguishes itself from sibling mutation tools like close_position by explicitly labeling itself as read-only.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it is a read-only, non-confirm-gated way to fetch all positions, which implies choosing it over mutation or confirmation-gated tools. It does not explicitly name alternatives or state when not to use it, but for a simple list endpoint the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileA
Fetch one profile's details, defaulting to the currently selected profile.
Calls the same scrape list_profiles uses and filters the result
(spec: "same scrape, filtered") rather than scraping again. Raises
ProfileNotFoundError if profile_id is given but matches no scraped
profile -- distinct from ProfileScrapeContractBrokenError, which
means the scrape itself is broken, not that this id doesn't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses that the tool reuses list_profiles' scrape and filters rather than scraping again, explains the default profile behavior, and precisely distinguishes two error types: ProfileNotFoundError for an unmatched ID versus ProfileScrapeContractBrokenError for a broken scrape. This is strong behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose, and every sentence serves a purpose: the first states the operation, the second explains the implementation, and the third clarifies error semantics. No filler or repetition.
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 fetch tool with no output schema, the description is nearly complete: it covers default behavior, error cases, and how it relates to list_profiles. It does not describe the shape of the returned profile details, but this is not critical for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must provide meaning for the profile_id parameter. It does: profile_id is optional, absence means use the currently selected profile, and providing an unmatched ID raises ProfileNotFoundError. This adds real semantics beyond the raw schema, though it does not elaborate on the ID's format.
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 operation ('Fetch one profile's details') on a clear resource (profile), and differentiates itself from list_profiles by noting it uses the same scrape but filters the result. The default-to-current-profile behavior further disambiguates it from sibling profile 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?
The description makes clear this tool is for retrieving a single profile, optionally by ID, and defaults to the currently selected profile. It references list_profiles, implying list_profiles is the alternative for getting all profiles, though it does not explicitly state 'use list_profiles instead.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tentacle_configA
Fetch one tentacle's current configuration, schema, and display metadata.
Maps to GET /config_tentacle_edit_details/<tentacle> -- see this
module's docstring for the spec correction (the spec named GET /config_tentacle, which has no JSON response path at all). tentacle
is the tentacle's class name (e.g. "DailyTradingMode"), confirmed live
against the OctoBot 2.1.1 test instance.
Returns OctoBot's own JSON body unchanged (NFR-8): {"name": str, "config": object, "displayed_elements": object}. config holds this
tentacle's actual configuration values (the same values
update_tentacle_config's patch argument would merge into);
displayed_elements is the JSON-schema-shaped UI-form metadata
OctoBot's own config page renders from, passed through unsimplified.
Read-only, not confirm-gated. An unknown tentacle name raises an
uncaught exception inside OctoBot's model layer, surfaced as
OctoBotServerError (confirmed live: HTTP 500, plain-text body "Can't find tentacle: <tentacle>", despite a Content-Type: application/json
header that doesn't actually describe the body -- handled via this
module's _extract_error_text, same as update_tentacle_config).
| Name | Required | Description | Default |
|---|---|---|---|
| tentacle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly: it declares read-only/non-confirm-gated behavior, documents the exact response shape and semantics, discloses the live-confirmed HTTP 500 error for unknown tentacle names and the error-body mismatch, and even explains the internal error-extraction handling.
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 main purpose, then structured into endpoint mapping, return shape, and error behavior. It is longer than typical, and a few internal implementation details (module docstring reference, NFR-8 label, Content-Type header nuance) are beyond what an agent strictly needs, but the density is still 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 single-parameter read tool with no annotations and no output schema, the description is remarkably complete: it covers the parameter format, response fields and their meaning, the read-only safety profile, and the failure mode without requiring the agent to make assumptions.
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 offers no description for the single required parameter, but the description fully compensates by stating that tentacle is the tentacle's class name and providing a concrete example ('DailyTradingMode'). This is exactly the semantic information an agent needs to construct a valid call.
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: 'Fetch one tentacle's current configuration, schema, and display metadata.' This clearly distinguishes it from the sibling list_tentacles (which lists tentacles) and update_tentacle_config (which modifies configuration), and the endpoint mapping reinforces the exact operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the read-only purpose and relationship to update_tentacle_config clear, implying when to use this tool versus the update sibling. However, it does not explicitly state exclusions such as 'use list_tentacles to enumerate all tentacles' or 'use update_tentacle_config when modification is needed.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tradesA
List OctoBot's trade history.
Maps to GET /api/trades. Read-only, not confirm-gated. Returns
OctoBot's own JSON body unchanged (NFR-8).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description fully carries the behavioral disclosure burden. It explicitly states the operation is read-only, maps to GET /api/trades, and returns OctoBot's own JSON body unchanged, which directly informs an agent about side effects and response handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, followed by the endpoint mapping and behavioral notes. Every sentence adds meaningful information without redundancy 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 zero-parameter, read-only list operation without an output schema, the description is complete: it states the resource, the HTTP method, the read-only nature, and the exact response behavior. 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 the input schema is empty, so the description is not required to explain parameter behavior. The baseline for zero-parameter tools is 4, and the description appropriately avoids adding irrelevant parameter detail.
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: "List OctoBot's trade history." This clearly distinguishes it from sibling tools like get_orders, get_positions, and clear_trades_history, and the explicit endpoint mapping reinforces the exact operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this tool is appropriate by stating it is read-only and not confirm-gated, meaning no confirmation is needed before invoking it. It does not explicitly name alternatives or state when not to use it, but the read-only framing provides sufficient usage guidance for this simple no-parameter tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_data_fileA
Upload an existing OctoBot-format historical data file without collecting it via an exchange.
Not confirm-gated (ADR-0003/FR-26): creates new state, destroys
nothing. Maps to POST /data_collector?action_type=import_data_file
(multipart file field, mirroring create_profile(mode="import_file")'s
existing pattern exactly: base64-decode, then a multipart upload).
A confirmed OctoBot-side limitation, not a bug in this tool: this
route ALWAYS responds HTTP 200 with the full re-rendered
/data_collector page, on both a genuinely saved file and a silently
rejected one (confirmed live this session with garbage bytes -- no
file appeared in list_data_files() afterward, and the 200 response
body carried no inspectable error text anywhere) -- the same
invisible-at-the-HTTP-level outcome
octobot_mcp.tools.profiles._create_profile_import_file already
documents for create_profile(mode="import_file"). This tool
therefore determines the outcome via a before/after list_data_files()
diff, exactly like that tool does for profiles.
Output: {"filename": str, "imported": true, "message": str}.
Errors: DataFileImportFailedError if file_base64 isn't valid
base64, or if no new file appears in list_data_files() after the
upload (OctoBot silently rejected it).
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | ||
| file_base64 | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden and does so impressively. It discloses the non-confirm-gated behavior, the create-nothing-destroy-nothing state model, the OctoBot silent-rejection limitation (HTTP 200 even on failure), and the before/after list_data_files() verification strategy.
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 essential caveats or implementation context that cannot be inferred from the schema. It is front-loaded with the core purpose, then systematically covers behavior, output, and errors. Minor redundancy around the create_profile analogy could be trimmed.
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 no output schema and no annotations, the description covers everything an agent needs: the exact invocation pattern, the multipart format, the verification mechanism, the output contract, and the error conditions. It even references the relevant sibling verification tool (list_data_files).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must clarify the two parameters. It explains that file_base64 should be valid base64 and is base64-decoded into a multipart 'file' field, and it shows filename in the output shape. This adds real meaning beyond the raw schema, though a direct per-parameter definition would be slightly stronger.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb ('Upload'), a specific resource ('existing OctoBot-format historical data file'), and a clear exclusion ('without collecting it via an exchange'). It unambiguously distinguishes this import operation from data-collection workflows, so an agent can identify the tool immediately.
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 clarifies when the tool applies: when an OctoBot-format data file already exists and should not be collected via an exchange. It does not explicitly name sibling alternatives like start_data_collection, but the 'without collecting it via an exchange' framing plus the route mapping provides enough usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_data_filesA
List every historical data file already present on the OctoBot instance.
Tier-B (ADR-0008): scrapes the bare GET /data_collector page -- see
this module's docstring/_parse_data_collector_html for the verified
DOM shape and fail-loud assumptions. Idempotent, read-only, not
confirm-gated.
Output: {"files": [{"file": str, "exchange": str, "symbols": [str], "time_frames": [str], "is_full": bool, "start_date": str|null, "end_date": str|null, "date": str|null, "candles_length": int|null}]}.
file is the authoritative identifier to pass to delete_data_file.
An empty files list is a legitimate result (no data files exist yet)
-- distinct from DataFileScrapeContractBrokenError, which means the
scrape itself is broken, never silently returned as an empty/partial
list (NFR-13).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries behavioral disclosure. It explicitly states idempotency, read-only behavior, lack of confirmation gating, the scraping mechanism, fail-loud assumptions, and the distinction between an empty list and a scrape contract break. This is thorough and actionable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then adds necessary implementation and behavioral details in a compact, structured format. The output schema is inline and each sentence provides actionable information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool, the description is complete: it specifies the resource, output shape, error semantics, and relationship to delete_data_file. The agent has everything needed to understand when to call it and how to interpret the result.
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 input parameters, so the baseline of 4 applies. The description compensates further by documenting the full output structure and the meaning of the `file` field, which helps the agent interpret the result even though no output schema exists.
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: list every historical data file present on the OctoBot instance. It clearly differentiates the tool from siblings like delete_data_file, import_data_file, and start_data_collection by emphasizing enumeration of existing files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool by stating that the returned `file` value is the authoritative identifier to pass to `delete_data_file`, which routes an agent toward file-management workflows. It also notes the tool is not confirm-gated. However, it does not explicitly contrast with other listing or data-collection tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_evaluatorsA
List every evaluator OctoBot knows about, including its activation state and category.
Tier-B (ADR-0009, reversed to GO by explicit user decision -- see this
module's docstring for the full verified DOM shape and fail-loud
assumptions). Closes update_evaluator_config's own companion-read gap:
that tool is unusable without already knowing an evaluator's exact class
name and current state. Idempotent, read-only, not confirm-gated
(ADR-0003).
Output: {"evaluators": [{"name": str, "enabled": bool, "type": str}]}.
name is the config-key attribute value -- the same string
update_evaluator_config's patch keys must equal, making the closed
loop between these two tools a structural guarantee, not a convention to
maintain by hand. type is one of "technical_analysis"/"social"/
"realtime"/"scripted", taken from whichever category container an
evaluator's row was found inside.
Raises EvaluatorScrapeContractBrokenError (NFR-18) only if zero
evaluators are found across ALL FOUR category containers combined, or an
expected container is missing from the page entirely -- never for a
single category legitimately having zero evaluators (confirmed live:
this project's own test instance has zero "Scripted evaluators"
installed).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it is exceptional: it discloses read-only/idempotent behavior, fail-loud assumptions, and precisely when EvaluatorScrapeContractBrokenError is raised versus when it is not. It even documents a confirmed live edge case to prevent false alarms.
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 section earns its place: core purpose is front-loaded, then usage relationship, output format, and error behavior. It is slightly dense with ADR references and governance details, but these are substantive context 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?
Despite having no output schema, the description fully specifies the return shape, field types, enum values, and the meaning of the name field. It also covers error semantics and lists the exact failure conditions, making the tool self-contained for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema already fully covers parameter semantics and there is nothing for the description to add. The description instead clarifies the output fields and their meanings, which is the relevant semantic content for this no-argument 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 opening line states a specific verb ('List'), a clear resource ('every evaluator OctoBot knows about'), and the key distinguishing details: activation state and category. It also explicitly names sibling update_evaluator_config and explains how this tool closes its read gap, so an agent can 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 usage context: this is the companion-read for update_evaluator_config, which is unusable without knowing an evaluator's exact class name and current state. It also states that the tool is idempotent, read-only, and not confirm-gated, giving clear behavioral guidance for when it is safe to call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_jobsA
List jobs known to the in-memory job store, optionally filtered.
Maps to no OctoBot route -- purely an in-memory listing. state
("queued"|"running"|"completed"|"failed"|"cancelled") and kind
("backtest"|"compare_strategies") are both optional filters; omit
either (or both) to not filter on it. Read-only, not confirm-gated.
Each entry uses get_job_status's shape minus sub_jobs (spec's
#### list_jobs(state?, kind?)).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| state | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden and does so well: it states the operation is read-only, not confirm-gated, purely in-memory, and not backed by an OctoBot route. It also discloses the return entry shape by referencing get_job_status minus sub_jobs.
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 action and constraints, then delivers filters, safety semantics, and return-shape information in a compact structure. Every sentence earns its place and there is no filler or repetition.
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 read-only list tool with two optional parameters and no output schema, the description is complete: it covers scope, filtering values, optionality, side-effect behavior, and the return shape via a pointer to get_job_status. 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 0%, but the description fully compensates by naming both parameters, listing their allowed values (state: queued/running/completed/failed/cancelled; kind: backtest/compare_strategies), and clarifying that each is optional and can be omitted independently. This adds meaning the bare schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific action and resource: 'List jobs known to the in-memory job store, optionally filtered.' It also distinguishes itself from route-backed siblings by stating it maps to no OctoBot route and is purely an in-memory listing, so an agent can tell it apart from tools like get_job_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 clearly explains filtering behavior: state and kind are optional, and omitting either or both disables that filter. It does not explicitly say when to prefer get_job_status over this tool, though mentioning get_job_status's shape implies the relationship; explicit alternative routing would make it a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_profilesA
List every profile OctoBot knows about, including which one is selected.
Tier-B (ADR-0006): scrapes /profiles_selector -- see this module's
docstring for the verified DOM shape and fail-loud assumptions.
Idempotent, read-only, not confirm-gated.
warning is non-null only when one or more profiles have neither a
real nor a simulated trader enabled in their config -- a legitimate
OctoBot state (confirmed against source) this adapter reports as
profile_type: "UNKNOWN" rather than failing loud, since it is not a
broken-scrape condition.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does this well: it explicitly discloses idempotence, read-only behavior, absence of confirmation gating, the scraping approach, and the non-null `warning` semantics. It also explains why `profile_type: "UNKNOWN"` is a legitimate reported state rather than a failure, which is valuable behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose first, then behavioral traits, then the warning edge case. It avoids redundancy and keeps the most important information 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?
For a zero-parameter read-only tool, the description covers purpose, safety, edge-case behavior, and the source endpoint. The main gap is that the full return shape and the specific fail-loud assumptions are only referenced via the module docstring rather than included here, so an agent cannot fully self-serve from the description alone.
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, so the schema already completely covers the input side. The description goes beyond the schema by explaining the output-related `warning` and `profile_type` semantics, which is more than the baseline requires.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List every profile OctoBot knows about', which clearly distinguishes it from single-profile operations like get_profile. It also adds that the selected profile is included, giving extra useful scope beyond the name alone.
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 conveys what the tool does and that it is read-only, but it does not explicitly state when to use this tool versus get_profile, select_profile, or other profile-related siblings. Usage context is implied rather than directly spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tentaclesA
Tier C stub (ADR-0006): tentacle enumeration has no JSON API in OctoBot.
Never makes an HTTP call to OctoBot and never raises -- this is a
static, instant response explaining the gap, not a failure (ctx is
accepted only for interface consistency with every other registered
tool; it is never read). Use get_tentacle_config(tentacle) instead if
you already know the tentacle's class name.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden. It discloses that the tool never makes an HTTP call, never raises, returns an instant static response, and accepts ctx only for interface consistency but never reads it. This is exemplary transparency for a stub.
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 tightly structured: it front-loads the stub nature, then the behavioral guarantees, then the routing alternative. Every sentence earns its place, and the ADR reference adds useful context without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and no output schema, the description covers everything an agent needs: why the tool exists, what it returns conceptually, that it is not a failure, and which sibling to use for real functionality. 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?
The input schema is empty and description coverage is complete. The description goes further by clarifying that the optional ctx parameter is accepted but ignored, which prevents an agent from assuming it has functional meaning. For a zero-parameter tool, this is more than the schema alone provides.
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 this is a stub for tentacle enumeration that returns a static explanation rather than an actual list, and it explicitly names the underlying gap ('no JSON API in OctoBot'). It also distinguishes itself from get_tentacle_config, making the tool's purpose and non-purpose 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 guidance on when to use this tool versus the alternative: use get_tentacle_config(tentacle) if you already know the tentacle's class name. This directly tells the agent how to route between sibling tools and leaves no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_portfolioA
Trigger an immediate refresh of every enabled real (non-simulated) trader's portfolio.
Maps to POST /api/refresh_portfolio -- confirmed against source as a
bare POST with no request body at all (the route never calls
flask.request.get_json()).
Success: OctoBot returns HTTP 200 with the literal JSON string
"Portfolio(s) refreshed", returned unchanged (NFR-8). Failure -- zero
enabled real traders across every connected exchange (confirmed against
source, octobot_services.interfaces.util.portfolio:: async_trigger_portfolios_refresh raises RuntimeError("no real trader to update.") in exactly this case) -- raises
PortfolioRefreshFailedError with OctoBot's own extracted error text
(always, in practice, the literal "No portfolio to refresh"). This is
an entirely expected outcome on any OctoBot instance running only
simulated trading, not a bug.
Not confirm-gated (ADR-0003): triggers a routine, non-destructive
portfolio data refresh, not a trade action. No confirm parameter
exists on this tool at all.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden and does so thoroughly: it reveals the exact HTTP method and request body, the literal success payload, the exception type and message, the expected failure case, and the non-destructive nature of the operation. This is far more transparency than an agent would get from the empty schema alone.
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 action and then logically organized into request shape, success, failure, and confirmation status. It is somewhat wordy with implementation archaeology like 'confirmed against source', 'NFR-8', and 'ADR-0003', but those details still contribute behavioral clarity in the absence of annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema and no annotations, this description is effectively complete: it covers the request shape, the exact success response, the failure exception, and the common false-alarm scenario of a simulated-only instance. An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, and the description still goes beyond the baseline by explicitly stating that the POST has no request body and that no confirm parameter exists. This removes any doubt that the tool must be invoked with an empty argument object.
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 opening sentence names a specific action ('trigger an immediate refresh') and a precise resource ('every enabled real (non-simulated) trader's portfolio'), clearly distinguishing it from read-only or history siblings like get_positions and get_historical_portfolio_value. The endpoint mapping reinforces the operation without ambiguity.
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 clearly conveys the tool's scope and explicitly flags that a failure on simulated-only instances is expected, which provides useful context. However, it never states when to prefer this tool over alternatives such as get_historical_portfolio_value or get_positions, so the when-to-use guidance remains implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restart_octobotA
Trigger a full OctoBot process restart. Confirm-gated (ADR-0003/ADR-0010).
This is the first tool in this project that can never be made fully
safe or graceful (ADR-0010) -- stated plainly, not softened. OctoBot's
own restart mechanism (GET /wait_reboot?reboot=true, confirmed against
Drakkar-Software/OctoBot source) is an ABRUPT kill-and-re-exec, never
the graceful OctoBot.stop() shutdown -- no task cancellation, no
explicit order handling occurs before the kill. Exchange-side orders
are reconciled from the exchange on reboot (OctoBot's own designed,
changelog-hardened behavior, even for live trading), but the exact
duration of the unmonitored window during the restart itself is
UNVERIFIED (open question #14) and this tool cannot measure or bound it.
Check order (cheapest/safest first, ADR-0010 Decision 4), so a call that's about to be refused never makes an unnecessary live call:
confirmflag. If not exactlytrue, no OctoBot call is made at all -- this scrapes the currently selected profile'sprofile_type(the same Tier-B scrapelist_profiles/get_profileuse) ONLY to build a risk-scaled reason string, then returnsrequire_confirmation's structured refusal (a normal return, not an error). The reason string is more detailed/cautious whenprofile_typeisLIVE-- or the scrape itself is inconclusive, which fails toward the MORE cautious message, never toward silently allowing (ADR-0010 Decision 3) -- than when it isSIMULATOR. This is the SAMEconfirm=truegate regardless ofprofile_type: never a hard, non-bypassable block forLIVEprofiles (see ADR-0010 for why an earlier draft's hard refusal didn't hold up against OctoBot's own changelog/source evidence that restart-during-live-trading is a designed, hardened scenario).JobStoreactive-job check. Refuses outright -- a structured non-exception return, naming every job -- if anybacktest/data_collectionjob isqueued/running(both ofoctobot_mcp.jobs.JobStore's independent locks checked, ADR-0007's "two independent locks" precedent). Never warns-and-proceeds or auto-cancels (ADR-0010 Decision 4 explicitly rejects both): the caller mustcancel_jobor wait for completion first.The one live call.
GET /wait_reboot?reboot=true. HTTP 200 ->{"restart_triggered": true, "message": ...}(below). Anything else raisesRestartFailedError-- never a false "triggered" result.
Residual risk, accepted (ADR-0010): a job could start in the narrow window between check 2 and the actual reboot call -- accepted given this project's single-MCP-client assumption (A3), not engineered away.
Output on success: {"restart_triggered": true, "message": "OctoBot restart scheduled (~2s delay); the server will be briefly unreachable. Call wait_for_octobot_ready() next, then re-confirm the active profile via get_profile()/list_profiles() before starting a backtest."}.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and fully discharges it: it discloses abrupt kill-and-re-exec, lack of graceful shutdown, the unverified downtime window, exchange-side order reconciliation, refusal behavior, and residual race risk. This goes well beyond a generic 'restarts the bot' statement.
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 is well structured with a numbered check order. It is verbose, and some internal references (ADR-0010, open question #14, A3) are tangential for tool invocation, but the length is largely justified by the risk of an abrupt restart.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, it documents the success response, error path, refusal return, and recommended follow-up (wait_for_octobot_ready, then re-confirm profile). It also covers edge cases such as inconclusive profile scrapes and the job-start race, making the definition complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description fully compensates by explaining that confirm is a strict boolean gate: if not exactly true, no OctoBot call is made and a structured refusal is returned. It also clarifies that the same confirm=true gate applies for LIVE and SIMULATOR profiles, adding behavioral meaning far beyond the schema's bare boolean field.
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 opening sentence states the exact action and resource: 'Trigger a full OctoBot process restart.' This is distinguished from safety-related siblings like wait_for_octobot_ready by explicitly framing itself as the restart trigger and referencing the subsequent readiness check, so an agent can tell it 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 an explicit ordered check: confirm must be exactly true, active jobs must not be queued/running, and only then is the live call made. It states hard refusals instead of warn-and-proceed, and explicitly requires the caller to cancel_job or wait before restarting, providing clear when-to-use and when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_profileA
Select a profile as OctoBot's current/active profile.
Maps to GET /profile?select=<profile_id> (spec [V]).
Spec correction, verified against source
(controllers/configuration.py::profile()) and reproduced live: this
route always responds HTTP 200 with a full HTML page, whether or not
the selection actually happened -- an unknown profile_id makes
models.select_profile() raise NoProfileError, which the route
catches internally, flashes a warning ("The requested profile no
longer exists.") into an HTML-only, session-cookie-based flash message,
and re-renders the PREVIOUSLY-selected profile's page, still with a 200
status. There is no way to distinguish success from this silent-failure
case from the HTTP response alone. This tool therefore always
re-fetches the currently-selected profile afterward (the same scrape
list_profiles/get_profile use) and raises
ProfileSelectionFailedError if it doesn't match profile_id, rather
than trusting the 200 status.
Output: {"profile_id": str, "selected": true}. Idempotent (selecting
the already-selected profile is a verified no-op on OctoBot's side) and
not confirm-gated (ADR-0003).
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it excels. It reveals that the underlying HTTP route always returns 200 even on silent failure, explains the internal NoProfileError handling, and specifies that this tool re-fetches the current profile and raises ProfileSelectionFailedError instead of trusting the status. This is far beyond typical transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every sentence earns its place, given the subtle HTTP 200 failure mode that must be explained. It is front-loaded with a clear purpose and then logically walks through the spec correction, the tool's compensating behavior, the output format, and idempotency. A small amount of redundancy exists around the repeated 200 status, but overall it is well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no annotations and no output schema, the description is remarkably complete. It specifies the output shape, the failure exception, idempotency, confirmation behavior, and the underlying route. An agent has everything it needs to invoke the tool correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for the single required parameter. It references profile_id throughout and clarifies that an unknown profile_id triggers failure detection and a raised exception, implying it must be an existing profile identifier. It could explicitly point to list_profiles for valid IDs, but the semantics are sufficiently clear from context.
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: 'Select a profile as OctoBot's current/active profile.' This clearly distinguishes the tool from sibling profile tools like list_profiles, get_profile, create_profile, update_profile, and delete_profile. Even without reading the schema, an agent knows exactly what operation this tool performs.
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 clear context for when to use the tool: to change the active profile. It also states the operation is idempotent and not confirm-gated, which clarifies expected behavior. However, it does not explicitly name alternatives or state when not to use it, though the purpose itself makes the primary use case obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_backtestA
Start a real OctoBot backtest run in the background and return immediately.
Not confirm-gated (ADR-0003): starts a simulation, never touches live
trading or destroys data. Two mutually exclusive modes (all other
parameters are mode-specific; unused ones for the chosen mode are
ignored):
mode="data_files"-> OctoBot'sstart_backtestingaction [V]. Requiresfiles(a non-empty list of exact data file names -- there is currently no MCP tool exposing what's available; the agent must already know a valid name, e.g. from OctoBot's own/backtestingpage).start_timestamp/end_timestampare epoch milliseconds (confirmed against source:_start_backtestingdivides by 1000 before use), matching this project's convention elsewhere.run_on_common_part_onlydefaults toTrue(OctoBot's own default when omitted).mode="current_bot_data"-> OctoBot'sstart_backtesting_with_current_bot_dataaction [V]. Every field is technically optional at the HTTP layer (confirmed against source), butexchange_idis effectively required unlessdata_sourcenames an explicit data file: ifdata_sourceis omitted orNone, OctoBot defaults it to"current_bot_data"(use a live snapshot of the bot's own current exchange data), which requires a validexchange_id-- omittingexchange_idin that case fails with a genericBacktestStartFailedError, notMissingExchangeIdError(that error is only raised for an actually-provided-but-unrecognized id; see this module's docstring, "Open question #6").exchange_idis the same valueget_exchange_detailsreturns as itsexchange_idfield.exchange_typeacceptsNone,"use_current_profile","spot","inverse_perpetual","linear_perpetual", or"margin"(any other value raises inside OctoBot, surfaced asBacktestStartFailedError).
source (both modes) is an optional caller-supplied override for
OctoBot's own per-run source identifier; if omitted (the expected
case), a fresh UUID is generated and stored as the job's
octobot_run_source, then reused automatically for the later
get_job_result report fetch -- the caller never needs to manage this
value.
Output: {"job_id": str, "state": "queued"} -- always "queued"
immediately after this call (the background watcher has not yet had a
chance to run at all: asyncio.create_task schedules it, it does not
run any of it synchronously). Poll get_job_status(job_id) to observe
the transition to "running" and then progress_percent advancing;
call get_job_result(job_id) once state == "completed".
Progress notifications (milestone 11, ADR-0002 decision point 3): if
this call's MCP request carries a progressToken, the watcher also
opportunistically emits an MCP progress notification (progress/total
on the same 0-100 scale as progress_percent) each time
progress_percent changes -- entirely optional, additive, and never a
substitute for polling: get_job_status behaves identically whether or
not a token was ever supplied. See octobot_mcp.tools.backtesting's own
module-level "Milestone 11" comment block for exactly how this is
implemented.
Errors: BacktestStartFailedError for an unknown mode, a missing
required field for the chosen mode, or any other start failure;
MissingExchangeIdError specifically for current_bot_data mode's
confirmed exception. Both are raised from the background watcher (not
this function) and surface as the job's errors/state="failed" via
get_job_status -- start_backtest itself only raises synchronously
for input validation caught before any job is created (unknown
mode, missing files), so a bad call never leaves a dangling queued
job behind.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | ||
| name | No | ||
| files | No | ||
| source | No | ||
| auto_stop | No | ||
| profile_id | No | ||
| data_source | No | ||
| enable_logs | No | ||
| exchange_id | No | ||
| end_timestamp | No | ||
| exchange_type | No | ||
| start_timestamp | No | ||
| reset_tentacle_config | No | ||
| run_on_common_part_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations to convey safety or side effects, the description carries the full burden and fully delivers. It discloses asynchronous scheduling via asyncio.create_task, immediate 'queued' state, background-watcher error surfacing, optional progress notifications, and that no live trading or data destruction occurs.
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 the complexity justifies the length: 14 bare parameters, no annotations, and no output schema. It is front-loaded with the core purpose and then organized into clear mode bullets and labeled sections, so an agent can quickly extract the relevant path.
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 nearly exhaustive for this tool's complexity: it covers call semantics, mode-specific requirements, defaults, error types, output shape, polling/results behavior, and even progressToken behavior. The lack of an output schema is compensated by explicitly stating the returned JSON structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage, the description compensates thoroughly: it defines the 'mode' variants, requires 'files' to be a non-empty list of exact names, specifies epoch-millisecond units for timestamps, documents defaults such as 'run_on_common_part_only', explains the conditional requirement for 'exchange_id', and enumerates valid 'exchange_type' values. Remaining parameters are either self-explanatory by name or covered by the note that unused mode-specific parameters are ignored.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific action ('Start a real OctoBot backtest run') and a distinctive behavioral property ('in the background and return immediately'), which clearly differentiates it from job-status, job-result, and data-management siblings. The scope is further clarified by 'never touches live trading or destroys data.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly separates the two mutually exclusive modes, explains which parameters apply to each, and names the exact follow-up tools to use: 'Poll get_job_status(job_id)' and 'call get_job_result(job_id)'. It also tells the agent when a call will fail synchronously versus asynchronously, which is essential for correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_data_collectionA
Start a real OctoBot historical data collection run in the background and return immediately.
Not confirm-gated (ADR-0003/tool spec): starts a background download,
never touches live trading, destroys no data, exposes no credentials --
same reasoning as start_backtest. Maps to POST /data_collector ?action_type=start_collector [V]. symbols must be non-empty.
time_frames is optional (OctoBot collects its own default set when
omitted). start_timestamp/end_timestamp are optional epoch
milliseconds (confirmed both live and from source this session --
see this module's docstring).
To discover valid exchange/symbols values, use the existing
get_all_symbols(exchange) tool (confirmed this session to return
data identical to OctoBot's own data-collector-scoped symbol list, per
FR-27 -- no separate get_available_symbols_for_collection tool
exists here for that reason). For time_frames, use this module's own
get_available_timeframes_for_collection(exchange).
Behavior (ADR-0007): creates a kind: "data_collection" job, acquires
JobStore.data_collection_execution_lock -- a lock INDEPENDENT of
backtest_execution_lock (NFR-15): a concurrent start_backtest +
start_data_collection never block each other, but two concurrent
start_data_collection calls do serialize (queueing, same as two
concurrent backtests) -- then submits the start action and spawns a
background watcher connecting to OctoBot's /data_collector Socket.IO
namespace, mirroring start_backtest's watcher exactly (this session's
own live round-trip confirmation is recorded in this module's
docstring).
Output: {"job_id": str, "state": "queued"} -- always "queued"
immediately (the background watcher has not yet run at all). Poll
get_job_status(job_id) for progress_percent/eta_seconds;
get_job_result(job_id) once state == "completed" returns
{"exchange", "symbols", "time_frames", "start_timestamp", "end_timestamp", "message"} -- deliberately NO resulting filename
(OctoBot itself names none anywhere in this flow, confirmed this
session): call list_data_files() afterward to find the new file.
A confirmed OctoBot-side limitation, not a bug in this tool: a
collection submitted for a nonexistent/invalid exchange name returns
the SAME success response and the SAME "finished" status as a
genuinely successful run (confirmed live this session, resolving open
question #11) -- if list_data_files() doesn't show the expected new
file after a "completed" job, the exchange/symbol/timeframe
combination was likely invalid upstream, not a failure this server
could have detected sooner. A collection that never progresses at all
(staleness, NFR-3) is a separate, detectable case: its
eta_confidence will show "low"/eta_seconds: null and it should
be cancelled via cancel_job.
Supports progressToken (ADR-0002 decision point 3, reused via
octobot_mcp.tools._shared._attach_progress_notifier) exactly like
start_backtest.
Errors: DataCollectionStartFailedError wrapping OctoBot's own
failure text -- confirmed messages include "Backtesting is disabled.",
"Please select an exchange.", "Please select a trading pair.", any of
_ensure_backtesting_limits's three possible messages (see this
module's docstring -- source-confirmed text, not guessed), and "Can't
collect data for {symbols} on {exchange} (Historical data collector is
already running)" for OctoBot's own one-at-a-time guard. Raised from
the background watcher (not this function), surfacing as the job's
errors/state="failed" via get_job_status -- this function itself
only raises synchronously for input validation caught before any job
is created.
| Name | Required | Description | Default |
|---|---|---|---|
| symbols | Yes | ||
| exchange | Yes | ||
| time_frames | No | ||
| end_timestamp | No | ||
| start_timestamp | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden, and it does so thoroughly. It covers background execution, immediate return, lock semantics, watcher behavior, error propagation, known OctoBot-side limitations, and cancellation signals. There is no contradiction with annotations because none exist.
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 action and is well-structured with clear sections. It is quite long and contains repeated references to session confirmations and docstrings that could be tightened, but the density of useful behavioral information justifies most of the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description provides a complete operational picture: immediate output shape, asynchronous job lifecycle, polling endpoints, final result contents, error messages, cancellation path, and a known upstream failure mode. An agent has everything it needs to invoke and monitor 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 description coverage is 0%, so the description must compensate, and it does. It explains that symbols must be non-empty, time_frames is optional with OctoBot's default set, start/end_timestamp are optional epoch milliseconds, and exchange values should be discovered via get_all_symbols. This adds meaning well beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Start a real OctoBot historical data collection run in the background and return immediately.' It clearly distinguishes this from backtesting, references the exact endpoint, and makes the tool's scope 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?
The description explicitly tells the agent how to discover valid values via get_all_symbols and get_available_timeframes_for_collection, when to poll get_job_status, when to read get_job_result, and when to cancel via cancel_job. It also clarifies the concurrency relationship with start_backtest, so an agent knows when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_evaluator_configA
Update the current profile's evaluator-activation config.
Maps to POST /config, JSON body {"evaluator_config": patch, "deactivate_others": deactivate_others} -- TWO top-level keys, never one
nested under the other -- see this module's docstring for the full
source-verified derivation of this exact shape and the request-body
key's literal value (EVALUATOR_CONFIG_KEY = "evaluator_config",
resolving the tool spec's/requirements doc's open question #12). patch
is submitted as-is, unwrapped, mapping evaluator class names to a
boolean (or "true"/"false" string) activation state -- the same
shape update_trading_config submits under its own key, since both
reach the same underlying models.update_tentacles_activation_config.
deactivate_others (default False, resolving open question #13):
when True, every OTHER currently-active evaluator NOT named in patch
is force-disabled -- confirmed by tracing models. update_tentacles_activation_config into TentaclesSetupConfiguration. update_activation_configuration/_deactivate_other_evaluators's own
body (see this module's docstring for the full trace); this only ever
touches tentacles whose type is one of the four evaluator subtypes
(technical-analysis/social/real-time/scripted) -- trading modes and
strategies are never affected by this flag. False (this tool's
default) is purely additive: only the evaluators named in patch have
their activation state changed, every other tentacle is left untouched.
patch's keys are evaluator CLASS NAMES, not display names -- e.g.
"RSIMomentumEvaluator", "BBMomentumEvaluator",
"DoubleMovingAverageTrendEvaluator", "MACDMomentumEvaluator",
"SuperTrendEvaluator" are real examples confirmed against the OctoBot
2.1.1 test instance's default evaluator set. Use this module's own
list_evaluators() (task 19, ADR-0009 -- reversed to GO by explicit user
decision after originally recommending NO-GO here) to discover every
evaluator's exact class name and current activation state: its name
field is exactly the string this tool's patch keys must equal, closing
the loop structurally. get_tentacle_config(name) does NOT expose
activation state (confirmed live: its config field holds only that
evaluator's own tunable parameters, e.g. RSI thresholds -- never an
enabled/disabled flag).
Output: {"evaluator_updated_config": <passthrough of OctoBot's own echoed value for this key from its success response>} -- matches the
route's own response shape (NFR-8), by direct analogy to
update_trading_config's own confirmed {"trading_updated_config": ...}
shape (same response envelope, different key extracted).
Not confirm-gated (ADR-0003): mutates which evaluators are active, does
not destroy data, expose credentials, or enable live trading. Raises
EvaluatorConfigUpdateRejectedError on any non-2xx response -- see this
module's docstring for why, for this tool's own request shape, OctoBot's
own error text is confirmed to always be an empty string in practice
(the evaluator_config branch never populates the route's own
err_message variable, exactly like the trading_config branch
update_trading_config documents).
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | ||
| deactivate_others | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses mutation, the default additive behavior, the side effects of deactivate_others, that only evaluator subtypes are affected and never trading modes/strategies, that the tool is not confirm-gated, that it raises EvaluatorConfigUpdateRejectedError on non-2xx responses, and that the error text is empty in practice.
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 information-rich, but long. References to module docstrings and open questions add provenance yet could be trimmed. It is front-loaded with purpose and endpoint mapping, and every paragraph contributes actionable 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 zero annotations, no output schema, and a deceptively simple input schema, the description is remarkably complete. It covers the exact request-body shape, parameter derivation, example class names, output envelope, error behavior, and the discovery path through list_evaluators().
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates. It explains that patch keys must be evaluator class names with real examples, values can be booleans or 'true'/'false' strings, the patch is submitted as-is unwrapped, and deactivate_others default and semantics are thoroughly described.
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: 'Update the current profile's evaluator-activation config.' It further distinguishes itself by mapping to POST /config and explaining that patch keys are evaluator class names, so it cannot be confused with sibling tools like update_trading_config or update_tentacle_config.
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 strong practical guidance: use list_evaluators() to discover exact class names and current activation states, and explicitly warns that get_tentacle_config does NOT expose activation state. It also clearly defines when deactivate_others=True versus False. It does not explicitly state a when-not-to-use caveat against sibling update tools, but the contextual signal is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_exchange_credentialsA
Write an exchange's API credentials to OctoBot's global config. Confirm-gated (ADR-0003).
If confirm is not exactly true, no OctoBot call is made at all --
this returns require_confirmation's structured refusal (a normal
return, not an error) instead. Reason given: "writes exchange API
credentials; verify the exchange name and that you intend to grant this
key trading access" (per spec).
Once confirmed, maps to POST /config with JSON body
{"global_config": {"exchanges_<exchange>_api-key": api_key, "exchanges_<exchange>_api-secret": api_secret[, "exchanges_<exchange>_ api-password": api_password]}} -- see this module's docstring
("Milestone 12") for the full, source-verified derivation of this exact
shape (open question #2, now resolved) and its known limitation.
Refuses locally, before any OctoBot call, if exchange contains an
underscore -- confirmed against source
(octobot_commons.configuration.config_operations.parse_and_update)
that OctoBot's own config-path decoder would otherwise split the
generated "exchanges_<exchange>_api-key" key on every literal "_"
positionally, silently writing the credential into the wrong nested
config location instead of the intended exchange's. Raises
ExchangeCredentialsUpdateRejectedError for this case.
INV-4/NFR-6, this tool's one consumer of redact_secrets: OctoBot's
own success response for this route (global_updated_config, confirmed
against source) echoes the ENTIRE submitted global_config dict back
verbatim -- including the raw api_key/api_secret/api_password just
sent. This tool therefore never reads OR forwards any part of OctoBot's
response body on success: a 2xx status alone is trusted (this route's
status code IS a faithful (success, err_message) signal, confirmed
against source models/configuration.py::update_global_config, unlike
several profiles.py routes that needed a post-hoc re-check), and the
tool's own output below is built from only what it already knows
locally. On failure, OctoBot's raw error text is passed through
redact_secrets with the literal api_key/api_secret/api_password
values from THIS call before being included in the raised exception's
message -- the single boundary INV-4 requires, not scattered ad-hoc
scrubbing.
Output on success: {"exchange": str, "updated": true, "api_key_last4": str} -- never the full api_key/api_secret, per NFR-6.
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | Yes | ||
| confirm | No | ||
| exchange | Yes | ||
| api_secret | Yes | ||
| api_password | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It thoroughly covers the confirm gate, local refusal for underscores, the exact request mapping, the decision to ignore the success response body, secret redaction on failure, and the minimal success output. This is exceptional transparency for a credential-writing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured and front-loaded with the one-sentence purpose. The detailed paragraphs are earned given the security-sensitive behavior and lack of annotations, though some internal references (e.g., 'open question #2, now resolved', 'see this module's docstring') add noise and could be trimmed.
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 5-parameter tool with no output schema and no annotations, this description is remarkably complete. It specifies input semantics, confirmation behavior, local validation, failure handling, the success response shape, and why the response body is never forwarded. An agent has enough information to call this tool safely and interpret its result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does. It explains the exact meaning and effect of exchange, api_key, api_secret, api_password, and confirm, including the requirement for confirm to be exactly true and the underscore restriction on exchange. Every parameter's role is semantically enriched beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Write an exchange's API credentials to OctoBot's global config.' This clearly identifies what the tool does and naturally distinguishes it from sibling tools focused on trading config, evaluator config, or profile management.
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 intended use is strongly implied by the purpose statement: use this tool to write exchange API credentials into the global config. It does not explicitly name alternatives or exclusions, but the operation is specific enough that an agent can tell when it applies. Slightly more explicit routing relative to update_trading_config or update_evaluator_config would make it a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_profileA
Update an existing profile's metadata (never the active/selected profile's name).
Maps to POST /profiles_management/update with JSON body
{"id": profile_id, **patch} (confirmed against source
models/profiles.py::update_profile(), which reads exactly this shape).
Spec corrections, both verified against source and reproduced live:
patch["risk"]/patch["complexity"]must be an int (or int-parseable string) matching OctoBot's enum ordinals -- not the display stringslist_profilesreturns ("Low","Difficult", ...). Source (octobot_commons.enums):ProfileRiskisLOW=1, MODERATE=2, HIGH=3;ProfileComplexityisEASY=1, MEDIUM=2, DIFFICULT=3. Sending a display string (confirmed live) raises an uncaughtValueErrorinside OctoBot, surfaced by this tool as aProfileUpdateRejectedErrorwrapping"invalid literal for int() with base 10: 'Moderate'", HTTP 500 -- not the cleanUPDATE_REJECTED400 path.patch["config"]is accepted by this tool's input schema for forward-compatibility with the documented spec shape, but is currently silently ignored by OctoBot's deployed route: the controller only ever callsmodels.update_profile(id, data)-- never passing the thirdjson_profile_contentparameter that is the only thingupdate_profile()actually assigns toprofile.config. There is no way for this tool to makeconfigtake effect against the current OctoBot version.Renaming the currently-selected profile is rejected by OctoBot itself (
"Can't rename the active profile", confirmed live), surfaced here asProfileUpdateRejectedErrorwith that exact message.
Output: {"profile_id": str, "updated_fields": object} (updated_fields
echoes the patch this tool sent -- OctoBot's own success response is
the same data echoed back, so there is nothing more to report).
Not confirm-gated (ADR-0003): does not destroy anything or touch credentials/live trading.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | ||
| profile_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers thoroughly: it discloses the exact endpoint/body mapping, the enum-ordinal encoding trap for risk/complexity with the resulting ValueError/HTTP 500, the silently-ignored config parameter, the active-profile rename rejection with its exact error message, the output shape, and a side-effect disclaimer (not confirm-gated, does not destroy anything, no credentials/live trading).
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 front-loaded with a one-sentence purpose and densely organized with bold spec-correction bullets and a separate output section; nearly every sentence earns its place given the tool's traps. Minor verbosity in the live-reproduction narrative (exact error string, source path references) prevents a perfect 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?
There is no output schema and no annotations, so the description must cover return values and side effects — it does, including the exact output contract and the two failure modes with their surfaced error type. For a tool with hidden traps (enum encoding, ignored config, active-profile restriction), an agent has everything needed 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 0% and the schema only types patch as a generic object with additionalProperties true. The description compensates by naming the meaningful patch keys (risk, complexity, config), specifying the required int/enum-ordinal encoding for risk and complexity, mapping profile_id to the body's id field, and noting that updated_fields echoes the sent patch.
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: "Update an existing profile's metadata" and immediately adds a scope constraint ("never the active/selected profile's name"). This boundary condition, reinforced later by the active-profile rename rejection, makes the tool easy to distinguish from sibling create_profile, delete_profile, and select_profile without ambiguity.
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 a clear when-not in the first sentence (never rename the active/selected profile) and explicitly warns that patch['config'] silently has no effect against the current OctoBot version, so an agent knows not to attempt it. However, it never names sibling alternatives or states conditions for choosing this tool over them, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_tentacle_configA
Update one tentacle's configuration for the currently active profile.
Maps to POST /config_tentacle?name=<tentacle>&action=update, JSON
body = patch (the raw patch dict, unwrapped) -- see this module's
docstring for the full source-verified/live-reproduced derivation of
this exact shape, including why a distinct batch route
(POST /config_tentacles) exists but is deliberately not exposed here.
OctoBot's own success response body is the literal JSON string
"<tentacle> updated" (confirmed live: DailyTradingMode, toggled and
restored during this milestone's verification). Failure (confirmed live
with an unrecognized tentacle name: HTTP 500, plain-text body "Can't find <tentacle> class") is handled via this module's
_extract_error_text, since that body is not actually JSON despite the
Content-Type: application/json header OctoBot still sends.
Output: {"tentacle": str, "updated_fields": patch, "message": str} --
message is OctoBot's own decoded success string; updated_fields
echoes the patch this tool sent (same idiom as
octobot_mcp.tools.profiles.update_profile).
Not confirm-gated (ADR-0003): mutates tentacle configuration, does not
destroy data, expose credentials, or enable live trading. Raises
TentacleConfigUpdateRejectedError on any non-2xx response.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | ||
| tentacle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden. It discloses mutation without data destruction, exact success and failure response shapes, live-confirmed error behavior, the non-JSON error body despite the JSON content-type header, and the raised exception on non-2xx responses.
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 dense and information-rich; nearly every sentence adds operational value. It is front-loaded with the core update semantics and endpoint, with verification details placed later. Slight redundancy exists in repeating the output shape and the route, but overall it is justified for a tool with no schema coverage.
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 no annotations, no output schema, and 0% parameter schema coverage, this description is exceptionally complete. It covers the HTTP mapping, request body shape, exact success/failure bodies, error handling, output format, side-effect profile, and confirmation gate status.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does by explaining that patch is the raw unwrapped patch dict sent as the JSON body, and that tentacle names the tentacle. It adds meaning beyond the minimal schema, though it stops short of giving concrete example values or enumerating valid patch 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?
States a specific verb and resource: 'Update one tentacle's configuration for the currently active profile.' The endpoint mapping and the explicit note that the batch route exists but is deliberately not exposed clearly distinguish this tool from 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?
Clearly scoped to a single tentacle and the active profile, and it explicitly warns that the batch route is not available here. It does not enumerate sibling alternatives like get_tentacle_config or list_tentacles, but the read/update distinction is implicit and the context is strong enough for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_trading_configA
Update the current profile's trading-mode tentacle-activation config.
Maps to POST /config, JSON body {"trading_config": patch} -- see this
module's docstring for the full source-verified derivation of this exact
shape (the spec's [V]-tagged claim, independently re-confirmed against
OctoBot source this session) and the request-body key's literal value
(TRADING_CONFIG_KEY = "trading_config"). patch is submitted as-is,
unwrapped -- the same shape models.update_tentacles_activation_config
(also used by the tentacle/evaluator activation branches of this same
route) expects: typically a dict mapping tentacle class names to a
boolean (or a "true"/"false" string) activation state.
Output: {"trading_updated_config": <passthrough of OctoBot's own echoed value for this key from its success response>} -- matches the route's
own response shape (NFR-8), narrowed to just this one key rather than
OctoBot's whole /config response envelope, since every other key in
that envelope reflects config domains (tentacle_config,
evaluator_config, global_config, removed_elements) this tool never
sends and is therefore always that route's own empty-string default.
Not confirm-gated (ADR-0003): mutates strategy/tentacle activation
config, does not destroy data, expose credentials, or enable live
trading. Raises TradingConfigUpdateRejectedError on any non-2xx
response -- see this module's docstring for why, for this tool's own
request shape, OctoBot's own error text is confirmed to always be an
empty string in practice, never a substantive message, despite the
spec's original claim otherwise.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it excels: it explicitly states the mutation is not confirm-gated, does not destroy data, expose credentials, or enable live trading. It also discloses error behavior (TradingConfigUpdateRejectedError on non-2xx) and clarifies that OctoBot's error text is empty in practice, which is valuable beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and contains a logical structure, but it is verbose. References to 'module docstring', 'spec's [V]-tagged claim', and 'independently re-confirmed this session' are unnecessary for tool invocation and add noise. It could be trimmed without losing essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is remarkably complete. It covers the request mapping, parameter shape, output shape, safety profile, and error behavior, leaving little for an agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema only says patch is an object with additionalProperties. The description compensates fully by explaining that patch is submitted as-is, unwrapped, and typically maps tentacle class names to booleans or 'true'/'false' strings. This is exactly the semantic detail an agent needs.
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: 'Update the current profile's trading-mode tentacle-activation config.' It clearly identifies what the tool does and even maps it to POST /config. However, it does not explicitly differentiate itself from sibling tools like update_tentacle_config or update_evaluator_config, so it misses the top score.
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 intended use is implied by the purpose statement: you use this when you need to update the current profile's trading-mode tentacle activation config. The description does not provide explicit when-not-to-use guidance or name alternative tools, and it lacks prerequisites or selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_octobot_readyA
Poll for OctoBot's HTTP server becoming reachable again after a restart.
A bounded retry loop against GET /api/version (see this module's
docstring for why this specific route was chosen) -- never blocks past
timeout_seconds, and never raises for a timeout: that is a normal,
honestly-reported result (NFR-3's "honest null/false over a
fabricated guess" ethic), matching every other timeout-bounded loop in
this project.
Correctness fix (resolving part of open question #14, live-verified
against the test instance): a ready: true result now REQUIRES having
observed at least one genuinely unreachable poll first. An earlier
version of this tool returned ready: true after its very first poll
succeeded -- but restart_octobot's own route schedules OctoBot's kill
with a confirmed ~2-second delay (models.restart_bot(delay=2),
ADR-0010's Context), so a poll issued immediately after
restart_octobot returns will almost always land WITHIN that grace
window and hit the OLD, not-yet-killed process -- a false positive that
completely defeats this tool's purpose. Confirmed live, twice, against
the OctoBot 2.1.1 test instance: the HTTP server stayed reachable until
~2.1s post-trigger (matching the confirmed 2s delay almost exactly),
then was genuinely unreachable for ~6.3-6.7s, before answering again at
~8.5-8.9s total. A naive first-success-wins loop reported ready: true
in ~0.05s both times -- entirely within the pre-kill grace window, never
having observed the real restart at all. This loop now tracks whether
it has seen a failed poll; a success only counts as ready: true once
at least one prior poll in this same call has failed, so ready: true
now means "the server went down and came back," not just "answered."
"Ready" (even with the fix above) still means ONLY "the HTTP server
answered a request again after a confirmed outage" -- nothing more, and
this is now a CONFIRMED gap, not a suspected one. A follow-up live
test checked SimpleStrategyEvaluator's default_config/
required_evaluators immediately after a genuine, confirmed restart
(dense-polled, not a race) -- unchanged from before the restart. The
same end result (restart does not unblock strategy-composition-tuning
validation via backtest) was independently confirmed on an entirely
separate OctoBot instance/session. Do not present restart_octobot/
wait_for_octobot_ready as a fix for evaluator/strategy-composition
tuning validation -- that was this capability's whole stated purpose
(ADR-0010's Context) and it does not hold. See ADR-0010's "Negative
finding" (Context) and Consequences for the full account, including
an open question of whether this capability should be kept at all
given its purpose doesn't hold. Order-execution parameters (sizing,
stop-loss/take-profit) are unaffected by any of this and apply
correctly in a profile_id-targeted backtest without a restart.
DEFAULT_TIMEOUT_SECONDS/DEFAULT_POLL_INTERVAL_SECONDS (60s/2s):
the 60s timeout has real headroom above the ~8.5-8.9s measured
end-to-end restart time above (measured twice, one instance, one
OctoBot version -- some margin is appropriate, not treated as a tight
bound); the 2s poll interval reliably samples within the ~6.3-6.7s
measured outage window. Still treat both as informed-but-limited
defaults (n=2, single instance/version), not a guaranteed bound for
every OctoBot deployment -- override both per-call if your own
environment differs materially.
Not confirm-gated (a read-only poll). Returns {"ready": true|false, "elapsed_seconds": float, "attempts": int} -- all fields reflect this
loop's REAL timing/attempt count, never fabricated.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout_seconds | No | ||
| poll_interval_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly: it discloses that the loop is bounded, never raises on timeout, returns an honest false, requires at least one failed poll before ready:true, and clarifies that 'ready' only means the HTTP server answered after a confirmed outage. This is exceptionally transparent about edge cases and limitations.
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 provides deeply relevant behavioral, correctness, and parameter context. It is long and contains project-specific references (ADR-0010, NFR-3, open question #14) that could be condensed without losing operational value, so it is not maximally concise.
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 no output schema and no annotations, the description is unusually complete: it specifies return fields, timing semantics, failure behavior, default reasoning, measurement caveats, and a confirmed limitation. Nothing an agent needs to invoke this tool correctly or interpret its result 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 0%, so the description must compensate, and it does. It explains the default timeout and poll interval, why those values were chosen, gives measured real-world timing context, and instructs users to override both per-call if their environment differs materially.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: polls for OctoBot's HTTP server becoming reachable again after a restart. It also clarifies the exact meaning of 'ready' and distinguishes this tool from generic polling or restart tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly frames when this tool applies (after a restart) and explicitly warns against using it as a fix for evaluator/strategy-composition tuning validation. It does not name an alternative sibling tool, but it gives strong context about its intended pairing with restart_octobot and its read-only nature.
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. Dates show when Glama detected each change.
47 tool updates
v0.1.0- First observed
cancel_job - First observed
cancel_order - First observed
check_accounts_compatible - First observed
clear_orders_history - First observed
clear_portfolio_history - First observed
clear_trades_history - First observed
clear_transactions_history - First observed
close_position - First observed
compare_strategies - First observed
convert_profile_to_live - First observed
create_profile - First observed
delete_data_file - First observed
delete_profile - First observed
export_logs - First observed
export_profile - First observed
get_all_currencies - First observed
get_all_symbols - First observed
get_available_timeframes_for_collection - First observed
get_currency_list - First observed
get_exchange_details - First observed
get_historical_portfolio_value - First observed
get_job_result - First observed
get_job_status - First observed
get_logs - First observed
get_orders - First observed
get_pnl_history - First observed
get_positions - First observed
get_profile - First observed
get_tentacle_config - First observed
get_trades - First observed
import_data_file - First observed
list_data_files - First observed
list_evaluators - First observed
list_jobs - First observed
list_profiles - First observed
list_tentacles - First observed
refresh_portfolio - First observed
restart_octobot - First observed
select_profile - First observed
start_backtest - First observed
start_data_collection - First observed
update_evaluator_config - First observed
update_exchange_credentials - First observed
update_profile - First observed
update_tentacle_config - First observed
update_trading_config - First observed
wait_for_octobot_ready
TDQS
Scored across 47 tools
Most tools pair a single action with a distinct OctoBot resource, and the profile, trading, job, and config families are separated cleanly. A few near-miss names such as get_currency_list vs get_all_currencies, and list_tentacles vs list_evaluators, create enough ambiguity that an agent has to rely on the descriptions.
The set is uniformly snake_case and mostly follows a verb_noun pattern (get_orders, create_profile, clear_trades_history, start_backtest). It is not perfectly regular because collection-returning tools mix get_ and list_ prefixes, and a few names use phrasal forms like check_accounts_compatible or convert_profile_to_live.
47 tools is well above the typical well-scoped MCP surface and will impose real selection overhead, especially with two stub tools that do not perform their apparent function. The breadth is partly justified by OctoBot's many domains, but the set would be tighter if the four clear_*_history tools and related listing tools were consolidated.
Profile CRUD, job lifecycle, data-file management, and the evaluator update/listing loop are complete. However, the trading surface lacks any order-creation or live-trading toggle, list_tentacles and get_logs are explicit stubs, and tentacle discovery outside evaluators is a dead end, so there are notable gaps.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server exposing the Backtest360 engine API as tools for AI agents.
Trade across 22+ exchanges and brokers from any MCP-capable AI agent, no install required.
Trade 16 crypto exchanges + MetaTrader 5 from your AI assistant via one MCP connection.
Remote MCP server for AI.TV creators — delegate account operations to your AI agent over MCP.
Related MCP Servers
- FlicenseBqualityDmaintenanceConnects MCP-compatible AI agents to GT Protocol trading accounts, enabling natural language control of automated trading bots, strategy backtesting, deal execution, and balance monitoring on Binance and Hyperliquid exchanges.1-
- AlicenseNot gradedqualityCmaintenanceAn MCP server for cryptocurrency trading via Freqtrade, enabling trade management, balance checks, strategy configuration, backtesting, and bot lifecycle control from any MCP-compatible AI agent.MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to interact with the PocketOption trading platform via MCP, including balance checks, candle data, asset screening, and trade placement, with support for multi-agent coordination.243MIT
- AlicenseBqualityDmaintenanceEnables AI agents to trade crypto with paper money, access market data, view leaderboards, and manage trading bots via an MCP-compatible interface.16MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/roman-zaglauer/octobot-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server