Skip to main content
Glama

ToolsEnabled Site Studio 0.1.10

Linux-only release. Linux is tested; native Windows is not yet supported. Windows path isolation and private-directory permissions need fixes before use. macOS and native desktop-client installation remain unqualified.

Edit a static website through any MCP host. Site Studio makes a private working copy, provides a live browser preview, and keeps revision history and named checkpoints. The human controls pause, undo, restore, and export. Your original folder stays unchanged until you explicitly confirm an export to it.

Node.js 22 or newer is required, together with the local filesystem and process-identity support described under Limits below. There is no npm install step, hosted service, account, model provider, or publishing integration.

Start

Download toolsenabled-site-studio-0.1.10.zip and toolsenabled-site-studio-0.1.10.zip.sha256 from the v0.1.10 release into the same folder. Verify the archive against the .sha256 file (the release notes print the same hash), extract it (it extracts to site-studio/), and start from that directory:

sha256sum -c toolsenabled-site-studio-0.1.10.zip.sha256
unzip toolsenabled-site-studio-0.1.10.zip
cd site-studio
node mcp-web.js --site /absolute/path/to/static-site --data-dir /absolute/path/to/private-state --export-dir /absolute/path/to/finished-site

The export parent must already exist; startup refuses a missing parent before creating any state. The destination must be a new folder, or the original site folder itself. An existing destination other than the original is refused when the export is confirmed, not at startup, so that a server can restart after an export; node tools/site-studio-view.js export (the /site-studio export pane in Claude Code) reports the destination's readiness in advance. The state folder must be new or empty, outside the original/export folders and plugin installation, and dedicated to Site Studio. Existing state folders require private permissions (chmod 700 on Linux/macOS).

This command starts the stdio MCP server and two loopback listeners: a human dashboard and a separate site preview. A one-time dashboard session link is written to local stderr diagnostics. Before giving the agent work, find and open that private link once; the page removes the fragment secret from the address bar, exchanges it once by POST, and keeps the session token in sessionStorage for that browser tab and exact origin. Dashboard requests carry a required session header. A separate HttpOnly cookie grants preview reads only; it never authorizes dashboard controls. web_preview returns only the clean URL and the preview origin, never a session or preview capability. Open the private dashboard link to view the site. MCP JSON stays on stdout. Without --site, the included two-page Fieldwork sample opens in a private copy. Without --data-dir, state lives in ~/.site-studio/<site-identifier>. SITE_STUDIO_ROOT and SITE_STUDIO_DATA are environment alternatives. Without --export-dir, export stays disabled.

For browser-only operation, replace mcp-web.js with web-server.js. One process owns each state directory: do not launch browser-only mode alongside MCP on the same state directory. Close the MCP host or send EOF/SIGINT/SIGTERM/SIGHUP to stop; both listeners and the lease are released. Startup import also responds to shutdown between bounded file operations.

Related MCP server: pages-mcp

Connect a client

Print the appropriate registration command or configuration:

node tools/mcp-config.mjs --client claude --site /absolute/path/to/static-site --data-dir /absolute/path/to/private-state --export-dir /absolute/path/to/finished-site

Client configuration helpers: Claude Code, Claude Desktop, Codex, Cursor, DeepSeek Harness. Select the corresponding --client value: claude, claude-desktop, codex, cursor, deepseek. Claude Code and Codex receive shell commands; Cursor and Claude Desktop receive mcpServers JSON; DeepSeek Harness receives a Cordis plugin row in YAML for placement under - insert: in a profile overlay. Run the printed command or merge the configuration into your client. The helper never changes settings. The printed command or configuration starts the Node.js that ran the helper, named by its absolute path, so a client that does not share your shell's PATH still finds it; after you upgrade or switch Node.js, run the helper again and replace the registration. PowerShell output is retained for future Windows qualification. Use a different state directory for simultaneously running clients.

The archive and the repository contain separate Claude Code and Codex plugin manifests, and the repository is its own plugin marketplace for both clients: .claude-plugin/marketplace.json and .agents/plugins/marketplace.json each list the one plugin toolsenabled-site-studio. Claude Code installs it in two steps, with the three folder options given at installation:

claude plugin marketplace add ToolsEnabled/toolsenabled-site-studio
claude plugin install toolsenabled-site-studio@toolsenabled-site-studio --config site_directory=/absolute/site --config data_directory=/absolute/private-state --config export_directory=/absolute/new-export

Installed without them, the plugin starts no server until you set them: use /plugin configure inside Claude Code, or pipe the three values as JSON to claude plugin configure with --values-stdin (without it, that command only lists the options):

printf '%s' '{"site_directory":"/absolute/site","data_directory":"/absolute/private-state","export_directory":"/absolute/new-export"}' | claude plugin configure toolsenabled-site-studio@toolsenabled-site-studio --values-stdin

The marketplace installs what the repository's main branch holds when you add or update it, not the release ZIP: each release moves main to its release commit, and claude plugin list shows the version you installed. The ZIP and its .sha256 file under Start are the checksum-verified route.

For Codex, add the same repository as a marketplace, then install ToolsEnabled Site Studio from it in the Codex /plugins directory:

codex plugin marketplace add ToolsEnabled/toolsenabled-site-studio

Claude Code uses .mcp.json with those three explicit folder options; Codex retains the sample-default configuration inline in .codex-plugin/plugin.json. The registration helper above remains available for other MCP hosts. The Claude Code marketplace add and install were exercised from a local clone with Claude Code 2.1.296 in a scratch configuration; the Codex marketplace file follows OpenAI's published repository-marketplace format and was not exercised in a Codex client for this release. Installing from this repository's marketplace does not depend on any public plugin directory. See Claude installation and packaging.

Try it

No account or API key is needed: Site Studio runs on your computer and calls no model or online service of its own. In the extracted release ZIP's site-studio/ folder (or a clone), copy the bundled sample site and make a private state folder, then install the plugin with the three folder options (the export folder must not exist yet; its parent must):

mkdir -p /absolute/try && cp -r site /absolute/try/site && mkdir -m 700 /absolute/try/state
claude plugin marketplace add ToolsEnabled/toolsenabled-site-studio
claude plugin install toolsenabled-site-studio@toolsenabled-site-studio --config site_directory=/absolute/try/site --config data_directory=/absolute/try/state --config export_directory=/absolute/try/export

