Skip to main content
Glama

Server Details

Read, crawl and act on websites, signed in as the user, and turn any site into an API.

The last two health checks of this connector failed. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.

If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.

Status
Unhealthy
Uptime
18.3% over 20 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP
URL
Repository
usewrit/writ-mcp
GitHub Stars
1
Server Listing
writ-mcp

TDQS

B3.2/5.0

Scored across 40 tools

Disambiguation4/5

The set includes many browser and workflow tools, but descriptions use explicit 'NOT FOR' sections and cross-references to delineate boundaries. However, with 40 tools, some pairs like writ_browser_act vs writ_browser_compose or writ_run_workflow vs writ_run_saved_crawl can still be confused without careful reading.

Naming Consistency3/5

All names use lowercase snake_case with a uniform writ_ prefix, which is good. But verb/noun ordering is inconsistent: most tools are writ_<verb>_<noun> (e.g., writ_create_automation) while browser tools are writ_browser_<verb> (noun-first). This mixed convention is readable but not fully predictable.

Tool Count2/5

40 tools is far beyond the typical 3-15 range for a well-scoped server. Even given the broad domain (browser automation, scraping, crawling, workflows, payments, monitors), the count is excessive and likely to overwhelm tool selection.

Completeness3/5

The surface covers many lifecycle operations (create, read, update, run, schedule, export, expose), but notable gaps exist: no delete operations for workflows, crawls, monitors, or automations, and no dedicated list for monitors or automations. These are workable around but represent missing lifecycle steps.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 39 tool updates
    • Changedwrit_browser_act3 fields changed
      • removedInput schema / properties / inputs / description
        Removed value: -"Values held server-side for {{placeholder}} substitution, e.g. {\"city\":\"Paris\"}. Secrets here or on a fill's data_key stay out of the recorded steps."
      • changedInput schema / properties / max_chars / description
        Previous value: -"Clip of the returned page_dom / page_text (default 40000, ≤200000). A get_dom probe on a real app is 500KB; evaluate_js / inspect / read_text return just the target."New value: +"Clip of the returned page (default 40000)."
      • removedInput schema / properties / session_id / description
        Removed value: -"Session id from the start tool."
    • Changedwrit_browser_ask_user3 fields changed
      • changedInput schema / properties / kind / description
        Previous value: -"captcha: the user completes a check in the live browser. question: the user answers in text. twofa: the user supplies the one-time code the page is asking for; Writ types it server-side and returns `entered`, never the code."New value: +"captcha | twofa | question."
      • changedInput schema / properties / question / description
        Previous value: -"The question, in one short sentence (required for kind 'question')."New value: +"kind='question': one short sentence."
      • changedInput schema / properties / wait_seconds / description
        Previous value: -"Hold up to this long (1-60, default 60)."New value: +"Hold up to this long (1-60)."
    • Changedwrit_browser_cancel1 field changed
      • changedInput schema / properties / discard / description
        Previous value: -"true = the session's unsaved steps and functions are thrown away instead of auto-saved. Default false."New value: +"Throw away unsaved steps instead of auto-saving."
    • Changedwrit_browser_compose3 fields changed
      • addedInput schema / properties / operation / description
        Added value: +"list | define_function | compile_function | test_function | remove_function | add_steps | remove_step | set_inputs."
      • changedInput schema / properties / payload / description
        Previous value: -"The operation's arguments. define_function: {name, fn_type?, description?, surface?, from_index?, request?{method,url,headers,body_template}, flow?{version,steps}, script?, selector?, input_variables?, output_fields?, response_extractions?, is_auth?, order?, sample_inputs?, test?}. compile_function {name, from_index, sibling_index?, input_variables?, response_extractions?, page_url?}: the deterministic (no-LLM) way to turn a captured authenticated request (a GraphQL/RPC POST, a form submit) into a callable function. Writ decodes the body, keeps the static parameters, traces each session-minted token (csrf/xsrf/dtsg/lsd/etc.) to where a fresh session re-reads it and emits an is_auth bootstrap that publishes it as {{extracted:}}/{{cookie:}}, replaces per-call client values (idempotence token, session id, timestamp) with runtime generators ({{uuid()}}, {{uuid(session)}}, {{timestamp_ms()}}, {{counter()}}), templates the caller inputs, and classifies a write (create/post/send/delete): the build never sends it, a real run does (mutation_mode='dry_run' previews it). It suits any authenticated mutation or token-bound endpoint better than a hand-built api function. A second capture of the same request (sibling_index, else the nearest one Writ finds) tells the pagination inputs and per-call values from stable ids: a UUID unchanged between the two is kept as captured. test_function: {name, sample_inputs?}. remove_function: {name}. add_steps: {steps:[{type, config|flat fields, description?}], at?}. remove_step: {id}. set_inputs: {inputs:{name:{default?, description?, required?, example?}}}."New value: +"The operation's arguments."
      • removedInput schema / properties / session_id / description
        Removed value: -"Session id from the start tool."
    • Changedwrit_browser_context3 fields changed
      • removedInput schema / properties / max_chars
        Removed value: -{
        -  "description": "Characters per page (1000–10000, default 8000).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / offset
        Removed value: -{
        -  "description": "Paging offset for the policy sections.",
        -  "minimum": 0,
        -  "type": "integer"
        -}
      • changedInput schema / properties / section / description
        Previous value: -"page (default) | lists | map | explorer | concierge_api"New value: +"page (default) | lists | map | explorer | concierge_api."
    • Changedwrit_browser_network6 fields changed
      • changedInput schema / properties / index / description
        Previous value: -"Which call to read, for operation=detail."New value: +"detail: which call."
      • removedInput schema / properties / max_chars
        Removed value: -{
        -  "description": "Window size, 1000-10000 (default 8000; larger values are clamped); offset pages it.",
        -  "type": "integer"
        -}
      • changedInput schema / properties / method / description
        Previous value: -"Filter by HTTP method."New value: +"HTTP method filter."
      • removedInput schema / properties / offset
        Removed value: -{
        -  "minimum": 0,
        -  "type": "integer"
        -}
      • changedInput schema / properties / operation / description
        Previous value: -"search (default) | detail. list/get are aliases."New value: +"search (default) | detail."
      • changedInput schema / properties / query / description
        Previous value: -"Substring filter across method, url, status, and bodies."New value: +"Substring filter."
    • Changedwrit_browser_save3 fields changed
      • changedInput schema / properties / allow_no_data / description
        Previous value: -"Saves a workflow that yields no data (navigation/actions only) on purpose. Off by default: a save with no data step and no defined function is refused for an API build (no define_function or extract yet) and warned for a task recording: such a workflow runs green and returns nothing."New value: +"Save a workflow that returns no data, on purpose."
      • removedInput schema / properties / keep_open
        Removed value: -{
        -  "description": "Leaves the browser open after saving (default false: saving closes it).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / name / description
        Removed value: -"Short workflow name (defaults to the goal)."
    • Changedwrit_browser_sessions2 fields changed
      • removedInput schema / properties / include_closed
        Removed value: -{
        -  "description": "Also lists recently closed sessions (not resumable) for reference. Default false: only open, resumable sessions.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / limit / description
        Removed value: -"Max sessions to return (default 20)."
    • Changedwrit_browser_use9 fields changed
      • removedInput schema / properties / auth_mode
        Removed value: -{
        -  "description": "reuse verifies unknown saved authentication before adopting it; fresh_login starts without old cookies/storage while preserving the persona's device and network identity, the mode for recording a new login.",
        -  "enum": [
        -    "reuse",
        -    "fresh_login"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / properties / execution_target / description
        Previous value: -"Where the session runs: 'cloud' (managed cloud fleet), 'auto' (the user's own linked Writ desktop app when it is online, else cloud), or 'local' (only their own desktop app). On the user's own machine the session keeps their computer and IP and exposes nothing local to the cloud. No value means the account's default set in the Writ app. A 'local' run reports local_agent_offline when their app is closed; execution_target='cloud' re-runs it in the cloud, off the user's machine."New value: +"cloud | auto | local (the user's own desktop app)."
      • removedInput schema / properties / fresh_exit
        Removed value: -{
        -  "description": "Residential only: skips the persona's usual exit for this site and draws a new address, for after the site refused it (an IP rate limit, a sign-in rejected with correct credentials). Ignored on server-IP egress.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / goal / description
        Removed value: -"Optional label describing the task, for the run log. A label only: the tool performs no step from it, and every step is a writ_browser_act batch."
      • removedInput schema / properties / human_layer
        Removed value: -{
        -  "description": "Native keyboard input, distance-adaptive mouse paths and pre-click dwell for this session. Fresh login defaults to enabled; explicit false disables it. Native actionability checks remain active.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / persona_id / description
        Removed value: -"Saved identity to sign in with (writ_personas lists them). Required for sites behind a login with 2FA. A desktop persona ('device:…') opens the browser on its own desktop, which fills {{secret:username}} / {{secret:password}} / 2FA itself; its values never reach the caller."
      • removedInput schema / properties / residential_country
        Removed value: -{
        -  "description": "Two-letter ISO country the residential exit should be in (e.g. 'us', 'fr'), for a site that serves a different page per country or throttles foreign traffic. No value means an automatic exit. Ignored unless the session egresses residential.",
        -  "type": "string"
        -}
      • removedInput schema / properties / url / description
        Removed value: -"Starting URL to open (required)."
      • changedInput schema / properties / use_residential / description
        Previous value: -"Opens on the platform residential network (premium), for a site that blocks datacenter IPs or shows a bot wall / captcha. Default off (free)."New value: +"Open on the residential network (bot walls, CAPTCHAs)."
    • Changedwrit_crawl_files4 fields changed
      • removedInput schema / properties / crawl / description
        Removed value: -"Saved crawl slug, name, or id (alternative to crawl_id)."
      • removedInput schema / properties / crawl_id / description
        Removed value: -"Crawl id from writ_crawl_site."
      • removedInput schema / properties / limit
        Removed value: -{
        -  "description": "Max files to return (default 100, cap 200).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / runs
        Removed value: -{
        -  "description": "With `crawl`: how many recent completed runs to aggregate (default 1 — the current version of every document).",
        -  "type": "integer"
        -}
    • Changedwrit_crawl_site35 fields changed
      • removedInput schema / properties / allow_subdomains
        Removed value: -{
        -  "type": "boolean"
        -}
      • removedInput schema / properties / content_spec
        Removed value: -{
        -  "description": "Which elements of each page to keep: {preset: 'full'|'main', include_comments: bool, exclude_selectors: [css], include_selectors: [css], keep: {images: bool}}. 'main' = article body only; 'full' = the whole page including comment and discussion threads. Comments, replies and discussion survive only with 'full' plus include_comments; otherwise they are stripped out.",
        -  "type": "object"
        -}
      • removedInput schema / properties / delay_ms
        Removed value: -{
        -  "description": "Politeness delay between fetches per host (default 250).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / device
        Removed value: -{
        -  "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.",
        -  "type": "string"
        -}
      • removedInput schema / properties / exclude_paths
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • changedInput schema / properties / executor / description
        Previous value: -"regular (default) = deterministic crawl, no AI. ai = a fleet of AI agents reads every page against `extract_prompt` and returns structured records, for data with no clean CSS selector. Bills at 5x the page rate."New value: +"regular (default, no AI) | ai (5x the page rate)."
      • changedInput schema / properties / extract_mode / description
        Previous value: -"markdown (default) | schema (uniform records via extract_schema) | html (each page's raw HTML, for selectors or embedded JSON)"New value: +"markdown (default) | schema | html."
      • changedInput schema / properties / extract_prompt / description
        Previous value: -"Required with executor=ai: what each agent extracts from each page, in plain language (e.g. 'the product name, price and SKU')."New value: +"With executor=ai: what to extract from each page."
      • removedInput schema / properties / extract_schema
        Removed value: -{
        -  "type": "object"
        -}
      • removedInput schema / properties / include_paths
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • changedInput schema / properties / intent / description
        Previous value: -"Plain-English goal. The server derives include/exclude paths and a depth from it against a sample of the site's real URLs, and ranks the frontier by relevance, so on an unfamiliar site it scopes better than guessed path regexes."New value: +"The section wanted, in plain words; the server derives paths and depth."
      • removedInput schema / properties / limit
        Removed value: -{
        -  "description": "Rows of collected data to return when wait=true (default 50).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / max_age
        Removed value: -{
        -  "description": "Only meaningful with `save_as`: if that saved crawl already completed within this many seconds, return its collected data instead of crawling again. 0 always crawls.",
        -  "minimum": 0,
        -  "type": "integer"
        -}
      • removedInput schema / properties / max_concurrent_shards
        Removed value: -{
        -  "description": "Explicit parallel-shard cap; overrides the `speed` allocation.",
        -  "type": "integer"
        -}
      • removedInput schema / properties / max_depth
        Removed value: -{
        -  "type": "integer"
        -}
      • removedInput schema / properties / name
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / ocr_mode
        Removed value: -{
        -  "description": "auto (default) | off | force",
        -  "type": "string"
        -}
      • removedInput schema / properties / output
        Removed value: -{
        -  "description": "Response shape, for an answer a program or an API consumes rather than a reader. {shape: 'envelope' (default: Writ's full answer, projected) | 'table' ({columns, rows, total}) | 'records' (bare list of records) | 'record' (the newest record alone: one entity, a usage meter, a dashboard), fields: ['used', 'percent_used as pct', 'items.0.price as first_price'] (ordered pick, renames, dotted paths; a missing path is null, so keys are stable), exclude: ['depth'], include_meta: false (page metadata content_kind/depth/thumbnails is stripped unless true), key: 'usage' (wrap)}. On writ_crawl_site with save_as it is saved as the API's default shape.",
        -  "properties": {
        -    "exclude": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "fields": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "include_meta": {
        -      "type": "boolean"
        -    },
        -    "key": {
        -      "type": "string"
        -    },
        -    "shape": {
        -      "enum": [
        -        "envelope",
        -        "table",
        -        "records",
        -        "record"
        -      ],
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / page_budget / description
        Added value: +"Cap on pages fetched."
      • removedInput schema / properties / persona_id / description
        Removed value: -"Saved identity to crawl as (writ_personas lists them), for pages behind a login. Every shard shares the persona's signed-in session and one sticky exit IP. 2FA is minted server-side. A desktop persona ('device:…') crawls on its own desktop, from that machine."
      • removedInput schema / properties / preview_chars
        Removed value: -{
        -  "description": "Cut each inline page's text cells to this many characters (default 12000; 0 = full pages). Cut rows list the fields under `_truncated`; a full page comes from writ_workflow_data(workflow_id=<data_workflow_id>, refs=['<run_id>:<record_index>']).",
        -  "type": "integer"
        -}
      • changedInput schema / properties / rank_cap / description
        Previous value: -"Top N items of a listing (a front page, search results, a category). The server reads the seed page's link order (which is the ranking), seeds exactly those N item pages, and pins the crawl to them, one page per agent, in parallel. Without it the same request is a breadth crawl that mostly collects nav and pagination and does not answer a top-N ask. include_paths, when given, is the item-link shape."New value: +"Top N items of a listing (one page per agent, in parallel)."
      • removedInput schema / properties / relevance_threshold
        Removed value: -{
        -  "description": "0-1. Every discovered page is scored against `intent` and skipped below the bar, so a broad crawl collects only what the goal needs (≈0.3 for 'the pricing and docs pages'). Unset for a whole-site sweep.",
        -  "maximum": 1,
        -  "minimum": 0,
        -  "type": "number"
        -}
      • removedInput schema / properties / render_mode
        Removed value: -{
        -  "description": "How each page is fetched, independent of `executor`, which decides who reads it. auto (default) = plain HTTP first, warm browser only for JS-challenge or near-empty pages; http = never opens a browser (fastest, static HTML); browser = warm-render every page (JS/SPA sites). executor=ai works on either lane.",
        -  "type": "string"
        -}
      • removedInput schema / properties / residential_country
        Removed value: -{
        -  "description": "Two-letter ISO country the residential exit should be in (e.g. 'us', 'fr'): pins the exit pool's geo for every shard. Omitted = an automatic exit. Ignored unless the session egresses residential.",
        -  "type": "string"
        -}
      • removedInput schema / properties / respect_robots
        Removed value: -{
        -  "description": "Honor robots.txt (default true).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / same_domain
        Removed value: -{
        -  "type": "boolean"
        -}
      • removedInput schema / properties / save_as / description
        Removed value: -"Saves these settings as a named, callable crawl, for one that is re-run later (a recurring pull, an API the user asked for). Saved crawls are listed to every future session as 'already collected', so a saved one-off reads as reusable data to later sessions. Reusing the same name updates that saved crawl instead of creating a duplicate."
      • changedInput schema / properties / seed_urls / description
        Previous value: -"Exact known pages to start from: the crawl collects these instead of discovering its own. The cheapest way to scrape a known set."New value: +"Exact pages to collect (no discovery)."
      • removedInput schema / properties / shard_size
        Removed value: -{
        -  "description": "URLs fetched per shard batch (default 20).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / speed
        Removed value: -{
        -  "description": "Throughput tier: slow | normal (default) | fast: the share of the parallel-agent allowance the crawl uses. slow ≈ ¼ at a discounted page rate, normal ≈ ½ at standard rate, fast = all of it at a premium.",
        -  "type": "string"
        -}
      • removedInput schema / properties / timeout_seconds
        Removed value: -{
        -  "description": "Max seconds to hold when wait=true (≤75).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / url / description
        Removed value: -"Seed URL (required)."
      • removedInput schema / properties / use_residential
        Removed value: -{
        -  "description": "Route every shard through the platform residential network (premium), for sites that block datacenter IPs / show a bot wall; a persona crawl forces it on automatically. Costs residential bandwidth; default off.",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / wait / description
        Previous value: -"Hold until the crawl converges and return the collected pages in this call (`data.rows`). Default true for a bounded crawl (rank_cap or seed_urls: a few pages, seconds) and false for an open site crawl (returns a crawl id for writ_crawl_status). Past the 75s ceiling the answer is a 504 that still carries the crawl id."New value: +"Hold until done and return the rows (default true when bounded)."
    • Changedwrit_crawl_status6 fields changed
      • removedInput schema / properties / crawl_id / description
        Removed value: -"Crawl id from writ_crawl_site."
      • removedInput schema / properties / limit / description
        Removed value: -"Rows to inline when it converged (default 50)."
      • removedInput schema / properties / output
        Removed value: -{
        -  "description": "Response shape, for an answer a program or an API consumes rather than a reader. {shape: 'envelope' (default: Writ's full answer, projected) | 'table' ({columns, rows, total}) | 'records' (bare list of records) | 'record' (the newest record alone: one entity, a usage meter, a dashboard), fields: ['used', 'percent_used as pct', 'items.0.price as first_price'] (ordered pick, renames, dotted paths; a missing path is null, so keys are stable), exclude: ['depth'], include_meta: false (page metadata content_kind/depth/thumbnails is stripped unless true), key: 'usage' (wrap)}. On writ_crawl_site with save_as it is saved as the API's default shape.",
        -  "properties": {
        -    "exclude": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "fields": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "include_meta": {
        -      "type": "boolean"
        -    },
        -    "key": {
        -      "type": "string"
        -    },
        -    "shape": {
        -      "enum": [
        -        "envelope",
        -        "table",
        -        "records",
        -        "record"
        -      ],
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
      • removedInput schema / properties / preview_chars
        Removed value: -{
        -  "description": "Cut inline text cells to this many chars (default 12000; 0 = full).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / timeout_seconds
        Removed value: -{
        -  "description": "Ceiling for wait=true (≤75).",
        -  "type": "integer"
        -}
      • changedInput schema / properties / wait / description
        Previous value: -"Hold until the crawl is terminal and inline its rows (default false)."New value: +"Hold until done and inline the rows."
    • Changedwrit_create_automation26 fields changed
      • removedInput schema / properties / ai_entry_url
        Removed value: -{
        -  "description": "Page the woken agent starts on. Defaults to the event's page (the monitored URL on change_detected); required in practice for workflow_*/webhook events.",
        -  "type": "string"
        -}
      • changedInput schema / properties / ai_prompt / description
        Previous value: -"Wake an AI agent with this task when the event fires. The agent gets the event context (page URL, diff, extracted values) and works the task in a cloud browser. Supports {{placeholders}}."New value: +"Wake an AI agent with this task."
      • removedInput schema / properties / ai_session_id
        Removed value: -{
        -  "description": "With when='ai_session_completed' / 'ai_session_started': only this AI session.",
        -  "type": "integer"
        -}
      • removedInput schema / properties / blocks
        Removed value: -{
        -  "description": "Raw flow tree instead of the action arguments (max 50): each {id, type: event|condition|action, blockType, config, parentId}. The first block is the root event (its blockType is the event: one of `when`; scheduled config {mode, interval_ms | time, days, tz}); every other block names an earlier block as parentId. Actions: workflow {workflow_id, function_name | function_names, input_mapping}; notification {template, title, channels, recipients}; ai_session {goal, entry_url}; scrape {urls:[<=5, templates ok], format: markdown|html|both, on_error} -> {{scraped.content}} {{scraped.pages}}; extract {source:'{{scraped.content}}', fields:[{key, from: html_css|json|regex|embedded_json|body, selector, attribute, all, path, pattern, group, number, required}]} -> {{extracted.<key>}}; crawl {seed_url, intent, include_paths, exclude_paths, page_budget, max_depth, extract_mode: markdown|schema, extract_schema, render_mode: auto|http|browser, persona_id} starts a fresh crawl (its rows arrive with crawl_completed, not in this chain); condition {field, operator, value}. Awaiting a run: an event block workflow_completed {linked_to_block:<workflow block id>}. Every string setting takes {{placeholders}}.",
        -  "items": {
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • changedInput schema / properties / channels / description
        Previous value: -"Notification channels for `notify`, e.g. [\"pushover\",\"email\"] (required for delivery)."New value: +"Notification channels."
      • removedInput schema / properties / cooldown_minutes
        Removed value: -{
        -  "description": "Minimum minutes between AI wakes for `ai_prompt` (default 10; 0 disables).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / description
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / enabled
        Removed value: -{
        -  "type": "boolean"
        -}
      • removedInput schema / properties / inputs
        Removed value: -{
        -  "description": "With run_workflow: its inputs {input_name: value}, each a literal or a {{template}} over the event (e.g. {{extracted.price}}, or {{payload.order.id}} from a webhook body); saved values fill the rest. Stored as plain JSON.",
        -  "type": "object"
        -}
      • removedInput schema / properties / name / description
        Removed value: -"Name for the automation (required)."
      • changedInput schema / properties / notify / description
        Previous value: -"Send a notification with this message — a template over the event's data (see the tool description: {{result.extracted_data.0.title}} after a workflow, {{rows.0.title}} / {{row_count}} after a crawl, {{extracted.price}} on a change)."New value: +"Message template, e.g. {{result.extracted_data.0.title}}."
      • changedInput schema / properties / on_workflow / description
        Previous value: -"Source workflow name whose event fires this (required for workflow_* events)."New value: +"Source workflow for workflow_* events."
      • removedInput schema / properties / on_workflow_id
        Removed value: -{
        -  "type": "integer"
        -}
      • removedInput schema / properties / priority
        Removed value: -{
        -  "type": "integer"
        -}
      • removedInput schema / properties / recipients
        Removed value: -{
        -  "description": "Notification recipients, e.g. [\"email:3\"]. Omitted = every enabled recipient on the channel; the answer names who the alert actually reaches, and warns when nobody is configured.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / run_function
        Removed value: -{
        -  "description": "One function name (alias of run_functions).",
        -  "type": "string"
        -}
      • removedInput schema / properties / run_functions
        Removed value: -{
        -  "description": "With run_workflow: call these functions of a multi-function workflow instead of the whole workflow — one run of the selection plus what it needs (sign-in, a token, the search whose ids another reads). Unset = the whole workflow.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • changedInput schema / properties / run_workflow / description
        Previous value: -"Workflow to run when the event fires (by name)."New value: +"Workflow to run."
      • removedInput schema / properties / run_workflow_id
        Removed value: -{
        -  "type": "integer"
        -}
      • changedInput schema / properties / schedule / description
        Previous value: -"With when='scheduled': {kind:'interval', interval_minutes:N} or {kind:'daily', time:'HH:MM', tz:'<IANA zone>'} or {kind:'weekly', time, days:[1..7] (1=Mon .. 7=Sun), tz}."New value: +"when='scheduled': {kind, interval_minutes | time, days, tz}."
      • removedInput schema / properties / schedule / properties
        Removed value: -{
        -  "days": {
        -    "items": {
        -      "type": "integer"
        -    },
        -    "type": "array"
        -  },
        -  "interval_minutes": {
        -    "type": "integer"
        -  },
        -  "kind": {
        -    "enum": [
        -      "interval",
        -      "daily",
        -      "weekly"
        -    ],
        -    "type": "string"
        -  },
        -  "time": {
        -    "type": "string"
        -  },
        -  "tz": {
        -    "type": "string"
        -  }
        -}
      • changedInput schema / properties / target_id / description
        Previous value: -"With when='change_detected' (required there): the monitor whose changes fire this, i.e. the monitor_id writ_create_monitor returned."New value: +"change_detected: the monitor_id."
      • removedInput schema / properties / target_selector_id
        Removed value: -{
        -  "description": "With target_id: only changes of this one selector of that monitor.",
        -  "type": "integer"
        -}
      • removedInput schema / properties / title
        Removed value: -{
        -  "description": "Notification title (with `notify`).",
        -  "type": "string"
        -}
      • removedInput schema / properties / webhook_trigger_id
        Removed value: -{
        -  "description": "With when='webhook_received': fire on this existing inbound webhook (its id from writ_list_webhooks) instead of minting a new URL. Its senders keep signing with its secret; one that has no secret yet gets one, shown once in the answer.",
        -  "type": "integer"
        -}
      • changedInput schema / properties / when / description
        Previous value: -"Event: workflow_completed | workflow_started | crawl_completed | crawl_failed | ai_session_completed | ai_session_started | change_detected (with `target_id`) | webhook_received (mints a signed URL; `webhook_trigger_id` reuses one) | scheduled (a clock, with `schedule`)."New value: +"workflow_completed | crawl_completed | change_detected | webhook_received | scheduled | ..."
    • Changedwrit_create_http_extraction8 fields changed
      • changedInput schema / properties / apply / description
        Previous value: -"false (default) returns a reviewable draft; true writes a valid draft to the workflow."New value: +"false (default) drafts; true writes."
      • removedInput schema / properties / desired_inputs
        Removed value: -{
        -  "description": "Caller parameters such as query, min_price, max_price, limit and cursor.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / goal / description
        Removed value: -"Exact inputs, output fields, filters, ordering and pagination behavior wanted."
      • removedInput schema / properties / request_samples
        Removed value: -{
        -  "description": "Relevant calls returned by writ_browser_network/capture_network, including representative response bodies when available.",
        -  "items": {
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / requirements
        Removed value: -{
        -  "description": "Extra mapping, dedupe, filtering or cursor requirements.",
        -  "type": "string"
        -}
      • removedInput schema / properties / response_sample
        Removed value: -{
        -  "description": "Optional representative JSON/HTML response when it is not in request_samples.",
        -  "type": "string"
        -}
      • removedInput schema / properties / step_index
        Removed value: -{
        -  "description": "api_call step to replace; defaults to the first, or appends one.",
        -  "type": "integer"
        -}
      • removedInput schema / properties / workflow
        Removed value: -{
        -  "description": "Existing workflow name (or workflow_id).",
        -  "type": "string"
        -}
    • Changedwrit_create_monitor17 fields changed
      • removedInput schema / properties / device
        Removed value: -{
        -  "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.",
        -  "type": "string"
        -}
      • removedInput schema / properties / enabled
        Removed value: -{
        -  "description": "Start the monitor enabled (default true).",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / extract / description
        Previous value: -"Browserless alternative to `selector`: a response-extraction spec the check applies to a plain HTTP response: {\"from\":\"json\",\"path\":\"data.price\"} (a JSON/XHR endpoint, with request_url), {\"from\":\"html_css\",\"selector\":\".a-offscreen\"} (the page markup), {\"from\":\"regex\",\"pattern\":\"...\"} (a value in a script/JSON blob). For a value readable without JavaScript (most prices and stock lines), no check opens a browser, so each is cheaper and harder to wall than a `selector`/requires_browser check. Structured data (an endpoint, JSON-LD, a JSON blob) survives a redesign best. Same grammar as api_call response_extractions."New value: +"Browserless read instead of a selector, e.g. {\"from\":\"html_css\",\"selector\":\".price\"}."
      • changedInput schema / properties / interval / description
        Previous value: -"How often to check: an option id from the needs_input answer ('5m', '15m', '1h', '6h', '24h') or a number of seconds (3600). Without it the answer is needs_input: this account's options (checks a day, how long the check allowance lasts, allowed or which plan) and a tell_user asking the user to pick; nothing is created. An interval the plan refuses is refused with the allowed ones; one that runs the allowance out before it renews is created with a `warning`."New value: +"How often: an option id from needs_input ('5m', '1h', '24h') or seconds."
      • removedInput schema / properties / interval_minutes
        Removed value: -{
        -  "description": "Legacy: minutes between checks; `interval` replaces it.",
        -  "type": "integer"
        -}
      • removedInput schema / properties / mode
        Removed value: -{
        -  "description": "'visual' watches the on-screen zone of `selector`'s element (or of `zone_text`) and diffs its pixels, for charts, images, badges, or a value no selector can read.",
        -  "enum": [
        -    "selector",
        -    "visual"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / persona_id / description
        Removed value: -"Every check carries this persona's live session (kept fresh by the persona's own sign-in), so a login or a bot wall it passed stays passed (writ_personas). Only for a page behind a sign-in: a public page is watched without one, and the answer says when one is needed."
      • removedInput schema / properties / request_url
        Removed value: -{
        -  "description": "With `extract`: the endpoint the value comes from (an XHR the page calls), when it is not `url` itself.",
        -  "type": "string"
        -}
      • removedInput schema / properties / requires_browser
        Removed value: -{
        -  "description": "Render with a real browser (JS) instead of plain HTTP, for JS-rendered/SPA pages and framed pages (framesets/iframes): the check matches the rendered, frame-flattened DOM, and selector validation is deferred to the first browser render instead of a raw-HTML fetch. Omitted, a page the access check could only read in a browser is checked in one.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / residential_country
        Removed value: -{
        -  "description": "ISO-2 exit country for use_residential (e.g. 'ca'); implies use_residential.",
        -  "type": "string"
        -}
      • changedInput schema / properties / selector / description
        Previous value: -"CSS selector for content-change monitoring; unset = uptime/status monitoring."New value: +"CSS selector whose text is watched (unset = whole page / uptime)."
      • removedInput schema / properties / session_id / description
        Removed value: -"An open writ_browser_use session on this page. The selector is proved there before saving (pinned / switched to a zone); required for mode='visual' or zone_text."
      • removedInput schema / properties / try_anyway
        Removed value: -{
        -  "description": "After a bot-check answer: create it on Writ's servers anyway (a check that meets the bot check reads nothing).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / url / description
        Removed value: -"URL to monitor (required)."
      • changedInput schema / properties / use_residential / description
        Previous value: -"Check through a residential exit — for sites that wall datacentre traffic (Amazon, marketplaces). A bot check found on the page is answered with this offer, or with the alternatives when the plan cannot pay for one."New value: +"Check through a residential exit (bot walls)."
      • changedInput schema / properties / watch / description
        Previous value: -"'price' also rejects a selector whose text holds no number (it becomes a zone). Default 'content'."New value: +"content (default) | price (the value must hold a number)."
      • removedInput schema / properties / zone_text
        Removed value: -{
        -  "description": "The text the page prints where the value is (e.g. '51,77 EUR', 'Currently unavailable'). Locates the zone when no selector exists.",
        -  "type": "string"
        -}
    • Changedwrit_devices3 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"list (default) | use | clear | monitors (that desktop's monitors) | datasets (what its exposed workflows collected)."New value: +"list (default) | use | clear | monitors | datasets."
      • changedInput schema / properties / device / description
        Previous value: -"use: the desktop's agent_id (or its exact name) from list."New value: +"use: the desktop's agent_id or name."
      • removedInput schema / required
        Removed value: -[]
    • Changedwrit_diagnose_http_workflow2 fields changed
      • removedInput schema / properties / task_id / description
        Removed value: -"Optional run to verify actual HTTP execution and output."
      • removedInput schema / properties / workflow
        Removed value: -{
        -  "type": "string"
        -}
    • Changedwrit_discovery_status3 fields changed
      • removedInput schema / properties / build_id / description
        Removed value: -"The build id from writ_website_to_api."
      • changedInput schema / properties / timeout_seconds / description
        Previous value: -"Ceiling for wait=true (≤75)."New value: +"Ceiling for wait=true (up to 75)."
      • changedInput schema / properties / wait / description
        Previous value: -"One held call (≤75s) that follows escalations to the newest rung and returns when that build is terminal or parked as needs_guidance. Still building at the ceiling, it answers with the build_id to repeat it with."New value: +"One held call until done or parked."
    • Changedwrit_export_data4 fields changed
      • changedInput schema / properties / format / description
        Previous value: -"csv (default) or json"New value: +"csv (default) | json."
      • removedInput schema / properties / q
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / view
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / workflow
        Removed value: -{
        -  "type": "string"
        -}
    • Changedwrit_expose_workflow_api4 fields changed
      • removedInput schema / properties / label / description
        Removed value: -"Optional name for the endpoint."
      • removedInput schema / properties / timeout_seconds
        Removed value: -{
        -  "description": "Managed run timeout. Defaults to 120, or 300 for AI navigation workflows.",
        -  "maximum": 300,
        -  "minimum": 5,
        -  "type": "integer"
        -}
      • removedInput schema / properties / wait_timeout
        Removed value: -{
        -  "description": "Deprecated alias of timeout_seconds.",
        -  "maximum": 300,
        -  "minimum": 5,
        -  "type": "integer"
        -}
      • removedInput schema / properties / workflow
        Removed value: -{
        -  "type": "string"
        -}
    • Addedwrit_help
    • Changedwrit_list_workflows1 field changed
      • changedInput schema / properties / search / description
        Previous value: -"Optional name/description filter."New value: +"Name/description filter, e.g. a site."
    • Changedwrit_payment15 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"request = the user approves a card for one purchase; wait = hold until they answer (grant_id) or until a checkout is settled (confirmation_id); checkout = pause at the order button for the user's confirmation, then Writ places the order; fill = type an approved virtual card early; list = the user's payment methods as handles."New value: +"request | wait | checkout | fill | list."
      • removedInput schema / properties / automation_id
        Removed value: -{
        -  "description": "request: the automation the card is for, when the purchase is a saved automation.",
        -  "type": "integer"
        -}
      • changedInput schema / properties / commit_selector / description
        Previous value: -"checkout (required): CSS selector of the button that places the order. Writ clicks it after the user confirms."New value: +"checkout: the place-order button."
      • removedInput schema / properties / confirmation_id / description
        Removed value: -"wait: the confirmation_id action='checkout' returned."
      • removedInput schema / properties / currency
        Removed value: -{
        -  "description": "request / checkout: the store's currency, three-letter ISO code ('eur', 'usd', 'gbp'); max_amount is in it. Omitted: the user's card currency on request, the currency the page total shows on checkout. A card pays only in its own currency.",
        -  "type": "string"
        -}
      • removedInput schema / properties / fields
        Removed value: -{
        -  "additionalProperties": {
        -    "oneOf": [
        -      {
        -        "type": "string"
        -      },
        -      {
        -        "properties": {
        -          "frame_url": {
        -            "type": "string"
        -          },
        -          "selector": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "selector"
        -        ],
        -        "type": "object"
        -      }
        -    ]
        -  },
        -  "description": "request, for live browsing: card field -> CSS selector on the checkout page (writ_browser_context reads them), or {selector, frame_url} for a field inside a payment provider's frame (frame_url = part of the frame's URL, e.g. 'js.stripe.com'). Keys: number, exp (MM/YY), exp_month, exp_year, exp_year2, cvc, name, zip. Writ types into exactly these.",
        -  "type": "object"
        -}
      • removedInput schema / properties / grant_id / description
        Removed value: -"wait / fill / checkout: the grant_id action='request' returned."
      • changedInput schema / properties / max_amount / description
        Previous value: -"request / checkout: the most this purchase may charge, tax and shipping included (e.g. 129.99). checkout without grant_id needs it."New value: +"The most it may charge."
      • removedInput schema / properties / payment_method_id
        Removed value: -{
        -  "description": "request: a handle id from action='list' to pre-select that card; the user still approves.",
        -  "type": "string"
        -}
      • changedInput schema / properties / purpose / description
        Previous value: -"request: one line the user reads when approving, e.g. 'Buy Nike Dunk Low, size 10'."New value: +"One line the user reads."
      • changedInput schema / properties / session / description
        Previous value: -"checkout / fill (required) / request: the session_id of the writ_browser_use session on the checkout page."New value: +"The browser session on the checkout page."
      • changedInput schema / properties / site / description
        Previous value: -"request: the store's domain, e.g. 'store.example.com'. The card is typed only on this site and its payment frames."New value: +"request: the store's domain."
      • removedInput schema / properties / steps
        Removed value: -{
        -  "description": "checkout: steps Writ runs after confirmation, before the order button, e.g. [{\"type\":\"fill_card\"}, {\"type\":\"click\",\"selector\":\"#continue\"}, {\"type\":\"wait\",\"seconds\":2}] for a card page followed by a review page. Default: fill the granted card, then the order button.",
        -  "items": {
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / summary
        Removed value: -{
        -  "description": "checkout: one line the user reads when confirming, e.g. '1 x Nike Dunk Low, size 10, shipped to home'.",
        -  "type": "string"
        -}
      • removedInput schema / properties / total_selector
        Removed value: -{
        -  "description": "request / checkout: CSS selector of the order total on the checkout page. Writ reads it and never clicks on when it is above the maximum. Needed for an auto-confirm rule to apply.",
        -  "type": "string"
        -}
    • Changedwrit_personas11 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"What to do (default list). request = mint the persona link for a site (domain); wait = hold until the user saves it (link_id)."New value: +"list (default) | get | request | wait | sign_in | record_login."
      • removedInput schema / properties / device
        Removed value: -{
        -  "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.",
        -  "type": "string"
        -}
      • changedInput schema / properties / domain / description
        Previous value: -"list: only personas usable on this host (suffix match), e.g. 'github.com'. With no match the answer is `persona_needed`, a request worded for the user. request: the site the new persona is for."New value: +"list: personas usable on this site. request: the site."
      • removedInput schema / properties / execution_target
        Removed value: -{
        -  "description": "list / request: 'cloud' asks for a Writ Cloud persona (cloud runs) even when this connection is scoped to a desktop.",
        -  "enum": [
        -    "cloud"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / force
        Removed value: -{
        -  "description": "sign_in: re-run the login even when the current session still looks usable.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / include_runs
        Removed value: -{
        -  "description": "get: include the persona's recent runs (which workflows acted as it, and whether they succeeded).",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / link_id / description
        Previous value: -"wait: the `link_id` of a persona_needed / request answer. Holds up to 75s and answers the moment the user saves the persona (persona_id), declines, or closes the window, else `still_waiting` (repeatable)."New value: +"wait: the link_id of a persona_needed / request answer."
      • removedInput schema / properties / login_url
        Removed value: -{
        -  "description": "record_login: exact sign-in page URL when known; defaults to the persona's domain root (the AI finds the form from there). list / request: the site's sign-in page, carried into `create_url` so the new persona can record it.",
        -  "type": "string"
        -}
      • removedInput schema / properties / persona_id / description
        Removed value: -"Which persona — required for get / sign_in / record_login."
      • removedInput schema / properties / wait
        Removed value: -{
        -  "description": "list + domain: one call holds up to 75s for a persona for that site to appear. A link_id is awaited with action='wait'.",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / why / description
        Previous value: -"request: one line the user sees in the window: why the account is needed."New value: +"request: one line the user sees in the window."
    • Changedwrit_pin_workflow_tool2 fields changed
      • removedInput schema / properties / pinned / description
        Removed value: -"true (default) pins; false unpins."
      • removedInput schema / properties / workflow
        Removed value: -{
        -  "description": "Workflow name (or workflow_id).",
        -  "type": "string"
        -}
    • Changedwrit_record_website11 fields changed
      • removedInput schema / properties / auth_mode
        Removed value: -{
        -  "description": "Browser recordings only: reuse verifies unknown saved auth before adoption; fresh_login records a new login without restoring old cookies, headers or storage. Device identity stays the same.",
        -  "enum": [
        -    "reuse",
        -    "fresh_login"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / device
        Removed value: -{
        -  "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.",
        -  "type": "string"
        -}
      • removedInput schema / properties / fresh_exit
        Removed value: -{
        -  "description": "Residential only: skip the persona's usual exit for this site and draw a new address — after the site refused it (an IP rate limit, a sign-in rejected with correct credentials). Ignored on server-IP egress.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / goal / description
        Removed value: -"What should be recorded on the website, in plain language"
      • removedInput schema / properties / human_layer
        Removed value: -{
        -  "description": "Browser recordings only: native keyboard input, distance-adaptive mouse paths and pre-click dwell. Fresh login enables it by default; false explicitly disables it. Native actionability checks remain active.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / persona_id / description
        Removed value: -"Saved identity to sign in with (list them with writ_personas). Required for sites behind a login with 2FA — the one-time code is then minted server-side and never shown to the caller. A desktop persona ('device:…') records on its own desktop, which fills its values itself."
      • removedInput schema / properties / residential_country
        Removed value: -{
        -  "description": "Two-letter ISO country the residential exit should be in (e.g. 'us', 'fr') — for a site that serves a different page per country, or throttles foreign traffic. Omit for an automatic exit. Ignored unless the session egresses residential.",
        -  "type": "string"
        -}
      • removedInput schema / properties / skip_existing
        Removed value: -{
        -  "description": "API builds first propose the user's OWN matching workflows (replaying is instant and free); set true after the user declined those.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / skip_marketplace
        Removed value: -{
        -  "description": "API builds then propose compatible ready-made marketplace APIs; set true to skip that and record fresh.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / url / description
        Removed value: -"Website URL to start on (required)."
      • changedInput schema / properties / use_residential / description
        Previous value: -"Open on the platform residential network (premium) for a site that blocks datacenter IPs or shows a bot wall. Default off (free datacenter egress)."New value: +"Residential network (bot walls)."
    • Changedwrit_run_saved_crawl7 fields changed
      • removedInput schema / properties / crawl / description
        Removed value: -"Saved crawl slug, name, or id (from writ_saved_crawls)."
      • removedInput schema / properties / limit
        Removed value: -{
        -  "description": "Rows of collected data to include (default 50).",
        -  "type": "integer"
        -}
      • changedInput schema / properties / max_age / description
        Previous value: -"Reuse the last completed crawl if it finished within this many seconds. 0 (default) always re-crawls."New value: +"Reuse a run younger than this (seconds)."
      • removedInput schema / properties / output
        Removed value: -{
        -  "description": "Response shape, for an answer a program or an API consumes rather than a reader. {shape: 'envelope' (default: Writ's full answer, projected) | 'table' ({columns, rows, total}) | 'records' (bare list of records) | 'record' (the newest record alone: one entity, a usage meter, a dashboard), fields: ['used', 'percent_used as pct', 'items.0.price as first_price'] (ordered pick, renames, dotted paths; a missing path is null, so keys are stable), exclude: ['depth'], include_meta: false (page metadata content_kind/depth/thumbnails is stripped unless true), key: 'usage' (wrap)}. On writ_crawl_site with save_as it is saved as the API's default shape.",
        -  "properties": {
        -    "exclude": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "fields": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "include_meta": {
        -      "type": "boolean"
        -    },
        -    "key": {
        -      "type": "string"
        -    },
        -    "shape": {
        -      "enum": [
        -        "envelope",
        -        "table",
        -        "records",
        -        "record"
        -      ],
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
      • removedInput schema / properties / preview_chars
        Removed value: -{
        -  "description": "Cut each inline page's text cells to this many characters (default 12000; 0 = full). Full page: writ_workflow_data(workflow_id=<data_workflow_id>, refs=[...]).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / timeout_seconds
        Removed value: -{
        -  "description": "Max seconds to wait when wait=true.",
        -  "type": "integer"
        -}
      • changedInput schema / properties / wait / description
        Previous value: -"Hold until the crawl converges (default false: a crawl is slow)."New value: +"Hold until done."
    • Changedwrit_run_workflow14 fields changed
      • removedInput schema / properties / device
        Removed value: -{
        -  "description": "Run on this linked Writ desktop (an agent_id from writ_devices) — overrides the desktop this connection chose with writ_devices action='use'.",
        -  "type": "string"
        -}
      • changedInput schema / properties / execution_target / description
        Previous value: -"Where this run executes: 'cloud' (managed fleet), 'auto' (prefer the user's OWN linked Writ desktop app when online, else cloud), or 'local' (require their own desktop app — keeps the run on their machine + IP). Omit to keep the workflow's own configured target. A 'local' run fails while that desktop app is offline; 'cloud' runs the same workflow on Writ's fleet, off the user's machine and IP."New value: +"cloud | auto | local (the user's own desktop app)."
      • removedInput schema / properties / files
        Removed value: -{
        -  "additionalProperties": {
        -    "type": "string"
        -  },
        -  "description": "Optional file inputs for this run, as {slot: file_id}. Slot names come from the workflow's `file_slots` (writ_list_workflows); file_ids come from the account's file library. An upload step with a pinned file uses it when `files` is omitted; a value here swaps the file for this run only.",
        -  "type": "object"
        -}
      • changedInput schema / properties / function_name / description
        Previous value: -"One named function of a multi-function workflow (an API built with writ_website_to_api / writ_browser_compose define_function): only that function and the sign-in functions it depends on run. Omitted, the whole workflow runs. It is a control, never a workflow input."New value: +"One function of a multi-function workflow."
      • removedInput schema / properties / function_names
        Removed value: -{
        -  "description": "Several functions in one run, in place of `function_name`: the union of their steps runs once, in recorded order (a prerequisite they share runs once). Not for a desktop (`local:`) workflow. A control, never a workflow input.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • changedInput schema / properties / max_age / description
        Previous value: -"Optional. Reuse a previous result if it is younger than this many seconds, instead of running the workflow again. 0 (the default) always runs fresh. A reused result answers at once and costs nothing."New value: +"Reuse a result younger than this many seconds (free). 0 = fresh."
      • changedInput schema / properties / mutation_mode / description
        Previous value: -"How a write function (one that creates/posts/sends/deletes) runs on this run. Default 'live': a run is an explicit call, so its writes are sent. 'dry_run' previews the request without sending it; 'private_test' sends it with the function's safe overrides. (Separately, BUILDING a function — define/compile/test — never sends a write, whatever this is.) Reads ignore this."New value: +"live (default) | dry_run (preview, nothing sent) | private_test."
      • removedInput schema / properties / output
        Removed value: -{
        -  "description": "Response shape, for an answer a program or an API consumes rather than a reader. {shape: 'envelope' (default: Writ's full answer, projected) | 'table' ({columns, rows, total}) | 'records' (bare list of records) | 'record' (the newest record alone: one entity, a usage meter, a dashboard), fields: ['used', 'percent_used as pct', 'items.0.price as first_price'] (ordered pick, renames, dotted paths; a missing path is null, so keys are stable), exclude: ['depth'], include_meta: false (page metadata content_kind/depth/thumbnails is stripped unless true), key: 'usage' (wrap)}. On writ_crawl_site with save_as it is saved as the API's default shape.",
        -  "properties": {
        -    "exclude": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "fields": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "include_meta": {
        -      "type": "boolean"
        -    },
        -    "key": {
        -      "type": "string"
        -    },
        -    "shape": {
        -      "enum": [
        -        "envelope",
        -        "table",
        -        "records",
        -        "record"
        -      ],
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
      • changedInput schema / properties / persona_id / description
        Previous value: -"Run AS this saved identity (see writ_personas) — the run signs in with the persona's warm session. Omit to use the workflow's default persona, if it has one. A persona of the user's linked DESKTOP (`device:<agent>:<id>`, source='device' in writ_personas) sends the run to that desktop, which signs in from its own vault: the credentials never leave it."New value: +"Run as this saved identity."
      • removedInput schema / properties / residential_country
        Removed value: -{
        -  "description": "Two-letter ISO-3166 exit country for this call (for example ca, us, fr). Keep it aligned with the requested storefront, coordinates or delivery market. It is applied when the run uses residential egress.",
        -  "type": "string"
        -}
      • removedInput schema / properties / timeout_seconds
        Removed value: -{
        -  "description": "Max seconds to wait for completion (default 120).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / use_residential
        Removed value: -{
        -  "description": "Per-call network override for an owned workflow: true uses the platform residential network, false disables the workflow's residential default. For geo-sensitive sites and sites that block datacenter addresses.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / wait
        Removed value: -{
        -  "description": "Wait for completion and return the data (default true).",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / workflow_id / description
        Previous value: -"A number, or `local:<id>` for a workflow that lives on the user's linked Writ desktop (writ_list_workflows, runs_on='desktop') - it runs there, signed in as one of that desktop's personas when persona_id is `device:...`."New value: +"A number, or 'local:<id>' (a workflow on the user's desktop)."
    • Changedwrit_saved_crawl_data4 fields changed
      • removedInput schema / properties / crawl / description
        Removed value: -"Saved crawl slug, name, or id."
      • removedInput schema / properties / limit / description
        Removed value: -"Rows to return (default 25)."
      • removedInput schema / properties / output
        Removed value: -{
        -  "description": "Response shape, for an answer a program or an API consumes rather than a reader. {shape: 'envelope' (default: Writ's full answer, projected) | 'table' ({columns, rows, total}) | 'records' (bare list of records) | 'record' (the newest record alone: one entity, a usage meter, a dashboard), fields: ['used', 'percent_used as pct', 'items.0.price as first_price'] (ordered pick, renames, dotted paths; a missing path is null, so keys are stable), exclude: ['depth'], include_meta: false (page metadata content_kind/depth/thumbnails is stripped unless true), key: 'usage' (wrap)}. On writ_crawl_site with save_as it is saved as the API's default shape.",
        -  "properties": {
        -    "exclude": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "fields": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "include_meta": {
        -      "type": "boolean"
        -    },
        -    "key": {
        -      "type": "string"
        -    },
        -    "shape": {
        -      "enum": [
        -        "envelope",
        -        "table",
        -        "records",
        -        "record"
        -      ],
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
      • removedInput schema / properties / preview_chars
        Removed value: -{
        -  "description": "Cut string cells (page markdown) to this many characters (default 2000; 0 = full cells). Full single pages: writ_workflow_data(refs=...) per the response hint.",
        -  "type": "integer"
        -}
    • Changedwrit_saved_crawls1 field changed
      • removedInput schema / properties / limit / description
        Removed value: -"Max saved crawls to return (default 50)."
    • Changedwrit_scrape12 fields changed
      • removedInput schema / properties / device
        Removed value: -{
        -  "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.",
        -  "type": "string"
        -}
      • changedInput schema / properties / format / description
        Previous value: -"markdown (default): the page's clean main content. html: the raw HTML as fetched (same egress/persona/render) — for selectors, embedded JSON, anything the cleaned text drops; clipped to preview_chars (default 40000, 0 = whole page). both: html plus the markdown derived from it, one fetch. Single `url` only."New value: +"markdown (default) | html (raw HTML) | both."
      • removedInput schema / properties / include_paths
        Removed value: -{
        -  "description": "With top_n: regex(es) the item links match (e.g. 'item\\\\?id=', '/products/'). Optional: the server detects detail links when omitted.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • changedInput schema / properties / persona_id / description
        Previous value: -"Saved identity to read as (writ_personas lists them), for pages behind a login. Forces the identity's own residential exit. A desktop persona ('device:…') reads on its own desktop, from that machine."New value: +"Read signed in as this saved identity (writ_personas)."
      • removedInput schema / properties / preview_chars
        Removed value: -{
        -  "description": "Cut each page's text to this many characters (default 12000; 0 = full pages).",
        -  "type": "integer"
        -}
      • changedInput schema / properties / render_mode / description
        Previous value: -"auto (default: plain HTTP, browser only if the page needs JS) | http | browser."New value: +"auto (default: HTTP, a browser when the page needs JS) | http | browser."
      • removedInput schema / properties / residential_country
        Removed value: -{
        -  "description": "Two-letter ISO country the residential exit should be in (e.g. 'us', 'fr'), also used by the automatic residential retry on a blocked page. Omitted = an automatic exit. Ignored unless the session egresses residential.",
        -  "type": "string"
        -}
      • removedInput schema / properties / respect_robots
        Removed value: -{
        -  "description": "Apply robots.txt to the explicitly requested page(s). Default false for scrape; writ_crawl_site defaults true for autonomous discovery.",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / top_n / description
        Previous value: -"With `url` = a listing/front/search/category page: also read its N top-ranked item pages (the page's link order is the ranking). One call, parallel."New value: +"With url = a listing: also read its N top-ranked item pages (max 20)."
      • removedInput schema / properties / url / description
        Removed value: -"A page to read or, with `top_n`, the listing page whose top items are read."
      • changedInput schema / properties / urls / description
        Previous value: -"Known pages to read together (max 20), fetched in parallel in one call."New value: +"Up to 20 known pages, read in parallel."
      • changedInput schema / properties / use_residential / description
        Previous value: -"Fetch through the platform residential network (premium) for a site that blocks datacenter IPs or shows a bot wall. Default off."New value: +"Residential network for a bot wall (automatic retry when refused)."
    • Changedwrit_search_data5 fields changed
      • removedInput schema / properties / device
        Removed value: -{
        -  "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.",
        -  "type": "string"
        -}
      • removedInput schema / properties / limit / description
        Removed value: -"Rows per workflow (default 10)."
      • removedInput schema / properties / preview_chars
        Removed value: -{
        -  "description": "Cut matched string cells to this many characters (default 300; 0 = full cells).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / q / description
        Removed value: -"Search term (required)."
      • removedInput schema / properties / workflow
        Removed value: -{
        -  "type": "string"
        -}
    • Changedwrit_set_schedule10 fields changed
      • changedInput schema / properties / days / description
        Previous value: -"ISO weekdays for weekly: 1=Mon .. 7=Sun."New value: +"Weekdays 1=Mon..7=Sun (weekly)."
      • removedInput schema / properties / enabled
        Removed value: -{
        -  "description": "Schedule on or off (default on).",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / every_minutes / description
        Previous value: -"Interval schedule: minutes between runs."New value: +"Interval in minutes."
      • removedInput schema / properties / function
        Removed value: -{
        -  "description": "One function name (alias of `functions`); \"\" or \"all\" = the whole workflow.",
        -  "type": "string"
        -}
      • removedInput schema / properties / functions
        Removed value: -{
        -  "description": "Function names a scheduled run calls (from writ_list_workflows / writ_update_workflow). [] or [\"all\"] = the whole workflow. Omitted: current target kept.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / inputs
        Removed value: -{
        -  "description": "Scheduled-run inputs {input_name: value} (text, number, true/false), used over the workflow's saved values for scheduled runs only. {} clears them; omitted keeps them. No secrets: those are workflow secrets or a persona.",
        -  "type": "object"
        -}
      • changedInput schema / properties / kind / description
        Previous value: -"interval | daily | weekly"New value: +"interval | daily | weekly."
      • changedInput schema / properties / time / description
        Previous value: -"HH:MM local time for daily/weekly."New value: +"HH:MM (daily/weekly)."
      • changedInput schema / properties / tz / description
        Previous value: -"IANA timezone for daily/weekly."New value: +"IANA timezone."
      • removedInput schema / properties / workflow
        Removed value: -{
        -  "type": "string"
        -}
    • Changedwrit_update_saved_crawl5 fields changed
      • removedInput schema / properties / crawl / description
        Removed value: -"Saved crawl slug, name, or id."
      • removedInput schema / properties / default_max_age_seconds
        Removed value: -{
        -  "minimum": 0,
        -  "type": "integer"
        -}
      • removedInput schema / properties / description
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / name
        Removed value: -{
        -  "type": "string"
        -}
      • changedInput schema / properties / settings / description
        Previous value: -"Sparse crawl config patch merged recursively into the complete saved settings."New value: +"Sparse settings patch."
    • Changedwrit_update_workflow17 fields changed
      • removedInput schema / properties / expected_updated_at
        Removed value: -{
        -  "description": "Workflow timestamp returned by inspection; checked under the row lock.",
        -  "type": "string"
        -}
      • removedInput schema / properties / function_name
        Removed value: -{
        -  "description": "Source of this function only.",
        -  "type": "string"
        -}
      • removedInput schema / properties / function_updates
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "expected_hash": {
        -        "description": "Expected whole-step hash from inspection.",
        -        "type": "string"
        -      },
        -      "function_name": {
        -        "type": "string"
        -      },
        -      "json_edits": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "op": {
        -              "enum": [
        -                "test",
        -                "add",
        -                "replace",
        -                "remove"
        -              ],
        -              "type": "string"
        -            },
        -            "path": {
        -              "type": "string"
        -            },
        -            "value": {}
        -          },
        -          "required": [
        -            "op",
        -            "path"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "patch": {
        -        "description": "Sparse type/config/enabled patch; object keys merge, arrays replace.",
        -        "type": "object"
        -      },
        -      "script_edits": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "expected_hash": {
        -              "type": "string"
        -            },
        -            "new": {
        -              "type": "string"
        -            },
        -            "old": {
        -              "type": "string"
        -            },
        -            "path": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "path",
        -            "old",
        -            "new"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "step_id": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "function_name"
        -    ],
        -    "type": "object"
        -  },
        -  "maxItems": 50,
        -  "minItems": 1,
        -  "type": "array"
        -}
      • removedInput schema / properties / limit
        Removed value: -{
        -  "maximum": 100,
        -  "minimum": 1,
        -  "type": "integer"
        -}
      • removedInput schema / properties / max_chars
        Removed value: -{
        -  "maximum": 20000,
        -  "minimum": 1000,
        -  "type": "integer"
        -}
      • removedInput schema / properties / offset
        Removed value: -{
        -  "minimum": 0,
        -  "type": "integer"
        -}
      • removedInput schema / properties / operator
        Removed value: -{
        -  "description": "section=contract: one operator, with its operands, semantics and example.",
        -  "type": "string"
        -}
      • removedInput schema / properties / patch
        Removed value: -{
        -  "description": "Sparse settings patch. Supports every WorkflowUpdate field except credentials and captured recorded_session material, which vault/persona/session management own. human_behavior: 'on' types text using keyboard events every browser run; 'auto' does so on a bot-block retry; 'off' disables the default.",
        -  "type": "object"
        -}
      • removedInput schema / properties / path
        Removed value: -{
        -  "description": "JSON Pointer into the selected step, e.g. /config/flow/steps/2 or /config/script.",
        -  "type": "string"
        -}
      • removedInput schema / properties / regenerate_skill
        Removed value: -{
        -  "description": "Rebuild the workflow's agent skill (SKILL.md) from its current functions, inputs and sign-in, replacing any edited version; the answer carries the new skill_md. Runs after any patch in the same call.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / replace_steps
        Removed value: -{
        -  "description": "Complete recorded-step replacement; step_updates is the targeted edit.",
        -  "items": {
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / section
        Removed value: -{
        -  "description": "source reads a source window; flow lists nested node paths; contract lists operators and their semantics without requiring a workflow.",
        -  "enum": [
        -    "source",
        -    "flow",
        -    "contract"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / step_id
        Removed value: -{
        -  "description": "Stable step id that picks one step of a multi-step function.",
        -  "type": "string"
        -}
      • removedInput schema / properties / step_updates
        Removed value: -{
        -  "items": {
        -    "properties": {
        -      "index": {
        -        "description": "Zero-based step index.",
        -        "type": "integer"
        -      },
        -      "patch": {
        -        "description": "Sparse step patch: id, type, enabled, and/or nested config. Config is merged recursively.",
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "index",
        -      "patch"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / validate_only
        Removed value: -{
        -  "description": "Preview/validate without saving or executing.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / verbose
        Removed value: -{
        -  "description": "Edits answer with the full workflow definition instead of the compact step outline (default false).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / workflow
        Removed value: -{
        -  "description": "Workflow name (or workflow_id).",
        -  "type": "string"
        -}
    • Changedwrit_website_to_api18 fields changed
      • removedInput schema / properties / ai_supervise
        Removed value: -{
        -  "description": "AI-supervised crawl rungs (mode=crawl/browser; default true): after the crawl mines forms, POSTs, query links, scripts and listings, one bounded Writ AI call authors the API from them — which functions serve the goal, their names, inputs and example values; the live verify call then measures each response shape. false = the purely mechanical surface map (no AI spend on the crawl rungs).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / anonymous
        Removed value: -{
        -  "description": "Builds from what is visible without an account even though the site shows a sign-in page; for when the user said the public part is enough.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / build_id / description
        Removed value: -"Continues a parked build (status needs_guidance from writ_discovery_status) on the guided rung: opens the browser bound to it, seeded with its map."
      • removedInput schema / properties / device
        Removed value: -{
        -  "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.",
        -  "type": "string"
        -}
      • removedInput schema / properties / execution_target
        Removed value: -{
        -  "description": "'cloud' (the fleet) or a linked desktop's agent_id: builds there, in its own browser and connection. Omitted = the desktop chosen with writ_devices, else the cloud.",
        -  "type": "string"
        -}
      • removedInput schema / properties / goal / description
        Removed value: -"What the API should return or do, in plain language. Matched to the user's own workflows and marketplace listings first; narrows the crawl to what was asked (equivalent to `scope`) instead of mapping the whole app."
      • removedInput schema / properties / level
        Removed value: -{
        -  "description": "Write policy for the crawl rungs. 'light' (default) captures every endpoint and payload but never performs a real create/update/delete. 'deep' performs each write once to capture its real confirmation response, so it changes real data; opt-in, for an explicit request.",
        -  "enum": [
        -    "light",
        -    "deep"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / properties / mode / description
        Previous value: -"intelligent (default): the full ladder driven by Writ — the AI fast path (a live browser, a few AI steps, every function live-tested), then Writ's own AI browser rung only if needed. guided: a browser bound to a build that the caller drives and composes (sign in, capture_network, define_function, save); with build_id it continues a parked build and inherits its map. 'auto': the same ladder with the caller as the last rung — own workflows and marketplace proposed first, then the fast path; not enough => the build parks as needs_guidance, to finish guided. 'fast' = starts on the fast path. 'crawl' / 'browser' = the whole-site static / rendered crawl (unverified maps). For compatibility, regular/deep remain aliases of guided."New value: +"intelligent (default, Writ builds it) | guided (the caller drives) | auto | fast | crawl | browser."
      • removedInput schema / properties / persona_id / description
        Removed value: -"Saved identity to sign in with (writ_personas). Without one, a site whose entry page is a sign-in wall is not built: the answer names the persona to pass, or returns `persona_needed` with `tell_user` (a message for the user) and `create_url`; a later call with the new persona_id builds. Required for 2FA: the code is minted server-side and never reaches the caller."
      • removedInput schema / properties / residential_country
        Removed value: -{
        -  "description": "Two-letter ISO country the residential exit should be in (e.g. 'us', 'fr'); applies to every rung of the build, the guided browser included. No value means an automatic exit. Ignored unless the session egresses residential.",
        -  "type": "string"
        -}
      • removedInput schema / properties / respect_robots
        Removed value: -{
        -  "description": "Crawl rungs (mode=crawl/browser) obey the site's robots.txt (default true). false is for a target the user vouches for after a rung reported robots.txt refused the crawl (`escalations` / `message` name the rule); otherwise such a rung fetches nothing and the build goes straight to a browser. Does not apply to the AI or guided browser rungs.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / save_as / description
        Removed value: -"Name for the workflow the build saves."
      • removedInput schema / properties / scope
        Removed value: -{
        -  "description": "Crawl lanes: maps only this surface (e.g. 'employees') and what it depends on. No value maps the whole app.",
        -  "type": "string"
        -}
      • changedInput schema / properties / skip_existing / description
        Previous value: -"Skips the proposal of the user's own matching workflows (for after they declined)."New value: +"Skip the proposal of the user's own matching workflows."
      • changedInput schema / properties / skip_marketplace / description
        Previous value: -"Skips the ready-made marketplace proposals and builds fresh."New value: +"Skip the marketplace proposals."
      • removedInput schema / properties / url / description
        Removed value: -"The page that already shows the rows (search-results, category or listing URL), not the home page. Required unless build_id continues a parked build."
      • removedInput schema / properties / use_residential
        Removed value: -{
        -  "description": "Runs on the platform residential network (premium), for a site that blocks datacenter IPs. Default off. Continuing a build (build_id) keeps the build's own persona, residential exit and country unless these fields are passed.",
        -  "type": "boolean"
        -}
      • removedInput schema / required
        Removed value: -[]
    • Changedwrit_wire_monitor21 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"What to do on a detected change."New value: +"notify | workflow | ai_task."
      • removedInput schema / properties / ai_session_id
        Removed value: -{
        -  "description": "action='ai_task': re-run this saved AI session instead of (or as well as) a prompt.",
        -  "type": "integer"
        -}
      • changedInput schema / properties / buy / description
        Previous value: -"action='workflow': the workflow is a checkout and runs as a purchase. action='ai_task' (with a `prompt` saying what to buy): an AI purchase session browses to the order page and Writ checks out. Always saved with dry_run on (a rehearsal that places no order), whatever is sent; the user arms real purchases in the Writ app. Cloud monitors only; an AI purchase session can't use device_card."New value: +"Run the workflow or task as a purchase (saved as a rehearsal until armed)."
      • removedInput schema / properties / buy / properties
        Removed value: -{
        -  "commit_selector": {
        -    "description": "action='workflow' only: the place-order button on the final page (CSS, at most 500 characters). Never click it: Writ clicks it during a live buy. A live buy needs it (or a recorded order step, or fallback_ai_session).",
        -    "type": "string"
        -  },
        -  "confirm_over": {
        -    "description": "Ask for approval only above this amount (default: the threshold).",
        -    "type": "number"
        -  },
        -  "fallback_ai_session": {
        -    "description": "action='workflow' only: when the recorded checkout fails at fire time, or has no order step, wake one AI purchase session with the same limits (once per fire).",
        -    "type": "boolean"
        -  },
        -  "max_amount": {
        -    "description": "AI purchase session: the most one order may cost (0.01-10000). The page and the agent may lower it, never raise it.",
        -    "type": "number"
        -  },
        -  "payment": {
        -    "description": "Required. {kind, ref}: kind vault_card | virtual_card | device_card (ref = the card's id from writ_payment action='list', or an approved grant's payment.ref) or merchant_saved (the card saved on the store account; no ref).",
        -    "properties": {
        -      "kind": {
        -        "enum": [
        -          "vault_card",
        -          "virtual_card",
        -          "device_card",
        -          "merchant_saved"
        -        ],
        -        "type": "string"
        -      },
        -      "ref": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  "price_buffer_pct": {
        -    "description": "Tax and shipping allowance over the price, 0-100 (default 20).",
        -    "type": "number"
        -  },
        -  "require_confirmation": {
        -    "description": "Hold a purchase for the user's approval (default true).",
        -    "type": "boolean"
        -  },
        -  "spend_cap": {
        -    "description": "Most the automation may spend per period: {amount, period: day|week|month} or a number (per day). Default with a threshold: one buy at the threshold plus the buffer, per day.",
        -    "type": [
        -      "object",
        -      "number"
        -    ]
        -  },
        -  "total_selector": {
        -    "description": "CSS selector of the order total on the checkout page; the run stops before placing an order whose total is above the allowed amount.",
        -    "type": "string"
        -  }
        -}
      • removedInput schema / properties / buy / required
        Removed value: -[
        -  "payment"
        -]
      • changedInput schema / properties / channels / description
        Previous value: -"Notification channels, e.g. [\"pushover\",\"email\"] — required for action='notify'; optional with action='ai_task' (finish alert)."New value: +"Notification channels, e.g. [\"email\",\"pushover\"]."
      • removedInput schema / properties / cooldown_minutes
        Removed value: -{
        -  "description": "action='ai_task': minimum minutes between wakes (default 10; 0 disables).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / device
        Removed value: -{
        -  "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.",
        -  "type": "string"
        -}
      • removedInput schema / properties / enabled
        Removed value: -{
        -  "type": "boolean"
        -}
      • removedInput schema / properties / entry_url
        Removed value: -{
        -  "description": "action='ai_task': page the agent starts on (defaults to the monitored URL).",
        -  "type": "string"
        -}
      • removedInput schema / properties / max_steps
        Removed value: -{
        -  "description": "action='ai_task': cap on agent steps per wake (default 20, max 100).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / message
        Removed value: -{
        -  "description": "Notification body template (supports {{event.url}}).",
        -  "type": "string"
        -}
      • removedInput schema / properties / monitor_id / description
        Removed value: -"Monitor id from writ_create_monitor."
      • removedInput schema / properties / name
        Removed value: -{
        -  "description": "Optional automation name.",
        -  "type": "string"
        -}
      • changedInput schema / properties / prompt / description
        Previous value: -"action='ai_task': what the agent does when the monitor fires, e.g. \"Check whether the price dropped below $500 and summarize what changed\". Supports {{placeholders}} like {{diff_snippet}} and {{extracted.price}}. With `buy`, say exactly what to buy (product, quantity, options, shipping)."New value: +"action='ai_task': what the agent does."
      • changedInput schema / properties / recipients / description
        Previous value: -"Notification recipients, e.g. [\"pushover:1\"]. Omitted = every enabled recipient on the channel; the answer names who the alert actually reaches, and warns when nobody is configured."New value: +"e.g. [\"email:3\"]; omitted = every enabled recipient."
      • changedInput schema / properties / threshold / description
        Previous value: -"Price watch: act only when the watched price reaches this number (e.g. 477.04), once; by default at or below it (see `threshold_op`), and a price on the other side, or one the page no longer shows, does nothing. Needs a monitor that reads the price (a selector or extract, not a visual zone). Without it, any change fires. Works for a desktop monitor too (`device`)."New value: +"Price watch: act once when the price reaches this number."
      • changedInput schema / properties / threshold_op / description
        Previous value: -"Which side of `threshold` fires: lte = at or below (default: \"drops to 477.04\" fires at 477.04), lt = strictly below (\"below / under / less than\"), gte = at or above, gt = strictly above (a rise alert)."New value: +"lte (default) | lt | gte | gt."
      • removedInput schema / properties / title
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / workflow / description
        Removed value: -"Workflow to run (name) — required for action='workflow'."
      • removedInput schema / properties / workflow_id
        Removed value: -{
        -  "type": "integer"
        -}
    • Changedwrit_workflow_data7 fields changed
      • removedInput schema / properties / device
        Removed value: -{
        -  "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.",
        -  "type": "string"
        -}
      • removedInput schema / properties / output
        Removed value: -{
        -  "description": "Response shape, for an answer a program or an API consumes rather than a reader. {shape: 'envelope' (default: Writ's full answer, projected) | 'table' ({columns, rows, total}) | 'records' (bare list of records) | 'record' (the newest record alone: one entity, a usage meter, a dashboard), fields: ['used', 'percent_used as pct', 'items.0.price as first_price'] (ordered pick, renames, dotted paths; a missing path is null, so keys are stable), exclude: ['depth'], include_meta: false (page metadata content_kind/depth/thumbnails is stripped unless true), key: 'usage' (wrap)}. On writ_crawl_site with save_as it is saved as the API's default shape.",
        -  "properties": {
        -    "exclude": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "fields": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "include_meta": {
        -      "type": "boolean"
        -    },
        -    "key": {
        -      "type": "string"
        -    },
        -    "shape": {
        -      "enum": [
        -        "envelope",
        -        "table",
        -        "records",
        -        "record"
        -      ],
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
      • removedInput schema / properties / preview_chars
        Removed value: -{
        -  "description": "Cut string cells to this many characters (default 2000; 0 = full cells).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / q / description
        Removed value: -"Substring filter across fields."
      • changedInput schema / properties / refs / description
        Previous value: -"Hydration: full untruncated records by ref '<run_id>:<record_index>' (both fields are on every row). Max 100."New value: +"Full records by '<run_id>:<record_index>'."
      • removedInput schema / properties / view
        Removed value: -{
        -  "description": "all | latest | run",
        -  "type": "string"
        -}
      • removedInput schema / properties / workflow
        Removed value: -{
        -  "type": "string"
        -}
    • Changedwrit_workflow_runs3 fields changed
      • removedInput schema / properties / device
        Removed value: -{
        -  "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.",
        -  "type": "string"
        -}
      • changedInput schema / properties / status / description
        Previous value: -"pending|running|success|failed|cancelled|skipped"New value: +"Filter by status."
      • removedInput schema / properties / workflow
        Removed value: -{
        -  "type": "string"
        -}
  2. 1 tool update
    • Changedwrit_personas2 fields changed
      • addedInput schema / properties / device
        Added value: +{
        +  "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.",
        +  "type": "string"
        +}
      • addedInput schema / properties / execution_target
        Added value: +{
        +  "description": "list / request: 'cloud' asks for a Writ Cloud persona (cloud runs) even when this connection is scoped to a desktop.",
        +  "enum": [
        +    "cloud"
        +  ],
        +  "type": "string"
        +}
  3. 39 tool updates
    • First observedwrit_browser_act
    • First observedwrit_browser_ask_user
    • First observedwrit_browser_cancel
    • First observedwrit_browser_compose
    • First observedwrit_browser_context
    • First observedwrit_browser_network
    • First observedwrit_browser_save
    • First observedwrit_browser_sessions
    • First observedwrit_browser_use
    • First observedwrit_crawl_files
    • First observedwrit_crawl_site
    • First observedwrit_crawl_status
    • First observedwrit_create_automation
    • First observedwrit_create_http_extraction
    • First observedwrit_create_monitor
    • First observedwrit_devices
    • First observedwrit_diagnose_http_workflow
    • First observedwrit_discovery_status
    • First observedwrit_export_data
    • First observedwrit_expose_workflow_api
    • First observedwrit_list_webhooks
    • First observedwrit_list_workflows
    • First observedwrit_payment
    • First observedwrit_personas
    • First observedwrit_pin_workflow_tool
    • First observedwrit_record_website
    • First observedwrit_run_saved_crawl
    • First observedwrit_run_workflow
    • First observedwrit_saved_crawl_data
    • First observedwrit_saved_crawls
    • First observedwrit_scrape
    • First observedwrit_search_data
    • First observedwrit_set_schedule
    • First observedwrit_update_saved_crawl
    • First observedwrit_update_workflow
    • First observedwrit_website_to_api
    • First observedwrit_wire_monitor
    • First observedwrit_workflow_data
    • First observedwrit_workflow_runs

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to browse websites, extract information, fill forms, interact with pages, and execute multi-step web tasks autonomously.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Lets AI assistants control your real Chrome browser to perform web tasks like reading pages, taking screenshots, clicking, and typing, using your existing logged-in sessions.
    145
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to call typed tools compiled from ordinary websites, performing reads and verified writes through their web UIs and returning data, screenshots, and execution traces.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.