[
  {
    "type": "function",
    "function": {
      "name": "scripts_list",
      "description": "List MagickMonkey-managed userscript / Tampermonkey / Greasemonkey / browser user script .ts/.js files in the Gist (excludes generated entry and rules JSON). Returns filenames, byte lengths, and indexed userscript metadata when available.",
      "parameters": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "scripts_runtime_summary",
      "description": "Return routing hints and runtime/preset capability summary for MagickMonkey-managed userscript / Tampermonkey / Greasemonkey / browser user script authoring, usage boundaries, GM_*/GME_* guidance, constants, and authoring constraints. Call before generating script content.",
      "parameters": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "scripts_get",
      "description": "Read one MagickMonkey-managed userscript file for Tampermonkey or browser user scripts by exact Gist filename.",
      "parameters": {
        "type": "object",
        "properties": {
          "filename": {
            "type": "string",
            "description": "Gist file name e.g. my-script.ts"
          }
        },
        "required": ["filename"],
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "scripts_search",
      "description": "Search MagickMonkey-managed userscript / Tampermonkey / Greasemonkey / browser user script files in the Gist and return compact line-level matches with bounded context. Prefer this before scripts_get to reduce token usage.",
      "parameters": {
        "type": "object",
        "properties": {
          "query": { "type": "string" },
          "filename": { "type": "string", "description": "Optional exact Gist filename to search within." },
          "regex": { "type": "boolean" },
          "caseSensitive": { "type": "boolean" },
          "contextLines": { "type": "integer", "minimum": 0, "maximum": 5 },
          "maxResults": { "type": "integer", "minimum": 1, "maximum": 200 }
        },
        "required": ["query"],
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "scripts_find",
      "description": "Find MagickMonkey-managed userscript files by filename, userscript @name, @description, @match, and index aliases/keywords. Prefer this when the user describes a script naturally and the exact filename is unknown. Requires magickmonkey.scripts.index.json; if it is missing or unreadable, call scripts_index_rebuild and retry.",
      "parameters": {
        "type": "object",
        "properties": {
          "query": { "type": "string" },
          "caseSensitive": { "type": "boolean" },
          "maxResults": { "type": "integer", "minimum": 1, "maximum": 100 }
        },
        "required": ["query"],
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "scripts_snippet",
      "description": "Read a bounded line range from one MagickMonkey-managed userscript / Tampermonkey script file instead of returning the full file.",
      "parameters": {
        "type": "object",
        "properties": {
          "filename": { "type": "string" },
          "startLine": { "type": "integer", "minimum": 1 },
          "endLine": { "type": "integer", "minimum": 1 }
        },
        "required": ["filename", "startLine", "endLine"],
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "scripts_upsert",
      "description": "Create, add, install, or replace a MagickMonkey-managed userscript file for Tampermonkey, Greasemonkey, or browser user scripts in the Gist. Before writing userscript content, read existing files for updates, propose and confirm header metadata in most cases, especially activation mode, @match domains/path patterns, and @run-at timing, then validate header sanity and syntax when possible; do not default to broad *://*/* scope unless explicitly requested, and never include API keys in script content.",
      "parameters": {
        "type": "object",
        "properties": {
          "filename": { "type": "string" },
          "content": { "type": "string" }
        },
        "required": ["filename", "content"],
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "scripts_replace",
      "description": "Replace text in one MagickMonkey-managed userscript / Tampermonkey script file server-side. Use expectedCount for safety; avoids full-file get/upsert for small edits.",
      "parameters": {
        "type": "object",
        "properties": {
          "filename": { "type": "string" },
          "search": { "type": "string" },
          "replace": { "type": "string" },
          "regex": { "type": "boolean" },
          "caseSensitive": { "type": "boolean" },
          "expectedCount": { "type": "integer", "minimum": 0 },
          "validate": { "type": "boolean" }
        },
        "required": ["filename", "search", "replace"],
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "scripts_patch",
      "description": "Apply structured exact-match patch operations to one MagickMonkey-managed userscript / Tampermonkey script file server-side. Use for local edits without transferring the whole file.",
      "parameters": {
        "type": "object",
        "properties": {
          "filename": { "type": "string" },
          "operations": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "type": { "type": "string", "enum": ["replace", "insertBefore", "insertAfter"] },
                "search": { "type": "string" },
                "replace": { "type": "string" },
                "text": { "type": "string" },
                "expectedCount": { "type": "integer", "minimum": 0 }
              },
              "required": ["type", "search"],
              "additionalProperties": false
            },
            "minItems": 1
          },
          "validate": { "type": "boolean" }
        },
        "required": ["filename", "operations"],
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "scripts_batch_patch",
      "description": "Apply structured exact-match patch operations across multiple MagickMonkey-managed userscript / Tampermonkey script files and write them in one Gist update. Use for related multi-file edits.",
      "parameters": {
        "type": "object",
        "properties": {
          "files": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "filename": { "type": "string" },
                "operations": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "type": { "type": "string", "enum": ["replace", "insertBefore", "insertAfter"] },
                      "search": { "type": "string" },
                      "replace": { "type": "string" },
                      "text": { "type": "string" },
                      "expectedCount": { "type": "integer", "minimum": 0 }
                    },
                    "required": ["type", "search"],
                    "additionalProperties": false
                  },
                  "minItems": 1
                },
                "validate": { "type": "boolean" }
              },
              "required": ["filename", "operations"],
              "additionalProperties": false
            },
            "minItems": 1
          },
          "validate": { "type": "boolean" },
          "atomic": { "type": "boolean", "description": "Reserved for compatibility; batch writes are prepared before the single Gist update." }
        },
        "required": ["files"],
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "scripts_validate",
      "description": "Validate one MagickMonkey-managed userscript file for Tampermonkey or browser user scripts without returning full content. Checks userscript header sanity.",
      "parameters": {
        "type": "object",
        "properties": {
          "filename": { "type": "string" }
        },
        "required": ["filename"],
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "scripts_index_rebuild",
      "description": "Rebuild and persist magickmonkey.scripts.index.json from current managed userscript files, preserving aliases/keywords already present in the index.",
      "parameters": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "scripts_index_update_metadata",
      "description": "Update human-maintained search metadata for one managed userscript in magickmonkey.scripts.index.json. Derived fields such as @name, @description, @version, @match, and @run-at still come from the script file.",
      "parameters": {
        "type": "object",
        "properties": {
          "filename": { "type": "string" },
          "aliases": { "type": "array", "items": { "type": "string" } },
          "keywords": { "type": "array", "items": { "type": "string" } }
        },
        "required": ["filename"],
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "scripts_delete",
      "description": "Delete a MagickMonkey-managed userscript file for Tampermonkey or browser user scripts from the Gist.",
      "parameters": {
        "type": "object",
        "properties": {
          "filename": { "type": "string" }
        },
        "required": ["filename"],
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "scripts_rename",
      "description": "Rename a MagickMonkey-managed userscript / Tampermonkey script file inside the Gist (read old content -> upsert new filename -> delete old filename).",
      "parameters": {
        "type": "object",
        "properties": {
          "fromFilename": {
            "type": "string",
            "description": "Existing managed script file name in the Gist (e.g. old.ts)"
          },
          "toFilename": {
            "type": "string",
            "description": "New managed script file name in the Gist (e.g. hello.ts)"
          }
        },
        "required": ["fromFilename", "toFilename"],
        "additionalProperties": false
      }
    }
  }
]
