{
  "data": {
    "tool": {
      "category": "workflow-automation",
      "endpoint": "https://toolapi.org/mcp",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/toolapi-hub.json",
      "kind": "mcp",
      "listed": "indexed",
      "liveUrl": "https://www.anchorterminal.com/api/v1/live/toolapi-hub.json",
      "markdownUrl": "https://www.anchorterminal.com/tools/toolapi-hub.md",
      "mcpTools": {
        "check": {
          "checker": "anchor-check/1.0",
          "totalTokens": 11783,
          "counts": {
            "error": 0,
            "note": 1,
            "warn": 394
          },
          "findings": [
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "base64_decode",
              "message": "the description is \"Base64-decode to UTF-8.\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "base64_encode",
              "message": "the description is \"Base64-encode UTF-8.\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "base64url_decode",
              "message": "the description is \"Base64url-decode to UTF-8.\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "hash_sha256",
              "message": "the description is \"SHA256 hex digest.\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "hash_sha512",
              "message": "the description is \"SHA512 hex digest.\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "html_decode",
              "message": "the description is \"Unescape HTML entities.\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "html_encode",
              "message": "the description is \"Escape HTML entities.\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "unicode_normalize",
              "message": "the description is \"Unicode normalization (NFC/NFD/NFKC/NFKD).\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "url_decode",
              "message": "the description is \"Decode percent-encoded string.\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "url_encode",
              "message": "the description is \"Percent-encode URL component.\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "base64_decode",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "base64_encode",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "base64url_decode",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "base64url_encode",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "bcrypt_hash",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "bcrypt_verify",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "changelog_parse",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "cidr_contains",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "code_fence_extract",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "color_contrast",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "color_convert",
              "message": "1 parameter without a description: to_format",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "compose_validate",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "content_type_parse",
              "message": "its one parameter, header, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "conventional_commit_lint",
              "message": "its one parameter, message, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "cookie_header_parse",
              "message": "its one parameter, header, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "cors_check",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "cron_describe",
              "message": "its one parameter, expr, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "cron_matches",
              "message": "2 parameters without a description: expr, timezone",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "cron_next_runs",
              "message": "3 parameters without a description: count, expr, timezone",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "cron_parse",
              "message": "its one parameter, expr, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "cron_semantic_validate",
              "message": "its one parameter, expr, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "cron_validate",
              "message": "its one parameter, expr, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "cron_validate_batch",
              "message": "its one parameter, expressions, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "csp_parse",
              "message": "its one parameter, header, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "csv_to_json",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "csv_validate",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "currency_convert",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "currency_rates",
              "message": "1 parameter without a description: base",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "datetime_parse",
              "message": "its one parameter, value, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "dependency_versions_extract",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "dns_lookup",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "dockerfile_lint",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "domain_parse",
              "message": "its one parameter, domain, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "duration_parse",
              "message": "its one parameter, value, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "editorconfig_validate",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "email_validate",
              "message": "its one parameter, email, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "env_diff",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "env_parse",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "env_required_check",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "extract_emails",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "extract_urls",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "frontmatter_parse",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "git_url_parse",
              "message": "its one parameter, url, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "github_actions_lint",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "gitignore_check",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "gitignore_match",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "glob_match_batch",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "graphql_operations_list",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "graphql_schema_diff",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "graphql_validate",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "hash_compare",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "hash_md5",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "hash_sha256",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "hash_sha512",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "hex_decode",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "hex_encode",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "hmac_sign",
              "message": "none of its 4 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "hmac_verify",
              "message": "none of its 4 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "hosts_file_parse",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "html_decode",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "html_encode",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "html_security_scan",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "html_to_markdown",
              "message": "its one parameter, html, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "http_headers_fetch",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "http_headers_parse",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "http_status_classify",
              "message": "its one parameter, codes, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "http_status_lookup",
              "message": "its one parameter, code, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "human_bytes",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "identifier_validate",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "import_list_analyze",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "ini_parse",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "ip_geolocation",
              "message": "its one parameter, ip, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "ip_version_detect",
              "message": "its one parameter, ip, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "ipv4_private_check",
              "message": "its one parameter, ip, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_assert_paths",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_equal",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_flatten",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_format",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_merge",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_merge_patch",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_minify",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_patch_apply",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_pointer_get",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_pretty_diff",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_schema_infer",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_schema_validate",
              "message": "1 parameter without a description: max_errors",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_schema_validate_batch",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_sort_keys",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_to_csv",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_to_toml",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_to_yaml",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_type_summary",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "json_validate",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "jsonl_validate",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "jwt_claims_audit",
              "message": "its one parameter, token, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "jwt_decode",
              "message": "its one parameter, token, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "jwt_sign",
              "message": "2 parameters without a description: algorithm, secret",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "jwt_verify",
              "message": "1 parameter without a description: token",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "line_ending_normalize",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "list_unique",
              "message": "its one parameter, items, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "mail_inbox_list",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "mail_inbox_read",
              "message": "none of its 4 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "markdown_link_extract",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "markdown_to_html",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "markdown_toc",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "mime_lookup",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "nanoid_generate",
              "message": "its one parameter, size, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "nginx_config_lint",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "openapi_operations_list",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "openapi_validate",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "package_manifest_audit",
              "message": "1 parameter without a description: kind",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "package_scripts_list",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "password_generate",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "password_strength",
              "message": "its one parameter, password, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "path_normalize",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "path_safety_check",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "pem_decode",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "pick_choice",
              "message": "1 parameter without a description: items",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "port_check",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "properties_parse",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "qr_generate",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "query_string_build",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "query_string_parse",
              "message": "its one parameter, query, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "radix_convert",
              "message": "2 parameters without a description: to_base, value",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "random_int",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "random_string",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "regex_replace",
              "message": "4 parameters without a description: global_replace, pattern, replacement, text",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "regex_test",
              "message": "2 parameters without a description: pattern, text",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "requirements_audit",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "reverse_dns",
              "message": "its one parameter, ip, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "robots_txt_validate",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "secrets_scan",
              "message": "1 parameter without a description: text",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "semver_compare",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "semver_inc",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "semver_max_satisfying",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "semver_parse",
              "message": "its one parameter, version, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "semver_range_intersects",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "semver_satisfies",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "semver_satisfies_batch",
              "message": "4 parameters without a description: checks, checks[].id, checks[].range, checks[].version",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "semver_sort",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "shebang_parse",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "shell_escape",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "spdx_license_check",
              "message": "its one parameter, expression, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "sql_danger_scan",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "sql_format",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "sql_tables_extract",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "ssl_cert_fetch",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "string_truncate",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "template_fill",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "text_case_convert",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "text_diff",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "text_lorem",
              "message": "its one parameter, paragraphs, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "text_similarity",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "text_slugify",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "text_stats",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "text_wrap",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "time_convert",
              "message": "its one parameter, value, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "timezone_convert",
              "message": "1 parameter without a description: from_timezone",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "todo_comment_extract",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "toml_schema_validate",
              "message": "1 parameter without a description: max_errors",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "toml_to_json",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "toml_validate",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "trailing_whitespace_scan",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "tsconfig_lint",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "unicode_normalize",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "unified_diff_parse",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "unit_convert",
              "message": "3 parameters without a description: from_unit, to_unit, value",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "url_decode",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "url_encode",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "url_join",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "url_normalize",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "url_parse",
              "message": "its one parameter, url, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "url_ssrf_check",
              "message": "its one parameter, url, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "user_agent_parse",
              "message": "its one parameter, user_agent, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "uuid_generate",
              "message": "3 parameters without a description: count, namespace_type, version",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "uuid_parse",
              "message": "its one parameter, uuid, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "whois_lookup",
              "message": "its one parameter, domain, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "x509_parse",
              "message": "its one parameter, pem, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "xml_format",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "xml_to_json",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "xml_validate",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "yaml_schema_validate",
              "message": "none of its 3 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "yaml_to_json",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "yaml_validate",
              "message": "its one parameter, text, has no description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC12",
              "severity": "warn",
              "tool": "json_assert_paths",
              "message": "no type for assertions[].equals",
              "fix": "Give every parameter a type (or an enum)."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "jwt_sign",
              "message": "header (object with no properties), payload (object with no properties)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "list_unique",
              "message": "items (array with no items)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "pick_choice",
              "message": "items (array with no items)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "query_string_build",
              "message": "params (object with no properties)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "template_fill",
              "message": "variables (object with no properties)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "base64_decode",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "base64_encode",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "base64url_decode",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "base64url_encode",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "bcrypt_hash",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "bcrypt_verify",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "changelog_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "cidr_calc",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "cidr_contains",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "code_fence_extract",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "color_contrast",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "color_convert",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "compose_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "content_type_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "conventional_commit_lint",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "cookie_header_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "cors_check",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"check\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "cron_describe",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"describe\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "cron_matches",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "cron_next_runs",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "cron_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "cron_semantic_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "cron_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "cron_validate_batch",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "csp_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "csv_to_json",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "csv_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "currency_convert",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "currency_list",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "currency_rates",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "datetime_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "dependency_versions_extract",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "dns_lookup",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"lookup\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "dockerfile_lint",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"lint\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "domain_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "duration_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "editorconfig_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "email_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "env_diff",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"diff\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "env_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "env_required_check",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"check\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "extract_emails",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "extract_urls",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "frontmatter_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "git_url_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "github_actions_lint",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"lint\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "gitignore_check",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"check\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "gitignore_match",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "glob_match_batch",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "graphql_operations_list",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "graphql_schema_diff",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"diff\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "graphql_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "hash_compare",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "hash_md5",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "hash_sha256",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "hash_sha512",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "hex_decode",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "hex_encode",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "hmac_sign",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "hmac_verify",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "hosts_file_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "html_decode",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "html_encode",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "html_security_scan",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "html_to_markdown",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "http_headers_fetch",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"fetch\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "http_headers_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "http_status_classify",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"status\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "http_status_lookup",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"status\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "human_bytes",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "identifier_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "import_list_analyze",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "ini_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "ip_geolocation",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "ip_version_detect",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "ipv4_private_check",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"check\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_assert_paths",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_equal",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_flatten",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_format",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_merge",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_merge_patch",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_minify",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_patch_apply",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_pointer_get",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"get\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_pretty_diff",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"diff\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_schema_infer",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_schema_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_schema_validate_batch",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_sort_keys",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_to_csv",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_to_toml",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_to_yaml",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_type_summary",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "json_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "jsonl_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "jsonpath_query",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"query\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "jwt_claims_audit",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "jwt_decode",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "jwt_sign",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "jwt_verify",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "line_ending_normalize",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "list_unique",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "mail_inbox_create",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "mail_inbox_list",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "mail_inbox_read",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"read\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "markdown_link_extract",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "markdown_to_html",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "markdown_toc",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "mime_lookup",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"lookup\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "nanoid_generate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "nginx_config_lint",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"lint\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "openapi_diff",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"diff\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "openapi_operations_list",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "openapi_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "package_manifest_audit",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "package_scripts_list",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "password_generate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "password_strength",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "path_normalize",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "path_safety_check",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"check\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "pem_decode",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "pick_choice",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "port_check",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"check\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "properties_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "qr_generate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "query_string_build",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"query\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "query_string_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"query\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "radix_convert",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "random_int",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "random_string",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "regex_replace",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "regex_test",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "remote_matrix",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "requirements_audit",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "reverse_dns",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "robots_txt_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "secrets_scan",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "semver_compare",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "semver_inc",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "semver_max_satisfying",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "semver_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "semver_range_intersects",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "semver_satisfies",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "semver_satisfies_batch",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "semver_sort",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "shebang_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "shell_escape",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "spdx_license_check",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"check\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "sql_danger_scan",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "sql_format",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "sql_tables_extract",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "ssl_cert_fetch",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"fetch\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "string_truncate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "template_fill",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "text_case_convert",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "text_diff",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"diff\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "text_lorem",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "text_similarity",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "text_slugify",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "text_stats",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "text_wrap",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "time_convert",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "time_now",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "timezone_convert",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "timezone_list",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "todo_comment_extract",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "toml_schema_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "toml_to_json",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "toml_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "trailing_whitespace_scan",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "tsconfig_lint",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"lint\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "unicode_normalize",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "unified_diff_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"diff\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "unit_convert",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "unit_list",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "url_decode",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "url_encode",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "url_join",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "url_normalize",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "url_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "url_ssrf_check",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"check\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "user_agent_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "uuid_generate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "uuid_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "whois_lookup",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"lookup\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "x509_parse",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "xml_format",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "xml_to_json",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "xml_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "yaml_schema_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "yaml_to_json",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "yaml_validate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"validate\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC23",
              "severity": "warn",
              "message": "193 tools",
              "fix": "Offer a smaller default toolset and let clients opt into the rest."
            },
            {
              "rule": "TC24",
              "severity": "note",
              "message": "193 of 193 tools have no outputSchema",
              "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
            }
          ]
        },
        "checkedAt": "2026-10-04T22:25:47Z",
        "count": 193,
        "note": "answered without the initialize handshake",
        "schemaTokens": 11783,
        "status": "ok",
        "tools": [
          {
            "name": "json_validate",
            "description": "Validate JSON text; return parsed object or error.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_format",
            "description": "Pretty-print JSON with indent. When: Pretty-print JSON when the agent needs readable output.",
            "inputSchema": {
              "properties": {
                "indent": {
                  "default": 2,
                  "type": "integer"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_minify",
            "description": "Minify JSON (remove whitespace). When: Minify JSON for compact payloads or size checks.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "csv_to_json",
            "description": "Convert CSV text to JSON array of row objects. When: Convert CSV rows → JSON array of objects.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_to_csv",
            "description": "Convert JSON array of objects to CSV text.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "yaml_validate",
            "description": "Validate YAML text; return parsed object or error.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "yaml_to_json",
            "description": "Parse YAML and return JSON-compatible object.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_to_yaml",
            "description": "Convert JSON text to YAML string. When: Convert JSON → YAML for config files agents write.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "xml_validate",
            "description": "Validate XML markup (well-formed check).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "xml_format",
            "description": "Pretty-print XML with indentation. When: Pretty-print XML after the agent edits markup.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "jsonpath_query",
            "description": "Query JSON with JSONPath expression; returns matching values.",
            "inputSchema": {
              "properties": {
                "path": {
                  "description": "e.g. $.store.book[*].author",
                  "type": "string"
                },
                "text": {
                  "description": "JSON text",
                  "type": "string"
                }
              },
              "required": [
                "text",
                "path"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_merge",
            "description": "Deep-merge two JSON objects (second overlays first).",
            "inputSchema": {
              "properties": {
                "a": {
                  "type": "string"
                },
                "b": {
                  "type": "string"
                }
              },
              "required": [
                "a",
                "b"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_flatten",
            "description": "Flatten nested JSON to dot-key map. When: Flatten nested JSON keys before comparing or exporting.",
            "inputSchema": {
              "properties": {
                "separator": {
                  "default": ".",
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_pretty_diff",
            "description": "Unified diff of two JSON documents (pretty-printed).",
            "inputSchema": {
              "properties": {
                "a": {
                  "type": "string"
                },
                "b": {
                  "type": "string"
                }
              },
              "required": [
                "a",
                "b"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_sort_keys",
            "description": "Recursively sort JSON object keys. When: Canonicalize JSON key order for stable diffs/hashes.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_type_summary",
            "description": "Summarize JSON value types (counts per type in tree).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_schema_validate",
            "description": "Validate JSON data against JSON Schema (Draft 7).",
            "inputSchema": {
              "properties": {
                "data": {
                  "description": "JSON document text",
                  "type": "string"
                },
                "max_errors": {
                  "default": 20,
                  "maximum": 50,
                  "minimum": 1,
                  "type": "integer"
                },
                "schema": {
                  "description": "JSON Schema (Draft 7)",
                  "type": "string"
                }
              },
              "required": [
                "data",
                "schema"
              ],
              "type": "object"
            }
          },
          {
            "name": "toml_validate",
            "description": "Validate TOML text; return parsed object or error.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "toml_to_json",
            "description": "Parse TOML and return JSON-compatible object.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_to_toml",
            "description": "Convert JSON object text to TOML string.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "toml_schema_validate",
            "description": "Validate TOML config against JSON Schema (Draft 7) in one step.",
            "inputSchema": {
              "properties": {
                "max_errors": {
                  "default": 20,
                  "maximum": 50,
                  "minimum": 1,
                  "type": "integer"
                },
                "schema": {
                  "description": "JSON Schema (Draft 7)",
                  "type": "string"
                },
                "toml": {
                  "description": "TOML document text",
                  "type": "string"
                }
              },
              "required": [
                "toml",
                "schema"
              ],
              "type": "object"
            }
          },
          {
            "name": "sql_format",
            "description": "Format SQL text (never executed; reindent + keyword case).",
            "inputSchema": {
              "properties": {
                "keyword_case": {
                  "default": "upper",
                  "enum": [
                    "upper",
                    "lower",
                    "capitalize"
                  ],
                  "type": "string"
                },
                "reindent": {
                  "default": true,
                  "type": "boolean"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "graphql_validate",
            "description": "Validate GraphQL query or schema SDL syntax (parse only).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "openapi_validate",
            "description": "Validate OpenAPI 3.x document (JSON or YAML snippet).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "openapi_diff",
            "description": "Compare two OpenAPI specs and flag breaking vs non-breaking API changes.",
            "inputSchema": {
              "properties": {
                "new": {
                  "description": "New OpenAPI JSON/YAML",
                  "type": "string"
                },
                "old": {
                  "description": "Previous OpenAPI JSON/YAML",
                  "type": "string"
                }
              },
              "required": [
                "old",
                "new"
              ],
              "type": "object"
            }
          },
          {
            "name": "package_manifest_audit",
            "description": "Audit package.json or pyproject.toml — license, risky scripts, loose ranges; emit semver_checks for batch. Note: best-effort / heuristic — not a full language parser.",
            "inputSchema": {
              "properties": {
                "kind": {
                  "default": "auto",
                  "enum": [
                    "auto",
                    "npm",
                    "pyproject"
                  ],
                  "type": "string"
                },
                "text": {
                  "description": "Manifest file contents",
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "graphql_schema_diff",
            "description": "Diff two GraphQL schemas for removed types/fields (breaking changes).",
            "inputSchema": {
              "properties": {
                "new": {
                  "type": "string"
                },
                "old": {
                  "type": "string"
                }
              },
              "required": [
                "old",
                "new"
              ],
              "type": "object"
            }
          },
          {
            "name": "compose_validate",
            "description": "Validate docker-compose YAML and flag privileged/host-network/secret env issues.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "github_actions_lint",
            "description": "Lint GitHub Actions workflow YAML (triggers, unpinned actions, curl|bash).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "requirements_audit",
            "description": "Audit Python requirements.txt for unpinned/VCS/deprecated packages.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_schema_validate_batch",
            "description": "Batch JSON Schema (Draft 7) validation — up to 25 documents (agent favorite).",
            "inputSchema": {
              "properties": {
                "items": {
                  "items": {
                    "properties": {
                      "data": {
                        "type": "string"
                      },
                      "id": {
                        "type": "string"
                      },
                      "schema": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "data",
                      "schema"
                    ],
                    "type": "object"
                  },
                  "maxItems": 25,
                  "type": "array"
                },
                "max_errors": {
                  "default": 10,
                  "type": "integer"
                }
              },
              "required": [
                "items"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_assert_paths",
            "description": "Assert JSONPath expressions against JSON (exists/equals/type) — agent self-check.",
            "inputSchema": {
              "properties": {
                "assertions": {
                  "items": {
                    "properties": {
                      "equals": {},
                      "exists": {
                        "type": "boolean"
                      },
                      "path": {
                        "type": "string"
                      },
                      "type": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "path"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "data": {
                  "type": "string"
                }
              },
              "required": [
                "data",
                "assertions"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_equal",
            "description": "Deep-compare two JSON documents and list differing paths.",
            "inputSchema": {
              "properties": {
                "a": {
                  "type": "string"
                },
                "b": {
                  "type": "string"
                }
              },
              "required": [
                "a",
                "b"
              ],
              "type": "object"
            }
          },
          {
            "name": "yaml_schema_validate",
            "description": "Parse YAML then validate against JSON Schema (Draft 7).",
            "inputSchema": {
              "properties": {
                "max_errors": {
                  "default": 20,
                  "type": "integer"
                },
                "schema": {
                  "type": "string"
                },
                "yaml": {
                  "type": "string"
                }
              },
              "required": [
                "yaml",
                "schema"
              ],
              "type": "object"
            }
          },
          {
            "name": "tsconfig_lint",
            "description": "Lint tsconfig.json structure (compilerOptions, strict hints).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_pointer_get",
            "description": "Get value by RFC 6901 JSON Pointer (e.g. /user/id). When: Read one field by RFC 6901 pointer without full walk in the agent.",
            "inputSchema": {
              "properties": {
                "data": {
                  "type": "string"
                },
                "pointer": {
                  "default": "",
                  "type": "string"
                }
              },
              "required": [
                "data"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_patch_apply",
            "description": "Apply RFC 6902 JSON Patch ops (add/remove/replace/test/move/copy). When: Apply RFC 6902 ops (add/remove/replace/test/move/copy).",
            "inputSchema": {
              "properties": {
                "data": {
                  "type": "string"
                },
                "patch": {
                  "type": "string"
                }
              },
              "required": [
                "data",
                "patch"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_schema_infer",
            "description": "Infer a Draft-7 JSON Schema from a sample JSON document (agent favorite).",
            "inputSchema": {
              "properties": {
                "data": {
                  "type": "string"
                },
                "title": {
                  "default": "Inferred",
                  "type": "string"
                }
              },
              "required": [
                "data"
              ],
              "type": "object"
            }
          },
          {
            "name": "jsonl_validate",
            "description": "Validate JSON Lines (NDJSON); optional per-line JSON Schema. When: Validate NDJSON / JSON Lines logs or datasets.",
            "inputSchema": {
              "properties": {
                "max_lines": {
                  "default": 200,
                  "type": "integer"
                },
                "schema": {
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "xml_to_json",
            "description": "Convert XML document to JSON (attributes as @attr). When: Convert XML → JSON for agents that prefer JSON tools.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "json_merge_patch",
            "description": "Apply RFC 7396 JSON Merge Patch (null deletes keys). When: RFC 7396 merge patch — use when patching JSON configs.",
            "inputSchema": {
              "properties": {
                "patch": {
                  "type": "string"
                },
                "target": {
                  "type": "string"
                }
              },
              "required": [
                "target",
                "patch"
              ],
              "type": "object"
            }
          },
          {
            "name": "csv_validate",
            "description": "Validate CSV structure — consistent column counts / header. When: Check CSV column consistency before import.",
            "inputSchema": {
              "properties": {
                "delimiter": {
                  "default": ",",
                  "type": "string"
                },
                "has_header": {
                  "default": true,
                  "type": "boolean"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "ini_parse",
            "description": "Parse INI / simple key=value config into sections. When: Parse INI/section configs into structured maps.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "openapi_operations_list",
            "description": "List OpenAPI path operations (method, path, operationId, tags). When: List OpenAPI operations before validate/diff.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "graphql_operations_list",
            "description": "List GraphQL query/mutation/subscription names and type defs. When: List GraphQL ops/types from a document (best-effort).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "properties_parse",
            "description": "Parse Java .properties key=value file. When: Parse Java .properties key=value configs (best-effort).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "time_now",
            "description": "Current UTC unix timestamp and ISO-8601.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            }
          },
          {
            "name": "time_convert",
            "description": "Convert unix seconds or ISO-8601 to both formats.",
            "inputSchema": {
              "properties": {
                "value": {
                  "type": "string"
                }
              },
              "required": [
                "value"
              ],
              "type": "object"
            }
          },
          {
            "name": "timezone_convert",
            "description": "Convert datetime between IANA timezones (e.g. UTC to Asia/Shanghai).",
            "inputSchema": {
              "properties": {
                "from_timezone": {
                  "default": "UTC",
                  "type": "string"
                },
                "to_timezone": {
                  "description": "e.g. Asia/Shanghai",
                  "type": "string"
                },
                "value": {
                  "description": "Unix seconds or ISO datetime",
                  "type": "string"
                }
              },
              "required": [
                "value",
                "to_timezone"
              ],
              "type": "object"
            }
          },
          {
            "name": "timezone_list",
            "description": "List common IANA timezone names for conversion.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            }
          },
          {
            "name": "datetime_parse",
            "description": "Parse unix timestamp or ISO-8601 into UTC ISO + unix.",
            "inputSchema": {
              "properties": {
                "value": {
                  "type": "string"
                }
              },
              "required": [
                "value"
              ],
              "type": "object"
            }
          },
          {
            "name": "duration_parse",
            "description": "Parse duration (ISO-8601 PnDTnHnMnS or human 1h30m / 90s) to seconds. When: Parse ISO-8601 / human durations to seconds.",
            "inputSchema": {
              "properties": {
                "value": {
                  "type": "string"
                }
              },
              "required": [
                "value"
              ],
              "type": "object"
            }
          },
          {
            "name": "regex_test",
            "description": "Test regex pattern; returns match, groups, span.",
            "inputSchema": {
              "properties": {
                "flags": {
                  "description": "i, m, s",
                  "type": "string"
                },
                "pattern": {
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "pattern",
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "regex_replace",
            "description": "Replace regex matches in text (supports backreferences in replacement).",
            "inputSchema": {
              "properties": {
                "count": {
                  "default": 0,
                  "description": "Max replacements when global",
                  "type": "integer"
                },
                "flags": {
                  "description": "i, m, s",
                  "type": "string"
                },
                "global_replace": {
                  "default": true,
                  "type": "boolean"
                },
                "pattern": {
                  "type": "string"
                },
                "replacement": {
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "pattern",
                "replacement",
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "text_diff",
            "description": "Unified line diff between two texts (like git diff).",
            "inputSchema": {
              "properties": {
                "left": {
                  "type": "string"
                },
                "right": {
                  "type": "string"
                }
              },
              "required": [
                "left",
                "right"
              ],
              "type": "object"
            }
          },
          {
            "name": "text_slugify",
            "description": "URL-safe slug from title or heading. When: Make URL-safe slugs from titles/filenames.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "text_stats",
            "description": "Count chars, words, lines, sentences; estimate reading time.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "text_case_convert",
            "description": "Convert case: lower, upper, title, snake, kebab, camel, pascal.",
            "inputSchema": {
              "properties": {
                "mode": {
                  "enum": [
                    "lower",
                    "upper",
                    "title",
                    "snake",
                    "kebab",
                    "camel",
                    "pascal"
                  ],
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text",
                "mode"
              ],
              "type": "object"
            }
          },
          {
            "name": "text_lorem",
            "description": "Generate lorem ipsum placeholder paragraphs.",
            "inputSchema": {
              "properties": {
                "paragraphs": {
                  "default": 1,
                  "maximum": 10,
                  "minimum": 1,
                  "type": "integer"
                }
              },
              "type": "object"
            }
          },
          {
            "name": "color_convert",
            "description": "Convert color between hex, rgb(), and hsl().",
            "inputSchema": {
              "properties": {
                "color": {
                  "description": "hex, rgb(), or hsl()",
                  "type": "string"
                },
                "to_format": {
                  "default": "all",
                  "enum": [
                    "all",
                    "hex",
                    "rgb",
                    "hsl"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "color"
              ],
              "type": "object"
            }
          },
          {
            "name": "unit_convert",
            "description": "Convert units: length, weight, temperature, data, speed, time.",
            "inputSchema": {
              "properties": {
                "category": {
                  "description": "optional: length, weight, temperature, data, speed, time",
                  "type": "string"
                },
                "from_unit": {
                  "type": "string"
                },
                "to_unit": {
                  "type": "string"
                },
                "value": {
                  "type": "number"
                }
              },
              "required": [
                "value",
                "from_unit",
                "to_unit"
              ],
              "type": "object"
            }
          },
          {
            "name": "unit_list",
            "description": "List supported units per category for unit_convert.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            }
          },
          {
            "name": "markdown_to_html",
            "description": "Convert Markdown text to HTML. When: Render markdown → HTML for previews or emails.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "html_to_markdown",
            "description": "Convert HTML to Markdown text. When: Convert HTML → markdown for docs the agent edits.",
            "inputSchema": {
              "properties": {
                "html": {
                  "type": "string"
                }
              },
              "required": [
                "html"
              ],
              "type": "object"
            }
          },
          {
            "name": "pick_choice",
            "description": "Pick one item from a list (optional seed for reproducibility).",
            "inputSchema": {
              "properties": {
                "items": {
                  "type": "array"
                },
                "seed": {
                  "description": "Optional RNG seed",
                  "type": "integer"
                }
              },
              "required": [
                "items"
              ],
              "type": "object"
            }
          },
          {
            "name": "string_truncate",
            "description": "Truncate text with ellipsis. When: Truncate long strings with ellipsis for UI/logs.",
            "inputSchema": {
              "properties": {
                "ellipsis": {
                  "default": "...",
                  "type": "string"
                },
                "max_length": {
                  "default": 80,
                  "type": "integer"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "extract_urls",
            "description": "Extract HTTP/HTTPS URLs from arbitrary text.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "extract_emails",
            "description": "Extract email addresses from text. When: Pull email addresses from free text / logs.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "email_validate",
            "description": "Validate email address format. When: Syntax-check a single email address.",
            "inputSchema": {
              "properties": {
                "email": {
                  "type": "string"
                }
              },
              "required": [
                "email"
              ],
              "type": "object"
            }
          },
          {
            "name": "text_wrap",
            "description": "Wrap text to a maximum line width. When: Hard-wrap text to a column width.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                },
                "width": {
                  "default": 80,
                  "type": "integer"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "list_unique",
            "description": "Deduplicate list items preserving order.",
            "inputSchema": {
              "properties": {
                "items": {
                  "type": "array"
                }
              },
              "required": [
                "items"
              ],
              "type": "object"
            }
          },
          {
            "name": "template_fill",
            "description": "Fill {{variable}} placeholders in a template string.",
            "inputSchema": {
              "properties": {
                "template": {
                  "type": "string"
                },
                "variables": {
                  "type": "object"
                }
              },
              "required": [
                "template",
                "variables"
              ],
              "type": "object"
            }
          },
          {
            "name": "unicode_normalize",
            "description": "Unicode normalization (NFC/NFD/NFKC/NFKD).",
            "inputSchema": {
              "properties": {
                "form": {
                  "default": "NFC",
                  "enum": [
                    "NFC",
                    "NFD",
                    "NFKC",
                    "NFKD"
                  ],
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "user_agent_parse",
            "description": "Parse User-Agent string into browser, OS, and device hints.",
            "inputSchema": {
              "properties": {
                "user_agent": {
                  "type": "string"
                }
              },
              "required": [
                "user_agent"
              ],
              "type": "object"
            }
          },
          {
            "name": "secrets_scan",
            "description": "Scan text for hardcoded secrets (API keys, tokens, private keys). Returns redacted findings.",
            "inputSchema": {
              "properties": {
                "min_entropy": {
                  "default": 3.5,
                  "description": "Entropy threshold for heuristic strings",
                  "type": "number"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "dockerfile_lint",
            "description": "Lint Dockerfile for common security/style issues (root user, curl|sh, secrets).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "env_required_check",
            "description": "Check .env text contains required keys (and non-empty values).",
            "inputSchema": {
              "properties": {
                "required": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text",
                "required"
              ],
              "type": "object"
            }
          },
          {
            "name": "path_safety_check",
            "description": "Check filesystem path for traversal / absolute / sensitive system paths.",
            "inputSchema": {
              "properties": {
                "allow_absolute": {
                  "default": false,
                  "type": "boolean"
                },
                "path": {
                  "type": "string"
                }
              },
              "required": [
                "path"
              ],
              "type": "object"
            }
          },
          {
            "name": "spdx_license_check",
            "description": "Validate SPDX license expression against common license IDs.",
            "inputSchema": {
              "properties": {
                "expression": {
                  "type": "string"
                }
              },
              "required": [
                "expression"
              ],
              "type": "object"
            }
          },
          {
            "name": "robots_txt_validate",
            "description": "Validate robots.txt syntax and User-agent rules.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "csp_parse",
            "description": "Parse Content-Security-Policy header and flag unsafe directives.",
            "inputSchema": {
              "properties": {
                "header": {
                  "type": "string"
                }
              },
              "required": [
                "header"
              ],
              "type": "object"
            }
          },
          {
            "name": "cors_check",
            "description": "Check CORS Allow-Origin vs credentials for unsafe combinations.",
            "inputSchema": {
              "properties": {
                "allow_credentials": {
                  "default": false,
                  "type": "boolean"
                },
                "allow_origin": {
                  "type": "string"
                },
                "origin": {
                  "type": "string"
                }
              },
              "required": [
                "allow_origin"
              ],
              "type": "object"
            }
          },
          {
            "name": "markdown_link_extract",
            "description": "Extract markdown/bare links and flag javascript: URLs.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "gitignore_check",
            "description": "Review .gitignore for common missing ignores (.env, node_modules, keys).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "editorconfig_validate",
            "description": "Validate .editorconfig syntax and common keys.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "nginx_config_lint",
            "description": "Lint nginx config snippets (braces, SSLv3, server_tokens, HSTS hints).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "sql_danger_scan",
            "description": "Scan SQL text for dangerous patterns (DROP/TRUNCATE/DELETE without WHERE). Note: best-effort / heuristic — not a full language parser.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "html_security_scan",
            "description": "Scan HTML for XSS-prone patterns (javascript: URLs, inline handlers, eval). Note: best-effort / heuristic — not a full language parser.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "conventional_commit_lint",
            "description": "Lint Conventional Commits message (feat/fix/chore…).",
            "inputSchema": {
              "properties": {
                "message": {
                  "type": "string"
                }
              },
              "required": [
                "message"
              ],
              "type": "object"
            }
          },
          {
            "name": "changelog_parse",
            "description": "Parse Keep-a-Changelog style markdown into version sections.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "todo_comment_extract",
            "description": "Extract TODO/FIXME/HACK/XXX comments with line numbers.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "code_fence_extract",
            "description": "Extract fenced code blocks from markdown (language + code).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "unified_diff_parse",
            "description": "Parse unified diff — files changed, lines added/removed.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "glob_match_batch",
            "description": "Match paths against glob patterns (gitignore-style fnmatch).",
            "inputSchema": {
              "properties": {
                "paths": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "patterns": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              },
              "required": [
                "paths",
                "patterns"
              ],
              "type": "object"
            }
          },
          {
            "name": "identifier_validate",
            "description": "Validate identifier for python/javascript/typescript (keywords + syntax).",
            "inputSchema": {
              "properties": {
                "language": {
                  "default": "python",
                  "enum": [
                    "python",
                    "javascript",
                    "typescript"
                  ],
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              },
              "required": [
                "name"
              ],
              "type": "object"
            }
          },
          {
            "name": "text_similarity",
            "description": "SequenceMatcher similarity ratio between two texts.",
            "inputSchema": {
              "properties": {
                "a": {
                  "type": "string"
                },
                "b": {
                  "type": "string"
                }
              },
              "required": [
                "a",
                "b"
              ],
              "type": "object"
            }
          },
          {
            "name": "import_list_analyze",
            "description": "List imports from python/js source and flag duplicates. Note: best-effort / heuristic — not a full language parser.",
            "inputSchema": {
              "properties": {
                "language": {
                  "default": "python",
                  "enum": [
                    "python",
                    "javascript"
                  ],
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "frontmatter_parse",
            "description": "Parse YAML frontmatter from markdown (--- ... ---). When: Split YAML frontmatter from markdown body.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "markdown_toc",
            "description": "Build a table of contents from markdown headings. When: Build heading TOC from markdown docs.",
            "inputSchema": {
              "properties": {
                "max_level": {
                  "default": 3,
                  "maximum": 6,
                  "minimum": 1,
                  "type": "integer"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "gitignore_match",
            "description": "Match paths against .gitignore rules (ignore / negate). When: Test paths against .gitignore rules (best-effort).",
            "inputSchema": {
              "properties": {
                "gitignore": {
                  "type": "string"
                },
                "paths": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              },
              "required": [
                "paths",
                "gitignore"
              ],
              "type": "object"
            }
          },
          {
            "name": "shell_escape",
            "description": "Shell-escape a string for posix/powershell/cmd (safe quoting). When: Safely quote strings for posix/powershell/cmd.",
            "inputSchema": {
              "properties": {
                "shell": {
                  "default": "posix",
                  "enum": [
                    "posix",
                    "powershell",
                    "cmd"
                  ],
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "path_normalize",
            "description": "Normalize filesystem path (resolve . and ..) for posix or windows. When: Resolve . and .. in filesystem paths.",
            "inputSchema": {
              "properties": {
                "path": {
                  "type": "string"
                },
                "style": {
                  "default": "posix",
                  "enum": [
                    "posix",
                    "windows"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "path"
              ],
              "type": "object"
            }
          },
          {
            "name": "env_diff",
            "description": "Diff two .env files — only_in_a / only_in_b / changed values. When: Diff two .env files for missing/changed keys.",
            "inputSchema": {
              "properties": {
                "a": {
                  "type": "string"
                },
                "b": {
                  "type": "string"
                }
              },
              "required": [
                "a",
                "b"
              ],
              "type": "object"
            }
          },
          {
            "name": "package_scripts_list",
            "description": "List scripts from package.json or pyproject.toml (poetry/PEP 621). When: List npm/poetry/PEP 621 scripts from manifests.",
            "inputSchema": {
              "properties": {
                "kind": {
                  "default": "auto",
                  "enum": [
                    "auto",
                    "npm",
                    "pyproject"
                  ],
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "line_ending_normalize",
            "description": "Detect and normalize line endings to lf/crlf/cr. When: Detect/normalize CRLF vs LF.",
            "inputSchema": {
              "properties": {
                "style": {
                  "default": "lf",
                  "enum": [
                    "lf",
                    "crlf",
                    "cr"
                  ],
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "shebang_parse",
            "description": "Parse #! shebang line — interpreter and args. When: Parse #! interpreter lines in scripts.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "trailing_whitespace_scan",
            "description": "Scan text for trailing whitespace and tab characters. Note: best-effort / heuristic — not a full language parser.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "sql_tables_extract",
            "description": "Extract table names from SQL (FROM/JOIN/INTO/UPDATE/TABLE). When: Heuristic extract of SQL table names (best-effort).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "dependency_versions_extract",
            "description": "Extract name@version from requirements/lockfile/go.mod/Cargo snippets. When: Extract name@version from lock/requirements snippets (best-effort).",
            "inputSchema": {
              "properties": {
                "ecosystem": {
                  "default": "auto",
                  "enum": [
                    "auto",
                    "pip",
                    "npm",
                    "go",
                    "cargo"
                  ],
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "color_contrast",
            "description": "WCAG contrast ratio between two hex colors (AA/AAA). When: WCAG contrast ratio for UI color pairs.",
            "inputSchema": {
              "properties": {
                "bg": {
                  "type": "string"
                },
                "fg": {
                  "type": "string"
                }
              },
              "required": [
                "fg",
                "bg"
              ],
              "type": "object"
            }
          },
          {
            "name": "human_bytes",
            "description": "Format bytes to human size, or parse '1.5 GB' to bytes. When: Format or parse human byte sizes (1.5 GB).",
            "inputSchema": {
              "properties": {
                "precision": {
                  "default": 2,
                  "type": "integer"
                },
                "text": {
                  "type": "string"
                },
                "value": {
                  "type": "number"
                }
              },
              "type": "object"
            }
          },
          {
            "name": "password_strength",
            "description": "Offline password strength heuristic (length/classes/common). When: Offline password strength heuristic (not a cracker).",
            "inputSchema": {
              "properties": {
                "password": {
                  "type": "string"
                }
              },
              "required": [
                "password"
              ],
              "type": "object"
            }
          },
          {
            "name": "hosts_file_parse",
            "description": "Parse /etc/hosts style file into IP → hostnames entries. When: Parse /etc/hosts style IP→hostname maps.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "hash_md5",
            "description": "MD5 hex digest of UTF-8 text. When: MD5 digest (non-crypto integrity / legacy checksums).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "hash_sha256",
            "description": "SHA256 hex digest.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "hash_sha512",
            "description": "SHA512 hex digest.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "base64_encode",
            "description": "Base64-encode UTF-8.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "base64_decode",
            "description": "Base64-decode to UTF-8.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "base64url_encode",
            "description": "Base64url-encode UTF-8 (no padding, URL-safe).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "base64url_decode",
            "description": "Base64url-decode to UTF-8.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "url_encode",
            "description": "Percent-encode URL component.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "url_decode",
            "description": "Decode percent-encoded string.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "html_encode",
            "description": "Escape HTML entities.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "html_decode",
            "description": "Unescape HTML entities.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "hex_encode",
            "description": "UTF-8 text to hex string.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "hex_decode",
            "description": "Hex string to UTF-8 text.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "uuid_generate",
            "description": "Generate UUID v1/v3/v4/v5 (batch supported). v3/v5 need name + namespace.",
            "inputSchema": {
              "properties": {
                "count": {
                  "default": 1,
                  "maximum": 20,
                  "minimum": 1,
                  "type": "integer"
                },
                "name": {
                  "description": "Required for v3/v5",
                  "type": "string"
                },
                "namespace": {
                  "description": "UUID string for v3/v5 namespace",
                  "type": "string"
                },
                "namespace_type": {
                  "enum": [
                    "dns",
                    "url",
                    "oid",
                    "x500"
                  ],
                  "type": "string"
                },
                "version": {
                  "default": 4,
                  "enum": [
                    1,
                    3,
                    4,
                    5
                  ],
                  "type": "integer"
                }
              },
              "type": "object"
            }
          },
          {
            "name": "uuid_parse",
            "description": "Parse UUID string: version, variant, hex bytes.",
            "inputSchema": {
              "properties": {
                "uuid": {
                  "type": "string"
                }
              },
              "required": [
                "uuid"
              ],
              "type": "object"
            }
          },
          {
            "name": "nanoid_generate",
            "description": "Generate URL-friendly nanoid (like npm nanoid).",
            "inputSchema": {
              "properties": {
                "size": {
                  "default": 21,
                  "maximum": 64,
                  "minimum": 1,
                  "type": "integer"
                }
              },
              "type": "object"
            }
          },
          {
            "name": "password_generate",
            "description": "Cryptographically secure random password.",
            "inputSchema": {
              "properties": {
                "length": {
                  "default": 16,
                  "maximum": 64,
                  "minimum": 8,
                  "type": "integer"
                },
                "symbols": {
                  "default": true,
                  "type": "boolean"
                }
              },
              "type": "object"
            }
          },
          {
            "name": "jwt_decode",
            "description": "Decode JWT payload and header (no signature verification).",
            "inputSchema": {
              "properties": {
                "token": {
                  "type": "string"
                }
              },
              "required": [
                "token"
              ],
              "type": "object"
            }
          },
          {
            "name": "jwt_verify",
            "description": "Verify JWT signature (HS* with secret, RS* with public_key PEM).",
            "inputSchema": {
              "properties": {
                "algorithms": {
                  "description": "e.g. [\"HS256\"]",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "public_key": {
                  "description": "PEM public key for RS algorithms",
                  "type": "string"
                },
                "secret": {
                  "description": "For HS256/384/512",
                  "type": "string"
                },
                "token": {
                  "type": "string"
                }
              },
              "required": [
                "token"
              ],
              "type": "object"
            }
          },
          {
            "name": "jwt_sign",
            "description": "Sign JWT payload (HS* with secret, RS* with private_key PEM).",
            "inputSchema": {
              "properties": {
                "algorithm": {
                  "default": "HS256",
                  "type": "string"
                },
                "header": {
                  "description": "Optional extra JWT header fields",
                  "type": "object"
                },
                "payload": {
                  "description": "Claims object or JSON string",
                  "type": "object"
                },
                "private_key": {
                  "description": "PEM private key for RS algorithms",
                  "type": "string"
                },
                "secret": {
                  "type": "string"
                }
              },
              "required": [
                "payload"
              ],
              "type": "object"
            }
          },
          {
            "name": "hmac_sign",
            "description": "HMAC sign message (sha1/sha256/sha512); hex or base64 output.",
            "inputSchema": {
              "properties": {
                "algorithm": {
                  "default": "sha256",
                  "type": "string"
                },
                "encoding": {
                  "default": "hex",
                  "enum": [
                    "hex",
                    "base64"
                  ],
                  "type": "string"
                },
                "message": {
                  "type": "string"
                },
                "secret": {
                  "type": "string"
                }
              },
              "required": [
                "message",
                "secret"
              ],
              "type": "object"
            }
          },
          {
            "name": "hmac_verify",
            "description": "Verify HMAC signature (hex or base64).",
            "inputSchema": {
              "properties": {
                "algorithm": {
                  "default": "sha256",
                  "type": "string"
                },
                "message": {
                  "type": "string"
                },
                "secret": {
                  "type": "string"
                },
                "signature": {
                  "type": "string"
                }
              },
              "required": [
                "message",
                "secret",
                "signature"
              ],
              "type": "object"
            }
          },
          {
            "name": "bcrypt_hash",
            "description": "Bcrypt-hash a password for storage.",
            "inputSchema": {
              "properties": {
                "password": {
                  "type": "string"
                },
                "rounds": {
                  "default": 12,
                  "maximum": 15,
                  "minimum": 4,
                  "type": "integer"
                }
              },
              "required": [
                "password"
              ],
              "type": "object"
            }
          },
          {
            "name": "bcrypt_verify",
            "description": "Verify password against bcrypt hash.",
            "inputSchema": {
              "properties": {
                "hash": {
                  "type": "string"
                },
                "password": {
                  "type": "string"
                }
              },
              "required": [
                "password",
                "hash"
              ],
              "type": "object"
            }
          },
          {
            "name": "radix_convert",
            "description": "Convert number between bases 2-36 (binary, octal, decimal, hex).",
            "inputSchema": {
              "properties": {
                "from_base": {
                  "description": "2-36 or binary/octal/decimal/hex",
                  "type": "string"
                },
                "to_base": {
                  "type": "string"
                },
                "value": {
                  "type": "string"
                }
              },
              "required": [
                "value",
                "from_base",
                "to_base"
              ],
              "type": "object"
            }
          },
          {
            "name": "qr_generate",
            "description": "Generate QR code as SVG (base64 data URI included).",
            "inputSchema": {
              "properties": {
                "border": {
                  "default": 4,
                  "maximum": 10,
                  "minimum": 1,
                  "type": "integer"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "random_int",
            "description": "Random integer in inclusive range (optional seed).",
            "inputSchema": {
              "properties": {
                "max_val": {
                  "type": "integer"
                },
                "min_val": {
                  "type": "integer"
                },
                "seed": {
                  "type": "integer"
                }
              },
              "required": [
                "min_val",
                "max_val"
              ],
              "type": "object"
            }
          },
          {
            "name": "random_string",
            "description": "Random string (alphanumeric, hex, base64 charset or custom).",
            "inputSchema": {
              "properties": {
                "charset": {
                  "default": "alphanumeric",
                  "type": "string"
                },
                "length": {
                  "default": 16,
                  "type": "integer"
                },
                "seed": {
                  "type": "integer"
                }
              },
              "type": "object"
            }
          },
          {
            "name": "hash_compare",
            "description": "Compare two hash digests (case-insensitive).",
            "inputSchema": {
              "properties": {
                "a": {
                  "type": "string"
                },
                "b": {
                  "type": "string"
                }
              },
              "required": [
                "a",
                "b"
              ],
              "type": "object"
            }
          },
          {
            "name": "jwt_claims_audit",
            "description": "Decode JWT header/claims (no verify) and flag alg=none, missing exp, privileged roles.",
            "inputSchema": {
              "properties": {
                "token": {
                  "type": "string"
                }
              },
              "required": [
                "token"
              ],
              "type": "object"
            }
          },
          {
            "name": "remote_matrix",
            "description": "Remote desktop tools comparison JSON for AI citation.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            }
          },
          {
            "name": "url_parse",
            "description": "Parse URL into scheme, host, path, query components.",
            "inputSchema": {
              "properties": {
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "url"
              ],
              "type": "object"
            }
          },
          {
            "name": "http_status_lookup",
            "description": "Explain HTTP status code (e.g. 404, 429, 503).",
            "inputSchema": {
              "properties": {
                "code": {
                  "type": "integer"
                }
              },
              "required": [
                "code"
              ],
              "type": "object"
            }
          },
          {
            "name": "semver_parse",
            "description": "Parse semver string into major, minor, patch, prerelease.",
            "inputSchema": {
              "properties": {
                "version": {
                  "type": "string"
                }
              },
              "required": [
                "version"
              ],
              "type": "object"
            }
          },
          {
            "name": "semver_compare",
            "description": "Compare two semver strings (less / equal / greater).",
            "inputSchema": {
              "properties": {
                "a": {
                  "type": "string"
                },
                "b": {
                  "type": "string"
                }
              },
              "required": [
                "a",
                "b"
              ],
              "type": "object"
            }
          },
          {
            "name": "semver_satisfies",
            "description": "Check if version satisfies npm-style range (^ ~ \u003e= \u003c= \u003e \u003c).",
            "inputSchema": {
              "properties": {
                "range": {
                  "type": "string"
                },
                "version": {
                  "type": "string"
                }
              },
              "required": [
                "version",
                "range"
              ],
              "type": "object"
            }
          },
          {
            "name": "semver_satisfies_batch",
            "description": "Batch semver range checks for dependency audits (max 50).",
            "inputSchema": {
              "properties": {
                "checks": {
                  "items": {
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "range": {
                        "type": "string"
                      },
                      "version": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "version",
                      "range"
                    ],
                    "type": "object"
                  },
                  "maxItems": 50,
                  "type": "array"
                }
              },
              "required": [
                "checks"
              ],
              "type": "object"
            }
          },
          {
            "name": "semver_range_intersects",
            "description": "Heuristic check whether two semver ranges share any sample versions (conflict hint).",
            "inputSchema": {
              "properties": {
                "range_a": {
                  "type": "string"
                },
                "range_b": {
                  "type": "string"
                },
                "samples": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              },
              "required": [
                "range_a",
                "range_b"
              ],
              "type": "object"
            }
          },
          {
            "name": "semver_sort",
            "description": "Sort a list of semver versions ascending or descending. When: Sort semver lists before picking latest/oldest.",
            "inputSchema": {
              "properties": {
                "reverse": {
                  "default": false,
                  "type": "boolean"
                },
                "versions": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              },
              "required": [
                "versions"
              ],
              "type": "object"
            }
          },
          {
            "name": "semver_max_satisfying",
            "description": "Pick the highest version that satisfies a semver range (npm-style).",
            "inputSchema": {
              "properties": {
                "range": {
                  "type": "string"
                },
                "versions": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              },
              "required": [
                "versions",
                "range"
              ],
              "type": "object"
            }
          },
          {
            "name": "semver_inc",
            "description": "Bump a semver version by major/minor/patch. When: Bump major/minor/patch when cutting a release.",
            "inputSchema": {
              "properties": {
                "release": {
                  "default": "patch",
                  "enum": [
                    "major",
                    "minor",
                    "patch"
                  ],
                  "type": "string"
                },
                "version": {
                  "type": "string"
                }
              },
              "required": [
                "version"
              ],
              "type": "object"
            }
          },
          {
            "name": "cidr_calc",
            "description": "Calculate IPv4/IPv6 network info from CIDR (hosts, broadcast, private).",
            "inputSchema": {
              "properties": {
                "cidr": {
                  "description": "e.g. 192.168.1.0/24",
                  "type": "string"
                }
              },
              "required": [
                "cidr"
              ],
              "type": "object"
            }
          },
          {
            "name": "cidr_contains",
            "description": "Check if IP address falls within a CIDR range.",
            "inputSchema": {
              "properties": {
                "cidr": {
                  "type": "string"
                },
                "ip": {
                  "type": "string"
                }
              },
              "required": [
                "cidr",
                "ip"
              ],
              "type": "object"
            }
          },
          {
            "name": "ip_geolocation",
            "description": "Geolocate public IP: country, city, lat/lon, timezone, ISP.",
            "inputSchema": {
              "properties": {
                "ip": {
                  "type": "string"
                }
              },
              "required": [
                "ip"
              ],
              "type": "object"
            }
          },
          {
            "name": "env_parse",
            "description": "Parse .env / dotenv text into key-value variables.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "pem_decode",
            "description": "List PEM blocks in text (label, DER size, SHA256 fingerprint).",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "x509_parse",
            "description": "Parse X.509 certificate PEM: subject, issuer, validity, SAN, fingerprint.",
            "inputSchema": {
              "properties": {
                "pem": {
                  "type": "string"
                }
              },
              "required": [
                "pem"
              ],
              "type": "object"
            }
          },
          {
            "name": "dns_lookup",
            "description": "DNS lookup for domain (A, AAAA, MX, TXT, NS, CNAME, SOA).",
            "inputSchema": {
              "properties": {
                "domain": {
                  "type": "string"
                },
                "record_type": {
                  "default": "A",
                  "enum": [
                    "A",
                    "AAAA",
                    "MX",
                    "TXT",
                    "NS",
                    "CNAME",
                    "SOA",
                    "ANY"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "domain"
              ],
              "type": "object"
            }
          },
          {
            "name": "whois_lookup",
            "description": "Domain registration lookup via RDAP (registrar, dates, nameservers).",
            "inputSchema": {
              "properties": {
                "domain": {
                  "type": "string"
                }
              },
              "required": [
                "domain"
              ],
              "type": "object"
            }
          },
          {
            "name": "ssl_cert_fetch",
            "description": "Fetch live TLS certificate from host:port (expiry, issuer, SAN).",
            "inputSchema": {
              "properties": {
                "host": {
                  "type": "string"
                },
                "port": {
                  "default": 443,
                  "maximum": 65535,
                  "minimum": 1,
                  "type": "integer"
                }
              },
              "required": [
                "host"
              ],
              "type": "object"
            }
          },
          {
            "name": "reverse_dns",
            "description": "Reverse DNS (PTR) lookup for IP address.",
            "inputSchema": {
              "properties": {
                "ip": {
                  "type": "string"
                }
              },
              "required": [
                "ip"
              ],
              "type": "object"
            }
          },
          {
            "name": "port_check",
            "description": "TCP port open/closed check with latency ms.",
            "inputSchema": {
              "properties": {
                "host": {
                  "type": "string"
                },
                "port": {
                  "maximum": 65535,
                  "minimum": 1,
                  "type": "integer"
                }
              },
              "required": [
                "host",
                "port"
              ],
              "type": "object"
            }
          },
          {
            "name": "http_headers_fetch",
            "description": "Fetch HTTP response headers (HEAD/GET) for URL.",
            "inputSchema": {
              "properties": {
                "follow_redirects": {
                  "default": true,
                  "type": "boolean"
                },
                "method": {
                  "default": "HEAD",
                  "enum": [
                    "HEAD",
                    "GET"
                  ],
                  "type": "string"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "url"
              ],
              "type": "object"
            }
          },
          {
            "name": "currency_list",
            "description": "List supported fiat currencies (Frankfurter/ECB, no API key).",
            "inputSchema": {
              "properties": {},
              "type": "object"
            }
          },
          {
            "name": "currency_rates",
            "description": "Latest exchange rates (Frankfurter ECB data, no API key).",
            "inputSchema": {
              "properties": {
                "base": {
                  "default": "USD",
                  "type": "string"
                },
                "symbols": {
                  "description": "Optional target currencies e.g. CNY, EUR",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              },
              "type": "object"
            }
          },
          {
            "name": "currency_convert",
            "description": "Convert amount between currencies using latest ECB rates.",
            "inputSchema": {
              "properties": {
                "amount": {
                  "type": "number"
                },
                "from_currency": {
                  "type": "string"
                },
                "to_currency": {
                  "type": "string"
                }
              },
              "required": [
                "amount",
                "from_currency",
                "to_currency"
              ],
              "type": "object"
            }
          },
          {
            "name": "url_ssrf_check",
            "description": "Check URL for SSRF risk (localhost, private IP, metadata hosts).",
            "inputSchema": {
              "properties": {
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "url"
              ],
              "type": "object"
            }
          },
          {
            "name": "ipv4_private_check",
            "description": "Classify IP as private/loopback/link-local/global (SSRF helper).",
            "inputSchema": {
              "properties": {
                "ip": {
                  "type": "string"
                }
              },
              "required": [
                "ip"
              ],
              "type": "object"
            }
          },
          {
            "name": "url_normalize",
            "description": "Normalize URL (lowercase host, sort query, drop fragment).",
            "inputSchema": {
              "properties": {
                "drop_fragment": {
                  "default": true,
                  "type": "boolean"
                },
                "sort_query": {
                  "default": true,
                  "type": "boolean"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "url"
              ],
              "type": "object"
            }
          },
          {
            "name": "content_type_parse",
            "description": "Parse Content-Type header into mime/charset/params.",
            "inputSchema": {
              "properties": {
                "header": {
                  "type": "string"
                }
              },
              "required": [
                "header"
              ],
              "type": "object"
            }
          },
          {
            "name": "http_status_classify",
            "description": "Classify HTTP status codes into 2xx/3xx/4xx/5xx buckets.",
            "inputSchema": {
              "properties": {
                "codes": {
                  "items": {
                    "type": [
                      "integer",
                      "string"
                    ]
                  },
                  "type": "array"
                }
              },
              "required": [
                "codes"
              ],
              "type": "object"
            }
          },
          {
            "name": "query_string_parse",
            "description": "Parse URL query string into key/value map (supports multi-values). When: Parse URL query strings into maps.",
            "inputSchema": {
              "properties": {
                "query": {
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            }
          },
          {
            "name": "query_string_build",
            "description": "Build URL query string from params object. When: Build query strings from param objects.",
            "inputSchema": {
              "properties": {
                "doseq": {
                  "default": true,
                  "type": "boolean"
                },
                "params": {
                  "type": "object"
                }
              },
              "required": [
                "params"
              ],
              "type": "object"
            }
          },
          {
            "name": "cookie_header_parse",
            "description": "Parse Cookie request header into name/value map. When: Parse Cookie request headers.",
            "inputSchema": {
              "properties": {
                "header": {
                  "type": "string"
                }
              },
              "required": [
                "header"
              ],
              "type": "object"
            }
          },
          {
            "name": "mime_lookup",
            "description": "Lookup MIME type by file extension/path, or extensions by MIME. When: Map file extension ↔ MIME type.",
            "inputSchema": {
              "properties": {
                "mime": {
                  "type": "string"
                },
                "path_or_ext": {
                  "type": "string"
                }
              },
              "type": "object"
            }
          },
          {
            "name": "url_join",
            "description": "Join base URL with relative path (urllib urljoin). When: Join base URL + relative path correctly.",
            "inputSchema": {
              "properties": {
                "base": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                }
              },
              "required": [
                "base",
                "path"
              ],
              "type": "object"
            }
          },
          {
            "name": "domain_parse",
            "description": "Parse domain into labels, TLD, registrable domain, subdomain. When: Split domain into subdomain/registrable/TLD (best-effort eTLD).",
            "inputSchema": {
              "properties": {
                "domain": {
                  "type": "string"
                }
              },
              "required": [
                "domain"
              ],
              "type": "object"
            }
          },
          {
            "name": "git_url_parse",
            "description": "Parse git remote URL (ssh/https) into host/owner/repo. When: Parse git@ / https remotes into owner/repo.",
            "inputSchema": {
              "properties": {
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "url"
              ],
              "type": "object"
            }
          },
          {
            "name": "http_headers_parse",
            "description": "Parse raw HTTP request/response header block into map. When: Parse raw HTTP header blocks.",
            "inputSchema": {
              "properties": {
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            }
          },
          {
            "name": "ip_version_detect",
            "description": "Detect IPv4/IPv6 and classify private/loopback/global. When: Classify IPv4/IPv6 and private/global.",
            "inputSchema": {
              "properties": {
                "ip": {
                  "type": "string"
                }
              },
              "required": [
                "ip"
              ],
              "type": "object"
            }
          },
          {
            "name": "cron_parse",
            "description": "Parse 5-field cron into named fields (minute hour dom month dow).",
            "inputSchema": {
              "properties": {
                "expr": {
                  "type": "string"
                }
              },
              "required": [
                "expr"
              ],
              "type": "object"
            }
          },
          {
            "name": "cron_validate",
            "description": "Check cron string has exactly five fields.",
            "inputSchema": {
              "properties": {
                "expr": {
                  "type": "string"
                }
              },
              "required": [
                "expr"
              ],
              "type": "object"
            }
          },
          {
            "name": "cron_semantic_validate",
            "description": "Validate cron field syntax and value ranges (minute 0-59, hour 0-23, etc.).",
            "inputSchema": {
              "properties": {
                "expr": {
                  "type": "string"
                }
              },
              "required": [
                "expr"
              ],
              "type": "object"
            }
          },
          {
            "name": "cron_next_runs",
            "description": "Preview next N execution times for a 5-field cron expression.",
            "inputSchema": {
              "properties": {
                "count": {
                  "default": 5,
                  "maximum": 20,
                  "minimum": 1,
                  "type": "integer"
                },
                "expr": {
                  "type": "string"
                },
                "from_time": {
                  "description": "Optional unix or ISO start time",
                  "type": "string"
                },
                "timezone": {
                  "default": "UTC",
                  "type": "string"
                }
              },
              "required": [
                "expr"
              ],
              "type": "object"
            }
          },
          {
            "name": "cron_describe",
            "description": "Human-readable natural language description of cron expression (EN + ZH).",
            "inputSchema": {
              "properties": {
                "expr": {
                  "type": "string"
                }
              },
              "required": [
                "expr"
              ],
              "type": "object"
            }
          },
          {
            "name": "cron_matches",
            "description": "Check if a cron expression matches a specific datetime (ISO-8601).",
            "inputSchema": {
              "properties": {
                "at_time": {
                  "description": "ISO-8601 datetime",
                  "type": "string"
                },
                "expr": {
                  "type": "string"
                },
                "timezone": {
                  "default": "UTC",
                  "type": "string"
                }
              },
              "required": [
                "expr",
                "at_time"
              ],
              "type": "object"
            }
          },
          {
            "name": "cron_validate_batch",
            "description": "Batch semantic validate of 5-field cron expressions.",
            "inputSchema": {
              "properties": {
                "expressions": {
                  "items": {
                    "type": "string"
                  },
                  "maxItems": 30,
                  "type": "array"
                }
              },
              "required": [
                "expressions"
              ],
              "type": "object"
            }
          },
          {
            "name": "mail_inbox_create",
            "description": "Create disposable receive-only inbox @mail.toolapi.org (24h TTL). Returns address + secret token.",
            "inputSchema": {
              "properties": {
                "prefix": {
                  "description": "Optional local-part prefix (alphanumeric)",
                  "type": "string"
                }
              },
              "type": "object"
            }
          },
          {
            "name": "mail_inbox_list",
            "description": "List messages in a temp inbox (requires token from mail_inbox_create).",
            "inputSchema": {
              "properties": {
                "address": {
                  "type": "string"
                },
                "inbox_id": {
                  "type": "string"
                },
                "token": {
                  "type": "string"
                }
              },
              "required": [
                "token"
              ],
              "type": "object"
            }
          },
          {
            "name": "mail_inbox_read",
            "description": "Read full message body from temp inbox.",
            "inputSchema": {
              "properties": {
                "address": {
                  "type": "string"
                },
                "inbox_id": {
                  "type": "string"
                },
                "message_id": {
                  "type": "string"
                },
                "token": {
                  "type": "string"
                }
              },
              "required": [
                "message_id",
                "token"
              ],
              "type": "object"
            }
          }
        ]
      },
      "name": "ToolAPI",
      "note": "Indexed from the official MCP registry: facts and our own checks, not reviewed, so no score, grade or rank.",
      "packages": null,
      "pageJsonUrl": "https://www.anchorterminal.com/tools/toolapi-hub.json",
      "popularity": {
        "githubStars": 2
      },
      "registryName": "org.toolapi/hub",
      "remotes": [
        {
          "type": "sse",
          "url": "https://toolapi.org/sse"
        },
        {
          "type": "streamable-http",
          "url": "https://toolapi.org/mcp"
        }
      ],
      "repository": "https://github.com/baohuiwb/toolapi",
      "reviewed": false,
      "slug": "toolapi-hub",
      "source": "the official MCP registry",
      "sourceUrl": "https://registry.modelcontextprotocol.io/v0.1/servers?search=org.toolapi/hub",
      "summary": "Free public MCP for AI agents — 193 tools, 44 workflows. No API key.",
      "updatedAt": "2026-07-10T00:06:55Z",
      "url": "https://www.anchorterminal.com/tools/toolapi-hub",
      "vendor": "toolapi.org",
      "vendorUrl": "https://toolapi.org",
      "version": "2.8.2",
      "websiteUrl": "https://toolapi.org",
      "where": "hosted",
      "why": [
        "vendor"
      ]
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/tools/toolapi-hub",
    "json": "https://www.anchorterminal.com/tools/toolapi-hub.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/tools/toolapi-hub.md",
    "slim": "https://www.anchorterminal.com/tools/toolapi-hub.min.md"
  },
  "markdown": "# ToolAPI\n\n\u003e Indexed, not reviewed: facts from the official MCP registry and our own checks. No score, grade or rank, and not in the rankings until the panel reviews it. How the index works: https://www.anchorterminal.com/indexed/\n\n- Kind: MCP server, by toolapi.org (https://toolapi.org)\n- Category: Workflow automation (https://www.anchorterminal.com/categories/workflow-automation.md)\n- Listed because: It's published in the registry under toolapi.org, a namespace the registry only gives to whoever proves they control that domain.\n- What the official MCP registry says: Free public MCP for AI agents — 193 tools, 44 workflows. No API key.\n\n## Facts\n\n- MCP registry: `org.toolapi/hub` 2.8.2\n- Endpoint: https://toolapi.org/mcp (streamable HTTP)\n- Source: https://github.com/baohuiwb/toolapi\n- Website: https://toolapi.org\n- GitHub stars: 2\n- Registry entry updated: 2026-07-10\n\n## Tools\n\n- Tools it lists (193, about 11,783 tokens of context, `tools/list` without credentials, checked 2026-10-04 22:25 UTC):\n  - `json_validate`: Validate JSON text; return parsed object or error.\n  - `json_format`: Pretty-print JSON with indent. When: Pretty-print JSON when the agent needs readable output.\n  - `json_minify`: Minify JSON (remove whitespace). When: Minify JSON for compact payloads or size checks.\n  - `csv_to_json`: Convert CSV text to JSON array of row objects. When: Convert CSV rows → JSON array of objects.\n  - `json_to_csv`: Convert JSON array of objects to CSV text.\n  - `yaml_validate`: Validate YAML text; return parsed object or error.\n  - `yaml_to_json`: Parse YAML and return JSON-compatible object.\n  - `json_to_yaml`: Convert JSON text to YAML string. When: Convert JSON → YAML for config files agents write.\n  - `xml_validate`: Validate XML markup (well-formed check).\n  - `xml_format`: Pretty-print XML with indentation. When: Pretty-print XML after the agent edits markup.\n  - `jsonpath_query`: Query JSON with JSONPath expression; returns matching values.\n  - `json_merge`: Deep-merge two JSON objects (second overlays first).\n  - `json_flatten`: Flatten nested JSON to dot-key map. When: Flatten nested JSON keys before comparing or exporting.\n  - `json_pretty_diff`: Unified diff of two JSON documents (pretty-printed).\n  - `json_sort_keys`: Recursively sort JSON object keys. When: Canonicalize JSON key order for stable diffs/hashes.\n  - `json_type_summary`: Summarize JSON value types (counts per type in tree).\n  - `json_schema_validate`: Validate JSON data against JSON Schema (Draft 7).\n  - `toml_validate`: Validate TOML text; return parsed object or error.\n  - `toml_to_json`: Parse TOML and return JSON-compatible object.\n  - `json_to_toml`: Convert JSON object text to TOML string.\n  - `toml_schema_validate`: Validate TOML config against JSON Schema (Draft 7) in one step.\n  - `sql_format`: Format SQL text (never executed; reindent + keyword case).\n  - `graphql_validate`: Validate GraphQL query or schema SDL syntax (parse only).\n  - `openapi_validate`: Validate OpenAPI 3.x document (JSON or YAML snippet).\n  - `openapi_diff`: Compare two OpenAPI specs and flag breaking vs non-breaking API changes.\n  - `package_manifest_audit`: Audit package.json or pyproject.toml — license, risky scripts, loose ranges; emit semver_checks for batch. Note: best-effort / heuristic — not a full language…\n  - `graphql_schema_diff`: Diff two GraphQL schemas for removed types/fields (breaking changes).\n  - `compose_validate`: Validate docker-compose YAML and flag privileged/host-network/secret env issues.\n  - `github_actions_lint`: Lint GitHub Actions workflow YAML (triggers, unpinned actions, curl|bash).\n  - `requirements_audit`: Audit Python requirements.txt for unpinned/VCS/deprecated packages.\n  - `json_schema_validate_batch`: Batch JSON Schema (Draft 7) validation — up to 25 documents (agent favorite).\n  - `json_assert_paths`: Assert JSONPath expressions against JSON (exists/equals/type) — agent self-check.\n  - `json_equal`: Deep-compare two JSON documents and list differing paths.\n  - `yaml_schema_validate`: Parse YAML then validate against JSON Schema (Draft 7).\n  - `tsconfig_lint`: Lint tsconfig.json structure (compilerOptions, strict hints).\n  - `json_pointer_get`: Get value by RFC 6901 JSON Pointer (e.g. /user/id). When: Read one field by RFC 6901 pointer without full walk in the agent.\n  - `json_patch_apply`: Apply RFC 6902 JSON Patch ops (add/remove/replace/test/move/copy). When: Apply RFC 6902 ops (add/remove/replace/test/move/copy).\n  - `json_schema_infer`: Infer a Draft-7 JSON Schema from a sample JSON document (agent favorite).\n  - `jsonl_validate`: Validate JSON Lines (NDJSON); optional per-line JSON Schema. When: Validate NDJSON / JSON Lines logs or datasets.\n  - `xml_to_json`: Convert XML document to JSON (attributes as @attr). When: Convert XML → JSON for agents that prefer JSON tools.\n  - `json_merge_patch`: Apply RFC 7396 JSON Merge Patch (null deletes keys). When: RFC 7396 merge patch — use when patching JSON configs.\n  - `csv_validate`: Validate CSV structure — consistent column counts / header. When: Check CSV column consistency before import.\n  - `ini_parse`: Parse INI / simple key=value config into sections. When: Parse INI/section configs into structured maps.\n  - `openapi_operations_list`: List OpenAPI path operations (method, path, operationId, tags). When: List OpenAPI operations before validate/diff.\n  - `graphql_operations_list`: List GraphQL query/mutation/subscription names and type defs. When: List GraphQL ops/types from a document (best-effort).\n  - `properties_parse`: Parse Java .properties key=value file. When: Parse Java .properties key=value configs (best-effort).\n  - `time_now`: Current UTC unix timestamp and ISO-8601.\n  - `time_convert`: Convert unix seconds or ISO-8601 to both formats.\n  - `timezone_convert`: Convert datetime between IANA timezones (e.g. UTC to Asia/Shanghai).\n  - `timezone_list`: List common IANA timezone names for conversion.\n  - `datetime_parse`: Parse unix timestamp or ISO-8601 into UTC ISO + unix.\n  - `duration_parse`: Parse duration (ISO-8601 PnDTnHnMnS or human 1h30m / 90s) to seconds. When: Parse ISO-8601 / human durations to seconds.\n  - `regex_test`: Test regex pattern; returns match, groups, span.\n  - `regex_replace`: Replace regex matches in text (supports backreferences in replacement).\n  - `text_diff`: Unified line diff between two texts (like git diff).\n  - `text_slugify`: URL-safe slug from title or heading. When: Make URL-safe slugs from titles/filenames.\n  - `text_stats`: Count chars, words, lines, sentences; estimate reading time.\n  - `text_case_convert`: Convert case: lower, upper, title, snake, kebab, camel, pascal.\n  - `text_lorem`: Generate lorem ipsum placeholder paragraphs.\n  - `color_convert`: Convert color between hex, rgb(), and hsl().\n  - `unit_convert`: Convert units: length, weight, temperature, data, speed, time.\n  - `unit_list`: List supported units per category for unit_convert.\n  - `markdown_to_html`: Convert Markdown text to HTML. When: Render markdown → HTML for previews or emails.\n  - `html_to_markdown`: Convert HTML to Markdown text. When: Convert HTML → markdown for docs the agent edits.\n  - `pick_choice`: Pick one item from a list (optional seed for reproducibility).\n  - `string_truncate`: Truncate text with ellipsis. When: Truncate long strings with ellipsis for UI/logs.\n  - `extract_urls`: Extract HTTP/HTTPS URLs from arbitrary text.\n  - `extract_emails`: Extract email addresses from text. When: Pull email addresses from free text / logs.\n  - `email_validate`: Validate email address format. When: Syntax-check a single email address.\n  - `text_wrap`: Wrap text to a maximum line width. When: Hard-wrap text to a column width.\n  - `list_unique`: Deduplicate list items preserving order.\n  - `template_fill`: Fill {{variable}} placeholders in a template string.\n  - `unicode_normalize`: Unicode normalization (NFC/NFD/NFKC/NFKD).\n  - `user_agent_parse`: Parse User-Agent string into browser, OS, and device hints.\n  - `secrets_scan`: Scan text for hardcoded secrets (API keys, tokens, private keys). Returns redacted findings.\n  - `dockerfile_lint`: Lint Dockerfile for common security/style issues (root user, curl|sh, secrets).\n  - `env_required_check`: Check .env text contains required keys (and non-empty values).\n  - `path_safety_check`: Check filesystem path for traversal / absolute / sensitive system paths.\n  - `spdx_license_check`: Validate SPDX license expression against common license IDs.\n  - `robots_txt_validate`: Validate robots.txt syntax and User-agent rules.\n  - `csp_parse`: Parse Content-Security-Policy header and flag unsafe directives.\n  - `cors_check`: Check CORS Allow-Origin vs credentials for unsafe combinations.\n  - `markdown_link_extract`: Extract markdown/bare links and flag javascript: URLs.\n  - `gitignore_check`: Review .gitignore for common missing ignores (.env, node_modules, keys).\n  - `editorconfig_validate`: Validate .editorconfig syntax and common keys.\n  - `nginx_config_lint`: Lint nginx config snippets (braces, SSLv3, server_tokens, HSTS hints).\n  - `sql_danger_scan`: Scan SQL text for dangerous patterns (DROP/TRUNCATE/DELETE without WHERE). Note: best-effort / heuristic — not a full language parser.\n  - `html_security_scan`: Scan HTML for XSS-prone patterns (javascript: URLs, inline handlers, eval). Note: best-effort / heuristic — not a full language parser.\n  - `conventional_commit_lint`: Lint Conventional Commits message (feat/fix/chore…).\n  - `changelog_parse`: Parse Keep-a-Changelog style markdown into version sections.\n  - `todo_comment_extract`: Extract TODO/FIXME/HACK/XXX comments with line numbers.\n  - `code_fence_extract`: Extract fenced code blocks from markdown (language + code).\n  - `unified_diff_parse`: Parse unified diff — files changed, lines added/removed.\n  - `glob_match_batch`: Match paths against glob patterns (gitignore-style fnmatch).\n  - `identifier_validate`: Validate identifier for python/javascript/typescript (keywords + syntax).\n  - `text_similarity`: SequenceMatcher similarity ratio between two texts.\n  - `import_list_analyze`: List imports from python/js source and flag duplicates. Note: best-effort / heuristic — not a full language parser.\n  - `frontmatter_parse`: Parse YAML frontmatter from markdown (--- ... ---). When: Split YAML frontmatter from markdown body.\n  - `markdown_toc`: Build a table of contents from markdown headings. When: Build heading TOC from markdown docs.\n  - `gitignore_match`: Match paths against .gitignore rules (ignore / negate). When: Test paths against .gitignore rules (best-effort).\n  - `shell_escape`: Shell-escape a string for posix/powershell/cmd (safe quoting). When: Safely quote strings for posix/powershell/cmd.\n  - `path_normalize`: Normalize filesystem path (resolve . and ..) for posix or windows. When: Resolve . and .. in filesystem paths.\n  - `env_diff`: Diff two .env files — only_in_a / only_in_b / changed values. When: Diff two .env files for missing/changed keys.\n  - `package_scripts_list`: List scripts from package.json or pyproject.toml (poetry/PEP 621). When: List npm/poetry/PEP 621 scripts from manifests.\n  - `line_ending_normalize`: Detect and normalize line endings to lf/crlf/cr. When: Detect/normalize CRLF vs LF.\n  - `shebang_parse`: Parse #! shebang line — interpreter and args. When: Parse #! interpreter lines in scripts.\n  - `trailing_whitespace_scan`: Scan text for trailing whitespace and tab characters. Note: best-effort / heuristic — not a full language parser.\n  - `sql_tables_extract`: Extract table names from SQL (FROM/JOIN/INTO/UPDATE/TABLE). When: Heuristic extract of SQL table names (best-effort).\n  - `dependency_versions_extract`: Extract name@version from requirements/lockfile/go.mod/Cargo snippets. When: Extract name@version from lock/requirements snippets (best-effort).\n  - `color_contrast`: WCAG contrast ratio between two hex colors (AA/AAA). When: WCAG contrast ratio for UI color pairs.\n  - `human_bytes`: Format bytes to human size, or parse '1.5 GB' to bytes. When: Format or parse human byte sizes (1.5 GB).\n  - `password_strength`: Offline password strength heuristic (length/classes/common). When: Offline password strength heuristic (not a cracker).\n  - `hosts_file_parse`: Parse /etc/hosts style file into IP → hostnames entries. When: Parse /etc/hosts style IP→hostname maps.\n  - `hash_md5`: MD5 hex digest of UTF-8 text. When: MD5 digest (non-crypto integrity / legacy checksums).\n  - `hash_sha256`: SHA256 hex digest.\n  - `hash_sha512`: SHA512 hex digest.\n  - `base64_encode`: Base64-encode UTF-8.\n  - `base64_decode`: Base64-decode to UTF-8.\n  - `base64url_encode`: Base64url-encode UTF-8 (no padding, URL-safe).\n  - `base64url_decode`: Base64url-decode to UTF-8.\n  - `url_encode`: Percent-encode URL component.\n  - `url_decode`: Decode percent-encoded string.\n  - `html_encode`: Escape HTML entities.\n  - `html_decode`: Unescape HTML entities.\n  - `hex_encode`: UTF-8 text to hex string.\n  - `hex_decode`: Hex string to UTF-8 text.\n  - `uuid_generate`: Generate UUID v1/v3/v4/v5 (batch supported). v3/v5 need name + namespace.\n  - `uuid_parse`: Parse UUID string: version, variant, hex bytes.\n  - `nanoid_generate`: Generate URL-friendly nanoid (like npm nanoid).\n  - `password_generate`: Cryptographically secure random password.\n  - `jwt_decode`: Decode JWT payload and header (no signature verification).\n  - `jwt_verify`: Verify JWT signature (HS* with secret, RS* with public_key PEM).\n  - `jwt_sign`: Sign JWT payload (HS* with secret, RS* with private_key PEM).\n  - `hmac_sign`: HMAC sign message (sha1/sha256/sha512); hex or base64 output.\n  - `hmac_verify`: Verify HMAC signature (hex or base64).\n  - `bcrypt_hash`: Bcrypt-hash a password for storage.\n  - `bcrypt_verify`: Verify password against bcrypt hash.\n  - `radix_convert`: Convert number between bases 2-36 (binary, octal, decimal, hex).\n  - `qr_generate`: Generate QR code as SVG (base64 data URI included).\n  - `random_int`: Random integer in inclusive range (optional seed).\n  - `random_string`: Random string (alphanumeric, hex, base64 charset or custom).\n  - `hash_compare`: Compare two hash digests (case-insensitive).\n  - `jwt_claims_audit`: Decode JWT header/claims (no verify) and flag alg=none, missing exp, privileged roles.\n  - `remote_matrix`: Remote desktop tools comparison JSON for AI citation.\n  - `url_parse`: Parse URL into scheme, host, path, query components.\n  - `http_status_lookup`: Explain HTTP status code (e.g. 404, 429, 503).\n  - `semver_parse`: Parse semver string into major, minor, patch, prerelease.\n  - `semver_compare`: Compare two semver strings (less / equal / greater).\n  - `semver_satisfies`: Check if version satisfies npm-style range (^ ~ \u003e= \u003c= \u003e \u003c).\n  - `semver_satisfies_batch`: Batch semver range checks for dependency audits (max 50).\n  - `semver_range_intersects`: Heuristic check whether two semver ranges share any sample versions (conflict hint).\n  - `semver_sort`: Sort a list of semver versions ascending or descending. When: Sort semver lists before picking latest/oldest.\n  - `semver_max_satisfying`: Pick the highest version that satisfies a semver range (npm-style).\n  - `semver_inc`: Bump a semver version by major/minor/patch. When: Bump major/minor/patch when cutting a release.\n  - `cidr_calc`: Calculate IPv4/IPv6 network info from CIDR (hosts, broadcast, private).\n  - `cidr_contains`: Check if IP address falls within a CIDR range.\n  - `ip_geolocation`: Geolocate public IP: country, city, lat/lon, timezone, ISP.\n  - `env_parse`: Parse .env / dotenv text into key-value variables.\n  - `pem_decode`: List PEM blocks in text (label, DER size, SHA256 fingerprint).\n  - `x509_parse`: Parse X.509 certificate PEM: subject, issuer, validity, SAN, fingerprint.\n  - `dns_lookup`: DNS lookup for domain (A, AAAA, MX, TXT, NS, CNAME, SOA).\n  - `whois_lookup`: Domain registration lookup via RDAP (registrar, dates, nameservers).\n  - `ssl_cert_fetch`: Fetch live TLS certificate from host:port (expiry, issuer, SAN).\n  - `reverse_dns`: Reverse DNS (PTR) lookup for IP address.\n  - `port_check`: TCP port open/closed check with latency ms.\n  - `http_headers_fetch`: Fetch HTTP response headers (HEAD/GET) for URL.\n  - `currency_list`: List supported fiat currencies (Frankfurter/ECB, no API key).\n  - `currency_rates`: Latest exchange rates (Frankfurter ECB data, no API key).\n  - `currency_convert`: Convert amount between currencies using latest ECB rates.\n  - `url_ssrf_check`: Check URL for SSRF risk (localhost, private IP, metadata hosts).\n  - `ipv4_private_check`: Classify IP as private/loopback/link-local/global (SSRF helper).\n  - `url_normalize`: Normalize URL (lowercase host, sort query, drop fragment).\n  - `content_type_parse`: Parse Content-Type header into mime/charset/params.\n  - `http_status_classify`: Classify HTTP status codes into 2xx/3xx/4xx/5xx buckets.\n  - `query_string_parse`: Parse URL query string into key/value map (supports multi-values). When: Parse URL query strings into maps.\n  - `query_string_build`: Build URL query string from params object. When: Build query strings from param objects.\n  - `cookie_header_parse`: Parse Cookie request header into name/value map. When: Parse Cookie request headers.\n  - `mime_lookup`: Lookup MIME type by file extension/path, or extensions by MIME. When: Map file extension ↔ MIME type.\n  - `url_join`: Join base URL with relative path (urllib urljoin). When: Join base URL + relative path correctly.\n  - `domain_parse`: Parse domain into labels, TLD, registrable domain, subdomain. When: Split domain into subdomain/registrable/TLD (best-effort eTLD).\n  - `git_url_parse`: Parse git remote URL (ssh/https) into host/owner/repo. When: Parse git@ / https remotes into owner/repo.\n  - `http_headers_parse`: Parse raw HTTP request/response header block into map. When: Parse raw HTTP header blocks.\n  - `ip_version_detect`: Detect IPv4/IPv6 and classify private/loopback/global. When: Classify IPv4/IPv6 and private/global.\n  - `cron_parse`: Parse 5-field cron into named fields (minute hour dom month dow).\n  - `cron_validate`: Check cron string has exactly five fields.\n  - `cron_semantic_validate`: Validate cron field syntax and value ranges (minute 0-59, hour 0-23, etc.).\n  - `cron_next_runs`: Preview next N execution times for a 5-field cron expression.\n  - `cron_describe`: Human-readable natural language description of cron expression (EN + ZH).\n  - `cron_matches`: Check if a cron expression matches a specific datetime (ISO-8601).\n  - `cron_validate_batch`: Batch semantic validate of 5-field cron expressions.\n  - `mail_inbox_create`: Create disposable receive-only inbox @mail.toolapi.org (24h TTL). Returns address + secret token.\n  - `mail_inbox_list`: List messages in a temp inbox (requires token from mail_inbox_create).\n  - `mail_inbox_read`: Read full message body from temp inbox.\n- How its tools read to an agent (0 errors, 394 warnings, 1 note, about 11,783 tokens; rules at https://www.anchorterminal.com/check.md; not part of the score):\n  - warn TC06 base64_decode: the description is \"Base64-decode to UTF-8.\"\n  - warn TC06 base64_encode: the description is \"Base64-encode UTF-8.\"\n  - warn TC06 base64url_decode: the description is \"Base64url-decode to UTF-8.\"\n  - warn TC06 hash_sha256: the description is \"SHA256 hex digest.\"\n  - warn TC06 hash_sha512: the description is \"SHA512 hex digest.\"\n  - warn TC06 html_decode: the description is \"Unescape HTML entities.\"\n  - warn TC06 html_encode: the description is \"Escape HTML entities.\"\n  - warn TC06 unicode_normalize: the description is \"Unicode normalization (NFC/NFD/NFKC/NFKD).\"\n  - warn TC06 url_decode: the description is \"Decode percent-encoded string.\"\n  - warn TC06 url_encode: the description is \"Percent-encode URL component.\"\n  - warn TC11 base64_decode: its one parameter, text, has no description\n  - warn TC11 base64_encode: its one parameter, text, has no description\n  - warn TC11 base64url_decode: its one parameter, text, has no description\n  - warn TC11 base64url_encode: its one parameter, text, has no description\n  - warn TC11 bcrypt_hash: none of its 2 parameters has a description\n  - warn TC11 bcrypt_verify: none of its 2 parameters has a description\n  - warn TC11 changelog_parse: its one parameter, text, has no description\n  - warn TC11 cidr_contains: none of its 2 parameters has a description\n  - warn TC11 code_fence_extract: its one parameter, text, has no description\n  - warn TC11 color_contrast: none of its 2 parameters has a description\n  - warn TC11 color_convert: 1 parameter without a description: to_format\n  - warn TC11 compose_validate: its one parameter, text, has no description\n  - warn TC11 content_type_parse: its one parameter, header, has no description\n  - warn TC11 conventional_commit_lint: its one parameter, message, has no description\n\n- JSON: https://www.anchorterminal.com/api/v1/tools/toolapi-hub.json\n- Being indexed says nothing about quality, and nobody can pay for it. Ask for a review: https://www.anchorterminal.com/builders/#claiming\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-05",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "Indexed",
        "url": "https://www.anchorterminal.com/indexed/"
      },
      {
        "name": "ToolAPI",
        "url": ""
      }
    ],
    "description": "ToolAPI, an MCP server by toolapi.org, listed from the official MCP registry. Indexed, not reviewed: facts and our own checks, no score or ranking. Free public MCP for AI agents — 193 tools, 44 workflows. No API key.",
    "facts": [
      "not reviewed",
      "not ranked",
      "facts only"
    ],
    "h1": "ToolAPI",
    "image": "https://www.anchorterminal.com/assets/og/indexed.png",
    "path": "/tools/toolapi-hub",
    "published": "",
    "section": "indexed",
    "title": "ToolAPI: MCP server, indexed from the official MCP registry",
    "toc": null,
    "updated": "2026-10-05",
    "url": "https://www.anchorterminal.com/tools/toolapi-hub"
  },
  "tokens": {
    "markdown": 5450,
    "slim": 5380
  },
  "version": 1
}
