Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Writ Cloud

REMOTE · API.USEWRIT.APP · 2 COMPONENTS

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

76 Trust /100

Last scanned (3 hours ago)

Scores higher than 70% of remote servers

Reachable. Last reached 17 Oct 2026.

Category Browser Automation

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security94
Transport & Reachability100
Schema Quality & AI Usability56
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 6062 tokens (~147/item across 41 items; 41 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management20
  • Stability observed for 6 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage86
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 58% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 41 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 42 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities73
  • Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
  • Supports UI / widget rendering.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 17 Oct 26 0
    • First check of Capabilities: pass functional
    • This server's schema is too large to store in full, so we cannot compare its tools day to day functional
  • 16 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

  • 14 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

  • 13 Oct 26 +1

    We did not load change detail this far back for this component, so this day may have recorded more than is shown.

    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “writ_payment” rewrote its description, which is the text the model reads security
    • Tool “writ_browser_sessions” rewrote its description, which is the text the model reads security
    • Tool “writ_update_saved_crawl” rewrote its description, which is the text the model reads security
    • Tool “writ_run_saved_crawl” rewrote its description, which is the text the model reads security
    • Tool “writ_discovery_status” rewrote its description, which is the text the model reads security
    • Tool “writ_browser_compose” rewrote its description, which is the text the model reads security
    • Tool “writ_workflow_runs” rewrote its description, which is the text the model reads security
    • Tool “writ_update_workflow” rewrote its description, which is the text the model reads security
    • Tool “writ_pin_workflow_tool” rewrote its description, which is the text the model reads security
    • Tool “writ_scrape” rewrote its description, which is the text the model reads security
    • Tool “writ_browser_act” rewrote its description, which is the text the model reads security
    • Tool “writ_browser_use” rewrote its description, which is the text the model reads security
    • Tool “writ_browser_context” rewrote its description, which is the text the model reads security
    • Tool “writ_browser_ask_user” rewrote its description, which is the text the model reads security
    • Tool “writ_record_website” rewrote its description, which is the text the model reads security
    • Tool “writ_diagnose_http_workflow” rewrote its description, which is the text the model reads security
    • Tool “writ_saved_crawl_data” rewrote its description, which is the text the model reads security
    • Tool “writ_browser_save” rewrote its description, which is the text the model reads security
    • Tool “writ_browser_network” rewrote its description, which is the text the model reads security
    • Tool “writ_create_monitor” rewrote its description, which is the text the model reads security
    • Tool “writ_wire_monitor” rewrote its description, which is the text the model reads security
    • Tool “writ_create_http_extraction” rewrote its description, which is the text the model reads security
    • Tool “writ_browser_cancel” rewrote its description, which is the text the model reads security
    • Tool “writ_search_data” rewrote its description, which is the text the model reads security
    • Tool “writ_run_workflow” rewrote its description, which is the text the model reads security
    • Tool “writ_create_automation” rewrote its description, which is the text the model reads security
    • Tool “writ_list_webhooks” rewrote its description, which is the text the model reads security
    • Tool “writ_workflow_data” rewrote its description, which is the text the model reads security
    • Tool “writ_crawl_status” rewrote its description, which is the text the model reads security
    • Tool “writ_crawl_site” rewrote its description, which is the text the model reads security
    • Tool “writ_expose_workflow_api” rewrote its description, which is the text the model reads security
    • Tool “writ_website_to_api” rewrote its description, which is the text the model reads security
    • Tool “writ_personas” rewrote its description, which is the text the model reads security
    • Tool “writ_export_data” rewrote its description, which is the text the model reads security
    • Tool “writ_saved_crawls” rewrote its description, which is the text the model reads security
    • Tool “writ_devices” rewrote its description, which is the text the model reads security
    • Tool “writ_crawl_files” rewrote its description, which is the text the model reads security
    • Tool “writ_set_schedule” rewrote its description, which is the text the model reads security
    • Tool coverage: 83% → 59% ▼ functional
    • Schema quality: 701 → 141 ▲ functional
    • New tool “writ_help” functional
    • “writ_website_to_api” reworded the description of “skip_existing” cosmetic
    • “writ_record_website” reworded the description of “persona_id” cosmetic
    • “writ_payment” reworded the description of “grant_id” cosmetic
    • “writ_crawl_site” reworded the description of “intent” cosmetic
    • “writ_wire_monitor” reworded the description of “threshold” cosmetic
    • “writ_crawl_site” reworded the description of “extract_prompt” cosmetic
    • “writ_create_automation” reworded the description of “on_workflow” cosmetic
    • “writ_create_monitor” reworded the description of “interval” cosmetic
    • “writ_browser_use” reworded the description of “url” cosmetic
    • “writ_record_website” reworded the description of “use_residential” cosmetic
    • “writ_browser_act” reworded the description of “inputs” cosmetic
    • “writ_browser_use” reworded the description of “persona_id” cosmetic
    • “writ_saved_crawls” reworded the description of “limit” cosmetic
    • “writ_browser_save” reworded the description of “name” cosmetic
    • “writ_export_data” reworded the description of “format” cosmetic
    • “writ_payment” reworded the description of “commit_selector” cosmetic
    • “writ_create_monitor” reworded the description of “selector” cosmetic
    • “writ_create_monitor” reworded the description of “url” cosmetic
    • “writ_workflow_data” reworded the description of “refs” cosmetic
    • “writ_create_automation” reworded the description of “name” cosmetic
    • “writ_search_data” reworded the description of “q” cosmetic
    • “writ_browser_use” reworded the description of “use_residential” cosmetic
    • “writ_discovery_status” reworded the description of “wait” cosmetic
    • “writ_crawl_site” reworded the description of “page_budget” cosmetic
    • “writ_devices” reworded the description of “device” cosmetic
    • “writ_diagnose_http_workflow” reworded the description of “task_id” cosmetic
    • “writ_browser_use” reworded the description of “execution_target” cosmetic
    • “writ_scrape” reworded the description of “url” cosmetic
    • “writ_payment” reworded the description of “max_amount” cosmetic
    • “writ_browser_network” reworded the description of “query” cosmetic
    • “writ_crawl_site” reworded the description of “wait” cosmetic
    • “writ_create_automation” reworded the description of “notify” cosmetic
    • “writ_website_to_api” reworded the description of “persona_id” cosmetic
    • “writ_personas” reworded the description of “persona_id” cosmetic
    • “writ_record_website” reworded the description of “url” cosmetic
    • “writ_crawl_status” reworded the description of “wait” cosmetic
    • “writ_workflow_data” reworded the description of “q” cosmetic
    • “writ_browser_act” reworded the description of “session_id” cosmetic
    • “writ_personas” reworded the description of “link_id” cosmetic
    • “writ_browser_use” reworded the description of “goal” cosmetic
    • “writ_browser_network” reworded the description of “index” cosmetic
    • “writ_browser_ask_user” reworded the description of “kind” cosmetic
    • “writ_set_schedule” reworded the description of “tz” cosmetic
    • “writ_create_automation” reworded the description of “target_id” cosmetic
    • “writ_crawl_files” reworded the description of “crawl” cosmetic
    • “writ_crawl_site” reworded the description of “url” cosmetic
    • “writ_create_monitor” reworded the description of “persona_id” cosmetic
    • “writ_scrape” reworded the description of “top_n” cosmetic
    • “writ_create_monitor” reworded the description of “watch” cosmetic
    • “writ_create_monitor” reworded the description of “session_id” cosmetic
    • “writ_create_http_extraction” reworded the description of “goal” cosmetic
    • “writ_wire_monitor” reworded the description of “workflow” cosmetic
    • “writ_create_monitor” reworded the description of “extract” cosmetic
    • “writ_run_workflow” reworded the description of “mutation_mode” cosmetic
    • “writ_scrape” reworded the description of “urls” cosmetic
    • “writ_wire_monitor” reworded the description of “buy” cosmetic
    • “writ_payment” reworded the description of “confirmation_id” cosmetic
    • “writ_website_to_api” reworded the description of “mode” cosmetic
    • “writ_run_workflow” reworded the description of “persona_id” cosmetic
    • “writ_wire_monitor” reworded the description of “recipients” cosmetic
    • “writ_create_http_extraction” reworded the description of “apply” cosmetic
    • “writ_discovery_status” reworded the description of “timeout_seconds” cosmetic
    • “writ_set_schedule” reworded the description of “time” cosmetic
    • “writ_pin_workflow_tool” reworded the description of “pinned” cosmetic
    • “writ_website_to_api” reworded the description of “save_as” cosmetic
    • “writ_pin_workflow_tool” dropped the optional parameter “workflow” cosmetic
    • “writ_update_workflow” dropped the optional parameter “expected_updated_at” cosmetic
    • “writ_wire_monitor” dropped the optional parameter “enabled” cosmetic
    • “writ_create_monitor” dropped the optional parameter “device” cosmetic
    • “writ_browser_sessions” dropped the optional parameter “include_closed” cosmetic
    • “writ_scrape” dropped the optional parameter “respect_robots” cosmetic
    • “writ_crawl_site” dropped the optional parameter “name” cosmetic
    • “writ_run_workflow” dropped the optional parameter “timeout_seconds” cosmetic
    • “writ_record_website” dropped the optional parameter “skip_existing” cosmetic
    • “writ_personas” dropped the optional parameter “device” cosmetic
    • “writ_crawl_status” dropped the optional parameter “timeout_seconds” cosmetic
    • “writ_crawl_site” dropped the optional parameter “residential_country” cosmetic
    • “writ_create_monitor” dropped the optional parameter “residential_country” cosmetic
    • “writ_run_workflow” dropped the optional parameter “device” cosmetic
    • “writ_crawl_site” dropped the optional parameter “use_residential” cosmetic
    • “writ_update_workflow” dropped the optional parameter “replace_steps” cosmetic
    • “writ_workflow_data” dropped the optional parameter “output” cosmetic
    • “writ_update_workflow” dropped the optional parameter “path” cosmetic
    • “writ_workflow_data” dropped the optional parameter “workflow” cosmetic
    • “writ_crawl_site” dropped the optional parameter “relevance_threshold” cosmetic
    • “writ_create_automation” dropped the optional parameter “title” cosmetic
    • “writ_payment” dropped the optional parameter “fields” cosmetic
    • “writ_create_http_extraction” dropped the optional parameter “response_sample” cosmetic
    • “writ_crawl_site” dropped the optional parameter “output” cosmetic
    • “writ_crawl_site” dropped the optional parameter “render_mode” cosmetic
    • “writ_workflow_data” dropped the optional parameter “device” cosmetic
    • “writ_expose_workflow_api” dropped the optional parameter “wait_timeout” cosmetic
    • “writ_create_monitor” dropped the optional parameter “mode” cosmetic
    • “writ_run_saved_crawl” dropped the optional parameter “limit” cosmetic
    • “writ_export_data” dropped the optional parameter “workflow” cosmetic
    • “writ_crawl_site” dropped the optional parameter “extract_schema” cosmetic
    • “writ_set_schedule” dropped the optional parameter “enabled” cosmetic
    • “writ_create_automation” dropped the optional parameter “priority” cosmetic
    • “writ_run_workflow” dropped the optional parameter “use_residential” cosmetic
    • “writ_create_automation” dropped the optional parameter “enabled” cosmetic
    • “writ_update_workflow” dropped the optional parameter “step_id” cosmetic
    • “writ_set_schedule” dropped the optional parameter “workflow” cosmetic
    • “writ_update_workflow” dropped the optional parameter “regenerate_skill” cosmetic
    • “writ_update_workflow” dropped the optional parameter “patch” cosmetic
    • “writ_create_monitor” dropped the optional parameter “try_anyway” cosmetic
    • “writ_update_workflow” dropped the optional parameter “verbose” cosmetic
    • “writ_wire_monitor” dropped the optional parameter “name” cosmetic
    • “writ_personas” dropped the optional parameter “force” cosmetic
    • “writ_crawl_site” dropped the optional parameter “speed” cosmetic
    • “writ_update_workflow” dropped the optional parameter “section” cosmetic
    • “writ_run_saved_crawl” dropped the optional parameter “preview_chars” cosmetic
    • “writ_crawl_site” dropped the optional parameter “same_domain” cosmetic
    • “writ_update_workflow” dropped the optional parameter “max_chars” cosmetic
    • “writ_wire_monitor” dropped the optional parameter “workflow_id” cosmetic
    • “writ_create_automation” dropped the optional parameter “run_workflow_id” cosmetic
    • “writ_website_to_api” dropped the optional parameter “anonymous” cosmetic
    • “writ_browser_use” dropped the optional parameter “fresh_exit” cosmetic
    • “writ_record_website” dropped the optional parameter “human_layer” cosmetic
    • “writ_update_workflow” dropped the optional parameter “operator” cosmetic
    • “writ_saved_crawl_data” dropped the optional parameter “output” cosmetic
    • “writ_update_saved_crawl” dropped the optional parameter “name” cosmetic
    • “writ_create_automation” dropped the optional parameter “on_workflow_id” cosmetic
    • “writ_crawl_site” dropped the optional parameter “max_depth” cosmetic
    • “writ_crawl_site” dropped the optional parameter “timeout_seconds” cosmetic
    • “writ_create_automation” dropped the optional parameter “run_function” cosmetic
    • “writ_run_workflow” dropped the optional parameter “residential_country” cosmetic
    • “writ_browser_context” dropped the optional parameter “offset” cosmetic
    • “writ_crawl_site” dropped the optional parameter “limit” cosmetic
    • “writ_browser_save” dropped the optional parameter “keep_open” cosmetic
    • “writ_create_monitor” dropped the optional parameter “request_url” cosmetic
    • “writ_wire_monitor” dropped the optional parameter “title” cosmetic
    • “writ_create_http_extraction” dropped the optional parameter “desired_inputs” cosmetic
    • “writ_personas” dropped the optional parameter “include_runs” cosmetic
    • “writ_record_website” dropped the optional parameter “auth_mode” cosmetic
    • “writ_crawl_site” dropped the optional parameter “preview_chars” cosmetic
    • “writ_update_workflow” dropped the optional parameter “function_name” cosmetic
    • “writ_update_workflow” dropped the optional parameter “step_updates” cosmetic
    • “writ_run_saved_crawl” dropped the optional parameter “output” cosmetic
    • “writ_record_website” dropped the optional parameter “residential_country” cosmetic
    • “writ_create_automation” dropped the optional parameter “inputs” cosmetic
    • “writ_set_schedule” dropped the optional parameter “functions” cosmetic
    • “writ_workflow_data” dropped the optional parameter “view” cosmetic
    • “writ_payment” dropped the optional parameter “automation_id” cosmetic
    • “writ_crawl_site” dropped the optional parameter “allow_subdomains” cosmetic
    • “writ_create_monitor” dropped the optional parameter “enabled” cosmetic
    • “writ_export_data” dropped the optional parameter “q” cosmetic
    • “writ_expose_workflow_api” dropped the optional parameter “timeout_seconds” cosmetic
    • “writ_scrape” dropped the optional parameter “device” cosmetic
    • “writ_crawl_site” dropped the optional parameter “max_concurrent_shards” cosmetic
    • “writ_workflow_runs” dropped the optional parameter “device” cosmetic
    • “writ_wire_monitor” dropped the optional parameter “entry_url” cosmetic
    • “writ_crawl_site” dropped the optional parameter “exclude_paths” cosmetic
    • “writ_run_workflow” dropped the optional parameter “output” cosmetic
  • 11 Oct 26 73

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 17 Oct 2026 · Probed https://api.usewrit.app/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=usewrit.app CN=WE1,O=Google Trust Services,C=US 5 Oct 2026 3 Jan 2027 ECDSA 256 ECDSA-SHA256 bbd43db5648bcf3e0e7f96e0e5ffeb50
SANs: usewrit.app, *.usewrit.app
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of api.usewrit.app. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
app. present 23684 8 Verified
usewrit.app. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer resource_metadata="https://api.usewrit.app/.well-known/oauth-protected-resource"

Bearer resource_metadata="https://api.usewrit.app/.well-known/oauth-protected-resource"
Header Value
strict-transport-security max-age=31536000; includeSubDomains; preload
content-security-policy default-src 'none'; frame-ancestors 'none'; base-uri 'none'; form-action 'self'
x-content-type-options nosniff
x-frame-options DENY
referrer-policy strict-origin-when-cross-origin
permissions-policy geolocation=(), microphone=(), camera=()

Protected resource metadata

Document https://api.usewrit.app/.well-known/oauth-protected-resource
Retrieved Yes
Resource https://api.usewrit.app/mcp
Authorisation server https://api.usewrit.app

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://api.usewrit.app/mcp Verified 200
http (plaintext) http://api.usewrit.app/mcp HTTPS enforced 308 https://api.usewrit.app/mcp
MCP tools · 41 exposed · ~5,359 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
writ_browser_act ~251

Runs one batch of actions on an open session and returns the fresh page. Each action is an object, e.g. {"action":"click","selector":"#go"}. DRIVE: navigate, click, fill, type_text, select, check, hover, submit, press_key, scroll, back, wait, wait_for. SEE: query_dom, find_text, read_text, count, get_attributes, inspect, list_candidates, get_dom, get_screenshot. NETWORK: capture_network, get_request, rotate_exit. CODE: evaluate_js, search_scripts, read_script. RECORD: extract {variable,script}, api_call, login_post, probe_write, confirm_write. 2FA: twofa {challenge_method}. A value written {{name}} with its real value in `inputs` becomes a workflow input. Each action's arguments: the session's start answer, or writ_help('writ_browser_act').

NameTypeReqDescription
actionsarrayyesOrdered action objects, e.g. [{"action":"click","selector":"#login"}].
inputsobject––
max_charsinteger–Clip of the returned page (default 40000).
session_idstringyes–

No output schema declared.

No examples provided.

writ_browser_ask_user ~193

Hands an open session to the Writ user: kind='captcha' (they complete a security check in the live browser), 'twofa' (they supply the one-time code and Writ types it; the code never reaches this conversation), 'sign_in' (they sign in on the live page; no persona applies) or 'question' (their text answer). The call that opens the ask returns at once with user_link + tell_user to relay; later calls hold up to 60 s and answer answered, waiting_for_user (the same call again) or expired. Their answer is kept if your turn ends first.

NameTypeReqDescription
kindstring–captcha | twofa | sign_in | question.
questionstring–kind='question': one short sentence.
session_idstringyes–
wait_secondsinteger–Hold up to this long (1-60).

No output schema declared.

No examples provided.

writ_browser_cancel ~75

Closes an open browser session (an open cloud browser bills until it is closed). Unsaved work that did more than visit pages is auto-saved first and the reply names it; discard=true keeps nothing.

NameTypeReqDescription
discardboolean–Throw away unsaved steps instead of auto-saving.
session_idstringyes–

No output schema declared.

No examples provided.

writ_browser_compose ~140

Authors the workflow in an open session beyond a recording: named API functions (define_function with a `flow` (preferred in an API build), from a captured call's index, or a lists payload; live-tested as defined; compile_function for an authenticated request), set_inputs, add_steps, test_function, remove_function, remove_step, list. Payload shapes: writ_help('writ_browser_compose').

NameTypeReqDescription
operationstringyeslist | define_function | compile_function | test_function | remove_function | add_steps | remove_step | set_inputs.
payloadobject–The operation's arguments.
session_idstringyes–

No output schema declared.

No examples provided.

writ_browser_context ~90

Re-reads an open session: section=page (url, fields, buttons, cleaned DOM), lists (the page's repeating rows with a live-tested define_function payload for writ_browser_compose), map (the evidence of the build the session is bound to).

NameTypeReqDescription
sectionstring–page (default) | lists | map | explorer | concierge_api.
session_idstringyes–

No output schema declared.

No examples provided.

writ_browser_live_view ~106

The live browser card's own access: the card ChatGPT and Claude show under writ_browser_use and writ_record_website calls it to read the session's state and get one-time passes for the session's screencast and its take-over channel. The user watches the page in the card and can take it over there. It is not part of a conversation's work.

NameTypeReqDescription
session_idstringyesThe session_id the card was opened with (cbs_...).

No output schema declared.

No examples provided.

writ_browser_network ~127

Searches (operation=search, query, method) or reads in full (operation=detail, index) the backend requests the page made after capture_network: the site's real API. writ_browser_act api_call probes one with other values (a `flow`: several requests); an index feeds writ_browser_compose define_function from_index.

NameTypeReqDescription
indexinteger–detail: which call.
methodstring–HTTP method filter.
operationstring–search (default) | detail.
querystring–Substring filter.
session_idstringyes–

No output schema declared.

No examples provided.

writ_browser_save ~149

Saves the open session as a replayable workflow and closes the browser, in the place its browser ran: the user's desktop library or Writ Cloud. Composed functions become callable API functions, declared inputs become its parameters. The answer carries the steps, the inputs and a run_example; the workflow runs at zero AI cost through writ_run_workflow. A save that references something no run could resolve is refused with the reasons, and the browser stays open.

NameTypeReqDescription
allow_no_databoolean–Save a workflow that returns no data, on purpose.
descriptionstring––
namestring––
save_tostring––
session_idstringyes–

No output schema declared.

No examples provided.

writ_browser_sessions ~33

Lists the account's open cloud browser sessions (each resumable by its session_id).

NameTypeReqDescription
limitinteger––

No output schema declared.

No examples provided.

writ_browser_use ~250

A REAL CLOUD BROWSER FOR A TASK ON A SITE: the user's signed-in account (a persona_id from writ_personas: the password stays sealed in Writ, and sessions never ask for a password), a click, form, submit or search inside an app, or a page a plain fetch cannot open (login wall, 403, CAPTCHA). Opens the browser and returns the first page; writ_browser_act drives it (Writ runs no model here). Recording is always on: writ_browser_save turns the session into a workflow that replays without a browser, writ_browser_cancel closes it (an open browser bills). The start answer carries the action vocabulary, the recording rules and, with a persona, the 2FA rules. NOT FOR: reading pages (writ_scrape). An API: writ_website_to_api opens this same browser, bound to a build.

NameTypeReqDescription
execution_targetstring–cloud | auto | local (the user's own desktop app).
goalstring––
persona_idinteger|string––
urlstringyes–
use_residentialboolean–Open on the residential network (bot walls, CAPTCHAs).

No output schema declared.

No examples provided.

writ_crawl_files ~50

The original files (PDFs, office documents, images, CSVs) a crawl captured, with short-lived download URLs.

NameTypeReqDescription
crawlstring––
crawl_idinteger––

No output schema declared.

No examples provided.

writ_crawl_site ~327

COLLECTS a site or a section into a queryable, change-tracked dataset (one row per page). Scope: intent (a section, in plain words), rank_cap=N (the top N items of a listing), seed_urls (known pages), or the whole site capped by page_budget. Modes: markdown (default, no AI), extract_mode='schema' (uniform records), executor='ai' + extract_prompt (per-page understanding, 5x the page rate). A bounded crawl answers with its rows; an open one returns a crawl_id for writ_crawl_status wait=true. NOT FOR: reading a few pages now (writ_scrape). Every option: writ_help('writ_crawl_site').

NameTypeReqDescription
executorstring–regular (default, no AI) | ai (5x the page rate).
extract_modestring–markdown (default) | schema | html.
extract_promptstring–With executor=ai: what to extract from each page.
intentstring–The section wanted, in plain words; the server derives paths and depth.
page_budgetinteger–Cap on pages fetched.
persona_idinteger|string––
rank_capinteger–Top N items of a listing (one page per agent, in parallel).
save_asstring––
seed_urlsarray–Exact pages to collect (no discovery).
urlstringyes–
waitboolean–Hold until done and return the rows (default true when bounded).

No output schema declared.

No examples provided.

writ_crawl_status ~65

Status of a crawl by crawl_id; wait=true holds up to 75 s and returns the collected rows when it converges.

NameTypeReqDescription
crawl_idintegeryes–
limitinteger––
waitboolean–Hold until done and inline the rows.

No output schema declared.

No examples provided.

writ_create_automation ~212

Creates an automation: on an event (a workflow or crawl completed, a monitor change, a webhook, a schedule) it runs a workflow, sends a notification templated over the event's data, and/or wakes an AI agent. Event, template and webhook options: writ_help('writ_create_automation').

NameTypeReqDescription
ai_promptstring–Wake an AI agent with this task.
channelsarray–Notification channels.
namestringyes–
notifystring–Message template, e.g. {{result.extracted_data.0.title}}.
on_workflowstring–Source workflow for workflow_* events.
run_workflowstring–Workflow to run.
scheduleobject–when='scheduled': {kind, interval_minutes | time, days, tz}.
target_idinteger–change_detected: the monitor_id.
whenstring–workflow_completed | crawl_completed | change_detected | webhook_received | scheduled | ...

No output schema declared.

No examples provided.

writ_create_http_extraction ~84

Drafts or revises a multi-request browserless HTTP extraction (loops, GraphQL, cursor pagination) from captured requests and a plain-language goal. Every option: writ_help('writ_create_http_extraction').

NameTypeReqDescription
applyboolean–false (default) drafts; true writes.
goalstringyes–
workflow_idinteger––

No output schema declared.

No examples provided.

writ_create_monitor ~269

WATCHES a page for changes: Writ checks it on a schedule and fires change_detected when the page, a CSS selector's text, a value read by `extract`, or a visual zone changes. Returns the monitor_id that writ_wire_monitor connects to an alert, a workflow or an AI task (a price watch takes a threshold there). Without `interval` the answer is needs_input: this plan's options and a tell_user for the user, nothing created. The page is read first: a sign-in answers needs_persona, a bot check offers use_residential.

NameTypeReqDescription
extractobject|string–Browserless read instead of a selector, e.g. {"from":"html_css","selector":".price"}.
intervalstring|integer–How often: an option id from needs_input ('5m', '1h', '24h') or seconds.
persona_idinteger|string––
selectorstring–CSS selector whose text is watched (unset = whole page / uptime).
session_idstring––
urlstringyes–
use_residentialboolean–Check through a residential exit (bot walls).
watchstring–content (default) | price (the value must hold a number).

No output schema declared.

No examples provided.

writ_devices ~77

The user's linked Writ desktops: list, use (scope this connection to one: runs, browsers, personas and monitors then target it), clear, monitors, datasets.

NameTypeReqDescription
actionstring–list (default) | use | clear | monitors | datasets.
devicestring–use: the desktop's agent_id or name.

No output schema declared.

No examples provided.

writ_diagnose_http_workflow ~59

Explains why a saved workflow's run returned nothing or failed: HTTP-lane readiness and, with task_id, the run's requests and responses.

NameTypeReqDescription
task_idinteger––
workflow_idinteger––

No output schema declared.

No examples provided.

writ_discovery_status ~138

Status of a writ_website_to_api build. wait=true is one held call (up to 75 s) that follows the build to its newest rung and returns when it is done or parked. Answers: succeeded (workflow_id, functions, run_example), failed, cancelled, or needs_guidance (the build is the caller's to finish with writ_website_to_api mode=guided build_id=<id>; its map comes with it).

NameTypeReqDescription
build_idintegeryes–
timeout_secondsinteger–Ceiling for wait=true (up to 75).
waitboolean–One held call until done or parked.

No output schema declared.

No examples provided.

writ_export_data ~43

Exports a workflow's full data table as CSV or JSON.

NameTypeReqDescription
formatstring–csv (default) | json.
workflow_idinteger––

No output schema declared.

No examples provided.

writ_expose_workflow_api ~53

Publishes a saved workflow as a REST endpoint (a POST URL that waits and returns its JSON). Repeated calls reuse it.

NameTypeReqDescription
labelstring––
workflow_idinteger––

No output schema declared.

No examples provided.

writ_help ~158

The full reference of any Writ tool (every parameter and its rules) and the complete guide. topic = a tool name (e.g. 'writ_browser_compose', a 'run_<workflow>' tool), 'guide' for the manual (recurring digests, HTTP flow building, buying on a price, crawl and build modes), 'actions' / 'recording' / '2fa' for the browser rules, 'http_flows' / 'flow_operators' for writing an HTTP flow, or empty for the list of topics.

NameTypeReqDescription
topicstring–A tool name, 'guide', 'actions', 'recording', '2fa', 'http_flows', 'flow_operators', or empty.

No output schema declared.

No examples provided.

writ_list_webhooks ~35

The account's inbound webhook URLs and the automations they fire.

NameTypeReqDescription
webhook_trigger_idinteger–Only this webhook.

No output schema declared.

No examples provided.

writ_list_workflows ~69

Lists the workflows saved in the Writ account; each runs on demand without live browsing. Returns id, name, declared inputs, schedule, and whether it is pinned as its own run_<name> tool.

NameTypeReqDescription
searchstring–Name/description filter, e.g. a site.

No output schema declared.

No examples provided.

writ_payment ~189

Pays on a site with one of the user's cards; card numbers never reach this conversation. request (site, max_amount, purpose) returns a tell_user and an open_url where the user approves; wait (grant_id or confirmation_id); checkout pauses at the order button for the user's confirmation, then Writ places the order; fill; list (card handles only). Details: writ_help('writ_payment').

NameTypeReqDescription
actionstringyesrequest | wait | checkout | fill | list.
commit_selectorstring–checkout: the place-order button.
confirmation_idstring––
grant_idstring––
max_amountnumber–The most it may charge.
purposestring–One line the user reads.
sessionstring–The browser session on the checkout page.
sitestring–request: the store's domain.

No output schema declared.

No examples provided.

writ_personas ~287

The user's own accounts on websites (personas): how Writ signs in as them. No password passes through this tool or the conversation, and its answers never ask for one: credentials are typed only into a Writ window. action='list' domain=<site> shows the personas usable there; with none it answers persona_needed: a tell_user for the user, a create_url (a small Writ window with only the sign-in form, pre-filled for the site) and a link_id. action='wait' link_id=<id> is one held call that answers when the user saves it, with its persona_id. Also get, request (a link for another account), sign_in (refresh the session) and record_login. A persona_id works on writ_scrape, writ_crawl_site, writ_browser_use and writ_run_workflow; a desktop persona ('device:...') signs in on that desktop, from its own vault.

NameTypeReqDescription
actionstringyeslist (default) | get | request | wait | sign_in | record_login.
domainstring–list: personas usable on this site. request: the site.
link_idstring–wait: the link_id of a persona_needed / request answer.
persona_idinteger––
whystring–request: one line the user sees in the window.

No output schema declared.

No examples provided.

writ_pin_workflow_tool ~47

Pins (or unpins) a saved workflow as its own run_<name> tool on this server.

NameTypeReqDescription
pinnedboolean––
workflow_idinteger––

No output schema declared.

No examples provided.

writ_record_website ~116

Records a repeatable task on a site as a workflow (goal + start url): the same session as writ_browser_use, labelled with its goal, driven with writ_browser_act and saved with writ_browser_save. A goal that asks for an API opens as a writ_website_to_api build instead: the same browser, bound to the build.

NameTypeReqDescription
goalstringyes–
persona_idinteger|string––
urlstringyes–
use_residentialboolean–Residential network (bot walls).

No output schema declared.

No examples provided.

writ_run_saved_crawl ~66

Runs a saved crawl; max_age returns its recent data at no cost instead of re-crawling.

NameTypeReqDescription
crawlstringyes–
max_ageinteger–Reuse a run younger than this (seconds).
waitboolean–Hold until done.

No output schema declared.

No examples provided.

writ_run_workflow ~266

Runs a saved workflow by workflow_id or name and returns its extracted data (it waits by default). Inputs go as top-level fields or under `inputs`; function_name runs one function of a multi-function API (with the sign-in it needs). max_age reuses a recent result at no cost. A write function previews with mutation_mode='dry_run'. Runs sign in as the workflow's persona or persona_id; no password is ever passed. Venue, network, files and output shape: writ_help('writ_run_workflow').

NameTypeReqDescription
execution_targetstring–cloud | auto | local (the user's own desktop app).
function_namestring–One function of a multi-function workflow.
inputsobject–Run inputs (top-level fields work too).
max_ageinteger–Reuse a result younger than this many seconds (free). 0 = fresh.
mutation_modestring–live (default) | dry_run (preview, nothing sent) | private_test.
persona_idinteger|string–Run as this saved identity.
workflowstring–Workflow name (or workflow_id).
workflow_idinteger|string–A number, or 'local:<id>' (a workflow on the user's desktop).

No output schema declared.

No examples provided.

writ_saved_crawl_data ~41

Reads the data a saved crawl collected on its last completed run, without crawling.

NameTypeReqDescription
crawlstringyes–
limitinteger––

No output schema declared.

No examples provided.

writ_saved_crawls ~31

Lists the crawls saved for re-running, with their scope.

NameTypeReqDescription
limitinteger––

No output schema declared.

No examples provided.

writ_scrape ~292

READ PAGES NOW, no browser session: one page (url), up to 20 pages in parallel (urls), or a listing plus its top N item pages (url + top_n). Returns clean markdown in 2-10 s, including pages a plain fetch cannot read: rendered by JavaScript (render_mode='browser'; a read that only got the page's shell says so and gives the retry), behind a bot wall or 403 (an automatic residential retry), or behind the user's sign-in (persona_id). Discussion threads keep their comments. format='html' returns the raw HTML for selectors. NOT FOR: a site-wide dataset (writ_crawl_site) or clicking and typing (writ_browser_use).

NameTypeReqDescription
formatstring–markdown (default) | html (raw HTML) | both.
persona_idinteger|string–Read signed in as this saved identity (writ_personas).
render_modestring–auto (default: HTTP, a browser when the page needs JS) | http | browser.
top_ninteger–With url = a listing: also read its N top-ranked item pages (max 20).
urlstring––
urlsarray–Up to 20 known pages, read in parallel.
use_residentialboolean–Residential network for a bot wall (automatic retry when refused).

No output schema declared.

No examples provided.

writ_search_data ~47

Searches everything the account's workflows already collected for a term, without running anything.

NameTypeReqDescription
limitinteger––
qstringyes–
workflow_idinteger––

No output schema declared.

No examples provided.

writ_set_schedule ~122

Schedules a saved workflow: every_minutes, or kind='daily'/'weekly' with time (HH:MM) and days. functions + inputs schedule chosen functions of a multi-function API.

NameTypeReqDescription
daysarray–Weekdays 1=Mon..7=Sun (weekly).
every_minutesinteger–Interval in minutes.
kindstring–interval | daily | weekly.
timestring–HH:MM (daily/weekly).
tzstring–IANA timezone.
workflow_idinteger––

No output schema declared.

No examples provided.

writ_update_saved_crawl ~40

Inspects or changes a saved crawl's settings in place.

NameTypeReqDescription
crawlstringyes–
settingsobject–Sparse settings patch.

No output schema declared.

No examples provided.

writ_update_workflow ~79

Inspects or edits a saved workflow: an outline, one function's source, targeted function or step edits, a settings patch. copy_to keeps a linked copy on Writ Cloud or the user's desktop. Every option: writ_help('writ_update_workflow').

NameTypeReqDescription
copy_tostring––
workflow_idinteger––

No output schema declared.

No examples provided.

writ_website_to_api ~298

TURNS A WEBSITE INTO A CALLABLE API (named functions with inputs, returning JSON), built by the caller in a real browser. url = the page that already shows the rows (search results or a listing, not the home page); goal = the inputs and fields wanted. The call first proposes the user's matching saved workflows and marketplace APIs (skip_existing / skip_marketplace build fresh), then opens a cloud browser bound to the build: capture_network records the site's own calls, writ_browser_network reads them, api_call probes them; a failed probe is evidence, not the end. Functions: HTTP flows first (writ_browser_compose define_function `flow`; writ_help('http_flows')), single requests (from_index) mixed in, DOM extraction last. writ_browser_save, then run_example on two inputs. mode=intelligent: Writ builds it alone (+ writ_discovery_status wait=true), on request.

NameTypeReqDescription
build_idinteger––
goalstring––
modestring–guided (default: the caller drives) | intelligent (Writ builds it alone, on request) | auto | fast | crawl | browser.
persona_idinteger––
save_asstring––
skip_existingboolean–Skip the proposal of the user's own matching workflows.
skip_marketplaceboolean–Skip the marketplace proposals.
urlstring––

No output schema declared.

No examples provided.

writ_wire_monitor ~249

Connects a monitor's change_detected event to an action: action='notify' (channels and recipients the account has configured), 'workflow' (runs a saved workflow), or 'ai_task' (an AI agent opens the page and works `prompt`). A price watch takes `threshold` (+ threshold_op): the action then runs once, when a check reads a price at or below it. Buying at a price (`buy`): writ_help('writ_wire_monitor').

NameTypeReqDescription
actionstringyesnotify | workflow | ai_task.
buyobject–Run the workflow or task as a purchase (saved as a rehearsal until armed).
channelsarray–Notification channels, e.g. ["email","pushover"].
monitor_idintegeryes–
promptstring–action='ai_task': what the agent does.
recipientsarray–e.g. ["email:3"]; omitted = every enabled recipient.
thresholdnumber|string–Price watch: act once when the price reaches this number.
threshold_opstring–lte (default) | lt | gte | gt.
workflowstring––

No output schema declared.

No examples provided.

writ_workflow_data ~82

Reads a saved workflow's collected data as a table: q filters, run_id picks one run, refs returns full records.

NameTypeReqDescription
limitinteger––
qstring––
refsarray–Full records by '<run_id>:<record_index>'.
run_idinteger––
workflow_idinteger––

No output schema declared.

No examples provided.

writ_workflow_runs ~54

Run history (status, timing, errors, venue) of one workflow or all of them.

NameTypeReqDescription
limitinteger––
statusstring–Filter by status.
workflow_idinteger––

No output schema declared.

No examples provided.

Install

How do I install the Writ Cloud MCP server?

Writ Cloud is a hosted endpoint at https://api.usewrit.app/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · api.usewrit.app

# add to Claude Code
claude mcp add --transport http app-usewrit-writ-cloud 'https://api.usewrit.app/mcp'
Common questions

What is the Writ Cloud MCP server?

Writ Cloud is an MCP server listed in the public MCP registry as app.usewrit/writ-cloud. Read, crawl and act on websites, signed in as the user, and turn any site into an API. This page covers its hosted endpoint (https://api.usewrit.app/mcp).

Is the Writ Cloud MCP server safe to use?

Writ Cloud scores 76 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Writ Cloud MCP server expose?

Writ Cloud exposes 41 tools: writ_browser_use, writ_record_website, writ_website_to_api, writ_discovery_status, writ_browser_act, and 36 more. Their descriptions and schemas cost roughly 5,359 tokens of context every time the server is loaded.

Does the Writ Cloud MCP server require authentication?

Yes. Writ Cloud asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the Writ Cloud MCP server still maintained?

Writ Cloud is still listed as active in the MCP registry. We last reached this channel on 17 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.