Connect Writ.
Your agent gets hands on the web.
Add one MCP server and your AI agent can drive the real web: open a live browser, log in, turn any site into a callable API, record a workflow, and crawl whole sites at scale. Ask once and it builds the automation; ask again and it replays it instantly, at zero token cost.
A toolbelt for the whole web, not just the APIs.
Most agents can only call the handful of services that ship an API. Connected to Writ, yours can reach anything a person can open in a browser, on your own authorized accounts. Six capabilities, one server:
All six run on your machine, on your own accounts. No Writ AI key, no cloud account. Linking a free Writ Cloud account adds two more: writ_search_api / writ_install_api to find and install ready-made marketplace APIs, and public HTTPS endpoints for callers that aren't on this machine.
The keyless tier: no account, no key. Public pages only — which is exactly the limit worth knowing.
curl -X POST https://api.usewrit.app/api/crawl/scrape \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}' { "url": "https://example.com",
"markdown": "# Example Domain\n…" }This page was public. For pages behind a login, run it with a persona. Keyless calls carry fair-use rate limits.
Point your assistant at Writ and it gets the whole toolbox — plus one tool per workflow you publish.
claude mcp add writ-cloud \
-e WRIT_API_KEY=wt_your_api_key \
-- npx -y writ-mcp Config-file clients — Claude Desktop · Cursor · Windsurf
25 base tools, plus one per published workflow. The keyless tier needs no key at all to start.
npm install github:usewrit/writ-sdks --workspace typescript
import { WritAgent, runRowId } from "@usewrit/agent-sdk";
const client = new WritAgent(); // discovers the running agent + token
const { data: workflows } = await client.workflows.list();
const run = await client.workflows.runAndWait(workflows[0].id, {
inputs: { city: "Paris" },
});
const { data: rows } = await client.runs.data(runRowId(run));
console.log(run.status, rows); pip install "git+https://github.com/usewrit/writ-sdks#subdirectory=python"
from writ_agent import WritAgent, run_row_id
with WritAgent() as client: # discovers the local daemon
run = client.workflows.run_and_wait(3, inputs={"city": "Paris"})
print(run["status"], run["rows_extracted"])
print(client.runs.data(run_row_id(run))["data"]) # extracted rows go get github.com/usewrit/writ-sdks/go
client, err := writ.Discover(ctx) // find the running agent
page, _ := client.Workflows.List(ctx, nil)
item, _ := client.Workflows.RunAndWait(ctx, page.Data[0].ID, nil)
rowID, _ := item.RowID()
csv, _ := client.Runs.DataCSV(ctx, rowID) // extracted rows as CSV
fmt.Println(item.Status, "
", csv) cargo add writ-client --git https://github.com/usewrit/writ-sdks
use writ_client::{RunOptions, WritAgent};
let agent = WritAgent::discover().await?; // find the running daemon
let workflows = agent.workflows().list().await?;
let wf = &workflows.data[0];
let outcome = agent.workflows().run_and_wait(wf.id, &RunOptions::default()).await?;
let rows = agent.runs().data(outcome.run.row_id().unwrap()).await?;
println!("{} → {}: {}", wf.name, outcome.run.status, rows.data); Ask once, it builds it. Ask again, it replays.
The first time you ask your agent for a reliable way to drive a site, Writ does the hard work once: opens a browser, works through the steps, and saves the result as a workflow. Every ask after that skips straight to a replay: instant, deterministic, and free of token cost. Watch both halves:
The saved workflow is also a REST endpoint and MCP tool, so the same automation your agent built is callable from your code, other agents, or a schedule. See Website → API and Automations.
Read-only crawlers stop at the page. Writ tools act.
An MCP server that just dumps page text can't submit forms, update dashboards, trigger approved workflows, or pull data from behind a login. Writ packages full browser workflows - including authenticated, multi-step ones - as MCP tools. Your agent calls a tool; Writ runs the real workflow and returns structured output.
Read-only crawlers
- Return page text only
- No login or two-factor
- Can't fill forms or click
- No multi-step tasks
- Unstructured output
Writ MCP tools
- Take real actions on the page
- Log in, pass TOTP and mailbox-OTP
- Fill forms, click, navigate
- Complete multi-step workflows
- Return typed, structured output
How a workflow becomes a tool
Each Writ MCP server exposes a set of tools. A tool has a name, a description the agent reads to decide when to use it, a typed input schema, and a structured output. You map a published workflow to a tool name and description in the MCP endpoint config - Writ advertises it over the Model Context Protocol.
- 01
Workflow
Start from any published workflow.
- 02
Map to a tool
Give it a tool name, description, and input schema.
- 03
Advertise on MCP
Writ exposes it on your server at /mcp/{slug}.
- 04
Agent discovers & calls
Your agent picks the tool by its description and calls it.
{
"tool_name": "check_competitor_price",
"tool_description": "Look up the current price and stock for a product URL.",
"workflow_slug": "price-check",
"server_version": "1.0.0"
}Connect it to your agent
Point any MCP-compatible client at your Writ server URL and authenticate with a wt_ key. Tools appear automatically; your agent picks them by description.
{
"mcpServers": {
"writ": {
"url": "https://api.usewrit.app/mcp/acme",
"headers": { "Authorization": "Bearer wt_8f2c...a91" }
}
}
}Works with Claude, Cursor, and any MCP client. Authorize with a scoped wt_ key; revoke or rotate it without touching the workflow.
Tools that work on the hard web
Because each tool is a real browser workflow, it handles login, TOTP and mailbox-OTP two-factor on your own authenticated accounts, dynamic pages, and 30+ step types. Recorded recipes plus AI navigation survive UI changes, so tools keep working when sites move.
Two-factor and login run on your own authenticated accounts - see personas.
Authorized by design
Writ runs on your own accounts, with your own credentials and data, on sites you are authorized to use. It automates work a person could do by hand in a browser. Secrets live in an encrypted vault, tools are scoped by wt_ key, and every tool call is logged and attributable to a run.
See trust, security, and the acceptable use policy.
MCP FAQ
What is a Writ MCP tool?
A Writ MCP tool is a published browser workflow exposed over the Model Context Protocol. It has a name, a description the agent reads to decide when to use it, a typed input schema, and a structured output. Unlike a read-only crawler, it takes real actions - login, forms, clicks, multi-step tasks.
Which MCP clients work with Writ?
Any MCP-compatible client. Point Claude, Cursor, or your own MCP client at your Writ server URL and authenticate with a scoped wt_ key. Tools appear automatically and the agent selects them by description.
Does it handle login and 2FA?
Yes. Because each tool is a real browser workflow, it handles login, TOTP and mailbox-OTP two-factor, dynamic pages, and 30+ step types - on your own authenticated accounts. Writ runs on your own accounts, with your own credentials and data, on sites you are authorized to use.
How is a Writ tool different from a read-only MCP server?
Most website-to-MCP tools only read page text. Writ tools act: they log in, fill forms, click, extract, and complete multi-step tasks, then return structured output. Your agent calls a tool; Writ runs the real workflow.