Tools
Inspect what is in the workspace without changing anything.
describe_capabilities- the QC API knowledge pack. Fetch once per session. Unguarded.list_files(directory?)- recursive directory listing, depth-limited.read_file(path)- file contents.search_files(pattern, glob?)- regex search across the workspace.find_workspace_file(name)- fuzzy filename lookup.list_strategies()/list_indicators()- everything the discovery service has parsed, including invalid entries with their parse error.workspace_info()- workspace path, available data files, active strategy/indicator counts.workspace_search(query)- full-text search across all workspace files.get_app_info()- QC version, workspace id, license tier.get_example(topic)- canned snippet for a given API topic.
File mutation
Create / edit / delete / rename. All auth-guarded, sandboxed, with dirty-file refusal.
create_file(path, content)- new file with auto-injected disclaimer header. Refuses to overwrite a dirty file (one with unsaved editor changes).edit_file(path, content)- replace the entire file. Refuses on dirty files.apply_diff(path, oldText, newText)- surgical replace. Same dirty-file guard.delete_file(path, reason)- file only (not directories). Reason is required so the model documents intent. Refuses on dirty files.rename_file(old_path, new_path)- same workspace; refuses on dirty files; refuses if destination exists.undo_edit(path)- restore the previous content from one-deep undo history. Only works for the most recent edit_file / create_file.
Notes
- Windows file locks (file open in Excel, file currently being executed by Python, etc.) surface as
EBUSY/EPERMand are translated to a friendly "File is locked by another process" error. - Dirty-file refusal sends back: "File has unsaved changes in the editor. Ask the user to save or discard before retrying."
Notebook mutation
Edit Jupyter notebooks cell-by-cell.
create_notebook(path, cells)- new .ipynb with an array of {cell_type, source}.edit_cell(path, cell_id, new_source)- replace a cell's source.insert_cell(path, cell_id, cell_type, new_source)- insert after the given cell id.delete_cell(path, cell_id)- remove a cell.
Data and execution
Inspect parquet files, run backtests, read results.
describe_data_file(path)- schema, row count, time range, columns.query_parquet(sql)- DuckDB SQL over a parquet file. Read-only.run_backtest(strategy, params, data_file, date)- single-day single-combo backtest. Returns stats.run_sweep(strategy, params_grid, ...)- parameter sweep. Returns the per-combo metrics matrix.get_backtest_results(id?)- last (or by id) backtest result snapshot.get_equity_curve(id?)- per-tick equity series.get_last_trades(n)- the n most recent trades from the active backtest.
Chart and runtime
Drive the active chart and read the terminal buffer.
list_chart_instances()- chart ids and their active strategies / indicators.add_strategy_to_chart(chart_id, file)/remove_strategy_from_chart(chart_id, instance_id).add_indicator_to_chart(chart_id, file)/remove_indicator_from_chart(chart_id, instance_id).screenshot_chart(chart_id?)- PNG bytes of the active chart canvas.read_terminal({lines, since, scriptPath})- the last N entries from the QC terminal buffer (script output, errors, MCP tool log lines).refresh_workspace()- rescan strategies/, indicators/, notebooks/ and emit discovery events.