mcp-mt5
This server provides an offline MetaTrader 4/5 development harness for LLM agents, enabling compile, deploy, backtest, analysis, and log inspection without touching the UI or trading live.
Discovery & terminal selection:
env_info,list_terminals,select_terminalBuild & deploy: compile, compile_and_deploy, deploy (EA/Include), smoke_test, list_experts
Source analysis & lint: inspect_source (inputs, includes, docs, symbols, magic collisions), analyze_mql (structural lint, deprecated calls, metrics), validate_tester_ini
Format & refactor: format_mql, rename_symbol, extract_function
Strategy Tester: patch_tester_ini, gen_tester_inputs, run_backtest (foreground), start/get/cancel_backtest (background), read_tester_report, compare_reports, read_optimization, kill_terminal
Logs & snapshots: tail_log (live/journal/tester), snapshot_sources, list_snapshots
MCP resources:
mt5://log/{mode}andmt5://report/{id}for raw log/report access
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-mt5compile and deploy the moving average EA"
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.
mcp-mt5
Model Context Protocol server for the MetaTrader 4/5 build pipeline. Compile MQL sources, deploy compiled EAs, run Strategy Tester, parse reports, tail logs — all driven by an LLM agent without touching the MetaTrader UI.
What this is — and what it isn't
✅ This server | ❌ Not this server |
MetaTrader dev harness — compile, deploy, backtest, parse | Live trading (orders, positions, quotes) |
Wraps | Wraps the |
Runs entirely offline against installed terminal | Connects to a broker server |
Iterates strategies before they go live | Executes strategies in production |
Use case: an LLM agent edits
.mq5source → compiles → deploys → runs Strategy Tester → reads report → adjusts → repeats. No broker login, no human in the loop, no risk of real-money execution.
For runtime trading, pair this with a live-trading MCP — they target different layers and compose well.
Related MCP server: Meta-Trader-MCP
Tools
27 tools (plus 16 deprecated aliases until 0.6.0) and 2 resource templates. Every tool carries MCP annotations (read-only / destructive hints), a typed output schema and per-parameter descriptions; failures are reported as tool errors, never as a normal result with an error key.
🔍 Discovery & terminal selection
Tool | Description |
| Resolved paths, terminal hash, edition, and missing-component issues |
| Every MT4/5 terminal data folder under |
| Switch the active terminal data folder mid-session by origin path, hash, or install dir |
🔨 Build & deploy
Tool | Description |
| MetaEditor CLI on a |
| Compile, then copy the fresh |
| Copy a compiled binary into |
| Compile + deploy + 1-day headless backtest + journal scan for runtime errors |
| Enumerate |
🔎 Source analysis & lint
Tool | Description |
|
|
| Structural lint (missing |
| Required keys, date format, numeric ranges; cross-checks |
✏️ Format & refactor
Tool | Description |
|
|
| Whole-word rename across a tree, |
| Brace-aware extraction of a line range into a helper (inline or into a |
📊 Strategy Tester
Tool | Description |
| Update |
| Build a |
| Launch |
| Background runs: launch and get a |
| Parse an MT5/MT4 report into a ~50-field |
| Diff two reports key by key with absolute/percent deltas; pass |
| Read a |
| Kill terminals launched by this server ( |
📝 Logs & snapshots
Tool | Description |
| Tail |
| Freeze source files into a timestamped folder with a |
📡 MCP resources
URI | Description |
| Last 500 lines of |
| Full HTML of a report returned by |
Deprecated aliases (removed in 0.6.0)
The pre-0.5.0 tool names still work in 0.5.x as thin wrappers whose descriptions start with DEPRECATED. Set MCP_MT5_LEGACY_TOOLS=0 to hide them and shrink the tool catalogue to the 27 tools above.
Deprecated name | Use instead |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Quick start
Install
pip install mcp-mt5Requires Windows + an installed MetaTrader 4 or 5 terminal.
Register with an MCP client
Most MCP clients accept a JSON entry under mcpServers. The server inherits its configuration from environment variables:
{
"mcpServers": {
"mt5": {
"command": "mcp-mt5",
"env": {
"MT5_INSTALL": "C:\\Program Files\\MetaTrader 5"
}
}
}
}Refer to your client's documentation for the exact config file location.
Verify the install
Once registered, ask your agent to call env_info:
{
"edition": "mt5",
"install": "C:\\Program Files\\MetaTrader 5",
"terminal_hash": "<32-char-hex-hash>",
"metaeditor": "C:\\Program Files\\MetaTrader 5\\MetaEditor64.exe",
"experts_dir": "C:\\Users\\<you>\\AppData\\Roaming\\MetaQuotes\\Terminal\\<hash>\\MQL5\\Experts",
"issues": []
}An empty issues array means everything is wired up correctly.
Configuration
Resolution priority for the MetaTrader install + data folder:
Explicit env vars (below)
Auto-scan of
%APPDATA%\MetaQuotes\Terminal\*\origin.txtfor a folder whose origin matchesMT5_INSTALLPortable mode fallback (data colocated with install dir)
Env var | Default | Notes |
|
| Install dir containing |
| (auto-detected) |
|
| (auto-detected) | 32-char folder name |
|
| Set to |
Running the server from WSL
The server can run inside WSL and drive the Windows MetaTrader install through WSL interop.
The install (/mnt/c/Program Files/MetaTrader 5) and the data folder (scanned under
/mnt/*/Users/*/AppData/Roaming/MetaQuotes/Terminal, matched through origin.txt) are
auto-detected; MT5_INSTALL / MT5_DATA override them. Paths handed to MetaEditor/terminal are
translated with wslpath -w automatically. Interop must be enabled
(/etc/wsl.conf [interop] enabled=true, then wsl --shutdown).
MT4 support
Set MT5_EDITION=mt4 and point MT5_INSTALL at your MT4 install. The server switches to metaeditor.exe (32-bit), terminal.exe, and the MQL4/ data tree automatically.
Example workflow
A typical LLM-driven iteration loop:
1. env_info → verify paths
2. compile_and_deploy source="C:\\...\\MyEA.mq5" → 0 errors, .ex5 deployed ✅
3. patch_tester_ini config="tester.ini" updates={
"Tester.Symbol": "EURUSD",
"Tester.FromDate": "2025.01.01",
"TesterInputs.RiskPct": "1.5"
}
4. run_backtest config="tester.ini" wait=true
5. read_tester_report path=<report_path from step 4> → summary.net_profit = 1234.56
summary.profit_factor = 1.45
6. tail_log mode="tester" lines=200 structured=true → diagnose journal warnings
7. <edit Signal.mqh based on findings>
8. → loop back to step 2A sample tester.ini
; Launch: terminal64.exe /config:tester.ini
; Period codes: M1=1, M5=5, M15=15, H1=16385, H4=16388, D1=16408
; Model: 0=Every tick, 1=1 min OHLC, 4=Real ticks
[Tester]
Expert=MyEA
Symbol=EURUSD
Period=M15
Model=1
FromDate=2024.01.01
ToDate=2024.12.31
Deposit=10000
Currency=USD
Leverage=500
Visual=0
ShutdownTerminal=1 ; required so run_backtest can wait for the run to finish
Report=tester_report
[TesterInputs]
; ParamName=value||start||step||stop||(N=fixed|Y=optimize)
; RiskPct=1.0||0.1||0.1||3.0||NA more complete sample lives at examples/tester.ini.
Development
git clone https://github.com/PHUICMT/mcp-mt5
cd mcp-mt5
pip install -e ".[dev]"
pytest # runs the test suite (no MetaTrader needed)
ruff check src tests # lintsCI runs on Windows for Python 3.10, 3.11, and 3.12 against every push to main. Tagging a release (e.g. v0.2.0) triggers an OIDC publish to PyPI.
Project layout
mcp-mt5/
├── src/mcp_mt5/
│ ├── server.py # FastMCP tool definitions
│ ├── paths.py # Layout detection + origin.txt scan
│ ├── parsers.py # Compile log, tester report/journal parsers, encoding helpers
│ ├── analysis.py, lint.py, formatting.py, refactor.py, ast_refactor.py
│ ├── optimization.py # .opt cache reader (documented TesterOptCache layout)
│ ├── reports.py, snapshot.py, smoke.py, workdir.py
├── tests/ # pytest suite, no live MT5 required
├── examples/ # Sample tester.ini + client config
└── .github/workflows/ # CI + PyPI releaseLimitations
Windows-only. MetaTrader CLI binaries don't ship for Linux/macOS. Wine ports may work but are untested.
No live broker access. This server intentionally never authenticates to a broker. Use a separate MCP server for runtime trading.
Tester report parsing is best-effort. MetaTrader's HTML output isn't a stable schema; the raw HTML is also returned alongside the parsed structure so you can fall back to text inspection when needed.
Optimisation caches (
Tester/cache/*.opt) are parsed with the layout MetaQuotes published in MQL5 Programming for Traders. Files with an unrecognised record layout are reported as such rather than guessed.
Roadmap
All v0.3.x roadmap items shipped in v0.4.0. Future ideas:
Real tree-sitter MQL grammar for
extract_function(current implementation is brace-counting + regex)WebSocket transport for long-lived sessions (currently stdio only)
Linux/Wine port for non-Windows agents
License
MIT © 2026 PHUICMT
Available Tools
43 toolsanalyze_mqlARead-onlyIdempotent
Static checks on MQL source without compiling: structural lint (missing OnInit/OnTick, unused inputs, hardcoded magic/symbol), MT4-style deprecated API calls with MT5 replacements, and size/nesting metrics.
Replaces lint_basic / check_deprecated / code_metrics. Use compile(syntax_only=true) for real compiler diagnostics.
| Name | Required | Description | Default |
|---|---|---|---|
| root | No | Absolute folder to aggregate metrics over every MQL file (metrics check only). | |
| checks | No | Which checks to run; default all. | |
| source | No | Absolute path to one .mq4/.mq5/.mqh file. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only and idempotent; the description adds that it performs static analysis without invoking the compiler, so no compile artifacts or compiler errors are produced. It also reveals that the deprecated check includes MT5 replacements, not just a list of issues. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler: the first is front-loaded with core behavior and scope, and the second gives routing guidance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter tool with a full input schema, an output schema, and read-only/idempotent annotations, the description covers purpose, scope, check semantics, and the key alternative. The only implied detail, that root is metrics-only, is already supplied by the schema's parameter description.
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?
All three parameters are described in the schema with 100% coverage, so the description does not need to re-explain root/source/checks. It does add meaning for the checks enum by explaining what 'lint', 'deprecated', and 'metrics' actually cover, while the schema handles the file/folder distinction.
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 ('analyze') and resource ('MQL source'), explicitly scopes it to 'without compiling', and enumerates the three check families: structural lint, deprecated API calls with MT5 replacements, and size/nesting metrics. This clearly distinguishes it from compile and from the legacy lint/deprecated/metrics 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?
It explicitly says it 'Replaces lint_basic / check_deprecated / code_metrics', telling the agent not to use the older siblings for these checks. It also routes compiler diagnostics to `compile(syntax_only=true)`, giving an explicit alternative condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_backtestADestructive
Kill the terminal of a running background backtest. No report is produced for a cancelled run.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | Identifier returned by start_backtest / run_backtest. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag the operation as destructive (destructiveHint=true), and the description adds specifically what gets destroyed—the terminal of a running background backtest—and the subsequent outcome that no report is produced. This goes beyond the bare annotation and gives the agent an important behavioral consequence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The action and object are front-loaded, and the second sentence delivers only the critical consequence. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter destructive tool with a full input schema and an output schema, the description covers the core action and the important outcome of a cancelled run. A minor gap is the absence of any statement about the behavior if the backtest is not actually running, but this is not a blocker for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The run_id parameter is fully described in the schema, including its provenance as the identifier returned by start_backtest/run_backtest. Since schema description coverage is 100%, the description does not need to add parameter details, and the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action ('Kill the terminal') and a precise target ('a running background backtest'), then adds the key consequence that no report is produced. This clearly distinguishes the tool from reading, listing, and starting backtests, even without naming a sibling.
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 the intended use case: a background backtest that is currently running and needs to be terminated. However, it does not explicitly contrast itself with the related sibling kill_terminal or explain when to choose this over that tool, leaving the routing partially to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_deprecatedARead-onlyIdempotent
DEPRECATED (removed in 0.6.0): use analyze_mql(source, checks=["deprecated"]).
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Absolute Windows path to the .mq4/.mq5/.mqh source file. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that the tool is removed in 0.6.0, which is useful behavioral context beyond annotations because it warns that execution should be avoided. It does not describe the old tool's behavior, but that is unnecessary for a deprecated 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 entire description is one compact sentence, front-loaded with DEPRECATED and ending with the precise replacement call. Every part earns its place and there is no filler or redundant restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deprecated tool, the context is complete: annotations cover safety, the schema covers the parameter, and the description names the replacement and the removal version. An output schema exists, so return-value documentation is not needed. An agent has everything required to decide how to handle this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents the single parameter as an absolute Windows path to a .mq4/.mq5/.mqh source file, so schema coverage is 100%. The description only references the source argument in the replacement call and adds no new parameter-level semantics. The baseline of 3 is appropriate because the schema already carries the 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 description immediately marks the tool as DEPRECATED and removed in 0.6.0, making its status unmistakable. It then names the exact replacement call, analyze_mql(source, checks=['deprecated']), which distinguishes it clearly from the analyze_mql sibling and tells the agent not to select this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use analyze_mql(source, checks=['deprecated']) instead, leaving no ambiguity about when this tool should be used: never. It provides both the exlusion condition (deprecated/removed) and the exact alternative with required arguments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
code_metricsARead-onlyIdempotent
DEPRECATED (removed in 0.6.0): use analyze_mql(source or root, checks=["metrics"]).
| Name | Required | Description | Default |
|---|---|---|---|
| root | No | Absolute folder to aggregate over. | |
| source | No | Absolute path of one source file. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description does not need to restate safety. The description adds the key behavioral fact that this tool is deprecated and removed in 0.6.0, which is valuable context beyond the annotations. No contradiction exists between the description and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is one sentence with the deprecation warning front-loaded and the replacement instruction following immediately. There is no redundant wording or filler, matching the standard for an effective concise tool description.
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 deprecated tool, the description is complete: it warns against usage, names the replacement, and gives the replacement invocation. Safety is fully covered by annotations, and an output schema exists, so return values need no additional description. Nothing essential is missing for an agent to act correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so root and source are already documented as an absolute folder and an absolute file path. The description adds semantic value by showing how these parameters map into the replacement call: analyze_mql(source or root, checks=['metrics']). This goes slightly beyond the schema and helps the agent migrate usage.
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 the tool as deprecated and immediately redirects to analyze_mql with checks='metrics', which conveys the tool's former purpose by reference. It does not state a direct verb+resource for code_metrics itself, but the deprecation notice makes the intended action clear. This is sufficient for an agent deciding whether to invoke it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: do not use this tool, use analyze_mql instead. It even provides the exact replacement call pattern, including the source or root argument mapping. This is strong when-to-use/when-not-to-use guidance with a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_reportsARead-onlyIdempotent
Diff two tester reports key by key (absolute and percent deltas), optionally checking guard thresholds.
With guards, a profit-style metric below its threshold or a drawdown/loss metric above it is a
violation. Accepting only improvements across many iterations is selection bias; treat guards as a
sanity gate, not proof of robustness. Replaces regression_check.
| Name | Required | Description | Default |
|---|---|---|---|
| guards | No | Optional percent thresholds per summary key, e.g. {"net_profit": -5, "profit_factor": -10, "max_drawdown": 25}; when given, `violations` and `ok` are added. | |
| baseline | Yes | Absolute path to the baseline tester report (.htm). | |
| candidate | Yes | Absolute path to the candidate tester report (.htm). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and idempotent behavior. The description adds useful guard semantics and a caution about selection bias, but it does not disclose deeper behavioral details like output size, performance, or whether files are consulted beyond what the schema implies.
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 purpose is stated in one crisp sentence, with a focused second paragraph elaborating on guard semantics. The caveat about selection bias is relevant, though slightly tangential to simply invoking the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description provides enough context to know when to combine variables. It explains the optional guard behavior and its interpretation, covering the essential decision space.
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 covers all parameters, but the description adds key meaning. Specifically, it explains that profit-style metrics below a threshold and drawdown/loss metrics above are violations, going beyond the schema's 'percent thresholds per summary key'.
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 'Diff two tester reports key by key (absolute and percent deltas)', which uses a specific verb and resource distinctly. It also explicitly says 'Replaces regression_check', differentiating it from a sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states it is the replacement for regression_check, giving clear guidance on which sibling to use. It also frames when to use guards and how to interpret thresholds, though it does not enumerate contexts where other comparison tools should be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compileA
Compile one MQL source with MetaEditor and return structured diagnostics.
ok is true only when the log has a Result: line with 0 errors AND (unless
syntax_only) a fresh .ex5/.ex4 was produced (binary_fresh). Fix every entry in errors
(file, line, col, code, message) and call again; warnings do not block deployment.
Takes 1-30 s. To also copy the binary into Experts/ use compile_and_deploy.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Absolute Windows path to the .mq4/.mq5/.mqh source file. | |
| include | No | MQL root folder (parent of Include/) if different from the active terminal's. | |
| log_file | No | Explicit path for the compile log; defaults to .mt5tmp/<stem>.compile.log next to the source. | |
| syntax_only | No | true = MetaEditor /s syntax check only: faster, produces no binary. | |
| timeout_sec | No | Give up after this many seconds. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description explains the exact success condition (`ok` requires a `Result:` line with 0 errors, plus a fresh binary unless syntax_only), the `binary_fresh` concept, expected duration (1–30 s), and that warnings do not block deployment. This is substantive 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 compact, front-loaded with the core purpose, and every sentence earns its place: success semantics, retry guidance, timing, and the sibling alternative. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich output schema and fully documented parameters, the description covers all essential operational context: success criteria, error handling, timing, binary freshness, and the deployment alternative. The 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 100%, so the baseline is 3. The description adds a little semantic context around `syntax_only` and `timeout_sec` via the duration note, but does not meaningfully extend the schema's own parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opening sentence names a specific action ('Compile one MQL source') and the tool context ('with MetaEditor'), and the final sentence distinguishes the sibling compile_and_deploy. The purpose is immediately clear and non-tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear guidance on when to call this tool versus compile_and_deploy, and instructs the agent to fix errors and retry. It does not explicitly mention the sibling syntax_check tool, though the syntax_only parameter partially covers that use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compile_and_deployADestructive
Compile a source and, if it succeeds, copy the fresh binary into the terminal's Experts/ folder.
Use this before run_backtest or smoke_test. Returns the compile result plus deploy;
ok is false if either stage failed (compile errors are in compile.errors).
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Absolute Windows path to the .mq4/.mq5/.mqh source file. | |
| ea_name | No | File name for the binary inside Experts/; defaults to <stem>.ex5. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and non-idempotent, so the bar for extra behavioral disclosure is lower. The description adds valuable conditional behavior: deploy only happens after successful compile, and `ok` is false if either stage fails, with compile errors surfaced in `compile.errors`.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: the core operation, the intended usage context, and the return/error semantics. The most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-stage tool with an output schema and destructive annotations, the description covers the essential sequence, failure behavior, and when to use it. It could mention that deploying may overwrite an existing binary, but the annotations already signal destructiveness, so this is not a major gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both `source` and `ea_name`. The description adds no new parameter-level detail beyond naming the source as the thing compiled, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: compile a source and, on success, copy the binary into Experts/. It clearly distinguishes itself from siblings like `compile` or `deploy` by describing the combined two-stage operation and the resulting deploy location.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: before `run_backtest` or `smoke_test`. It does not, however, tell the agent when to prefer standalone `compile` or `deploy` instead, so the guidance is clear but not fully contrastive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deployADestructive
Copy a compiled EA into the terminal's Experts/ folder or a .mqh header into Include/, chosen by extension.
Overwrites an existing file of the same name. Use compile_and_deploy to build and copy in one step.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Absolute path to a compiled .ex4/.ex5 (goes to Experts/) or a .mqh header (goes to Include/). | |
| name | No | File name to use in the target folder; defaults to the source file name. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly discloses that the operation 'Overwrites an existing file of the same name,' which is important destructive behavior beyond the destructiveHint annotation. It also clarifies that the target directory is determined by file extension, adding behavioral detail not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The primary behavior and extension routing are front-loaded, and the second sentence adds the critical overwrite warning and the compile_and_deploy alternative efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-parameter API, destructive annotation, and output schema presence, the description covers the essential behavior, the overwrite risk, and the main alternative workflow. It could mention behavior for unsupported extensions, but that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the file and name parameters are already well documented. The description adds context about extension-based routing but does not materially extend the parameter-level meaning beyond what the schema already 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 states a specific action ('Copy'), a precise resource ('compiled EA' or '.mqh header'), and a deterministic destination ('Experts/' vs 'Include/' chosen by extension). This clearly differentiates the core operation from build-only tools like compile and combined build-and-copy tools like compile_and_deploy.
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 points to compile_and_deploy as the alternative when building and copying are needed together, and the custom name parameter gives useful usage context. It does not discuss other sibling tools like deploy_ea or install_include, but the extension-based routing makes the intended usage fairly unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deploy_eaADestructive
DEPRECATED (removed in 0.6.0): use deploy(file, name).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | File name to use inside Experts/. | |
| source_ex | Yes | Absolute path to the compiled .ex4/.ex5 binary. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations already label this as destructive (destructiveHint=true), the description adds crucial behavioral context: the tool is removed in version 0.6.0 and should not be invoked. This is a meaningful disclosure beyond what annotations provide, though it doesn't explain the tool's original behavior—acceptable for a deprecated 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?
Single sentence, no fluff, and the deprecation warning is front-loaded. High signal-to-noise ratio.
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 deprecated tool, the description is complete: it tells the agent not to use it and where to go instead. No additional details are needed, and the presence of an output schema further reduces burden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented. The description adds no extra semantics about parameters, but the baseline 3 is appropriate as the schema carries the full 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 description explicitly states that the tool is deprecated and directs the user to the successor `deploy(file, name)`, making the purpose and replacement unambiguous. It's not a tautology; it informs the agent that this tool is obsolete and not for use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit instruction on when to use this tool (never, since deprecated) and expressly names the alternative, `deploy`, satisfying the 'when-not' and 'alternative' guidance perfectly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
env_infoARead-onlyIdempotent
Resolve and report MT4/5 paths, terminal hash, and missing-component issues.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that the tool is read-only, idempotent, and non-destructive. The description adds some useful scope (paths, terminal hash, missing-component diagnosis) but does not explain behaviors like failure modes, output shape, or whether 'resolve' implies any workspace-side effect. The description does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no filler. It front-loads the core action ('Resolve and report') and immediately lists the relevant resource types, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, read-only tool with an output schema and strong annotations, the description covers the essential purpose and scope. It is arguably complete enough to invoke correctly, though it would be more complete with a brief note about when to prefer it over sibling terminal-related tools.
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 declares zero parameters, so there is no parameter ambiguity for the agent to resolve. Per the baseline for parameterless tools, the description does not need to compensate for missing parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pairing: it 'resolves and reports' MT4/5 paths, terminal hashes, and missing-component issues. This clearly distinguishes it from sibling tools like list_terminals or select_terminal, and precisely identifies its focus.
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 no guidance on when to use this tool versus the many related sibling tools such as list_terminals, select_terminal, or list_backtests. There are no conditions, exclusions, or alternative routing hints, so the agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_docARead-onlyIdempotent
DEPRECATED (removed in 0.6.0): use inspect_source(source, aspects=["docs"]).
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Absolute Windows path to the .mq4/.mq5/.mqh source file. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds the crucial behavioral fact that the tool has been removed from the API and will not work, along with the migration path. This goes beyond the annotations and sets correct expectations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that immediately signals deprecation and then gives the replacement. There is no filler, and every word contributes to the agent's decision.
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, deprecated tool with rich annotations and an output schema, the description supplies the essential missing context: it is removed and should be replaced by inspect_source with aspects=['docs']. A small deduction is warranted because it does not explicitly say what calling it will do now or what the original return value was, but the deprecation warning largely covers this.
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 only parameter, source, is already fully described in the schema as an absolute Windows path to .mq4/.mq5/.mqh files, so schema coverage is 100%. The description does not add additional parameter-level details beyond showing source used in the replacement call, which keeps this at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description does not directly state what extract_doc originally did, but it clearly marks the tool as removed and identifies the exact successor call, which conveys its doc-extraction purpose. It also distinguishes this tool from siblings by labeling it deprecated, though a direct 'extracts documentation' statement would make it fully explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says the tool is deprecated/removed and gives the precise alternative invocation: inspect_source(source, aspects=["docs"]). This is exemplary usage guidance because it tells the agent not only to avoid this tool but exactly what to call instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_functionADestructive
Extract a contiguous block of lines into a new helper function.
Brace-counting + regex param detection — not a full AST parser. Returns the
proposed helper, call site, and parameter list. Set dry_run=False to write.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Absolute Windows path to the .mq4/.mq5/.mqh source file. | |
| dry_run | No | true = preview the change and write nothing; false = apply it to the files. | |
| line_end | Yes | Last line (1-based, inclusive) of the block to extract. | |
| new_name | Yes | Name of the new helper function. | |
| line_start | Yes | First line (1-based, inclusive) of the block to extract. | |
| return_type | No | Return type of the helper, e.g. void or double. | void |
| target_file | No | Optional .mqh path to append the helper to; defaults to inserting above the enclosing function. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses meaningful behavioral traits beyond the annotations: it uses brace-counting and regex rather than a full AST parser, returns a proposed helper/call site/parameter list, and requires explicitly setting dry_run=False to write. This adds real context beyond the destructiveHint annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose first, then limitations, return content, and modification behavior. Every sentence contributes useful information without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the key operational aspects: what the tool does, its algorithmic limitations, what it returns, and how to trigger a write. An output schema exists to explain return values. It could be slightly richer about failure modes or preconditions, but is largely complete for a destructive refactoring tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are already documented clearly. The description adds minimal extra parameter semantics beyond restating the dry_run toggle, which the schema already explains. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Extract a contiguous block of lines into a new helper function.' This is clear and unambiguous. It does not explicitly differentiate from sibling tools like extract_doc or extract_inputs, though 'helper function' provides useful context.
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 no explicit guidance on when to use this tool versus alternatives. 'Set dry_run=False to write' explains how to apply changes, and 'not a full AST parser' hints at a limitation, but no alternative tool is named or contrasted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_inputsARead-onlyIdempotent
DEPRECATED (removed in 0.6.0): use inspect_source(source, aspects=["inputs"]).
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Absolute Windows path to the .mq4/.mq5/.mqh source file. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds important lifecycle context: the tool is deprecated and removed in 0.6.0, which changes how an agent should treat it. It does not describe what happens if invoked, but the deprecation warning is sufficient for a removed 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 entire description is one sentence, front-loaded with 'DEPRECATED' and immediately followed by the exact replacement. Everything present is useful and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deprecated tool, the description provides the critical information an agent needs: stop using it and call inspect_source with the correct arguments. Combined with the full schema, safety annotations, and output schema, no important information is missing for correct decision-making.
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 covers the single 'source' parameter at 100%, so the baseline is 3. The description adds no additional meaning about the parameter's format or behavior, though it does show that 'source' carries over into the replacement call. This is adequate given the high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description does not explicitly state what extract_inputs does; it only says it is deprecated and removed. The tool name and the replacement call ('aspects=["inputs"]') imply it extracted inputs from a source, but the purpose is inferred rather than stated. This is not a tautology, but it is not a full verb+resource definition either.
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, actionable guidance: do not use this tool; instead call inspect_source(source, aspects=['inputs']). This clearly differentiates it from the sibling and tells the agent exactly when an alternative should be selected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_magic_collisionARead-onlyIdempotent
DEPRECATED (removed in 0.6.0): use inspect_source(root=..., aspects=["magic"]).
| Name | Required | Description | Default |
|---|---|---|---|
| root | Yes | Absolute path to the project folder to scan recursively. | |
| var_pattern | No | Substring identifying magic-number variables. | Magic |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already communicate read-only, idempotent, and non-destructive behavior. The description adds the important lifecycle fact that the tool is removed in 0.6.0, which is useful context beyond the annotations, but it does not describe what happens if the tool is still invoked or what its original return behavior was.
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 entire description is one sentence, front-loaded with 'DEPRECATED' and immediately followed by the exact replacement call. There is no wasted text or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deprecated tool, the most essential context is that it should not be used and what to use instead, both of which are present. The original tool's behavior is not described, but the output schema, annotations, and explicit redirect to inspect_source make the description sufficient for correct agent behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides no parameter details, but the input schema documents both 'root' and 'var_pattern' with 100% coverage. With the schema handling parameter semantics, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description does not directly state what find_magic_collision does, but the replacement call inspect_source(root=..., aspects=['magic']) and the tool name imply it was about magic-number collision detection. The purpose is discernible only indirectly, making it vague rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly says the tool is deprecated and removed, and gives the exact alternative invocation: inspect_source(root=..., aspects=['magic']). This is explicit do-not-use and use-this-instead guidance, which fully covers the when and why.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_symbolARead-onlyIdempotent
DEPRECATED (removed in 0.6.0): use inspect_source(root=..., symbol=...).
| Name | Required | Description | Default |
|---|---|---|---|
| exts | No | File extensions to search. | |
| root | Yes | Absolute path to the project folder to scan recursively. | |
| limit | No | Stop after this many matches. | |
| symbol | Yes | Identifier to search for. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds the critical behavioral fact that the tool is deprecated and removed in 0.6.0, which is beyond what annotations provide. It also hints that it is a search function via the replacement's parameters. No further behavioral context is needed for a deprecated 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 a single, front-loaded sentence that delivers the deprecation notice and the replacement route with no filler. Every character 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 tool is deprecated and has a clear replacement, the description is complete. An agent knows exactly what to do: avoid this tool and use inspect_source with the same parameters. No output schema explanation is necessary because the tool should not be invoked.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with clear descriptions for each parameter (e.g., 'Absolute path to the project folder', 'Identifier to search for'). The description adds no additional syntax or precedence guidance, but the baseline of 3 applies because the schema fully documents the 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 description clearly states that the tool is deprecated and removed in 0.6.0, and explicitly names the replacement (inspect_source). While it doesn't restate the original purpose of find_symbol itself, for an agent this is the essential information to correctly select and invoke the tool. It also differentiates from inspect_source by design.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit instructions on what to use instead: 'use inspect_source(root=..., symbol=...)'. This is a direct when-not-to-use and proper-alternative directive, leaving no ambiguity about how to handle this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
format_checkARead-onlyIdempotent
DEPRECATED (removed in 0.6.0): use format_mql(source) (dry run by default).
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | clang-format style string. | |
| source | Yes | Absolute Windows path to the .mq4/.mq5/.mqh source file. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose read-only, idempotent, and non-destructive behavior. The description adds critical behavioral context beyond those annotations: the tool is deprecated, removed in 0.6.0, and superseded by a tool that dry-runs by default. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence front-loads the deprecation status and immediately provides an actionable replacement. Every word earns its place and the format is highly scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deprecated tool, the description is complete: it states deprecation, removal version, replacement, and replacement behavior. Combined with the annotations and documented parameters, an agent has everything needed to avoid misuse.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already documented in the schema. The description adds no extra meaning about source or style, but none is required given the high schema coverage and the fact that the tool is deprecated.
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 never states what format_check actually does; it only announces deprecation and points to format_mql. The intended purpose must be inferred from the tool name, which is not sufficient for a clear definition.
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 not to use this tool, names the exact replacement (format_mql), gives the invocation pattern (format_mql(source)), and notes the default dry-run behavior. This is ideal routing guidance for a deprecated tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
format_mqlADestructive
Format an MQL file with clang-format (MQL literals such as D'…' and input group lines are protected).
Default is a dry run reporting whether the file would change; pass write=true to apply.
Replaces format_check.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | clang-format style string; defaults to an MQL-friendly LLVM-based profile. | |
| write | No | false = report/diff only (default); true = overwrite the file in its original encoding. | |
| source | Yes | Absolute Windows path to the .mq4/.mq5/.mqh source file. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though destructiveHint=true is already set, the description adds genuinely new behavioral context: the operation is a dry run by default, only becomes destructive when write=true, and protects MQL-specific constructs. This directly clarifies the destructive annotation rather than merely restating it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences deliver purpose, protection behavior, invocation mode, and legacy status without redundancy. The critical dry-run/write behavior is placed immediately after the purpose line, and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% parameter coverage, the description covers everything needed to call the tool correctly: what it formats, what it protects, how the destructive flag works, and what it replaces. No critical caller-facing detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a baseline of 3 applies; the description does add meaning by explaining that write=true applies changes and clarifying the default dry-run behavior. But it conflicts with the schema's write default of true and with the parameter description's claim that false is the default, which introduces ambiguity for an agent parsing both sources.
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 plus resource: 'Format an MQL file with clang-format' and adds the key distinguishing detail that MQL literals and `input group` lines are protected. It also states it replaces format_check, giving agents an explicit lineage and differentiating it from that sibling.
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 dry-run default and `write=true` switch are explicit instructions for how to invoke the tool safely, and 'Replaces format_check' gives a clear alternative/context signal. However, it does not spell out when to choose this over nearby lint/compile/syntax siblings or list exclusions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gen_tester_inputsADestructive
Generate a [TesterInputs] block from EA inputs.
If write_to points at a tester.ini, the block is appended/replaced in-place.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Absolute Windows path to the .mq4/.mq5/.mqh source file. | |
| write_to | No | Optional tester.ini path; when given the [TesterInputs] block is written into it. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive behavior, and the description adds useful context by specifying that the block is 'appended/replaced in-place' when write_to points at a tester.ini. This clarifies exactly what gets modified without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two crisp sentences lead with the core purpose and immediately follow with the important side effect. There is no filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and annotations, the description provides the main invocation flow and side-effect warning. The only notable gap is that it does not explicitly say what happens when write_to is omitted, and the 'appended/replaced' wording could be more precise about overwrite semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline applies. The description adds some semantic color—'from EA inputs' and the in-place write behavior—but most parameter meaning is already captured by the 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 states a specific action and resource: generating a `[TesterInputs]` block from EA inputs, and it clarifies the optional file-writing behavior. It distinguishes itself from closely named siblings like extract_inputs and patch_tester_ini through the explicit block target, though it does not name a sibling directly.
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: use it to generate a `[TesterInputs]` block, optionally writing it to a tester.ini. However, there is no explicit guidance about when to prefer this tool over alternatives such as extract_inputs or patch_tester_ini, so an agent must infer selection from the name and context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_backtestARead-onlyIdempotent
Status of a background backtest (running / completed / timeout / cancelled) with report path and journal notes when done; without run_id, lists all runs newest first.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | No | Identifier returned by start_backtest / run_backtest; omit to list every run of this server process. | |
| tail_lines | No | While running, include this many trailing lines of the tester journal. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose readOnly, idempotent, and non-destructive behavior. The description adds value beyond those annotations by specifying the returned statuses, the inclusion of report path and journal notes once complete, and the newest-first ordering. No contradiction with annotations is present.
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 entire description is a single compact sentence that front-loads the core purpose, packs the status values and result contents, and appends the run_id-less variant without filler. Every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only query with fully documented parameters, annotations, and an output schema, the description is nearly complete. The main gap is that its 'without run_id, lists all runs' mode overlaps with the sibling list_backtests, and the description does not disambiguate when to use which tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for both parameters, so the baseline is 3. The description adds the 'newest first' ordering detail for the run_id-less case, but otherwise does not add meaning beyond the schema. tail_lines is not mentioned in the description, though the schema documents it adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource ('background backtest') and the action (return status), and names the possible statuses: running, completed, timeout, cancelled. It also documents the list-all behavior when run_id is omitted, but it does not explicitly distinguish itself from the closely related sibling list_backtests.
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 a clear usage rule: omit run_id to list all runs newest first, which guides the agent for the optional-parameter case. It does not explicitly say when to prefer list_backtests or read_tester_report, but for the core status-checking scenario the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_sourceARead-onlyIdempotent
Read-only facts about MQL source: input declarations, #include tree (with missing files), MetaEditor doc blocks, symbol usages, duplicate magic numbers.
Replaces extract_inputs / resolve_includes / extract_doc / find_symbol / find_magic_collision.
| Name | Required | Description | Default |
|---|---|---|---|
| root | No | Absolute project folder to scan (for symbol, magic); defaults to the source file folder. | |
| limit | No | Max symbol matches to return. | |
| source | No | Absolute path to one .mq4/.mq5/.mqh file (for inputs, includes, docs). | |
| symbol | No | Identifier to grep for (whole word, comments and strings skipped); enables the "symbol" aspect. | |
| aspects | No | Which analyses to run; defaults to inputs, includes and docs for a source, plus symbol when `symbol` is given and magic when only `root` is given. | |
| mql_root | No | MQL root used to resolve <angle> includes; defaults to the active terminal. | |
| var_pattern | No | Substring identifying magic-number variables for the "magic" aspect. | Magic |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior; the description reinforces this and adds useful behavioral detail such as '#include tree (with missing files)' and 'duplicate magic numbers', explaining what kind of facts are produced. It does not deeply describe edge-case behavior, but the output schema and annotations cover the rest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two efficient sentences with no filler. The primary capability is front-loaded, and the sibling replacement list is packed into a single closing line.
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 that the schema has 100% parameter coverage Appendix and an output schema exists, the description only needs to orient the agent on what the tool is for and how it relates to alternatives. It does this completely, while the read-only annotations cover the safety model.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all parameters have useful descriptions, so the baseline is 3. The description adds semantic nuance to the 'aspects' parameter by clarifying that includes means '#include tree (with missing files)', docs means 'MetaEditor doc blocks', and magic means 'duplicate magic numbers', which the schema's bare enum names do not fully convey.
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 scope ('Read-only facts about MQL source') and enumerates five concrete capabilities: input declarations, #include tree with missing files, MetaEditor doc blocks, symbol usages, and duplicate magic numbers. It also explicitly names the sibling tools it replaces, so an agent can distinguish it from extract_inputs, resolve_includes, extract_doc, find_symbol, and find_magic_collision.
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 'Replaces extract_inputs / resolve_includes / extract_doc / find_symbol / find_magic_collision' line is an explicit routing instruction: use this tool instead of those five siblings for those analysis needs. The 'Read-only' qualifier also marks the boundary against mutation tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
install_includeADestructive
DEPRECATED (removed in 0.6.0): use deploy(file, name) with a .mqh file.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Absolute Windows path to the .mq4/.mq5/.mqh source file. | |
| target_name | No | File name to use inside Include/. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey destructiveHint=true, so the safety profile is structured data. The description adds the important behavioral fact that the tool is deprecated/removed, but it does not disclose underlying side effects or failure behavior beyond that. This is adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the critical DEPRECATED/removed status and immediately names the replacement. There is no wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deprecated/removed tool, the description tells the agent everything needed for the decision: avoid this tool and use deploy. It does not explain the original behavior, but that is secondary given the tool is removed and an alternative is named.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so source and target_name are already fully documented. The description adds no parameter-level meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description does not state what install_include does; it only says it is deprecated, removed in 0.6.0, and suggests using deploy(file, name) with a .mqh file. The actual verb+resource behavior is left to inference from the tool name and schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs the agent to use an alternative: 'use deploy(file, name) with a .mqh file.' This is clear, unambiguous routing to the correct sibling tool and makes the deprecation actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kill_terminalADestructive
Force-kill terminal processes launched by this server (run_backtest / smoke_test).
By default only PIDs this server started are killed, so a live-trading terminal on the
same machine is never touched. Pass all_instances=True to taskkill every
terminal64.exe/terminal.exe of the configured edition (destructive).
| Name | Required | Description | Default |
|---|---|---|---|
| all_instances | No | false = only terminals launched by this server; true = taskkill every terminal of this edition (may hit a live-trading terminal). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the destructive nature is known. The description adds meaningful behavioral context: the default scoping to server-started PIDs, the specific file names (terminal64.exe/terminal.exe), and the warning about live-trading terminals. This goes beyond the annotation's binary flag and helps the agent understand the exact blast radius.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loading the default behavior and then the destructive alternative. Every clause carries meaning: it explains the default scope, the safety guarantee, and the explicit destructive flag. No 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 tool with a single optional parameter and a clear output schema, the description fully covers the behavior, the parameter semantics, and the safety profile. It tells the agent exactly when to use the default and when to escalate, and it addresses the risk of collateral damage. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all_instances with a 100% description coverage, giving the baseline of 3. The description adds a small but useful detail: it specifies 'terminal64.exe/terminal.exe' for the all_instances case, which clarifies the exact processes affected. This is a slight enhancement over the schema's wording, justifying a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Force-kill') and a clear resource ('terminal processes launched by this server'), and explicitly ties it to run_backtest / smoke_test. It also distinguishes this tool from the sibling select_terminal and list_terminals by stating what it does not touch (live-trading terminals).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use context: by default it only kills server-launched PIDs, and it warns that passing all_instances=True is destructive and may affect a live-trading terminal. It effectively says when not to use the destructive option and clarifies the safe default, leaving no ambiguity about which invocation to choose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lint_basicARead-onlyIdempotent
DEPRECATED (removed in 0.6.0): use analyze_mql(source, checks=["lint"]).
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Absolute Windows path to the .mq4/.mq5/.mqh source file. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already show readOnly/idempotent/non-destructive behavior. The description adds critical deprecation status and the exact replacement call, providing more context than the annotations alone. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence front-loaded with DEPRECATED, immediately followed by the replacement. Every word earns its place with zero waste.
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 deprecated tool, the guidance is complete: the agent is told not to use it and exactly what to call instead. Slightly less than 5 because the description does not define the original behavior, but given the deprecation this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the only parameter, source, is fully described as an absolute Windows path. The description adds no parameter detail, but none is needed because the schema is sufficient. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is primarily a deprecation notice rather than a definition. It never directly states that the tool lints a source file, though the name and the call to analyze_mql(source, checks=["lint"]) make the purpose inferable. This is clear for a deprecated tool, but it doesn't explicitly say what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use analyze_mql(source, checks=['lint']) instead, making the correct alternative and invocation unambiguous. It also notes the timeline (removed in 0.6.0), so an agent knows not to rely on this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_backtestsARead-onlyIdempotent
DEPRECATED (removed in 0.6.0): use get_backtest() without run_id.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, and non-destructive behavior. The description adds the critical lifecycle fact that the tool was removed in 0.6.0, which goes beyond what annotations state. It does not spell out the exact failure mode, but 'removed' strongly implies the tool should not be called.
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 one short sentence that front-loads the most important signal, 'DEPRECATED', and then gives the replacement action. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deprecated tool with no parameters and an output schema provided, the description contains all an agent needs to make the correct decision: do not call this, call get_backtest() instead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters and schema coverage is 100%, so the schema already fully documents the input surface. The description correctly focuses on deprecation instead of repeating parameter information.
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 does not explain the original list_backtests behavior, but it clearly communicates that the tool is deprecated and points to get_backtest() as the replacement. This is enough for an agent to recognize that it should not be invoked and to choose the correct sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent not to use this tool and names the exact alternative and invocation style: 'use get_backtest() without run_id.' This is unambiguous routing guidance for a deprecated tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_expertsARead-onlyIdempotent
List compiled EAs in Experts/ (defaults to *.ex5 for MT5, *.ex4 for MT4).
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | No | Glob pattern; defaults to *.ex5 on MT5 and *.ex4 on MT4. | |
| recurse | No | Include subfolders of Experts/. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by naming the directory and the platform-dependent default glob, but it does not go beyond that. With annotations doing most of the safety disclosure, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, well-structured sentence that leads with the core action and resource, then adds the platform-specific detail. There is no filler, and every part of the sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity read-only listing tool, the description plus the fully documented schema and the provided output schema are sufficient. The directory, defaults, and parameters are all covered, so nothing critical is missing for an agent to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the input schema already documents both 'pattern' and 'recurse' clearly, including the default glob behavior. The description repeats the platform-specific default rather than adding new parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List'), names the exact resource ('compiled EAs in Experts/'), and clarifies the platform-specific default patterns (*.ex5 for MT5, *.ex4 for MT4). This clearly distinguishes it from sibling list tools like list_snapshots, list_terminals, and list_backtests.
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 establishes a clear context: it is for listing compiled EAs in the Experts/ directory, with platform-aware defaults. It does not explicitly name alternatives or state when not to use it, but the scoping is strong enough that an agent can infer the right use case without confusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_snapshotsARead-onlyIdempotent
List all snapshot folders under dest.
| Name | Required | Description | Default |
|---|---|---|---|
| dest | Yes | Absolute path to the folder that holds snapshots. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety and side-effect profile. The description adds no extra behavioral context (e.g., return format, pagination, permissions), but does not contradict annotations. With annotations present, this is an adequate baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with zero filler. It states exactly what the tool does and the required location parameter. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, one-parameter read-only listing operation with annotations covering safety and an output schema present, the description is fully sufficient. No additional information is needed for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the parameter 'dest' is described as 'Absolute path to the folder that holds snapshots.' The tool description merely references dest without adding additional meaning, so it does not enhance beyond the schema. Baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'List all snapshot folders under dest' clearly states a specific action (list) and resource (snapshot folders) with a location constraint. It is unambiguous and distinguishes itself from the sibling snapshot_sources (which likely creates snapshots) by its focus on 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?
The description implies when to use it (when you need to enumerate existing snapshot folders), but does not explicitly mention alternatives or exclusions. The context is clear and the action is self-evident, so it meets the 'clear context, no exclusions' threshold.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_terminalsARead-onlyIdempotent
Enumerate all MetaTrader terminal data folders under %APPDATA%\MetaQuotes\Terminal.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false) and adds no contradictory behavior. It does not go beyond the annotations by describing output shape, environment requirements, or potential quirks, but for a simple enumeration tool the annotation coverage lessens the burden on the 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 a single, front-loaded sentence with no filler. It communicates the operation, the resource, and the exact location in as few words as possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters and an output schema present, the description covers everything needed to invoke the tool correctly. It states the exact directory and the operation performed, leaving no 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?
The tool has zero parameters, so the description cannot add parameter-level meaning. Per the baseline for 0-parameter tools, a score of 4 is appropriate; no further parameter explanation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Enumerate') and a specific resource ('MetaTrader terminal data folders under %APPDATA%\MetaQuotes\Terminal'). It clearly distinguishes this from sibling tools like list_snapshots or list_backtests without needing to inspect schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the tool's use-case obvious: call it when you need to list all terminal data folders. However, it does not explicitly mention alternatives or exclusion criteria, such as when to prefer select_terminal or list_snapshots. Usage guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_optimizationDRead-onlyIdempotent
DEPRECATED (removed in 0.6.0): use read_optimization(...).
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Absolute path to a .opt cache. | |
| expert | No | Expert name to select the cache. | |
| period | No | Timeframe to select the cache. | |
| sample | No | Passes to include in passes_sample. | |
| symbol | No | Symbol to select the cache. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false) already declare the tool as a safe, non-destructive read. The description adds only the deprecation status heavily implying it is non-functional. It does not disclose any behavioral traits beyond 'removed', which is critical but still leaves ambiguity about what happens when called (likely error). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, extremely concise, but it is under-specified. It front-loads the deprecation warning and the alternative, which is useful, but it omission of any purpose or usage details makes it inadequate despite brevity.
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 that the tool is deprecated and removed, the description should clearly state that it is non-functional and must not be used, and point to the alternative. It does that, but it lacks any information about what the tool actually did (parse optimization data) which is necessary for an agent to understand the alternative's relevance. The output schema exists but the description doesn't need to explain return values; still, the overall context for a deprecated tool is insufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema documents all five parameters. The description provides no additional semantic meaning for parameters; it only names an alternative function. The parameter descriptions in schema are sufficient but generic (e.g., 'path', 'expert'), and the description does not compensate for any nuance, leaving a gap for a deprecated 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 is 'DEPRECATED (removed in 0.6.0): use read_optimization(...).' It does not state what the tool does, only that it is deprecated and points to an alternative. The name 'parse_optimization' suggests parsing optimization data, but the description is a tautology of the deprecation status, not the purpose.
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 to use read_optimization instead, which is a clear when-not-to-use directive. However, it provides no guidance on when the tool itself might be used (which is never, since it's removed), and no context about the alternative's usage. Thus, it is misleading for actual invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_tester_iniADestructive
Set keys in a tester.ini in place, keeping the file's encoding and other lines.
updates maps "Section.Key" to a value, e.g. {"Tester.Symbol": "EURUSD",
"Tester.FromDate": "2025.01.01", "TesterInputs.RiskPct": "1.5"}. Missing sections/keys are
added. Run validate_tester_ini afterwards; always set Deposit, Currency, Leverage, Model,
Optimization, Visual, UseLocal/UseRemote/UseCloud and Report explicitly so a run does not
inherit the machine's last UI state.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | Absolute path to the tester.ini file. | |
| updates | Yes | Mapping of "Section.Key" to new value, e.g. {"Tester.Symbol": "EURUSD"}. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond destructiveHint=true, the description discloses that it preserves the file's encoding and other lines, adds missing sections/keys, and modifies in place. This tells the agent what side effects to expect and what is preserved, which is exactly the contextual value annotations don't carry.
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 first sentence is a clear, informative one-liner; the second block gives concrete examples and critical usage caveats with no filler. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating config tool, the description covers what is preserved, how updates are applied, required follow-up validation, and mandatory keys to avoid stale UI state. Combined with the output schema and annotations, nothing essential is missing 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?
Both params are already described in schema (100% coverage), and the description adds behavior for the updates object: missing sections/keys are added, with a concrete mapping example. It reinforces the dotted Section.Key format and lists critical keys that should be set, going beyond schema basics.
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 action and target ('Set keys in a tester.ini in place'), with 'in place' clarifying mutation scope. It is clearly distinct from sibling tools like validate_tester_ini, which checks the file, and run_backtest, which consumes it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives practical invocation guidance: run validate_tester_ini afterwards and always set a named list of keys so a run does not inherit UI state. It doesn't express when-not-to-use or name an alternative, but the guidance is explicit enough for correct use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_optimizationARead-onlyIdempotent
Read an MT5 optimisation cache (.opt): header, optimised inputs, pass count and the top N passes by criterion.
Ranking uses every pass in the cache. The best pass of a genetic run is a biased sample; prefer robust neighbourhoods over the single top row. Replaces parse_optimization / top_passes.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Absolute path to a Tester/cache/*.opt file; defaults to the newest cache matching expert/symbol/period. | |
| top_n | No | How many best passes to return. | |
| expert | No | Expert name (file stem) used to select the matching cache file. | |
| period | No | Timeframe code such as M15, H1, D1. | |
| symbol | No | Symbol name as shown in Market Watch, e.g. EURUSD. | |
| criterion | No | Pass field to rank by: profit, profit_factor, expected_payoff, recovery_factor, sharpe_ratio, maxdrawdown, trades, custom_fitness. | profit |
| descending | No | true = highest first; use false for drawdown-style metrics. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows it's safe. The description adds that all passes are used for ranking ('Ranking uses every pass'), which is useful context beyond the annotations, clarifying the internal 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 two sentences long and front-loads the core purpose before the caveat. Every sentence earns its place: the first states what it reads and returns, the second adds behavioral guidance and names siblings. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists)Skip, the description need not explain return values. It covers key aspects: what the tool does, its scope, how to select it over siblings, and a critical usage caveat. With 7 parameters but 0 required compartments, the simple and complete description is sufficient for an agent 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 description coverage is 100%, so the baseline is 3. The description does not add parameter-specific semantics beyond what is in the schema, but it does hint at the purpose of parameter selection via 'top N passes by criterion', aligning with top_n and criterion. No additional info is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (read) and resource (MT5 optimisation cache .opt), and lists the key outputs (header, optimised inputs, pass count, top N passes). It also names two sibling tools (parse_optimization, top_passes) that it replaces, clearly distinguishing its scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says it replaces parse_optimization and top_passes, signaling when to choose this tool over those alternatives. It also provides a usage caveat: 'The best pass of a genetic run is a biased sample; prefer robust neighbourhoods' – guiding the agent on how to interpret results and when to be cautious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_tester_reportARead-onlyIdempotent
Parse a Strategy Tester HTML report (MT5 or MT4) into summary metrics; the full HTML stays behind report_uri.
Prefer passing the report_path returned by run_backtest/get_backtest; without path
the newest report on disk is used, which may belong to an older run. summary values are
the strings printed in the report ("10 000.00", "359.61 (3.34%)"); use compare_reports /
regression_check for numeric comparison. Read the mt5://report/{id} resource only when
you need the original HTML.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Absolute path to a report .htm; defaults to the newest report found on disk. | |
| max_trades | No | Max trade rows to return in `trades` when response_format="detailed". | |
| raw_truncate | No | Characters of raw HTML to inline (0 = none; read report_uri instead). | |
| response_format | No | "concise" = summary metrics + counts + report_uri; "detailed" adds the parsed trade rows. | concise |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description adds valuable behavior beyond them: the risky default of using the newest report without `path`, the fact that `summary` values are raw strings rather than numbers, and the distinction between this tool and reading the `mt5://report/{id}` resource directly.
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 tightly packed sentences convey purpose, usage guidance, and caveats with zero fluff. The core function is front-loaded, followed by actionable alternatives and a warning about output types.
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 sufficiently covers purpose, path selection, output semantics, and alternative tools. Combined with the input schema (100% parameter coverage) and an output schema, an agent has everything needed to select and invoke 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 100% for all four parameters, so the baseline is 3. The description adds useful context for `path` (prefer backtest-returned path; fallback can be stale) and for `raw_truncate` (read `report_uri` instead for full HTML), which elevates it above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Parse a Strategy Tester HTML report (MT5 or MT4) into `summary` metrics'. It also states what it does not do (the full HTML stays behind `report_uri`), which distinguishes it from sibling tools like `read_optimization` or `compare_reports`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is given on when to use this tool: 'Prefer passing the `report_path` returned by `run_backtest`/`get_backtest`'. It also names alternatives for related tasks ('use `compare_reports` / `regression_check` for numeric comparison') and warns against the default fallback behavior ('newest report on disk... may belong to an older run').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
regression_checkARead-onlyIdempotent
DEPRECATED (removed in 0.6.0): use compare_reports(baseline, candidate, guards=...).
| Name | Required | Description | Default |
|---|---|---|---|
| guards | No | Percent thresholds per summary key. | |
| baseline | Yes | Absolute path to the baseline report. | |
| candidate | Yes | Absolute path to the candidate report. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It states the tool is deprecated and removed, a critical behavioral fact not captured by the annotations (readOnlyHint, idempotentHint). This goes beyond structured metadata and tells the agent the tool is non-operational, preventing any attempt to invoke it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is a single, front-loaded sentence with 'DEPRECATED' at the very start, immediately signaling the key message. Every word is essential, and the instruction to use the replacement is clear and succinct.
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 deprecated tool, this is complete. It tells the agent whether to use it (no) and exactly what to use instead, including the call signature. No additional information about return values or behavior is needed because the tool is non-functional.
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 covers 100% of parameter descriptions, so the baseline for this dimension is 3. The description adds no further semantics about the tool's own parameters; it only references parameters in the alternative tool. This is acceptable for a deprecated tool, but no extra value is provided.
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 is DEPRECATED and removed in 0.6.0, which tells an agent it should not be used. It also points to the specific replacement tool, compare_reports, distinguishing it from siblings. While it does not explain the original function, that is unnecessary given the deprecation 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 directly instructs the agent to use compare_reports(baseline, candidate, guards=...), providing the exact alternative and required parameters. This is an explicit, unambiguous usage directive with no room for misinterpretation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_symbolADestructive
Rename a symbol across MQL files (whole-word match). dry_run=True previews only.
| Name | Required | Description | Default |
|---|---|---|---|
| new | Yes | New identifier. | |
| old | Yes | Identifier to rename (whole-word match). | |
| root | Yes | Absolute path to the project folder to scan recursively for MQL files. | |
| dry_run | No | true = preview the change and write nothing; false = apply it to the files. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
For a tool already marked destructiveHint=true, the description adds a valuable safety detail: dry_run=True previews only. It also clarifies the scope of edits via 'across MQL files' and 'whole-word match'. It does not detail irreversibility, but the annotation already signals destructive behavior and nothing here contradicts it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core action and the key safety caveat front-loaded. No filler, and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, an output schema, and destructive annotations, the description is largely sufficient for a correct call. It could still state explicitly that dry_run=false persists changes to disk, though that is fully documented under the dry_run parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description mostly restates the whole-word constraint and dry_run preview behavior already present in the parameter descriptions. It adds little semantic value beyond what the schema 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 names a specific verb ('Rename'), a specific resource ('a symbol across MQL files'), and a matching constraint ('whole-word match'). This clearly distinguishes it from sibling discovery or formatting tools like find_symbol or format_mql.
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 'Rename a symbol across MQL files', and the dry_run note suggests a safe preview workflow. However, it gives no explicit when-to-use versus alternatives, no prerequisites, and no exclusions or conditions for when the destructive path should be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_includesCRead-onlyIdempotent
DEPRECATED (removed in 0.6.0): use inspect_source(source, aspects=["includes"]).
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Absolute Windows path to the .mq4/.mq5/.mqh source file. | |
| mql_root | No | MQL root for <angle> includes. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already provide readOnlyHint=true entertaining, idempotentHint=true, and destructiveHint=false, which are consistent with the description's deprecation status. The description adds that the tool is deprecated and removed in 0.6.0, which is critical behavioral context beyond the annotations. There is no contradiction, and the deprecation disclosure is 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?
The description is a single sentence with zero waste. It immediately front-loads the DEPRECATED flag and the replacement instruction, making it highly efficient for an agent scanning options. Perfect minimalism for a deprecation notice.
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 deprecated tool, the description is complete in guiding an agent away from it, and the output schema exists for return type context. However, it doesn't explain what the tool originally returned or its historical behavior, which could be relevant if an agent encounters old references. Given the strong deprecation guidance, a 3 is fair.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 100%, the schema already documents both parameters (source and mql_root). The description adds no new meaning about these parameters, but the baseline for high coverage is 3. The description's deprecation notice implies the parameters are irrelevant, but that doesn't enhance semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is a deprecation notice rather than a statement of what the tool does. It says it is deprecated and directs users to use inspect_source instead, but does not mention what resolve_includes actually does (e.g., resolving include dependencies in MQL source files). The verb is missing; the purpose is only implicit.
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 users not to use this tool and to use inspect_source with aspects=['includes'] instead, which is a strong usage exclusion. However, it does not explain when this tool was used or under what conditions an agent might still encounter it, such as backward compatibility or migration contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_backtestA
Run a Strategy Tester backtest headlessly from a tester.ini and wait for it to finish.
Requires the EA to be deployed first (compile_and_deploy / deploy_ea) and
ShutdownTerminal=1 in the ini, otherwise the call runs until timeout_sec.
Typically 1-30 minutes; progress notifications are sent every few seconds while waiting.
If the tester reports "cannot synchronize history" (first headless start after login), the run
is retried once automatically. For long runs prefer start_backtest + get_backtest. Returns run_id, report_path
(resolved from Report= in the ini), latest_tester_log and journal_notes/warnings;
if warnings mentions start_time_changed the tester moved FromDate because history was
missing, so the report is not comparable with other runs.
| Name | Required | Description | Default |
|---|---|---|---|
| wait | No | true = block until the terminal exits (needs ShutdownTerminal=1); false = launch and return a run_id for get_backtest. | |
| config | Yes | Absolute path to the tester.ini file. | |
| portable | No | Pass /portable so the terminal uses its install folder as data folder. | |
| timeout_sec | No | Give up (and kill the terminal) after this many seconds. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide no behavioral hints (all false), so the description carries the full burden. It discloses expected duration (1-30 minutes), progress notifications, automatic retry on history sync error, output fields, and the `start_time_changed` warning. This goes well beyond minimal requirements and gives the agent a realistic model of 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?
Every sentence earns its place: purpose, prerequisites, timing, retry logic, alternative, and return value caveats. Instructions are front-loaded and the structure is logical, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with prerequisites, retries, and specific return semantics, the description is thorough. It covers deployment requirements, blocking behavior, timeout, return fields, and the warning about report comparability. The output schema exists, so return details need not be repeated. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so parameters are already well-documented. The description adds value by clarifying the interaction between `wait` and `ShutdownTerminal=1`, the timeout fallback, and the resolution of `report_path` from the ini. This exceeds the baseline of 3 for fully covered schemas, but is not essential enough to reach 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource: 'Run a Strategy Tester backtest headlessly from a tester.ini and wait for it to finish.' It clearly distinguishes itself from siblings like `start_backtest` and `get_backtest` by emphasizing the blocking behavior and explicitly naming the alternative for long runs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states prerequisites (EA must be deployed, `ShutdownTerminal=1` required) and gives a conditional behavior (otherwise runs until `timeout_sec`). It also provides an alternative: 'For long runs prefer `start_backtest` + `get_backtest`', which is a clear when-not-to-use instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_terminalA
Switch the active terminal data folder for this session.
Provide one of: origin (install path stored in origin.txt), hash (32-char
folder name), or install (auto-scan for the matching origin).
Subsequent tool calls will use the new layout until the server restarts.
| Name | Required | Description | Default |
|---|---|---|---|
| hash | No | 32-character terminal data folder name under %APPDATA%\\MetaQuotes\\Terminal. | |
| origin | No | Install path stored in the terminal's origin.txt, e.g. C:\\Program Files\\MetaTrader 5. | |
| edition | No | "mt5" or "mt4". | mt5 |
| install | No | Install folder containing terminal64.exe; its data folder is found by scanning origin.txt files. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the lasting side effect ('Subsequent tool calls will use the new layout until the server restarts'), which is valuable because annotations only report false hints. It does not over-promise persistence or claim destructive 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 short, front-loaded with the core action, and every sentence contributes either a mode definition or a behavioral consequence. There is no redundant phrasing 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 session-switching tool, the description covers the selection modes and the session-scoped lifecycle. It leaves minor ambiguity about what happens if no mode or multiple modes are supplied, but the schema and output schema cover the remaining details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter. The description adds the useful notion that these are mutually exclusive selection modes, but it does not mention the edition parameter and adds only modest semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific action ('Switch'), resource ('active terminal data folder'), and scope ('for this session'). This clearly differentiates it from sibling tools like list_terminals or kill_terminal, and the name does not need to be restated.
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 instructs the agent to provide one of origin, hash, or install and explains what each option means. It gives clear selection context for the parameter modes, though it does not explicitly compare this tool to sibling alternatives such as list_terminals for discovering folder hashes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smoke_testADestructive
One-call health check for an EA: compile, deploy, run a 1-day headless backtest, scan the journal.
Catches problems that compile cleanly but fail at runtime (OnInit errors, array out of range,
divide by zero). ok is true only if every stage passes; stage tells where it stopped.
Overwrites the EA of the same name in Experts/. Takes 1-10 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Length of the backtest window in days (ends 2 days ago). | |
| period | No | Timeframe code such as M15, H1, D1. | M15 |
| source | Yes | Absolute Windows path to the .mq4/.mq5/.mqh source file. | |
| symbol | No | Symbol name as shown in Market Watch, e.g. EURUSD. | EURUSD |
| expert_name | No | Name to use in Expert= of the generated ini; defaults to the binary's stem. | |
| timeout_sec | No | Give up after this many seconds. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavioral traits beyond the annotations: it overwrites an existing EA of the same name in Experts/, takes 1-10 minutes, and reports both `ok` and `stage` so the caller knows where execution stopped. This complements the destructiveHint=true annotation with concrete details and does not contradict it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences carry substantial value: the first captures the core action and stages, the second explains the failure modes it detects and the result semantics, and the third discloses side effects and duration. There is no filler or repetition of schema fields.
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 rich input schema, an output schema, and annotations that mark the tool destructive, the description adds the missing context: the overwrite side effect, expected runtime, and the stage/ok behavior. Nothing an agent needs to invoke or interpret this tool correctly is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter already carries a meaningful description. The tool description adds only high-level context like '1-day headless backtest,' which aligns with the `days` default but does not materially extend per-parameter semantics. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('One-call health check for an EA') and enumerates the four stages it performs: compile, deploy, run a 1-day headless backtest, and scan the journal. This clearly distinguishes it from sibling tools like compile or run_backtest, which perform only individual stages.
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: it catches problems that compile cleanly but fail at runtime, such as OnInit errors, array out of range, and divide by zero. It does not explicitly name alternatives or state when not to use it, but the 'one-call' framing implies it replaces the multi-step sequence without needing further exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snapshot_sourcesAIdempotent
Freeze a copy of source files into a timestamped folder under dest.
| Name | Required | Description | Default |
|---|---|---|---|
| dest | Yes | Absolute path to the folder that holds snapshots. | |
| label | No | Folder name for this snapshot; defaults to a timestamp. | |
| sources | Yes | Absolute paths of the source files to freeze. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, and the description does not contradict them. It adds the detail that the copy is placed in a timestamped folder under dest, which is useful context. However, it does not elaborate on what happens to the original files, whether the dest directory needs to exist, or any side effects beyond the copy.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler words. It front-loads the core action ('freeze a copy of source files') and specifies the destination location concisely. Every word contributes 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?
The tool is relatively simple, and the description covers the essential action. An output schema exists, so return values are presumably documented there. The description is sufficient for an agent to understand the tool's purpose, though it leaves minor questions like dest directory existence or label behavior to the schema, which is already thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, with all three parameters (sources, dest, label) having descriptive texts. The description adds no extra parameter semantics beyond the schema, so a baseline score of 3 is appropriate given high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Freeze a copy of source files') and explicit resources, making it clear the tool creates a snapshot under a destination folder. It does not name an alternative sibling, but the verb 'snapshot' and the resource 'source files' clearly distinguish it from siblings like list_snapshots or compile, so purpose is clear.
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 you want to freeze a copy of source files into a timestamped folder. However, it does not explicitly state when NOT to use this tool or mention alternative tools like list_snapshots or compile. The context is implied but not made explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_backtestA
Launch a backtest in the background and return immediately with a run_id.
Poll get_backtest(run_id) until status is no longer "running"; the final record carries
report_path and journal_notes. Runs are also written to .mt5tmp/runs/<run_id>.json
next to the ini. Only one terminal per install can test at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | Absolute path to the tester.ini file. | |
| portable | No | Pass /portable so the terminal uses its install folder as data folder. | |
| timeout_sec | No | Kill the terminal if it has not exited after this many seconds. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all negative flags, so the description carries the behavioral burden. It usefully discloses asynchronous execution, immediate return with a run_id, persistence to .mt5tmp/runs/<run_id>.json, and the concurrency constraint. It does not detail terminal cleanup or lifecycle beyond what the timeout_sec parameter already conveys, but the key behavior is 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?
Three sentences with no wasted words. The first sentence front-loads the core purpose, and the following sentences each add essential operational detail: polling, result fields, persistence, and concurrency. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a background-launch tool with 100% schema coverage and an output schema, the description is complete. It tells the agent what happens immediately, how to retrieve the result, where artifacts land, and the concurrency limitation that can affect 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 100%, and the description adds no parameter-specific meaning beyond the schema. The baseline of 3 applies because the schema already documents config, portable, and timeout_sec adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Launch a backtest in the background and return immediately with a run_id.' This distinguishes it from synchronous alternatives like run_backtest and clarifies what the tool produces. The follow-up reference to get_backtest further reinforces its role in the workflow.
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 guidance: poll get_backtest until status changes, read the final report_path and journal_notes, and be aware that only one terminal per install can test at a time. It does not explicitly contrast with sibling tools such as run_backtest, but the background-async context makes the intended use evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
syntax_checkA
DEPRECATED (removed in 0.6.0): use compile(source, syntax_only=true).
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Absolute Windows path to the .mq4/.mq5/.mqh source file. | |
| timeout_sec | No | Give up after this many seconds. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false, so the description carries the burden. It discloses the deprecation and removal version, which is critical behavioral context, but does not state what happens if called (e.g., error, no-op). A warning about deprecation is transparent, but incomplete regarding actual runtime 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?
One dense sentence that front-loads the deprecation and provides the exact alternative. Zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deprecated tool, the most important context is the replacement, which is clearly provided. The output schema exists, so return values are not the focus; the description fully informs an agent of its status and the correct action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description adds nothing about parameters, which is acceptable given the high schema coverage; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The name and description together make it clear this checks syntax, and the description explicitly states it is deprecated and directs to compile(source, syntax_only=true) as a replacement. It distinguishes from siblings by naming the substitute, though it doesn't explicitly restate the verb+resource.
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: never use this tool, and exactly what to use instead (compile with syntax_only=true). This is the clearest possible direction for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tail_logARead-onlyIdempotent
Tail a MetaTrader log: the EA's LiveLog.txt, the daily Experts journal, or the latest tester journal.
Use mode="tester" right after a backtest to see runtime errors and the effective test period.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Journal date as YYYYMMDD; defaults to today. | |
| mode | No | "live" = MQL5/Files/LiveLog.txt written by the EA, "journal" = MQL5/Logs/YYYYMMDD.log (Experts tab), "terminal" = logs/YYYYMMDD.log (Journal tab: connection, tester start), "tester" = newest Tester/logs file. | live |
| lines | No | Number of lines from the end of the file. | |
| structured | No | Parse journal lines into {ts, source, message} records (journal/tester modes). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive, lowering the burden on the description. The description adds valuable behavioral context by identifying the exact log paths/sources and noting that tester mode reveals the effective test period. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. The core purpose is front-loaded, and the tester-mode hint adds practical value without bloating the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero required parameters, an existing output schema, and annotations covering safety, the description covers the main use cases well. It omits the 'terminal' mode in the prose, but the schema already documents that mode, so 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 description coverage is 100%, so the schema already documents all four parameters in detail. The description reinforces the tester mode usage but does not add meaning beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Tail') with a clear resource ('a MetaTrader log') and enumerates the three distinct sources (EA LiveLog.txt, daily Experts journal, latest tester journal). This maps cleanly to the mode enum and separates the tool from unrelated 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 explicitly advises using mode='tester' right after a backtest to see runtime errors and the effective test period, which is a concrete usage guideline. It doesn't name alternative tools or say when not to use tail_log, but the provided context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_passesARead-onlyIdempotent
DEPRECATED (removed in 0.6.0): use read_optimization(criterion=..., top_n=...).
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | How many passes to return. | |
| expert | No | Expert name to select the cache. | |
| period | No | Timeframe to select the cache. | |
| symbol | No | Symbol to select the cache. | |
| opt_path | No | Absolute path to a .opt cache. | |
| criterion | No | Pass field to rank by. | profit |
| descending | No | true = highest first. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds the critical behavioral fact of deprecation and removal in 0.6.0, which annotations do not cover. The read-only and idempotent hints are already provided by annotations, so the description adds valuable context about the tool's status.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that immediately flags deprecation and gives the replacement call. Zero waste and highly scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deprecated tool, the description fully serves its purpose by directing the agent away. The output schema and annotations cover the rest, and no additional detail about return values or behavior is necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover all 7 parameters with clear meanings. The tool description adds no parameter-specific guidance, but the deprecation notice implicitly tells the agent not to worry about parameters. Baseline 3 applies given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool is deprecated and directs the agent to a replacement, which is a specific purpose for a deprecated tool. It distinguishes itself from siblings by naming the successor, though it does not describe the original functionality beyond the name and parameters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs the agent to use read_optimization(criterion=..., top_n=...) instead, leaving no ambiguity about when or whether to use this tool. This is ideal guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_tester_iniARead-onlyIdempotent
Sanity-check a tester.ini. If source given, cross-check inputs vs EA declarations.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | Absolute path to the tester.ini file. | |
| source | No | Optional EA source; when given, [TesterInputs] keys are cross-checked against its input declarations. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the conditional behavior that providing `source` triggers a cross-check of [TesterInputs] against EA declarations, which is useful context beyond the annotations. It does not contradict annotations and enriches the agent's model of what happens during invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. The primary action is front-loaded, and the conditional behavior is stated compactly in the second sentence. Every phrase adds information, and there is no redundancy with the schema beyond the necessary repetition of the conditional 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?
For a simple two-parameter tool with an output schema and comprehensive annotations, the description is adequate. It states the main purpose and the optional cross-check behavior, while the schema handles parameter details and the output schema covers return values. It could be more explicit about when in a workflow this should be used, but nothing critical is missing for a 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 100%, so the schema fully documents both `config` and `source`. The description essentially repeats the schema's explanation for `source` ('cross-check inputs vs EA declarations') without adding new syntax, format, or edge-case details. It does not mislead, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair ('Sanity-check a tester.ini') and adds a conditional cross-check behavior against EA declarations. This clearly differentiates it from sibling tools like patch_tester_ini (modification), gen_tester_inputs (generation), and read_tester_report (reading results), so an agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: you use it when you need to sanity-check a tester.ini, and the conditional 'If `source` given' gives one usage variant. However, it does not state when to prefer this over alternatives, nor does it mention prerequisite conditions like running before a backtest. There is no explicit when/when-not guidance, only an implied one.
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.
43 tool updates
v0.5.0- Added
analyze_mql - Added
cancel_backtest - Changed
check_deprecated2 fields changed- added
Input schema / properties / source / descriptionAdded value: +"Absolute Windows path to the .mq4/.mq5/.mqh source file." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "check_deprecatedDictOutput", + "type": "object" +}
- Changed
code_metrics3 fields changed- added
Input schema / properties / root / descriptionAdded value: +"Absolute folder to aggregate over." - added
Input schema / properties / source / descriptionAdded value: +"Absolute path of one source file." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "code_metricsDictOutput", + "type": "object" +}
- Changed
compare_reports4 fields changed- added
Input schema / properties / baseline / descriptionAdded value: +"Absolute path to the baseline tester report (.htm)." - added
Input schema / properties / candidate / descriptionAdded value: +"Absolute path to the candidate tester report (.htm)." - added
Input schema / properties / guardsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional percent thresholds per summary key, e.g. {\"net_profit\": -5, \"profit_factor\": -10, \"max_drawdown\": 25}; when given, `violations` and `ok` are added.", + "title": "Guards" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "compare_reportsDictOutput", + "type": "object" +}
- Changed
compile6 fields changed- added
Input schema / properties / include / descriptionAdded value: +"MQL root folder (parent of Include/) if different from the active terminal's." - added
Input schema / properties / log_file / descriptionAdded value: +"Explicit path for the compile log; defaults to .mt5tmp/<stem>.compile.log next to the source." - added
Input schema / properties / source / descriptionAdded value: +"Absolute Windows path to the .mq4/.mq5/.mqh source file." - added
Input schema / properties / syntax_onlyAdded value: +{ + "default": false, + "description": "true = MetaEditor /s syntax check only: faster, produces no binary.", + "title": "Syntax Only", + "type": "boolean" +} - added
Input schema / properties / timeout_sec / descriptionAdded value: +"Give up after this many seconds." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "compileDictOutput", + "type": "object" +}
- Changed
compile_and_deploy3 fields changed- added
Input schema / properties / ea_name / descriptionAdded value: +"File name for the binary inside Experts/; defaults to <stem>.ex5." - added
Input schema / properties / source / descriptionAdded value: +"Absolute Windows path to the .mq4/.mq5/.mqh source file." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "compile_and_deployDictOutput", + "type": "object" +}
- Added
deploy - Changed
deploy_ea3 fields changed- added
Input schema / properties / name / descriptionAdded value: +"File name to use inside Experts/." - added
Input schema / properties / source_ex / descriptionAdded value: +"Absolute path to the compiled .ex4/.ex5 binary." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "deploy_eaDictOutput", + "type": "object" +}
- Changed
env_info1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "env_infoDictOutput", + "type": "object" +}
- Changed
extract_doc2 fields changed- added
Input schema / properties / source / descriptionAdded value: +"Absolute Windows path to the .mq4/.mq5/.mqh source file." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "extract_docDictOutput", + "type": "object" +}
- Changed
extract_function8 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"true = preview the change and write nothing; false = apply it to the files." - added
Input schema / properties / line_end / descriptionAdded value: +"Last line (1-based, inclusive) of the block to extract." - added
Input schema / properties / line_start / descriptionAdded value: +"First line (1-based, inclusive) of the block to extract." - added
Input schema / properties / new_name / descriptionAdded value: +"Name of the new helper function." - added
Input schema / properties / return_type / descriptionAdded value: +"Return type of the helper, e.g. void or double." - added
Input schema / properties / source / descriptionAdded value: +"Absolute Windows path to the .mq4/.mq5/.mqh source file." - added
Input schema / properties / target_file / descriptionAdded value: +"Optional .mqh path to append the helper to; defaults to inserting above the enclosing function." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "extract_functionDictOutput", + "type": "object" +}
- Changed
extract_inputs2 fields changed- added
Input schema / properties / source / descriptionAdded value: +"Absolute Windows path to the .mq4/.mq5/.mqh source file." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "extract_inputsDictOutput", + "type": "object" +}
- Changed
find_magic_collision3 fields changed- added
Input schema / properties / root / descriptionAdded value: +"Absolute path to the project folder to scan recursively." - added
Input schema / properties / var_pattern / descriptionAdded value: +"Substring identifying magic-number variables." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "find_magic_collisionDictOutput", + "type": "object" +}
- Changed
find_symbol5 fields changed- added
Input schema / properties / exts / descriptionAdded value: +"File extensions to search." - added
Input schema / properties / limit / descriptionAdded value: +"Stop after this many matches." - added
Input schema / properties / root / descriptionAdded value: +"Absolute path to the project folder to scan recursively." - added
Input schema / properties / symbol / descriptionAdded value: +"Identifier to search for." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "find_symbolDictOutput", + "type": "object" +}
- Changed
format_check3 fields changed- added
Input schema / properties / source / descriptionAdded value: +"Absolute Windows path to the .mq4/.mq5/.mqh source file." - added
Input schema / properties / style / descriptionAdded value: +"clang-format style string." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "format_checkDictOutput", + "type": "object" +}
- Changed
format_mql4 fields changed- added
Input schema / properties / source / descriptionAdded value: +"Absolute Windows path to the .mq4/.mq5/.mqh source file." - added
Input schema / properties / style / descriptionAdded value: +"clang-format style string; defaults to an MQL-friendly LLVM-based profile." - added
Input schema / properties / write / descriptionAdded value: +"false = report/diff only (default); true = overwrite the file in its original encoding." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "format_mqlDictOutput", + "type": "object" +}
- Changed
gen_tester_inputs3 fields changed- added
Input schema / properties / source / descriptionAdded value: +"Absolute Windows path to the .mq4/.mq5/.mqh source file." - added
Input schema / properties / write_to / descriptionAdded value: +"Optional tester.ini path; when given the [TesterInputs] block is written into it." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "gen_tester_inputsDictOutput", + "type": "object" +}
- Added
get_backtest - Added
inspect_source - Changed
install_include3 fields changed- added
Input schema / properties / source / descriptionAdded value: +"Absolute Windows path to the .mq4/.mq5/.mqh source file." - added
Input schema / properties / target_name / descriptionAdded value: +"File name to use inside Include/." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "install_includeDictOutput", + "type": "object" +}
- Changed
kill_terminal2 fields changed- added
Input schema / properties / all_instancesAdded value: +{ + "default": false, + "description": "false = only terminals launched by this server; true = taskkill every terminal of this edition (may hit a live-trading terminal).", + "title": "All Instances", + "type": "boolean" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "kill_terminalDictOutput", + "type": "object" +}
- Changed
lint_basic2 fields changed- added
Input schema / properties / source / descriptionAdded value: +"Absolute Windows path to the .mq4/.mq5/.mqh source file." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "lint_basicDictOutput", + "type": "object" +}
- Added
list_backtests - Changed
list_experts6 fields changed- added
Input schema / properties / pattern / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / pattern / defaultPrevious value: -"*.ex5"New value: +null - added
Input schema / properties / pattern / descriptionAdded value: +"Glob pattern; defaults to *.ex5 on MT5 and *.ex4 on MT4." - removed
Input schema / properties / pattern / typeRemoved value: -"string" - added
Input schema / properties / recurse / descriptionAdded value: +"Include subfolders of Experts/." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "list_expertsDictOutput", + "type": "object" +}
- Changed
list_snapshots2 fields changed- added
Input schema / properties / dest / descriptionAdded value: +"Absolute path to the folder that holds snapshots." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "list_snapshotsDictOutput", + "type": "object" +}
- Changed
list_terminals1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "list_terminalsDictOutput", + "type": "object" +}
- Changed
parse_optimization6 fields changed- added
Input schema / properties / expertAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Expert name to select the cache.", + "title": "Expert" +} - added
Input schema / properties / path / descriptionAdded value: +"Absolute path to a .opt cache." - added
Input schema / properties / periodAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Timeframe to select the cache.", + "title": "Period" +} - added
Input schema / properties / sampleAdded value: +{ + "default": 50, + "description": "Passes to include in passes_sample.", + "title": "Sample", + "type": "integer" +} - added
Input schema / properties / symbolAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Symbol to select the cache.", + "title": "Symbol" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "parse_optimizationDictOutput", + "type": "object" +}
- Changed
patch_tester_ini3 fields changed- added
Input schema / properties / config / descriptionAdded value: +"Absolute path to the tester.ini file." - added
Input schema / properties / updates / descriptionAdded value: +"Mapping of \"Section.Key\" to new value, e.g. {\"Tester.Symbol\": \"EURUSD\"}." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "patch_tester_iniDictOutput", + "type": "object" +}
- Added
read_optimization - Changed
read_tester_report6 fields changed- added
Input schema / properties / max_tradesAdded value: +{ + "default": 500, + "description": "Max trade rows to return in `trades` when response_format=\"detailed\".", + "title": "Max Trades", + "type": "integer" +} - added
Input schema / properties / path / descriptionAdded value: +"Absolute path to a report .htm; defaults to the newest report found on disk." - changed
Input schema / properties / raw_truncate / defaultPrevious value: -50000New value: +0 - added
Input schema / properties / raw_truncate / descriptionAdded value: +"Characters of raw HTML to inline (0 = none; read report_uri instead)." - added
Input schema / properties / response_formatAdded value: +{ + "default": "concise", + "description": "\"concise\" = summary metrics + counts + report_uri; \"detailed\" adds the parsed trade rows.", + "enum": [ + "concise", + "detailed" + ], + "title": "Response Format", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "read_tester_reportDictOutput", + "type": "object" +}
- Changed
regression_check4 fields changed- added
Input schema / properties / baseline / descriptionAdded value: +"Absolute path to the baseline report." - added
Input schema / properties / candidate / descriptionAdded value: +"Absolute path to the candidate report." - added
Input schema / properties / guards / descriptionAdded value: +"Percent thresholds per summary key." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "regression_checkDictOutput", + "type": "object" +}
- Changed
rename_symbol5 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"true = preview the change and write nothing; false = apply it to the files." - added
Input schema / properties / new / descriptionAdded value: +"New identifier." - added
Input schema / properties / old / descriptionAdded value: +"Identifier to rename (whole-word match)." - added
Input schema / properties / root / descriptionAdded value: +"Absolute path to the project folder to scan recursively for MQL files." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "rename_symbolDictOutput", + "type": "object" +}
- Changed
resolve_includes3 fields changed- added
Input schema / properties / mql_root / descriptionAdded value: +"MQL root for <angle> includes." - added
Input schema / properties / source / descriptionAdded value: +"Absolute Windows path to the .mq4/.mq5/.mqh source file." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "resolve_includesDictOutput", + "type": "object" +}
- Changed
run_backtest5 fields changed- added
Input schema / properties / config / descriptionAdded value: +"Absolute path to the tester.ini file." - added
Input schema / properties / portable / descriptionAdded value: +"Pass /portable so the terminal uses its install folder as data folder." - added
Input schema / properties / timeout_sec / descriptionAdded value: +"Give up (and kill the terminal) after this many seconds." - added
Input schema / properties / wait / descriptionAdded value: +"true = block until the terminal exits (needs ShutdownTerminal=1); false = launch and return a run_id for get_backtest." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "run_backtestDictOutput", + "type": "object" +}
- Changed
select_terminal5 fields changed- added
Input schema / properties / edition / descriptionAdded value: +"\"mt5\" or \"mt4\"." - added
Input schema / properties / hash / descriptionAdded value: +"32-character terminal data folder name under %APPDATA%\\\\MetaQuotes\\\\Terminal." - added
Input schema / properties / install / descriptionAdded value: +"Install folder containing terminal64.exe; its data folder is found by scanning origin.txt files." - added
Input schema / properties / origin / descriptionAdded value: +"Install path stored in the terminal's origin.txt, e.g. C:\\\\Program Files\\\\MetaTrader 5." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "select_terminalDictOutput", + "type": "object" +}
- Changed
smoke_test7 fields changed- added
Input schema / properties / days / descriptionAdded value: +"Length of the backtest window in days (ends 2 days ago)." - added
Input schema / properties / expert_name / descriptionAdded value: +"Name to use in Expert= of the generated ini; defaults to the binary's stem." - added
Input schema / properties / period / descriptionAdded value: +"Timeframe code such as M15, H1, D1." - added
Input schema / properties / source / descriptionAdded value: +"Absolute Windows path to the .mq4/.mq5/.mqh source file." - added
Input schema / properties / symbol / descriptionAdded value: +"Symbol name as shown in Market Watch, e.g. EURUSD." - added
Input schema / properties / timeout_sec / descriptionAdded value: +"Give up after this many seconds." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "smoke_testDictOutput", + "type": "object" +}
- Changed
snapshot_sources4 fields changed- added
Input schema / properties / dest / descriptionAdded value: +"Absolute path to the folder that holds snapshots." - added
Input schema / properties / label / descriptionAdded value: +"Folder name for this snapshot; defaults to a timestamp." - added
Input schema / properties / sources / descriptionAdded value: +"Absolute paths of the source files to freeze." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "snapshot_sourcesDictOutput", + "type": "object" +}
- Added
start_backtest - Changed
syntax_check3 fields changed- added
Input schema / properties / source / descriptionAdded value: +"Absolute Windows path to the .mq4/.mq5/.mqh source file." - added
Input schema / properties / timeout_sec / descriptionAdded value: +"Give up after this many seconds." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "syntax_checkDictOutput", + "type": "object" +}
- Changed
tail_log6 fields changed- added
Input schema / properties / date / descriptionAdded value: +"Journal date as YYYYMMDD; defaults to today." - added
Input schema / properties / lines / descriptionAdded value: +"Number of lines from the end of the file." - added
Input schema / properties / mode / descriptionAdded value: +"\"live\" = MQL5/Files/LiveLog.txt written by the EA, \"journal\" = MQL5/Logs/YYYYMMDD.log (Experts tab), \"terminal\" = logs/YYYYMMDD.log (Journal tab: connection, tester start), \"tester\" = newest Tester/logs file." - added
Input schema / properties / mode / enumAdded value: +[ + "live", + "journal", + "terminal", + "tester" +] - added
Input schema / properties / structured / descriptionAdded value: +"Parse journal lines into {ts, source, message} records (journal/tester modes)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "tail_logDictOutput", + "type": "object" +}
- Changed
top_passes8 fields changed- added
Input schema / properties / criterion / descriptionAdded value: +"Pass field to rank by." - added
Input schema / properties / descending / descriptionAdded value: +"true = highest first." - added
Input schema / properties / expertAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Expert name to select the cache.", + "title": "Expert" +} - added
Input schema / properties / n / descriptionAdded value: +"How many passes to return." - added
Input schema / properties / opt_path / descriptionAdded value: +"Absolute path to a .opt cache." - added
Input schema / properties / periodAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Timeframe to select the cache.", + "title": "Period" +} - added
Input schema / properties / symbolAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Symbol to select the cache.", + "title": "Symbol" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "top_passesDictOutput", + "type": "object" +}
- Changed
validate_tester_ini3 fields changed- added
Input schema / properties / config / descriptionAdded value: +"Absolute path to the tester.ini file." - added
Input schema / properties / source / descriptionAdded value: +"Optional EA source; when given, [TesterInputs] keys are cross-checked against its input declarations." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "validate_tester_iniDictOutput", + "type": "object" +}
35 tool updates
v0.4.1- First observed
check_deprecated - First observed
code_metrics - First observed
compare_reports - First observed
compile - First observed
compile_and_deploy - First observed
deploy_ea - First observed
env_info - First observed
extract_doc - First observed
extract_function - First observed
extract_inputs - First observed
find_magic_collision - First observed
find_symbol - First observed
format_check - First observed
format_mql - First observed
gen_tester_inputs - First observed
install_include - First observed
kill_terminal - First observed
lint_basic - First observed
list_experts - First observed
list_snapshots - First observed
list_terminals - First observed
parse_optimization - First observed
patch_tester_ini - First observed
read_tester_report - First observed
regression_check - First observed
rename_symbol - First observed
resolve_includes - First observed
run_backtest - First observed
select_terminal - First observed
smoke_test - First observed
snapshot_sources - First observed
syntax_check - First observed
tail_log - First observed
top_passes - First observed
validate_tester_ini
TDQS
Scored across 43 tools
The active tools are mostly distinct, but the 16 deprecated aliases duplicate the same operations as active tools (e.g., extract_inputs vs inspect_source, parse_optimization vs read_optimization), creating confusion. Some overlap also exists between compile/compile_and_deploy/deploy and run_backtest/start_backtest/smoke_test, though descriptions help clarify boundaries.
Most tool names follow a clear verb_noun pattern (list_snapshots, run_backtest, read_tester_report, validate_tester_ini). Minor deviations like env_info, compile_and_deploy, and smoke_test are understandable exceptions, and deprecated names also generally follow similar conventions.
With 43 tools, the surface is far too large, even though 16 are deprecated. The active count of 27 is still heavy, and several active tools are composites (compile_and_deploy, smoke_test) that could be consolidated without losing capability.
The server covers the major MT5 automation lifecycle: terminal selection, compile/deploy, backtest launch and monitoring, report parsing, source inspection, static analysis, formatting, optimization reading, and snapshots. Minor gaps exist (no explicit tester.ini creation tool, no undeploy/removal tool), but workflows do not hit dead ends.
Maintenance
Related MCP Connectors
MCP server exposing the Backtest360 engine API as tools for AI agents.
MCP server for OpenMM — exposes market data, account, trading, and strategy tools to AI agents
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
A Model Context Protocol server for Wix AI tools
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA standalone Model Context Protocol (MCP) server that enables AI assistants to interact with the cTrader trading platform.14-
- AlicenseNot gradedqualityAmaintenanceExposes a unified AI interface to MetaTrader 5 over the Model Context Protocol, enabling live quotes, historical data, technical indicators, order execution, position management, and headless backtests.47 PyPIMIT
- AlicenseNot gradedqualityCmaintenanceA local-first MCP server that bridges AI coding agents with MetaTrader 5 for inspection, market data, MQL5 development, compiling, Strategy Tester review, workspace sync, logs, audit trails, demo trading, and carefully gated live trading.MIT
- FlicenseNot gradedqualityBmaintenanceUniversal MCP server that enables AI assistants to control MetaTrader 5 directly, executing trades, managing data, and automating MT5 operations through natural language.2-