{"ok":true,"site":{"host":"edgewright.vercel.app","url":"https://edgewright.vercel.app/","type":"live","desc":"Edgewright turns your Netlify, Vercel and Cloudflare redirect rules into a live console an AI agent drives through WebMCP: test any URL, catch the rule that shadows another, fix the order, export a…","tools":[{"name":"test_url","kind":"answer","impl":"imperative","description":"Test what a request path does against the current rules: which rule wins, the final status, the destination, and whether it hits a redirect loop. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"url":{"type":"string","description":"The request path to test, e.g. /docs/getting-started (query string allowed)."},"country":{"type":"string","description":"Optional 2-letter country to simulate Country conditions."},"language":{"type":"string","description":"Optional language to simulate Language conditions."},"role":{"type":"string","description":"Optional role to simulate Role conditions."},"cookies":{"type":"object","description":"Optional cookie name/value map to simulate Cookie/has/missing conditions."}},"required":["url"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"audit_rules","kind":"answer","impl":"imperative","description":"Scan every rule for problems: rules shadowed by a broader rule above them, rules made unreachable by a catch-all, redirect loops, and lines the platform silently ignores. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"export_config","kind":"answer","impl":"imperative","description":"Return the current rules serialized in the active platform native format, ready to paste into your project. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"add_rule","kind":"act","impl":"imperative","description":"Add a redirect or rewrite rule to the end of the list. Use status 200 for a rewrite/SPA fallback, 301/302/307/308 for a redirect.","inputSchema":{"type":"object","properties":{"source":{"type":"string","description":"Source pattern, e.g. /old/* or /blog/:slug"},"destination":{"type":"string","description":"Destination, e.g. /new/:splat or https://example.com"},"status":{"type":"number","description":"HTTP status. 200 = rewrite, 301/302/307/308 = redirect. Defaults to the platform default."}},"required":["source","destination"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"edit_rule","kind":"act","impl":"imperative","description":"Change the source, destination, or status of the rule at a given position (1-based, as shown in the list).","inputSchema":{"type":"object","properties":{"position":{"type":"number","description":"1-based position of the rule to edit."},"source":{"type":"string"},"destination":{"type":"string"},"status":{"type":"number"}},"required":["position"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"remove_rule","kind":"act","impl":"imperative","description":"Delete the rule at a given position (1-based).","inputSchema":{"type":"object","properties":{"position":{"type":"number","description":"1-based position of the rule to remove."}},"required":["position"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"reorder_rule","kind":"act","impl":"imperative","description":"Move the rule at one position to another. Order matters: the first matching rule wins, so this is how you fix a rule shadowed by a broader one above it.","inputSchema":{"type":"object","properties":{"from":{"type":"number","description":"1-based current position."},"to":{"type":"number","description":"1-based target position."}},"required":["from","to"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"import_config","kind":"act","impl":"imperative","description":"Replace all rules by importing a config in the active platform format (Netlify _redirects text, a vercel.json string, or Cloudflare _redirects text).","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"The raw config text to import."}},"required":["text"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"translate","kind":"act","impl":"imperative","description":"Translate the current rules to another platform (netlify, vercel, cloudflare, nextjs) and return the config in that format, with notes on anything that could not carry across. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"target":{"type":"string","enum":["netlify","vercel","cloudflare","nextjs"]}},"required":["target"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"bulk_test","kind":"act","impl":"imperative","description":"Test many request paths at once and report each outcome, failures first. Accepts a list of paths and/or a sitemap.xml body. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"urls":{"type":"array","items":{"type":"string"}},"sitemap":{"type":"string","description":"A sitemap.xml body; its <loc> paths are tested too."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"test_path","kind":"answer","impl":"imperative","description":"Compile a single source pattern and report whether it matches a URL and what it captures, without touching the rule list. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"pattern":{"type":"string"},"url":{"type":"string"}},"required":["pattern","url"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"explain_rule","kind":"answer","impl":"imperative","description":"Explain the rule at a given position (1-based) in plain English. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"position":{"type":"number"}},"required":["position"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"list_platforms","kind":"answer","impl":"imperative","description":"List the platforms Edgewright can parse, test, translate and export. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"set_platform","kind":"act","impl":"imperative","description":"Switch the working platform and translate the current rules into it. Constructs the target does not support are dropped and reported.","inputSchema":{"type":"object","properties":{"platform":{"type":"string","enum":["netlify","vercel","cloudflare","nextjs"]}},"required":["platform"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"audit_headers","kind":"answer","impl":"imperative","description":"Audit response headers for a path against a headers config (Netlify _headers, or Vercel/Next.js headers). Flags missing security headers and weak CSP. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"platform":{"type":"string","enum":["netlify","cloudflare","vercel","nextjs"]},"text":{"type":"string"},"path":{"type":"string"}},"required":["platform","text"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"load_config","kind":"act","impl":"imperative","description":"Load a redirect config into Preflight. Optionally set the platform (netlify, vercel, cloudflare, nextjs).","inputSchema":{"type":"object","properties":{"text":{"type":"string"},"platform":{"type":"string","enum":["netlify","vercel","cloudflare","nextjs"]}},"required":["text"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/preflight/","pages":["/preflight/"]},{"name":"set_expectations","kind":"act","impl":"imperative","description":"Set the routes that must work: a list of { path, destination?, status? }. These are what the gate checks.","inputSchema":{"type":"object","properties":{"expectations":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"destination":{"type":"string"},"status":{"type":"number"}},"required":["path"]}}},"required":["expectations"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/preflight/","pages":["/preflight/"]},{"name":"run_gate","kind":"act","impl":"imperative","description":"Run the preflight gate: resolve every expected route, audit the rules and return a single pass or fail with the failing detail. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/preflight/","pages":["/preflight/"]},{"name":"explain_failure","kind":"act","impl":"imperative","description":"Explain why the last gate failed, route by route. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/preflight/","pages":["/preflight/"]},{"name":"export_report","kind":"act","impl":"imperative","description":"Export the last gate result as a PR-comment markdown block or a JSON artifact. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"format":{"type":"string","enum":["markdown","json"]}},"required":["format"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/preflight/","pages":["/preflight/"]},{"name":"load_source","kind":"act","impl":"imperative","description":"Load the source config to migrate. Optionally set the source platform (netlify, vercel, cloudflare, nextjs).","inputSchema":{"type":"object","properties":{"text":{"type":"string"},"platform":{"type":"string","enum":["netlify","vercel","cloudflare","nextjs"]}},"required":["text"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio/","pages":["/studio/"]},{"name":"set_target","kind":"act","impl":"imperative","description":"Set the platform to migrate the config to.","inputSchema":{"type":"object","properties":{"platform":{"type":"string","enum":["netlify","vercel","cloudflare","nextjs"]}},"required":["platform"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio/","pages":["/studio/"]},{"name":"migrate","kind":"act","impl":"imperative","description":"Translate the source config to the target platform and return it, with notes on anything that could not carry across.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio/","pages":["/studio/"]},{"name":"verify_migration","kind":"act","impl":"imperative","description":"Replay every source URL through both the source and migrated configs and report whether they resolve identically. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio/","pages":["/studio/"]},{"name":"audit_source","kind":"answer","impl":"imperative","description":"Audit the source config for shadowed rules, unreachable rules and loops. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio/","pages":["/studio/"]},{"name":"export_report","kind":"act","impl":"imperative","description":"Export the migration as a markdown report or the target config text. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"format":{"type":"string","enum":["markdown","config"]}},"required":["format"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio/","pages":["/studio/"]}],"category":"Developer Tools","favicon":"/favicons/edgewright.vercel.app.svg","apiSurface":"spec","toolCount":26}}