Skip to main content
Glama

One app instead of eight menu bar icons

Plonk is a small suite of macOS tools that share one interface, one command palette and one automation surface. Use all of it, or switch off every module you do not need.

Capture and understand the screen. Take a region, window or full-screen screenshot, annotate it, pin a live crop, copy otherwise unselectable text with on-device OCR, or measure an interface in points and pixels.

Keep the Mac and your workflow moving. Hold sleep off until a timer, time of day or process exit; find the pointer, add crosshairs or click rings; inspect the front app's real shortcuts; and run anything by name from one palette.

Arrange the desk. Draw snap zones, save workspaces that remember each monitor, move windows by drag, shortcut or voice, and let app rules put new windows where they belong.

Let an agent use the same tools. Plonk ships an MCP server and CLI for layouts, workspaces, screenshots, OCR, measuring, keep-awake and the rest. The app stays the source of truth, and the whole surface remains on your Mac.

It is early. Version 0.4.x, one author. Shortcuts, zone files and workspaces are settled. The MCP tool names and the HTTP API are not, and can still change between minor versions. CHANGELOG.md says what moved.

Related MCP server: macos-desktop-control

Install

macOS 13 or newer, Apple silicon.

brew install --cask ostapondo/plonk/plonk

Grant Accessibility when it asks, then relaunch. Screen Recording is asked for separately, the first time you capture. Nothing else: no Full Disk Access, no Automation, no Keychain.

Plonk is signed but not notarized, so macOS holds a copy you download by hand. The cask takes care of that for you.

Running it alongside Rectangle or Magnet is fine, as long as their shortcuts do not collide.

Checking what you downloaded. Notarizing an app means paying Apple for a developer account, and this project does not have one, so Plonk is signed with a certificate it made itself. That means macOS cannot tell you who built the app. There is a check that answers a more useful question, and you can run it yourself: was this exact file built by GitHub from the source in this repository?

gh attestation verify Plonk-<version>.zip --repo ostapondo/Plonk

Put the number from the file name in place of <version>. The command comes with the GitHub CLI, which is brew install gh. It prints the commit and the workflow run that built the archive. If the file was altered after it was built, or was not built from this repository at all, the command fails and tells you so.

Every release also carries a small Plonk-<version>.zip.sha256 file. Put it beside the zip and run shasum -a 256 -c Plonk-<version>.zip.sha256 to confirm the download arrived complete and unchanged. That file is signed the same way as the zip, so gh attestation verify works on it too. The attestation itself is also on the release as Plonk-<version>.zip.sigstore.json, for anyone who wants to check it offline with gh attestation verify --bundle or with cosign instead of asking GitHub.

Why macOS holds a downloaded copy. The certificate is self-signed rather than an Apple Developer ID, because notarizing needs a paid Apple account and this project does not have one. macOS cannot vouch for who built it, and says so. The cask skips that check by clearing the quarantine flag for you.

That is a check skipped on your behalf, so here is a stronger one to run before you open anything:

gh attestation verify $(brew --cache)/downloads/*--Plonk-*.zip \
  -R ostapondo/plonk

It prints the commit and the GitHub Actions run that built this exact archive. Apple's stamp would tell you a build passed a malware scan. This tells you the binary came from the source in this repository, with no laptop in between.

Without Homebrew. Download the latest release, unzip, drop Plonk.app into Applications, then clear the flag yourself, which is all the cask does:

xattr -dr com.apple.quarantine /Applications/Plonk.app

Or do the Gatekeeper detour once: open Plonk, dismiss the warning, then System Settings, Privacy & Security, scroll to Security, Open Anyway.

If you move or rename Plonk.app later, macOS ties the old grant to the old path and windows of newly launched apps stop being seen. Remove Plonk from Privacy & Security, Accessibility, and grant it again.

On an Intel Mac. Releases are built for Apple silicon only, so the download will not run. Building from source ought to work, see Build, but nobody has tried it and a report either way is welcome in issues.

Next to a tiling manager. yabai and Amethyst own every window on screen and will pull windows straight back out of a zone. Run one or the other.

Removing it. brew uninstall --cask plonk, or quit Plonk and drag it to the trash. Then delete ~/Library/Application Support/Plonk/. The login item goes with the app, and nothing was written anywhere else.

The tools

The modules share settings, shortcuts, the menu bar, the command palette and the same local API. Turning one off removes its page, menu items, shortcuts, manager and agent routes while keeping its settings for later.

Screenshots and annotation

Capture a region, window or full screen at native resolution, then add pen strokes, arrows, shapes or highlights before saving

On-device OCR

⌃⌥T copies words from a screenshot, paused video, dialog or locked PDF without uploading a pixel

Screen ruler

⌃⌥R reads clearances and dragged distances in both macOS points and physical pixels

Live crops

Pin a changing part of the screen above everything else. It streams live and is never written to disk

Pulse

Keep the Mac awake by timer, schedule, open app, charging state or process lifetime. It uses real power assertions and hands sleep back when the session ends

Pointer tools

Find the cursor, add configurable crosshairs or click rings, and jump the pointer to the next display

Shortcut guide

Read every shortcut the front app actually exposes through its menus instead of relying on a stale cheat sheet

Zones and workspaces

Draw window places, save apps and documents as a desk, and return everything to the correct displays. Workspace details

Voice, CLI and agents

Run the same tools by name, from speech, the plonk command or twenty-two MCP tools. Recognition for common voice commands stays on-device

All but the shortcut guide can be switched off, from Tools in the menu bar dropdown or the Tools page. Off means gone: out of the sidebar, out of the menu, its shortcuts released, and its tools refused to agents until it is back on. The same switches cover zones, workspaces and voice, so desk arrangement can stand down while the rest of Plonk keeps running.

If you are coming from Rectangle, Magnet, Loop or Raycast, the familiar window shortcuts can come with you. One button imports Rectangle bindings and existing rectangle:// scripts need one substitution. Coming from Rectangle has the details.

Longer versions: Zones · Workspaces · Hotkeys · Everything else · Coming from Rectangle

For agents

An agent gets the same toolbox as the menu bar: capture or read the screen, measure an interface, control an awake session, inspect the desk, arrange it and save the result.

keep the Mac awake until this build finishes
read the error out of that dialog and tell me what it says
how tall is that toolbar, in points and in pixels
capture this window and highlight the warning
put the browser on the left, then save this desk as "review"

Twenty-two tools cover state, capture, OCR, measuring, keep-awake, layouts, workspaces and zones. Several agents can connect at once, each registering itself, with an optional mode that locks changes to the active one.

Setup, if you want the plonk CLI or an agent driving it (Node 18+):

claude mcp add plonk -- npx -y plonk-mcp   # Claude Code
codex mcp add plonk -- npx -y plonk-mcp    # Codex CLI

In Claude Code it can also be a plugin: same server, pinned to the release it shipped with rather than to whatever npm serves as latest.

/plugin marketplace add ostapondo/plonk
/plugin install plonk@plonk

For Claude Desktop there is nothing to type. Download plonk-<version>.mcpb from the latest release and open it. The bundle carries the server and its dependencies, so no config file is edited and nothing is fetched at launch.

Any MCP client works, over stdio or HTTP. One-pagers for Cursor, Zed and Cline.

The same package carries a plonk command, for the things that are neither an agent nor a settings window:

plonk state                      # screens, zone sets, workspaces, windows
plonk launch review              # a saved workspace
plonk awake while npm run build  # awake for exactly as long as the build
plonk text | pbcopy              # OCR a region into the clipboard
plonk measure 0.5 0.5            # size of what is mid-screen, in points and pixels

For agents has every tool, the multi-agent rules, the HTTP transport and the rest of the CLI.

Privacy

No account, no cloud, no telemetry. The API binds to 127.0.0.1, refuses anything carrying headers a browser cannot suppress, and is gated on a token only you can read. The one outbound connection is the update check, which carries no identifier and can be switched off.

None of that is a claim you have to take on trust. Releases are built and signed on GitHub's runners and ship with an attestation, so the binary on your Mac ties back to the commit it came from:

gh attestation verify Plonk-<version>.zip -R ostapondo/plonk

Check it yourself is every claim above with the command that tests it. SECURITY.md says where each promise stops.

Under the hood

  • The app is the single source of truth. The MCP server is a stateless bridge.

  • App/ is the Swift menu bar app, mcp/ the TypeScript MCP server.

  • Config is plain JSON at ~/Library/Application Support/Plonk/config.json.

Build

Seven commands, and they are what CI runs on every pull request. Each line is a subshell, so paste the block from the repository root.

(cd App && swift build)                    # the app compiles
./scripts/test.sh                          # the unit suite
./scripts/lint.sh                          # style rules, no dependencies
(cd mcp && npm ci && npm test)             # the MCP server
node scripts/check-zone-sets.mjs           # the layouts in zone-sets/
node scripts/check-strings.mjs             # every word the user reads
./scripts/check-security-claims.sh         # what SECURITY.md promises

None of that needs a signing certificate. Zone geometry, config decoding, HTTP routing, MCP tools, voice parsing, the CLI and every document here are reachable from that loop, and most changes need nothing more.

Producing a launchable Plonk.app does need one. Make your own once with ./scripts/make-signing-cert.sh, then run ./scripts/build.sh. macOS ties Accessibility and Screen Recording to the code signature, and an ad-hoc one changes every build, so a stable certificate is what stops rebuilds from resetting permissions.

Contributing

Bug reports, zone sets, client one-pagers and code are all welcome. None of them need a signing certificate.

  • The smallest useful change is one JSON file. zone-sets/ is a gallery of layouts worth copying: an ultrawide split, a rotated monitor, the one built around a recurring meeting. Draw it in the app, read the numbers out of plonk state --json, open a pull request. That folder has its own CI job and answers in about twenty seconds. No build, no signing, no Swift.

  • good first issue issues are written to be picked up cold. Each says where the code is and how to tell it worked, and carries a prompt you can hand to an agent, since AGENTS.md already explains the repo to one.

  • needs-hardware is where a request for a desk nobody here has gets tagged, and answering one needs neither Swift nor a certificate. Desk tools meet hardware the author cannot see, so a report from three monitors or an ultrawide is worth more than a patch. An empty list is not a filled gap: open an issue with the arrangement you have and what happened.

CONTRIBUTING.md has the rest, including how long a review takes. Questions and half-formed ideas go to Discussions. A security problem goes through SECURITY.md, not a public issue. Everyone taking part follows the Code of Conduct.

License

MIT © ostapondo

Available Tools

21 tools
annotate_screenshotA

Draw on a screenshot you already took, then copy it to the clipboard and show it to the user. Call take_screenshot first and LOOK at the image: you cannot know where anything is until you have seen it. Points are fractions 0..1 of the image, origin TOP-LEFT, so a rectangle around a left sidebar that is a seventh of the width and starts under the title bar is [{x:0,y:0.05},{x:0.14,y:1}]. Rectangle and ellipse take two opposite corners, arrow takes start then tip, pen and highlight take a run of points. Returns the marked image so you can check what you drew.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath returned by take_screenshot
marksYes
outputNoWhere to write it; defaults to the source name plus ' marked'
clipboardNoCopy the result to the clipboard (default true)

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations to rely on, the description fully discloses side effects ('copy it to the clipboard', 'show it to the user'), coordinate origin ('origin TOP-LEFT'), and return behavior ('Returns the marked image'). It also warns about the need to actually view the screenshot, preventing common agent missteps.

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?

The description is dense but every sentence contributes valuable guidance, from the workflow note to the coordinate example. The example is somewhat lengthy, but it directly addresses a common source of errors and is worth the space.

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?

Given the complexity of the tool and no output schema, the description covers all necessary aspects: prerequisite workflow, coordinate system, shape-specific semantics, and return value. It does not mention error handling or edge cases, but those are less critical for this tool.

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

Parameters5/5

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

The schema only briefly documents 'output' and 'clipboard'; the description adds critical semantics for 'marks', including point order for each shape type and a concrete coordinate example. This transforms an otherwise opaque parameter array into a usable specification.

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

Purpose5/5

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

The description clearly states 'Draw on a screenshot you already took, then copy it to the clipboard and show it to the user', specifying the exact verb, resource, and side effects. It distinguishes itself from siblings like 'take_screenshot' by operating on an existing screenshot and producing annotated output.

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

Usage Guidelines4/5

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

Explicitly instructs 'Call take_screenshot first', establishing a clear prerequisite workflow. It also details coordinate semantics and shape-specific point order, implying when to use this tool. While it doesn't list alternative tools, the context is clear enough to avoid misuse.

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

apply_layoutA

Move and resize windows to build a layout. Each item places one window: 'app' is the app name (fuzzy matched), optional 'title' filters windows of that app by title substring, optional 'screen' is the monitor index from get_state (each monitor can get its own layout — just send items with different 'screen' values; defaults to the screen the window is currently on), 'frame' is {x,y,w,h} as fractions 0..1 of that screen's visible area with origin at TOP-LEFT (left half = {x:0,y:0,w:0.5,h:1}; bottom-right quarter = {x:0.5,y:0.5,w:0.5,h:0.5}; centered 60% = {x:0.2,y:0.15,w:0.6,h:0.7}). Windows are unminimized if needed. Returns per-item success/errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYes

TDQS

A4.2/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. It discloses that windows are unminimized, app matching is fuzzy, and returns per-item success/errors. It also specifies coordinate origin and fraction semantics. However, it doesn't mention side effects on existing layouts or persistence, but the provided details are substantial.

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?

The description is a single dense paragraph packed with useful information. It lacks visual structure like bullet points, but every sentence contributes value. While it could be better organized, it is not verbose or redundant.

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?

The description covers the core behavior, return value indication, and multi-screen support. It doesn't mention edge cases or failure handling beyond per-item errors, but given the complexity and lack of output schema, it is quite complete. It also distinguishes from related tools indirectly.

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

Parameters5/5

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

The description enriches parameter understanding beyond the schema: 'app' is fuzzy matched, 'screen' defaults to current screen and comes from get_state, 'frame' uses fractions with top-left origin and provides concrete examples. This adds significant meaning beyond the schema's simple descriptions.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Move and resize windows to build a layout.' This is a specific verb+resource that distinguishes it from siblings like snap_window (single window) and apply_saved_layout (predefined layout). The description also explicitly mentions multi-screen support, further clarifying scope.

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 explains how to use the tool via the 'items' array and parameter details, but it does not explicitly state when to use this tool versus alternatives. It doesn't contrast with apply_saved_layout or snap_window, leaving usage context implied rather than stated.

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

apply_saved_layoutA

Launch a saved workspace by name. Legacy name kept for older clients — new integrations should call launch_workspace, which adds a 'screen' option to pull the whole workspace onto one monitor. Opens every app that is not running, waits for its windows, and moves them into the saved positions; macOS cannot open an app straight into a position, so windows appear first and jump into place. Returns per-app success and reports apps that never opened a window. Takes up to a minute for a large workspace.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

TDQS

A4.8/5.0
Behavior5/5

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

No annotations are provided, so the description fully carries the burden. It discloses the macOS limitation (windows appear then jump), the return of per-app success, and the timeout for large workspaces. This is comprehensive behavioral information beyond 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?

The description is longer than necessary but every sentence adds value: purpose, legacy note, behavior, platform quirk, return info, and latency. It is front-loaded with the primary action and remains structured, though slightly verbose.

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

Completeness5/5

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

For a simple tool with one parameter and no annotations or output schema, the description covers all essential aspects: what it does, how it behaves, what it returns, performance caveats, and sibling differentiation. It is complete for effective selection and invocation.

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?

With only one string parameter and zero schema description coverage, the description explains 'by name' to indicate the parameter refers to the saved workspace name. It could add format specifics (e.g., exact matching), but the meaning is clear enough.

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

Purpose5/5

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

The description clearly states the tool launches a saved workspace by name, and distinguishes it from the successor launch_workspace, which adds a screen option. It uses a specific verb and resource, providing a clear, unambiguous purpose.

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

Usage Guidelines5/5

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

Explicitly instructs new integrations to use launch_workspace instead, giving clear guidance on when not to use this tool. It also describes the behavior of opening apps and waiting for windows, informing usage expectations.

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

assign_zone_setA

Assign a zone set (built-in or saved) to one monitor, so dragging a window there snaps to that set's zones. Each monitor keeps its own assignment; assigning replaces whatever that monitor used before and takes effect on the next drag. Omit 'name' to restore the default set (Halves); pass 'edge' for plain edge snapping instead of zones. Available set names and current per-monitor assignments are in get_state.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoZone set name, or 'edge' for edge snapping; omit for the default set
screenYesMonitor index (0 = primary)

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so thoroughly. It discloses that assigning replaces the monitor's previous assignment, takes effect on the next drag, and that omitting the name restores the default set. It also clarifies the 'edge' special value and where to discover valid set names.

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 concise and front-loaded with the primary purpose. Each of the four sentences contributes essential information: purpose, replacement/effect timing, parameter special cases, and where to find supported values. No redundant text or filler.

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

Completeness5/5

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

Given the tool's simplicity, two parameters, and no output schema, the description is complete. It covers purpose, side effects, timing, default behavior, special values, and a pointer to get_state for supported names and current assignments. No major behavioral gap remains.

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 input schema already documents both parameters, giving baseline 3. The description adds value by naming the default set ('Halves'), explaining per-monitor assignment semantics, and directing users to get_state for valid names, which goes beyond the schema's basic parameter definitions.

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

Purpose5/5

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

The description clearly states the verb and resource: assigning a zone set to a monitor. It differentiates the tool by explaining per-monitor assignments, replacement behavior, and special 'edge' and default-set handling, which distinguishes it from sibling tools like apply_layout.

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

Usage Guidelines4/5

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

The description provides clear context on when to use this tool: to assign a zone set to one monitor, with effect on next drag. It also explains optional behavior (omit name, pass 'edge') and points to get_state for available names, though it does not explicitly contrast with alternative sibling tools.

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

check_for_updateA

Ask Plonk whether a newer release exists, and report what is installed. Use this when the user asks what version they run, whether Plonk is up to date, or before calling install_update — which refuses unless a newer release is already on offer. The check is a network round trip to the GitHub releases API, so this returns immediately with the state as it stands and the result lands a moment later: read it back from get_state's 'update' key, or wait for an 'update' event on the change stream. If the user has turned update checks off, this fails with 409 rather than dialling out on their behalf — Plonk promises a process that only listens, and the user can still check by hand on its Updates page; report that back instead of retrying. Returns {installed, latest?, available, phase, status, automatic, notes?, page?}: 'available' is true only when 'latest' is newer than 'installed', 'phase' is idle|checking|available|downloading|verifying|installing|failed, and 'status' is a sentence fit to show the user.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It reveals that the check is a network round trip, returns immediately with the current state, and the final result arrives asynchronously via get_state's 'update' key or an 'update' event. It also documents the 409 failure mode when update checks are disabled, and explains the meaning of the return fields. No annotation contradiction exists.

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?

The description is long (around 250 words) but information-dense and front-loaded, starting with purpose, then usage, then behavior, then return format. Every sentence adds context relevant to an agent's decision. While somewhat lengthy, the absence of annotations and output schema justifies the extra detail.

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

Completeness5/5

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

The description fully covers the tool's behavior, return values, asynchronous nature, failure mode, and relationship to sibling tools. Since there is no output schema, it explains the exact return fields and their semantics. It also tells the agent how to read the result later via get_state or an event, making it complete for practical use.

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 and the schema is empty, so schema coverage is effectively 100%. The description does not need to explain parameters; the baseline of 4 applies because there is nothing to add. It does, however, describe the return object, which is useful given no output schema.

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

Purpose5/5

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

The description clearly states the tool's function: 'Ask Plonk whether a newer release exists, and report what is installed.' It uses a specific verb and resource, and distinguishes itself from the sibling tool install_update by noting it is a pre-check and that install_update refuses unless a newer release is already available.

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

Usage Guidelines5/5

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

Explicit usage guidance is provided: 'Use this when the user asks what version they run, whether Plonk is up to date, or before calling install_update.' It also gives an exclusion: if update checks are off, it fails with 409 and the agent should report back instead of retrying. This clearly outlines when to use this tool versus alternatives like get_state.

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

delete_layoutA

Delete the saved workspace with that name, whether it was saved with save_layout or save_workspace. Legacy name kept for older clients — new integrations should call delete_workspace, which does the same. Use it to clean up saved workspaces that are no longer wanted; existing names are listed in get_state.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

TDQS

A4.4/5.0
Behavior4/5

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

There are no annotations, so the description carries the burden. It explicitly says it deletes saved workspaces, which conveys destructive nature. It also mentions it deletes both layouts and workspaces saved by different tools. However, it doesn't describe error handling or permissions, so a 4 seems appropriate.

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 three sentences long, front-loaded with the core action, and every sentence adds value: action, legacy context, and usage guidance. No redundancy or 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?

Given the tool's simplicity (one required parameter, no output schema, no annotations), the description provides sufficient context: what it does, when to use it, where to find names, and an alternative. It doesn't explain return values or error behavior, but such details are less critical for a straightforward delete operation.

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?

With 0% schema_description_coverage, the description compensates by explaining that the 'name' parameter refers to a saved workspace and that existing names can be found via get_state. This adds semantic meaning beyond the schema's bare 'name' property.

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

Purpose5/5

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

The description explicitly states 'Delete the saved workspace with that name', which clearly defines the action and object. It also clarifies the scope by mentioning both save_layout and save_workspace, leaving no ambiguity.

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

Usage Guidelines4/5

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

It provides usage guidance: 'Use it to clean up saved workspaces that are no longer wanted' and points to get_state for existing names. It also gives an alternative for new integrations (delete_workspace), which helps decision-making.

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

delete_workspaceA

Delete a saved workspace by name. Use this to clean up workspaces you created that are no longer wanted.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

TDQS

A3.8/5.0
Behavior2/5

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

With no annotations, the description must convey behavioral traits. It only states the action without mentioning irreversibility, side effects on associated data, permissions required, or any confirmation steps. The user is left unaware of potential destructive consequences beyond the simple delete.

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 long, direct, and without unnecessary details. It effectively conveys the essential 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?

For a simple delete operation, the description covers the primary purpose and appropriate usage. It lacks explicit mention of irreversibility or what happens to the workspace's contents, but given the absence of an output schema and the tool's simplicity, it is reasonably complete.

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?

The schema shows a single 'name' string parameter. The description adds that deletion is 'by name', but does not clarify whether this is the display name, a unique identifier, or if there are any validation rules. It offers minimal additional meaning beyond the schema.

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

Purpose5/5

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

The description clearly states the action ('Delete a saved workspace by name') and distinguishes it from other delete tools by specifying 'workspace'. It is specific and unambiguous.

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

Usage Guidelines4/5

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

It provides a clear usage context: 'Use this to clean up workspaces you created that are no longer wanted.' This implies when to use it, though it does not explicitly mention alternatives or when not to use it.

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

delete_zone_setA

Delete a saved zone set by name. Any monitor currently using it falls back to the default set (Halves), so snapping keeps working. Only sets made with save_zone_set can go: the built-ins (Halves, Thirds, 60 / 40, Quarters, Priority) are refused. Deleting is immediate and cannot be undone — the zones would have to be described again. Saved sets and their per-monitor assignments are listed in get_state; use assign_zone_set instead when a monitor should merely stop using a set that others still need.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesSaved zone set name, as shown in get_state

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries the full transparency burden. It discloses that deletion is immediate and irreversible, that monitors fall back to the default set (Halves), and that built-ins are refused. These are crucial behavioral traits for a destructive operation.

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 three concise sentences, each serving a distinct purpose: action+fallback, scope, and irreversibility+alternative. There is no fluff, and the most important information is front-loaded.

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

Completeness5/5

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

For a simple one-parameter delete tool with no output schema, the description covers all necessary aspects: what it does, side effects, constraints, and when to use an alternative. It is complete enough for an agent to invoke correctly without ambiguity.

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 schema already covers the parameter (100% coverage) with 'Saved zone set name, as shown in get_state'. The description adds the critical constraint that only sets made with save_zone_set are valid, and that built-ins are excluded, going beyond the schema. It provides meaningful semantic enrichment.

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

Purpose5/5

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

The description clearly states the tool deletes a saved zone set by name, specifies it only applies to user-saved sets (not built-ins), and distinguishes it from assign_zone_set. The verb 'delete' and resource 'zone set' are explicit, and the scope is well-defined.

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

Usage Guidelines5/5

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

Provides clear guidance on when to use the tool (to delete a set) and when not to use it: 'use assign_zone_set instead when a monitor should merely stop using a set that others still need.' This explicit alternative makes the usage context highly actionable.

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

extract_textA

Read the words off the screen, or off a saved image, and return them as text. Recognition runs on the Mac itself and nothing is uploaded. Prefer this over take_screenshot whenever the answer is words rather than a picture — an error dialog, a log, a terminal, a table, text baked into an image or a paused video, a PDF page in a viewer that will not let text be selected. It costs a fraction of the tokens an image does and does not depend on reading pixels correctly. Use take_screenshot instead when layout, colour or 'what does this look like' is the question. mode 'screen' captures everything with no user interaction; 'region' and 'window' hand the user the native crosshair or window picker and wait for them, up to five minutes. Pass 'path' instead of a mode to read an image already on disk, including one take_screenshot just wrote. Returns 'text' (every line in reading order, top to bottom) and 'lines' — each with the recognized string, Vision's 0..1 'confidence', and 'box' {x,y,w,h} as fractions 0..1 of the image with origin at TOP-LEFT. Those boxes share the coordinate space annotate_screenshot draws in, so a line can be circled where it was found by passing the same path to that tool. The text is also copied to the clipboard unless 'clipboard' is false. An area with no readable text returns ok with an empty 'text' and a 'note' rather than an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoWhat to capture; ignored when 'path' is givenregion
pathNoRead this image file instead of capturing (.png, .jpg)
clipboardNoCopy the recognized text to the clipboard (default true)
languagesNoBCP-47 tags to recognize, most likely first, e.g. ['uk-UA','en-US']. Omit to use the user's configured choice. Which are available depends on the macOS version; get_state lists the current setting under 'text_languages'

TDQS

A4.9/5.0
Behavior5/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 so thoroughly. It discloses local-only processing ('nothing is uploaded'), interactive mode behavior with a five-minute wait, clipboard copying, the returned text and lines structure with confidence and boxes, coordinate-space compatibility with annotate_screenshot, and the ok-with-empty-text behavior for areas with no readable text.

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 dense but well-organized, front-loading the core purpose and usage guidance before diving into mode specifics and return values. Every sentence adds useful information, and nothing is redundant with the schema.

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

Completeness5/5

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

Despite having no output schema and no annotations, the description sufficiently explains return values ('text' and 'lines' with confidence and boxes), coordinate conventions, clipboard side effects, interaction timing, and empty-result behavior. For a tool of this complexity, this is complete enough for an agent to invoke it correctly and interpret results.

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 meaningful behavioral context beyond the schema: mode screen needs no user interaction, region/window open a native picker and wait up to five minutes, path can be supplied by take_screenshot, and clipboard defaults to true. It does not add material language-parameter semantics, but the schema already covers those fully.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Read the words off the screen, or off a saved image, and return them as text.' It explicitly distinguishes this tool from take_screenshot, making its unique role clear even alongside 22 sibling tools.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: 'Prefer this over take_screenshot whenever the answer is words rather than a picture' and lists concrete cases like error dialogs, logs, terminals, and PDFs. It also names the exact alternative for visual questions: 'Use take_screenshot instead when layout, colour or what does this look like is the question.'

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

get_stateA

Get the current desktop state: all screens/monitors (index, frame, visible area — coordinates have origin at top-left of the primary screen, y grows down), all open windows (app name, title, which screen it is on, absolute frame, and 'fraction' — its position as fractions 0..1 of that screen's visible area), saved layout names, whether keep-awake is on, and 'disabled_features': the modules the user switched off in Plonk (zones, workspaces, shot, ruler, awake, active and so on). A tool belonging to one of those fails with an error saying so until the user switches it back on. ALWAYS call this first before applying a layout, to see which apps are running and how many monitors there are.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

No annotations are provided, so description carries full burden. It discloses coordinate origin and y-axis direction, fraction semantics (0..1 of visible area), and the behavioral consequence of disabled_features (tools fail with an error until re-enabled). This is far beyond minimal and anticipates agent confusion.

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?

The description is long but every clause adds needed information given the complexity of the return state. It is front-loaded with the main purpose and uses parenthetical explanations effectively. Slightly dense but not padded.

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

Completeness5/5

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

There is no output schema, so the description must fully explain return values. It covers screens/monitors, windows, layout names, keep-awake, and disabled_features, and even clarifies coordinate system and fraction semantics. Given complexity, this is complete and self-sufficient.

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?

Tool has zero parameters, and schema is empty, so the description needs no parameter details. Baseline for 0 params is 4; the description properly focuses on the rich return state instead.

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

Purpose5/5

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

Clear verb+object: 'Get the current desktop state' with explicit enumeration of contents (screens, windows, layouts, keep-awake, disabled_features). Distinct from siblings like apply_layout or save_workspace, which are actions; this is a read-only state retrieval.

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

Usage Guidelines5/5

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

Explicitly states 'ALWAYS call this first before applying a layout' and explains why: to see which apps are running and how many monitors there are. Also warns that disabled features cause tool failures, so calling this first reveals that context. Provides actionable when-to-use guidance.

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

install_updateA

Install the release that check_for_update found: Plonk downloads the build, checks it is signed with the same certificate as the running copy, swaps the bundle in, and relaunches itself. Prefer this over telling the user to download a build by hand — the signature check is also what preserves their Accessibility and Screen Recording grants, which a hand-installed copy can lose. Ask the user before calling it: it quits the app, so any window arrangement in flight stops and the local API is unreachable for a few seconds until the new copy is up. It fails without touching the installed copy when no newer release is on offer (call check_for_update first), when the user has update checks switched off (409 — installing downloads a build, so it is bound by the same promise as the check; they can install from Plonk's Updates page), when the download does not match the release or its signature, or when Plonk.app sits somewhere the user cannot write. Returns the same shape as check_for_update plus {installing: true} once the swap has started; poll get_state afterwards to confirm the new version came up.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description fully shoulders the burden. It discloses side effects (quits app, stops window arrangement, API unreachable), failure conditions (no release, 409, signature mismatch, write permissions), and the signature check preserving Accessibility/Screen Recording grants. No annotation contradiction present.

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 long but every sentence adds necessary context: action, rationale, side effects, failure modes, return value. It is front-loaded with the main action and remains organized despite its density.

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

Completeness5/5

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

Given no annotations and no output schema, the description covers prerequisites, side effects, failure conditions, and return shape. It is fully self-contained for an agent to safely invoke the tool.

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 adds no parameter details because none exist, and the schema coverage is trivially complete. There is nothing missing that the description should compensate for.

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

Purpose5/5

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

The description states a specific action ('Install the release that check_for_update found') with a clear resource and distinguishing detail. It differentiates from siblings like check_for_update by describing the full installation sequence.

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

Usage Guidelines5/5

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

Explicitly provides when-to-use guidance: 'Prefer this over telling the user to download a build by hand' and instructs to 'Ask the user before calling it.' It also names prerequisites (call check_for_update first) and alternatives, making usage context clear.

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

launch_workspaceA

Launch a saved workspace: opens every app that is not running, waits for its windows, and moves them into the saved positions. Each window returns to the monitor it was captured on, so a workspace spanning several displays comes back spanning them. macOS cannot open an app straight into a position, so windows appear first and jump into place. Returns per-app success, and reports apps that never opened a window. Takes up to a minute for a large workspace.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
screenNoPull the whole workspace onto this monitor instead of the ones it was captured on. Use when a display is no longer attached, or to move a setup to another screen.

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description fully discloses side effects (opening apps), the macOS quirk (windows jump into place), the per-app success reporting, and the up-to-a-minute wait time for large workspaces.

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 detailed yet efficient, with each sentence contributing unique information (launching, positioning, macOS limitation, return values, timing). No redundant or verbose content.

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

Completeness5/5

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

The description covers the entire behavior: what it does, how it handles limitations, what it returns (per-app success and failure reports), and the expected duration. This gives the agent full context to decide on invocation and interpret results.

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 schema provides type and description for 'screen', but 'name' lacked a description. The tool description's reference to 'saved workspace' gives enough context to infer that 'name' identifies the workspace to launch, adding semantic value beyond the raw schema.

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

Purpose5/5

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

The description clearly states the tool's purpose: launching a saved workspace by opening non-running apps, waiting for windows, and positioning them. It distinguishes from similar tools like apply_saved_layout by explicitly mentioning app launching.

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

Usage Guidelines4/5

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

The description provides strong usage context, including macOS limitations and timing expectations. It implies when to use this tool (to restore a workspace with apps), though it does not explicitly compare with alternative tools.

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

measure_screenA

Measure the screen in points and pixels, without taking a picture of it. Plonk photographs the screen once and walks out from the given point in all four directions until one pixel is unlike the one before it, which is where an edge is. What comes back is how far the point could travel each way: the run across and the run down. Prefer this over take_screenshot whenever the answer is a number: how wide that sidebar is, how tall that row is, how big the gap between two things is, is that tap target 44 points. An image costs far more tokens and still has to be eyeballed. Use extract_text when the answer is words, and take_screenshot when it is 'what does this look like'. Read the result honestly: these are two independent runs through one point, not the outline of an element. Inside a plain rectangle they are its width and height; inside a gap they are the gap; on a large flat background they run until something else is in the way, which may be most of the screen. When the exact bounds of a specific element matter, pass 'interactive' and let the user point at it. Three ways to ask. Pass 'point' for the runs through one place. Pass 'from' and 'to' for the straight-line distance between two places, which needs no capture at all. Pass 'interactive' to hand the user the ruler and wait up to five minutes while they measure it themselves. Points are fractions 0..1 of the screen's visible area with origin at TOP-LEFT, the same space apply_layout and save_zone_set use, so {x:0.5,y:0.5} is the middle of the screen. Returns 'points' {x,y,w,h} in screen points (absolute, origin top-left of the primary display) where w is the run across and h the run down, 'pixels' {w,h} in the display's own pixels — twice the points on a Retina screen, which is the difference that matters when checking an asset — 'fraction' {x,y,w,h} of that screen's visible area ready to hand to apply_layout, 'scale', and 'text', the same line Plonk shows the user. A distance also carries 'distance' and 'distance_pixels'. Needs macOS Screen Recording permission, the same as a screenshot; without it the call fails rather than guessing. What is measured is a still taken when the call started, so a screen that is animating measures as it was at that moment.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoThe other end of a distance, in the same fractions as 'point'
fromNoOne end of a distance, in the same fractions as 'point'
pointNoWhere to measure from, as fractions 0..1 of the screen's visible area, origin TOP-LEFT. {x:0.5,y:0.5} is the middle of the screen
screenNoMonitor index from get_state (0 = primary, the default). Every point is a fraction of this screen
toleranceNoHow different one pixel must be from the pixel beside it, on a scale of 255, to count as an edge. Omit to use the user's setting (10 by default). Lower stops at fainter borders and finds smaller things; raise it for a photograph or video, where every pixel differs a little from the last
interactiveNoHand the user the ruler instead of measuring a given point: they hover, drag, click to copy and press Escape, and the last measurement comes back. The one to use when it is their screen and their judgement of what to measure. Waits up to five minutes

TDQS

A4.8/5.0
Behavior5/5

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

No annotations are provided, so the description carries full burden. It discloses that the tool takes a still at call start (so animating screens are measured as of that moment), requires macOS Screen Recording permission and fails without it, returns two independent runs not an outline, and explains edge detection behavior (tolerance, large flat backgrounds). It also notes the interactive mode waits up to five minutes. This is comprehensive behavioral disclosure.

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?

The description is long but every sentence adds value. It is front-loaded with the core purpose, then usage guidance, then behavioral details, then parameter semantics. While it could be slightly more concise, the density of useful information justifies the length. No filler or repetition.

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

Completeness5/5

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

Given the tool's complexity (6 parameters, 3 modes, nested objects, no output schema), the description is remarkably complete. It explains the return structure (points, pixels, fraction, scale, text, distance), the difference between points and pixels on Retina, the coordinate system, edge detection behavior, permission requirements, and timing semantics. It also covers all three usage modes and their appropriate contexts. The absence of an output schema makes this description essential, and it delivers.

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 description coverage is 100%, so baseline is 3. The description adds significant value beyond the schema: it explains the coordinate system (fractions 0..1, origin top-left, same as apply_layout), the meaning of 'point' vs 'from'/'to' vs 'interactive', and the tolerance parameter's effect (lower stops at fainter borders, raise for photos/videos). It also clarifies the 'screen' parameter's default and relationship to get_state. This exceeds the baseline.

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

Purpose5/5

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

The description clearly states the tool measures screen dimensions in points and pixels without taking a picture, and explicitly distinguishes it from take_screenshot and extract_text. It specifies the verb (measure), resource (screen), and scope (runs from a point in four directions), making it distinct from siblings.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use guidance: 'Prefer this over take_screenshot whenever the answer is a number' and names alternatives: 'Use extract_text when the answer is words, and take_screenshot when it is what does this look like'. It also explains the three modes (point, from/to, interactive) and when to use each, including the interactive mode for user judgment.

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

save_layoutA

Save the named window arrangement as a workspace. Legacy name kept for older clients — new integrations should call save_workspace, which can also record whether running apps get moved into place. Omit 'items' to snapshot the windows exactly as they are on screen right now; pass 'items' to describe the arrangement explicitly. Saving over an existing name replaces it. Saved workspaces are listed in get_state, with their full contents.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesWorkspace name, e.g. 'work', 'focus'
itemsNo

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations, the description discloses key behaviors: overwriting existing workspaces ('Saving over an existing name replaces it') and that saved workspaces appear in get_state. It hints at legacy status but does not discuss potential side effects like requiring certain permissions or error handling. This is sufficient for a save operation but not exhaustive.

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?

All four sentences are packed with unique, actionable content. Opens with purpose, then usage, then behavior, then post-save information. No redundancy or filler.

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

Completeness5/5

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

For a tool with just two parameters and no output schema, the description covers purpose, alternatives, parameter semantics, overwrite behavior, and downstream discovery via get_state. It is self-contained and requires no further clarification.

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

Parameters5/5

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

Adds critical meaning beyond schema: explains that omitting 'items' snapshots current screen state, while passing 'items' explicitly describes the arrangement. Also clarifies that overwriting happens, which is not in schema. The schema only names parameters; the description enriches the 'items' semantics significantly.

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

Purpose5/5

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

Clear verb+resource: 'save the named window arrangement as a workspace'. Explicitly distinguishes itself from save_workspace by labeling itself as legacy and pointing to the alternative, which removes ambiguity.

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

Usage Guidelines5/5

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

Directly states when to use save_workspace instead ('new integrations should call save_workspace') and explains the difference ('can also record whether running apps get moved into place'). Also gives a clear use-case distinction for omitting vs passing 'items' to control snapshot vs explicit arrangement.

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

save_workspaceA

Save a workspace: the apps of a desktop setup, where each window goes, and what each app should open. Pass 'items' to describe the arrangement, or omit them to snapshot the windows exactly as they are on screen right now. Saving over an existing name replaces it. Saved workspaces are listed in get_state, with their full contents.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesWorkspace name, e.g. 'work', 'writing'
itemsNo
move_existingNoWhen true (the default), an app that is already running has its windows moved into place. When false, running apps are left alone and only missing apps are launched.

TDQS

A4.4/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 of behavioral disclosure. It transparently states that saving over an existing name replaces it, and that omitting 'items' snapshots the current windows. It also links to get_state for listing saved workspaces. Although it doesn't mention permissions or irreversible side effects beyond replacement, it covers the essential mutating behavior adequately.

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 concise and front-loaded with the purpose, followed by usage modes and key behaviors. It consists of four focused sentences without any fluff or redundancy. Every sentence adds value: definition, usage modes, overwriting behavior, and discoverability via get_state. This is an exemplary level of conciseness.

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?

Given the complexity of the items structure and the lack of an output schema, the description covers the essential concepts: what a workspace is, how to specify it or snapshot it, replacement behavior, and where it appears in get_state. It does not detail error conditions or all sub-properties, but the schema handles those. The description is complete enough for an agent to confidently invoke this tool.

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 description adds meaning to the 'items' parameter by clarifying its purpose ('Pass items to describe the arrangement') and the alternative of omitting it, which is not fully evident from the schema alone. It does not explicitly discuss 'move_existing', but the schema provides a clear description for that parameter. With schema coverage at 67%, the description compensates for the missing top-level items description, making parameter semantics effective.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Save a workspace' with a detailed definition of what a workspace includes (apps, window placement, and content to open). It effectively distinguishes this from sibling save tools like save_layout and save_zone_set by specifying the resource and scope. The verb 'save' combined with the resource 'workspace' is specific and unambiguous.

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

Usage Guidelines4/5

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

The description explains when to use the tool and provides two usage modes: passing 'items' to describe the arrangement or omitting them to snapshot the current screen. It also mentions overwriting behavior. While it doesn't explicitly list alternatives or when-not-to-use, the context is clear enough given the sibling set, so it earns a solid score.

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

save_zone_setA

Create or replace a named zone set used for drag snapping. Zones are rectangles {x,y,w,h} as fractions 0..1 of a screen's visible area, origin TOP-LEFT; each zone must stay inside the screen, but zones may overlap each other (the smallest one under the cursor wins). Pass 'screen' to also assign the set to that monitor so it becomes active immediately. Pass 'gap' to give this set its own spacing around windows in points, or null to make it follow the default gap again; omitting it keeps whatever the set had. Built-in sets already exist: Halves, Thirds, 60 / 40, Quarters, Priority.

ParametersJSON Schema
NameRequiredDescriptionDefault
gapNoThis set's own gap in points; null follows the default gap (get_state.zone_gap); omit to leave unchanged
nameYesZone set name, e.g. 'coding'
zonesYes
screenNoMonitor index to assign this set to (0 = primary)

TDQS

A4.8/5.0
Behavior5/5

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

The description thoroughly discloses behavior: creation vs replacement, zone constraints (inside screen, overlap allowed), active assignment via screen, gap semantics (own vs default), and existence of built-in sets. No annotations were provided, so the description bears full responsibility, and it meets that responsibility well.

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 concise, well-organized, and free of fluff. It progresses logically from purpose to zone definition to parameter special cases, covering all essential points without wordiness.

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

Completeness5/5

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

The description is complete for its complexity: it covers purpose, parameters, behaviors, and edge cases. No output schema is present, so no return documentation is needed. It provides sufficient context for an agent to use the tool correctly.

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

Parameters5/5

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

The description adds substantial meaning beyond the schema. It explains the zone coordinate system and overlap rule, clarifies the special meaning of 'screen' (assign and activate) and 'gap' (set or follow default, and omission behavior). This is far more informative than the schema's brief descriptions.

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

Purpose5/5

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

The description clearly states the tool's function: 'Create or replace a named zone set used for drag snapping.' It distinguishes from sibling tools by focusing on zone sets and provides details about zone coordinates, which is specific and unambiguous.

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

Usage Guidelines4/5

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

The description explains when to use the tool implicitly by outlining its purpose (create or replace) and describes special parameter behaviors (screen, gap). It does not explicitly contrast with sibling tools like assign_zone_set, but the name and content make the use case clear enough for an agent to decide.

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

select_agentA

Make an agent the user's active one in Plonk. Omit 'name' to select this client itself; pass "" to clear the choice so any agent may drive. The active agent shows in Plonk's menu bar and settings, and is where voice and other outgoing requests will go. With 'exclusive' true the app also rejects window and settings changes from every other agent (they can still read state and take screenshots). Connected agents are listed in get_state under 'agents'.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoAgent name from get_state's 'agents'; omit for this client, "" to clear
exclusiveNoAlso turn 'only the active agent controls' on or off

TDQS

A4.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. It discloses key side effects: the active agent shows in menu bar/settings, outgoing requests go there, and with exclusive mode other agents cannot change window/settings but can still read state and take screenshots. This is good transparency, though it doesn't explicitly state the default behavior when exclusive is false, which is slightly implied.

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 three sentences, each serving a purpose: the first states the core function, the second explains agent selection and its visual impact, and the third covers the exclusive option and a way to discover agents. It is front-loaded with the main verb and resource, and every sentence adds value with no fluff.

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

Completeness5/5

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

For a two-parameter tool with no output schema and no annotations, the description is remarkably complete. It covers all parameter behaviors, the user-visible effects, the exclusive mode restrictions, and where to find valid agent names. There are no significant gaps for an agent to misuse this tool.

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

Parameters5/5

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

Although the schema already describes both parameters, the description enriches them significantly: it explains the three legal values for 'name' (specific agent, omit, empty string) and the nuanced effect of 'exclusive' (rejects changes from others, but allows reads/screenshots). This goes beyond the schema's simple field descriptions.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Make an agent the user's active one in Plonk.' It specifies the verb 'make' and the resource 'active agent', and differentiates from siblings like set_active by explaining the unique semantics of selecting, clearing, and exclusive mode.

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

Usage Guidelines5/5

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

Provides explicit usage patterns: omitting 'name' selects the client itself, passing an empty string clears the choice, and 'exclusive' true adds extra restrictions. It also directs users to get_state to list agents, which is a helpful pointer. This is clear enough for an agent to know when and how to use it.

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

set_activeA

Turn stay-active on or off, so chat apps go on showing the user as available instead of Away. Pick this over 'set_awake' by what is being protected: set_awake holds a power assertion and stops the Mac sleeping, which does nothing for a Slack or Teams status; set_active resets the system idle timer by posting a Shift keypress every two minutes, which is what those apps actually read. Resetting the idle timer also postpones sleep, so stay-active implies keep-awake and there is no need to turn both on. Two ways to end the session: 'until' ends it at a wall-clock time ('17:00', or an ISO-8601 timestamp); 'minutes' ends it after a countdown. Give neither and it runs until switched off, or until the user's configured default timeout expires. This only starts and ends sessions. The recurring schedule (hours and weekdays) and the list of apps that arm it automatically are settings on the Stay active page, not parameters here; get_state reports both under 'active_details'. Switching it by hand overrides the schedule until the schedule itself next changes, so turning it off during scheduled hours lasts until those hours end rather than being undone on the next tick. Returns 'active', whether a keypress is actually being posted right now, and 'status', what happened in words. Those differ when Plonk has no Accessibility permission (nothing can be posted) or when the user disallowed running on battery and the Mac is unplugged; neither is reported as an error, since the request was understood. An 'until' that has already passed is an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
onYes
untilNoEnd at a time of day, e.g. '17:00' (the next such moment — tomorrow if today's has passed), or an ISO-8601 timestamp like '2026-08-08T17:00:00Z'
minutesNoEnd the session after this many minutes

TDQS

A5/5.0
Behavior5/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 so thoroughly. It discloses the mechanism (Shift keypress every two minutes), the impact on idle time and sleep, that it only starts and ends sessions, the schedule override behavior, and that certain conditions (no Accessibility permission, battery restrictions) are not reported as errors but surfaced via 'active' and 'status'. This level of transparency is exceptional.

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?

Although lengthy, every sentence adds value: purpose, distinction, mechanism, duration options, edge cases, and return values are all covered without redundancy. The structure is logical, front-loaded with the core purpose, and efficiently uses paragraphs to group related concepts.

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

Completeness5/5

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

Given 3 parameters, no output schema, and no annotations, the description is remarkably complete. It explains all parameters, return values ('active' and 'status'), error handling (non-error conditions), interaction with the schedule, and the relationship with set_awake. Nothing essential is omitted for an agent to correctly invoke and interpret the tool.

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

Parameters5/5

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

The description adds significant meaning beyond the schema. It explains 'until' with examples ('17:00', ISO-8601 timestamp) and clarifies that it ends at the next such moment, defines 'minutes' as a countdown, and explains the 'neither' case (runs until switched off or default timeout). This enriches the schema where the 'on' parameter has no description.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Turn stay-active on or off, so chat apps go on showing the user as available instead of Away.' It distinguishes itself from sibling set_awake by explaining the mechanism (posting a Shift keypress every two minutes) and why it's the correct choice for chat app status, making the purpose specific and unambiguous.

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

Usage Guidelines5/5

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

Explicitly tells when to use this tool over set_awake ('Pick this over set_awake by what is being protected') and explains the relationship between them ('stay-active implies keep-awake and there is no need to turn both on'). It also provides clear guidelines on choosing duration parameters ('until' vs 'minutes') and states the default behavior when neither is given.

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

set_awakeA

Turn keep-awake on or off, so the Mac does not sleep part-way through something. Three ways to end the session, in order of preference: 'pid' ends it the moment that process exits — best by far when something is running, because a build or a render knows when it is finished and nothing is left holding the machine awake afterwards; 'until' ends it at a wall-clock time ('17:00', or an ISO-8601 timestamp); 'minutes' ends it after a countdown. Give none of them and it runs until switched off. Behavior also follows the user's settings: keep-awake may pause on battery or engage automatically while charging, so the returned 'status' is what actually happened and 'awake' is whether an assertion is held right now. The menu bar icon glows while it is. A process-bound session is deliberately not restored if Plonk restarts, since the pid would mean nothing by then. Errors come back for a pid that is not running or a time that has already passed.

ParametersJSON Schema
NameRequiredDescriptionDefault
onYes
pidNoEnd when this process exits. Use the pid of the long job being waited on; get_state lists a pid for every open window
untilNoEnd at a time of day, e.g. '17:00' (the next such moment — tomorrow if today's has passed), or an ISO-8601 timestamp like '2026-08-08T17:00:00Z'
minutesNoEnd the session after this many minutes

TDQS

A5/5.0
Behavior5/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 so thoroughly: it discloses that user settings may pause or auto-enable keep-awake, that the returned 'status' reflects reality, that the menu bar icon glows, that process-bound sessions are not restored after restart, and that errors occur for invalid pids or past times.

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 substantial but every sentence earns its place: purpose, end-condition modes, external settings, return semantics, restart behavior, and error cases. It is front-loaded with the core purpose and then logically organized.

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

Completeness5/5

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

Given the tool has moderate complexity, no annotations, and no output schema, the description covers all essential context: what the tool does, how each parameter behaves, what the response fields mean, and what error cases exist. It is sufficient for an agent to select and invoke the tool correctly.

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

Parameters5/5

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

The description adds meaningful semantics beyond the schema, such as the preference ordering among pid/until/minutes, the 'best by far' guidance for running jobs, and the caveat about process-bound sessions not surviving restart. The schema descriptions are good, but the tool description enriches their practical meaning.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Turn keep-awake on or off, so the Mac does not sleep part-way through something.' This clearly distinguishes set_awake from sibling tools like get_state, set_active, or workspace/layout tools.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance by ranking the three end conditions in order of preference and explaining that 'pid' is 'best by far when something is running.' It also states the behavior when none are given, which covers the full usage space.

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

snap_windowA

Drop one window into a numbered zone of the snap-zone set assigned to that monitor. The numbers are the ones Plonk draws on the zones while a window is dragged, so 'the middle zone' of a three-zone set is 2. Zone sets and their per-monitor assignment are in get_state; use apply_layout instead when the user describes a size rather than a zone.

ParametersJSON Schema
NameRequiredDescriptionDefault
appYesApp name to match, e.g. 'Visual Studio Code'
zoneYes1-based zone number, as shown on the drag overlay
titleNoOnly windows whose title contains this substring
screenNoMonitor index; defaults to the one the window is on

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description must convey safety and side effects. It implicitly indicates a move/drop operation and clarifies zone numbering semantics (e.g., middle of three is 2) and where to find zone assignments (get_state). It does not explicitly state whether the operation is reversible or requires permissions, but for a window manager action, the description is sufficiently transparent about the effect on the window's position. A 4 is appropriate.

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 sentences, highly efficient. The first sentence states the core function, the second clarifies numbering and directs to alternatives. No wasted words.

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?

Given the tool has 4 params (all documented in schema), no output schema, and no annotations, the description covers the essential behavioral context: how zone numbers work, where to get zone sets (get_state), and when to use apply_layout instead. It could mention return behavior, but that's often unnecessary for manipulative tools. The description is complete enough for an agent to select and invoke it correctly.

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 description coverage is 100%, so baseline is 3. The description adds meaningful context beyond the schema: it explains how zone numbers are derived (from the drag overlay) and clarifies the relationship between the 'screen' parameter and window location. This enriches parameter understanding, justifying a 4.

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

Purpose5/5

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

The description clearly states the action (drop a window into a zone) and the resource (numbered zone of the snap-zone set on a monitor). It distinguishes itself from sibling tools by explicitly mentioning apply_layout for size-based layouts. This is specific and unambiguous.

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

Usage Guidelines5/5

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

It provides explicit guidance on when to use this tool (when user refers to a zone number) and when not to (use apply_layout for size descriptions). It also references get_state for zone set configuration, giving clear context. This meets the highest bar for usage guidance.

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

take_screenshotA

Capture the screen and return the image so it can be looked at. mode 'screen' captures everything (no user interaction); mode 'app' captures one named window and needs no user interaction either — pass 'app' and/or 'title_contains', and it works even when that window is behind others, minimized excepted, without raising it or taking focus; 'region' and 'window' hand the user the native crosshair/window picker and wait for them. Prefer 'app' whenever the user asks about a particular program ("what is playing in Spotify", "read the error in Xcode") — it is the only mode that can see a window the user cannot, and it does not disturb their desktop. Set annotate=true to open Plonk's drawing editor on the capture instead of returning it — use that when the user wants to mark the shot up themselves. Optional 'path' writes to an explicit file, otherwise the configured screenshot folder is used; 'clipboard' overrides the configured copy-to-clipboard behavior. The returned image is scaled down for legibility; the file at 'path' keeps full resolution. To draw on the result, pass that 'path' to annotate_screenshot.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNomode 'app': app name or bundle id, case-insensitive substring (e.g. 'Spotify')
modeNoscreen
pathNoExplicit output file path (.png)
annotateNoOpen the annotation editor instead of returning the image
clipboardNoAlso copy the capture to the clipboard
include_imageNoReturn the image content itself, so it can be inspected (default true)
title_containsNomode 'app': narrows to a window whose title contains this, for an app with several

TDQS

A4.7/5.0
Behavior4/5

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

The description clearly states that mode 'app' works even when the window is behind others (minimized excepted) without raising it or taking focus, while 'region' and 'window' require user interaction. It also reveals the returned image is scaled down while the file keeps full resolution — useful details not visible from schema or annotations. Missing a small amount of detail about clipboard/editor side effects, but for a screenshot tool this is strong disclosure.

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 paragraph but every sentence earns its place. It front-loads the core action and then advances through modes, preferences, annotation flow, path handling, and resolution behavior without fluff.

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

Completeness5/5

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

Given the tool is action-oriented with no output schema and a rich set of 7 parameters, the description covers when to use each mode, how to feed the capture into annotate_screenshot, the practical distinction between scaled image and original file, and explicit choice support for real agent scenarios.

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 schema already explains enum values, so the description adds meaning where schema is thin: it clarifies the interaction behavior for each mode, how 'app' and 'title_contains' interplay, and what annotate/path/clipboard do beyond their one-line schema descriptions. With 86% schema coverage, the description goes beyond baseline 3 rather than merely repeating schema.

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

Purpose5/5

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

The description names the verb ('Capture the screen and return the image') and specifies four distinct modes with concrete behaviors. It clearly distinguishes the tool from siblings like annotate_screenshot and extract_text by explaining when the capture is returned versus handed to the drawing editor.

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

Usage Guidelines5/5

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

The description gives explicit guidance: prefer mode 'app' when the user asks about a particular program, and use annotate=true when the user wants to mark the shot themselves. This creates a clear decision tree rather than just listing features.

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. Dates show when Glama detected each change.

  1. 18 tool updatesv0.3.0
    • Changedannotate_screenshot3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / marks / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / marks / items / properties / points / items / additionalProperties
        Removed value: -false
    • Changedapply_layout5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / items / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / items / items / properties / frame / additionalProperties
        Removed value: -false
      • addedInput schema / properties / items / items / properties / screen / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / items / items / properties / screen / minimum
        Added value: +-9007199254740991
    • Changedapply_saved_layout1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedassign_zone_set3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / screen / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / screen / minimum
        Added value: +-9007199254740991
    • Changeddelete_layout1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddelete_workspace1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddelete_zone_set1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedextract_text1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlaunch_workspace3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / screen / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / screen / minimum
        Added value: +-9007199254740991
    • Addedmeasure_screen
    • Changedsave_layout5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / items / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / items / items / properties / frame / additionalProperties
        Removed value: -false
      • addedInput schema / properties / items / items / properties / screen / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / items / items / properties / screen / minimum
        Added value: +-9007199254740991
    • Changedsave_workspace6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / items / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / items / items / properties / frame / additionalProperties
        Removed value: -false
      • addedInput schema / properties / items / items / properties / screen / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / items / items / properties / screen / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / items / items / properties / window_index / maximum
        Added value: +9007199254740991
    • Changedsave_zone_set5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / gap
        Added value: +{
        +  "anyOf": [
        +    {
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "This set's own gap in points; null follows the default gap (get_state.zone_gap); omit to leave unchanged"
        +}
      • addedInput schema / properties / screen / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / screen / minimum
        Added value: +-9007199254740991
      • removedInput schema / properties / zones / items / additionalProperties
        Removed value: -false
    • Changedselect_agent1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedset_active
    • Changedset_awake3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / minutes / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / pid / maximum
        Added value: +9007199254740991
    • Changedsnap_window4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / screen / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / screen / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / zone / maximum
        Added value: +9007199254740991
    • Changedtake_screenshot1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
  2. 3 tool updatesv0.2.2
    • Addedextract_text
    • Changedset_awake3 fields changed
      • changedInput schema / properties / minutes / description
        Previous value: -"Auto-off after this many minutes"New value: +"End the session after this many minutes"
      • addedInput schema / properties / pid
        Added value: +{
        +  "description": "End when this process exits. Use the pid of the long job being waited on; get_state lists a pid for every open window",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / until
        Added value: +{
        +  "description": "End at a time of day, e.g. '17:00' (the next such moment — tomorrow if today's has passed), or an ISO-8601 timestamp like '2026-08-08T17:00:00Z'",
        +  "type": "string"
        +}
    • Changedtake_screenshot3 fields changed
      • addedInput schema / properties / app
        Added value: +{
        +  "description": "mode 'app': app name or bundle id, case-insensitive substring (e.g. 'Spotify')",
        +  "type": "string"
        +}
      • changedInput schema / properties / mode / enum
        Previous value: -[
        -  "screen",
        -  "region",
        -  "window"
        -]New value: +[
        +  "screen",
        +  "app",
        +  "region",
        +  "window"
        +]
      • addedInput schema / properties / title_contains
        Added value: +{
        +  "description": "mode 'app': narrows to a window whose title contains this, for an app with several",
        +  "type": "string"
        +}
  3. 3 tool updatesv0.0.4
    • Addedcheck_for_update
    • Changeddelete_zone_set1 field changed
      • addedInput schema / properties / name / description
        Added value: +"Saved zone set name, as shown in get_state"
    • Addedinstall_update
  4. 16 tool updatesv0.1.0
    • First observedannotate_screenshot
    • First observedapply_layout
    • First observedapply_saved_layout
    • First observedassign_zone_set
    • First observeddelete_layout
    • First observeddelete_workspace
    • First observeddelete_zone_set
    • First observedget_state
    • First observedlaunch_workspace
    • First observedsave_layout
    • First observedsave_workspace
    • First observedsave_zone_set
    • First observedselect_agent
    • First observedset_awake
    • First observedsnap_window
    • First observedtake_screenshot

TDQS

A4.1/5.0
Disambiguation2/5

Multiple tools are exact duplicates: delete_layout/delete_workspace, save_layout/save_workspace, apply_saved_layout/launch_workspace. While descriptions note legacy names, the redundancy creates confusion and forces agents to track canonical names. extract_text vs take_screenshot also overlap in capturing the screen.

Naming Consistency3/5

Most tools follow a verb_noun pattern (get_state, save_workspace, delete_workspace, assign_zone_set), but the set mixes verbs like 'get', 'delete', 'extract', 'check', 'install', 'save', 'launch', 'apply', 'snap', 'assign', 'set', 'take', 'annotate', 'select'. This is varied but still readable. Legacy names (delete_layout, save_layout, apply_saved_layout) are inconsistent with their replacements.

Tool Count4/5

19 tools is on the heavier side but acceptable for a desktop automation server covering windows, workspaces, zone sets, screenshots, updates, and agent selection. However, three legacy duplicate pairs could be removed to tighten the set to 13, which would be ideal.

Completeness4/5

The server covers core desktop workflows: state inspection, window layout, workspace save/launch/delete, screenshots, text extraction, zone sets, keep-awake, and updates. Minor gaps: no way to move a single window by app/title without a full layout, and no explicit window close/minimize tool, but these are workarounds via apply_layout and get_state.

Maintenance

ActivityMaintained
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides native macOS desktop automation for AI agents, enabling screen capture, mouse/keyboard control, window management, and iOS/Android simulator control in both foreground and background modes without focus stealing.
    3
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    A local autonomous AI agent that watches your screen, understands the visual layout, and executes native OS commands (clicking, typing) without cloud APIs.
    2
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    300+ MCP tools for macOS, all on-device — local AI inference (llama.cpp on Metal), voice, vision OCR, local RAG, browser automation, and ~140 system actions across 26 macOS domains. Nothing leaves your Mac.
    2
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ostapondo/Plonk'

If you have feedback or need assistance with the MCP directory API, please join our Discord server