Start claude, open the one-time dashboard link from its MCP log to watch the preview (see Review and save), approve each Site Studio tool call when asked, and try these three prompts:

  1. List the pages of my site. Claude calls web_pages and lists about.html, index.html and styles.css at revision 0.

  2. Change the headline on index.html to "Hello from Site Studio", then save a checkpoint named first-edit. Claude reads the page, replaces the <h1> text with web_set_text (revision 1) and saves the checkpoint first-edit. /absolute/try/site itself stays unchanged.

  3. /site-studio history opens the read-only pane: Opened working copy at r0, then Updated text · index.html and Saved checkpoint · first-edit at r1.

See all tools and examples.

What this plugin runs, sends and reads

This section covers everything the Claude Code plugin runs: its MCP server, its mod (the /site-studio pane), and its commands and skill. Site Studio itself contacts no online service: there is no ToolsEnabled server, account, telemetry or update check. What leaves your computer is what Claude Code sends: Site Studio returns tool results to Claude Code, and Claude Code sends them to the model it uses.

MCP server

Claude Code starts one local stdio server, as .mcp.json sets out:

node ${CLAUDE_PLUGIN_ROOT}/mcp-web.js --site ${user_config.site_directory} --data-dir ${user_config.data_directory} --export-dir ${user_config.export_directory}

Its environment also gets SITE_STUDIO_ROOT and SITE_STUDIO_DATA (the site and state folders). The plugin sets no other variable for it: the rest of its environment is the one Claude Code gives every plugin server, from which the server reads only SystemRoot, on Windows, to find PowerShell. The server:

  • reads the site folder at every start, without changing it;

  • keeps the working copy, history and checkpoints in the state folder (state.json and working-* folders), plus lease.json while it runs. If a first start was killed before state.json existed, the next start removes the leftover working-* folder and state.json.*.tmp file, but only when they hold nothing but a copy of the site, and says so in one line on stderr;

  • writes the export folder only when you confirm an export in the dashboard. While it exports, it keeps a lock file and a staging folder next to the export folder; when you export over the original site folder, it keeps the original there as a backup folder;

  • answers tool calls over stdio. Tool results can contain your site's text;

  • listens on two random ports on 127.0.0.1 only, one for the dashboard and one for the preview, and writes the one-time dashboard link to its stderr, which Claude Code keeps in its MCP log files (see Review and save);

  • makes no outgoing network requests. The preview blocks external resources unless the server is started with --allow-external, which this plugin does not pass;

  • checks whether a recorded Site Studio process is still running: from /proc on Linux, with /bin/ps on macOS, and with %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe on Windows (macOS and Windows are not qualified).

Every tool declares the MCP annotations title, readOnlyHint, destructiveHint and openWorldHint, plus idempotentHint for the nine tools that change the working copy or its checkpoints: seven tools only read, those nine are marked destructive, and none reaches beyond your computer.

Mod: the /site-studio pane

hooks/hooks.json loads one mod module, hooks/register.tsx. It hooks five events:

Event

What the hook does

session.start

Registers the /site-studio command, then passes the event on unchanged. It reads nothing and starts nothing.

session.end

Clears the pane's in-memory state, then passes the event on unchanged.

ui.close, only for the pane site-studio-view

ui.close is the event for closing a pane and also the name of the call that closes one; the mod makes that call itself when you press q or select Close. The hook clears the pane's in-memory page, so the result of a read that is still running is ignored, then passes the close on unchanged with next(e). It never refuses, delays or changes a close, and it does not run for other panes.

command.run, only for /site-studio

Checks the view name and arguments you typed, opens the pane and loads its first page. A request it does not accept gets the one-line reply "Use /site-studio help for views and action commands."; otherwise it returns nothing, so pane text never enters the conversation or Claude's context.

ui.render, only for the Site Studio pane

Draws the pane's rows and buttons.

The mod's calls are $.command.register (adds /site-studio), $.ui.open, $.ui.close, $.ui.invalidate and $.ui.resolve (open, close, redraw and draw the pane), $.env.get('PATH') and $.process.run. It makes no network, file, MCP, model or prompt calls. The mod sends data to one place only, the local program below: it passes that program the PATH value, your three folder options and the view you chose as arguments, and it shows what the program prints in the pane, so nothing goes over the network, to Claude or into the conversation.

To load a page (hooks/register.tsx, line 23), the mod starts one program with $.process.run, which takes a list of arguments and uses no shell:

/usr/bin/env -i PATH=<Claude Code's PATH> node --max-old-space-size=384 <plugin folder>/tools/site-studio-view.js <view> [<arguments>] [--assets] --site <site folder> --data-dir <state folder> --export-dir <export folder> --json --offset <n> [--snapshot <hash>]

The program runs in the plugin folder with a five-second time limit. hooks/view-contract.mjs holds the fixed parts of the command; the rest is filled in when you use the pane: the view and arguments you typed after /site-studio, your three folder options, the page offset and, when you page, the snapshot hash of the page you were on. Not all of that command can be fixed text, because part of it comes from you and your computer: the PATH that lets env -i find node, the plugin folder, your three folder options, and the view, arguments and page you choose in the pane. Quotes, $(…) and ; in your arguments stay literal text. env -i starts the program with an empty environment plus PATH, which it needs to find node, so none of Claude Code's other variables, such as API keys or tokens, reach it. From your computer, the mod itself reads only that PATH value and your three folder options. It starts the program only when you open a view other than help, or page or reload such a view (n, p or r): never at session start and never in the background. The mod runs this one program, tools/site-studio-view.js from this plugin under node, and no other, so that the pane can show your saved working copy without starting the MCP server or calling a model.

The program, tools/site-studio-view.js, writes nothing. It reads:

  • state.json in the state folder: the saved working copy, history and checkpoints;

  • lease.json in the state folder and, to tell whether that Site Studio server is still running, on Linux /proc/sys/kernel/random/boot_id, /proc/<pid>/stat for the recorded process, /proc/self/ns/pid and the host name (on macOS it runs /bin/ps -p <pid> -o lstart= instead);

  • for doctor, the names of the files in the state folder;

  • for doctor and export, the files in the site folder, to tell whether the site changed since Site Studio opened it, and whether the export folder, its parent folder and an export lock file exist.

It prints one page of at most eight rows as JSON. The mod shows those rows in the pane, and nothing else receives them.

