Skip to main content
Glama

xojo-mcp

An MCP (Model Context Protocol) server that gives AI assistants direct control over the Xojo IDE. Communicates via stdin/stdout JSON-RPC and forwards IDE commands via a Unix domain socket to the running Xojo IDE process.

Note on the name. This crate was previously published as xmcp. It was renamed to xojo-mcp to avoid confusion with X's (formerly Twitter) unrelated xmcp framework. The installed binary is still xmcp, so existing configs keep working.

macOS only. xojo-mcp talks to the Xojo IDE over a Unix domain socket (/tmp/XojoIDE, or /tmp/$XOJO_IPCPATH — see Choosing which IDE to talk to). Windows is not supported and there is no plan to add it. The reason is not that the IDE lacks an IPC mechanism there: Xojo's IPCSocket is a framework abstraction, and on Windows it is a localhost TCP socket whose port is derived from the path string rather than a filesystem entry. The original XMCP, being itself a Xojo application, gets that transport for free from the framework; this port speaks the wire protocol directly, so Windows would mean reverse-engineering an undocumented path-to-port derivation. Linux is untested rather than ruled out — it uses a Unix socket as macOS does, but the debug- and system-log tools read macOS-only sources.

Attribution

This is a Rust port of XMCP by Øjvind Søgaard Andersen, originally written in Xojo. The original project is licensed under the MIT License.

Related MCP server: scrivener-mcp

Quick start

1. Install

Option A: prebuilt binary (Apple Silicon)

Each release carries an aarch64-apple-darwin tarball that is signed with a Developer ID certificate, notarized by Apple, and accompanied by a detached minisign signature. Grab the latest from Releases, check it, and put the binary on your PATH:

minisign -Vm xmcp-*-aarch64-apple-darwin.tar.gz \
    -P RWR7Jy43Mphvu+jrP2FynfYpR7WdP0PvQaSFKfXub7q9Sh7fjtyAX9GU
tar xzf xmcp-*-aarch64-apple-darwin.tar.gz
install -m 755 xmcp-*/xmcp ~/.cargo/bin/xmcp

The .minisig is the check worth doing, and the one the .sha256 beside it cannot do: a checksum file hosted next to the file it vouches for proves only that the download wasn't corrupted, since anyone able to replace one asset can replace both. The signature is made by a key that never touches the release server — the one in the command above, kept in this repository as minisign.pub.

minisign is in MacPorts (port install minisign). A successful verify prints the trusted comment, which names the version and the date it was signed. The .sha256 is still published for anyone who wants it:

shasum -a 256 -c xmcp-*-aarch64-apple-darwin.tar.gz.sha256

The binary is signed with a Developer ID certificate and notarized by Apple, so Gatekeeper lets it run as-is. Check that for yourself if you like:

codesign -dvv ~/.cargo/bin/xmcp   # Authority: Developer ID Application …
codesign -vvv -R="notarized" --check-notarization ~/.cargo/bin/xmcp

(spctl is the obvious thing to reach for and the wrong tool here: it answers does not seem to be an app for any plain command-line binary, notarized or not.)

A notarization ticket cannot be stapled to a bare executable — stapler only handles .app, .dmg and .pkg — so the first run needs to reach Apple to resolve the ticket. If that first run has to happen offline, clear the quarantine flag by hand instead:

xattr -d com.apple.quarantine ~/.cargo/bin/xmcp

Intel Macs are not covered — build from source instead.

Option B: from crates.io

cargo install xojo-mcp

The crate is xojo-mcp; the binary it installs is xmcp.

Option C: from source

git clone https://codeberg.org/brechanbech/xojo-mcp.git
cd xojo-mcp
cargo install --path .

This installs the xmcp binary to ~/.cargo/bin/xmcp. If ~/.cargo/bin is already on your PATH (the Rust installer adds it by default), you're done. Verify with:

xmcp --help

Optional: usage-guide.md is embedded into the binary at compile time, so the MCP resource is always available out of the box. If you want to tweak the guide without rebuilding, drop a copy next to the binary — xmcp will prefer the file on disk over the embedded fallback:

cp usage-guide.md ~/.cargo/bin/

2. Add to Claude Code

Run this from any terminal:

claude mcp add xmcp -- xmcp

Or add it manually to your Claude Code settings. Open the MCP config file (on macOS: ~/.claude/settings.json or the project-level .claude/settings.json) and add:

{
  "mcpServers": {
    "xmcp": {
      "command": "xmcp",
      "args": []
    }
  }
}

To enable verbose logging (written to stderr, visible in the Claude Code MCP log):

{
  "mcpServers": {
    "xmcp": {
      "command": "xmcp",
      "args": ["-v"]
    }
  }
}

3. Use it

  1. Start the Xojo IDE and open your project

  2. Start a Claude Code session in the project directory

  3. Claude will automatically discover the 31 xmcp tools and the usage guide

The documentation tools (search_docs, lookup_class, list_doc_topics) need a local copy of the Xojo docs. A script is included to download them from docs.xojo.com:

scripts/update-xojo-docs.sh

This downloads llms.txt and llms-full.txt from docs.xojo.com and splits the full documentation into individual class files under _sources/. Everything goes into ~/Library/Application Support/Xojo/Xojo/<version>/Documentation/, which xmcp auto-detects at startup. Re-run the script periodically to pick up documentation updates — Xojo refreshes these files when new releases are published.

lookup_class returns a shaped summary by default: the class description plus its member tables, with Sphinx cross-reference markup resolved to plain text. That is a few thousand characters where the raw page runs to tens of thousands — String alone is over 70,000. Ask for one member with member, or the unprocessed page with full: true:

lookup_class(class_name: "String")                     # description + member tables
lookup_class(class_name: "String", member: "Middle")   # that member's entry alone
lookup_class(class_name: "String", full: true)         # the raw .rst.txt page

To use a custom location instead:

scripts/update-xojo-docs.sh /path/to/docs
xmcp --docs-path /path/to/docs

Read-only mode

By default, an assistant connected to xmcp can change your project: it can rewrite code, create new items, save, and revert. That is the point of the tool — but it is not always what you want. If you only want an assistant to look at a project — read the code, build it, run it, analyse it, answer questions, consult the documentation — without any possibility of it modifying or overwriting your source, start the server in read-only mode.

Read-only mode is enforced by the server itself, not by asking the assistant to behave. It is the single most important safety control in xmcp, so it is worth understanding exactly how it works.

Enabling it

The simplest way is the --read-only flag on the launch command. In Claude Code:

claude mcp add xmcp -- xmcp --read-only

Or, in a Claude Code settings file (~/.claude/settings.json, or the project-level .claude/settings.json):

{
  "mcpServers": {
    "xmcp": {
      "command": "xmcp",
      "args": ["--read-only"]
    }
  }
}

If your MCP client prefers environment variables to command-line arguments, the variable XMCP_READ_ONLY=1 does exactly the same thing. Accepted truthy values are 1, true, yes, and on (case-insensitive):

{
  "mcpServers": {
    "xmcp": {
      "command": "xmcp",
      "args": [],
      "env": { "XMCP_READ_ONLY": "1" }
    }
  }
}

If both the flag and the environment variable are present, either one enabling read-only mode is enough — there is no way to disable it from the other.

It is set at launch, not in the conversation

This is the part newcomers most often get wrong. You do not put the assistant into read-only mode by telling it to "stick to reading" in the chat. A prompt is a request the model can forget, misinterpret, or be argued out of — and it does nothing at all if the model simply calls a write tool anyway. That is the weakness read-only mode exists to remove.

Read-only mode is a property of how the server was started. You set it once, in your MCP client's configuration, before the session begins. From that point on, for the entire lifetime of that server process, the restriction holds regardless of anything typed into the conversation. Neither you nor the assistant can toggle it mid-session; to change modes you change the configuration and reconnect the server. (Restarting the server is required for a change to take effect — a server that is already running will not pick up a new flag or environment variable.)

What it actually blocks

Read-only mode disables the ten tools that modify the project:

Tool

What it would otherwise do

set_code

Overwrite the code of a method, property, or other item

edit_code

Replace an exact substring within an item's code

set_selected_text

Replace the current text selection in the code editor

set_declaration

Rename or retype a method or property

create_project_item

Add a new class, module, window, or other item

property_value

Change a framework property such as App.OptimizationLevel

constant_value

Change a project constant's value

get_item_description

Change an item's description

revert_project

Discard unsaved changes back to the last save

save_project

Write the project's current in-memory state to disk

property_value, constant_value and get_item_description also read, but each is one tool, so read-only mode blocks the read along with the write.

Tool annotations

Every tool also carries MCP behaviour hints in tools/list — a title and readOnlyHint, destructiveHint, idempotentHint and openWorldHint — so a client can decide what to confirm before calling it. These are hints, not enforcement, and they describe a tool's effect on the whole machine rather than on the project, so they are stricter than read-only mode: build_project, run_project and agentic_run leave the source alone and stay available in read-only mode, but they write build output or launch an app, so they are not hinted read-only. openWorldHint is false everywhere except run_ide_script, whose DoShellCommand can reach anything.

Everything else remains fully available — navigating and listing items, reading code (get_code), building (build_project), running (run_project), stopping, compile-checking (analyze_project), inspecting descriptions and constants, the debug log tools, and all three documentation tools. In short: browse, build, run, and analyse — just no writing.

Note that build and run are deliberately not blocked. They do not alter your source; they exercise it. build_project writes a compiled app into the build folder and run_project launches a debug session, but neither touches the project itself, so both are considered read-only-safe.

How the enforcement works

The restriction is applied in two independent layers, so it holds even if a client or model misbehaves:

  1. The blocked tools are removed from the tool list. When the assistant asks the server what tools exist (tools/list), the six mutating tools are filtered out. The model never sees them, so it cannot choose to call something it does not know exists. This is what makes the mode effective in practice rather than merely defensive.

  2. Any call to a blocked tool is rejected. If a request to one of the six arrives anyway — a stale tool list, a hand-crafted call, a buggy client — the server refuses it before the request ever reaches the IDE, returning a clear error explaining that the tool is disabled in read-only mode.

The assistant is also told, via the embedded usage guide, that when it sees a reduced tool set the project is intentionally read-only and it should work within the available tools rather than trying to route around the restriction.

Running both modes at once

Because the mode is fixed per server, you can register xmcp twice under different names and choose per task which one to point the assistant at — for example a normal xmcp for editing sessions and a separate xmcp-ro for review-only sessions:

claude mcp add xmcp    -- xmcp
claude mcp add xmcp-ro -- xmcp --read-only

Choosing which IDE to talk to

The IDE listens on a socket whose path is a temporary directory plus the name XojoIDE — or the value of XOJO_IPCPATH, when that variable is set in the IDE's environment. Setting it to a unique name per instance is Xojo's supported way of running several IDEs (say, two releases side by side) and addressing each one independently:

env XOJO_IPCPATH=Xojo2026r2_1 "/Applications/Xojo 2026 Release 2.1/Xojo.app/Contents/MacOS/Xojo" &

xmcp must be given the same value, otherwise it connects to whichever instance owns the default XojoIDE socket:

{
  "mcpServers": {
    "xmcp-2026r2-1": {
      "command": "xmcp",
      "args": [],
      "env": { "XOJO_IPCPATH": "Xojo2026r2_1" }
    }
  }
}

Only a-z, A-Z, 0-9 and _ are valid in the name; xmcp ignores a value containing anything else (with a warning on stderr) and falls back to XojoIDE. Candidate directories are /tmp first — what the IDE itself prefers — then $TMPDIR, which is where the IDE falls back when /tmp is not writable.

If you only ever run one IDE at a time, ignore all of this: the default works.

Requirements

  • macOS (the Xojo IDE IPC socket is macOS-specific)

  • Rust toolchain (rustup — https://rustup.rs)

  • Xojo IDE must be running with a project open before using any tools

Options

xmcp [OPTIONS]
  • --read-only — Read-only mode: hide and reject every tool that modifies the project. Can also be enabled with XMCP_READ_ONLY=1. See Read-only mode for the full description.

  • -v, --verbose — Enable verbose logging to stderr

  • -d, --docs-path <PATH> — Path to Xojo documentation directory (auto-detected if omitted)

  • -V, --version — Print version

  • -h, --help — Print help

Environment: XMCP_READ_ONLY (see above) and XOJO_IPCPATH, which selects the IDE instance to connect to — see Choosing which IDE to talk to.

Differences from the original

This is a drop-in replacement — it exposes all 25 tools from the original with identical names and parameters (analyze_project and debug_control were the last two ported, bringing it to full parity), plus one new tool, edit_code, for 26 in total. Same IDE Communicator Protocol v2 over the Unix domain socket, updated to MCP protocol version 2025-11-25.

Notable differences:

  • Binary name is xmcp

  • edit_code — targeted str_replace-style editing — replaces an exact substring within an item's code in one call (read → replace → write, all server-side), instead of resending the whole item via set_code. The original has no such tool, forcing whole-item rewrites or shell-based text munging for small edits.

  • Writes code directly — no shell/base64 marshalling — set_code and edit_code send source straight through the IPC, with all IDE-script string escaping (quotes, newlines, special characters) handled server-side. There is no need to smuggle code across the bridge by hand — the base64 encode-on-agent / decode-on-Mac / run-via-shell workflow the original forces for file edits simply does not exist here.

  • Enforced read-only mode — --read-only / XMCP_READ_ONLY removes and rejects the mutating tools at the server. The original has no built-in enforcement; it can only be asked, via the prompt, not to write. See Read-only mode.

  • scaffold_code_block and lint_project_file differ from the original's in a few places. A guide on disk that predates their rules falls back to the compiled-in rules instead of failing. The scaffold takes a full signature, so a return type yields a Function, and it takes a body. It refuses a constant value whose escaping is unconfirmed (a backslash or control character) instead of guessing. The lint blames the block that lost its end tag instead of cascading. Its rules were re-checked against Xojo 2026r3: a module goes method, property, constant (the original has constants before properties), and since Xojo loads misordered blocks and Flags/keyword mismatches and resolves them on save, the lint reports those as warnings that say what Xojo will do, not as errors.

  • No Xojo license required — builds with the standard Rust toolchain

  • usage-guide.md has a compiled-in fallback — the original fails silently if the file is missing next to the binary; the Rust version embeds a copy at compile time so the MCP resource is always available. A file on disk still takes priority, so you can edit it without rebuilding.

  • CLI parsing uses clap rather than the original's custom OptionParser. The flags are the same.

Tools

xmcp exposes 31 tools across six categories:

IDE tools (22): list_project_items, get_current_location, select_project_item, get_code, set_code, edit_code, get_selected_text, set_selected_text, build_project, run_project, stop_project, create_project_item, run_ide_script, get_project_info, revert_project, save_project, get_item_description, constant_value, property_value, set_declaration, analyze_project, debug_control

Documentation tools (3): search_docs, lookup_class, list_doc_topics

Debug tools (2): get_debug_log, get_system_log

Agentic Mode (1): agentic_run — runs a project that has Xojo 2026r3's Agentic Mode on and returns its compile errors with locations. It works through files in the project folder, not the IDE socket, so it can be pointed at a project with project_dir even when the socket is unavailable.

Project-file tools (2): scaffold_code_block, lint_project_file — write a correctly formatted #tag block for a .xojo_code or .xojo_window file, and check such a file after editing it on disk. They read the file only, need no IDE, and take their rules from the JSON block in usage-guide.md, so a rule can be corrected without a rebuild.

Cost awareness (1): estimate_request_cost

License

MIT — see LICENSE.md for details.

MCP registry

Ownership-verification token for the MCP registry (read from this crate's rendered README on crates.io):

Registry ownership token: mcp-name: io.github.brechanbech/xojo-mcp

Releasing

A version is immutable once published — crates.io yanks, it does not delete, and a number is never reused — so the order matters:

  1. cargo test and cargo clippy --all-targets clean.

  2. Bump version in Cargo.toml.

  3. Bump version in server.json — both fields, the top-level one and the one under packages[]. Nothing enforces this: no script, no CI, no test reads the file. It sat at 3.4.0 through the 3.4.1 and 3.5.0 releases because of it, leaving the registry advertising a version two behind what anyone could install.

  4. Commit and push; let CI go green before publishing rather than after.

  5. cargo publish --dry-run, which compiles from the packaged copy and so catches a crate depending on a file it does not ship. Then cargo publish.

  6. Publish to the MCP registry, after crates.io and not before — the registry verifies the namespace by reading mcp-name from this crate's rendered README on crates.io, and server.json names a cargo version that must already exist there:

    mcp-publisher validate      # checks server.json against the live registry
    mcp-publisher login github  # interactive, for the io.github.brechanbech/* namespace
    mcp-publisher publish

Available Tools

31 tools
agentic_runRun in Agentic ModeA

Agentic Mode only (Xojo 2026r3+): runs the project and returns its compile errors, if any. Unlike run_project, this reports real compiler errors with their locations. It works through files in the project folder rather than IDE scripting, so it also works when the IDE socket does not: it drops XojoRunProject.txt into the project folder and reads back XojoCompileErrors.txt. Compile errors fail the call, one ', line : ' per line. A successful run launches the app in the debugger; stop it with stop_project. If Xojo has not taken the request within 10 seconds, Agentic Mode is off or the project is not open: the request file is removed again and the call fails saying how to turn the mode on. Agentic Mode is the user's opt-in to having the project run to check edits, so this may be called without asking each time.

NameRequiredDescriptionDefault
project_dirNoAbsolute path of the folder containing the .xojo_project. Omit to use the project open in the IDE, which needs the IDE socket.
wait_secondsNoHow long to wait for errors or a launch once Xojo starts the run (default 15, max 120). Raise it for large projects.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses the file-based mechanism (XojoRunProject.txt / XojoCompileErrors.txt), the exact error line format, that compile errors fail the call, that a success leaves the app running in the debugger, the 10-second request handoff, and the cleanup of the request file on failure. None of this is inferable from readOnlyHint=false / destructiveHint=false alone.

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?

Front-loads the mode constraint and the run_project contrast, then layers mechanism, error format, and failure mode in a logical order. The temp-filename detail and the sentence on stop_project overlap slightly with what an agent needs, but no sentence is wasted.

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?

With no output schema, the description carries the return-value burden and does: error line format, the failure case where errors are reported, and the success case where the app launches. Timeout behavior, prerequisites, and the stop path are all covered, which is complete for a two-parameter run tool.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters, their defaults and the max are already documented in the schema. The description adds only indirect color: the file-based mechanism explains why project_dir might be needed, and the 10-second handoff window hints at the wait semantics. It does not clarify the relationship between that 10-second handoff and wait_seconds, so the baseline 3 holds.

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?

States a specific verb and resource ('runs the project and returns its compile errors') and pins the scope to Agentic Mode only (Xojo 2026r3+). It explicitly contrasts with the sibling run_project, so an agent can pick it apart from the near-identical alternative without opening either schema.

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?

Gives explicit when-to-use (Agentic Mode on, or when the IDE socket is unavailable), when it fails (mode off / project not open, with a 10-second criterion), and names the follow-up tool ('stop it with stop_project'). It also pre-authorizes repeated calls as the user's opt-in, which removes a common agent hesitation.

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

analyze_projectAnalyze ProjectA
Read-onlyIdempotent

Analyzes the current Xojo project for compile errors and warnings without building. Reports unused variables, type mismatches, deprecated API usage, and other issues. Pass scope="item" to analyze only the currently selected item (faster); default is "project" to analyze everything. Returns 'No errors or warnings found.' or one line per issue with its type, message and location. Any error makes the call fail; warnings alone do not. Nothing is built, run or changed. Waits up to one minute. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault
scopeNo"project" (default) or "item", the item selected in the Navigator; select it first with select_project_item.

TDQS

A4.4/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: exact return format ("No errors or warnings found." or one line per issue with type, message, location), the failure contract (any error fails the call, warnings alone do not), the up-to-one-minute wait, and the IDE/project prerequisite. These are things annotations cannot express and an agent needs before invoking.

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?

Front-loaded with purpose, then scope, then return format, then failure semantics, then preconditions – a sensible ordering. It is dense with facts rather than padding, though the parenthetical and semicolon clauses make it read like a checklist rather than tight prose.

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 correctly takes on the burden of describing the return value and error behavior. Combined with the timeout and environment prerequisite, an agent has everything needed to call this and interpret the result.

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

Parameters3/5

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

Schema coverage is 100%, so the enum-like values, the default, and the select_project_item prerequisite are already documented in the schema description. The description only adds the performance rationale ("faster") for item scope, which is marginal added value, so the baseline 3 applies.

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?

States a specific verb and resource ("Analyzes the current Xojo project for compile errors and warnings without building") plus the exact categories of findings (unused variables, type mismatches, deprecated API). The "without building" qualifier and the static-analysis framing clearly separate it from build_project and run_project in the sibling list.

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?

Gives explicit guidance on the scope choice: pass scope="item" for a faster analysis of the current selection, default "project" for everything, and it names the prerequisite tool (select_project_item). It also states the environmental precondition (Xojo IDE running with the project open). It stops short of naming when to prefer this over build_project or lint_project_file, so not a 5.

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

build_projectBuild ProjectA
Idempotent

Builds the open Xojo project into a standalone app. Call it only when the user asks for a build, and offer run_project first: a run catches errors a build misses. Returns 'Build succeeded.' or the compile errors with their locations; runtime errors are not visible. A success has been reported with no app written, so confirm the built app exists on disk. Waits up to 30 minutes; a build that outlasts that keeps going, and xmcp refuses other requests until the IDE answers. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault
revealNoShow the built app in Finder afterwards. Default false.
build_typeNoBuild target: 0 = default (the default), 5 = macOS Cocoa, 9 = Windows 32-bit, 14 = Windows 64-bit, 16 = Linux 32-bit, 17 = Linux 64-bit, 18 = Linux ARM, 24 = macOS Universal.

TDQS

A4.7/5.0
Behavior5/5

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

Discloses traits annotations cannot express: a 30-minute wait with the operation continuing past it, server-wide blocking of other requests until the IDE responds, the prerequisite of a running IDE with the project open, and the critical caveat that a success has been reported with no app written so the artifact must be verified on disk. Annotations only say non-read-only, idempotent, non-destructive; the description adds far more.

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?

Purpose first, then usage gate, then return behavior, then the failure caveat, then operational constraints — each sentence carries a distinct fact an agent needs. Dense but no filler or repetition of the title.

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 long-running mutation with no output schema, it covers everything an agent must know to invoke and interpret it: return values in both success and failure cases, invisible runtime errors, truncation/blocking semantics, and environmental prerequisites. Nothing material is left implicit.

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

Parameters3/5

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

Schema description coverage is 100%, with both parameters (reveal, build_type) fully documented including the enum-like build target codes, so the schema does the heavy lifting. The description adds no parameter-level syntax or format detail beyond it. Baseline 3 applies.

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?

Opens with a specific verb and resource ('Builds the open Xojo project into a standalone app') and immediately contrasts with the sibling run_project, which is the tool most likely to be confused with it. An agent can distinguish build vs. run without reading either schema.

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?

Gives an explicit gate ('Call it only when the user asks for a build') plus a preferred alternative and its rationale ('offer run_project first: a run catches errors a build misses'). This is exactly the when/when-not/alternative structure that prevents misuse.

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

constant_valueGet or Set ConstantA
DestructiveIdempotent

Gets or sets the value of a project constant in the Xojo IDE. The constant must already exist in the project. A set is read back, so a name that matches no constant is reported rather than silently ignored; a get of such a name returns an empty value, the same as an empty constant. It changes the value only: to rename or retype a constant, edit its #tag Constant line on disk (scaffold_code_block writes one). A set stays in the IDE until save_project. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault
nameYesConstant name, fully qualified, e.g. 'App.kVersion' or 'Module1.kLimit'; a bare name may not resolve
valueNoNew value, as text. Omit to read the current value instead.

TDQS

A4.4/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: a set is read back so a non-matching name is reported rather than silently ignored, a get of an unknown name returns empty (indistinguishable from a genuinely empty constant), and a set persists only until save_project. These are non-obvious failure and persistence semantics an agent would otherwise have to discover by experiment. Consistent with destructiveHint=true and idempotentHint=true, since the operation overwrites an existing value in place.

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?

Five tight sentences, front-loaded with the get/set purpose, then the existence requirement, then failure semantics, then the rename escape hatch, then persistence and prerequisites. No sentence is redundant and no filler is present.

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 mutation tool with no output schema, the description covers everything an agent needs: prerequisites (IDE running, project open), what is mutated and what is not, what happens on a miss for both modes, when the change becomes durable (save_project), and where to go for rename/retype. Nothing material is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and the description earns above that by explaining the dual get/set mode and what omitting value means operationally, plus the difficulty of resolving bare names against a nonexistent constant. It does not add format or syntax detail beyond what the schema's fully-qualified-name example already provides.

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

Purpose4/5

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

States a specific verb+resource pair: gets or sets the value of a project constant in the Xojo IDE, with the constraint that the constant must already exist. It distinguishes itself from the closest sibling (property_value for properties, scaffold_code_block for editing #tag Constant lines) implicitly through the rename guidance, though it never names those siblings directly.

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?

Clear about scope: value changes only, not rename or retype, and it names the alternative route for those (edit the #tag Constant line on disk, which scaffold_code_block writes). It also states the prerequisite of a running IDE with the project open. It lacks an explicit 'use X instead for properties' redirection to the closest sibling, which keeps it from a 5.

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

create_project_itemCreate Project ItemA

Creates a new item in the open Xojo project with the IDE's own command for it, inside parent_location (selected first) or the currently selected item, and returns the new item's location. A new method or property is blank and untitled (e.g. 'Window1.Untitled') and stays selected, so name and type it with set_declaration straight afterwards, with no location. Use this, never a hand edit of the .xojo_project file, to add items: the IDE assigns their IDs. The item stays in the IDE until save_project. There is no matching delete: Xojo's IDE scripting has no command for it. Delete a member by removing its #tag block from the item's file on disk; a whole item has to be deleted by the user in the IDE. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault
item_typeYesItem type to create. Must be one of: NewClass, NewModule, NewMethod, NewProperty, NewConstant, NewEvent, NewNote, NewMenuHandler, NewComputedProperty, NewSharedMethod, NewSharedProperty, NewEnum, NewStructure, NewDelegate, NewInterface, NewWindow, NewContainerControl, NewFolder, AddEventImplementation
parent_locationNoDot-separated path of the item to create inside, e.g. 'Module1' or 'Window1'; selected first. Omit to use the current selection.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond annotations, the description discloses that the IDE assigns IDs, new methods/properties are blank and untitled and remain selected, and items stay in the IDE until save_project. It also states the prerequisite that the Xojo IDE must be running with the project open.

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 front-loaded with the action and parent behavior, and every sentence carries relevant operational information. It is somewhat dense and run-on, but there is little wasted 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?

No output schema exists, yet the description explains the return value as the new item's location. It also covers lifecycle, selection state, prerequisites, follow-up naming, and deletion limitations, which is complete for this mutation 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?

Schema coverage is 100%, so parameter documentation already exists. The description adds useful semantics: parent_location is selected first, omitting it uses the current selection, and the new item's location is returned; it also clarifies that set_declaration should follow without a location.

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 verb and resource: creates a new item in the open Xojo project using the IDE's own command. It distinguishes this from hand-editing the .xojo_project file and from the missing delete capability, so an agent can identify the tool's unique role.

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 explicitly says to use this tool, never a hand edit of the project file, to add items. It also gives the follow-up workflow with set_declaration and explains that there is no matching delete tool, including what to do instead.

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

debug_controlControl Debug SessionA

Controls the Xojo debug session. Actions: "step_over" (execute current line), "step_into" (step into method call), "step_out" (step out of current method), "resume" (continue running), "pause" (pause execution). Requires an active debug session started with run_project; without one the call fails. It returns once the IDE accepts the command and reports neither the new line nor variable values: the user sees those in the IDE's debugger. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault
actionYesDebug action to perform: "step_over", "step_into", "step_out", "resume", or "pause".

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnly=false, destructive=false, idempotent=false): it discloses the failure mode without a session, the prerequisite IDE/project state, and critically that the call returns as soon as the IDE accepts the command without reporting the new line or variable values. That last point prevents an agent from expecting state back and re-polling, which is exactly the kind of context structured fields cannot convey.

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?

Front-loads the purpose, then actions, then prerequisites, then return behavior in a logical order with no filler. The inline action glosses partially duplicate the schema description, costing a little tightness, but each sentence carries information an agent needs.

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?

No output schema exists, and the description compensates by explicitly describing what the call does and does not return. With a single required parameter fully documented and a clear failure condition, an agent has everything needed to invoke this 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 coverage is 100% so the baseline is 3, but the description adds real semantics by glossing each action ("step_over" executes current line, "step_into" steps into a method call, "step_out" exits the current method, "resume" continues, "pause" halts). This resolves any ambiguity about what the terse enum values mean in practice.

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?

States a specific verb and resource ("Controls the Xojo debug session") and immediately enumerates the five concrete actions, so an agent knows exactly which operation family this is. It is clearly distinguishable from siblings like run_project or stop_project, which manipulate the session lifecycle rather than stepping through it.

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 states the precondition: an active debug session started with run_project, and that the call fails without one. It also states the IDE must be running with the project open. The only gap is that it never names stop_project as the way to end a session, but the when-to-use condition is unambiguous.

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

edit_codeEdit CodeA
Destructive

Makes a targeted edit to an item's source code by replacing an exact substring, leaving everything else untouched. Reads the current code, replaces old_string with new_string, and writes it back — so you do not need to resend the whole item to change a few lines. old_string must match the existing code exactly (including whitespace and indentation) and, unless replace_all is true, must occur exactly once. Prefer this over set_code for edits to existing code. If old_string is missing or ambiguous nothing is written, and when the only difference is whitespace the error returns the exact text to retry with. Reaches the same items as get_code. The change stays in the IDE until save_project. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault
locationNoDot-separated path (e.g. 'Module1.Method1'). Edits the current location if empty.
new_stringYesText to replace old_string with.
old_stringYesExact text to find. Must match the existing code verbatim, including whitespace and indentation.
replace_allNoReplace every occurrence. If false (default), old_string must occur exactly once.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag destructive=true and idempotent=false; the description goes further and explains atomicity ('If old_string is missing or ambiguous nothing is written'), whitespace-failure recovery ('returns the exact text to retry with'), and that the change lives in the IDE until save_project. Those are the exact operational facts an agent needs before invoking a destructive edit.

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?

Dense and front-loaded: purpose, mechanism, matching constraint, sibling preference, failure behavior, persistence, and prerequisite in six tight sentences. No filler and no repetition of the name/title.

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 destructive mutation with no output schema, the description covers failure modes, persistence, and prerequisites well, and even hints at error return content. It doesn't say what a successful response looks like (e.g., confirmation, diff, or new code), which is the one remaining gap.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds behavioral consequence beyond the schema: the exact-match/occurrence rule and what happens (nothing is written) when old_string fails to match or is ambiguous. The location parameter's 'current location if empty' behavior is left entirely to the schema, which keeps it from a 5.

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?

Opens with a specific verb+resource and mechanism: 'targeted edit ... by replacing an exact substring, leaving everything else untouched.' It also explicitly distinguishes itself from siblings by naming set_code and stating that it reaches the same items as get_code.

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?

Gives an explicit routing rule — 'Prefer this over set_code for edits to existing code' — plus a prerequisite: 'Needs the Xojo IDE running with the project open.' Together with the note that changes persist only after save_project, the when/how is fully covered.

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

estimate_request_costEstimate Request CostA
Read-onlyIdempotent

Rates a planned request's likely token cost as LOW, MEDIUM or HIGH, with the reasons and cheaper ways to do it. It is a keyword heuristic over the request text and the planned tool names, with no project or IDE access and no real token count, so treat it as a prompt to narrow scope rather than a measurement. Most useful before documentation-heavy or project-wide work.

NameRequiredDescriptionDefault
requestYesThe task in plain words, e.g. 'Add a ListBox to Window1'. Longer text and words such as 'entire', 'refactor' or 'docs' raise the rating.
planned_toolsNoComma-separated tool names you expect to call, e.g. 'search_docs, get_code'. Only list_doc_topics, lookup_class, search_docs, get_code and set_code affect the rating.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already establish readOnly/idempotent/non-destructive, and the description goes well beyond them: it discloses the implementation basis (keyword heuristic over request text and planned tool names), the absence of project/IDE access, and that no real token count is produced. That is exactly the caveat an agent needs to avoid over-trusting the rating.

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

Conciseness5/5

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

Three sentences, each earning its place: what it returns, what it actually is (and is not), and when it is worth calling. The most decision-relevant caveat is placed before the usage hint.

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?

No output schema exists, yet the description fully specifies the return shape (rating plus reasons plus cheaper alternatives). Combined with the stated limitations and the fully documented two-parameter schema, an agent has everything needed to call and interpret it.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents both parameters, including which tool names affect the rating and which words raise it. The description only reinforces that the heuristic reads request text and planned tool names, adding no format or edge-case detail 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?

States a specific verb and resource — rates a planned request's likely token cost — and names the exact output scale (LOW/MEDIUM/HIGH) plus the extra payload (reasons, cheaper alternatives). No sibling tool does anything comparable, so an agent can select it unambiguously.

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?

"Most useful before documentation-heavy or project-wide work" gives a clear triggering context, and "treat it as a prompt to narrow scope rather than a measurement" tells the agent how to act on the result. It stops short of explicit when-not-to-use guidance or naming an alternative, but there is no obvious alternative among the siblings.

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

get_codeGet CodeA
Read-onlyIdempotent

Returns the code of one method, event handler or other code item in the open Xojo project: the item at location, or the one open in the code editor when location is omitted. Giving a location also selects that item in the Navigator. A path that does not exist, or an item with no code editor, is an error; an empty body says so. The code is the body only: the declaration line is not included. Window and control event handlers are reachable on Xojo 2026r3 and later; on earlier releases read the .xojo_window file instead. Copy edit_code's old_string from this output. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault
locationNoDot-separated path, e.g. 'Module1.Method1', 'Window1.Opening' or 'Window1.Controls.Button1.Pressed' (note the Controls segment). Omit for the item open in the code editor.

TDQS

A4.4/5.0
Behavior4/5

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

Goes well beyond readOnly/idempotent annotations: discloses the Navigator side effect of passing a location, the error case for bad paths or code-less items, the empty-body behavior, the fact the declaration line is excluded, and a version gate for window/control event handlers. Slightly short of 5 only because the exact error/return shape is described qualitatively rather than concretely.

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?

Dense and front-loaded — the core behavior leads, then errors, scope limits, sibling linkage, and prerequisites. A few clauses (the location/omitted restatement) duplicate the schema, which is minor waste but not bloat.

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?

No output schema exists, and the description compensates by explaining exactly what the returned text is (body only, no declaration line) and what an empty result means. Combined with the IDE prerequisite and version caveat, an agent has everything needed to call and interpret this correctly.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents the dot-separated format, the 'Controls' segment and the omit-for-editor behavior. The description restates the omit semantics and adds the Navigator-selection consequence, but provides no meaning beyond what the schema carries, so baseline 3 applies.

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?

States a specific verb (returns) and resource (the code body of a method/event handler/code item) plus the scope (open Xojo project). It is clearly distinguishable from siblings like get_selected_text, set_code and edit_code without needing to open any schema.

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 defines the two call modes (with location vs. omitted for the editor's current item) and routes the agent to the sibling that consumes the output: 'Copy edit_code's old_string from this output.' It also names an alternative for older IDE releases (.xojo_window file) and states the runtime prerequisite (IDE running, project open).

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

get_current_locationGet Current LocationA
Read-onlyIdempotent

Returns the item selected in the Xojo IDE's Navigator and its type, as ' ()', e.g. 'Module1.Helper (Method)'. Tools whose location is optional act on this item when it is omitted, so check it before relying on that; select_project_item changes it. get_project_info returns the same plus the project's path and Xojo version. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, closed-world behavior, so the description adds context beyond them: the returned value is mutable state changed by select_project_item, other tools implicitly depend on it, and the Xojo IDE must be running with a project open. Missing only failure-mode detail (e.g. what is returned when nothing is selected).

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

Conciseness5/5

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

Three tight sentences, front-loaded with the return contract, then dependency semantics, then prerequisites. Every clause carries distinct information; no 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?

No output schema exists, so the description carries the return-value burden and does so exactly, including a concrete example. It also covers the runtime prerequisite and the cross-tool dependency, which is everything an agent needs to call and interpret 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?

Zero parameters, so the baseline is 4; nothing about inputs needs explaining. The description instead spends its budget on the return-value shape, which is more useful than parameter prose would be here.

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?

States a specific verb and resource and immediately pins down the exact return format ('<path> (<type>)' with a concrete example), so an agent knows precisely what it gets. It explicitly distinguishes itself from get_project_info (same item plus project path/version) and select_project_item (mutates the selection).

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?

Gives an explicit when-to-use rule: tools with an optional location parameter act on this item when omitted, so check this value first. It also names the two adjacent alternatives and what each does differently, leaving nothing to inference.

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

get_debug_logGet Debug LogA
DestructiveIdempotent

Returns /tmp/xmcp_debug.log, which a built Xojo app writes from its App.UnhandledException handler when it crashes (usage-guide.md has the handler to add). This is how to see an exception in a built app; in a debug run the IDE's debugger catches exceptions instead, and get_system_log reads System.DebugLog output. No log file is a normal result that says so. With clear, the file is deleted after reading, so the next crash starts a fresh log. Needs no IDE.

NameRequiredDescriptionDefault
clearNoDelete the log file after reading it. Default false.

TDQS

A4.6/5.0
Behavior4/5

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

Goes beyond the annotations by explaining that a missing log file is a normal, self-describing result, that deletion only happens when clear is set (reconciling destructiveHint=true with a default non-destructive read), and that no IDE is required. It omits any mention of return size, truncation, or whether the full file is always returned, which matters since there is no output 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?

Front-loaded with the resource and its origin, and every sentence carries information (alternative tools, empty-result semantics, clear behavior, no-IDE requirement). Some sentences are densely packed with parentheticals, which slightly hurts scannability.

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 single-parameter read tool with no output schema, it covers the return artifact, the normal empty case, the destructive-flag consequence, the setup prerequisite (adding the handler per usage-guide.md), and the sibling alternative. Nothing essential to a correct call is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds rationale the schema lacks: clear deletes the file so the next crash starts a fresh log. That explains the consequence of the flag rather than restating it.

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?

Names a specific artifact (/tmp/xmcp_debug.log), its producer (a built Xojo app's App.UnhandledException handler), and its purpose (seeing an exception in a built app). It also explicitly distinguishes itself from get_system_log, which reads System.DebugLog output, so an agent can route without opening the schema.

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

Usage Guidelines5/5

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

States when to use it (crash in a built app), when not to (a debug run, where the IDE debugger catches exceptions), and the alternative (get_system_log for System.DebugLog). Exclusions and alternatives are explicit rather than implied.

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

get_item_descriptionGet or Set Item DescriptionA
DestructiveIdempotent

Reads or sets the Description of a project item or member (the note shown in the IDE's Inspector, not its code): the one at location, or the selected one. Without value it returns the description; with value it replaces it and returns 'OK', and an empty value clears it. Giving a location also selects that item. A set stays in the IDE until save_project. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault
valueNoNew description, replacing the old one. Omit to read it instead.
locationNoDot-separated path, e.g. 'Module1.Helper'. Omit for the selected item.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations, it discloses meaningful behavior: an empty value clears the description, a set returns 'OK' and persists only until save_project, giving a location also changes the IDE selection, and the IDE must be running with the project open. These are exactly the side effects an agent needs.

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 front-loaded with the core read/set distinction and then tersely covers side effects and prerequisites. Every sentence adds useful information with no 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?

With no output schema, the description still explains the return value ('OK' or the description text), covers persistence across save_project, notes the selection side effect, and states the required runtime environment. Nothing essential is missing.

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

Parameters4/5

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

Schema coverage is 100% and already documents both parameters, but the description adds meaning beyond the schema: it explains that an empty value clears the description and that supplying location also selects that item in the IDE.

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 dual verb (reads or sets) and resource (Description of a project item or member), and explicitly distinguishes it from code-related siblings by clarifying it is the Inspector note, not the item's code.

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 clearly states the read vs. set behavior based on presence of the value parameter, and that omitting location defaults to the selected item. It does not explicitly name alternative tools like get_code or set_declaration, but the conditions for use are otherwise clear.

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

get_project_infoGet Project InfoA
Read-onlyIdempotent

Returns facts about the project open in the Xojo IDE, one per line: the .xojo_project path, the Project Directory holding its .xojo_code and .xojo_window files, the Xojo version, the selected location and its type, and whether Agentic Mode was on at the last save. Call it first when working on files on disk, since lint_project_file and direct edits need absolute paths. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's added value is the environment prerequisite (IDE running, project open) and the return shape (one fact per line). That is meaningful context an agent needs before calling, though it says nothing about failure behavior when no project is open.

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

Conciseness4/5

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

Two sentences, front-loaded with what is returned and followed by the call-ordering rule. The field enumeration is dense but each item maps to a real return value; only the version/Agentic Mode detail borders on surplus.

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?

With no output schema, the description must describe the return payload — and it does, item by item. Combined with the stated prerequisite and the sequencing advice relative to lint_project_file, an agent has everything needed to call this 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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline is 4. The description correctly implies a no-argument call by describing output only.

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?

States a specific verb and resource ("Returns facts about the project open in the Xojo IDE") and enumerates exactly which facts: project path, project directory, Xojo version, selected location and type, Agentic Mode state. That enumeration separates it from siblings like get_current_location and get_code, which return only a subset.

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?

"Call it first when working on files on disk" gives explicit ordering guidance and names the dependent tools (lint_project_file, direct edits) that need absolute paths. It also states the prerequisite that the IDE must be running with the project open. No explicit when-not-to-use case, so it falls short of a 5.

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

get_selected_textGet Selected TextA
Read-onlyIdempotent

Returns the text selected in the Xojo IDE's code editor, after a first line 'start= length=' giving its position in characters from the start of the item's code. Fails if no code editor is active. Use it to see what the user has highlighted, or to find offsets for set_selected_text; to read a whole item, use get_code. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare it a safe read (readOnlyHint, idempotent, non-destructive), yet the description adds materially more: the exact first-line output format 'start=<offset> length=<n>' with offset semantics, the failure mode ('fails if no code editor is active'), and the environment precondition. That is precisely the residual context annotations cannot carry.

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?

Dense but purposeful, with the return shape front-loaded in the first sentence and the usage/sibling routing following. The opening sentence is long and packs return format, offset definition and failure mode together, which slightly hurts scanability but no sentence is wasted.

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, yet the description fully specifies the return shape and its header line, the failure case, and the operating precondition. For a zero-parameter read tool, nothing an agent needs in order to call it correctly or interpret the result is missing.

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

Parameters4/5

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

Zero parameters, so baseline is 4. The description nevertheless supplies the meaning the caller needs: the offset unit is characters from the start of the item's code, which is the same coordinate system set_selected_text expects — useful given the sibling relationship.

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?

States a specific verb and resource: returns the text selected in the Xojo IDE's code editor. It also names the boundaries against siblings (get_selected_text vs. get_code vs. set_selected_text), so the agent can distinguish this tool from them without opening the schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use cases ('see what the user has highlighted', 'find offsets for set_selected_text') and a clear when-not-to ('to read a whole item, use get_code'), naming the alternative tool directly. Prerequisite condition (IDE running with project open) is stated too.

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

get_system_logGet System LogA
Read-onlyIdempotent

Returns recent System.DebugLog output of a Xojo app from the macOS unified log (log show): a debug run started by run_project, or a built app. Only lines the Xojo framework logged are returned; when there are none but the process logged something else, up to 200 of those raw entries are returned instead, labelled as such. An empty result almost always means no System.DebugLog call ran, so add one and query again; prefer this over MessageBox for tracing. Needs no IDE.

NameRequiredDescriptionDefault
secondsNoHow far back to look, in seconds. Default 60, max 3600.
process_nameYesExact process name: the app's name plus '.debug' for a debug run (e.g. 'MyApp.debug'), or the app's name for a built app. Letters, digits, spaces, '.', '_' and '-' only.

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive/closed-world, and the description still adds real behavioral detail: only framework-logged lines are returned, with a documented fallback of up to 200 raw entries labelled as such, plus the meaning of an empty result and the fact that no IDE is required. That is materially more than the annotations provide.

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?

Front-loaded with the core behavior and no filler sentences; each clause carries information. It is a dense single paragraph, and the trailing 'Needs no IDE' is the only bit that feels tacked on rather than essential.

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, and the description compensates by explaining what is returned (framework log lines, or up to 200 labelled raw entries) and what an empty result implies. An agent has everything needed to call it and interpret the response.

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

Parameters3/5

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

Schema description coverage is 100%, so both `seconds` and `process_name` are already documented with defaults, bounds, and naming rules. The description's mention of 'a debug run started by run_project, or a built app' lightly contextualizes process_name but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource: returns recent System.DebugLog output of a Xojo app from the macOS unified log via `log show`. It is clear what comes back and under what circumstances (debug run via run_project, or a built app), but it never names the very similar sibling get_debug_log, so an agent must infer the boundary itself.

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?

Gives concrete operating context: use it for a debug run or a built app, prefer it over MessageBox for tracing, and if the result is empty add a System.DebugLog call and query again. It stops short of an explicit when-not-to-use or a named alternative among the siblings.

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

lint_project_fileLint Project FileA
Read-onlyIdempotent

Checks a .xojo_code or .xojo_window file on disk for mistakes the IDE reports badly or not at all. Errors are unbalanced #tag/#tag End pairs, which break the file. Warnings are a constant Default value with characters left unescaped, which can silently truncate it, and things Xojo loads but resolves on its own terms: blocks out of order or after #tag ViewBehavior, and a Flags value that disagrees with the visibility keyword, where the warning says which visibility Xojo will use. Run it after editing a project file directly and before revert_project. Returns 'No issues found' or a count and one 'error|warning: line : ' per finding; findings, errors included, are a normal result, and only a file it cannot read or one of another type fails the call. It reads the file only and needs no IDE.

NameRequiredDescriptionDefault
pathYesAbsolute path to the .xojo_code or .xojo_window file; get_project_info gives the project directory

TDQS

A4.4/5.0
Behavior4/5

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

With annotations already declaring readOnly/idempotent/non-destructive/closed-world, the description still adds real value: it defines the error and warning classes, states that findings—errors included—are a normal result rather than a failure, and clarifies that only an unreadable or wrong-type file fails the call. That failure-mode disclosure is exactly the context annotations cannot convey.

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?

Purpose is front-loaded and every sentence carries information, but the warnings sentence is a long run-on ('and things Xojo loads but resolves on its own terms: blocks out of order or after #tag ViewBehavior, and a Flags value...') that could be split or tightened for faster scanning.

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?

No output schema exists, and the description compensates fully by describing the return format ('No issues found' or a count plus one 'error|warning: line <n>: <message>' per finding) and the failure conditions. Nothing needed to call and interpret it correctly is missing.

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?

Only one parameter, and schema description coverage is 100%, with the schema already telling the agent to use get_project_info for the project directory. The description adds no syntax or format detail beyond saying the target is a file on disk, so the baseline 3 applies.

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?

States a specific verb and resource (checks a .xojo_code or .xojo_window file on disk) and scopes it as catching what the IDE reports badly or not at all, which distinguishes it from the sibling analyze_project. An agent can tell what it does and on what artifact without opening the schema.

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

Usage Guidelines5/5

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

Explicitly says when to run it ('after editing a project file directly and before revert_project'), naming a sibling in the workflow sequence. The 'reads the file only and needs no IDE' clause also tells the agent this is an offline check, complementing the live-IDE siblings.

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

list_doc_topicsList Documentation TopicsA
Read-onlyIdempotent

Lists the pages in the local Xojo documentation index, one title and URL per line. Unfiltered that is the whole index — about 1,600 entries, 150 KB — so pass a filter. An API page's title is the name lookup_class takes. No match is a normal result, not an error. Use this to find which pages exist; search_docs searches their text, and lookup_class reads one. Reads the installed documentation (fails if none was found) and needs no IDE.

NameRequiredDescriptionDefault
filterNoCase-insensitive substring matched against each title and URL (e.g. 'Desktop', 'database'), so 'desktop' also matches every page under a /desktop/ path. Omit to list the whole index.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark this as read-only, idempotent, non-destructive, and not open-world. The description adds important behavioral context beyond that: unfiltered output is about 1,600 entries and 150 KB, it fails if installed documentation was not found, and it needs no IDE.

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 compact and front-loaded: it states what the tool returns, then scale and filter guidance, then sibling-tool routing. Every sentence contributes relevant information without waste.

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, but the description explains the return shape as one title and URL per line. It also covers scale, failure conditions, IDE independence, empty-result semantics, and alternatives, which is complete for a simple one-parameter listing 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 schema already documents the single filter parameter at 100% coverage, including its case-insensitive substring behavior. The description adds useful practical meaning by warning that unfiltered output is very large and therefore the caller should pass a filter, plus it clarifies the relationship between API page titles and lookup_class.

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?

States a specific verb and resource: it lists pages in the local Xojo documentation index, one title and URL per line. It also distinguishes itself from sibling tools by explaining that search_docs searches page text and lookup_class reads one page.

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 says to use this tool to find which pages exist, names the alternatives search_docs and lookup_class, and gives a clear condition for using the filter. It also notes that no match is a normal result, which prevents misinterpreting an empty list as failure.

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

list_project_itemsList Project ItemsA
Read-onlyIdempotent

Lists the project items directly under a location in the open Xojo project's Navigator, as tab-separated names: the top level (App, windows, classes, modules, folders) when location is empty, or what a folder holds. On Xojo 2026r3 an item's members (methods, properties, constants, events) are not listed; read them from its .xojo_code or .xojo_window file, in the folder get_project_info names. A location with nothing listable under it, or one that does not exist, returns a message saying so rather than an error. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault
locationNoDot-separated Navigator path of a folder or item, e.g. 'Build Automation'. Omit for the top level.

TDQS

A4.3/5.0
Behavior5/5

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

Goes well beyond the annotations (which already cover readOnly/idempotent/non-destructive): it discloses the return shape (tab-separated names), the empty-result and nonexistent-location behavior (a message, not an error), the Xojo 2026r3 limitation on member listing, and the environmental prerequisite. That is the class of information an agent cannot get from structured fields.

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 core scope is front-loaded in the first clause, and each subsequent sentence carries a distinct fact (member limitation, empty-result behavior, prerequisite). It is dense but four sentences of similar weight, so the priority ordering is slightly flatter than ideal.

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?

With no output schema, the description responsibly covers return format (tab-separated names), soft-failure messages, and the required IDE state. Minor residual ambiguity remains about whether the response is a single tab-delimited string or a list of records, and about ordering of the returned items.

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

Parameters3/5

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

Schema coverage is 100% and the property description already documents the dot-separated path and omitting for top level. The description explains what happens semantically when location is empty versus a folder, but largely restates the schema rather than adding format, edge-case, or naming-example detail beyond it. Baseline 3 applies.

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?

States a specific verb and resource ("Lists the project items directly under a location in the open Xojo project's Navigator") and immediately defines the two scoping modes (top level when location is empty, folder contents otherwise). It also carves out what it does NOT return (item members), and names the sibling tool get_project_info that supplies the folder paths, so it is distinguishable from neighbors without opening a schema.

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?

Clear context for use: call it to enumerate Navigator contents, and for member information the description redirects to reading .xojo_code/.xojo_window via get_project_info. It also states the prerequisite (Xojo IDE running with the project open). It stops short of explicitly excluding any sibling that might look like an alternative enumerator, so it is not a full when/when-not map.

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

lookup_classLook Up ClassA
Read-onlyIdempotent

Returns the reference page for one Xojo class, control, data type or other API, by name (case-insensitive). If no page has that exact name it tries the Desktop and Web prefixes, so 'Button' finds DesktopButton. By default the page is cut to its description and member tables (methods, properties, events with their signatures), markup stripped; pass member for one member's full entry. An unknown class is an error suggesting search_docs; an unknown member is an error listing the members the page documents. Use this when you know the name; use search_docs for concepts or a name you are unsure of, and list_doc_topics to browse page titles. Reads the installed documentation (fails if none was found) and needs no IDE.

NameRequiredDescriptionDefault
fullNoReturn the unprocessed page instead of the summary. Default false. The summary leaves out the member entries and the sections after them (notes, sample code, compatibility); this is how to read those. Large: String is over 70,000 characters of raw reStructuredText, and output is cut at 100,000.
memberNoReturn only this member's entry (e.g. 'Middle', 'Pressed') rather than the class summary. Case-insensitive.
class_nameYesClass or API name (e.g. 'DesktopButton', 'JSONItem'). An API page's title in list_doc_topics is the name to pass.

TDQS

A4.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive/non-open-world, so the safety profile is covered. The description adds genuinely useful context beyond that: it reads the installed documentation and fails if none was found, needs no running IDE, truncates output at 100,000 characters, and reports errors with suggestions. Those are real behavioral disclosures, but the default output shape is largely restated from the schema's `full` parameter, so this is solid-but-not-distinctive.

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

Conciseness5/5

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

A single dense paragraph, front-loaded with the core behavior and then failure modes and alternatives. Every sentence carries either a routing rule, a default behavior, or an error-handling instruction; nothing is 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?

There is no output schema, and the description compensates by describing exactly what comes back: markup-stripped description and member tables with signatures, or raw reStructuredText when `full` is set, plus size limits. Combined with the named alternatives and prerequisite (installed docs, no IDE), an agent has everything needed to call this 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 coverage is 100%, so the baseline is 3, but the description earns more by explaining the interaction between defaults and `member`: the default view is trimmed to description plus member tables, and `member` yields one member's full entry. It also characterizes the scale of `full` (class String over 70,000 characters of raw reStructuredText), which helps the agent avoid a costly call. Minor redundancy with the schema's own `full` description keeps it from a 5.

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?

States a specific verb and resource ('Returns the reference page for one Xojo class, control, data type or other API, by name') and explicitly distinguishes itself from search_docs and list_doc_topics. The name-resolution behavior (case-insensitive, Desktop/Web prefix fallback) is concrete enough that an agent can predict what a given input will retrieve.

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?

Gives explicit when-to-use routing: 'Use this when you know the name; use search_docs for concepts or a name you are unsure of, and list_doc_topics to browse page titles.' It also states what happens on failure paths (unknown class suggests search_docs; unknown member lists documented members), which steers the agent's recovery behavior rather than leaving it to guess.

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

property_valueGet or Set PropertyA
DestructiveIdempotent

Gets or sets a FRAMEWORK property of a project item in the Xojo IDE — e.g. 'App.OptimizationLevel', 'App.SupportsDarkMode', 'Window1.Title'. This is the supported way to change app and build settings, which otherwise live in the .xojo_project file that must never be hand-edited. IMPORTANT LIMITS: it reaches only properties that are part of the Xojo framework, NOT properties you added yourself, and it CANNOT address controls on a window (there is no 'Window1.PushButton1.Caption'). Values are always strings, even for numeric or boolean properties. A set returns 'OK' without reading the value back, so get it afterwards to confirm it took. A set stays in the IDE until save_project. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault
nameYesQualified property name, e.g. 'App.OptimizationLevel' or 'Window1.Title'. A bare name applies to the currently selected project item.
valueNoIf provided, sets the property; if omitted, returns the current value. Always a string — pass "True"/"False" for booleans, "4" for numbers.

TDQS

A4.7/5.0
Behavior5/5

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

Substantial context beyond the annotations: values are always strings, a set returns 'OK' without read-back so a follow-up get is needed to confirm, changes live only in the IDE until save_project, and the Xojo IDE must be running with the project open. That is exactly the kind of side-effect, verification, and prerequisite information the annotations don't convey.

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?

Purpose comes first, then scope limits, then behavioral notes, then the prerequisite. Every sentence carries distinct information; the only near-duplication is the string-values note, which is minor and reinforces a frequently botched 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?

For a two-parameter getter/setter with no output schema, the description covers naming, value format, return behavior, persistence, and environment prerequisites. An agent has everything needed to call this correctly and verify the result.

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 already 100%, so the baseline is 3. The description still adds value with a third example ('App.SupportsDarkMode') and a negative name example ('Window1.PushButton1.Caption') that clarifies the naming grammar — something the schema's two examples don't establish on their own.

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?

A clear verb+resource pair ("gets or sets a FRAMEWORK property of a project item") followed by three concrete example property paths. The scope limit (framework properties, not user-added ones, not window controls) separates it cleanly from siblings like constant_value or set_code without needing the schema.

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

Usage Guidelines4/5

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

It states the situation this tool is for ("the supported way to change app and build settings, which otherwise live in the .xojo_project file that must never be hand-edited") and names two exclusions. What's missing is direct sibling routing — it never says what to use for custom properties or control captions, leaving the agent to guess among the 30 siblings.

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

revert_projectRevert ProjectA
DestructiveIdempotent

Closes the open Xojo project without saving and reopens it from disk, so the IDE picks up project files edited directly. Every unsaved change in the IDE is discarded, the user's included, so ask the user before calling it; the IDE may also show a prompt they must accept. Use it after editing .xojo_code or .xojo_window files on disk, and do not save_project in between, which would overwrite those edits. Not needed in an Agentic Mode project, where Xojo reloads edited files by itself. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, but the description goes well beyond them by spelling out exactly what is destroyed (every unsaved IDE change, including the user's), that an interactive IDE prompt may appear that a caller must accept, and the precondition that the IDE must be running with the project open. That is the level of behavioral disclosure a destructive no-param tool needs.

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 irreversible warning and user-consent requirement are front-loaded, and each subsequent sentence adds a distinct constraint (disk trigger, save_project exclusion, Agentic Mode exception, IDE prerequisite). It is dense with semicolon-joined clauses and could be split for readability, but no sentence is 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?

With no parameters and no output schema, the description supplies everything an agent needs before calling: preconditions, destructive consequences, consent requirement, an interactive prompt it may encounter, and the sibling call it must avoid. Nothing material is left to inference.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate and the schema-coverage baseline of 4 applies. The description correctly spends no words on arguments and instead covers preconditions and side effects.

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 a specific operation on a specific resource: closing an open Xojo project without saving and reopening it from disk. It also states the purpose of that action (the IDE picks up on-disk edits), which lets an agent distinguish it immediately from save_project or build_project.

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 an explicit trigger (after editing .xojo_code or .xojo_window files on disk), an explicit anti-pattern (do not call save_project in between, which would overwrite the edits), and an explicit exclusion (not needed in an Agentic Mode project). It also requires asking the user first, so the routing decision is unambiguous.

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

run_ide_scriptRun IDE ScriptA
Destructive

Executes an arbitrary Xojo IDE script. Use Print to return a value, once: with several Prints the first that says something is returned, and an error outranks output. A script that prints nothing reports that it ran. Do not leave the script early with Return: xmcp appends a final line that tells it the script finished, and a script that never reaches it is waited on until the timeout. Powerful escape hatch — IDE scripting can quit Xojo, close/reopen projects, create or delete items, write files, and invoke shell commands via DoShellCommand. Prefer a dedicated tool when one fits (list_project_items, get_code, build_project, etc.); use this only when nothing else does, and pause before running anything that quits the IDE or touches the shell. It cannot delete project items: IDE scripting has no command for that (see create_project_item). A runtime error comes back with no message or line number. Needs the Xojo IDE running.

NameRequiredDescriptionDefault
scriptYesIDE script code (XojoScript syntax). Use Print for output.
timeoutNoMilliseconds to wait for the answer. Default 10000. A script that runs longer is not stopped: xmcp keeps the connection open and refuses other requests until it answers, so set this high enough up front.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare destructive=true and openWorld=true, but the description goes well beyond them: it enumerates concrete destructive capabilities (quitting Xojo, closing/reopening projects, creating or deleting items, writing files, DoShellCommand), documents the output protocol (first Print wins, errors outrank output, silent scripts report success), warns that Return prevents the completion signal and leads to waiting until timeout, and notes runtime errors arrive with no message or line number. It also states the IDE must be running.

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?

Purpose is front-loaded in the first clause, followed by output contract, then hazards, then routing guidance — a sensible escalation order. Every sentence carries either a behavioral fact or a decision rule; there is no filler despite the length.

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?

With no output schema, the description supplies the full return-value contract, error behavior, timeout risk, destructive capability list, and the prerequisite that the IDE be running. For a destructive, open-world escape hatch with only two parameters, nothing an agent needs before invoking it is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and the description adds real semantics on top: the return-value convention for the 'script' parameter (Print, first non-empty Print wins, error precedence, silent = success) and the consequence of an early Return. It does not restate the timeout parameter's blocking behavior, which the schema already covers in detail.

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?

States a specific verb and resource ('Executes an arbitrary Xojo IDE script') and immediately frames its position in the toolset as an escape hatch rather than a general-purpose tool. The explicit routing sentence naming list_project_items, get_code, and build_project makes it distinguishable from every relevant sibling without opening another schema.

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?

Gives an explicit when-to-use rule ('use this only when nothing else does'), an explicit when-not rule (prefer a dedicated tool when one fits), a caution threshold ('pause before running anything that quits the IDE or touches the shell'), and a hard boundary with a pointer to the correct alternative ('It cannot delete project items... see create_project_item'). This is about as complete as usage guidance gets.

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

run_projectRun ProjectA

Runs the open Xojo project in the IDE's debugger. Call it only when the user asks to run. Returns 'Project launched in debug mode.' once the app starts, or the compile errors that stopped it. Runtime exceptions are caught by the IDE's debugger and are invisible here, so ask the user what they see. In an Agentic Mode project, agentic_run returns the compiler's errors with their locations instead. Step through the session with debug_control and end it with stop_project. Waits up to 30 seconds. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare the mutation/safety profile; the description adds real behavioral context beyond that: the success string, that compile errors are returned but runtime exceptions are invisible and must be asked of the user, a 30-second wait cap, and the prerequisite that the IDE must be running with the project open. That is the full burden carried well.

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?

Front-loaded with the action and the primary guard, then prerequisites last. It is dense with several sibling references, but each sentence carries distinct decision-relevant information; only the runtime-exception aside is mildly 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?

No output schema exists, and the description compensates by describing both return cases (launch confirmation vs. compile errors) plus the invisible runtime-exception gap. Prerequisites and the wait limit round out everything an agent needs to call 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?

Zero parameters, so the baseline of 4 applies; there is no parameter semantics to explain and the description correctly spends no space on them.

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?

States a specific verb and resource ('Runs the open Xojo project in the IDE's debugger'), which is precisely distinguishable from build_project (compile only) and agentic_run (Agentic Mode compile-error reporting). An agent knows exactly what this does without opening the schema.

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

Usage Guidelines5/5

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

Explicitly constrains invocation ('Call it only when the user asks to run') and names alternatives with the condition that selects them: agentic_run for Agentic Mode projects, debug_control to step, stop_project to end. This is textbook when/when-not/alternatives guidance.

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

save_projectSave ProjectA
DestructiveIdempotent

Saves the open Xojo project, writing the IDE's in-memory copy over the project's files on disk. Returns 'Project saved.', or 'No changes to save.' when no file changed within two seconds. Call it when IDE-side edits (set_code, edit_code, create_project_item and the like) should persist, and before editing on disk a file you changed through the IDE. Never call it between editing a file on disk and revert_project: it would overwrite the disk edit. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, and the description adds the concrete consequences behind that: disk files are overwritten, edits made on disk can be lost in one specific ordering, the IDE must be running with the project open, and the exact return strings including the two-second no-change window.

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

Conciseness4/5

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

Three sentences, each doing distinct work: mechanism, when to call, when not to call, plus a precondition. It is dense rather than padded, though the precondition about the IDE running could have been folded into the opening sentence for tighter front-loading.

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 zero-parameter mutation with no output schema, the description covers mechanism, preconditions, return values, and the dangerous ordering relative to revert_project — everything an agent needs to call it safely.

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

Parameters4/5

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

The tool takes no parameters, so there is nothing for the description to disambiguate; baseline 4 applies.

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?

States a specific verb and resource plus the exact mechanism: writes the IDE's in-memory copy over the project's files on disk. This clearly distinguishes it from sibling write tools like set_code, edit_code, or revert_project that touch either memory or disk alone.

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 when-to-use (after IDE-side edits from set_code/edit_code/create_project_item should persist, and before editing on disk a file changed through the IDE), explicit when-not (never between a disk edit and revert_project, since it would overwrite the disk edit), and it names the sibling that plays the alternative role.

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

scaffold_code_blockScaffold Code BlockA
Read-onlyIdempotent

Generates a correctly formatted #tag block for a .xojo_code or .xojo_window file: a method, shared method, property, constant, event definition (#tag Hook), control event handler (#tag Events block) or window event handler. Use it instead of writing #tag syntax from memory when editing a project file on disk: it pairs each Flags value with its visibility keyword, escapes a constant's Default value, and indents the body the way the IDE does. It only returns text; insert it yourself, in the block order usage-guide.md's Format Rules give and before #tag ViewBehavior, then check the file with lint_project_file. A control_event result is a whole #tag Events block: if the control already has one, insert just its inner #tag Event … #tag EndEvent. An argument that does not apply to block_kind, a name that is not a Xojo identifier, or a constant value it cannot escape safely is an error. Reads no files and needs no IDE.

NameRequiredDescriptionDefault
bodyNoCode for a method or event handler, one statement per line; indent nested blocks with two spaces. Omit for an empty body
nameYesThe member's name; for control_event, the control's name (e.g. Button1); for window_event, the event's name (e.g. Opening)
typeNoproperty: its data type (required). constant: String, Integer, Double, Boolean or Color (default String)
eventNocontrol_event only: the event's name, e.g. Pressed
signatureNoParameter list and optional return type, e.g. '(count As Integer) As String'. A return type makes it a Function. Defaults to '()'
block_kindYesmethod, shared_method, property, constant, event_definition, control_event, or window_event
visibilityNopublic, protected or private (method, shared_method, property, constant); default public. In a module, public means global
default_valueNoconstant only: the raw, unescaped value; this tool escapes it

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is known, but the description still adds real behavioral detail beyond them: the tool writes nothing and must be followed by manual insertion, it normalizes visibility keywords against Flags, escapes the constant's Default value, and applies IDE-style indentation. It also defines failure modes (inapplicable argument for block_kind, non-identifier name, unescapable constant value), which no annotation covers.

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?

Front-loaded with the purpose and the block-kind enumeration before the procedural insertion guidance, so an agent can stop reading early. It is dense rather than padded, though the clause about usage-guide.md Format Rules and placement before #tag ViewBehavior adds length that a pointer could have compressed.

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?

With no output schema, the description carries the return-value burden, and it does so by stating the result is text only and describing what a control_event result contains. It stops short of showing the returned block's shape (headers, Flags line layout) or noting whether the text includes surrounding delimiters, which is the remaining gap for a text-generating 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?

Schema coverage is 100%, so the baseline would be 3; the description adds cross-parameter semantics the schema cannot express — that control_event yields an entire #tag Events block, and that only its inner Event/EndEvent portion should be pasted when one already exists, plus the general rule that arguments not applying to block_kind are errors. The individual per-parameter meanings still live in the schema rather than the description, keeping it below a 5.

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 gives a specific verb ("Generates") plus a precisely enumerated resource: a #tag block for a .xojo_code or .xojo_window file, with the seven supported block kinds listed inline. An agent can distinguish it from siblings like edit_code or set_code because it is explicitly a text-generating, no-side-effect scaffolder rather than a file mutator.

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 states the use case explicitly (use instead of writing #tag syntax from memory when editing a project file on disk) and names the follow-up sibling, lint_project_file, for verification. It also states the exclusions: it only returns text, the caller must insert it, and it reads no files and needs no IDE — leaving nothing about when-to-use to inference.

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

search_docsSearch DocumentationA
Read-onlyIdempotent

Searches the full text of the local Xojo documentation — guides, tutorials and API pages — for a case-insensitive literal substring. Returns up to max_results excerpts in document order (not ranked), each headed by its section title, with the matching line marked '>>>'. A multi-word query must appear verbatim, so one distinctive word usually finds more. No match is a normal result, not an error. Use this for concepts, how-tos, error messages, or a class whose name you are unsure of; when you know the name, lookup_class returns its reference page directly. Reads the installed documentation (fails if none was found) and needs no IDE.

NameRequiredDescriptionDefault
queryYesText to find, matched case-insensitively as a literal substring (e.g. 'JSONItem', 'prepared statement')
max_resultsNoMost excerpts to return. Default 5.
context_linesNoLines to include before and after each match. Default 10.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, closed-world), and the description adds substantial context beyond them: results are unranked document order, excerpts carry section titles and '>>>' markers, multi-word queries must appear verbatim, and the tool reads installed docs and fails if none was found. This is exactly the behavioral detail an agent needs before invoking it.

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?

Front-loaded with the core action and search semantics, followed by return format, query guidance, sibling routing, and environment requirements. Every sentence contributes a distinct operational fact with no 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?

With no output schema, the description fully explains the return shape (ordered excerpts, section headings, marked matching lines) and the no-match case. It also covers the environment prerequisite, leaving nothing material for an agent to guess.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: query is a verbatim literal substring, multi-word phrases must match exactly, and max_results governs excerpt count. It says nothing extra about context_lines, which is left entirely to the schema, so it falls just short of a 5.

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?

States a specific verb and resource ('Searches the full text of the local Xojo documentation') plus the exact matching semantics (case-insensitive literal substring). It explicitly distinguishes itself from the sibling lookup_class, so an agent can choose between them without opening either schema.

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?

Gives explicit when-to-use cases ('concepts, how-tos, error messages, or a class whose name you are unsure of') and names the alternative with its selecting condition ('when you know the name, lookup_class returns its reference page directly'). It also preempts a common misread by saying 'No match is a normal result, not an error.'

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

select_project_itemSelect Project ItemA
Read-onlyIdempotent

Selects an item or member in the Xojo IDE's Navigator by dot-separated path and returns where the IDE landed and its type. A path that does not exist is an error naming where the IDE is instead, so a near miss shows the right spelling. Changes only the IDE's selection, not the project. Tools that take a location select it themselves; use this for those that act on the current item: get_selected_text, set_selected_text, analyze_project with scope 'item', and create_project_item without parent_location. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault
item_pathYesDot-separated path, e.g. 'App', 'Module1.MyMethod', or on Xojo 2026r3+ 'Window1.Controls.Button1.Pressed'

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the bar is lower, yet the description adds real behavior: it mutates only IDE selection state, not the project, and a nonexistent path errors by naming where the IDE actually is, which doubles as spell-check feedback. It does not spell out what the return payload contains beyond 'where the IDE landed and its type'.

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

Conciseness4/5

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

Three sentences, each carrying distinct load: what it does, its error affordance, its selection-only scope, then the routing list and prerequisite. Dense but front-loaded and free of filler; only the enumerated sibling list runs long relative to a one-parameter tool.

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 single-parameter, non-destructive tool with no output schema, the description covers action, return shape, error behavior, state-mutation scope, prerequisite, and the exact sibling contexts it serves. Nothing an agent needs in order to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and already carries the dot-separated path examples, so the baseline is 3. The description adds failure semantics for the parameter (nonexistent path → error naming the current location) and echoes the path form, giving modest value 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?

States a specific verb+resource+mechanism: selects an item in the Xojo IDE Navigator by dot-separated path, and returns where the IDE landed plus its type. It also distinguishes itself from the large sibling set by naming the tools that select their own location instead of relying on this one.

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?

Gives an explicit routing rule: tools that take a location select it themselves, so this is for those acting on the current item, with four named callers (get_selected_text, set_selected_text, analyze_project with scope 'item', create_project_item without parent_location). Prerequisite ('Xojo IDE running with the project open') is stated outright.

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

set_codeSet CodeA
DestructiveIdempotent

Replaces the whole code of one method, event handler or other code item in the open Xojo project: the item at location, or the one open in the code editor when location is omitted. Everything the item held is overwritten, so for a change to existing code prefer edit_code, which sends only the part that changes. The name, parameters and return type are not part of the code; set_declaration changes those. A path that does not exist, or an item with no code editor, is an error and nothing is written. Reaches the same items as get_code. The change stays in the IDE until save_project. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault
codeYesThe item's new code, replacing all of it
locationNoDot-separated path, as for get_code. Omit for the item open in the code editor.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, but the description adds real context beyond that: everything the item held is overwritten, failures write nothing, the change lives only in the IDE until save_project, and the Xojo IDE must be running with the project open. That is exactly the operational detail an agent needs before a destructive write.

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?

Front-loaded with the core action and scope, and every following sentence carries information (alternatives, error behavior, persistence, prerequisite). It is dense and somewhat run-on with stacked clauses, but none of the content is 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 destructive two-parameter write tool with no output schema, the description covers prerequisites, failure semantics, what is destroyed, what is out of scope, and how the change persists. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and already documents both parameters, so the description only needs to add meaning. It does add a useful cross-reference (the path format is the same as get_code, and it reaches the same items), but it does not expand on the code payload beyond what the schema states.

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?

States a specific verb (replaces) and resource (the whole code of one method/event handler/code item) with scope (in the open Xojo project). It explicitly distinguishes itself from edit_code and set_declaration, so an agent can separate the three without opening any schema.

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?

Names the alternatives and the conditions that select them: use edit_code for a change to existing code, set_declaration for name/parameters/return type. It also states when the tool is not appropriate (nonexistent path, item with no code editor) and what follow-up call is needed (save_project).

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

set_declarationSet DeclarationA
DestructiveIdempotent

Sets the name, type, scope and parameters of the CURRENT method or property in the Xojo IDE. This is the other half of create_project_item: DoCommand "NewProperty" creates a blank, untyped property, and this is what names and types it. NOTE the two argument meanings — for a METHOD, parameters is the parameter list ('x As Integer, y As Integer') and data_type is the return type; for a PROPERTY, parameters is the DEFAULT VALUE and data_type is the property's type. Every field is replaced, so pass the current values of those you are keeping. Returns 'OK: '. A constant or other item kind is refused with an error that names it, as is a location that does not exist. The change stays in the IDE until save_project. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault
nameYesThe method's or property's name, new or unchanged
scopeNo'Public' (default), 'Protected' or 'Private'
locationNoDot-separated path to select first (e.g. 'Window1.MyMethod'). Omit to act on whatever is already current — which is what you want directly after create_project_item.
data_typeNoFor a property, its type ('String', 'Integer'). For a method, its return type. Omit for a method that returns nothing.
implementsNoInterface member this implements, e.g. 'Readable.Read'. Omit if none.
parametersNoFor a method, the parameter list ('x As Integer, y As Integer'). For a property, the default value.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, and the description adds real context beyond them: 'Every field is replaced, so pass the current values of those you are keeping', the 'OK: <location>' return value, the named error cases, and that the change stays in the IDE until save_project. That is exactly the behavioral disclosure an agent needs before invoking a destructive mutation.

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?

Front-loaded with the action and the sibling relationship, and every sentence carries distinct information (semantics warning, replace-all behavior, return value, error cases, save requirement). It is dense but not padded; the packed NOTE sentence is the only mild readability cost.

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 six-parameter destructive mutation with no output schema, the description covers the return value, failure modes, persistence semantics, the create_project_item workflow, and the environment prerequisite. Nothing material is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantic disambiguation with the NOTE that `parameters` and `data_type` swap meaning between a method and a property — the most likely source of a mis-call. It reinforces rather than merely repeats 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?

States a specific verb (Sets) and the exact resource (name, type, scope, parameters of the current method or property) in the Xojo IDE. It also positions itself relative to create_project_item, so an agent can distinguish it from sibling tools like set_code or create_project_item without opening a schema.

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?

Gives clear context: it is the second half of the create_project_item flow ('DoCommand "NewProperty" creates a blank, untyped property, and this is what names and types it'), and it names a hard exclusion (constants or other item kinds are refused) plus the prerequisite that the Xojo IDE must be running with the project open. It does not explicitly route to a sibling for the 'change existing code' case, keeping it just short of a 5.

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

set_selected_textReplace Selected TextA
Destructive

Replaces the selection in the Xojo IDE's code editor with text, or inserts it at the cursor when nothing is selected. Pass selection_start to select a range first; otherwise it acts on whatever the user or an earlier call left selected. Fails if no code editor is active. For a change you can describe by its content, edit_code is more reliable because it does not depend on offsets. The change stays in the IDE until save_project. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault
textYesText to put in place of the selection
selection_startNoCharacter offset, from the start of the item's code, to select from before replacing. Omit (or -1) to use the current selection.
selection_lengthNoCharacters to select from selection_start. Default 0, which inserts without replacing anything. Ignored without selection_start.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds real value: the edit stays in the IDE until save_project, the IDE must be running with the project open, and it fails when no code editor is active. Doesn't describe the return value, but no output schema exists so this is a minor gap.

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

Conciseness5/5

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

The primary behavior is front-loaded in the first sentence, followed by parameter behavior, alternative tool, and prerequisites. Every sentence carries actionable information with no 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 3-parameter mutating tool with full schema coverage and no output schema, the description covers behavior, selection semantics, alternative tools, prerequisites, and persistence. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description goes slightly beyond the schema by explaining the two modes (pass selection_start to select a range, otherwise act on the current selection), reinforcing the offset-vs-selection semantics.

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?

States a specific verb and resource ('Replaces the selection in the Xojo IDE's code editor with text') plus the fallback behavior when nothing is selected. It is clearly distinguishable from siblings like set_code and edit_code.

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 names the alternative ('edit_code is more reliable because it does not depend on offsets') and the condition that selects it (content-describable change vs offset-based). Also states prerequisites and the failure condition.

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

stop_projectStop Debug SessionA
DestructiveIdempotent

Ends the Xojo IDE's debug session by killing the app it is running, as started by run_project or agentic_run. The app is stopped outright, so anything it has not saved is lost. Returns 'Debug session stopped.' whether or not anything was running. Needs the Xojo IDE running with the project open.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Goes well beyond the annotations by warning that unsaved work in the running app is lost outright and that the same confirmation string is returned regardless of whether anything was running. The prerequisite on the IDE adds operational context. It does not state the failure mode when the IDE is not running, which keeps it from a 5.

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

Conciseness5/5

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

Three tight sentences, each covering a distinct need: what it acts on, the data-loss consequence, the return value, and the prerequisite. Front-loaded with the action rather than preamble.

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 zero-parameter tool with annotations already declaring destructive/idempotent behavior, the description supplies everything else an agent needs: the causally linked sibling, the irreversibility, the constant return value, and the environment prerequisite.

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

Parameters4/5

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

The tool takes no parameters, so there is nothing for the description to disambiguate. Baseline 4 applies for a zero-parameter 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?

States a concrete verb and resource ("Ends the Xojo IDE's debug session by killing the app it is running") and ties the resource to the sibling calls that started it (run_project, agentic_run). An agent can distinguish this from run/build tools without opening the schema.

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

Usage Guidelines4/5

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

Gives clear context for when this applies (after run_project or agentic_run) plus the prerequisite that the IDE must be running with the project open. It stops short of explicitly distinguishing itself from the sibling debug_control, which an agent could reasonably consider for stopping a session, so it is not full when/when-not guidance.

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

Tool Schema Changelog

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

  1. 20 tool updatesv3.7.1
    • Changedagentic_run1 field changed
      • changedInput schema / properties / project_dir / description
        Previous value: -"Folder containing the .xojo_project. Defaults to the project open in the IDE."New value: +"Absolute path of the folder containing the .xojo_project. Omit to use the project open in the IDE, which needs the IDE socket."
    • Changedanalyze_project1 field changed
      • changedInput schema / properties / scope / description
        Previous value: -"Scope to analyze: \"project\" (default) or \"item\" (currently selected item only)."New value: +"\"project\" (default) or \"item\", the item selected in the Navigator; select it first with select_project_item."
    • Changedbuild_project2 fields changed
      • changedInput schema / properties / build_type / description
        Previous value: -"Build target type (0=Default, 5=macOS Cocoa, 9=Windows 32-bit, 14=Windows 64-bit, 16=Linux 32-bit, 17=Linux 64-bit, 18=Linux ARM, 24=macOS Universal)."New value: +"Build target: 0 = default (the default), 5 = macOS Cocoa, 9 = Windows 32-bit, 14 = Windows 64-bit, 16 = Linux 32-bit, 17 = Linux 64-bit, 18 = Linux ARM, 24 = macOS Universal."
      • changedInput schema / properties / reveal / description
        Previous value: -"Whether to reveal built app in Finder/Explorer."New value: +"Show the built app in Finder afterwards. Default false."
    • Changedconstant_value2 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"Simple or fully qualified constant name (e.g. 'kVersion' or 'App.kVersion')"New value: +"Constant name, fully qualified, e.g. 'App.kVersion' or 'Module1.kLimit'; a bare name may not resolve"
      • changedInput schema / properties / value / description
        Previous value: -"If provided, sets the constant; if omitted, returns current value"New value: +"New value, as text. Omit to read the current value instead."
    • Changedcreate_project_item1 field changed
      • changedInput schema / properties / parent_location / description
        Previous value: -"Dot-separated path to navigate to first (e.g. 'Module1')"New value: +"Dot-separated path of the item to create inside, e.g. 'Module1' or 'Window1'; selected first. Omit to use the current selection."
    • Changedestimate_request_cost2 fields changed
      • changedInput schema / properties / planned_tools / description
        Previous value: -"Comma-separated list of expected tool calls"New value: +"Comma-separated tool names you expect to call, e.g. 'search_docs, get_code'. Only list_doc_topics, lookup_class, search_docs, get_code and set_code affect the rating."
      • changedInput schema / properties / request / description
        Previous value: -"Natural language request (e.g. 'Add a ListBox to Window1')"New value: +"The task in plain words, e.g. 'Add a ListBox to Window1'. Longer text and words such as 'entire', 'refactor' or 'docs' raise the rating."
    • Changedget_code1 field changed
      • changedInput schema / properties / location / description
        Previous value: -"Dot-separated path (e.g. 'Module1.Method1'). Reads current location if empty."New value: +"Dot-separated path, e.g. 'Module1.Method1', 'Window1.Opening' or 'Window1.Controls.Button1.Pressed' (note the Controls segment). Omit for the item open in the code editor."
    • Changedget_debug_log1 field changed
      • changedInput schema / properties / clear / description
        Previous value: -"Delete log file after reading"New value: +"Delete the log file after reading it. Default false."
    • Changedget_item_description2 fields changed
      • changedInput schema / properties / location / description
        Previous value: -"Dot-separated path to navigate to first"New value: +"Dot-separated path, e.g. 'Module1.Helper'. Omit for the selected item."
      • changedInput schema / properties / value / description
        Previous value: -"If provided, sets description; if omitted, reads it"New value: +"New description, replacing the old one. Omit to read it instead."
    • Changedget_system_log2 fields changed
      • changedInput schema / properties / process_name / description
        Previous value: -"Process name filter (e.g. 'MyApp.debug')"New value: +"Exact process name: the app's name plus '.debug' for a debug run (e.g. 'MyApp.debug'), or the app's name for a built app. Letters, digits, spaces, '.', '_' and '-' only."
      • changedInput schema / properties / seconds / description
        Previous value: -"How many seconds back to search (default 60, max 3600)"New value: +"How far back to look, in seconds. Default 60, max 3600."
    • Changedlint_project_file1 field changed
      • changedInput schema / properties / path / description
        Previous value: -"Absolute path to the .xojo_code or .xojo_window file"New value: +"Absolute path to the .xojo_code or .xojo_window file; get_project_info gives the project directory"
    • Changedlist_doc_topics1 field changed
      • changedInput schema / properties / filter / description
        Previous value: -"Keyword to filter topics (e.g. 'Desktop', 'database'). Returns all if empty."New value: +"Case-insensitive substring matched against each title and URL (e.g. 'Desktop', 'database'), so 'desktop' also matches every page under a /desktop/ path. Omit to list the whole index."
    • Changedlist_project_items1 field changed
      • changedInput schema / properties / location / description
        Previous value: -"Dot-separated project path (e.g. 'App' or 'Module1.Method1'). Leave empty for top-level items."New value: +"Dot-separated Navigator path of a folder or item, e.g. 'Build Automation'. Omit for the top level."
    • Changedlookup_class2 fields changed
      • changedInput schema / properties / class_name / description
        Previous value: -"Class name to look up (e.g. 'DesktopButton', 'JSONItem')"New value: +"Class or API name (e.g. 'DesktopButton', 'JSONItem'). An API page's title in list_doc_topics is the name to pass."
      • changedInput schema / properties / full / description
        Previous value: -"Return the unprocessed documentation page. Large: String is over 70,000 characters of raw reStructuredText."New value: +"Return the unprocessed page instead of the summary. Default false. The summary leaves out the member entries and the sections after them (notes, sample code, compatibility); this is how to read those. Large: String is over 70,000 characters of raw reStructuredText, and output is cut at 100,000."
    • Changedrun_ide_script1 field changed
      • changedInput schema / properties / timeout / description
        Previous value: -"Timeout in milliseconds (default 10000)"New value: +"Milliseconds to wait for the answer. Default 10000. A script that runs longer is not stopped: xmcp keeps the connection open and refuses other requests until it answers, so set this high enough up front."
    • Changedsearch_docs3 fields changed
      • changedInput schema / properties / context_lines / description
        Previous value: -"Lines before/after match to include"New value: +"Lines to include before and after each match. Default 10."
      • changedInput schema / properties / max_results / description
        Previous value: -"Max sections to return"New value: +"Most excerpts to return. Default 5."
      • changedInput schema / properties / query / description
        Previous value: -"Search term (e.g. 'JSONItem', 'database')"New value: +"Text to find, matched case-insensitively as a literal substring (e.g. 'JSONItem', 'prepared statement')"
    • Changedselect_project_item1 field changed
      • changedInput schema / properties / item_path / description
        Previous value: -"Dot-separated path (e.g. 'App', 'Module1.MyMethod')"New value: +"Dot-separated path, e.g. 'App', 'Module1.MyMethod', or on Xojo 2026r3+ 'Window1.Controls.Button1.Pressed'"
    • Changedset_code2 fields changed
      • changedInput schema / properties / code / description
        Previous value: -"Source code to write"New value: +"The item's new code, replacing all of it"
      • changedInput schema / properties / location / description
        Previous value: -"Dot-separated path to navigate to first"New value: +"Dot-separated path, as for get_code. Omit for the item open in the code editor."
    • Changedset_declaration2 fields changed
      • changedInput schema / properties / implements / description
        Previous value: -"Interface member this implements, e.g. 'Readable.Read'"New value: +"Interface member this implements, e.g. 'Readable.Read'. Omit if none."
      • changedInput schema / properties / name / description
        Previous value: -"New name for the method or property"New value: +"The method's or property's name, new or unchanged"
    • Changedset_selected_text3 fields changed
      • changedInput schema / properties / selection_length / description
        Previous value: -"Characters to select before replacing"New value: +"Characters to select from selection_start. Default 0, which inserts without replacing anything. Ignored without selection_start."
      • changedInput schema / properties / selection_start / description
        Previous value: -"Character offset to set before replacing. Skipped if -1."New value: +"Character offset, from the start of the item's code, to select from before replacing. Omit (or -1) to use the current selection."
      • changedInput schema / properties / text / description
        Previous value: -"Replacement text to insert"New value: +"Text to put in place of the selection"
  2. 31 tool updates
    • First observedagentic_run
    • First observedanalyze_project
    • First observedbuild_project
    • First observedconstant_value
    • First observedcreate_project_item
    • First observeddebug_control
    • First observededit_code
    • First observedestimate_request_cost
    • First observedget_code
    • First observedget_current_location
    • First observedget_debug_log
    • First observedget_item_description
    • First observedget_project_info
    • First observedget_selected_text
    • First observedget_system_log
    • First observedlint_project_file
    • First observedlist_doc_topics
    • First observedlist_project_items
    • First observedlookup_class
    • First observedproperty_value
    • First observedrevert_project
    • First observedrun_ide_script
    • First observedrun_project
    • First observedsave_project
    • First observedscaffold_code_block
    • First observedsearch_docs
    • First observedselect_project_item
    • First observedset_code
    • First observedset_declaration
    • First observedset_selected_text
    • First observedstop_project

TDQS

A4.2/5.0

Scored across 31 tools

Disambiguation4/5

Tools span distinct domains (IDE editing, build/run, on-disk file tooling, docs, logs), and overlapping clusters like get_code/set_code/edit_code/set_selected_text are carefully disambiguated by descriptions (whole-item vs. selection vs. targeted substring edit). A few pairs still require reading: run_project vs agentic_run, get_current_location vs get_project_info, and constant_value/property_value vs get_item_description all touch adjacent concepts.

Naming Consistency4/5

Most names follow a verb_noun pattern (get_code, set_code, edit_code, create_project_item, list_project_items, lint_project_file, search_docs). Deviations like constant_value, property_value and debug_control use noun phrases, though they remain readable and predictable given the get/set dual semantics.

Tool Count3/5

31 tools is at the heavy end and exceeds the comfortable 3-15 band; several could be merged (constant_value/property_value/get_item_description, run_project/agentic_run). However, the surface genuinely spans IDE automation, code editing, file linting/scaffolding, documentation lookup and logging, and no tool appears purely trivial.

Completeness4/5

Coverage is broad: read/write/edit code, item creation, declarations, constants/properties, build, run, debug stepping, save/revert, on-disk scaffolding and linting, docs search and logs. The notable gap is item deletion (explicitly impossible via IDE scripting, with a documented workaround), which is a minor rather than blocking hole.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    MCP server for macOS Automator that enables AI to control Mac computers by executing AppleScript/JXA, running automation workflows, and performing system-level tasks like sending emails and organizing files.
    6
    4 npm
    4
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Local MCP server that exposes Scrivener projects to AI clients, enabling project creation, binder navigation, document read/write, and metadata updates without opening Scrivener.
    290 npm
    1
    AGPL 3.0
  • A
    license
    B
    quality
    D
    maintenance
    MCP server that enables AI to fully control macOS — mouse, keyboard, terminal, screenshots, window management, UI element detection, and provides AI-optimized information reporting.
    36
    33 npm
    MIT