{
  "tools": [
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Adds a time-breakpoint: the running simulation pauses exactly AT this UTC time.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "label": {
            "type": "string"
          },
          "time": {
            "description": "ISO-8601 UTC.",
            "type": "string"
          }
        },
        "required": [
          "time"
        ],
        "type": "object"
      },
      "name": "add_simulation_breakpoint"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Apply a unified-diff patch to a strategy source file. The diff must use the actual current contents as base — call read_strategy_file first if you're not 100% sure of the current state. Prefer this over write_strategy_file for surgical changes.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "filename": {
            "description": "File to patch, e.g. 'main.cs'.",
            "type": "string"
          },
          "rationale": {
            "description": "One-line explanation for the version log.",
            "type": "string"
          },
          "unified_diff": {
            "description": "Standard unified diff (with @@ hunks).",
            "type": "string"
          }
        },
        "required": [
          "filename",
          "unified_diff",
          "rationale"
        ],
        "type": "object"
      },
      "name": "apply_strategy_patch"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Scans stored 1m history of a symbol for INTERNAL gaps (missing minutes between the first and last stored candle — e.g. left by an interrupted range download). Read-only. Note: some gaps are exchange-side (no trades / maintenance) and cannot be filled. Heal real gaps via repair_data_gaps. Args: exchange, market, symbol, from?, to?.",
      "inputSchema": {
        "properties": {
          "exchange": {
            "type": "string"
          },
          "from": {
            "description": "ISO-8601 UTC; only report gaps intersecting [from,to]",
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "symbol": {
            "type": "string"
          },
          "to": {
            "type": "string"
          }
        },
        "required": [
          "exchange",
          "market",
          "symbol"
        ],
        "type": "object"
      },
      "name": "check_data_gaps"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Checks whether a newer XTester version is available (Velopack / GitHub release feed). Returns current version + whether an update exists. In a dev/portable build reports self-update is unavailable.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "check_update"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Previews or applies retention cleanup only inside the current bound XTester workspace. Preview is read-only and returns an exact token. Apply requires confirm=true, that token, the same keep_latest, and the current windowTag. It deletes only fully verified old terminal runs and verified internal retention remnants; active, corrupt, linked, or suspicious entries are preserved and counted.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "default": false,
            "description": "False returns a read-only preview. True applies that exact preview.",
            "type": "boolean"
          },
          "confirmation": {
            "description": "Exact case-sensitive current windowTag returned by the preview.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "keep_latest": {
            "description": "Latest verified terminal runs to retain. Omit to use the current Workspace setting. Apply must repeat the keepLatest value returned by preview.",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "preview_token": {
            "description": "Exact token returned by the immediately preceding preview.",
            "maxLength": 64,
            "minLength": 64,
            "pattern": "^[0-9A-F]{64}$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "cleanup_research_data"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Compiles the FULL active strategy through Roslyn. Returns success + diagnostics.\n\nCALL THIS TOOL:\n  (a) After editing the MAIN strategy file (main.cs or class inheriting Strategy) — verify your changes compile;\n  (b) At the FINAL step of a multi-step task before reporting completion to the user;\n  (c) User explicitly asked to compile / build / check / verify / run;\n  (d) User reports a compile error and wants reproduction.\n\nDO NOT call this tool:\n  - After editing ONLY an indicator / helper / utility file that the strategy may not yet reference — it will fail with unrelated errors, confusing the user;\n  - After every micro-edit — group related edits, compile once at the end;\n  - As a sanity check between unrelated tasks in the same conversation.\n\nRule of thumb: if the strategy currently USES the file you just edited (directly or via dependency) — compile. If you just created a new isolated indicator that the user hasn't wired into the strategy yet — don't.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "compile_strategy"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Creates an in-memory, process-bound source-disclosure session for an external conversion agent. Requires the exact conversion/root hash, access_mode='redacted_text', recipient, endpoint, confirm=true and confirm_source_disclosure=true as JSON booleans. Consent is never persisted and disappears when this MCP host exits. This tool does not call an LLM, perform network I/O, or modify the project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "access_mode": {
            "enum": [
              "redacted_text"
            ],
            "type": "string"
          },
          "confirm": {
            "description": "Must be the JSON boolean true.",
            "type": "boolean"
          },
          "confirm_source_disclosure": {
            "description": "Must be the JSON boolean true; explicitly permits redacted source disclosure to the declared recipient and endpoint.",
            "type": "boolean"
          },
          "conversion_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "endpoint": {
            "description": "Declared https, loopback http, mcp, or stdio recipient endpoint. No request is sent.",
            "maxLength": 1024,
            "minLength": 1,
            "type": "string"
          },
          "recipient": {
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "source_root_sha256": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "conversion_id",
          "source_root_sha256",
          "access_mode",
          "recipient",
          "endpoint",
          "confirm",
          "confirm_source_disclosure"
        ],
        "type": "object"
      },
      "name": "convert_begin"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Idempotently revokes source access for one process-bound conversion session. Requires confirm=true. It does not modify the project or conversion files; starting again requires a fresh dual-confirmed convert_begin call. It cannot return while an earlier page disclosure from that session is still in flight.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be the JSON boolean true.",
            "type": "boolean"
          },
          "conversion_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "session_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "source_root_sha256": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "session_id",
          "conversion_id",
          "source_root_sha256",
          "confirm"
        ],
        "type": "object"
      },
      "name": "convert_cancel"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Compiles the durable staged file set with the normal XTester compiler and sandbox policy, then stores a bounded compile result. Requires confirm=true. Returns sanitized logical-file diagnostics and hashes, never source code or local paths.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be the JSON boolean true.",
            "type": "boolean"
          },
          "conversion_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "source_root_sha256": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "conversion_id",
          "source_root_sha256",
          "confirm"
        ],
        "type": "object"
      },
      "name": "convert_compile"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "After a successful compile, atomically applies the reviewed staged file set to the selected isolated project. It revalidates workspace, source revision, decisions, staged hashes and unchanged target code. Requires confirm=true and refuses while the engine is busy. A rare failed rollback returns project_state_uncertain with projectChanged=null so the agent tells the user to inspect the project instead of claiming it stayed unchanged.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be the JSON boolean true.",
            "type": "boolean"
          },
          "conversion_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "source_root_sha256": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "conversion_id",
          "source_root_sha256",
          "confirm"
        ],
        "type": "object"
      },
      "name": "convert_finalize"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns validated conversion metadata and the exact relative source inventory for one run. It verifies the current project identity, inventory root, file sizes and hashes. It never returns source content or a machine-local path. A Git run keeps its pinned revision but uses a generic source label rather than a repository name or location.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "conversion_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          }
        },
        "required": [
          "conversion_id"
        ],
        "type": "object"
      },
      "name": "convert_get_manifest"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns a bounded page of the current public XTester strategy API and conversion restrictions for one durable conversion run. It returns signatures and constraints, never project source, credentials, source URLs, or machine-local paths.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "conversion_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "limit": {
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "offset": {
            "minimum": 0,
            "type": "integer"
          },
          "source_root_sha256": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "topic": {
            "description": "Optional API type/member search text.",
            "maxLength": 128,
            "type": "string"
          }
        },
        "required": [
          "conversion_id",
          "source_root_sha256"
        ],
        "type": "object"
      },
      "name": "convert_get_xtester_context"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Captures and classifies a user-authorized strategy source inside the current isolated project workspace. Accepts one local file/folder path, a bounded file list, pasted text, an HTTPS download, or a public/private GitHub repository accessible with the configured account. Archives use the same bounded intake as the GUI. Irrelevant documents, current XTester projects, incomplete libraries and binary candidates are classified but do not create a conversion run. Requires confirm=true and confirm_rights=true; responses never echo a local path, source URL, token, or source text.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be the JSON boolean true.",
            "type": "boolean"
          },
          "confirm_rights": {
            "description": "Must be true: the user confirms they may provide and convert this material.",
            "type": "boolean"
          },
          "input_kind": {
            "enum": [
              "local_path",
              "local_files",
              "pasted_text",
              "https",
              "github"
            ],
            "type": "string"
          },
          "local_path": {
            "description": "One local file, archive, or folder. Never returned.",
            "maxLength": 32767,
            "minLength": 1,
            "type": "string"
          },
          "local_paths": {
            "description": "A bounded local file/archive set. Never returned.",
            "items": {
              "maxLength": 32767,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 4096,
            "minItems": 1,
            "type": "array"
          },
          "selected_entry_point": {
            "maxLength": 1024,
            "minLength": 1,
            "type": "string"
          },
          "suggested_file_name": {
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          },
          "text": {
            "description": "Pasted strategy source.",
            "maxLength": 1000000,
            "minLength": 1,
            "type": "string"
          },
          "url": {
            "description": "HTTPS download or github.com repository URL. Never returned.",
            "maxLength": 4096,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "input_kind",
          "confirm_rights",
          "confirm"
        ],
        "type": "object"
      },
      "name": "convert_import_source"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Reads one exact text file from an active process-bound conversion session. The complete verified file is scrubbed of secrets, absolute URLs and local paths before character pagination; binary files are refused. The page limit is 65536 characters. Each response includes disclosed document/page hashes and merged per-file read coverage. No raw source is logged or sent to telemetry.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "conversion_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "limit": {
            "maximum": 65536,
            "minimum": 1,
            "type": "integer"
          },
          "offset": {
            "minimum": 0,
            "type": "integer"
          },
          "relative_path": {
            "maxLength": 1024,
            "minLength": 1,
            "type": "string"
          },
          "session_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "source_root_sha256": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "session_id",
          "conversion_id",
          "source_root_sha256",
          "relative_path"
        ],
        "type": "object"
      },
      "name": "convert_read_source"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Returns the durable workflow phase, counts, unresolved decision cards and next action. It works after MCP restart. Optional session_id also returns the process-bound source session state and read coverage after revalidating the same workspace, conversion and source root. If a previous finalization was interrupted, this call may finish the bounded journal recovery after verifying the current project; it never starts a new finalization or changes strategy code.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "conversion_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "session_id": {
            "description": "Optional process-bound source session to revalidate.",
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "source_root_sha256": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "conversion_id",
          "source_root_sha256"
        ],
        "type": "object"
      },
      "name": "convert_status"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Validates and durably replaces the conversion behavior model. Every accepted source file must be represented; behaviors and incompatibilities need exact immutable source references. Each incompatibility must offer two or three consequences with exactly one recommendation. Requires confirm=true and returns only phase, counts and next action.",
      "inputSchema": {
        "$defs": {
          "source_reference": {
            "additionalProperties": false,
            "properties": {
              "end_line": {
                "minimum": 1,
                "type": "integer"
              },
              "file_sha256": {
                "pattern": "^[0-9a-f]{64}$",
                "type": "string"
              },
              "relative_path": {
                "maxLength": 1024,
                "minLength": 1,
                "type": "string"
              },
              "start_line": {
                "minimum": 1,
                "type": "integer"
              }
            },
            "required": [
              "relative_path",
              "file_sha256",
              "start_line",
              "end_line"
            ],
            "type": "object"
          }
        },
        "additionalProperties": false,
        "properties": {
          "behavior_model": {
            "additionalProperties": false,
            "properties": {
              "behaviors": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "category": {
                      "maxLength": 128,
                      "minLength": 1,
                      "type": "string"
                    },
                    "description": {
                      "maxLength": 16384,
                      "minLength": 1,
                      "type": "string"
                    },
                    "id": {
                      "maxLength": 128,
                      "minLength": 1,
                      "type": "string"
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "source_references": {
                      "items": {
                        "$ref": "#/$defs/source_reference"
                      },
                      "maxItems": 4096,
                      "minItems": 1,
                      "type": "array"
                    }
                  },
                  "required": [
                    "id",
                    "category",
                    "description",
                    "required",
                    "source_references"
                  ],
                  "type": "object"
                },
                "maxItems": 16384,
                "minItems": 1,
                "type": "array"
              },
              "compatibility_issues": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "id": {
                      "maxLength": 128,
                      "minLength": 1,
                      "type": "string"
                    },
                    "missing_capability": {
                      "maxLength": 16384,
                      "minLength": 1,
                      "type": "string"
                    },
                    "options": {
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "consequence": {
                            "maxLength": 16384,
                            "minLength": 1,
                            "type": "string"
                          },
                          "id": {
                            "maxLength": 128,
                            "minLength": 1,
                            "type": "string"
                          },
                          "recommended": {
                            "type": "boolean"
                          },
                          "title": {
                            "maxLength": 4096,
                            "minLength": 1,
                            "type": "string"
                          }
                        },
                        "required": [
                          "id",
                          "title",
                          "consequence",
                          "recommended"
                        ],
                        "type": "object"
                      },
                      "maxItems": 3,
                      "minItems": 2,
                      "type": "array"
                    },
                    "original_behavior": {
                      "maxLength": 16384,
                      "minLength": 1,
                      "type": "string"
                    },
                    "source_references": {
                      "items": {
                        "$ref": "#/$defs/source_reference"
                      },
                      "maxItems": 4096,
                      "minItems": 1,
                      "type": "array"
                    }
                  },
                  "required": [
                    "id",
                    "original_behavior",
                    "missing_capability",
                    "options",
                    "source_references"
                  ],
                  "type": "object"
                },
                "maxItems": 4096,
                "type": "array"
              },
              "modules": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "dependencies": {
                      "items": {
                        "maxLength": 1024,
                        "type": "string"
                      },
                      "maxItems": 512,
                      "type": "array"
                    },
                    "file_sha256": {
                      "pattern": "^[0-9a-f]{64}$",
                      "type": "string"
                    },
                    "language": {
                      "maxLength": 128,
                      "minLength": 1,
                      "type": "string"
                    },
                    "purpose": {
                      "maxLength": 16384,
                      "minLength": 1,
                      "type": "string"
                    },
                    "relative_path": {
                      "maxLength": 1024,
                      "minLength": 1,
                      "type": "string"
                    },
                    "required": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "relative_path",
                    "file_sha256",
                    "language",
                    "purpose",
                    "required",
                    "dependencies"
                  ],
                  "type": "object"
                },
                "maxItems": 4096,
                "minItems": 1,
                "type": "array"
              },
              "summary": {
                "maxLength": 65536,
                "minLength": 1,
                "type": "string"
              }
            },
            "required": [
              "summary",
              "modules",
              "behaviors",
              "compatibility_issues"
            ],
            "type": "object"
          },
          "confirm": {
            "description": "Must be the JSON boolean true.",
            "type": "boolean"
          },
          "conversion_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "source_root_sha256": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "conversion_id",
          "source_root_sha256",
          "behavior_model",
          "confirm"
        ],
        "type": "object"
      },
      "name": "convert_submit_behavior_model"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Durably records one or more user-confirmed choices for compatibility issues. For each issue choose exactly one offered option or provide a custom hypothesis. Calls may be repeated across several chat rounds. Requires confirm=true and never echoes decision text.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be the JSON boolean true.",
            "type": "boolean"
          },
          "conversion_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "decisions": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "custom_hypothesis": {
                  "maxLength": 16384,
                  "minLength": 1,
                  "type": "string"
                },
                "issue_id": {
                  "maxLength": 128,
                  "minLength": 1,
                  "type": "string"
                },
                "option_id": {
                  "maxLength": 128,
                  "minLength": 1,
                  "type": "string"
                },
                "user_note": {
                  "maxLength": 16384,
                  "type": "string"
                }
              },
              "required": [
                "issue_id"
              ],
              "type": "object"
            },
            "maxItems": 4096,
            "minItems": 1,
            "type": "array"
          },
          "source_root_sha256": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "conversion_id",
          "source_root_sha256",
          "decisions",
          "confirm"
        ],
        "type": "object"
      },
      "name": "convert_submit_decisions"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Validates and durably replaces the complete staged XTester strategy and behavior coverage. Unresolved decisions block this call. Paths must be unique normalized relative .cs paths and enabled main.cs is required. Requires confirm=true; source code is never echoed in the response or telemetry.",
      "inputSchema": {
        "$defs": {
          "source_reference": {
            "additionalProperties": false,
            "properties": {
              "end_line": {
                "minimum": 1,
                "type": "integer"
              },
              "file_sha256": {
                "pattern": "^[0-9a-f]{64}$",
                "type": "string"
              },
              "relative_path": {
                "maxLength": 1024,
                "minLength": 1,
                "type": "string"
              },
              "start_line": {
                "minimum": 1,
                "type": "integer"
              }
            },
            "required": [
              "relative_path",
              "file_sha256",
              "start_line",
              "end_line"
            ],
            "type": "object"
          }
        },
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be the JSON boolean true.",
            "type": "boolean"
          },
          "conversion_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "coverage": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "behavior_id": {
                  "maxLength": 128,
                  "minLength": 1,
                  "type": "string"
                },
                "note": {
                  "maxLength": 16384,
                  "type": "string"
                },
                "port_files": {
                  "items": {
                    "maxLength": 1024,
                    "minLength": 1,
                    "type": "string"
                  },
                  "maxItems": 4096,
                  "type": "array"
                },
                "status": {
                  "enum": [
                    "direct",
                    "with_difference",
                    "not_ported"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "behavior_id",
                "status",
                "port_files",
                "note"
              ],
              "type": "object"
            },
            "maxItems": 16384,
            "minItems": 1,
            "type": "array"
          },
          "files": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "code": {
                  "maxLength": 1000000,
                  "type": "string"
                },
                "enabled": {
                  "type": "boolean"
                },
                "relative_path": {
                  "maxLength": 1024,
                  "minLength": 1,
                  "type": "string"
                },
                "source_references": {
                  "items": {
                    "$ref": "#/$defs/source_reference"
                  },
                  "maxItems": 4096,
                  "type": "array"
                }
              },
              "required": [
                "relative_path",
                "code",
                "enabled",
                "source_references"
              ],
              "type": "object"
            },
            "maxItems": 4096,
            "minItems": 1,
            "type": "array"
          },
          "source_root_sha256": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "strategy_description": {
            "description": "Concise user-facing description of the converted signals, position/risk management and exits.",
            "maxLength": 4096,
            "minLength": 1,
            "type": "string"
          },
          "strategy_name": {
            "description": "Human-readable strategy name generated from the converted behavior.",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "conversion_id",
          "source_root_sha256",
          "files",
          "coverage",
          "confirm"
        ],
        "type": "object"
      },
      "name": "convert_submit_files"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Submits a separate behavior-by-behavior semantic audit after compilation. The audit must cover every behavior, distinguish covered, missing and mismatched behavior, link evidence to enabled staged files, and include findings for every missing or mismatched behavior. Core recomputes all binding hashes and decides whether finalization is allowed. Requires confirm=true and never echoes strategy source.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "behaviors": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "behavior_id": {
                  "maxLength": 128,
                  "minLength": 1,
                  "type": "string"
                },
                "explanation": {
                  "maxLength": 16384,
                  "type": "string"
                },
                "port_files": {
                  "items": {
                    "maxLength": 1024,
                    "minLength": 1,
                    "type": "string"
                  },
                  "maxItems": 4096,
                  "type": "array"
                },
                "status": {
                  "enum": [
                    "covered",
                    "missing",
                    "mismatch"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "behavior_id",
                "status",
                "port_files",
                "explanation"
              ],
              "type": "object"
            },
            "maxItems": 16384,
            "minItems": 1,
            "type": "array"
          },
          "confirm": {
            "description": "Must be the JSON boolean true.",
            "type": "boolean"
          },
          "conversion_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "findings": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "behavior_id": {
                  "maxLength": 128,
                  "minLength": 1,
                  "type": "string"
                },
                "category": {
                  "maxLength": 128,
                  "minLength": 1,
                  "type": "string"
                },
                "description": {
                  "maxLength": 16384,
                  "minLength": 1,
                  "type": "string"
                },
                "id": {
                  "maxLength": 128,
                  "minLength": 1,
                  "type": "string"
                },
                "suggested_repair": {
                  "maxLength": 16384,
                  "minLength": 1,
                  "type": "string"
                }
              },
              "required": [
                "id",
                "behavior_id",
                "category",
                "description",
                "suggested_repair"
              ],
              "type": "object"
            },
            "maxItems": 16384,
            "type": "array"
          },
          "source_root_sha256": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "conversion_id",
          "source_root_sha256",
          "behaviors",
          "findings",
          "confirm"
        ],
        "type": "object"
      },
      "name": "convert_submit_semantic_audit"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Creates a new portable .xtproj at an absolute path, initializes its workspace, and locks this MCP process to it. Never overwrites an existing file. Use only after the user chose 'create new project'; confirm=true is mandatory.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "path": {
            "description": "Absolute target .xtproj path.",
            "type": "string"
          }
        },
        "required": [
          "name",
          "path",
          "confirm"
        ],
        "type": "object"
      },
      "name": "create_project_workspace"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Creates a new source file in the strategy. Fails if a file with that name already exists. Use only when explicitly asked — don't add new files unprompted.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "content": {
            "description": "Initial content of the new file.",
            "type": "string"
          },
          "filename": {
            "description": "e.g. 'helpers.cs'.",
            "type": "string"
          }
        },
        "required": [
          "filename",
          "content"
        ],
        "type": "object"
      },
      "name": "create_strategy_file"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Creates a virtual folder (and any missing ancestors) inside the strategy .xtproj. Folders are relative virtual paths ('/'-separated), e.g. 'Indicators' or 'Lib/Risk'.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "path": {
            "description": "Relative virtual folder path, e.g. 'Indicators' or 'Lib/Risk'.",
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "type": "object"
      },
      "name": "create_strategy_folder"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Permanently deletes one inactive XTester workspace snapshot and its local session state. It never deletes the source .xtproj, cloud project, or Launcher bundle. This destructive catalog operation is available only before this MCP process selects a workspace. First call list_project_workspaces with the exact workspace_id, obtain its current windowTag, warn the user that unsaved workspace-only changes will be lost, then require their explicit confirmation. confirm=true and an exact case-sensitive confirmation equal to window_tag are mandatory. Default, GUI-open, GUI-unknown, MCP-active, stale, and unsafe workspaces fail closed.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be true after the explicit destructive confirmation.",
            "type": "boolean"
          },
          "confirmation": {
            "description": "Must exactly equal window_tag after the user confirmed permanent deletion.",
            "type": "string"
          },
          "window_tag": {
            "description": "Exact windowTag returned for that workspace.",
            "type": "string"
          },
          "workspace_id": {
            "description": "Exact stable workspace ID validated by a fresh list_project_workspaces {workspace_id} call.",
            "type": "string"
          }
        },
        "required": [
          "workspace_id",
          "window_tag",
          "confirmation",
          "confirm"
        ],
        "type": "object"
      },
      "name": "delete_project_workspace"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Deletes a simulation breakpoint by id.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "delete_simulation_breakpoint"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Deletes a source file from the strategy. confirm=true is mandatory and is enforced by the MCP server before anything is removed, so a call without it changes nothing. Cannot delete main.cs (use rename if you need to swap).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be true; explicit server-side confirmation of this deletion.",
            "type": "boolean"
          },
          "filename": {
            "type": "string"
          }
        },
        "required": [
          "filename"
        ],
        "type": "object"
      },
      "name": "delete_strategy_file"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Deletes a virtual strategy folder. With recursive=false (default), FAILS if the folder still contains files or subfolders. With recursive=true, removes the folder and everything under it. main.cs (root) is never affected. confirm=true is mandatory and is enforced by the MCP server before anything is removed, so a call without it changes nothing.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be true; explicit server-side confirmation of this deletion.",
            "type": "boolean"
          },
          "path": {
            "type": "string"
          },
          "recursive": {
            "description": "Delete contained files/subfolders too. Default false.",
            "type": "boolean"
          }
        },
        "required": [
          "path"
        ],
        "type": "object"
      },
      "name": "delete_strategy_folder"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Reads one incident bundle: incident.txt (meta + user breadcrumbs + stack) and log tails.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "include_tails": {
            "description": "Also include *.tail.log files (default false).",
            "type": "boolean"
          },
          "name": {
            "description": "Incident folder name from diagnostics_list_incidents.",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "diagnostics_get_incident"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists on-disk crash/incident bundles recorded by the XTester GUI (cross-process, rotated to 20) + crash dumps. Complements get_app_errors (this process only).",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "diagnostics_list_incidents"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Downloads historical funding rates into the cache (background job → poll job_status). DEX perpetuals only (HyperLiquid/Aster/dYdX); CEX symbols are skipped — the engine then uses the account profile's fixed rate.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "exchange": {
            "type": "string"
          },
          "from": {
            "description": "ISO-8601 UTC start.",
            "type": "string"
          },
          "market": {
            "description": "FuturesUSDT or FuturesCoin (perp only).",
            "type": "string"
          },
          "symbol": {
            "description": "Single symbol (or use 'symbols').",
            "type": "string"
          },
          "symbols": {
            "description": "Multiple symbols.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "to": {
            "description": "ISO-8601 UTC end.",
            "type": "string"
          }
        },
        "required": [
          "exchange",
          "market",
          "from",
          "to"
        ],
        "type": "object"
      },
      "name": "download_funding_history"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Downloads / updates 1m candle history for a symbol from the exchange (same as the Data window's Load). PREFER the no-range mode (no from/to): it appends the missing tail, or backfills from the start of the symbol's history (can take many minutes) — this never creates gaps. With from/to (range mode): fetches only that window; a 'from' LATER than existing coverage leaves an internal GAP (reported in the result — heal via repair_data_gaps). Prepend earlier than existing data is NOT supported (start is clamped forward). Streams live progress. Args: exchange, market, symbol, from?, to?.",
      "inputSchema": {
        "properties": {
          "exchange": {
            "description": "e.g. Binance, Bybit, OKX",
            "type": "string"
          },
          "from": {
            "description": "ISO-8601 UTC; range-mode start (optional)",
            "type": "string"
          },
          "market": {
            "description": "Spot | FuturesUSDT | FuturesCoin",
            "type": "string"
          },
          "symbol": {
            "description": "e.g. BTCUSDT",
            "type": "string"
          },
          "to": {
            "description": "ISO-8601 UTC; range-mode end (optional, default now)",
            "type": "string"
          }
        },
        "required": [
          "exchange",
          "market",
          "symbol"
        ],
        "type": "object"
      },
      "name": "download_history"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Full pre-run readiness check of the current strategy: compiled state, symbols the code uses (Roslyn scan), symbol exists on exchange, history present and covers the simulation period, accounts and balances configured. Default is READ-ONLY; apply_auto_fixes=true also auto-creates accounts/zero balances/selects symbol (mutates user settings).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "apply_auto_fixes": {
            "description": "Apply safe auto-fixes (default false = report only).",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "name": "evaluate_strategy_readiness"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Exports the whole project (sources, spec, versions, breakpoints — everything) as a single .xtproj file to the given path. Refuses to overwrite without overwrite=true.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "overwrite": {
            "type": "boolean"
          },
          "path": {
            "description": "Target file path (.xtproj appended if missing).",
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "type": "object"
      },
      "name": "export_project"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Finds a declaration. Two modes: by 'symbol' name (syntax scan of all files), or SEMANTIC go-to-definition by position — pass filename+line+column (1-based, cursor on the symbol) to resolve through the Roslyn semantic model like the built-in editor.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "code_override": {
            "description": "Semantic mode: unsaved text of the file.",
            "type": "string"
          },
          "column": {
            "description": "Semantic mode: 1-based column.",
            "type": "integer"
          },
          "filename": {
            "description": "Semantic mode: file with the cursor.",
            "type": "string"
          },
          "line": {
            "description": "Semantic mode: 1-based line.",
            "type": "integer"
          },
          "symbol": {
            "description": "Simple name: 'OnTick' / 'MyClass' / '_balance'.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "find_definition"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Finds symbol usages. Two modes: by 'symbol' name (word-boundary text match, lexical), or SEMANTIC find-all-references by position — pass filename+line+column (1-based, cursor on the symbol) to resolve through the Roslyn semantic model across all files, like the built-in editor.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "code_override": {
            "description": "Semantic mode: unsaved text of the file.",
            "type": "string"
          },
          "column": {
            "description": "Semantic mode: 1-based column.",
            "type": "integer"
          },
          "filename": {
            "description": "Semantic mode: file with the cursor.",
            "type": "string"
          },
          "line": {
            "description": "Semantic mode: 1-based line.",
            "type": "integer"
          },
          "symbol": {
            "description": "Name without parentheses, e.g. 'OnTick'.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "find_references"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Reformats the strategy file using the editor's formatting engine (Roslyn formatter + continuation indentation). For a dry-run diff of edits use get_strategy_format_edits.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "filename": {
            "type": "string"
          }
        },
        "required": [
          "filename"
        ],
        "type": "object"
      },
      "name": "format_strategy_file"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns information about the file currently active in the editor: filename, selected text range (if any). Useful when user says 'this method' / 'here'.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "get_active_file_context"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Reads the application's ErrorList (errors/warnings panel) — the same list the user sees in the IDE, filled by the last compilation (whether the user triggered it or the agent did). Prefer this over get_strategy_diagnostics when the user mentions an error they saw in the UI, since this includes whatever the IDE-side build last produced. Parameters (all optional):   only_errors — bool, return only Error rows;   only_warnings — bool, return only Warning rows;   file — case-insensitive exact filename match;   search — case-insensitive substring of Description / Code;   max_count — cap on returned rows (default 50, max 200).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "file": {
            "description": "Exact filename match (case-insensitive)",
            "type": "string"
          },
          "max_count": {
            "description": "Cap on returned rows (default 50, max 200)",
            "type": "integer"
          },
          "only_errors": {
            "description": "Filter to Error rows only",
            "type": "boolean"
          },
          "only_warnings": {
            "description": "Filter to Warning rows only",
            "type": "boolean"
          },
          "search": {
            "description": "Substring of Description / Code",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "get_app_errors"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Reads recent entries from the XTester application log (Global.log) — the same log the user sees in the Output panel. Useful to inspect what happened during user-triggered compilation, strategy runs, market data loading and other application events. Use this when the user mentions an error / warning in the IDE, or after asking them to Build/Run, to see the actual messages instead of guessing. Parameters (all optional):   level — 'Debug' | 'Info' | 'Warning' | 'Error' | 'Success' | 'Trace';   category — 'General' | 'Compilation' | 'Strategy' | 'Market' | 'Orders' | etc.;   since_minutes — only entries newer than N minutes ago;   search — substring to match (case-insensitive) in Message;   max_count — cap on the number of returned entries (default 50, max 200).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "category": {
            "description": "Filter by log category",
            "type": "string"
          },
          "level": {
            "description": "Filter by log level",
            "type": "string"
          },
          "max_count": {
            "description": "Cap on returned rows (default 50, max 200)",
            "type": "integer"
          },
          "search": {
            "description": "Case-insensitive substring of Message",
            "type": "string"
          },
          "since_minutes": {
            "description": "Only entries newer than N minutes",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "get_app_logs"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns a short summary of the MAIN strategy backtest (source, status, metrics). Status can be None/Running/Paused/Completed/Failed — metrics are present only for Completed. A completed run with 0 trades is still a valid backtest. For period, warnings and diagnostics use get_main_backtest_snapshot.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "get_backtest_summary"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns closed trades from the LAST run_backtest in this session: entry/exit time, side, entry/exit price, size, pnl, pnl %, duration (minutes). Paginate with offset/limit.",
      "inputSchema": {
        "properties": {
          "limit": {
            "description": "max trades (default 100, cap 1000)",
            "type": "integer"
          },
          "offset": {
            "description": "skip first N trades (default 0)",
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "get_backtest_trades"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns simulation account balances per exchange/market: asset, total, available (locked = total - available). Use when the user asks about equity, free funds or margin.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "get_balances"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Chart data as JSON: candles (o/h/l/c/v), indicator series the strategy computed, trades and open orders in the window, equity of the last backtest. For candles-only paging use get_klines.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "exchange": {
            "type": "string"
          },
          "from": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "max_points": {
            "description": "Cap per series (default 500).",
            "type": "integer"
          },
          "symbol": {
            "type": "string"
          },
          "timeframe": {
            "type": "string"
          },
          "to": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "get_chart_data"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Closed positions of the current session: entry/exit time+price, quantity, PnL, duration.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "description": "Default 50.",
            "type": "integer"
          },
          "offset": {
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "get_closed_positions"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Returns the sanitized durable report created by convert_finalize: directly transferred, transferred with an agreed difference, and not transferred behavior. It contains no invented similarity percentage, source code, secrets, source URL, or local path. If a previous finalization was interrupted after its project write, this call may finish the bounded journal recovery after verifying the current project; it never starts a new finalization or changes strategy code.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "conversion_id": {
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "source_root_sha256": {
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "conversion_id",
          "source_root_sha256"
        ],
        "type": "object"
      },
      "name": "get_conversion_report"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the equity curve (account value over time) from the LAST run_backtest. Already downsampled for display; pass max_points to cap further.",
      "inputSchema": {
        "properties": {
          "max_points": {
            "description": "cap number of points (default 200, cap 1000)",
            "type": "integer"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "get_equity_curve"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Reads cached funding rates for a symbol (optionally sliced by from/to). Rates are FRACTIONS per funding interval (0.0001 = 0.01%).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "exchange": {
            "type": "string"
          },
          "from": {
            "type": "string"
          },
          "limit": {
            "description": "Max points (default 500).",
            "type": "integer"
          },
          "market": {
            "type": "string"
          },
          "symbol": {
            "type": "string"
          },
          "to": {
            "type": "string"
          }
        },
        "required": [
          "exchange",
          "market",
          "symbol"
        ],
        "type": "object"
      },
      "name": "get_funding_rates"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Reads LIVE state from a running XTester GUI over a local pipe: the active editor file, the current text selection, unsaved code size, and the current (possibly Running/Paused) main backtest. Returns a note if no XTester window is open — then use the disk-based tools.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_gui_state"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the signature and documentation for a named indicator (RSI, EMA, MACD, ATR, etc.). Use when unsure about parameters.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "name": {
            "description": "Indicator name (case-insensitive), e.g. 'RSI'.",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "get_indicator_doc"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns points of one series recorded during the LAST run_backtest (built-in indicator or a custom Plot(...) series such as phase markup) at FULL resolution with pagination — suitable for building CSV on the client side. Args: name (from list_indicator_series; substring match, exact match preferred), offset/limit, from/to (ISO-8601 UTC).",
      "inputSchema": {
        "properties": {
          "from": {
            "description": "ISO-8601 UTC range start (optional)",
            "type": "string"
          },
          "limit": {
            "description": "max points (default 1000, cap 10000)",
            "type": "integer"
          },
          "name": {
            "description": "series name / displayName / settingsKey (substring, case-insensitive)",
            "type": "string"
          },
          "offset": {
            "description": "skip first N points (default 0)",
            "type": "integer"
          },
          "to": {
            "description": "ISO-8601 UTC range end (optional)",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "get_indicator_series"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Reads OHLCV candles from downloaded data, aggregated to any timeframe (m1..d1..). Returns compact tuples [openTimeIso, open, high, low, close, volume]. Paginate large ranges via 'from' + the returned 'next_cursor'. Args: exchange, market, symbol, timeframe (default m1), from?, to? (ISO UTC), limit (default 500, max 2000).",
      "inputSchema": {
        "properties": {
          "exchange": {
            "type": "string"
          },
          "from": {
            "description": "ISO-8601 UTC; page starts here",
            "type": "string"
          },
          "limit": {
            "description": "max candles (default 500, cap 2000)",
            "type": "integer"
          },
          "market": {
            "type": "string"
          },
          "symbol": {
            "type": "string"
          },
          "timeframe": {
            "description": "m1,m5,m15,m30,h1,h4,d1,... (default m1)",
            "type": "string"
          },
          "to": {
            "description": "ISO-8601 UTC; optional upper bound",
            "type": "string"
          }
        },
        "required": [
          "exchange",
          "market",
          "symbol"
        ],
        "type": "object"
      },
      "name": "get_klines"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Strategy launch mode: Debug (safety instrumentation + code breakpoints) or Release (faster, no infinite-loop watchdog, breakpoints ignored).",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_launch_mode"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Symbols currently loaded into RAM (the market-data memory the engine reads): candle count and covered range per symbol.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_loaded_symbols"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the FULL snapshot of the MAIN strategy backtest: source, status (None/Running/Paused/Completed/Failed), run id, symbol/market/timeframe, period, started/completed timestamps, metrics and warnings. detail='diagnostic' additionally includes strategy-log errors and open positions/orders counts. Lab (Research Lab) runs are NEVER included here.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "detail": {
            "description": "summary (default) | diagnostic",
            "enum": [
              "summary",
              "diagnostic"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "get_main_backtest_snapshot"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns currently OPEN (active) orders of the simulation: symbol, side, type, price, quantity, filled quantity, status. Use when the user asks about pending/limit orders.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "get_open_orders"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Current synthetic order book configuration: launch-profile semantics (enabled, mode, teacher strength, seed policy — affects results, fingerprinted) and machine-local engine settings (DOM rows, FPS, book limit).",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_order_book_settings"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns CURRENT open positions of the running/last simulation (side, quantity, entry price, mark price, unrealized PnL, leverage) plus up to 10 most recent closed positions with PnL. Use when the user asks why the strategy is (not) holding positions or about current exposure.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "get_positions"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the exact locked XTester workspace identity, including the GUI windowTag, and the currently loaded project: name, description, and the list of strategy source files (files live INSIDE the .xtproj, not on disk — edit them via read_strategy_file / write_strategy_file / apply_strategy_patch, not the filesystem).",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_project_info"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Project metadata: name, description, version, created date, strategy id, launch mode, version counters (spec/strategy), source file count.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_project_metadata"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the project SPECIFICATION (the strategy's ТЗ, markdown) — the same text the Spec Builder maintains.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_project_spec"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Runtime symbol requirements of the simulation engine: resolved run symbols, symbols observed at runtime, pending (missing) symbols with the reason, and whether the run is blocked waiting for user intervention.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_runtime_requirements"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Current simulation settings of THIS MCP session (symbol, period, step mode, auto-pause, visualization). Reflects in-memory session state — run_backtest/simulation_configure mutate it; it is NOT necessarily the user's on-disk config.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_simulation_settings"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "One named statistics series of the LAST backtest as JSON points. Names: equity_strategy, equity_benchmark, drawdown, rolling_returns, rolling_volatility, rolling_sharpe, rolling_return_cagr, rolling_drawdown, monthly_returns, pnl_distribution, returns_distribution, cumulative_pnl_by_trade, exposure_over_time, position_size_over_time, exposure_distribution, ranked_drawdowns, win_vs_loss, duration_distribution.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "max_points": {
            "description": "Even-thinning cap (default 500).",
            "type": "integer"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "get_statistics_series"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns signatures + XML documentation for one environment API type (e.g. 'IApi', 'IKline', 'PlaceOrder', 'OrderSide'). Optional 'member' filters to a single method/property. For indicators prefer get_indicator_doc.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "member": {
            "description": "Optional member name to filter, e.g. 'PlaceOrder' or 'ClosePrice'.",
            "type": "string"
          },
          "type": {
            "description": "Type name, e.g. 'IApi', 'IKline', 'PlaceOrder', 'OrderSide'.",
            "type": "string"
          }
        },
        "required": [
          "type"
        ],
        "type": "object"
      },
      "name": "get_strategy_api_doc"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Available quick-fix code actions at a position (currently: add-missing-using for unresolved types, CS0246/CS0103 — same as the built-in editor). Returns title + text edits per action. Args: filename, line, column (1-based), optional code_override.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "code_override": {
            "type": "string"
          },
          "column": {
            "type": "integer"
          },
          "filename": {
            "type": "string"
          },
          "line": {
            "type": "integer"
          }
        },
        "required": [
          "filename",
          "line",
          "column"
        ],
        "type": "object"
      },
      "name": "get_strategy_code_actions"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "IntelliSense completions at a position — same Roslyn engine as the built-in editor. Args: filename, line, column (1-based), optional code_override (unsaved text), max_results. Returns label/kind/detail/documentation/insertText.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "code_override": {
            "description": "Optional file text to use instead of the saved one.",
            "type": "string"
          },
          "column": {
            "description": "1-based column (caret position).",
            "type": "integer"
          },
          "filename": {
            "type": "string"
          },
          "line": {
            "description": "1-based line.",
            "type": "integer"
          },
          "max_results": {
            "description": "Cap on returned items (default 50).",
            "type": "integer"
          }
        },
        "required": [
          "filename",
          "line",
          "column"
        ],
        "type": "object"
      },
      "name": "get_strategy_completions"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the latest compiler diagnostics for the active strategy (errors, warnings, infos). Useful when fixing build failures.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "get_strategy_diagnostics"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the FULL strategy runtime environment reference: auto-usings the compiler injects, ambient symbols (time/Now), allowed types, hidden/forbidden rules, the IStrategy skeleton and sandbox security rules plus host-managed Models/AiProviders/Strategy Risk/Strategy State facades. Read this before writing code.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "get_strategy_environment"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Document formatting via the editor's engine (Roslyn Formatter + continuation indentation). apply=false (default) is a strict dry run: it returns the text edits and changes nothing — no file write, no project save, no revision bump. apply=true applies them to the file. Richer than format_strategy_file (edit diffs instead of a whole-file rewrite).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "apply": {
            "description": "Apply the edits to the file. Default false (dry-run).",
            "type": "boolean"
          },
          "filename": {
            "type": "string"
          }
        },
        "required": [
          "filename"
        ],
        "type": "object"
      },
      "name": "get_strategy_format_edits"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Reads the STRATEGY's own log — messages the strategy wrote via _logger.Info/Warning/Error during the last simulation/backtest (filter hits, entry/exit reasons, order errors). Timestamps are SIMULATION time. This is a different log than get_app_logs (application log). ALWAYS use this when diagnosing why a strategy did or did not trade. Parameters (all optional):   level — 'Debug' | 'Info' | 'Warning' | 'Error';   search — case-insensitive substring of the message;   max_count — cap on returned rows (default 60, max 300);   scope — 'last_run' (default: only entries of the last main backtest) | 'session' (process log since its last clear; note: in MCP, run_backtest clears the log when a run actually starts).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "level": {
            "description": "Filter by level (Debug/Info/Warning/Error)",
            "type": "string"
          },
          "max_count": {
            "description": "Cap on returned rows (default 60, max 300)",
            "type": "integer"
          },
          "scope": {
            "description": "'last_run' (default) — entries of the last main backtest only; 'session' — process log since its last clear (in MCP each run_backtest clears it on start)",
            "type": "string"
          },
          "search": {
            "description": "Case-insensitive substring of message",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "get_strategy_logs"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the structural outline (classes, methods, properties, fields) of a strategy file or all files (when filename is omitted). Useful for navigation without reading full source.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "filename": {
            "description": "Optional. If omitted, outline is built for all files.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "get_strategy_outline"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Hover/quick-info at a position — same engine as the built-in editor: symbol signature + docs. Args: filename, line, column (1-based), optional code_override.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "code_override": {
            "type": "string"
          },
          "column": {
            "type": "integer"
          },
          "filename": {
            "type": "string"
          },
          "line": {
            "type": "integer"
          }
        },
        "required": [
          "filename",
          "line",
          "column"
        ],
        "type": "object"
      },
      "name": "get_strategy_quick_info"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the currently loaded data context: ticker symbol, timeframe, and date range. Useful to ground recommendations in actual data scope.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "get_strategy_runtime_info"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Signature help at a call site (position must be INSIDE the argument list) — active overload, parameter names and docs. Args: filename, line, column (1-based), optional code_override.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "code_override": {
            "type": "string"
          },
          "column": {
            "type": "integer"
          },
          "filename": {
            "type": "string"
          },
          "line": {
            "type": "integer"
          }
        },
        "required": [
          "filename",
          "line",
          "column"
        ],
        "type": "object"
      },
      "name": "get_strategy_signature_help"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Detailed statistics of the LAST backtest (beyond get_backtest_summary): CAGR, Sharpe, Sortino, Calmar, expectancy, exposure, monthly bests/worsts, distributions summary.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_strategy_statistics"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Commits the current project state. Returns the commit sha, or reports 'nothing to commit' (use allow_empty=true to force). Note: if the user's GitAutoPushOnCommit is on, this also pushes.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "allow_empty": {
            "type": "boolean"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "message"
        ],
        "type": "object"
      },
      "name": "git_commit"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Commit + push in one step. Returns commit sha, branch, remote (redacted) and push result.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "allow_empty": {
            "type": "boolean"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "message"
        ],
        "type": "object"
      },
      "name": "git_commit_and_push"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Creates a branch (does NOT switch to it). Optional at_sha to branch from a commit.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "at_sha": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "git_create_branch"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Fetches from the remote (network; needs remote + GitHub auth). Updates ahead/behind.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "git_fetch"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Diff: without args — working changes vs HEAD (file lists); with commit_sha — that commit vs its parent with patch text (truncated).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "commit_sha": {
            "type": "string"
          },
          "max_patch_chars": {
            "description": "Patch text cap (default 20000).",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "git_get_diff"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Commit log (newest first): sha, message, author, date, branch tips.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "branch": {
            "description": "Local branch (default HEAD).",
            "type": "string"
          },
          "limit": {
            "description": "Default 30.",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "git_get_log"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the bound remote URL (credentials redacted).",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "git_get_remote"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Git status of the project repo: branch, head, modified/added/deleted (project state vs HEAD), ahead/behind the remote, clean flag.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "git_get_status"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Initializes the project git repo (generates RepoId, makes the 'Initial import' commit). No-op if already initialized.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "git_init"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists local branches (+ which one is current).",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "git_list_branches"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Merges a branch into the current one (in-memory merge; conflicts abort with the file list, repo untouched). Rewrites the project — refuses on dirty state without confirm=true.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "type": "boolean"
          },
          "source": {
            "type": "string"
          }
        },
        "required": [
          "source"
        ],
        "type": "object"
      },
      "name": "git_merge_branch"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Dry-run merge preview: UpToDate | FastForward | Merge | Conflicts + changed/conflicted files. Repo is not touched.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "source": {
            "description": "Source branch.",
            "type": "string"
          }
        },
        "required": [
          "source"
        ],
        "type": "object"
      },
      "name": "git_preview_merge"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Pull (fast-forward ONLY; diverged branches throw — merge manually). Rewrites the project on update; refuses on dirty state without confirm=true.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "name": "git_pull"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Pushes the current branch to the remote (network; needs remote + GitHub auth).",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "git_push"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Binds/replaces the remote URL for the project repo (persisted in .xtproj). Same durable effect as github_bind_repo, so it carries the same mandatory confirm=true, enforced by the server before the binding is written.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be true; explicit server-side confirmation of this operation.",
            "type": "boolean"
          },
          "url": {
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "name": "git_set_remote"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Switches to a local branch. DESTRUCTIVE when dirty: the in-memory project is rewritten from the branch — uncommitted changes are lost; refuses without confirm=true.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required when the working state is dirty.",
            "type": "boolean"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "git_switch_branch"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Adds a Markdown comment to an issue or pull request. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "description": "Comment body.",
            "type": "string"
          },
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "number": {
            "description": "Issue/PR number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "number",
          "body"
        ],
        "type": "object"
      },
      "name": "github_add_issue_comment"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Adds an inline pull-request review comment using line/side coordinates. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "description": "Comment body.",
            "type": "string"
          },
          "commit_id": {
            "description": "Commit SHA.",
            "type": "string"
          },
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "line": {
            "description": "Line in the diff.",
            "minimum": 1,
            "type": "integer"
          },
          "number": {
            "description": "Pull request number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "path": {
            "description": "Repository-relative file path.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "side": {
            "description": "LEFT | RIGHT",
            "enum": [
              "LEFT",
              "RIGHT"
            ],
            "type": "string"
          },
          "start_line": {
            "description": "Start line for a multi-line comment.",
            "minimum": 1,
            "type": "integer"
          },
          "start_side": {
            "description": "LEFT | RIGHT",
            "enum": [
              "LEFT",
              "RIGHT"
            ],
            "type": "string"
          }
        },
        "required": [
          "number",
          "body",
          "commit_id",
          "path",
          "line",
          "side"
        ],
        "type": "object"
      },
      "name": "github_add_review_comment"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "GitHub auth status: signed-in user (login) and whether a token is stored. The token itself is NEVER returned.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "github_auth_status"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Binds an existing GitHub repo (clone URL) as this project's remote, replacing any remote already bound. confirm=true is mandatory and is enforced by the server before the persistent binding is written.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be true; explicit server-side confirmation of this operation.",
            "type": "boolean"
          },
          "url": {
            "description": "HTTPS clone URL.",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "name": "github_bind_repo"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Cancels a running workflow. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "run_id": {
            "description": "Workflow run ID.",
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "run_id"
        ],
        "type": "object"
      },
      "name": "github_cancel_workflow"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Creates a remote branch at sha/source_ref/default branch. Existing same-SHA refs are treated as success. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "name": {
            "description": "New branch name.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "sha": {
            "description": "Target commit SHA.",
            "type": "string"
          },
          "source_ref": {
            "description": "Source branch (default repository default branch).",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "github_create_branch"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Creates an issue with optional labels, assignees and milestone. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "assignees": {
            "description": "Assignee logins.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "body": {
            "description": "Markdown body.",
            "type": "string"
          },
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "labels": {
            "description": "Label names.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "milestone": {
            "description": "Milestone number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "title": {
            "description": "Issue title.",
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "type": "object"
      },
      "name": "github_create_issue"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Creates a repository label. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "color": {
            "description": "Six-character hex color without #.",
            "type": "string"
          },
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "description": {
            "description": "Optional description.",
            "type": "string"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "name": {
            "description": "Label name.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "name",
          "color"
        ],
        "type": "object"
      },
      "name": "github_create_label"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Creates a repository milestone. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "description": {
            "description": "Description.",
            "type": "string"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "due_on": {
            "description": "ISO-8601 due date.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "title": {
            "description": "Milestone title.",
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "type": "object"
      },
      "name": "github_create_milestone"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Creates a pull request, including draft PRs. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "base": {
            "description": "Target branch.",
            "type": "string"
          },
          "body": {
            "description": "Markdown body.",
            "type": "string"
          },
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "draft": {
            "description": "Create as draft.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "head": {
            "description": "Source branch or owner:branch.",
            "type": "string"
          },
          "maintainer_can_modify": {
            "description": "Allow maintainer edits.",
            "type": "boolean"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "title": {
            "description": "Pull request title.",
            "type": "string"
          }
        },
        "required": [
          "title",
          "head",
          "base"
        ],
        "type": "object"
      },
      "name": "github_create_pull_request"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Creates a draft or published release; use draft=true for a reviewable preview. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "description": "Markdown release notes.",
            "type": "string"
          },
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "draft": {
            "description": "Draft state.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "generate_release_notes": {
            "description": "Ask GitHub to generate notes.",
            "type": "boolean"
          },
          "make_latest": {
            "description": "true | false | legacy",
            "enum": [
              "true",
              "false",
              "legacy"
            ],
            "type": "string"
          },
          "name": {
            "description": "Release name.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "prerelease": {
            "description": "Prerelease state.",
            "type": "boolean"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "tag_name": {
            "description": "Tag name.",
            "type": "string"
          },
          "target_commitish": {
            "description": "Target branch or commit SHA.",
            "type": "string"
          }
        },
        "required": [
          "tag_name"
        ],
        "type": "object"
      },
      "name": "github_create_release"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Creates a GitHub repository; bind=true (default) binds it as this project's remote. push=true also makes an initial commit and pushes. confirm=true is mandatory and is enforced by the server before the remote repository is created or the project remote is rewritten; dry_run=true returns the plan without creating anything.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "bind": {
            "description": "Bind as project remote (default true).",
            "type": "boolean"
          },
          "confirm": {
            "description": "Must be true; explicit server-side confirmation of this operation.",
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "dry_run": {
            "description": "Return the plan without performing the operation. Takes precedence over confirm.",
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "private": {
            "description": "Default true.",
            "type": "boolean"
          },
          "push": {
            "description": "Initial commit + push (default false).",
            "type": "boolean"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "github_create_repo"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Creates a lightweight remote Git tag at sha/source_ref. Existing same-SHA refs are treated as success. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "name": {
            "description": "New tag name.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "sha": {
            "description": "Target commit SHA.",
            "type": "string"
          },
          "source_ref": {
            "description": "Source branch (default repository default branch).",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "github_create_tag"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Deletes a remote branch; refuses the default or a protected branch. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "name": {
            "description": "Branch name.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "github_delete_branch"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Deletes a repository label. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "name": {
            "description": "Label name.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "github_delete_label"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Deletes a milestone (issues are not deleted). Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "number": {
            "description": "Milestone number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "github_delete_milestone"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Deletes a GitHub release. Its Git tag is not deleted automatically. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "release_id": {
            "description": "Release ID.",
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "release_id"
        ],
        "type": "object"
      },
      "name": "github_delete_release"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Deletes a remote Git tag. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "name": {
            "description": "Tag name.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "github_delete_tag"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Polls the started device-flow login as a background job (up to ~15 min; poll job_status). PERSISTS a credential: on success the GitHub access token is written to this machine's user settings so the login survives the process. The token itself is never returned or logged — only the LOGIN. confirm=true is mandatory and is enforced by the server before polling starts, so an unconfirmed call stores nothing.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be true; confirms storing the resulting GitHub token in user settings.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "name": "github_device_login_poll"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Starts the GitHub OAuth Device Flow: returns a user code and verification URL — show them to the user, then call github_device_login_poll. The device code stays in-process.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "github_device_login_start"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Dispatches a workflow_dispatch workflow. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "inputs": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "String workflow inputs.",
            "type": "object"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "ref": {
            "description": "Git ref to run.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "workflow_id": {
            "description": "Workflow numeric ID or file name.",
            "type": "string"
          }
        },
        "required": [
          "workflow_id",
          "ref"
        ],
        "type": "object"
      },
      "name": "github_dispatch_workflow"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Downloads an Actions artifact ZIP into XTester's GitHubDownloads directory as a background job. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "artifact_id": {
            "description": "Artifact ID.",
            "minimum": 1,
            "type": "integer"
          },
          "confirm": {
            "description": "Required only when overwrite=true and the target exists.",
            "type": "boolean"
          },
          "file_name": {
            "description": "Optional safe output file name.",
            "type": "string"
          },
          "overwrite": {
            "description": "Overwrite an existing output file; requires confirm=true.",
            "type": "boolean"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "artifact_id"
        ],
        "type": "object"
      },
      "name": "github_download_artifact"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Downloads a release asset into XTester's GitHubDownloads directory as a background job. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "asset_id": {
            "description": "Release asset ID.",
            "minimum": 1,
            "type": "integer"
          },
          "confirm": {
            "description": "Required only when overwrite=true and the target exists.",
            "type": "boolean"
          },
          "file_name": {
            "description": "Optional safe output file name.",
            "type": "string"
          },
          "overwrite": {
            "description": "Overwrite an existing output file; requires confirm=true.",
            "type": "boolean"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "asset_id"
        ],
        "type": "object"
      },
      "name": "github_download_release_asset"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Downloads a workflow-run log ZIP into XTester's GitHubDownloads directory as a background job. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required only when overwrite=true and the target exists.",
            "type": "boolean"
          },
          "file_name": {
            "description": "Optional safe output file name.",
            "type": "string"
          },
          "overwrite": {
            "description": "Overwrite an existing output file; requires confirm=true.",
            "type": "boolean"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "run_id": {
            "description": "Workflow run ID.",
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "run_id"
        ],
        "type": "object"
      },
      "name": "github_download_workflow_logs"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Generates release notes without creating a release. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "tag_name": {
            "description": "Tag for the release.",
            "type": "string"
          },
          "target_commitish": {
            "description": "Target branch or commit SHA.",
            "type": "string"
          }
        },
        "required": [
          "tag_name"
        ],
        "type": "object"
      },
      "name": "github_generate_release_notes"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Returns one branch, including protection state and the head commit. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "branch": {
            "description": "Branch name.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "branch"
        ],
        "type": "object"
      },
      "name": "github_get_branch"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Reads protection rules for one branch (read-only in v2). Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "branch": {
            "description": "Branch name.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "branch"
        ],
        "type": "object"
      },
      "name": "github_get_branch_protection"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Returns the combined commit status and individual status contexts. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "ref": {
            "description": "Commit SHA, branch or tag.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "ref"
        ],
        "type": "object"
      },
      "name": "github_get_commit_status"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Returns one issue with labels, assignees and milestone. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "number": {
            "description": "Issue/PR number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "github_get_issue"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Returns one pull request and current mergeability fields. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "number": {
            "description": "Issue/PR number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "github_get_pull_request"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Read-only merge preview from GitHub: mergeable, mergeable_state, draft, head/base SHA and links. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "number": {
            "description": "Issue/PR number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "github_get_pull_request_merge_preview"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Returns one release and its assets. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "release_id": {
            "description": "Release ID.",
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "release_id"
        ],
        "type": "object"
      },
      "name": "github_get_release"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Repository metadata, permissions, visibility, default branch and web links. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "github_get_repository"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Returns repository topics. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "github_get_topics"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Returns one workflow run. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "run_id": {
            "description": "Workflow run ID.",
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "run_id"
        ],
        "type": "object"
      },
      "name": "github_get_workflow_run"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists users who can be assigned to issues. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "github_list_assignees"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists GitHub branches and protection flags. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "protected": {
            "description": "Filter by protection state.",
            "type": "boolean"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "github_list_branches"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists GitHub Check runs for a commit SHA, branch or tag. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "check_name": {
            "description": "Filter by check name.",
            "type": "string"
          },
          "filter": {
            "description": "latest | all",
            "enum": [
              "latest",
              "all"
            ],
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "ref": {
            "description": "Commit SHA, branch or tag.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "status": {
            "description": "queued | in_progress | completed",
            "type": "string"
          }
        },
        "required": [
          "ref"
        ],
        "type": "object"
      },
      "name": "github_list_check_runs"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists repository collaborators and their permissions. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "affiliation": {
            "description": "outside | direct | all",
            "enum": [
              "outside",
              "direct",
              "all"
            ],
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "permission": {
            "description": "pull | triage | push | maintain | admin",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "github_list_collaborators"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists comments on an issue or pull request. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "number": {
            "description": "Issue/PR number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "since": {
            "description": "ISO-8601 lower update bound.",
            "type": "string"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "github_list_issue_comments"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists repository issues. GitHub's endpoint can also contain pull requests; inspect pull_request in each item. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "assignee": {
            "description": "Login, *, or none.",
            "type": "string"
          },
          "creator": {
            "description": "Creator login.",
            "type": "string"
          },
          "direction": {
            "description": "asc | desc",
            "enum": [
              "asc",
              "desc"
            ],
            "type": "string"
          },
          "labels": {
            "description": "Comma-separated label names.",
            "type": "string"
          },
          "mentioned": {
            "description": "Mentioned login.",
            "type": "string"
          },
          "milestone": {
            "description": "Milestone number, *, or none.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "since": {
            "description": "ISO-8601 lower update bound.",
            "type": "string"
          },
          "sort": {
            "description": "created | updated | comments",
            "enum": [
              "created",
              "updated",
              "comments"
            ],
            "type": "string"
          },
          "state": {
            "description": "open | closed | all",
            "enum": [
              "open",
              "closed",
              "all"
            ],
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "github_list_issues"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists repository labels. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "github_list_labels"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists repository milestones. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "direction": {
            "description": "asc | desc",
            "enum": [
              "asc",
              "desc"
            ],
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "sort": {
            "description": "due_on | completeness",
            "enum": [
              "due_on",
              "completeness"
            ],
            "type": "string"
          },
          "state": {
            "description": "open | closed | all",
            "enum": [
              "open",
              "closed",
              "all"
            ],
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "github_list_milestones"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists unread/all GitHub notifications for the bound repository or the whole account. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "all": {
            "description": "Include already-read notifications.",
            "type": "boolean"
          },
          "before": {
            "description": "ISO-8601 upper time bound.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "participating": {
            "description": "Only threads in which the user participates.",
            "type": "boolean"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "scope": {
            "description": "repository (default) | all",
            "enum": [
              "repository",
              "all"
            ],
            "type": "string"
          },
          "since": {
            "description": "ISO-8601 lower time bound.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "github_list_notifications"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists commits in a pull request. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "number": {
            "description": "Pull request number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "github_list_pull_request_commits"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists changed files and patches for a pull request. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "number": {
            "description": "Pull request number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "github_list_pull_request_files"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists submitted pull-request reviews. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "number": {
            "description": "Pull request number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "github_list_pull_request_reviews"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists pull requests. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "base": {
            "description": "Filter by base branch.",
            "type": "string"
          },
          "direction": {
            "description": "asc | desc",
            "enum": [
              "asc",
              "desc"
            ],
            "type": "string"
          },
          "head": {
            "description": "Filter by user:branch.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "sort": {
            "description": "created | updated | popularity | long-running",
            "type": "string"
          },
          "state": {
            "description": "open | closed | all",
            "enum": [
              "open",
              "closed",
              "all"
            ],
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "github_list_pull_requests"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists assets attached to one release. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "release_id": {
            "description": "Release ID.",
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "release_id"
        ],
        "type": "object"
      },
      "name": "github_list_release_assets"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists published and (with push access) draft releases. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "github_list_releases"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists the signed-in user's GitHub repositories (name, private flag, default branch).",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "github_list_repos"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists inline review comments for a pull request. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "number": {
            "description": "Pull request number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "since": {
            "description": "ISO-8601 lower update bound.",
            "type": "string"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "github_list_review_comments"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists Git tags in the GitHub repository. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "github_list_tags"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists artifacts created by a workflow run. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "name": {
            "description": "Artifact-name filter.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "run_id": {
            "description": "Workflow run ID.",
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "run_id"
        ],
        "type": "object"
      },
      "name": "github_list_workflow_artifacts"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists jobs and steps in a workflow run. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "filter": {
            "description": "latest | all",
            "enum": [
              "latest",
              "all"
            ],
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "run_id": {
            "description": "Workflow run ID.",
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "run_id"
        ],
        "type": "object"
      },
      "name": "github_list_workflow_jobs"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists Actions workflow runs, optionally for one workflow ID/file. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "actor": {
            "description": "Actor login.",
            "type": "string"
          },
          "branch": {
            "description": "Branch filter.",
            "type": "string"
          },
          "check_suite_id": {
            "description": "Check suite ID.",
            "minimum": 1,
            "type": "integer"
          },
          "created": {
            "description": "GitHub date-range syntax.",
            "type": "string"
          },
          "event": {
            "description": "Event filter.",
            "type": "string"
          },
          "exclude_pull_requests": {
            "description": "Omit pull_requests data.",
            "type": "boolean"
          },
          "head_sha": {
            "description": "Head commit SHA.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "status": {
            "description": "Run status/conclusion filter.",
            "type": "string"
          },
          "workflow_id": {
            "description": "Workflow numeric ID or file name.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "github_list_workflow_runs"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists repository Actions workflows. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "page": {
            "description": "1-based page number (default 1).",
            "minimum": 1,
            "type": "integer"
          },
          "per_page": {
            "description": "Items per page (default 30, max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "github_list_workflows"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Merges a pull request. Force push is intentionally unavailable. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "commit_message": {
            "description": "Merge commit body.",
            "type": "string"
          },
          "commit_title": {
            "description": "Merge commit title.",
            "type": "string"
          },
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "merge_method": {
            "description": "merge | squash | rebase",
            "enum": [
              "merge",
              "squash",
              "rebase"
            ],
            "type": "string"
          },
          "number": {
            "description": "Pull request number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "sha": {
            "description": "Expected PR head SHA (optimistic concurrency guard).",
            "type": "string"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "github_merge_pull_request"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Requests user and/or team reviewers. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "number": {
            "description": "Pull request number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "reviewers": {
            "description": "User logins.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "team_reviewers": {
            "description": "Team slugs.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "github_request_pull_request_reviewers"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Re-runs a workflow. This is separately confirmed because it can consume CI minutes. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "enable_debug_logging": {
            "description": "Enable runner diagnostic logging.",
            "type": "boolean"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "run_id": {
            "description": "Workflow run ID.",
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "run_id"
        ],
        "type": "object"
      },
      "name": "github_rerun_workflow"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Resolves a review thread by GraphQL node ID.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "thread_node_id": {
            "description": "PullRequestReviewThread node ID.",
            "type": "string"
          }
        },
        "required": [
          "thread_node_id"
        ],
        "type": "object"
      },
      "name": "github_resolve_review_thread"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Submits APPROVE, REQUEST_CHANGES, or COMMENT review. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "description": "Review body.",
            "type": "string"
          },
          "commit_id": {
            "description": "Commit SHA to review (default latest).",
            "type": "string"
          },
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "event": {
            "description": "APPROVE | REQUEST_CHANGES | COMMENT",
            "enum": [
              "APPROVE",
              "REQUEST_CHANGES",
              "COMMENT"
            ],
            "type": "string"
          },
          "number": {
            "description": "Pull request number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "number",
          "event"
        ],
        "type": "object"
      },
      "name": "github_submit_pull_request_review"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Updates, closes or reopens an issue and its labels/assignees/milestone. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "assignees": {
            "description": "Complete replacement assignee list.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "body": {
            "description": "New Markdown body.",
            "type": "string"
          },
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "labels": {
            "description": "Complete replacement label list.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "milestone": {
            "description": "Milestone number.",
            "minimum": 1,
            "type": "integer"
          },
          "number": {
            "description": "Issue number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "state": {
            "description": "open | closed",
            "enum": [
              "open",
              "closed"
            ],
            "type": "string"
          },
          "state_reason": {
            "description": "completed | not_planned | reopened | duplicate",
            "type": "string"
          },
          "title": {
            "description": "New title.",
            "type": "string"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "github_update_issue"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Updates or renames a repository label. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "color": {
            "description": "Six-character hex color without #.",
            "type": "string"
          },
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "current_name": {
            "description": "Current label name.",
            "type": "string"
          },
          "description": {
            "description": "New description; empty string clears it.",
            "type": "string"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "name": {
            "description": "New label name.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "current_name"
        ],
        "type": "object"
      },
      "name": "github_update_label"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Updates, closes or reopens a milestone. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "description": {
            "description": "New description; empty string clears it.",
            "type": "string"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "due_on": {
            "description": "ISO-8601 due date.",
            "type": "string"
          },
          "number": {
            "description": "Milestone number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "state": {
            "description": "open | closed",
            "enum": [
              "open",
              "closed"
            ],
            "type": "string"
          },
          "title": {
            "description": "New title.",
            "type": "string"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "github_update_milestone"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Updates title/body/base/state of a pull request. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "base": {
            "description": "New base branch.",
            "type": "string"
          },
          "body": {
            "description": "New Markdown body.",
            "type": "string"
          },
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "maintainer_can_modify": {
            "description": "Allow maintainer edits.",
            "type": "boolean"
          },
          "number": {
            "description": "Pull request number.",
            "minimum": 1,
            "type": "integer"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "state": {
            "description": "open | closed",
            "enum": [
              "open",
              "closed"
            ],
            "type": "string"
          },
          "title": {
            "description": "New title.",
            "type": "string"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "github_update_pull_request"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Updates a release; draft=false publishes an existing draft. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "description": "Markdown release notes.",
            "type": "string"
          },
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "draft": {
            "description": "Draft state.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "make_latest": {
            "description": "true | false | legacy",
            "enum": [
              "true",
              "false",
              "legacy"
            ],
            "type": "string"
          },
          "name": {
            "description": "Release name.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "prerelease": {
            "description": "Prerelease state.",
            "type": "boolean"
          },
          "release_id": {
            "description": "Release ID.",
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          },
          "tag_name": {
            "description": "Tag name.",
            "type": "string"
          },
          "target_commitish": {
            "description": "Target branch or commit SHA.",
            "type": "string"
          }
        },
        "required": [
          "release_id"
        ],
        "type": "object"
      },
      "name": "github_update_release"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Uploads a local file as a release asset in a background job. Explicit confirmation is required. Optional owner/repo override the GitHub repository bound to the current project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required to execute the remote mutation.",
            "type": "boolean"
          },
          "content_type": {
            "description": "MIME type (default application/octet-stream).",
            "type": "string"
          },
          "dry_run": {
            "description": "Return the exact operation preview without writing.",
            "type": "boolean"
          },
          "label": {
            "description": "Optional display label.",
            "type": "string"
          },
          "owner": {
            "description": "GitHub owner; omit with repo to use the bound remote.",
            "type": "string"
          },
          "path": {
            "description": "Absolute local file path.",
            "type": "string"
          },
          "release_id": {
            "description": "Release ID.",
            "minimum": 1,
            "type": "integer"
          },
          "repo": {
            "description": "GitHub repository name; omit with owner to use the bound remote.",
            "type": "string"
          }
        },
        "required": [
          "release_id",
          "path"
        ],
        "type": "object"
      },
      "name": "github_upload_release_asset"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Validates the stored GitHub token (or a provided one) by calling the API; returns the login. The token is never echoed or logged.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "token": {
            "description": "Optional; default = stored token.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "github_validate_token"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Searches the built-in XTester help (UI/how-to docs). Returns pages + headings with deep-links ('page.html#anchor'). For strategy-theory knowledge use query_knowledge_base.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "description": "Default 10.",
            "type": "integer"
          },
          "query": {
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "help_search"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Imports a local JSON/CSV m1 fixture for deterministic strategy tests. Safety boundary: the target symbol must start with XTTEST, confirm=true is mandatory, and an existing fixture is replaced only with replace_existing=true. Normal fixtures reject gaps and invalid OHLCV; allow_gaps / allow_invalid_bars must be enabled explicitly for negative tests. JSON fields: time,open,high,low,close,volume. CSV uses the same header.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "allow_gaps": {
            "description": "Allow intentional missing m1 timestamps",
            "type": "boolean"
          },
          "allow_invalid_bars": {
            "description": "Allow intentional invalid OHLCV bars",
            "type": "boolean"
          },
          "confirm": {
            "description": "Must be true; confirms a synthetic-data write",
            "type": "boolean"
          },
          "exchange": {
            "description": "e.g. Binance",
            "type": "string"
          },
          "format": {
            "description": "Optional; inferred from source extension",
            "enum": [
              "json",
              "csv"
            ],
            "type": "string"
          },
          "market": {
            "description": "Spot | FuturesUSDT | FuturesCoin",
            "type": "string"
          },
          "replace_existing": {
            "description": "Replace an existing XTTEST fixture atomically",
            "type": "boolean"
          },
          "source_path": {
            "description": "Local .json or .csv fixture path (max 64 MiB)",
            "type": "string"
          },
          "symbol": {
            "description": "Synthetic symbol beginning with XTTEST",
            "type": "string"
          }
        },
        "required": [
          "exchange",
          "market",
          "symbol",
          "source_path",
          "confirm"
        ],
        "type": "object"
      },
      "name": "import_history"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Validates a local immutable .xtmodel package with the pinned native runtime, then attaches it to the current project. Validation completes off the request thread before the project catalog is mutated. expected_id and confirm=true are mandatory; replacing a different artifact with the same logical ID additionally requires replace_existing=true. Returns metadata and hashes only, never model bytes or a local path.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be true; confirms a project-model mutation",
            "type": "boolean"
          },
          "expected_id": {
            "description": "Exact logical ID expected in the sealed manifest",
            "type": "string"
          },
          "path": {
            "description": "Local .xtmodel package path",
            "type": "string"
          },
          "replace_existing": {
            "description": "Replace a different attached artifact with the same logical ID",
            "type": "boolean"
          }
        },
        "required": [
          "path",
          "expected_id",
          "confirm"
        ],
        "type": "object"
      },
      "name": "import_strategy_model"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Downloads and installs the latest XTester update, then CLOSES XTester to apply it (this MCP process terminates; your client re-spawns the updated server on the next call). Only for installed (Velopack) builds. confirm=true is mandatory and is enforced by the server before any download, file write or process exit; dry_run=true returns the plan (current and target version, update source, restart requirement) without performing it.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be true; explicit server-side confirmation of this operation.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the plan without performing the operation. Takes precedence over confirm.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "name": "install_update"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Requests cancellation of a running background job. Args: jobId.",
      "inputSchema": {
        "properties": {
          "jobId": {
            "type": "string"
          }
        },
        "required": [
          "jobId"
        ],
        "type": "object"
      },
      "name": "job_cancel"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "State (running/done/failed/cancelled), progress tail and result of a background job (from lab_* actions). Args: jobId.",
      "inputSchema": {
        "properties": {
          "jobId": {
            "type": "string"
          }
        },
        "required": [
          "jobId"
        ],
        "type": "object"
      },
      "name": "job_status"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Applies a Lab strategy version's code to the CURRENT project (overwrites strategy files, saves .xtproj). Refuses without confirm=true while the GUI is running (two-writers rule).",
      "inputSchema": {
        "properties": {
          "confirm": {
            "description": "Required when the GUI is running (two-writers rule).",
            "type": "boolean"
          },
          "taskId": {
            "type": "string"
          },
          "versionNumber": {
            "type": "integer"
          }
        },
        "required": [
          "taskId",
          "versionNumber"
        ],
        "type": "object"
      },
      "name": "lab_apply_to_project"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Re-backtests an existing Lab version (no LLM). Optional exchange/market/symbol/timeframe/from/to override the research pair. Job result includes completed plus this attempt's current-Workspace Research Data runId/status. Returns a jobId; poll job_status. Args: taskId, versionNumber, [overrides].",
      "inputSchema": {
        "properties": {
          "exchange": {
            "type": "string"
          },
          "from": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "order_book": {
            "additionalProperties": false,
            "description": "Ephemeral synthetic order book override for this workflow only: {enabled, mode: Realistic|Teacher, teacher_strength, seed}. Teacher runs carry the indelible trainer mark.",
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "mode": {
                "enum": [
                  "Realistic",
                  "Teacher"
                ],
                "type": "string"
              },
              "seed": {
                "type": "integer"
              },
              "teacher_strength": {
                "type": "number"
              }
            },
            "type": "object"
          },
          "symbol": {
            "type": "string"
          },
          "taskId": {
            "type": "string"
          },
          "timeframe": {
            "type": "string"
          },
          "to": {
            "type": "string"
          },
          "versionNumber": {
            "type": "integer"
          }
        },
        "required": [
          "taskId",
          "versionNumber"
        ],
        "type": "object"
      },
      "name": "lab_backtest_version"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Compares two Lab strategy versions: structural genome diff + backtest metric deltas + walk-forward robustness + current-Workspace Research Data runId/status.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "taskId": {
            "type": "string"
          },
          "trainer_control": {
            "description": "Explicit trainer-control protocol: the ONLY sanctioned way to compare a Teacher (trainer) run with an honest one. The result is a research report, never an attestation.",
            "type": "boolean"
          },
          "versionA": {
            "type": "integer"
          },
          "versionB": {
            "type": "integer"
          }
        },
        "required": [
          "taskId",
          "versionA",
          "versionB"
        ],
        "type": "object"
      },
      "name": "lab_compare_versions"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Creates a new AI Research Lab task from a strategy specification (ТЗ). Returns taskId. No LLM/backtest yet — call lab_start_initial_strategy next. Args: title, spec.",
      "inputSchema": {
        "properties": {
          "spec": {
            "description": "strategy specification / ТЗ text",
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "title",
          "spec"
        ],
        "type": "object"
      },
      "name": "lab_create_research"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Research graph of a Lab task as JSON: nodes (task/genome/version/hypothesis/experiment/backtest/knowledge) + edges + the version parent chain.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "taskId": {
            "type": "string"
          }
        },
        "required": [
          "taskId"
        ],
        "type": "object"
      },
      "name": "lab_get_graph"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns one Research Lab task in detail: status, spec, user directives, token usage, and a summary of ALL its strategy versions (metrics + fitness score). Each version also reports the latest Research Data runId/status visible in the current Workspace. Args: taskId (from lab_list_research).",
      "inputSchema": {
        "properties": {
          "taskId": {
            "type": "string"
          }
        },
        "required": [
          "taskId"
        ],
        "type": "object"
      },
      "name": "lab_get_research"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Runtime health of a Lab version's backtest: telemetry (bars/signals/filters/orders/exit reasons), degenerate-run verdict, promotable-candidate flag.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "taskId": {
            "type": "string"
          },
          "versionNumber": {
            "type": "integer"
          }
        },
        "required": [
          "taskId",
          "versionNumber"
        ],
        "type": "object"
      },
      "name": "lab_get_runtime_health"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Full detail of one strategy version in a Research Lab task: source code, backtest summaries (executive / diagnostic / market / runtime-log), metrics, equity curve, fitness breakdown, and current-Workspace Research Data run associations (including failed/cancelled attempts). Args: taskId, versionNumber.",
      "inputSchema": {
        "properties": {
          "taskId": {
            "type": "string"
          },
          "versionNumber": {
            "type": "integer"
          }
        },
        "required": [
          "taskId",
          "versionNumber"
        ],
        "type": "object"
      },
      "name": "lab_get_version"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Runs one improvement experiment on a version (LLM: hypothesis→mutate genome→code→backtest→verdict). Long-running → jobId; poll job_status. Args: taskId, versionNumber, instruction.",
      "inputSchema": {
        "properties": {
          "instruction": {
            "type": "string"
          },
          "taskId": {
            "type": "string"
          },
          "versionNumber": {
            "type": "integer"
          }
        },
        "required": [
          "taskId",
          "versionNumber",
          "instruction"
        ],
        "type": "object"
      },
      "name": "lab_improve"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists the Strategy Library — best strategy versions across ALL research tasks with fitness, profit factor, return %, drawdown %, win rate, trades. Args: promotableOnly? (only valid ≥10-trade candidates without runtime defects).",
      "inputSchema": {
        "properties": {
          "promotableOnly": {
            "type": "boolean"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "lab_list_library"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists AI Research Lab tasks (the user's autonomous strategy-research experiments): id, title, status, project, last-updated. Read-only. Use lab_get_research for details of one.",
      "inputSchema": {
        "properties": {
          "project": {
            "description": "filter by project name (optional)",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "lab_list_research"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Renders the research graph as a self-contained interactive HTML file (same renderer as the GUI); returns the file path.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "taskId": {
            "type": "string"
          }
        },
        "required": [
          "taskId"
        ],
        "type": "object"
      },
      "name": "lab_render_graph"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Autonomous research loop from a version until target fitness or max iterations (LLM, can run for hours). Returns a jobId; poll job_status; cancel with job_cancel. tokenBudget is REQUIRED (safety cap on LLM spend). Args: taskId, versionNumber, targetFitness (0-100), maxIterations (1-500), tokenBudget.",
      "inputSchema": {
        "properties": {
          "maxIterations": {
            "type": "integer"
          },
          "targetFitness": {
            "type": "number"
          },
          "taskId": {
            "type": "string"
          },
          "tokenBudget": {
            "type": "integer"
          },
          "versionNumber": {
            "type": "integer"
          }
        },
        "required": [
          "taskId",
          "versionNumber",
          "targetFitness",
          "maxIterations",
          "tokenBudget"
        ],
        "type": "object"
      },
      "name": "lab_research_until"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Runs walk-forward analysis of a Lab version as a background job (full period + thirds, freshest = out-of-sample; needs >=120 days of data for OOS windows). Poll job_status.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "taskId": {
            "type": "string"
          },
          "trainer_control": {
            "description": "Required when the effective order book configuration is Teacher: walk-forward over a trainer configuration is a research protocol, not an attestation.",
            "type": "boolean"
          },
          "versionNumber": {
            "type": "integer"
          }
        },
        "required": [
          "taskId",
          "versionNumber"
        ],
        "type": "object"
      },
      "name": "lab_run_walk_forward_job"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Runs the Research Lab selftests headless as a background job (storage smoke, dialog pipeline with fake LLM in temp store, blocker, plateau). Poll job_status.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "lab_selftest"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Generates the FIRST strategy version for a research task (LLM: contract→genome→code→backtest→fitness). Long-running → returns a jobId; poll job_status. Args: taskId.",
      "inputSchema": {
        "properties": {
          "taskId": {
            "type": "string"
          }
        },
        "required": [
          "taskId"
        ],
        "type": "object"
      },
      "name": "lab_start_initial_strategy"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Runs the deterministic headless backtest of a bundle file as a background job (the same byte-identical run the Launcher uses to verify a bundle). Poll job_status; report also lands in launcher_get_bundle_report. Optional parameter_overrides replace the named bundle values for this run only and are validated before OnInit.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "parameter_overrides": {
            "additionalProperties": {
              "oneOf": [
                {
                  "type": "string"
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                }
              ]
            },
            "description": "Exact C# [Parameter] property name -> scalar value. Named entries override bundle values for this run only.",
            "type": "object"
          },
          "path": {
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "type": "object"
      },
      "name": "launcher_backtest_bundle_job"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Exports the current project as a Launcher bundle (JSON: sources, symbol, period, deposit; no secrets). Compile gate first (refuses on errors). Snapshot of the loaded project — unsaved GUI editor buffers are NOT included.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "overwrite": {
            "description": "Replace an existing file (default false).",
            "type": "boolean"
          },
          "path": {
            "description": "Target file (default: Launcher/Bundles dir with timestamp name).",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "launcher_export_bundle"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the report of the last completed bundle backtest in this session.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "launcher_get_bundle_report"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Loads and summarizes a Launcher bundle file (validates schema).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "path": {
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "type": "object"
      },
      "name": "launcher_load_bundle"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Launcher readiness check of a bundle: sources, compile, warm-up data, exchange reachability (real network ping for DEX), live keys/risk limits when the bundle is live-mode. It may perform network/account reads, but never starts a worker or places, cancels, or closes orders. Success is not Testnet real-order acceptance and does not clear durable quarantine. Returns ready flag + check lines.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "path": {
            "description": "Bundle file; omit to preflight the CURRENT project as a bundle.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "launcher_preflight"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists conversion runs stored in the current isolated project workspace. Returns bounded metadata only: no source content and no machine-local paths. Git inputs use a generic source label rather than a repository name or location.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "list_conversion_runs"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists downloaded 1m candle history on disk with its date coverage (exchange/market/symbol + first/last candle date + approx count). Call before run_backtest / get_klines to see what data exists and its range.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "list_data_coverage"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists exchanges supported by the tester (with isDex flag).",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "list_exchanges"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Funding-rate history cache coverage: per cached symbol — points count and covered range.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "list_funding_coverage"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists every numeric series recorded during the LAST run_backtest: built-in indicators the strategy called (EMA/RSI/...) AND custom series it wrote via Plot(name, value) — e.g. market-phase labels. Use get_indicator_series to fetch the points (full resolution, paginated).",
      "inputSchema": {
        "properties": {},
        "required": [],
        "type": "object"
      },
      "name": "list_indicator_series"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the FULL catalog of available indicators with their exact signatures. Use when choosing an indicator ('what volatility indicators exist?') or when unsure which indicators are available at all.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "list_indicators"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Lists models of an LLM provider (live API when supported, else the configured list).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "providerId": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_llm_models"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Configured LLM providers (REDACTED: only hasKey flag — keys are never returned).",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "list_llm_providers"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists market types (Spot, FuturesUSDT, FuturesCoin, ...). Per-exchange support varies — verify with list_symbols for a concrete exchange+market.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "list_markets"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists XTester project workspaces previously opened on this machine. Returns project name, the short windowTag shown in the GUI title, kind, external ID/origin, stable workspace ID, optional source .xtproj, working snapshot, last activity, and whether the matching GUI or an MCP agent is active. This is the mandatory first call when the MCP server starts without an explicit project. The general catalog is capped; pass an exact workspace_id to look up a known workspace independently of that cap. It never scans the whole disk.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "workspace_id": {
            "description": "Optional exact stable workspace ID for a direct validated lookup outside the bounded general catalog.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_project_workspaces"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the latest (or an exact run_id) Research Data manifest plus a bounded page of retained run summaries from the current bound XTester workspace, including actual status, partial flags, datasets, and verified absolute local paths. It never accepts a workspace root or arbitrary path.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "run_id": {
            "description": "Exact research run ID. Omit to use the latest run in the bound workspace.",
            "maxLength": 128,
            "minLength": 1,
            "pattern": "^[A-Za-z0-9_-]+$",
            "type": "string"
          },
          "run_limit": {
            "default": 25,
            "description": "Retained run summaries to return for discovery.",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "run_offset": {
            "default": 0,
            "description": "Zero-based offset in retained run history.",
            "minimum": 0,
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "list_research_datasets"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists the project's simulation time-breakpoints. They fire only when breakpoints_enabled=true in simulation_configure.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "list_simulation_breakpoints"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists specification versions (newest first): number, created, source, note, model.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "list_spec_versions"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists logical Strategy AI slots of the active launch profile. Returns bounded metadata, limits, replay mode and readiness only. It never returns provider/model identity, endpoint, headers, API keys, prompts, responses, strategy values or replay contents. Use an exact id to inspect one slot before generating AiProviders.Open code.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Optional exact logical slot ID",
            "maxLength": 64,
            "pattern": "^[a-z][a-z0-9._-]{0,63}$",
            "type": "string"
          },
          "limit": {
            "description": "Slots per page (default/max 16)",
            "type": "integer"
          },
          "offset": {
            "description": "Catalog offset (default 0)",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "list_strategy_ai_slots"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Structured JSON catalog of the API available to strategy code: interfaces (IStrategy, IApi, StrategyContext, StrategyFinishContext, IStrategyRuntime, IIndicators, IStrategyParams, IMarketData, ILogger, IKline, ...), concrete models (SymbolKey, PlaceOrder, Order, Position, Balance, Trade) and enums (OrderSide, OrderType, PositionSide, ...). Use get_strategy_api_doc for per-type details and XML docs.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "list_strategy_api"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists all source files of the currently active trading strategy. Use this first when exploring an unknown strategy.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "list_strategy_files"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists the default imports (auto-usings) the compiler automatically injects into every strategy file, plus ambient symbols (time/Now). Do NOT write these usings yourself — they are already there.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "list_strategy_imports"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists the host-managed ONNX model contracts attached to the current strategy project. Returns only logical IDs, pinned input/feature/output schemas, hashes and training boundaries; never model bytes, local paths, feature values or predictions. Results are bounded and paged. First list models, then pass an exact id and follow nextFeatureOffset until null before writing a Models.Open/Predict call.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "feature_limit": {
            "description": "Feature names per model/page (default 64, max 64)",
            "type": "integer"
          },
          "feature_offset": {
            "description": "Feature-name offset (default 0)",
            "type": "integer"
          },
          "id": {
            "description": "Optional exact logical model ID",
            "type": "string"
          },
          "model_limit": {
            "description": "Models per page (default 4, max 4)",
            "type": "integer"
          },
          "model_offset": {
            "description": "Catalog offset without id (default 0)",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "list_strategy_models"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the strategy's virtual file tree (folders + files, incl. disabled files and nested paths like 'Indicators/MyAtr.cs') as JSON: { flat, folders, tree }. The strategy lives inside the .xtproj — these are virtual paths, not files on disk.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "list_strategy_tree"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Lists saved strategy versions with timestamps, source (Manual/CouncilGenerated/AiAssistedEdit/...) and a one-line note. Useful before potentially destructive changes to know rollback points.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "list_strategy_versions"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Symbol catalog for exchange+market (tickSize/stepSize/minNotional/...). Served from the persisted cache; a cold cache hits the exchange REST API (may take seconds). An empty list can mean either 'no symbols' or 'network failure'.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "exchange": {
            "type": "string"
          },
          "limit": {
            "description": "Max returned (default 200).",
            "type": "integer"
          },
          "market": {
            "description": "Spot | FuturesUSDT | FuturesCoin",
            "type": "string"
          },
          "query": {
            "description": "Optional substring filter (symbol/base/quote).",
            "type": "string"
          }
        },
        "required": [
          "exchange",
          "market"
        ],
        "type": "object"
      },
      "name": "list_symbols"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Loads the stored 1m history file of exchange+market+symbol into RAM (required before the engine can read it) and remembers the choice in the project. If there is no stored file — call download_history first.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "exchange": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "symbol": {
            "type": "string"
          }
        },
        "required": [
          "exchange",
          "market",
          "symbol"
        ],
        "type": "object"
      },
      "name": "load_history_to_memory"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Moves or renames a strategy file to another virtual path (e.g. 'helpers.cs' → 'Lib/helpers.cs'). Cannot move main.cs. Fails if the source is missing or the target path already exists.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "from": {
            "description": "Existing file path, e.g. 'helpers.cs'.",
            "type": "string"
          },
          "to": {
            "description": "New file path, e.g. 'Lib/helpers.cs'.",
            "type": "string"
          }
        },
        "required": [
          "from",
          "to"
        ],
        "type": "object"
      },
      "name": "move_strategy_file"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Opens an existing .xtproj by absolute path, registers its workspace, and locks this MCP process to it. Use only after the user chose 'open another project'; confirm=true is mandatory. Existing workspace autosave wins over an older source file.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "type": "boolean"
          },
          "path": {
            "description": "Absolute path to an existing .xtproj.",
            "type": "string"
          }
        },
        "required": [
          "path",
          "confirm"
        ],
        "type": "object"
      },
      "name": "open_project_workspace"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Deep-probes one model (JSON mode, streaming, latency, output cap — 4 live tests, 30s+) as a background job. Poll job_status.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "model": {
            "type": "string"
          },
          "providerId": {
            "type": "string"
          }
        },
        "required": [
          "model"
        ],
        "type": "object"
      },
      "name": "probe_llm_model_job"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Proxy subsystem state: static config (enabled, pool size/health, limits — WITHOUT credentials) + runtime download counters of THIS process (the GUI's live counters are not visible here; use get_gui_state for the GUI session).",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "proxy_get_runtime"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Searches the local knowledge base under .aicopilot/knowledge/ for relevant snippets. Use when you need detailed reference: API docs, indicator details, common patterns, pitfalls.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "question": {
            "description": "Free-text question.",
            "type": "string"
          },
          "top_k": {
            "default": 3,
            "description": "Number of best chunks to return (default 3).",
            "maximum": 10,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "question"
        ],
        "type": "object"
      },
      "name": "query_knowledge_base"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Resolves one Research Data CSV from the current bound XTester workspace. With limit=0 (default), returns only its verified absolute path and metadata. With limit=1..10000, also returns columns and a bounded page of rows. Omit run_id to use the latest run. It never accepts a workspace root or arbitrary path.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "default": 0,
            "description": "Rows to return. Zero returns path and metadata only.",
            "maximum": 10000,
            "minimum": 0,
            "type": "integer"
          },
          "name": {
            "description": "Dataset name from list_research_datasets.",
            "maxLength": 64,
            "minLength": 1,
            "pattern": "^[a-z0-9-]+$",
            "type": "string"
          },
          "offset": {
            "default": 0,
            "description": "Zero-based CSV data-row offset.",
            "minimum": 0,
            "type": "integer"
          },
          "run_id": {
            "description": "Exact research run ID. Omit to use the latest run in the bound workspace.",
            "maxLength": 128,
            "minLength": 1,
            "pattern": "^[A-Za-z0-9_-]+$",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "read_research_dataset"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Returns the full text content of a strategy source file. Always call this before applying any patch — the model needs the actual current state.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "filename": {
            "description": "File name like 'main.cs' or 'helpers.cs'.",
            "type": "string"
          }
        },
        "required": [
          "filename"
        ],
        "type": "object"
      },
      "name": "read_strategy_file"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Detaches the model artifact with the exact logical ID from the current project catalog (same operation as the GUI model manager's delete). confirm=true is mandatory. Files on disk are not touched; strategy code still opening the ID fails closed on its next run. Blocked while a simulation or Research Lab runs.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be true; confirms a project-model mutation",
            "type": "boolean"
          },
          "id": {
            "description": "Exact logical model ID from list_strategy_models",
            "type": "string"
          }
        },
        "required": [
          "id",
          "confirm"
        ],
        "type": "object"
      },
      "name": "remove_strategy_model"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Renames a strategy source file. Note: any references in OTHER files won't be auto-updated — use search_strategy_code + apply_strategy_patch to fix them.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "new_name": {
            "type": "string"
          },
          "old_name": {
            "type": "string"
          }
        },
        "required": [
          "old_name",
          "new_name"
        ],
        "type": "object"
      },
      "name": "rename_strategy_file"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Renames or moves a virtual strategy folder, cascading ALL files and subfolders under it to the new prefix. Fails if the folder doesn't exist, the paths are equal, or a target file path would collide with an existing file.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "new_path": {
            "description": "New folder path, e.g. 'Lib/Indicators'.",
            "type": "string"
          },
          "old_path": {
            "description": "Existing folder, e.g. 'Indicators'.",
            "type": "string"
          }
        },
        "required": [
          "old_path",
          "new_path"
        ],
        "type": "object"
      },
      "name": "rename_strategy_folder"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Semantic SYMBOL rename via Roslyn Renamer (NOT a file rename — that's rename_strategy_file). Position the cursor on the symbol. apply=false returns the edits; apply=true rewrites the file. Note: edits cover the active file only (editor engine v1).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "apply": {
            "description": "Apply edits to the file. Default false (dry-run).",
            "type": "boolean"
          },
          "column": {
            "type": "integer"
          },
          "filename": {
            "type": "string"
          },
          "line": {
            "type": "integer"
          },
          "new_name": {
            "description": "New C# identifier.",
            "type": "string"
          }
        },
        "required": [
          "filename",
          "line",
          "column",
          "new_name"
        ],
        "type": "object"
      },
      "name": "rename_strategy_symbol"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Renders the LAST backtest as PNG: price chart with trade markers + order levels over the tested period, with the equity curve panel below. Requires a completed run_backtest in this session.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "height": {
            "type": "integer"
          },
          "output": {
            "description": "Default 'file'.",
            "enum": [
              "file",
              "base64",
              "image"
            ],
            "type": "string"
          },
          "width": {
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "render_backtest_chart"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Renders a candlestick PNG chart (offscreen, not a GUI screenshot): candles + open-order levels + trade markers + indicator lines the strategy computed. Default symbol/window = current simulation selection / loaded data tail. output: 'file' (PNG path — read it), 'base64', or 'image' (inline image block).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "bars_count": {
            "description": "Bars when from/to omitted (default 200).",
            "type": "integer"
          },
          "exchange": {
            "type": "string"
          },
          "from": {
            "description": "ISO-8601 UTC.",
            "type": "string"
          },
          "height": {
            "type": "integer"
          },
          "indicators": {
            "description": "Indicator name filter.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "market": {
            "type": "string"
          },
          "output": {
            "description": "Default 'file'.",
            "enum": [
              "file",
              "base64",
              "image"
            ],
            "type": "string"
          },
          "show_all_indicators": {
            "type": "boolean"
          },
          "show_orders": {
            "description": "Open-order level lines (default true).",
            "type": "boolean"
          },
          "show_trade_markers": {
            "description": "Trade entry/exit dots (default false).",
            "type": "boolean"
          },
          "symbol": {
            "type": "string"
          },
          "timeframe": {
            "description": "m1..d1 (default: simulation timeframe).",
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "to": {
            "description": "ISO-8601 UTC.",
            "type": "string"
          },
          "width": {
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "render_price_chart"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Renders a statistics chart of the LAST backtest as PNG. kind: equity | drawdown | monthly_returns | pnl_distribution | rolling_sharpe | rolling_return_cagr | returns_distribution | cumulative_pnl_by_trade | exposure_over_time.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "height": {
            "type": "integer"
          },
          "kind": {
            "description": "equity | drawdown | monthly_returns | pnl_distribution | rolling_sharpe | ...",
            "type": "string"
          },
          "output": {
            "description": "Default 'file'.",
            "enum": [
              "file",
              "base64",
              "image"
            ],
            "type": "string"
          },
          "width": {
            "type": "integer"
          }
        },
        "required": [
          "kind"
        ],
        "type": "object"
      },
      "name": "render_statistics_chart"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Heals internal gaps in stored 1m history: detects gaps, re-downloads each gap window from the exchange and merges the candles into the stored series (background job → poll job_status). Gaps the exchange confirms empty (no trades / maintenance) are recorded in a persistent gap registry and skipped on future runs (shared with the GUI Data window). Args: exchange, market, symbol, from?, to?, max_gaps (default 20), recheck_known?.",
      "inputSchema": {
        "properties": {
          "exchange": {
            "type": "string"
          },
          "from": {
            "description": "ISO-8601 UTC; only repair gaps intersecting [from,to]",
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "max_gaps": {
            "description": "Max gaps to repair in one job (default 20, cap 200).",
            "type": "integer"
          },
          "recheck_known": {
            "description": "Re-probe gaps already recorded as exchange-side (default false).",
            "type": "boolean"
          },
          "symbol": {
            "type": "string"
          },
          "to": {
            "type": "string"
          }
        },
        "required": [
          "exchange",
          "market",
          "symbol"
        ],
        "type": "object"
      },
      "name": "repair_data_gaps"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Explicit, confirmed repair of the historical x100 DEX fee defect. Trading fees are a numeric simulation input, so nothing is repaired silently and no ordinary load, save or read path touches them. dry_run=true (default behaviour when confirm is absent) reports each candidate with its exchange, market, field, value before and after, and the reason, and changes nothing. confirm=true repairs only values consistent with the historical defect; a value large enough to be an ordinary hand-typed percent is never changed and is reported for manual review instead. The repair is exactly-once by construction: a repaired value falls below the candidate threshold, so a second run finds nothing.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be true; explicit server-side confirmation of this repair.",
            "type": "boolean"
          },
          "dry_run": {
            "description": "Return the plan without performing the operation. Takes precedence over confirm.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "name": "repair_dex_fee_migration"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Replaces ALL simulation breakpoints with the given list (empty list = clear all).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "breakpoints": {
            "items": {
              "properties": {
                "enabled": {
                  "type": "boolean"
                },
                "label": {
                  "type": "string"
                },
                "time": {
                  "type": "string"
                }
              },
              "required": [
                "time"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "breakpoints"
        ],
        "type": "object"
      },
      "name": "replace_simulation_breakpoints"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Restores a spec version by number. The current spec is first auto-saved as a Manual backup version (so the counter bumps by one). confirm=true required while GUI runs.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "type": "boolean"
          },
          "number": {
            "type": "integer"
          }
        },
        "required": [
          "number"
        ],
        "type": "object"
      },
      "name": "restore_spec_version"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Restores the strategy from a previously saved StrategyVersion. DESTRUCTIVE: the current sources are overwritten and files absent from the version are removed. Before overwriting, the current state is snapshotted as a new backup version, and a failed restore rolls back instead of leaving a partial state. confirm=true is mandatory and is enforced by the MCP server before anything changes, so a call without it changes nothing.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be true; explicit server-side confirmation of this destructive restore.",
            "type": "boolean"
          },
          "version_id": {
            "description": "ID from list_strategy_versions.",
            "type": "string"
          }
        },
        "required": [
          "version_id"
        ],
        "type": "object"
      },
      "name": "restore_strategy_version"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Compiles and backtests the CURRENT project strategy headless. Any of exchange/market/symbol/timeframe/from/to/deposit overrides the Simulator config; unset args fall back to it. Runs in Bar mode by default (deterministic candle stepping); pass step_mode='Tick' only if you have tick data. parameter_overrides maps exact C# [Parameter] property names to scalar values and is validated before OnInit; an unknown, duplicate, invalid or out-of-range value blocks the run. Streams live progress via MCP notifications. Returns metrics (return %, drawdown %, profit factor, win rate, trades, orders); then call get_backtest_trades / get_equity_curve for details. One backtest at a time per process.",
      "inputSchema": {
        "properties": {
          "context_symbols": {
            "description": "Additional symbols loaded for the run as \"Exchange/Market/Symbol\" (native m1). The strategy reads them causally via GetKlines (e.g. BTC trend context for an alt run). Data must exist on disk.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "deposit": {
            "description": "virtual quote deposit (default 10000)",
            "type": "number"
          },
          "exchange": {
            "description": "e.g. Binance (default: Simulator config)",
            "type": "string"
          },
          "from": {
            "description": "ISO-8601 UTC period start",
            "type": "string"
          },
          "market": {
            "description": "Spot | FuturesUSDT | FuturesCoin",
            "type": "string"
          },
          "order_book": {
            "additionalProperties": false,
            "description": "Ephemeral synthetic order book override for this workflow only (never persisted): {enabled, mode: Realistic|Teacher, teacher_strength, seed}. Teacher runs carry the indelible trainer mark. Pass null to clear the override.",
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "mode": {
                "enum": [
                  "Realistic",
                  "Teacher"
                ],
                "type": "string"
              },
              "seed": {
                "type": "integer"
              },
              "teacher_strength": {
                "type": "number"
              }
            },
            "type": "object"
          },
          "parameter_overrides": {
            "additionalProperties": {
              "oneOf": [
                {
                  "type": "string"
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                }
              ]
            },
            "description": "Exact C# [Parameter] property name -> scalar value. Applied before OnInit; all entries are validated atomically.",
            "type": "object"
          },
          "step_mode": {
            "description": "Bar (default) | Tick",
            "type": "string"
          },
          "symbol": {
            "description": "e.g. BTCUSDT",
            "type": "string"
          },
          "timeframe": {
            "description": "m1,m5,m15,h1,h4,d1 (also accepts 1m/1h)",
            "type": "string"
          },
          "to": {
            "description": "ISO-8601 UTC period end",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "run_backtest"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Snapshots the CURRENT specification as a new spec version (dedupes against the last one).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "note": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "save_spec_version"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Saves a snapshot of the current strategy state as a new StrategyVersion (Source=AiAssistedEdit). Call BEFORE risky multi-file edits and AFTER a task is successfully completed.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "note": {
            "description": "Short description of what was done / about to be done.",
            "type": "string"
          }
        },
        "required": [
          "note"
        ],
        "type": "object"
      },
      "name": "save_strategy_version"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Searches strategy source files using a .NET regex. Returns matching lines with file:line prefix. Use to find references, occurrences of names, TODOs, etc.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "filenames": {
            "description": "Optional list of files to search; default — all.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "regex": {
            "description": ".NET-style regex pattern.",
            "type": "string"
          }
        },
        "required": [
          "regex"
        ],
        "type": "object"
      },
      "name": "search_strategy_code"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Searches the symbol catalog of exchange+market by substring (symbol/baseAsset/quoteAsset).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "exchange": {
            "type": "string"
          },
          "limit": {
            "description": "Max returned (default 50).",
            "type": "integer"
          },
          "market": {
            "type": "string"
          },
          "query": {
            "type": "string"
          }
        },
        "required": [
          "exchange",
          "market",
          "query"
        ],
        "type": "object"
      },
      "name": "search_symbols"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Locks this MCP process to one workspace returned by list_project_workspaces. confirm=true means the user selected or explicitly named this exact project. Selection is idempotent for the same workspace and cannot switch to another workspace inside this process.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Must be true after the user selected or explicitly named this exact workspace.",
            "type": "boolean"
          },
          "workspace_id": {
            "type": "string"
          }
        },
        "required": [
          "workspace_id",
          "confirm"
        ],
        "type": "object"
      },
      "name": "select_project_workspace"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Sets the strategy launch mode (Debug|Release). Release disables safety instrumentation AND code breakpoints — an infinite loop in strategy code will hang headless runs.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "type": "boolean"
          },
          "mode": {
            "enum": [
              "Debug",
              "Release"
            ],
            "type": "string"
          }
        },
        "required": [
          "mode"
        ],
        "type": "object"
      },
      "name": "set_launch_mode"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Writes synthetic order book settings through the same validation/persistence path as the GUI. `profile` edits the ACTIVE launch profile semantics (Realistic/Teacher, α, seed policy); `engine` edits machine-local engine settings. With a prepared/running session the response carries restartRequired=true — semantics apply on the next prepare/fresh start. Requires confirm=true.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "type": "boolean"
          },
          "engine": {
            "additionalProperties": false,
            "properties": {
              "dom_max_fps": {
                "type": "integer"
              },
              "max_active_order_books": {
                "type": "integer"
              },
              "visible_depth": {
                "type": "integer"
              }
            },
            "type": "object"
          },
          "profile": {
            "additionalProperties": false,
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "fixed_seed": {
                "type": "integer"
              },
              "mode": {
                "enum": [
                  "Realistic",
                  "Teacher"
                ],
                "type": "string"
              },
              "seed_policy": {
                "enum": [
                  "Random",
                  "Fixed"
                ],
                "type": "string"
              },
              "teacher_strength": {
                "description": "α 0..1",
                "type": "number"
              }
            },
            "type": "object"
          }
        },
        "required": [
          "confirm"
        ],
        "type": "object"
      },
      "name": "set_order_book_settings"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Updates project name/description/version. Metadata participates in the live-sync three-way merge, so an open GUI picks the change up instead of overwriting it; confirm=true is still required while the GUI is running (two-writers rule).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "description": "Required when the GUI is running (two-writers rule).",
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "set_project_metadata"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Updates simulation settings SESSION-SCOPED (in-memory of this MCP process; never persisted to the user's app.config — two-writers rule). Affects subsequent run_backtest defaults in this session. For a full interactive session prefer simulation_configure.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "exchange": {
            "type": "string"
          },
          "from": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "reset_state_before_start": {
            "type": "boolean"
          },
          "step_mode": {
            "enum": [
              "Bar",
              "Tick"
            ],
            "type": "string"
          },
          "symbol": {
            "type": "string"
          },
          "timeframe": {
            "type": "string"
          },
          "to": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "set_simulation_settings"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Enables or disables a strategy source file. Disabled files are kept in the project but excluded from compilation. Cannot disable main.cs (it's always enabled).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "filename": {
            "type": "string"
          }
        },
        "required": [
          "filename",
          "enabled"
        ],
        "type": "object"
      },
      "name": "set_strategy_file_enabled"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Configures the simulation session IN-MEMORY (never persisted to user settings): symbol, period, deposit, step mode (Bar|Tick), auto-pause flags, breakpoints_enabled. Visualization is forced Headless. Follow with simulation_prepare_fresh_start.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "breakpoints_enabled": {
            "description": "Enable time-breakpoints (AutoPause.OnChartBreakpoint).",
            "type": "boolean"
          },
          "deposit": {
            "description": "Virtual quote deposit (clears the market bucket for determinism).",
            "type": "number"
          },
          "exchange": {
            "type": "string"
          },
          "from": {
            "description": "Period start, ISO-8601 UTC.",
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "order_book": {
            "additionalProperties": false,
            "description": "Ephemeral synthetic order book override for this workflow only: {enabled, mode: Realistic|Teacher, teacher_strength, seed}. Applied on the next prepare_fresh_start; null clears the override.",
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "mode": {
                "enum": [
                  "Realistic",
                  "Teacher"
                ],
                "type": "string"
              },
              "seed": {
                "type": "integer"
              },
              "teacher_strength": {
                "type": "number"
              }
            },
            "type": "object"
          },
          "pause_on_error": {
            "type": "boolean"
          },
          "pause_on_order_filled": {
            "type": "boolean"
          },
          "pause_on_order_placed": {
            "type": "boolean"
          },
          "pause_on_position_closed": {
            "type": "boolean"
          },
          "pause_on_position_opened": {
            "type": "boolean"
          },
          "step_mode": {
            "description": "Bar = bar-by-bar (default), Tick = tick_time_seconds per step.",
            "enum": [
              "Bar",
              "Tick"
            ],
            "type": "string"
          },
          "symbol": {
            "type": "string"
          },
          "tick_time_seconds": {
            "description": "Tick mode: seconds per step.",
            "type": "integer"
          },
          "timeframe": {
            "description": "m1..d1",
            "type": "string"
          },
          "to": {
            "description": "Period end, ISO-8601 UTC.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "simulation_configure"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Execution events of the session (OrderPlaced/Filled/Rejected, PositionOpened/Closed, StopTriggered, Error). Ring buffer of the last 512 events.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "kind": {
            "description": "Optional filter, e.g. 'OrderRejected'.",
            "type": "string"
          },
          "limit": {
            "description": "Default 50.",
            "type": "integer"
          },
          "offset": {
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "simulation_get_events"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Execution counters of the current simulation session: steps, OnBar calls, orders placed/cancelled/filled, trades, balance warnings, buffer sizes.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "simulation_get_execution_stats"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Trade fills of the current session (chronological, paginated).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "description": "Default 50.",
            "type": "integer"
          },
          "offset": {
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "simulation_get_fills"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Best bid/ask, spread (price and bps), model time and snapshot revision of the synthetic book.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "exchange": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "symbol": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "simulation_get_order_book_bid_ask"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Public synthetic book events (Add/Cancel/Modify/Trade) after a sequence cursor. Pass the simulation_instance_token from a previous response: a token from an older run returns stale_simulation_token with the current token instead of applying the cursor.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "after_sequence": {
            "type": "integer"
          },
          "exchange": {
            "type": "string"
          },
          "limit": {
            "description": "Clamped 1..500 (default 200).",
            "type": "integer"
          },
          "market": {
            "type": "string"
          },
          "simulation_instance_token": {
            "type": "string"
          },
          "symbol": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "simulation_get_order_book_events"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "One aggregated synthetic book level by exact price (null when the price has no level).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "exchange": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "price": {
            "type": "number"
          },
          "symbol": {
            "type": "string"
          }
        },
        "required": [
          "price"
        ],
        "type": "object"
      },
      "name": "simulation_get_order_book_level"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Synthetic order book snapshot of the current interactive simulation: bids/asks with cumulative depth, reference/last-trade price, coverage, aggregates (imbalance, walls) and the trainer mark. Read-only: never activates the runtime.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "depth": {
            "description": "Levels per side, clamped 1..1000 and by the profile's ActiveLevelsPerSide (default 50).",
            "type": "integer"
          },
          "exchange": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "symbol": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "simulation_get_order_book_snapshot"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Interactive simulation state: running/paused/stopped, sim time, symbol/timeframe, pause reason (time-breakpoint hit / auto-pause event / code breakpoint / missing data), execution counters, open positions.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "simulation_get_state"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Equity/exposure valuation curve of the current session (even-thinned to max_points).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "max_points": {
            "description": "Default 500.",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "simulation_get_valuation_curve"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Pauses the running simulation (keeps position; resume with simulation_start_job or step). Also flushes the run's buffered Research Data rows to disk, so a paused run can be read without a read tool having to write anything.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "simulation_pause"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Prepares a FRESH simulation session: compiles the strategy if needed, loads history, clamps the period to data, restores account/strategy baselines and resets to period start. After this use simulation_step or simulation_start_job.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "simulation_prepare_fresh_start"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Starts/resumes the simulation as a background job (poll job_status). Runs until the period end, a time-breakpoint, an auto-pause event or job_cancel (= pause). Resume keeps the paused position; a finished/unprepared session is prepared fresh automatically. Passing parameter_overrides forces a fresh preparation and validates the complete [Parameter] map before OnInit; omit it to resume unchanged.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "parameter_overrides": {
            "additionalProperties": {
              "oneOf": [
                {
                  "type": "string"
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                }
              ]
            },
            "description": "Exact C# [Parameter] property name -> scalar value. Forces a fresh start and is validated atomically before OnInit.",
            "type": "object"
          }
        },
        "type": "object"
      },
      "name": "simulation_start_job"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Advances the simulation step-by-step (Bar mode: one bar per step). Stops early on time-breakpoint / auto-pause / code breakpoint / missing data. First step pays Strategy.OnInit. Auto-prepares a fresh session when needed.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "count": {
            "description": "Steps to execute (default 1, max 10000).",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "name": "simulation_step"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Stops the simulation and resets the runtime to period start (accounts/strategy baseline restored, stats wiped). Snapshot events/fills/valuation BEFORE stopping if you need them.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "simulation_stop"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Synchronizes RAM market data with the active run's symbol requirements: loads missing stored files, optionally unloads unused symbols (same step the engine does before a run).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "unload_unused": {
            "description": "Also unload symbols not needed by the run (default true).",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "name": "sync_loaded_market_data"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Pulls real maker/taker trading fees from the exchange into the account's simulation profile. NETWORK; private endpoints need credentials configured in Accounts (secrets are never returned). Default applies IN-MEMORY only (affects backtests of this process); persist=true also writes user settings (may race a live GUI — prefer doing it in GUI).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "exchange": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "persist": {
            "description": "Also save user settings (default false).",
            "type": "boolean"
          },
          "reference_symbol": {
            "description": "Symbol to query fees for (default: current).",
            "type": "string"
          }
        },
        "required": [
          "exchange",
          "market"
        ],
        "type": "object"
      },
      "name": "sync_trading_fees"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Unloads a symbol's history from RAM and remembers the choice in the project.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "exchange": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "symbol": {
            "type": "string"
          }
        },
        "required": [
          "exchange",
          "market",
          "symbol"
        ],
        "type": "object"
      },
      "name": "unload_history_from_memory"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Updates a breakpoint's time, label and/or enabled flag by id.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "time": {
            "description": "New ISO-8601 UTC time.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "update_simulation_breakpoint"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Live-validates an LLM provider (network). Read-only: validation status is NOT persisted.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "providerId": {
            "description": "Default provider when omitted.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "validate_llm_provider"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Runs the sandbox security analyzer (XTS0101–XTS0105: filesystem/network/processes/reflection/unsafe/DllImport bans) over ALL enabled strategy files WITHOUT emitting or loading an assembly. Fast pre-flight check before compile_strategy.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "validate_strategy_environment_usage"
    },
    {
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Validates a virtual strategy path BEFORE mutating calls: rejects absolute paths and '..' segments, normalizes '\\\\' to '/', enforces .cs for files. kind='file' (default) or 'folder'.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "kind": {
            "description": "Default 'file'.",
            "enum": [
              "file",
              "folder"
            ],
            "type": "string"
          },
          "path": {
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "type": "object"
      },
      "name": "validate_strategy_file_path"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Replaces the project specification (markdown) and records it as a new spec version. Refuses without confirm=true while the GUI is running (two-writers rule).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "confirm": {
            "type": "boolean"
          },
          "markdown": {
            "type": "string"
          },
          "note": {
            "description": "Version note.",
            "type": "string"
          }
        },
        "required": [
          "markdown"
        ],
        "type": "object"
      },
      "name": "write_project_spec"
    },
    {
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Replaces the ENTIRE content of an existing strategy file. Use only for large refactorings where a patch would be too noisy. Prefer apply_strategy_patch for small edits.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "content": {
            "type": "string"
          },
          "filename": {
            "type": "string"
          },
          "rationale": {
            "type": "string"
          }
        },
        "required": [
          "filename",
          "content",
          "rationale"
        ],
        "type": "object"
      },
      "name": "write_strategy_file"
    }
  ]
}