Commands and skill

The four /toolsenabled-site-studio:site-studio-* commands and the toolsenabled-site-studio skill are instructions for Claude to use the MCP tools above, with Claude Code's normal permissions. They run nothing themselves.

Tests, maintainer scripts and publisher

The tests in test/ and hooks/*.test.ts are not part of what the plugin runs. No test reads a key, token or password, and no test contacts a host it names: evil.test is a forged Origin header sent to the local preview server, which must refuse the request, and like example.test, good.test and outside.invalid it also appears in HTML, CSS and SVG text that the tests rewrite or refuse; requests to site-studio.invalid are intercepted inside the headless test browser before they leave it; www.w3.org and ns.adobe.com appear only in SVG and XHTML namespace names and an SVG DOCTYPE identifier, which nothing downloads; github.com and toolsenabled.ai appear only as text that the tests compare, with Git and the download replaced by stand-ins. hooks/keys.test.ts checks the pane's keyboard keys: every key the pane shows is handled, and no key reaches the prompt. The tests' shared helpers (test/helpers.js, test/browser-helper.js and test/mcp-helper.js) read the settings that docs/TESTING.md describes (the browser executable, the sandbox opt-out, the evidence folder and a debug switch), and give the browser and the MCP servers that they start only PATH, the temporary-folder variables, SystemRoot on Windows and, for the browser, HOME. Other tests, among them the packaging, lease and release-tool tests, start Node, Python and Git directly with the test runner's environment.

The maintainer scripts in tools/ are not part of what the plugin runs either. Only tools/generate-release.py uses the network: a maintainer runs it after a release to look up the release tag with git ls-remote and to download the release file through tools/release_fetch.py, and it compares the downloaded bytes with the local build without running them.

The publisher, ToolsEnabled, Inc., owns the ToolsEnabled GitHub organization and toolsenabled.ai, and the plugin's name and author refer to no other publisher, listing or connector.

Review and save

Find Site Studio dashboard session: in the host's stderr logs: Claude Code on Linux uses ~/.cache/claude-cli-nodejs/<cwd-slug>/mcp-logs-site-studio/<timestamp>.jsonl for direct registration; plugin registration uses mcp-logs-plugin-toolsenabled-site-studio-site-studio/ instead; Desktop uses mcp-server-<NAME>.log under ~/Library/Logs/Claude (macOS) or %APPDATA%\Claude\logs (Windows); Codex app-server can expose the line on privately captured stderr with RUST_LOG=codex_rmcp_client=info (the documented TUI log route remains unverified here); Cursor uses Output → MCP Logs. DeepSeek Harness inherits its launcher’s stderr; a direct Node launch prints it in that terminal. See host-specific instructions and recovery.

Open the link before giving the agent work. Agent file tools can read an unused secret from these logs if permitted. Never ask the agent to fetch it. Use Renew dashboard session in an authenticated dashboard to revoke old capabilities and keep this tab signed in; if access is lost, stop and restart the MCP connection, then open the newly logged link yourself.

Open the one-time dashboard link from local startup diagnostics. Pause, resume, undo, redo, checkpoint restore/delete and export are not available as MCP tools and require the dashboard session. Select a page; the preview refreshes as edits land. Pause stops agent mutations. Undo, redo, and checkpoint restore always create a new revision. A paused human can still undo or restore. web_checkpoint saves an attributed agent checkpoint. The dashboard also has a human Save checkpoint button. The timeline identifies actor and action type. New events retain the local clock’s UTC timestamp; the history pane marks older or invalid timestamps as “Time not recorded” rather than inventing one. A permanent “Opened working copy (r0)” target remains available after older undo states are pruned. Checkpoint labels cannot use system summaries, the single word “original” (the changes original view uses it for the opened working copy) or invisible control characters.

Choose Export working copy, inspect the destination/revision, then Confirm export. Configuring --export-dir selects a destination; it does not authorize an agent export. An agent bridge that reads the one-time dashboard secret from stderr or host logs and uses it to confirm exports is unsupported. An explicit human opt-in, audited agent-export path is a proposed design only, not implemented or supported in 0.1.10. See export policy choices. An edit arriving while confirmation is open makes that confirmation stale. Export never deploys anything. Export to a new destination leaves the source intact. Export to the original folder retains the previous folder beside it as .site-studio-backup-<identifier>. The receipt names the backup. Edits made outside Site Studio to the original cause a drift refusal; start a new state directory to import that new original, after saving any needed working-copy content.

Checkpoints, pause state, undo/redo and the working copy survive restarts. An export also holds a destination lease in its parent directory; if an export process crashes, verify that its recorded PID is gone before removing that .site-studio-export-*.lock file. After an abnormal exit, startup recovers a stale lease.json automatically and prints a one-line notice. It first requires the same platform, hostname and Linux PID namespace, then compares the PID and operating-system process start identity (including the boot ID on Linux). A live owner still refuses a second writer. Immutable recovery claims coordinate contenders. Malformed leases, unavailable checks, scope mismatches and older leases without scope or creation identity refuse safely. For those cases, manually verify that all writers on the original host and namespace have stopped before removing the named lease; keep the working copy and checkpoints. Do not share state between hosts or namespaces. Do not edit state.json or working directories directly.

On macOS, a network change can change the hostname. If the Mac crashed before its lease was released and its hostname then changed, startup refuses the scope mismatch even on the same Mac. Close its Site Studio MCP connections and browser-only instances, and manually verify that no Site Studio writer is still using that state directory, including the recorded PID. Then remove only the named lease.json and restart with the same --data-dir. Keep state.json, working directories and checkpoints; do not edit the recorded hostname to bypass the check.

Supported sites and limits

  • Recursive static folders, nested pages, root-relative URLs and binary assets are supported. HTML/HTM, CSS and UTF-8 text are readable; other files are preserved as opaque bytes for export. HTML paired elements and void elements are addressable. This is not a JavaScript runtime, build system, CMS or server-side template editor. Run your site's build first and select its static output.

  • Authored HTML/SVG uses conservative allowlists. Scripts, event attributes, executable embeds, forms, raw source replacement and obfuscated URLs are refused. New SVG supports shapes, groups, gradients, definitions and local references; SVG animation and foreignObject are refused. A drawn SVG file gets the namespace declarations a standalone image needs (xmlns, and xmlns:xlink when xlink:href is used) on its root when they are missing. CSS edits support flat rules; nested rules and at-rules are not edited. Complex browser-repaired HTML can have fewer addressable nodes: use well-formed paired markup.

  • Existing source bytes, including scripts and external references, are preserved for export. Preview requires a separate rotating read cookie; copying its URL alone grants no access. CSP and sandboxing disable scripts, frames, forms, automatic meta refresh and base overrides. Preview rewriting removes recognized document/element referrer-policy overrides as defense in depth; it is not a general HTML/XML sanitizer or a guarantee against browser parser recovery. The read capability never appears in the URL. Preview cookies are not port-scoped, so other loopback servers remain outside the protection boundary; see SECURITY.md. Malformed opening tags are dropped from previews. SVG preview requires UTF-8 and supports CDATA and bounded literal internal entities, including common Illustrator namespace declarations. External, recursive and parameter entities are not expanded. Other SVG encodings remain exportable. Local HTML links, srcset entries and ordinary CSS url()/quoted imports are rewritten into its preview path prefix. Escaped CSS resource URLs may not render; original bytes are unchanged for export. It does not simulate your site's JavaScript behavior. External image, font and stylesheet loading is blocked by default; the human may explicitly start with --allow-external to permit HTTPS references. Changing that policy requires a new state directory. Exported sites retain the behavior of their original files; review them before serving them elsewhere.

  • Only regular, singly linked files are accepted. Symbolic links, hard links, special files, hidden paths other than .well-known/.nojekyll, traversal, Windows device names and ambiguous cross-platform paths refuse the import. Choose a public static output directory, not a project folder containing credentials or version-control state. Filesystem metadata and executable bits are not preserved; exported files are private until you deliberately change permissions for your hosting setup.

  • Preview budgets derive from the 2 MiB input-file limit: 8 MiB transformed output, 2 MiB cumulative decoded XML text, 64 KiB per attribute and at most 2,097,152 tokens. Oversize attributes are omitted individually; the rest of the page remains visible. The dashboard shows attribute omissions and whole-file preview failures. These limits do not change export bytes or impose an OS process-memory ceiling.

  • Limits: 2 MiB per file, 32 MiB total, 1,000 files and 1,000 directories; 240-character relative paths, with at most 255 UTF-8 bytes per component. Paths reject invisible formatting/control characters and collisions under NFC normalization and Unicode 15.0 full case folding. The store keeps at most 20 undo states, 20 redo states, 10 named checkpoints and 100 timeline entries. Older undo/redo states are pruned under the 96 MiB history target, but the newest undo and the newest redo state are kept. Only the 128 MiB state ceiling removes those; the edit or dashboard action still succeeds, and its result and the dashboard say so (undoPruned). Growth that would exceed 128 MiB even without them is refused. Tool string arguments are limited to 8,192 UTF-16 code units (checkpoint labels to 80). MCP input is limited to 256 KiB per message; an oversize frame is discarded through its newline and subsequent requests continue and output to 64 KiB per result. Reads return at most 16,384 characters; file/node listings and search results paginate or state their limit.

  • State directories require a local filesystem that supports hard links for atomic lease publication; unsupported filesystems refuse startup. Linux requires readable /proc process identities and PID namespace metadata. Native Windows is not yet supported, and macOS is unqualified. Their untested code paths use /bin/ps on macOS and, on Windows, %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe with SystemRoot as a fully qualified Windows directory (the full path is launched without searching the current folder or PATH). The Codex plugin forwards SystemRoot by name; the Claude Code plugin and the Desktop manifest set no SystemRoot entry, and the server takes it from the environment its host starts it with (Claude Code passes its own environment to plugin servers). Missing/invalid values refuse startup before PowerShell is launched. Native Windows, Desktop environment expansion and macOS startup remain unqualified by the Linux test suite. The lease coordinates this product's processes, not arbitrary editors or malicious processes using your OS account. Human-only means no MCP tool grants that authority; a host that separately grants shell/browser access can act outside this tool boundary. The optional fail-closed guard restricts such tools where the host supports it. A process running as the same user can still act as the user. See SECURITY.md.

  • Directory promotion retains a backup when replacing the original. A machine crash during the two directory renames can leave the original at that backup path; keep it and recover manually. This is not a transaction across a remote filesystem or power failure. There is no automatic deployment or remote publication.

Development and verification

See testing and package reproduction for the complete headless suite, browser prerequisite, stdio lifecycle test and deterministic packaging. See state compatibility and the included test report.

Run the suite with TMPDIR set to a short, absolute real path of an existing folder, for example mkdir -p /tmp/ss && TMPDIR=/tmp/ss SITE_STUDIO_CHROME=/absolute/path/to/chrome node tools/run-tests.js. The test runner checks TMPDIR before it starts any test and stops with a message that names the problem:

  • TMPDIR must be absolute and must not reach its folder through a symbolic link. The tests keep their sites under TMPDIR, and the working-copy store refuses any path that goes through a symbolic link, by design; without this check about a third of the tests would fail with symbolic link refused.

  • TMPDIR may be at most 62 bytes long. Chrome puts its lock socket in a folder under TMPDIR, and a Unix socket path holds at most 107 bytes; with a longer TMPDIR Chrome exits at once and the fifteen browser tests would fail with a bare read ECONNRESET.

Privacy and support

Site Studio reads the static site folder you select and maintains its private working copy on your computer. It sends selected tool results to your MCP client; that client and its model provider may process the returned site content. Site Studio has no hosted service or telemetry. External preview resources are blocked unless you explicitly opt in. Review your client's data settings before opening confidential sites. Privacy policy. Support: support@toolsenabled.ai.

ToolsEnabled is not affiliated with or endorsed by the listed clients or their vendors. Client configuration generation does not establish native installation or model-workflow qualification.

User commands

Claude Code command

Kind

Purpose

Codex equivalent

/site-studio or /site-studio home

Pane

Revision, pause/lease state, undo depth, budgets and recent history

!node /absolute/site-studio/tools/site-studio-view.js home

/site-studio pages [--assets]

Pane

Page titles, node counts and sizes; --assets includes other files

!node /absolute/site-studio/tools/site-studio-view.js pages [--assets]

/site-studio page "path"

Pane

Outline, CSS rules and bounded source; asset metadata only

!node /absolute/site-studio/tools/site-studio-view.js page "path"

/site-studio find "text"

Pane

Case-folded matches, line numbers and bounded context

!node /absolute/site-studio/tools/site-studio-view.js find "text"

/site-studio history

Pane

Saved timeline with UTC times, actors, types and revisions

!node /absolute/site-studio/tools/site-studio-view.js history

/site-studio checkpoints

Pane

Saved labels and counts of changed files

!node /absolute/site-studio/tools/site-studio-view.js checkpoints

/site-studio changes ["label" or original] ["path"]

Pane

Changed files since the latest checkpoint (the default baseline), a named checkpoint or original, with a bounded line replacement diff

!node /absolute/site-studio/tools/site-studio-view.js changes ["label"] ["path"]

/site-studio check

Pane

Missing local HTML/CSS targets and unlinked pages; no network

!node /absolute/site-studio/tools/site-studio-view.js check

/site-studio dashboard (alias preview)

Pane

Human dashboard instructions and current lease status

!node /absolute/site-studio/tools/site-studio-view.js dashboard

/site-studio export

Pane

Advisory destination, lock and drift checks; never exports

!node /absolute/site-studio/tools/site-studio-view.js export

/site-studio doctor

Pane

Saved-state/startup checks and manual recovery guidance; no repair

!node /absolute/site-studio/tools/site-studio-view.js doctor

/site-studio help

Pane

Paged command names and their Codex equivalents

!node /absolute/site-studio/tools/site-studio-view.js help

/toolsenabled-site-studio:site-studio-edit <request>

Action

Inspect, edit and verify the working copy

$toolsenabled-site-studio:toolsenabled-site-studio edit <request>

/toolsenabled-site-studio:site-studio-new-page <path> <title>

Action

Add and verify a named HTML page

$toolsenabled-site-studio:toolsenabled-site-studio new-page <path> <title>

/toolsenabled-site-studio:site-studio-checkpoint <label>

Action

Save an agent checkpoint; refused while paused

$toolsenabled-site-studio:toolsenabled-site-studio checkpoint <label>

/toolsenabled-site-studio:site-studio-draw <path.svg> <description>

Action

Author a safe SVG asset; reference it only if requested

$toolsenabled-site-studio:toolsenabled-site-studio draw <path.svg> <description>

Claude Code panes require the local plugin loaded in Code 2.1.287 or newer; a direct MCP registration alone does not load them. Views start only the installed read-only runtime child, never MCP tools or model work. Use n/p to page, r to reload, 1–8 for row detail (b returns), and Esc or q to close. The pane keeps the keyboard while open: a key that does not apply in the current state shows a short hint instead of reaching the prompt, and the footer lists only the keys that apply. The pane shows the revision and a short snapshot digest. A saved-state change clears stale pages. Text is sanitized and truncated; these are summaries, not a full source viewer. No automatic polling, lease acquisition, state writes or launch-log reads occur.

Use the fully qualified action names above. In the tested 2.1.287 build, the unprefixed action names do not resolve. Actions start normal model work and retain host permissions. Pause, undo, restore and export remain human dashboard actions.

Codex has no plugin-defined slash-command pane API in the tested client. The bang commands above are an explicit local CLI alternative, not a Codex pane. Replace /absolute/site-studio with the extracted plugin path. Set SITE_STUDIO_ROOT and SITE_STUDIO_DATA to the same absolute paths as the MCP server, or append --site /absolute/site --data-dir /absolute/private-state to each command. Append --export-dir /absolute/export to display that configured destination. Absent both explicit and environment paths, the CLI uses the server's bundled sample and ~/.site-studio/<site-hash> defaults. It never searches for another running server or creates a missing state folder; it displays “not opened yet”. Use --allow-external only to match a server started with that policy. For later pages it prints the exact --offset and --snapshot flags to add. Codex may include bang-command output in subsequent model context; Claude pane bodies stay outside it. The Codex skill name is the plugin name followed by the skill folder name, toolsenabled-site-studio:toolsenabled-site-studio with this release's manifest; the 0.1.3 name site-studio:toolsenabled-site-studio was verified with no-model plugin/read, and the renamed form has not been re-verified in a Codex client. Skill equivalents require that plugin/skill to be loaded and are model actions, not instant views. For a Codex plugin installed from the repository marketplace, its cache path is <CODEX_HOME>/plugins/cache/<marketplace>/toolsenabled-site-studio/<version>/; obtain the literal path from the client's plugin details. GitHub extraction can use any selected absolute folder.

Available Tools

16 tools
web_add_pageC

Add a new HTML page to the working copy from a minimal valid document.

NameRequiredDescriptionDefault
pathYesSafe relative .html path.
titleYesPage title.
expected_revYesRevision returned by your most recent read. Stale revisions refuse; read again.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, and it only discloses that the result is a 'minimal valid document' — a genuinely useful scaffold hint. It omits what happens on path collision, whether the page persists in a checkpoint/timeline, and the side effects of a mutation. Too thin for a write tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. It is efficient, though arguably too terse given the tool's mutation semantics and lack of annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the description should explain the working-copy concept, collision/overwrite behavior, and expected_rev staleness at least in prose. None of this is present, leaving meaningful gaps an agent must guess at.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (path, title, expected_rev) are already documented in the schema, including the stale-revision refusal behavior. The description adds no parameter-level meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (Add), resource (HTML page), and scope (working copy), plus a distinguishing detail about how the page is created. It clearly separates itself from read-oriented siblings like web_read/web_pages, but does not explicitly reference any sibling by name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use, when-not-to-use, or alternative guidance. The agent must infer that this is for creating a brand-new page as opposed to manipulating an existing one via web_insert_section or web_set_text. No prerequisites or conditions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_checkpointB

Save a named checkpoint of the current working copy. Restore and delete are not available as MCP tools and require the dashboard session.

NameRequiredDescriptionDefault
labelYes
expected_revYesCurrent revision.

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose that restore/delete are outside MCP scope. It still omits key mutation traits: whether saving overwrites an existing label, what happens on a revision mismatch, and whether the operation is reversible from the MCP side.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero filler; the primary action is front-loaded and the limitation follows. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation tool with no annotations and no output schema, the description covers the action and the tool boundary but leaves expected_rev's role and failure behavior unexplained, which is the main gap an agent would hit in practice.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50% and the description adds no parameter meaning at all. 'label' is undocumented and 'expected_rev' is only labeled 'Current revision' in the schema, so the important optimistic-concurrency semantics of expected_rev are never explained anywhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Save a named checkpoint of the current working copy'), which is unambiguous. It does not differentiate against siblings like web_timeline or web_preview that might also relate to versioning, but the action itself is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence tells the agent that restore and delete are NOT available here and require a dashboard session, which is useful scoping. However, it never says when to create a checkpoint or in what workflow context, so usage selection against siblings is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_cssA

Read CSS rules whose selector contains the requested text, from the current working copy.

NameRequiredDescriptionDefault
file_idNoOptional CSS file id.
selectorYesSelector text, for example .hero.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that this is a read operation against the working copy, which is useful, but says nothing about return shape, ordering, pagination, or how unmatched selectors behave. Adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the read scope and matching rule are stated immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with no output schema, the description covers the operation and its matching semantics, and the schema documents file_id. It could say more about what the read returns, but nothing critical to invoking it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds genuine meaning beyond the schema by specifying that the selector is matched by substring containment ('contains the requested text') rather than exact match, which the schema's '.hero' example does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb and resource: 'Read CSS rules whose selector contains the requested text.' The read-only framing distinguishes it implicitly from web_css_set, and the substring matching is a specific scope, but no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'from the current working copy' gives a hint about context, and the substring-selector framing implies when it applies, but there is no explicit when-to-use/when-not guidance or routing to sibling tools like web_css_set or web_find.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_css_setC

Set one stylesheet rule in a CSS file. declarations is the rule body, for example "color: red; margin: 0".

NameRequiredDescriptionDefault
file_idYesCSS file id.
selectorYesFull selector text.
declarationsYesDeclaration list without braces.
expected_revYesRevision returned by your most recent read. Stale revisions refuse; read again.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It states that a rule is set but does not disclose permissions required, whether existing rules are overwritten, what happens on stale revisions (beyond the schema), or any error behavior. This is a significant gap for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loads the core action, and includes a concrete example without any wasted words. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a mutation tool with no annotations and no output schema, the description is too thin. It omits revision semantics, overwrite behavior, error handling, and return information that an agent would need to call it confidently, even though the schema covers parameter details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds a useful example for the declarations parameter ("color: red; margin: 0"), which slightly clarifies format beyond the schema, but it does not elaborate on selector, file_id, or expected_rev.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (Set) and resource (one stylesheet rule in a CSS file), making the tool's purpose clear. However, it does not distinguish this from sibling tools like web_css or web_set_text, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance about when to use this tool versus alternatives such as web_css or web_set_text, nor does it mention prerequisites or exclusions. Usage is only implied by the verb and resource.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_drawA

Author a pure SVG asset file. Rejects scripts, foreignObject and event attributes. External references are refused unless started with --allow-external. Reference it afterwards with web_insert_section or web_set_attr.

NameRequiredDescriptionDefault
svgYesComplete pure SVG source.
pathYesSafe relative .svg asset path.
expected_revYesRevision returned by your most recent read. Stale revisions refuse; read again.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it discloses meaningful behavior: scripts, foreignObject and event attributes are rejected, and external references are refused unless the '--allow-external' flag is used. This is real constraint disclosure an agent cannot infer, though it omits overwrite/create semantics for an existing path.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the primary action, then constraints, then follow-up routing. No filler and each sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema and no annotations, so the description must stand alone; it covers the content safety rules and the follow-up tools. What it lacks is any statement of success/return behavior or whether authoring an existing path overwrites it, which matters for a 3-required-param mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (svg, path, expected_rev) are already documented in the schema, including the stale-revision retry behavior. The description adds nothing parameter-specific, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Author a pure SVG asset file.' The content restrictions (scripts, foreignObject, event attributes) sharpen what kind of file this produces, distinguishing it from generic write tools like web_set_text or web_css. It does not explicitly contrast with any sibling by name, keeping it at 4.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description tells you what to do after authoring ('Reference it afterwards with web_insert_section or web_set_attr'), which gives useful sequencing context. It does not state when this tool should be chosen over sibling write tools (web_set_attr, web_css_set) or what conditions make it the wrong choice beyond the SVG-specific rejections.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_findA

Search text across all files in the current working copy (case-insensitive).

NameRequiredDescriptionDefault
limitNoMaximum matches; default 40.
queryYesNon-empty text to find.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses case-insensitivity and the search scope (all files in the current working copy), but says nothing about the shape of results, whether matches include file/line context, or how traversal behaves across large trees.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero waste; the operation and its most important behavioral modifier (case-insensitive) are stated immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read tool with fully documented schema, the description is close to sufficient. The only material gap is the absence of any hint about what a match looks like, which matters slightly given there is no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: both 'query' and 'limit' are documented in the schema, including the default of 40 matches. The description adds no parameter-level meaning beyond that, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Search') and resource ('text across all files in the current working copy'), so an agent knows exactly what operation this performs. It does not explicitly contrast itself with any sibling tool, but the siblings (web_read, web_css, web_pages) are functionally distinct enough that confusion is unlikely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the agent can infer this is the tool for locating text, but there is no statement of when to prefer it over web_read or other read tools, and no mention of prerequisites or exclusions. Minimum-viable implied guidance rather than explicit routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_insert_sectionC

Insert a fragment relative to a parent node.

NameRequiredDescriptionDefault
htmlYesA complete <section>...</section> fragment.
file_idYesHTML file id.
positionYesOne of first, last, before, after.
parent_idYesParent node id.
expected_revYesRevision returned by your most recent read. Stale revisions refuse; read again.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, yet it only restates the insert action. It does not disclose that this is a destructive/mutating operation, that it requires an expected_rev (optimistic concurrency, stale revisions refuse), or what happens to sibling nodes at the insertion point. The concurrency behavior is only discoverable from the schema field description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with no filler, and the core action is front-loaded. It is efficient, though arguably too terse for a five-parameter mutating tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema is fully self-documenting (including the stale-revision rule in expected_rev) and there is no output schema to explain, so the agent can still call this correctly. However, for a five-required-parameter mutation with zero annotations, the one-sentence description leaves behavioral context thin.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters are already documented, making 3 the baseline. The phrase 'relative to a parent node' loosely ties parent_id and position together, but adds no syntax or format detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Insert a <section> fragment') and identifies the anchor ('relative to a parent node'). It is clear what the tool does, but it does nothing to distinguish itself from sibling mutators like web_move, web_set_text, or web_set_attr.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisite note, and no routing to alternatives (e.g. when to insert a section vs. use web_move or web_set_text). The agent must infer applicability purely from the name and schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_moveC

Move a node relative to another node in the same file.

NameRequiredDescriptionDefault
file_idYesHTML file id.
node_idYesNode to move.
positionYesOne of first, last, before, after.
parent_idYesDestination node id.
expected_revYesRevision returned by your most recent read. Stale revisions refuse; read again.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It does not state that this is a mutation, whether it is reversible, what happens to the node's existing children, or that expected_rev is a concurrency guard (that detail lives only in the schema). For a write tool with zero annotation coverage this is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler. Nothing is padded and the core action leads immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Five required parameters, a mutation operation, no annotations, and no output schema means the description should explain more: the interaction between position and parent_id, the destructive/irreversible nature of the move, and the stale-revision refusal behavior. As-is it is too thin for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so every parameter (file_id, node_id, parent_id, position, expected_rev) is documented in the schema itself. The description only loosely frames parent_id/position as a move 'relative to another node' and adds no syntax or format detail beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Move) and resource (node) with the scoping constraint 'relative to another node in the same file'. That distinguishes it reasonably from siblings like web_remove or web_insert_section, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this over alternatives such as web_insert_section or web_remove, nor on prerequisites. The only hint is the phrase 'in the same file', which constrains scope but does not route the agent between tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_pagesB

List revision and files with up to 20 nodes each. Use file_id and node_offset for remaining nodes; offsets are revision-specific.

NameRequiredDescriptionDefault
limitNoFiles per page, default 20.
offsetNoFile offset, default 0.
file_idNoOptional file id to list its nodes.
node_offsetNoNode offset, default 0.

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It does disclose two non-obvious traits: a hard cap of 20 nodes per page and that node offsets are revision-specific (so offsets cannot be reused across revisions). It omits read-only status and any auth or return-shape context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the page-limit constraint before the pagination mechanics. No wasted words, though the phrasing 'List revision and files' is compressed to the point of ambiguity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paginated list with no annotations and no output schema, the pagination contract is covered, but the description never clarifies what a 'revision' is, what the returned nodes look like, or whether results are stable across calls. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains that file_id plus node_offset selects 'remaining nodes' and that node offsets are revision-specific, which the schema's flat 'Node offset, default 0' does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a listing operation over 'revision and files' and nodes, but the resource naming is muddy: the tool is 'web_pages' yet pages are never mentioned, and 'revision' is undefined. An agent can infer it enumerates files/nodes, but cannot cleanly distinguish it from siblings like web_timeline or web_read.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No statement of when to use this tool versus alternatives, and no mention of prerequisites. It only tells you how to page, not when this tool is the right choice over web_read or web_find.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_previewA

Return the loopback live-preview URL and current revision. The human dashboard controls pause, undo, restore and confirmed export. No screenshot is captured.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does add real boundaries: it reads (returns) rather than mutates, it captures no screenshot, and it flags that pause/undo/restore/confirmed-export belong to the human dashboard, not this tool. It does not state permissions, idempotency, or freshness/caching behavior of the returned revision, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the return value in the first sentence. Each sentence earns some place, though the third sentence is primarily a disambiguation against the screenshot sibling rather than essential here.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-param, no-output-schema tool, the description covers what is returned (a URL and a revision) and the notable scope boundary (no screenshot, dashboard-only controls). It does not explain what the returned URL is useful for or when the revision might change, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. There is nothing for the description to disambiguate, and it does not add misleading parameter-like guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: returns the loopback live-preview URL plus the current revision. It distinguishes itself from web_screenshot_note by explicitly saying no screenshot is captured, but it does not differentiate from the other web_* siblings (web_pages, web_timeline, web_checkpoint), so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent would infer this is called when it needs the preview URL or revision. The clause about the human dashboard controlling pause, undo, restore and confirmed export hints at what this tool does NOT do, but no explicit when-to-use or when-to-prefer-an-alternative statement is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_readA

Read up to 16,384 characters of a managed HTML/CSS/text file, with revision and next offset. Opaque assets cannot be read.

NameRequiredDescriptionDefault
endNoExclusive character offset.
startNoInclusive character offset.
file_idYesFile id from web_pages.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does reasonably well: it discloses the truncation cap, that a revision and next offset are returned (pagination signal), and that opaque assets are unreadable. It stops short of describing permission requirements or what happens at end-of-file, but the core read behavior is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with zero filler. The size cap and return shape come first, and the readability exclusion follows immediately, so the most decision-relevant information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description wisely names what comes back (revision and next offset), covering the return-value gap. Combined with 100% schema coverage, an agent has enough to call it correctly; only edge behavior at the end of the file is unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so file_id, start, and end are already documented as inclusive/exclusive offsets in the schema. The description's mention of 'next offset' adds a hint about pagination continuity but no syntax or format detail beyond what the schema already supplies; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Read), resource (managed HTML/CSS/text file), and an explicit scope cap of 16,384 characters. Clear enough for an agent to distinguish this from write-oriented siblings like web_set_text, but it does not name or contrast with any specific sibling tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the verb and the stated 'Opaque assets cannot be read' exclusion, which is a useful when-not condition. However, there is no guidance on when to prefer this over web_find or web_pages, nor any mention of prerequisites for obtaining a file_id beyond the schema's reference to web_pages.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_removeC

Remove one node from the working copy.

NameRequiredDescriptionDefault
file_idYesHTML file id.
node_idYesNode id.
expected_revYesRevision returned by your most recent read. Stale revisions refuse; read again.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden and delivers very little. It does not say whether removal is reversible (relevant given the sibling web_checkpoint), whether a parent or sibling must exist, or what errors occur beyond the stale-revision note already in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler. It is efficient, though arguably under-sized for a mutation tool with no annotations to fall back on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation with no annotations and no output schema, the description omits the things an agent most needs: reversibility/undo behavior, failure modes, and side effects on the working copy. The schema covers parameters but the description does not fill the behavioral gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including the important note that stale revisions are refused, so the schema already does the heavy lifting. The description adds no meaning about file_id, node_id, or expected_rev beyond what the schema states, which is the baseline-3 case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Remove one node') plus the scope ('from the working copy'), which separates it from read-side siblings like web_read and web_find. It never names an alternative such as web_move or web_insert_section, so sibling differentiation is left to the agent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no preconditions, and no mention of alternatives for the closely related web_move / web_insert_section operations. Usage is only inferable from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_screenshot_noteA

Return the working-copy revision and file count. No screenshot is captured or inspected; use a separate visual tool for screenshots.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses that no screenshot is captured and what is returned, but omits whether the operation has side effects, requires authentication, or is purely read-only.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two front-loaded sentences with no wasted words: the first states the return values, the second rules out screenshots and points to an alternative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with no output schema and no annotations, the description adequately explains the return values and the key non-behavior. It could be slightly richer about what the working-copy revision represents, but is otherwise complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description does not need to explain parameter semantics, and it correctly adds no extraneous parameter detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific output ('working-copy revision and file count') and explicitly disclaims the screenshot action implied by the name. This distinguishes it from visual tools, though the tool name remains somewhat misleading.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a clear when-not ('no screenshot is captured or inspected') and names an alternative ('use a separate visual tool for screenshots'). However, it does not state when an agent should choose this tool over unrelated siblings like web_pages or web_read, leaving implicit usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_set_attrC

Set one HTML attribute in the working copy.

NameRequiredDescriptionDefault
nameYesAttribute name.
valueYesAttribute value.
file_idYesHTML file id.
node_idYesNode id.
expected_revYesRevision returned by your most recent read. Stale revisions refuse; read again.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It says 'working copy' but does not disclose mutation side effects, permission requirements, reversibility, or what happens to the file revision beyond what the schema already states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence with no wasted words. The action and scope are front-loaded, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter mutation tool with no annotations and no output schema, the description is too sparse. It should at least clarify working-copy semantics, the revision-check behavior, or how this differs from other web editing tools in the set.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters are already documented in the input schema. The description adds only the notion of setting one attribute and does not contribute additional meaning beyond the schema's name/value/file_id/node_id/expected_rev descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Set one HTML attribute in the working copy.' It is clear what the tool does, but it does not distinguish itself from close siblings like web_set_text or web_css_set, which also mutate content in the same working copy.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit when-to-use or when-not-to-use guidance. It does not name alternatives or conditions for choosing this attribute-setting tool over related editing tools such as web_set_text.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_set_textB

Set the text of one paired HTML node. Pass expected_rev from your last read.

NameRequiredDescriptionDefault
textYesNew plain text (escaped by Site Studio).
file_idYesHTML file id.
node_idYesNode id.
expected_revYesRevision returned by your most recent read. Stale revisions refuse; read again.

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It mentions the expected_rev/retry pattern, but that same detail is already in the schema. It does not disclose that this overwrites existing text, whether permissions are required, or what a successful mutation returns. For an unannotated mutation tool, this is a significant omission.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the operation and followed immediately by the one non-obvious calling constraint. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without annotations or an output schema, the description should carry more of the behavioral contract for a four-required-parameter mutation tool. It omits overwrite semantics, permission expectations, success/failure behavior, and sibling routing, leaving notable gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains text, file_id, node_id, and expected_rev. The description repeats the expected_rev guidance but adds no syntax, format, or edge-case detail beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Set the text of one paired HTML node.' This distinguishes it reasonably from siblings like web_set_attr and web_css_set, though it does not explicitly name an alternative. The purpose is clear without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Pass expected_rev from your last read' implies a prerequisite workflow (read before write) but does not state when to use this tool versus web_set_attr or web_css_set, nor does it give explicit exclusions. Usage is therefore implied rather than guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

web_timelineA

Read the working-copy timeline. Undo, redo and restore require the dashboard session.

NameRequiredDescriptionDefault
limitNoMost recent entries; default 50.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It usefully discloses a session/auth constraint (undo/redo/restore need a dashboard session, implying this read does not) and reads as non-mutating, but says nothing about ordering, pagination behavior, or whether the read affects state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, the core action front-loaded and the session caveat second. Every clause earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description needn't explain return values, and the one optional parameter is covered by the schema. For a simple read tool the description is nearly sufficient, though a hint about what a timeline entry represents would fully close the gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single optional limit parameter is fully documented in the schema (default 50, max 100). The description adds no further parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: reading the working-copy timeline. It is distinguishable from the mutation siblings (web_set_text, web_remove, web_move) but does not explicitly contrast with the closest sibling, web_checkpoint.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The note that undo, redo and restore require the dashboard session implies this tool is the read-only timeline access path and that those actions are out of scope here, but it never says when to reach for this vs web_checkpoint or how it relates to the editing tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 16 tool updatesv0.1.0
    • First observedweb_add_page
    • First observedweb_checkpoint
    • First observedweb_css
    • First observedweb_css_set
    • First observedweb_draw
    • First observedweb_find
    • First observedweb_insert_section
    • First observedweb_move
    • First observedweb_pages
    • First observedweb_preview
    • First observedweb_read
    • First observedweb_remove
    • First observedweb_screenshot_note
    • First observedweb_set_attr
    • First observedweb_set_text
    • First observedweb_timeline

TDQS

B3.2/5.0

Scored across 16 tools

Disambiguation4/5

Most tools target distinct resources and actions, but web_read, web_pages, web_find, and web_css all involve reading related content, and web_screenshot_note/web_preview both return revision info. Descriptions help clarify boundaries, though some overlap remains.

Naming Consistency3/5

All tools share a 'web_' prefix, but conventions are mixed: some are verbs (web_read, web_find), some are nouns (web_pages, web_css, web_timeline), and some are verb_noun (web_set_text, web_add_page). The inconsistent ordering of web_css_set further breaks the pattern.

Tool Count4/5

16 tools is slightly above the ideal 3-15 range, but the domain is rich (reading, writing, CSS, SVG, checkpoints, preview). Each tool appears to earn its place, so the count is reasonable if a bit heavy.

Completeness3/5

Core CRUD for nodes and attributes is covered, but several lifecycle operations are missing or only available via the dashboard: undo/redo/restore, checkpoint restore/delete, file-level deletion, and CSS file creation. Agents can work around some gaps, but these are notable omissions for a revision-based editor.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers