{
  "name": "Slash — WebMCP",
  "description": "Tools registered in the page with document.modelContext.registerTool() (imperative) and a <form toolname> (declarative), for an AI agent working in the visitor’s browser. Every tool is local to the page: no server calls, no data leaves the browser.",
  "specification": "https://webmachinelearning.github.io/webmcp/",
  "status": "Draft browser API. Feature-detected; a no-op in browsers without WebMCP.",
  "api": [
    "document.modelContext",
    "navigator.modelContext"
  ],
  "tools": [
    {
      "name": "get_slash_overview",
      "type": "imperative",
      "availability": "every page",
      "description": "Summary of Slash (Rust web server, reverse proxy and Kubernetes Ingress controller), its built-in features, the AssaultCuirass WAF, the optional SPMPlus panel, benchmark numbers and the main links.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "lang": {
            "type": "string",
            "enum": [
              "en",
              "id"
            ],
            "description": "Answer language: en (English, default) or id (Bahasa Indonesia)."
          }
        }
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "compare_slash",
      "type": "imperative",
      "availability": "every page",
      "description": "Feature comparison of Slash with Caddy, Nginx and Apache httpd, or of SPMPlus with Nginx Proxy Manager. Optionally narrow to one product and/or one topic such as \"HTTP/3\", \"WAF\", \"PHP\" or \"rate limiting\".",
      "inputSchema": {
        "type": "object",
        "properties": {
          "against": {
            "type": "string",
            "enum": [
              "all",
              "caddy",
              "nginx",
              "apache",
              "nginx-proxy-manager"
            ],
            "description": "Product to compare against. nginx-proxy-manager compares SPMPlus instead of Slash. Default: all."
          },
          "topic": {
            "type": "string",
            "description": "Optional words to match against the row names, e.g. \"HTTP/3\" or \"load balancing\"."
          },
          "lang": {
            "type": "string",
            "enum": [
              "en",
              "id"
            ],
            "description": "Answer language: en (English, default) or id (Bahasa Indonesia)."
          }
        }
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_system_requirements",
      "type": "imperative",
      "availability": "every page",
      "description": "Operating system, CPU, Docker/systemd versions, VM sizes and firewall ports needed to run Slash and SPMPlus.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "lang": {
            "type": "string",
            "enum": [
              "en",
              "id"
            ],
            "description": "Answer language: en (English, default) or id (Bahasa Indonesia)."
          }
        }
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_quick_start",
      "type": "imperative",
      "availability": "every page",
      "description": "Step-by-step install commands. method \"slashfile\": Slash alone with a Slashfile in Docker. method \"spmplus\": Slash with the SPMPlus web panel via Docker Compose.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "method": {
            "type": "string",
            "enum": [
              "slashfile",
              "spmplus"
            ],
            "description": "Which setup to explain."
          },
          "lang": {
            "type": "string",
            "enum": [
              "en",
              "id"
            ],
            "description": "Answer language: en (English, default) or id (Bahasa Indonesia)."
          }
        },
        "required": [
          "method"
        ]
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "generate_slashfile",
      "type": "imperative",
      "availability": "every page",
      "description": "Write a Slashfile (the Slash configuration file) for one or more sites. Each site has domain names, a type (proxy, files, php, wordpress, laravel, redirect) and a target (upstream address(es), folder or URL). Returns the file text, aligned like `slash fmt`. Validate it on the server with `slash check`.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "description": "Optional Let's Encrypt account email, e.g. admin@example.com."
          },
          "sites": {
            "type": "array",
            "minItems": 1,
            "maxItems": 50,
            "items": {
              "type": "object",
              "properties": {
                "names": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "minItems": 1,
                  "description": "Domains or IPs served by this site, e.g. [\"example.com\", \"www.example.com\"]. \"*\" catches every other name."
                },
                "type": {
                  "type": "string",
                  "enum": [
                    "proxy",
                    "files",
                    "php",
                    "wordpress",
                    "laravel",
                    "redirect"
                  ],
                  "description": "proxy: forward to upstreams; files: static folder; php/wordpress/laravel: PHP via php-fpm; redirect: send to another URL."
                },
                "target": {
                  "type": "string",
                  "description": "proxy: upstream(s) like \"localhost:3000\" or \"10.0.0.2:8080, 10.0.0.3:8080\". files/php/wordpress/laravel: folder path. redirect: URL."
                },
                "spa": {
                  "type": "boolean",
                  "description": "files only: serve index.html for unknown paths (single-page apps)."
                },
                "via": {
                  "type": "string",
                  "description": "php/wordpress/laravel only: php-fpm address, e.g. \"php-fpm:9000\" or \"/run/php/php8.3-fpm.sock\". Default 127.0.0.1:9000."
                },
                "temporary": {
                  "type": "boolean",
                  "description": "redirect only: use 302/307 instead of a permanent redirect."
                },
                "waf": {
                  "type": "string",
                  "enum": [
                    "off",
                    "detect",
                    "block"
                  ],
                  "description": "AssaultCuirass WAF: off (default), detect (log only) or block (answer 403)."
                },
                "limit": {
                  "type": "string",
                  "description": "Optional rate limit per client IP, e.g. \"10/min\" or \"5/s burst 20\"."
                }
              },
              "required": [
                "names",
                "type",
                "target"
              ]
            }
          }
        },
        "required": [
          "sites"
        ]
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "search_slash_site",
      "type": "imperative",
      "availability": "every page",
      "description": "Full-text search over this site (overview, comparisons, requirements, quick starts). Returns matching passages with links to the exact section.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "minLength": 2,
            "description": "Words to look for, e.g. \"TLS passthrough\" or \"PHP-FPM container\"."
          },
          "lang": {
            "type": "string",
            "enum": [
              "en",
              "id"
            ],
            "description": "Answer language: en (English, default) or id (Bahasa Indonesia)."
          }
        },
        "required": [
          "query"
        ]
      },
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "open_slash_page",
      "type": "imperative",
      "availability": "every page",
      "description": "Navigate the visitor’s tab to a page of this site, optionally to a section, in English or Indonesian.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "string",
            "enum": [
              "home",
              "compare",
              "start"
            ],
            "description": "home: overview; compare: comparison tables; start: requirements and quick starts."
          },
          "section": {
            "type": "string",
            "enum": [
              "slashfile",
              "waf",
              "spmplus",
              "requirements",
              "builder",
              "firewall",
              "docs"
            ],
            "description": "Optional section to scroll to."
          },
          "lang": {
            "type": "string",
            "enum": [
              "en",
              "id"
            ],
            "description": "Answer language: en (English, default) or id (Bahasa Indonesia)."
          }
        },
        "required": [
          "page"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "consequentialHint": false
      }
    },
    {
      "name": "build_slashfile_site",
      "type": "declarative-form",
      "availability": "https://slash.tik.unej.ac.id/start#builder",
      "autoSubmit": true,
      "description": "Form on /start that turns one site (domains, type, target, WAF mode) into a Slashfile block. Runs locally in the page; nothing is sent anywhere."
    }
  ],
  "relatedManifests": {
    "agent": "https://slash.tik.unej.ac.id/.well-known/agent.json",
    "aiCatalog": "https://slash.tik.unej.ac.id/.well-known/ai-catalog.json",
    "llmsTxt": "https://slash.tik.unej.ac.id/llms.txt"
  }
}