RunWhen Platform MCP
The RunWhen Platform MCP connects AI coding agents to the RunWhen infrastructure platform, enabling AI-assisted infrastructure management, task authoring, and automation deployment.
Workspace Intelligence
Chat with your infrastructure via natural language using the RunWhen AI assistant
List workspaces, get issues (with severity filtering), list SLXs, view run sessions, and get workspace config indexes
Search workspaces by keyword across tasks, resources, and config
Get issue details and SLX runbook definitions
AI Assistants (Personas)
List, create, update, and delete custom AI personas that tailor how the AI investigates infrastructure, with custom filters, tag filters, and confidence thresholds
Chat Rules & Commands
Create, update, and list chat rules (AI behavior instructions) and slash-commands, including cron-scheduled commands, delivery targets (email/Slack), and auto-approval settings
Knowledge Base Management
Full CRUD on Knowledge Base articles (operational notes, architecture docs, troubleshooting guides) that feed the workspace's Knowledge Overlay Graph
CodeBundle Registry
Search the public registry for pre-built automation codebundles
View full codebundle details (tasks, SLIs, env vars, deployment metadata)
Deploy registry codebundles as SLXs directly to a workspace
Task Authoring (Tool Builder)
Load workspace infrastructure context (
RUNWHEN.md) before writing scriptsValidate bash/Python scripts against the RunWhen contract
Run scripts on live RunWhen runners and monitor status/output
Commit tested scripts as SLXs (tasks or SLIs) to the workspace Git repo, with cron scheduling, secret mappings, env vars, and runtime parameters
Run existing SLXs, delete SLXs, list available secrets, and list runner locations
Skills (Progressive Disclosure)
List and load detailed step-by-step guided workflows on demand (e.g., build-runwhen-task, find-and-deploy-codebundle)
Additional Capabilities
Multi-environment support (beta, prod, etc.)
OAuth and Bearer token authentication
Remote HTTPS access and airgapped environment support
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@RunWhen Platform MCPtell me about the latest issues in my workspace"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
RunWhen Platform MCP
RunWhen Platform MCP lets your coding agent (such as Cursor, Claude, Continue, or Copilot) talk to the RunWhen platform — workspace chat, issues, SLXs, run sessions, and the Tool Builder — over the Model Context Protocol (MCP).
Table of contents
Related MCP server: bricks-and-context
Key features
Workspace chat: Ask the RunWhen AI assistant about your infrastructure. It has access to issue search, task/SLX search, run sessions, resource discovery, knowledge base, graphing, and Mermaid diagrams. Supports selecting an assistant (persona) via
persona_name.Task authoring (Tool Builder): Write bash or Python scripts locally, validate them against the RunWhen contract, run them against live infrastructure, and commit them as SLXs. Use
get_workspace_contextto loadRUNWHEN.mdconventions before writing.Direct data access: List workspaces, issues, SLXs, run sessions; get runbooks and config index; search tasks and resources. Plus create and update chat rules and commands.
Requirements
Python 3.10 or newer
RunWhen account and API token (see Getting a token)
Any MCP client (Cursor, Claude Desktop, Continue, etc.)
Getting started
Install the server:
pip install runwhen-platform-mcpOr from source (use a venv and then point your MCP client at the venv’s
runwhen-platform-mcp):git clone https://github.com/runwhen-contrib/runwhen-platform-mcp.git cd runwhen-platform-mcp python3 -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -e .Set environment variables (see Configuration):
RW_API_URL,RUNWHEN_TOKEN, and optionallyDEFAULT_WORKSPACE.Add the server to your MCP client using the config below. Replace
your-jwt-tokenandyour-workspacewith your RunWhen token and workspace name.
Add the following to your MCP client config:
{
"mcpServers": {
"runwhen": {
"command": "runwhen-platform-mcp",
"env": {
"RW_API_URL": "https://papi.beta.runwhen.com",
"RUNWHEN_TOKEN": "your-jwt-token",
"DEFAULT_WORKSPACE": "your-workspace"
}
}
}
}If you installed from source into a venv, use the full path to the venv’s runwhen-platform-mcp as command (e.g. /path/to/runwhen-platform-mcp/.venv/bin/runwhen-platform-mcp). Find it with which runwhen-platform-mcp after activating the venv.
MCP client configuration
Configure the RunWhen MCP server in your client as shown below. Use the JSON block from Getting started; only the location of the config differs by client.
Cursor
Go to Cursor Settings → MCP → New MCP Server (or edit .cursor/mcp.json). Paste the config from Getting started. If you use a venv, set command to the full path to .venv/bin/runwhen-platform-mcp.
VS Code (GitHub Copilot)
VS Code supports MCP servers through GitHub Copilot. Add the config to your workspace or user settings:
Workspace:
.vscode/mcp.jsonin your project rootUser:
settings.json→"mcp.servers"key
Windows with venv
git clone https://github.com/runwhen-contrib/runwhen-platform-mcp.git
cd runwhen-platform-mcp
python -m venv .venv
.venv\Scripts\activate
pip install -e .Then add to .vscode/mcp.json:
{
"mcpServers": {
"runwhen": {
"command": "C:\\path\\to\\runwhen-platform-mcp\\.venv\\Scripts\\runwhen-platform-mcp.exe",
"env": {
"RW_API_URL": "https://papi.beta.runwhen.com",
"RUNWHEN_TOKEN": "your-jwt-token",
"DEFAULT_WORKSPACE": "your-workspace"
}
}
}
}Replace C:\\path\\to\\ with the actual path where you cloned the repo. To find the exact path, run where runwhen-platform-mcp in a terminal with the venv activated.
Tip: On Windows, pip installs console scripts as
.exefiles in.venv\Scripts\. Always use the full absolute path with backslashes in the MCP config.
macOS / Linux with venv
{
"mcpServers": {
"runwhen": {
"command": "/path/to/runwhen-platform-mcp/.venv/bin/runwhen-platform-mcp",
"env": {
"RW_API_URL": "https://papi.beta.runwhen.com",
"RUNWHEN_TOKEN": "your-jwt-token",
"DEFAULT_WORKSPACE": "your-workspace"
}
}
}
}Claude Desktop
Add the config to:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/claude/claude_desktop_config.json
Use the same mcpServers.runwhen block as in Getting started.
Other MCP clients
Any client that supports MCP over stdio can use this server. Register a local MCP server with:
Command:
runwhen-platform-mcp(or full path to the venv’srunwhen-platform-mcpif you installed from source)Env:
RW_API_URL,RUNWHEN_TOKEN, and optionallyDEFAULT_WORKSPACE
See your client’s docs for where to add MCP servers (e.g. Continue, Codex, Gemini CLI, etc.).
Remote (HTTP) access
The MCP server supports streamable HTTP so your editor can connect over HTTPS without a local Python install.
RunWhen-hosted MCP (beta)
RunWhen operates a shared endpoint for the beta environment:
https://mcp.beta.runwhen.com/mcp
Use your RunWhen beta JWT or Personal Access Token (same as local mode) in the Authorization header. Official docs: RunWhen MCP Server — Remote server (HTTP).
Example mcpServers block (all remote clients below use this shape):
{
"mcpServers": {
"runwhen": {
"url": "https://mcp.beta.runwhen.com/mcp",
"headers": {
"Authorization": "Bearer your-runwhen-token"
}
}
}
}Important: Use
/mcpwith no trailing slash. The server redirects/mcp/→/mcp, which can break some MCP clients.
Workspace: Pass
workspace_nameon tools that support it when you need a specific workspace. RunWhen’s hosted service is configured for the beta API; self-hosted deployments often setDEFAULT_WORKSPACEin server environment variables.
Self-hosted remote MCP
To run the server yourself (Docker, Kubernetes, etc.), set url to your own hostname (for example https://mcp.your-domain.com/mcp) and the same Bearer token pattern. See Running the server in HTTP mode yourself below.
Cursor (remote)
Open Cursor Settings → MCP → New MCP Server, or edit
.cursor/mcp.jsonin your project (or user config, depending on how you scope MCP).Add the
mcpServers.runwhenblock above (https://mcp.beta.runwhen.com/mcpfor hosted beta, or your self-hosted URL) and Bearer token.Reload MCP / restart Cursor if the client does not pick up changes immediately.
Remote MCP support depends on your Cursor version; if url + headers are not accepted, use the local command install instead.
VS Code (GitHub Copilot) (remote)
Add the same
mcpServersentry to.vscode/mcp.json(workspace) or to usersettings.jsonunder the key your VS Code build uses for MCP servers (for examplemcp.servers— check VS Code MCP documentation for the current schema).Use
urlandheadersas in the JSON block above.
Availability of remote MCP in VS Code evolves with Copilot; confirm in release notes if url-based servers are enabled for your version.
Claude Desktop (remote)
Edit the Claude Desktop config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/claude/claude_desktop_config.json
Merge the
mcpServers.runwhenobject from the JSON block above (hosted or self-hosted URL) into the top-levelmcpServersmap (alongside any other servers you already have).Fully quit and restart Claude Desktop.
Other MCP clients
Any client that supports remote or HTTP MCP (streamable HTTP) can use the same url + headers pattern. For a local-only client, use the stdio command + env setup in Getting started.
Running the server in HTTP mode yourself:
Using Docker:
docker run -p 8000:8000 \
-e RW_API_URL=https://papi.beta.runwhen.com \
ghcr.io/runwhen-contrib/runwhen-platform-mcp:latestOr locally:
export MCP_TRANSPORT=http
export MCP_HOST=0.0.0.0
export MCP_PORT=8000
export FASTMCP_STATELESS_HTTP=true
export RW_API_URL=https://papi.beta.runwhen.com
runwhen-platform-mcpThe server exposes:
/mcp/— Streamable HTTP MCP endpoint (POST for tool calls, GET for SSE)/health— Health check (200 OK with version info)/livez— Kubernetes liveness probe
Authentication in HTTP mode: Each client sends credentials with the request — typically Authorization: Bearer <token> (JWT or Personal Access Token). The server validates tokens against the RunWhen API. No RUNWHEN_TOKEN env var is required on the server when clients supply Bearer tokens; each user authenticates with their own token.
OAuth (browser sign-in) — When the server is configured with MCP_BASE_URL plus RunWhen OAuth client credentials (see OAuth for remote HTTP deployments below), MCP clients that support remote OAuth can complete sign-in in the browser instead of embedding a long-lived token. Bearer authentication remains supported for clients that do not use OAuth. Hosted beta exposes discovery at https://mcp.beta.runwhen.com/.well-known/oauth-authorization-server.
Variable | Required | Description |
| Yes | Set to |
| No | Bind address (default: |
| No | Listen port (default: |
| No | Set to |
| No | Comma-separated Host allowlist for FastMCP's |
| No | Set to |
| Yes | RunWhen API base URL. Used for token verification and API calls. |
Note — 421 Misdirected Request troubleshooting. FastMCP 3.4+ ships a Host/Origin guard middleware whose default allow-list is loopback-only (
127.0.0.1,localhost,::1). Any request whoseHostheader doesn't match returns421 Misdirected Request— including OAuth handshakes, which surfaces in Cursor as[Shared MCP process] Streamable HTTP error: Error POSTing to endpoint: Misdirected Request. This server automatically appends theMCP_BASE_URLhostname to the allow-list, so the OAuth-configured install works out of the box. If the public hostname on your ingress differs fromMCP_BASE_URL(rare), setMCP_ALLOWED_HOSTSexplicitly.
OAuth for remote HTTP deployments
Enable interactive OAuth alongside Bearer tokens by registering a confidential OAuth client with your RunWhen environment and pointing the MCP server at it.
MCP_BASE_URL— Public origin of this MCP server (no path), e.g.https://mcp.beta.runwhen.com. Required for OAuth redirects and discovery (/.well-known/oauth-authorization-serveris served from this base).RunWhen OAuth client — Create a confidential client whose authorization server matches your
RW_API_URL(OpenID configuration at{RW_API_URL}/.well-known/openid-configuration). Register the redirect URI:{MCP_BASE_URL}/auth/callback
Example:https://mcp.beta.runwhen.com/auth/callback
Token endpoint auth — Use client secret post (
client_secret_post), matching the server’s OIDC proxy configuration.Set on the MCP server:
MCP_PAPI_OAUTH_CLIENT_ID— client ID from step 2MCP_PAPI_OAUTH_CLIENT_SECRET— client secret from step 2
If these are unset, the server runs in JWKS + PAT/JWT verification only mode (Bearer tokens still work; no browser OAuth).
Legacy Auth0 path — Older deployments may set MCP_AUTH0_CONFIG_URL, MCP_AUTH0_CLIENT_ID, MCP_AUTH0_CLIENT_SECRET, and MCP_AUTH0_AUDIENCE instead of the RunWhen-native client variables above. Prefer RunWhen OAuth when available.
The consent screen shown during OAuth uses RunWhen branding (runwhen_platform_mcp/consent_ui.py).
Multiple environments
If you work across multiple RunWhen environments (e.g. beta and production, or separate workspaces), you can register multiple MCP servers. Important: only enable one at a time unless you specifically need cross-environment workflows — multiple active servers with identical tool names confuse LLM agents.
Use MCP_SERVER_LABEL to give each server a clear identity:
{
"mcpServers": {
"runwhen": {
"command": "runwhen-platform-mcp",
"env": {
"RW_API_URL": "https://papi.app.runwhen.com",
"RUNWHEN_TOKEN": "your-prod-token",
"DEFAULT_WORKSPACE": "my-prod-workspace",
"MCP_SERVER_LABEL": "prod"
}
},
"runwhen-beta": {
"command": "runwhen-platform-mcp",
"env": {
"RW_API_URL": "https://papi.beta.runwhen.com",
"RUNWHEN_TOKEN": "your-beta-token",
"DEFAULT_WORKSPACE": "my-beta-workspace",
"MCP_SERVER_LABEL": "beta"
}
}
}
}The server includes its label, environment, and workspace in its name and instructions so agents can route tool calls to the correct instance. See mcp-multi-env.json for a full example.
Your first prompt
After the server is connected, try:
What workspaces do I have access to?or:
Summarize the current issues in my workspace.Your client should call list_workspaces or get_workspace_issues and show the result. For the full chat experience, try:
Using workspace chat, what tasks are watching my production namespace?Tools
The server exposes these tools, grouped by use case.
Workspace intelligence (10 tools)
workspace_chat— Ask the RunWhen AI assistant about your infrastructure (issues, tasks, run sessions, resources, knowledge base). Optionalpersona_nameto select an assistant.list_workspaces— List workspaces you have access to.get_workspace_chat_config— Get resolved chat rules and commands (metadata). Optionalpersona_name.get_workspace_issues— Current issues; optional severity filter (1–4).get_workspace_slxs— List SLXs (health checks and tasks).get_run_sessions— Recent run session results.get_workspace_config_index— Workspace config and resource relationships.get_issue_details— Details for a specific issue by ID.get_slx_runbook— Runbook definition for an SLX.search_workspace— Search tasks, resources, and config by keyword.
Chat rules and commands (8 tools)
list_chat_rules— List chat rules (optional filters: scope_type, scope_id, is_active).get_chat_rule— Get a chat rule by ID (full content).create_chat_rule— Create a rule (name, ruleContent, scopeType, scopeId, isActive).update_chat_rule— Update a rule by ID.list_chat_commands— List chat commands (slash-commands).get_chat_command— Get a command by ID (full content).create_chat_command— Create a command (name, commandContent, scopeType, scopeId). Supports scheduling viacron_schedule,sink_configs,run_as_user, andassistant_name.update_chat_command— Update a command by ID (including schedule fields).update_chat_command— Update a command by ID.
AI assistants (personas) (5 tools)
list_assistants— List AI assistants (personas) in a workspace.get_assistant— Get a single assistant's full config by short name.create_assistant— Create an assistant (itsshort_nameis thepersona_nameforworkspace_chat). Upsert.update_assistant— Partially update an existing assistant (fetch-merge-write).delete_assistant— Soft-delete an assistant. Persona-scoped rules/commands are not removed automatically.
CodeBundle Registry (3 tools)
search_registry— Search the public CodeBundle Registry for reusable automation. Always check before writing custom scripts.get_registry_codebundle— Get full details of a specific codebundle (tasks, SLIs, env vars, source URL).deploy_registry_codebundle— Deploy a registry codebundle as an SLX. Generates native codebundle YAML (different fromcommit_slxwhich embeds inline scripts).
Task authoring — Tool Builder (9 tools)
get_workspace_context— LoadRUNWHEN.mdfrom the project. Call before writing scripts so the agent follows your conventions.validate_script— Validate a script against the RunWhen contract (main, issue format, FD 3 for bash).run_script— Run a script on a RunWhen runner; returns run ID.get_run_status— Status of a run (RUNNING, SUCCEEDED, FAILED).get_run_output— Parsed output (issues, stdout, stderr, report).run_script_and_wait— Run script and wait for full results (run + poll + output).commit_slx— Commit a tested script as an SLX (task + optional SLI; supportssli_scriptorcron_schedule).get_workspace_secrets— List secret keys (e.g.kubeconfig).get_workspace_locations— List runner locations. Location auto-resolves forrun_script,commit_slx, etc.; this tool is only needed when multiple workspace runners exist and you need to choose.
Configuration
Environment variables
Variable | Required | Description |
| Yes | RunWhen API base URL (e.g. |
| Yes | RunWhen API token (JWT or Personal Access Token). Used for both API and Agent. |
| No | Default workspace so tools don’t need |
| No | Human-readable label for this server instance (e.g. |
| No | Override path to |
| No | CodeBundle Registry URL (default: |
| No | Set to |
| No | HTTP timeout (seconds) for registry calls. Default |
| No | Soft warning threshold for script payload size. Default |
| No | Hard cap for script payload size. Default |
| No | Force a specific |
| No | Git ref for the generic codecollection mirror (default: |
| No | Override Tool Builder runbook code bundle ( |
| No | Override Tool Builder SLI code bundle ( |
| No | Override cron-scheduler SLI code bundle ( |
| No | Seconds between script run status polls (default: |
| No | Max seconds to wait for a script run (default: |
| No | Delay before fetching run artifacts (default: |
| No | Default SLX icon URL when none is provided at commit time. |
HTTP / OAuth only (when MCP_TRANSPORT=http; see OAuth for remote HTTP deployments):
Variable | Required | Description |
| For OAuth | Public URL of the MCP server (origin only). |
| For OAuth | RunWhen OAuth client ID (preferred). |
| For OAuth | RunWhen OAuth client secret (preferred). |
| Legacy | Auth0 OIDC alternative if RunWhen OAuth client vars are not used. |
See .env.example in the repo.
Airgap deployments
The MCP is designed to run in airgapped clusters with minimal configuration. In most installs the only variable operators need to set is:
RUNWHEN_AIRGAP=trueThis turns off the CodeBundle Registry (search_registry / get_registry_codebundle return a structured "registry disabled" response instead of attempting an outbound HTTPS call).
Every other airgap-sensitive knob has a workspace-aware default and only needs to be set for override / debugging purposes.
How Tool Builder resolves code-bundle URLs
commit_slx and render_codecollection_skill embed a codeBundle.repoUrl into every runbook / SLI they produce. PAPI clones that URL on ingestion to index tasks, so it must be reachable from the PAPI cluster — on airgap installs that means the internal mirror registered with the platform (e.g. http://rw-airgap-cc-catalog-svc.<namespace>:8080/git/rw-generic-codecollection.git), not github.com.
The MCP resolves the URL for rw-generic-codecollection (Tool Builder runbook + SLI) and rw-workspace-utils (cron-scheduler SLI) in this order:
Explicit call argument —
generic_runtime_repo_urlonrender_codecollection_skill.Env override —
MCP_GENERIC_CODECOLLECTION_REPO_URL/MCP_TOOL_BUILDER_*_REPO_URL/MCP_CRON_SLI_REPO_URL(see table below).Workspace lookup — the MCP queries
GET /api/v3/codecollections(the same list the platform UI's picker uses) and, if the workspace has an entry namedrw-generic-codecollection(orrw-workspace-utils), uses that URL. Results are cached in-process for 5 minutes.Hardcoded
github.comdefault.
Both commit_slx and render_codecollection_skill return generic_repo_url + generic_repo_resolved_from (explicit / env / workspace / default) in their response so you can see which source won at a glance.
Airgap operators typically need no code-bundle env vars — once the internal mirror is registered with PAPI (which the platform-airgap install does automatically), the workspace lookup finds it on every commit_slx / render_codecollection_skill call.
Airgap env-var reference
Set only what you need to override.
Variable | When to set | Description |
| Always in airgap. | Set to |
| Always. | Internal PAPI URL, e.g. |
| If | Public UI origin used in |
| HTTP transport with OAuth. | Public origin of the MCP server (e.g. |
| Rarely. | Force a specific |
| Rarely. | Git ref for the generic codecollection mirror. Default: |
| Rarely. | Per-bundle override for Tool Builder runbook. |
| Rarely. | Per-bundle override for Tool Builder SLI. |
| Rarely. | Per-bundle override for the cron-scheduler SLI ( |
| Optional. | Default SLX icon shown in the platform UI. Point at an internal HTTPS/GCS-equivalent URL if the default asset host isn't reachable. |
| Optional. | Human-readable label baked into the MCP server name (e.g. |
Getting a token
Personal Access Token (recommended, up to 180 days): RunWhen UI → Profile → Personal Tokens.
Email/password (short-lived):
POST {RW_API_URL}/api/v3/token/with{"email": "...", "password": "..."}.Browser: Dev Tools → Network → copy
Authorization: Bearer ...from any API request.
Access control and "Run with Assistant"
Workspace roles: readonly, readandrun, readandrunwithassistant, readwrite, admin.
Read and Run with Assistant (
readandrunwithassistant): Run tasks only when tied to an assistant (persona) you’re allowed to use. Applies to run sessions (e.g. Run button in the UI), not Tool Builder script runs.Workspace chat: Use
persona_nameinworkspace_chat/get_workspace_chat_configto use chat in the context of an assistant you’re allowed to use.Tool Builder run (
run_script,run_script_and_wait): Uses author/run API; currently admin only. No "run with assistant" for MCP script execution today.commit_slx: Requires admin or readwrite.
Concepts
How it works
Workspace chat: The server forwards
workspace_chatto the RunWhen Agent (AgentFarm), which has many internal tools. You ask in natural language; optionalpersona_nameselects the assistant.Tool Builder flow: Search registry (
search_registry) → load context (get_workspace_context) → write script → validate → get secrets/locations → test withrun_script_and_wait→ iterate →commit_slx→ verify withget_workspace_slxs.Knowledge base: Full CRUD via
list_knowledge_base_articles,create_knowledge_base_article,update_knowledge_base_article,delete_knowledge_base_article. Search also works insideworkspace_chat.CodeBundle Registry: Search for existing automation before building custom. The registry at
registry.runwhen.comis public and requires no authentication.
Infrastructure context (RUNWHEN.md)
Put a RUNWHEN.md in your project root with infrastructure rules (DBs, naming, severity, etc.). The server discovers it by walking up from the current working directory. Agents should call get_workspace_context before writing scripts.
Template:
runwhen_platform_mcp/docs/RUNWHEN.md.templateExample:
runwhen_platform_mcp/docs/RUNWHEN.md.exampleFlow and SLI patterns:
runwhen_platform_mcp/docs/tool-builder-flow.md
What’s in this repo
Component | Path | Description |
MCP server |
| Python package; run via |
Docs |
| Tool Builder flow, RUNWHEN.md template/example. |
Tests |
| Pytest tests; run with |
Skills |
| Reusable AI workflow skills (SKILL.md). Filesystem-discovered by Cursor / Copilot / Claude via |
Rules & agents |
| Optional Cursor rules and agent personas. |
Docker |
| Container image for remote HTTP deployment. Published to |
Cursor plugin |
| Plugin metadata and example MCP config. |
Copilot instructions |
| Always-on instructions for GitHub Copilot. |
The MCP server is client-agnostic; client-specific pieces (.cursor-plugin/, .github/copilot-instructions.md) are optional.
Skills (progressive disclosure for any MCP client)
skills/<name>/SKILL.md files are RunWhen's progressive-disclosure surface — short, task-focused guides agents load on demand instead of bundling everything into tool docstrings.
How each agent type sees them:
Client | Discovery path | Mechanism |
Cursor / Claude Code / Copilot |
| Native filesystem skill loading |
Goose, Continue, Cline, OpenAI Codex CLI, any other compliant MCP client |
| Standard MCP |
Clients that surface tools only (some OpenAI / Gemini function-callers) |
| Fallback path with identical content |
The single source of truth is skills/<name>/SKILL.md. Frontmatter description is the trigger an agent reads to decide whether to load the body — keep it 1-2 sentences with explicit "Use when:" clauses.
Authoring rule of thumb: if you find yourself growing a tool docstring past ~30 lines, lift the content into a new skill and reference its URI from the docstring instead. Tool-side guidance should be short; depth goes in skills.
Development and testing
pip install -e .
pip install -r requirements-dev.txt
pytest tests/ -vLocal MCP against staging (no container rebuild)
To iterate on MCP server code against a live environment (e.g. staging) without pushing Docker images, run the server in stdio mode from your checkout and point Cursor (or any MCP client) at the local binary:
cd runwhen-platform-mcp
pip install -e .
export RW_API_URL="https://papi.staging.shared.runwhen.com"
export RUNWHEN_TOKEN="<your PAT or JWT>"
export DEFAULT_WORKSPACE="stg-test" # optional default
runwhen-platform-mcpCursor mcp.json example (use the venv binary path after pip install -e .):
{
"mcpServers": {
"runwhen-staging-local": {
"command": "/path/to/runwhen-platform-mcp/.venv/bin/runwhen-platform-mcp",
"env": {
"RW_API_URL": "https://papi.staging.shared.runwhen.com",
"RUNWHEN_TOKEN": "<PAT or JWT>",
"DEFAULT_WORKSPACE": "stg-test"
}
}
}
}Changes to runwhen_platform_mcp/server.py take effect after restarting the MCP
server in Cursor (disable/re-enable the server or reload the window). Only
deploy a remote HTTP MCP container when you need OAuth or a shared team endpoint.
Token: RunWhen UI → Profile → Personal Tokens, or POST {RW_API_URL}/api/v3/token/.
Optional Git hooks (Ruff check + format, same as CI):
pip install pre-commit # or install with: pip install -e ".[dev]"
pre-commit install
pre-commit run --all-files # first-time / manual checkCI runs tests on push and PRs to main (.github/workflows/ci.yaml).
Optional repository secrets RUNWHEN_MCP_URL (full streamable HTTP MCP URL, e.g. https://mcp.<env>.runwhen.com/mcp, no trailing slash) and RUNWHEN_TOKEN (same Bearer token as MCP clients) enable a remote MCP HTTP smoke step that exercises initialize, tools/list, list_workspaces, and get_workspace_issues for workspace t-oncall (the workflow sets RW_SMOKE_WORKSPACE=t-oncall). If either secret is unset, that step is skipped with a notice.
PyPI and container images
PyPI — On every push to main (including merges), .github/workflows/pypi.yaml publishes to PyPI via runwhen-contrib/github-actions/publish-pypi with date-based versioning (YYYY.MM.DD.N). Configure PYPI_TOKEN (and optionally SLACK_BOT_TOKEN / slack_channel) in repo secrets.
Docker (GHCR and GCP) — Pull requests that touch image-related paths (see .github/workflows/docker.yaml) build and push a preview image (pr-{branch}-{sha}). Pushes to main use .github/workflows/release.yml: the workflow runs on each merge to main, and a new image is built and pushed only if that merge changes the same image-related paths (package code, Dockerfile, pyproject.toml, requirements.txt, or docker.yaml). README-only (or other non-image) merges skip the Docker job so latest and version tags are not republished for doc-only changes. Run Actions → Release → Run workflow to force a full run including Docker regardless of paths.
License
Apache-2.0
Available Tools
47 toolscommit_slxCommit SlxA
Commit a tested script as an SLX to the workspace Git repo.
Skills:
runwhen-skill://build-runwhen-task (authoring workflow)
runwhen-skill://discover-secrets (secret_vars mapping)
runwhen-skill://discover-locations (location selection)
runwhen-skill://configure-hierarchy (hierarchy/resource_path)
Creates a new SLX with the script as a Task (runbook) and/or SLI. The script should already be tested via run_script or run_script_and_wait.
This writes slx.yaml + runbook.yaml (for tasks) or slx.yaml + sli.yaml (for SLIs) to the workspace repository.
Script-source parameter matrix (provide exactly one task variant; SLI variants mirror the names):
Variant | Best for | Mode |
script | Small scripts <~5KB, readable | any |
script_base64 | Any size; safe JSON escaping | any |
script_gzip_base64 | >5KB; 3-5x denser than b64 | any |
script_path | Local file, raw text | stdio only |
script_base64_path | Local file with base64 blob | stdio only |
For very large scripts (combined task+SLI >~50KB) prefer publishing as a registry codebundle and using deploy_registry_codebundle.
To commit BOTH a task AND an SLI on the same SLX:
Custom SLI script (preferred): set task_type="task" and provide a separate lightweight sli_script that emits ONE float between 0 and 1 (e.g. failing_pods / total_pods). The SLI script MUST be its own small probe — DO NOT duplicate the task body. The server rejects identical task+SLI content.
Cron-scheduler SLI: set task_type="task" and provide cron_schedule with a cron expression (e.g. "0 */2 * * *"). The SLI will trigger the task's runbook on that schedule. No sli_script needed.
Output contracts (the two scripts are NOT interchangeable):
Task (interpreter, task_type='task'): returns/writes a List[Dict] of issues with keys 'issue title', 'issue description', 'issue severity' (1-4), 'issue next steps'.
SLI (sli_interpreter, implied task_type='sli'): returns/writes ONE float between 0 and 1.
Script-content footguns:
Bash scripts must NOT include
main "$@"at the bottom. The runner sources the script and invokesmain()itself with FD 3 wired to a run_output.json file. A trailingmain "$@"triggers a preflight invocation with FD 3 read-only, producing misleading "Bad file descriptor" errors. Just definemain()and stop there.secret_varsentries are injected at runtime as env vars whose VALUE is a FILE PATH on the runner — not the secret value itself. Tools that read paths natively (kubectl/KUBECONFIG, gcloud/ GOOGLE_APPLICATION_CREDENTIALS) work unchanged. For tokens/passwords the script mustcat "$VAR"(bash) oropen(os.environ["VAR"]).read()(python) to get the actual value.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | 'logs-bulk', 'config', or 'logs-stacktrace'. | logs-bulk |
| tags | No | Resource tags ({name, value} dicts). | |
| alias | Yes | Human-readable display name (e.g. 'Pod Health Check'). | |
| access | No | 'read-write' or 'read-only'. | read-write |
| branch | No | Git branch to commit to. | main |
| owners | No | Owner emails (defaults to current user). | |
| script | No | The full script source code (not base64). | |
| env_vars | No | Environment variables baked into the SLX config. | |
| location | No | Runner location (use get_workspace_locations). | |
| slx_name | Yes | Short SLX name (lowercase-kebab-case, e.g. 'k8s-pod-health'). | |
| hierarchy | No | Tag names for hierarchical grouping. | |
| image_url | No | Icon URL for the SLX. | |
| statement | Yes | SLX statement (e.g. 'All pods should be running'). | |
| task_type | No | 'task' (runbook) or 'sli' (indicator). | task |
| sli_script | No | Optional SLI script (returns float 0-1). | |
| task_title | No | Human-readable task title. | |
| interpreter | No | 'bash' or 'python'. | bash |
| script_path | No | Local file path for main script. **stdio mode only.** Mutually exclusive with the other script_* params. | |
| secret_vars | No | Secret mappings baked into the SLX config. | |
| runtime_vars | No | Per-run task parameters that the END USER fills in when invoking the committed task (e.g. log queries, time windows, filters). Distinct from env_vars (set once by the task author — cluster, namespace, context) and secret_vars (credentials injected as file paths). Task-only — never valid for SLIs. Each entry requires: name (str), description (str), default (str), validation (dict with type='regex'+'pattern' or type='enum'+'values'). Names must be unique and must not overlap with env_vars or secret_vars. | |
| cron_schedule | No | Cron expression to schedule the task (e.g. '0 */2 * * *'). | |
| resource_path | No | Resource path for search indexing. | |
| script_base64 | No | UTF-8 main script as standard base64. | |
| codebundle_ref | No | Git ref for the codebundle (auto-resolved if omitted). | |
| commit_message | No | Custom commit message. | |
| workspace_name | Yes | The workspace to commit to (e.g. 't-oncall'). | |
| sli_interpreter | No | Interpreter for the SLI script. | |
| sli_script_path | No | Local file path for SLI script. **stdio mode only.** Mutually exclusive with the other sli_script_* params. | |
| interval_seconds | No | For SLIs, how often to run in seconds. | |
| sli_script_base64 | No | UTF-8 SLI script as standard base64. | |
| script_base64_path | No | Local file path to a file containing the base64-encoded main script. **stdio mode only.** | |
| script_gzip_base64 | No | UTF-8 main script as base64(gzip(...)). Best inline option for scripts >5KB — 3-5x denser than 'script_base64'. | |
| sli_interval_seconds | No | How often the SLI runs in seconds. | |
| sli_script_base64_path | No | Local file path to a file containing the base64-encoded SLI script. **stdio mode only.** | |
| sli_script_gzip_base64 | No | UTF-8 SLI script as base64(gzip(...)). Best inline option for SLI scripts that exceed simple-metric size. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full disclosure and does so richly: exact files written, output contracts for task vs SLI, a server-side rejection rule (identical task+SLI content), and two behavioral footguns (bash trailing main "$@" causing FD 3 errors; secret_vars injected as file paths rather than values). This is the kind of context an agent cannot get from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long, but front-loaded with the purpose and organized into scannable sections, tables, and bullets that each carry load for a 35-parameter tool. Some prose (e.g. repeated SLI-variant explanations) could be tightened, but the density is largely justified by the operation's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 35-param mutation tool with no annotations and an output schema (so return values need not be explained), the description is complete: it covers prerequisites, variant selection, dual-commit recipes, output contracts, and runtime footguns, leaving no obvious gap an agent would need to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema baseline is 3, but the description adds real meaning beyond it: the script-source matrix (size/density/mode trade-offs), the runtime_vars vs env_vars vs secret_vars distinction, and which variants are stdio-only. It stops short of documenting a few params directly (branch, owners, interval_seconds), leaving that to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Commit a tested script as an SLX to the workspace Git repo') and clarifies what gets written (slx.yaml + runbook.yaml/sli.yaml). Clearly distinguishes itself from commit siblings like run_script and deploy_registry_codebundle, whose relationship is spelled out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit prerequisites ('script should already be tested via run_script or run_script_and_wait'), a decision matrix mapping each script-source variant to a use case and mode, an alternative path for large scripts (registry codebundle + deploy_registry_codebundle), and two named recipes for committing task+SLI together.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_assistantCreate AssistantA
Create a new AI assistant (persona) in a workspace.
Skill: runwhen-skill://create-ai-assistant (full setup workflow).
An assistant is a persona that tailors how the RunWhen AI investigates and
acts — e.g. an "Azure DevOps Helper" focused on a specific tech stack. The
short_name you choose becomes the persona_name for workspace_chat.
After creating the assistant, shape its behavior by attaching persona-scoped rules and commands:
create_chat_rule(scope_type="persona", scope_id=short_name, ...)
create_chat_command(scope_type="persona", scope_id=short_name, ...)This is an UPSERT — calling it again with an existing short_name REPLACES
the assistant's full configuration (omitted fields reset to defaults). To
change a few fields on an existing assistant, use update_assistant.
| Name | Required | Description | Default |
|---|---|---|---|
| avatar_url | No | Optional avatar image URL (e.g. '/personas/Man1-Happy.svg'). | |
| run_config | No | Run configuration: allow/disallow/budget settings (advanced). | |
| short_name | Yes | Assistant short name (lowercase-kebab-case, e.g. 'azure-devops'). Workspace prefix optional (e.g. 'my-ws--azure-devops'). This is the value you pass as persona_name to workspace_chat. | |
| description | No | What this assistant specializes in (e.g. tech stack, team). | |
| display_name | No | Human-readable display name (e.g. 'Azure DevOps Helper'). | |
| filter_scope | No | Optional scope filter for results (advanced). | |
| search_filters | No | Vector-search filter operators (e.g. {'codebundleTaskTags': ['kubernetes'], 'slxGroup': ['my-group']}). | |
| workspace_name | Yes | The workspace to create the assistant in. | |
| filter_stop_words | No | Words stripped from search queries before matching. | |
| run_confidence_threshold | No | Confidence threshold for automatic task runs (0-1). | |
| filter_codebundle_task_tags | No | Only surface tasks tagged with these (e.g. ['azure', 'devops']). Empty/omitted means no tag filter. | |
| filter_confidence_threshold | No | Confidence threshold for filtering results (0-1). | |
| filter_issue_selection_strategy | No | Issue selection strategy (e.g. 'MOST_SEVERE'). | MOST_SEVERE |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does the important part: it flags this is an UPSERT where a repeat call with an existing short_name REPLACES the entire configuration and resets omitted fields to defaults — a critical destructive behavior that no structured field conveys. It omits permission/auth requirements and any failure modes, but the key mutation semantics are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then procedurally organized (definition, follow-up calls, UPSERT warning). The persona explanation and skill pointer take space but each earns it; only the example persona sentence is slightly expendable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter creation tool with an output schema, the description covers the essentials an agent needs: what is being created, the identity linkage to workspace_chat, the setup follow-ups, and the dangerous upsert semantics. Return values are covered by the output schema, so nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 still adds meaning by linking short_name to the persona_name consumed by workspace_chat and distinguishing it from display_name. Advanced params like run_config, search_filters, and filter_* are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb+resource (create a new AI assistant/persona in a workspace) and then explains what an assistant actually is, so the agent knows the domain concept without opening the schema. It also explicitly differentiates itself from the sibling update_assistant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative ('To change a few fields on an existing assistant, use update_assistant'), points at the full setup workflow skill, and describes the follow-up sequence (create_chat_rule / create_chat_command with scope_type='persona'). When to use, when not to, and what to do next are all explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_chat_commandCreate Chat CommandA
Create a chat command (slash-command). Name must be alphanumeric, underscore, or hyphen only.
Skill: runwhen-skill://manage-commands (scoping, scheduling, sinks).
Commands are invoked in chat as /label.
To run a command on a schedule, set cron_schedule plus sink_configs,
run_as_user, and assistant_name. Results are delivered to each sink
(email or Slack) when the cron fires.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Command name (alphanumeric, underscore, or hyphen only). | |
| max_runs | No | Maximum scheduled runs before the schedule stops (omit for unlimited). | |
| scope_id | No | Scope ID (null for platform; workspace name for workspace). | |
| is_active | No | Whether the command is active. | |
| scope_type | Yes | One of platform, org, workspace, persona, user. | |
| description | No | Optional description for the command. | |
| run_as_user | No | Email of the user the scheduled session runs as. Required when cron_schedule is set. | |
| sink_configs | No | Delivery targets when cron_schedule is set. Each entry: {type: 'email'|'slack', mode: 'user'|'all-workspace-users'|'channel'|'webhook', target: '...'}. | |
| cron_schedule | No | Cron expression to run this command on a schedule (e.g. '0 8 * * 1-5'). When set, also provide sink_configs, run_as_user, and assistant_name. | |
| assistant_name | No | Persona for scheduled runs (workspace prefix optional). For persona-scoped commands, must match scope_id (full form after PAPI). For workspace-scoped commands, use the short name (persona_name for chat). | |
| workspace_name | Yes | The workspace to create the command in (e.g. 't-oncall'). | |
| command_content | Yes | Markdown content of the command. | |
| schedule_paused | No | When true, the cron does not fire (independent of is_active). | |
| auto_approve_readonly | No | When true, scheduled runs auto-approve read-only task execution (write tasks still require approval). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose the scheduled-run behavior and its dependency set (cron fires → results delivered to each sink), which is genuinely useful. It stops short of permissions/authorization requirements, what happens on name collision, or side effects, so the mutation semantics remain only partially transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and naming rule, then the skill reference, then the scheduling clause. The final sentence largely duplicates the cron_schedule parameter description, so it is slightly redundant but still tight overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter create tool with an output schema available, the description covers the primary workflow, the naming rule, and the scheduled-run path, and it routes to a skill for deeper scoping/scheduling detail. Missing only permissions and error/collision behavior, which keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 14 parameters in detail. The description restates the cron_schedule dependency chain rather than adding format or edge-case detail beyond the schema (e.g., valid cron dialect, sink config shape). Baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Create) and resource (chat command / slash-command), and the naming constraint plus the invocation syntax [/label](cmd://name) make it unmistakable. The verb alone cleanly distinguishes it from sibling CRUD tools (get_chat_command, update_chat_command, list_chat_commands, delete-style operations).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one concrete usage conditional ("To run a command on a schedule, set cron_schedule plus sink_configs, run_as_user, and assistant_name") and points to a skill for scoping/scheduling/sinks. However, it never says when to prefer this over siblings like update_chat_command, nor any prerequisites (permissions, existing scope) for creation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_chat_ruleCreate Chat RuleC
Create a chat rule. Uses AgentFarm internal API.
Skill: runwhen-skill://manage-rules (scoping + wording guidance).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable name for the rule. | |
| scope_id | No | Scope ID (null for platform; workspace name for workspace). | |
| is_active | No | Whether the rule is active. | |
| scope_type | Yes | One of platform, org, workspace, persona, user. | |
| rule_content | Yes | Markdown content of the rule. | |
| workspace_name | Yes | The workspace to create the rule in (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden, yet it only says it uses an internal API. It is silent on required permissions, whether creation is idempotent, and any side effects. The skill reference is the only behavioral clue, and it is not elaborated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the action front-loaded and zero filler. It is efficient, though arguably terse given the tool's 6 parameters and lack of annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema and full parameter coverage handle returns and inputs, but for a create/mutation tool with no annotations the description should disclose auth requirements and side effects. It leaves the agent without the behavioral context needed to invoke safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema, establishing a baseline of 3. The description adds no syntax, format, or relational detail beyond that, so it neither compensates nor detracts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource combination ('Create a chat rule') that an agent can grasp immediately, and the AgentFarm API note localizes it. However, it does nothing to distinguish itself from the sibling create_chat_command or explain why one creates a rule versus updates one via update_chat_rule.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no named alternatives. The pointer to 'runwhen-skill://manage-rules (scoping + wording guidance)' hints at supporting context but does not tell the agent when this tool is the right choice versus update_chat_rule or create_chat_command.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_knowledge_base_articleCreate Knowledge Base ArticleA
Create a new Knowledge Base article in a workspace.
Skill: runwhen-skill://manage-knowledge (article scoping + lifecycle).
KB articles are indexed into the Knowledge Overlay Graph and become searchable by the workspace AI assistant and other tools.
Content should be informative operational knowledge — architecture notes, troubleshooting guides, runbook context, dependency documentation, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Human-readable article title (max 255 chars). Strongly recommended: title is the primary field for title-weighted KB search and the workspace global-note catalog. If omitted the note is stored title-less and under-performs on retrieval. | |
| content | Yes | The article content (plain text or markdown, max 20000 chars). | |
| resource_paths | No | Canonical resource paths (e.g. ['kubernetes/namespace/prod']). | |
| workspace_name | Yes | The workspace to create in (e.g. 't-oncall'). | |
| abstract_entities | No | Entity tokens for indexing (e.g. ['oom-killed', 'memory-limits']). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses a post-creation side effect: articles are indexed into the Knowledge Overlay Graph and become searchable by the workspace AI assistant and other tools. It omits permission/auth requirements, duplicate-title handling, and what happens to existing content, leaving meaningful gaps for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, followed by the skill reference, indexing behavior, and content guidance. Reasonably sized with little waste, though the inline 'Skill:' reference is slightly cryptic without further context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers purpose, indexing effect, and content expectations for an unannotated create tool. Residual gaps are the missing permission/auth and duplicate-handling behavior, which a mutation tool would ideally state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents every parameter in detail (including the title recommendation and char limits), so the baseline is 3. The description adds content-topic examples but no field-level semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new Knowledge Base article') with the scope ('in a workspace'), which is clearly distinguishable from update/delete/get siblings. It stops short of naming the alternative create/update/delete tools or when each applies, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers content guidance ('architecture notes, troubleshooting guides, runbook context') and references a skill for scoping/lifecycle, which implies usage. However it never says when to create vs use update_knowledge_base_article or when creation is inappropriate, so the when/when-not routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_assistantDelete AssistantA
Delete (soft-delete) an AI assistant (persona) from a workspace.
Persona-scoped rules and commands attached to this assistant are not removed automatically — clean them up separately if no longer needed.
| Name | Required | Description | Default |
|---|---|---|---|
| assistant_name | Yes | Assistant short name to delete (e.g. 'azure-devops'). Workspace prefix optional. | |
| workspace_name | Yes | The workspace the assistant belongs to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden and does so unusually well for a mutation: it reveals the operation is a soft-delete (recoverable/not a hard purge) and that attached persona-scoped rules and commands are NOT cascade-deleted. It omits auth/permission requirements and whether confirmation is needed, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the destructive/soft-delete nature front-loaded and the non-cascading caveat immediately after. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the two required params are fully covered by the schema. The description supplies the two most important behavioral facts (soft-delete, no cascade) for a low-complexity deletion tool; only permission/auth context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters, so the schema already documents workspace_name and assistant_name (including the optional workspace prefix). The description adds no parameter-level meaning beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Delete (soft-delete) an AI assistant (persona)') and scopes it to a workspace, which cleanly separates it from create_assistant and update_assistant. It does not explicitly name any sibling or contrast behavior, so it stops just short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by 'if no longer needed', with no explicit statement of when to prefer this over update_assistant or how to handle the case where the assistant is still referenced. It does at least flag the follow-up cleanup of persona-scoped rules and commands, which is genuine usage-relevant context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_knowledge_base_articleDelete Knowledge Base ArticleB
Delete a Knowledge Base article.
Removes the article from the workspace and the Knowledge Overlay Graph index.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | The UUID of the KB article to delete. | |
| workspace_name | Yes | The workspace (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that deletion cascades to the Knowledge Overlay Graph index, a non-obvious side effect, but omits irreversibility, permission requirements, and whether a confirmation or soft-delete occurs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and immediately followed by the scope of the effect. No filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-param destructive tool with full schema coverage and an output schema, the description is nearly sufficient, especially since it explains the index side effect. It stops short of confirming irreversibility or auth needs, which matters for a delete operation with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, documenting both note_id (UUID of the article) and workspace_name (e.g. 't-oncall'), so the schema does the heavy lifting. The description adds no parameter-level meaning beyond that, which is the expected baseline here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Delete) and resource (Knowledge Base article) and adds the scope of removal via the Knowledge Overlay Graph index. Siblings like create_knowledge_base_article and update_knowledge_base_article are implicitly distinguished by verb, though the description never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states what deletion does but gives no when-to-use guidance, no prerequisites, and no pointer to alternatives (e.g. use update_knowledge_base_article to modify rather than delete). The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_slxDelete SlxA
Soft-delete an SLX from the workspace via the v4 short-name endpoint.
Uses DELETE /api/v4/workspaces/{ws}/slxs/{slx_short_name}, which
tombstones the SLX row (deleted_by / deleted_at) and lets the
corestate reconcile loop clean up the corresponding runbook and SLI
rows. This is the same endpoint the UI hits, so behaviour matches what
users see in the platform.
Deletion is workspace-global — it is not scoped to a Git branch.
The v4 endpoint tombstones the SLX row in PAPI; there is no per-branch
variant. Callers previously wired to a Git-oriented delete path should
stop passing branch / commit_message (both removed) and rely on
the workspace-scoped soft delete.
| Name | Required | Description | Default |
|---|---|---|---|
| slx_name | Yes | Short name of the SLX to delete (e.g. 'k8s-pod-health'). | |
| workspace_name | Yes | The workspace to delete from (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses that this is a SOFT delete (tombstone via deleted_by/deleted_at), that a reconcile loop cleans up runbook and SLI rows, and that behavior matches the UI endpoint. It omits permission/auth requirements and whether the tombstone can be reversed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first sentence and the paragraphs are logically ordered (endpoint, mechanism, scope, migration). There is mild redundancy, since tombstoning and workspace-global scope are restated in the third paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a soft-delete mutation with no annotations, the description covers mechanism, side effects, and scope, and an output schema exists so return values need not be explained. It would be fully complete with a note on required permissions (or that none beyond workspace access are needed).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the two parameters are already documented and baseline would be 3. The description adds meaning beyond the schema by stating that branch and commit_message have been removed, which head off a caller passing obsolete arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a precise verb+resource+scope ('Soft-delete an SLX from the workspace via the v4 short-name endpoint'), and the endpoint is spelled out. The note that deletion is workspace-global and not Git-branch-scoped implicitly separates it from Git-oriented siblings like commit_slx.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for use (soft delete, workspace-global scope) and a migration caveat telling prior Git-path callers to drop branch/commit_message. It stops short of naming a sibling alternative or an explicit 'use this when / not when' rule, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deploy_registry_codebundleDeploy Registry CodebundleA
Deploy a registry codebundle as an SLX to a workspace.
Unlike commit_slx (which embeds inline scripts via the Tool Builder codebundle), this deploys a pre-built codebundle from its own codecollection repository. The runbook.robot / sli.robot live in the codebundle's git repo — no inline script is needed.
Use search_registry + get_registry_codebundle to find the right codebundle, then call this tool with the values from the registry.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Git branch/tag for the codecollection. | main |
| data | No | 'logs-bulk', 'config', or 'logs-stacktrace'. | logs-bulk |
| tags | No | Resource tags ({name, value} dicts). | |
| alias | Yes | Human-readable display name (e.g. 'Namespace Health'). | |
| access | No | 'read-only' or 'read-write'. | read-only |
| branch | No | Workspace config branch. | main |
| owners | No | Owner emails (defaults to current user). | |
| location | Yes | Runner location (use get_workspace_locations). | |
| repo_url | Yes | Git URL of the codecollection. | |
| slx_name | Yes | Short SLX name (lowercase-kebab-case). | |
| hierarchy | No | Tag names for hierarchical grouping. | |
| image_url | No | Icon URL for the SLX. | |
| statement | Yes | SLX statement (e.g. 'All pods should be running'). | |
| deploy_sli | No | Also deploy the SLI (health indicator). | |
| config_vars | No | Codebundle config variables. | |
| secret_vars | No | Secret mappings (e.g. {'kubeconfig': 'kubeconfig'}). | |
| resource_path | No | Resource path for search indexing. | |
| commit_message | No | Custom commit message. | |
| deploy_runbook | No | Deploy the runbook (task). | |
| workspace_name | Yes | Target workspace (e.g. 't-oncall'). | |
| codebundle_path | Yes | Path to codebundle dir (e.g. 'codebundles/k8s-namespace-healthcheck'). | |
| sli_description | No | Description for the SLI metric. | |
| sli_interval_seconds | No | SLI run interval in seconds. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the deployment mechanism (runbook.robot/sli.robot live in the codebundle's git repo, no inline script), which is non-obvious context beyond the schema. However, it omits key behavioral traits for a mutating deployment tool: required permissions, whether the deploy commits to workspace config, and side effects of the deploy_runbook/deploy_sli toggles.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded paragraphs with zero filler: purpose first, differentiation second, workflow third. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 23-parameter mutation with an output schema available, the description covers purpose, the sibling distinction, and the discovery workflow adequately, and need not explain return values. It stops short of describing deployment side effects, which matters given the absence of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 23 parameters are already self-documenting. The description adds no per-parameter meaning beyond pointing the agent to the registry as the source of values, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Deploy a registry codebundle as an SLX to a workspace') and explicitly distinguishes itself from the sibling commit_slx by contrasting the deployment mechanism (pre-built codecollection repo vs inline Tool Builder scripts). An agent can select this tool over commit_slx 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative ('Unlike commit_slx...'), states the distinguishing condition, and provides a concrete pre-call workflow: 'Use search_registry + get_registry_codebundle to find the right codebundle, then call this tool with the values from the registry.' This is explicit when-to-use and how-to-source-inputs guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assistantGet AssistantB
Get a single AI assistant (persona) by its short name (full config).
| Name | Required | Description | Default |
|---|---|---|---|
| assistant_name | Yes | Assistant short name (e.g. 'azure-devops'). Workspace prefix optional. | |
| workspace_name | Yes | The workspace to query (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. 'Get' implies a read, and 'full config' hints that the complete configuration is returned, but it says nothing about required permissions, error behavior for unknown assistants, or rate limits. This is thin for an un-annotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tightly constructed sentence with the action, resource, lookup key, and return depth front-loaded. There is no filler, and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the schema fully documents both parameters. The description is adequate for a simple two-parameter read tool but omits any usage routing or behavioral context that an agent would need when weighing this against its many siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both assistant_name and workspace_name documented, so the baseline is 3. The description's 'short name' wording mirrors the schema's documented example format and adds no new syntax or format detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (a single AI assistant/persona) and clarifies the lookup key (short name) plus the depth of the return (full config). It implicitly distinguishes itself from list_assistants by specifying 'a single', but never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no mention of prerequisites, and no named alternative. The 'by its short name' phrasing weakly implies a lookup-when-you-know-the-name pattern, but nothing tells the agent when to choose this over list_assistants or get_workspace_context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chat_commandGet Chat CommandB
Get a single chat command by ID (full content).
| Name | Required | Description | Default |
|---|---|---|---|
| command_id | Yes | The command ID to retrieve. | |
| workspace_name | Yes | The workspace the command belongs to (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it only adds '(full content)'. It says nothing about read-only safety, workspace scoping requirements, permissions, or error behavior when an ID is absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the key scoping information appears before the parenthetical detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and both parameters are fully documented in the schema. Only the absence of any behavioral/permission context keeps this from being complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both command_id and workspace_name are already documented in the schema. The description adds no format or constraint detail beyond that baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get), a specific resource (chat command), and scoping (single, by ID) plus a cue about response depth ('full content'). This differentiates it from list_chat_commands, though it doesn't name that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: retrieve by ID when the full command content is needed, versus a listing. No explicit when-to-use/when-not or named alternative such as list_chat_commands is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chat_ruleGet Chat RuleA
Get a single chat rule by ID (full content).
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes | The rule ID to retrieve. | |
| workspace_name | Yes | The workspace the rule belongs to (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It adds one useful behavioral detail ('full content'), distinguishing the response from a summary, but says nothing about permissions, rate limits, or error behavior for a missing/unknown rule_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with zero waste, front-loading the resource and its scoping qualifier. Nothing could be removed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and both required parameters are fully documented in the schema. For a simple two-parameter read tool this is nearly complete; only auth/permission context is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – both rule_id and workspace_name are documented in the schema, including an example workspace value. The description adds nothing beyond the schema, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get), resource (chat rule), and scope (single, by ID), and adds that it returns full content. This distinguishes it implicitly from list_chat_rules, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the word 'single' – an agent can infer this is for fetching one known rule versus listing many. There is no explicit when-to-use guidance, no mention of prerequisites, and no routing to list_chat_rules or update_chat_rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_issue_detailsGet Issue DetailsA
Get detailed information about a specific issue (structured JSON).
NOTE: Prefer workspace_chat for investigative questions about an issue
(e.g. root cause, related resources, next steps). Use this tool only
when you already have an issue ID and need raw JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_id | Yes | The issue ID to look up. | |
| workspace_name | Yes | The workspace the issue belongs to (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the return shape ('structured JSON') and the precondition of already having an issue ID, but says nothing about permissions, error behavior, or freshness of the data. For a low-risk read lookup this is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded parts: the capability statement first, then the routing note. Every sentence carries information an agent needs and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With both parameters fully documented, an output schema present to describe return values, and explicit routing against the nearest competing tool, an agent has everything required to select and call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with issue_id and workspace_name each documented in the schema (including a workspace naming example). The description adds no format or syntax detail beyond restating the 'already have an issue ID' precondition, so the schema does the heavy lifting and baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get detailed information about a specific issue') and immediately distinguishes itself from the sibling workspace_chat by scope. An agent can tell exactly which capability this is 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: prefer workspace_chat for investigative questions (root cause, related resources, next steps) and use this tool only when an issue ID is already in hand and raw JSON is needed. Both the when and the when-not plus the named alternative are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_knowledge_base_articleGet Knowledge Base ArticleB
Get a specific Knowledge Base article by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | The UUID of the KB article to retrieve. | |
| workspace_name | Yes | The workspace to query (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses nothing beyond a safe-read implication. It says nothing about required permissions, what happens on an invalid/missing note_id, or whether access is scoped to the workspace. For a zero-annotation tool this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero wasted words. It is efficient, though its brevity verges on under-specification for a tool with no annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is not required, and the two required parameters are fully documented in the schema. Still, with no annotations the description omits access-scoping and failure behavior that an agent would benefit from knowing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents note_id as a UUID and workspace_name as the query workspace. The description adds no format, scoping, or default information beyond that, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('Knowledge Base article') scoped to a lookup by ID. The 'by ID' qualifier implicitly separates it from list_knowledge_base_articles and search_workspace, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'by ID' phrasing implies usage (call this when you already have an article UUID rather than a search query), which is adequate routing context. However, no PREREQUISITES or explicit alternatives are stated, so the agent must infer when to prefer this over list_knowledge_base_articles.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_registry_codebundleGet Registry CodebundleA
Get full details of a specific codebundle from the registry.
Use after search_registry to get complete information including configuration templates, environment variables, and deployment instructions.
| Name | Required | Description | Default |
|---|---|---|---|
| codebundle_slug | Yes | The codebundle slug (e.g. 'k8s-podresources-health'). | |
| collection_slug | Yes | The codecollection slug (e.g. 'rw-cli-codecollection'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It implies a read-only lookup and names the payload contents (configuration templates, environment variables, deployment instructions), but says nothing about permissions, auth, rate limits, or failure behavior. Adequate for a simple fetch, but thin given zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences; the core action is front-loaded and the follow-up sentence carries useful sequencing information rather than filler. Nothing is redundant, though it is slightly terse given no annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not enumerate return fields, and it still previews the kind of content returned. Combined with the search-then-get workflow guidance, an agent has enough to invoke it correctly; only permission/error behavior is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both required slugs are documented with concrete examples ('k8s-podresources-health', 'rw-cli-codecollection'), so the schema does the heavy lifting. The description adds no additional parameter meaning beyond what the schema already provides, which is the defined baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get full details of a specific codebundle from the registry'), which is clearly distinct from the sibling search_registry and deploy_registry_codebundle. It does not name those siblings explicitly, but the scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly positions the tool in a workflow: 'Use after search_registry to get complete information.' That tells the agent when to reach for this rather than the search tool. It stops short of stating when NOT to use it (e.g., to deploy, use deploy_registry_codebundle), so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_run_outputGet Run OutputA
Get the output artifacts from a completed script run.
Returns parsed, human-readable results including:
issues: list of issues found by the script (title, severity, details, nextSteps)
stdout: script stdout output
stderr: script stderr output
status: run status (SUCCEEDED, FAILED, RUNNING)
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | The run ID returned by run_script. | |
| fetch_logs | No | Download and parse artifact contents. | |
| workspace_name | Yes | The workspace the run belongs to (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose that results are 'parsed, human-readable' and enumerates the returned fields. It does not state that this is a read-only operation, note any auth/permission needs, or explain the fetch_logs download behavior, leaving meaningful behavioral gaps for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose in the first sentence, then uses a compact bullet list for the return fields. Efficient overall, though enumerating return fields is somewhat redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with a full output schema, the description is largely sufficient; it needn't explain return values and even does so. The main gap is the absence of guidance on how it relates to get_run_status and the run_script family.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents run_id, fetch_logs, and workspace_name, establishing a baseline of 3. The description adds no parameter-level detail beyond that, so it neither compensates nor detracts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the output artifacts from a completed script run'), which distinguishes it from nearby siblings like get_run_status and get_run_sessions. It never explicitly names or contrasts those siblings, so differentiation relies on inference from the resource noun rather than a direct comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'from a completed script run' implies usage after a run finishes, giving implied context. However, it names no alternative (e.g., get_run_status vs this tool) and states no when-not condition, so the agent must infer routing. The 'completed' framing is also muddied by listing RUNNING as a possible status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_run_sessionsGet Run SessionsA
Get recent run sessions for a workspace (structured JSON).
Run sessions are executions of SLX runbooks — they contain the output of health checks, troubleshooting tasks, and automation runs.
NOTE: For investigative questions like "what ran recently for service X?"
or "show me recent failures", prefer workspace_chat — it can search,
filter, and correlate run sessions with issues and resources. Use this
tool only when you need raw JSON for programmatic processing.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max run sessions to return. | |
| workspace_name | Yes | The workspace to query (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the return shape ('structured JSON') plus the semantic scope ('recent'). It covers safety implicitly via the read-only framing and the alternative-selection rule. It does not state ordering, what window 'recent' covers, or the default limit behavior, which is what 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose sentence, then a compact domain gloss, then the routing note. Every block earns its place, though the parenthetical '(structured JSON)' is restated later in the NOTE, a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers purpose, domain meaning, and routing. It is nearly complete for a low-parameter read tool; only the ambiguity of 'recent' and any pagination behavior leave a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (limit, workspace_name) are already documented in the schema, which sets the baseline at 3. The description adds no syntax, format, or ordering detail about `limit` or the workspace identifier, so it earns no credit above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get recent run sessions for a workspace') and then defines the domain object ('executions of SLX runbooks — output of health checks, troubleshooting tasks, automation runs'). It explicitly distinguishes itself from the sibling workspace_chat, so an agent can tell the two apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-not ('For investigative questions like "what ran recently for service X?" ... prefer workspace_chat') with a rationale (it can search, filter, correlate) and an explicit when-to-use ('only when you need raw JSON for programmatic processing'). This is a textbook routing instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_run_statusGet Run StatusA
Check the status of a script run.
Poll this after run_script to check if execution has completed. Status values: RUNNING, SUCCEEDED, FAILED.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | The run ID returned by run_script. | |
| workspace_name | Yes | The workspace the run belongs to (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden. It usefully reveals the polling pattern and the terminal status values (RUNNING, SUCCEEDED, FAILED), but omits permission requirements, error behavior for an invalid run_id, and rate limits, leaving notable behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with zero filler; the core purpose leads and the polling guidance and status values follow logically. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description supplies the polling workflow and status vocabulary an agent needs. It is nearly complete for a simple status-check tool, with only minor gaps around error handling and auth.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both run_id and workspace_name are already documented in the schema. The description adds no additional parameter meaning beyond what the schema provides, which is the baseline expectation when the schema already does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Check the status of a script run'), making the tool's function immediately clear. It references the related run_script tool as a precondition but does not explicitly distinguish itself from adjacent siblings like get_run_output or run_script_and_wait, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear contextual guidance: 'Poll this after run_script to check if execution has completed,' establishing when the tool fits in the workflow. However, it does not name alternatives such as run_script_and_wait (which suggests waiting outright) or state when-not to poll, so it lacks explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_skillGet SkillB
Return the full body of a skill by name.
Returns {name, description, uri, body, path} on success or
{error, available} when the name is unknown so the agent can self-
correct without a second round-trip.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Skill name (e.g. 'build-runwhen-task'). Call list_skills first if you don't know the available names. | |
| reload | No | Force re-read from disk (default: use cached version). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, and it does add real value by disclosing the error path: an unknown name returns {error, available} so the agent can self-correct without a second call. However, it says nothing about permissions, side effects, or the cache/reload semantics beyond what the schema already documents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core action front-loaded. The enumeration of return keys is somewhat redundant given an output schema exists, but the description stays short and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with a full output schema, the description covers the essentials: what is returned, and what happens on failure. It is complete enough to call correctly, though a pointer to list_skills for discovery would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the name and reload parameters are fully documented in the schema, including the list_skills fallback and the cache/re-read behavior. The description adds no additional parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Return the full body of a skill by name.' An agent can immediately tell this is a fetch-by-identifier operation. It does not explicitly differentiate itself from the sibling list_skills or render_codecollection_skill, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and no named alternative (e.g. it never says to use list_skills when the name is unknown). The only routing hint, 'Call list_skills first', lives in the parameter schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_slx_runbookGet Slx RunbookA
Get the runbook for a specific SLX (structured JSON).
Returns the runbook definition including what tasks it runs, how they're configured, and what they check.
NOTE: For questions like "what does this SLX do?" or "what tasks does it
run?", prefer workspace_chat — it provides contextual explanations.
Use this tool when you need the raw runbook YAML/JSON (e.g. for task
authoring or programmatic inspection).
| Name | Required | Description | Default |
|---|---|---|---|
| slx_name | Yes | The SLX short name. | |
| workspace_name | Yes | The workspace the SLX belongs to (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses return content (tasks, configuration, checks) and routes free-form questions elsewhere, but never states explicitly that this is a read-only operation, nor mentions permission requirements or rate limits. Reasonable but incomplete for a zero-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in the first sentence, then adds return detail and a clearly marked NOTE for routing. Three short paragraphs, each earning its place, with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, and both parameters are fully covered. Usage routing is excellent; the only shortfall is behavioral disclosure (read-only nature, permissions) that no annotation supplies, but overall the definition is sufficient to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both required parameters (slx_name, workspace_name) documented in the schema. The description implies the SLX and workspace context but adds no syntax, format, or naming detail beyond what the schema already supplies, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get the runbook for a specific SLX') and explicitly enumerates what the runbook contains (tasks it runs, how configured, what they check). It names the sibling workspace_chat and clarifies the boundary between them, so an agent can distinguish 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use vs alternative: prefer workspace_chat for 'what does this SLX do?' questions, but use this tool when raw runbook YAML/JSON is needed for task authoring or programmatic inspection. This is exactly the when/when-not/alternative routing the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workspace_chat_configGet Workspace Chat ConfigA
Get resolved chat rules and commands for a workspace.
Returns the list of rules and commands that apply to the workspace (and optional persona). These are the same rules and commands the workspace chat assistant sees. Response includes metadata only (id, name, scope); full rule/command content is not included in this endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| persona_name | No | Optional persona for persona-scoped rules/commands. | |
| workspace_name | Yes | The workspace to query (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose a real limitation: the response includes metadata only (id, name, scope) and not full rule/command content. That is genuinely useful negative information. It stops short of noting auth requirements, scoping behavior, or pagination, but the metadata-only disclosure is a substantive behavioral trait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core purpose, followed by scope and an important output caveat. No filler and each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not enumerate return values, and it correctly notes the metadata-only restriction rather than repeating field details. Combined with fully covered parameters, an agent has enough to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both workspace_name and persona_name are already documented, including the persona's 'persona-scoped' nature. The description mentions the optional persona but adds no syntax or format detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (workspace chat config) and clarifies the output is the *resolved* set of rules and commands applying to a workspace/persona. This is a meaningful distinction from siblings like list_chat_rules and list_chat_commands, though it never names those siblings to sharpen the contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case ('the same rules and commands the workspace chat assistant sees'), which suggests when this aggregated view is preferable to fetching individual rules or commands. However, it never explicitly states when to use this versus list_chat_rules or list_chat_commands, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workspace_config_indexGet Workspace Config IndexA
Get the workspace configuration index (structured JSON).
Returns an overview of all configured resources, SLXs, and their relationships in the workspace. Useful for understanding what's monitored and how things are connected.
This tool accepts only workspace_name. It does NOT accept
resource_path, slx_name, filter, or other parameters — those
fail with unexpected_keyword_argument. To set resource_path on an
SLX, use commit_slx or deploy_registry_codebundle. To find SLXs at
a path, use workspace_chat or search_workspace.
NOTE: For questions like "what's monitored in namespace X?" or "how are
resources connected?", prefer workspace_chat — it can traverse the
resource graph and provide contextual answers. Use this tool only when
you need the raw configuration index for programmatic processing.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_name | Yes | The workspace to query (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose concrete behavior: only workspace_name is accepted and other params fail with unexpected_keyword_argument. It omits auth/permission or rate-limit context, but the parameter-failure behavior is a valuable, non-obvious disclosure and the output schema covers return format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, then constraints, then alternatives. Every sentence earns its place, though the SLX-routing sentence is somewhat tangential and the NOTE repeats the workspace_chat preference already implied earlier.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param tool with an output schema, the description covers purpose, accepted/rejected parameters, and sibling routing comprehensively. Nothing an agent needs to invoke it correctly is missing, and return values are documented by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter, so the baseline is 3, but the description adds meaning by enumerating the arguments that are rejected (resource_path, slx_name, filter) and the resulting error, going beyond the raw schema. This proactively prevents common misuse.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Get the workspace configuration index') and clarifies the payload is structured JSON covering configured resources, SLXs, and their relationships. It clearly distinguishes itself from workspace_chat by scoping its use to programmatic processing of the raw index.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the preferred alternative ('prefer workspace_chat') and states the precise condition that selects this tool instead ('only when you need the raw configuration index for programmatic processing'). It also routes to commit_slx/deploy_registry_codebundle and search_workspace for adjacent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workspace_contextGet Workspace ContextA
Get domain-specific context for building RunWhen tasks.
Reads the project's RUNWHEN.md file, which contains infrastructure conventions, database access rules, naming patterns, architectural knowledge, and other constraints that scripts must follow.
The file is auto-discovered by walking up from the current working directory. Override with the RUNWHEN_CONTEXT_FILE env var if needed.
IMPORTANT: Call this BEFORE writing any task or script to understand the target environment's rules and relationships.
| Name | Required | Description | Default |
|---|---|---|---|
| reload | No | Force re-read from disk (default: False, uses cached version). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the auto-discovery mechanism (walking up from cwd), the RUNWHEN_CONTEXT_FILE override, and caching behavior (reinforced by the reload param). It does not state what happens if the file is absent or what errors look like, so it falls short of exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then layered detail on the source file, discovery, override, and a bolded usage directive. Every sentence contributes, though it is slightly longer than strictly necessary for a one-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. Given the simple input and rich output contract, the description covers purpose, mechanism, override, and invocation timing completely enough to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'reload' parameter, so the schema already explains the cache-busting behavior. The description adds discovery/override context but nothing new about the parameter itself, which is the expected baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get domain-specific context') and immediately names the concrete source: the project's RUNWHEN.md file with infrastructure conventions, DB rules, and naming patterns. This is clearly distinguishable from the many assistant/skill/chat-rule siblings, none of which read a project context file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing line gives explicit, actionable timing: 'Call this BEFORE writing any task or script to understand the target environment's rules.' That removes ambiguity about when to invoke. It stops short of naming sibling alternatives or when-not-to-use, so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workspace_issuesGet Workspace IssuesA
Get current issues for a workspace (structured JSON).
Issues represent detected problems in your infrastructure that RunWhen has identified through automated health checks.
NOTE: For questions like "issues related to neo4j" or "what's failing
in namespace X", prefer workspace_chat — it has semantic search and
keyword filtering that produce materially better results. Use this tool
only when you need raw JSON for programmatic processing.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max issues to return. | |
| since | No | ISO 8601 lower bound for latest occurrence (e.g. '2026-03-29T14:00:00Z'). | |
| severity | No | Filter: 1=critical, 2=high, 3=medium, 4=low. | |
| workspace_name | Yes | The workspace to query (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the output nature ('structured JSON') and the meaning of the returned data, which is useful, but says nothing about authentication, rate limits, or pagination. For a read-only get, the implicit read semantics carry most of the load, so this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, followed by a short domain definition and a clearly-marked NOTE for routing. Every sentence earns its place, though the definition sentence is a mild luxury rather than strictly necessary to invoke the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, and it correctly focuses on selection guidance and the alternative. Combined with full schema coverage and no annotations, it is complete enough for correct invocation, missing only non-essential behavioral detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter (limit, since, severity, workspace_name) is already documented in the schema with defaults and formats. The description adds no parameter-level meaning beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get current issues for a workspace') and even defines what an 'issue' is in this domain, which is genuinely useful. It does not, however, distinguish itself from the sibling get_issue_details, which an agent would still need to disambiguate separately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-not guidance ('For questions like "issues related to neo4j"... prefer workspace_chat') and names the alternative along with the reason (semantic search and keyword filtering). It then states the positive selection condition ('Use this tool only when you need raw JSON for programmatic processing'), 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_workspace_locationsGet Workspace LocationsA
List runner locations with auto-resolution guidance and recommendations.
Returns a structured payload that tells the agent which location to
use (or to omit the parameter entirely when auto-resolution can pick).
The raw list is preserved in locations for backward compatibility.
Response shape::
{ "workspace": "", "count": , "locations": [], "private": [], # workspace-type runners (preferred) "public": [], # shared runners (fallback) "recommended": "<name|null>", "auto_resolves": , # True when run_*/commit_slx can pick alone "disambiguation_hint": "...", "skill_reference": "runwhen-skill://discover-locations", }
recommended is the name run_script / run_script_and_wait /
commit_slx WILL pick when the location parameter is omitted.
When auto_resolves is True the agent should NOT pass a
location argument at all.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_name | Yes | The workspace to query (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it does so well: it explains that the payload resolves the location for downstream run_*/commit_slx calls, defines 'auto_resolves' semantics, and identifies 'private' runners as preferred and 'public' as fallback. It omits auth/permission or rate-limit context, leaving a small gap for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the key 'auto_resolves' rule, but the description then reproduces a full response-shape JSON block with inline comments. Since an output schema exists, much of that block duplicates structured data and lengthens the definition unnecessarily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The response-shape explanation and the 'recommended'/'auto_resolves' semantics give the agent enough to call this correctly and act on the result without opening other schemas. Return values are technically covered by the output schema, but the extra semantic annotations here (preferred vs fallback, skill reference) genuinely add value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is only one parameter, so the schema already documents 'workspace_name'. The description adds only indirect meaning by tying the resolved result to the 'location' parameter of other tools. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List runner locations') and clarifies the tool's real job — resolving which location the run_*/commit_slx tools will pick. It references the consuming siblings by name, so an agent can place it in the workflow, though it never sharply contrasts against a competing sibling for the same query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditional guidance: when 'auto_resolves' is True the agent should NOT pass a 'location' argument at all. That is real when-to-use guidance tied to a documented field. It stops short of naming alternative tools or exclusions, so it is clear context rather than a full routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workspace_secretsGet Workspace SecretsA
List available secret keys with platform grouping and mapping guidance.
Returns a structured payload that helps agents pick the right
secret_vars mapping for a task. The raw key list is preserved in
secrets for backward compatibility.
Response shape::
{ "workspace": "", "secrets": [], "platform_groups": { "kubernetes": ["kubeconfig"], "azure": [...], ... }, "recommended_secret_vars": { "kubernetes": { "kubeconfig": "kubeconfig" }, "azure": { "AZURE_CLIENT_ID": "...", ... }, ... }, "runtime_semantics": "", "skill_reference": "runwhen-skill://discover-secrets", }
Critical for agents: workspace secrets are injected into scripts as
FILE PATHS, not literal values. See the discover-secrets skill
for the read_secret helper pattern.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_name | Yes | The workspace to query (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the critical non-obvious runtime semantics that secrets are injected as FILE PATHS, not literal values, and references the skill helper. It stops short of covering auth requirements, pagination, or side effects, but for a read-only lister this is strong context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and critical semantics are front-loaded and the closing 'FILE PATHS, not literal values' note earns its place, but the full response-shape JSON block is largely redundant when an output schema already exists, adding length without new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool that has an output schema, the description covers purpose, return semantics, and the crucial file-path caveat. Nothing essential to correct invocation is missing, though the redundant return-shape block slightly dilutes focus.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, workspace_name, and schema description coverage is 100%, so the schema already documents it fully. The description adds no syntax or format guidance for the parameter beyond what the schema provides, matching the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('available secret keys') plus the scope of platform grouping and mapping guidance. It is clearly distinct from all siblings, none of which expose workspace secret keys, though it does not explicitly name an alternative tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies when to use it — 'helps agents pick the right secret_vars mapping for a task' — and points to the discover-secrets skill for the read_secret pattern, but gives no explicit when-not conditions or alternative tools to compare against.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workspace_slxsGet Workspace SlxsA
List ALL SLXs in a workspace (structured JSON). No filtering.
SLXs are the fundamental unit of work in RunWhen — each represents a health check, task, or automation runbook for a piece of infrastructure.
The underlying PAPI endpoint is paginated (100 SLXs per page); this tool
auto-paginates internally, following next until exhausted, so the
returned results are the complete list for the workspace — never
just the first page. count reflects the true total and next is
always null (there is nothing left to page).
It accepts only workspace_name. It does NOT accept slx_name,
filter, alias, tag, or any other filtering parameter — those
would fail with unexpected_keyword_argument.
For other shapes:
One specific SLX (runbook detail):
get_slx_runbook(workspace_name=..., slx_name=...)Search / filter by topic (e.g. "neo4j health checks"):
workspace_chatSearch by resource (e.g. "what monitors namespace X"):
workspace_chat
Use this raw-list tool only when you need to enumerate every SLX for programmatic processing (counting, batch operations, etc).
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_name | Yes | The workspace to query (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does so well: it discloses that the underlying endpoint paginates at 100, that the tool auto-paginates to completion, that 'count' is the true total and 'next' is always null, and that unsupported keywords raise unexpected_keyword_argument.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the 'no filtering' constraint, then well-structured bullets for alternatives. It is somewhat verbose on pagination internals, but each block serves a distinct decision the agent must make.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, yet the description still clarifies the pagination semantics of the output. Combined with the alternative routing and parameter exclusions, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents workspace_name and the baseline is 3. The description adds negative parameter semantics by enumerating what is NOT accepted (slx_name, filter, alias, tag), which meaningfully reduces mis-invocation risk.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List ALL SLXs in a workspace'), names the return shape (structured JSON), and explicitly scopes out filtering. It also distinguishes itself from get_slx_runbook and workspace_chat, so an agent can select it without opening a sibling schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing for three shapes of need: one SLX -> get_slx_runbook, topic search -> workspace_chat, resource search -> workspace_chat. It closes with a clear when-to-use condition ('only when you need to enumerate every SLX for programmatic processing').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_assistantsList AssistantsA
List AI assistants (personas) configured in a workspace.
An assistant is a persona — its shortName is the value you pass as
persona_name to workspace_chat. Use this to discover which
assistants already exist before creating a new one.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_name | Yes | The workspace to query (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. "List" implies a read-only, non-destructive operation, and the shortName-to-persona_name explanation is useful semantic context. However, it says nothing about result volume, pagination, or ordering, which matters for a list tool with a large potential result set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action, and every clause earns its place by defining the resource and linking the output to a downstream tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the single parameter is fully documented. The description supplies the key cross-tool semantic (shortName → persona_name) and a usage trigger. Minor omission: no mention of result scale or pagination for a list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single, well-documented workspace_name parameter, so the schema already does the work. The description adds no syntax or format detail for the parameter itself; its shortName note concerns a sibling tool's input, not this one. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("List") and resource ("AI assistants (personas) configured in a workspace"), then clarifies with a definition of what an assistant is. The plural "List" clearly distinguishes it from get_assistant, create_assistant, update_assistant, and delete_assistant among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use: "Use this to discover which assistants already exist before creating a new one," routing toward create_assistant. It also cross-references workspace_chat by explaining the persona_name linkage. No explicit when-not or exclusion is stated, 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.
list_chat_commandsList Chat CommandsC
List chat commands (slash-command instructions).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-based). | |
| scope_id | No | Filter by scope ID. | |
| is_active | No | Filter by active status. | |
| page_size | No | Items per page (1-200). | |
| scope_type | No | Filter by scope (platform, org, workspace, persona, user). | |
| workspace_name | Yes | The workspace to query (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It says only 'List', revealing nothing about pagination behavior, result ordering, scope of the listing, or permissions required; the parenthetical adds minor semantic value but no behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler, which is appropriately sized for a simple list tool. It is efficient but arguably too terse to be maximally useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the schema fully documents parameters. However, for a tool with six parameters including several filters, the description offers no filtering context or usage framing, leaving it minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters (page, scope_id, is_active, page_size, scope_type, workspace_name) with descriptions and defaults. The description adds no parameter meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb (List) and resource (chat commands), and the parenthetical 'slash-command instructions' clarifies what a chat command is. It is distinguishable from siblings like get_chat_command, create_chat_command, and update_chat_command by its listing verb, though it doesn't explicitly name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus get_chat_command or the other chat-command siblings, nor any prerequisites or exclusions. Usage must be inferred entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_chat_rulesList Chat RulesC
List chat rules (workspace chat rules).
Uses AgentFarm internal API; may require network access.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-based). | |
| scope_id | No | Filter by scope ID (e.g. workspace name, or None for platform). | |
| is_active | No | Filter by active status. | |
| page_size | No | Items per page (1-200). | |
| scope_type | No | Filter by scope (platform, org, workspace, persona, user). | |
| workspace_name | Yes | The workspace to query (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does mention the AgentFarm internal API and possible network access, but gives no readOnly confirmation, pagination behavior, or auth/permission expectations for a 6-parameter list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action and free of padding. The trailing API/network note is slightly tangential but still compact and non-redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and parameters are fully documented in the schema. Gaps remain around usage context (filtering behavior, when to prefer this over get_chat_rule), leaving the definition minimally adequate for a filtered list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (page, page_size, scope_id, scope_type, is_active, workspace_name) are already documented in the schema. The description adds no extra meaning beyond that, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List chat rules (workspace chat rules)'), so the operation is unambiguous. However, it offers no differentiation from the sibling listing/retrieval tools (get_chat_rule, list_chat_commands), leaving the agent to 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusion criteria, and no mention of alternatives such as get_chat_rule for a single rule. The agent gets a bare listing verb with none of the routing information that the sibling set clearly needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_discovery_platformsList Discovery PlatformsA
List supported generation-rule platforms and default render settings.
Skills:
runwhen-skill://commit-to-codecollection
runwhen-skill://author-generation-rules
Call this before render_codecollection_skill when the user has not
confirmed whether they want workspace-scoped output (runwhen) or
per-resource cloud/Kubernetes discovery (kubernetes, azure, aws,
gcp). Ask the user to pick a platform and scope, then look up valid
resource_types with list_indexed_resource_types(search=...).
All catalog data is bundled offline — no docs.runwhen.com access required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does disclose a useful trait: all catalog data is bundled offline with no docs.runwhen.com access required, clarifying latency/permission expectations. It omits return-shape detail, but an output schema exists to cover that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the sequencing guidance is high value, but the embedded Skills list and skill URI references add length not strictly needed to call a zero-argument lister.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param catalog lookup with an output schema and a workflow dependency on render_codecollection_skill, the description supplies exactly the sequencing and follow-up routing an agent needs; nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4; there are no parameter semantics to add beyond what the empty schema already shows.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb ('List') and resource ('supported generation-rule platforms and default render settings'), which an agent can immediately distinguish from siblings like list_indexed_resource_types or render_codecollection_skill.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states explicitly when to call it ('before render_codecollection_skill when the user has not confirmed workspace-scoped vs per-resource discovery'), names the alternatives (runwhen/kubernetes/azure/aws/gcp), and points to the follow-up tool list_indexed_resource_types(search=...).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_indexed_resource_typesList Indexed Resource TypesA
Search bundled indexer catalogs for valid generation-rule resourceTypes.
Skills:
runwhen-skill://author-generation-rules
runwhen-skill://commit-to-codecollection
Fully offline — reads catalogs/indexed-resource-types.json (or bundled
markdown catalogs) shipped with the MCP package. No network access required.
For azure/aws/gcp, search must be at least 2 characters (large catalogs).
Kubernetes CRD types use plural.group[/version] syntax when not listed.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 50). Increase for broad searches. | |
| search | No | Optional substring filter (e.g. 'deployment', 'azure_keyvault'). | |
| platform | Yes | Indexer platform: runwhen, kubernetes, azure, aws, or gcp. Must match render_codecollection_skill platform. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the tool is 'Fully offline', reads a bundled JSON/markdown catalog from the MCP package, and needs no network access. It also adds a concrete constraint (2-char minimum search for azure/aws/gcp), though it doesn't describe output or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then lists related skills, then the offline behavior and platform-specific constraints. Efficient and mostly front-loaded, though the interspersed skill list adds slight visual noise without much functional payload.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the description covers the offline execution model, the platform-scoping requirement, and search constraints. Complete enough for an agent to call correctly, with minor room on edge cases or result shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real meaning beyond the schema: the 2-character minimum on 'search' for large catalogs and the 'plural.group[/version]' syntax for unlisted Kubernetes CRD types. This is meaningful elaboration rather than repetition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Search') and resource ('bundled indexer catalogs for valid generation-rule resourceTypes'), which is precise enough to distinguish it from generic search siblings. It does not explicitly name a competing tool, but the referenced skills ('author-generation-rules', 'commit-to-codecollection') anchor its role clearly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides contextual guidance by pointing to the two skills it supports and by noting platform must match render_codecollection_skill, but gives no explicit when-to-use vs when-not or alternative-tool routing. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_knowledge_base_articlesList Knowledge Base ArticlesA
List Knowledge Base articles (notes) in a workspace (structured JSON).
Returns KB articles that feed the workspace's Knowledge Overlay Graph. Articles can contain operational knowledge, runbook context, architecture notes, or any information useful for troubleshooting.
NOTE: For questions like "what do we know about service X?", prefer
workspace_chat — it searches KB articles semantically. Use this tool
for programmatic KB management (listing, filtering by status).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max articles to return (max 200). | |
| search | No | Search within article content. | |
| status | No | Filter by status — 'active' or 'deprecated'. Returns all if omitted. | |
| workspace_name | Yes | The workspace to query (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It adds useful domain context about what articles feed (the Knowledge Overlay Graph) and the kinds of content they hold, but does not disclose pagination behavior, default/max limits in prose, read-only guarantees, or permission requirements. Adequate but leaves real gaps unaddressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and output format, and the NOTE is high-value routing content. The middle sentence enumerating content types (runbook context, architecture notes, troubleshooting) is somewhat expendable but does aid understanding, keeping this just below maximally efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and the description covers purpose, alternatives, and content scope. It stops short of explaining pagination or the interaction between the search and status filters, which is a minor omission rather than a blocking gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents workspace_name, limit, search, and status. The description reinforces 'filtering by status' but adds no syntax, default, or format detail beyond the schema. Baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (Knowledge Base articles / notes) scoped to a workspace, and clarifies the output format (structured JSON). The NOTE distinguishes it from the semantic-search sibling workspace_chat and from get_knowledge_base_article, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use/when-not guidance: prefer workspace_chat for semantic 'what do we know about service X?' questions, and use this tool for programmatic KB management (listing, filtering by status). Both the alternative and the selecting condition are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_skillsList SkillsA
List every progressive-disclosure skill the server exposes.
Returns [{name, description, uri}]. Use this when you want to know
what guidance is available before running a tool — read the description
to decide whether you need the full body, then fetch it with
get_skill(name) (or, if your client supports MCP resources directly,
read the uri via the resource read API).
Cross-vendor note: this is the same information that list_resources
returns for the runwhen-skill:// family. Clients that surface MCP
resources should prefer that path; this tool is the explicit fallback.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the return shape, the read-then-fetch workflow, and the cross-vendor equivalence/fallback relationship with list_resources. It stops short of noting caveats such as whether the listing is complete, paginated, or scoped, but the core behavioral profile is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then the return shape, then the routing advice, so the important information comes first. The cross-vendor note is somewhat verbose but it is genuinely load-bearing because it steers clients to a different mechanism.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema already exists, so the description need not explain return values, yet it still names the fields for orientation. Combined with the explicit alternatives and fallback guidance, an agent has everything needed to call it correctly and act on the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which establishes the baseline of 4. There is nothing for the description to add on parameter meaning, and it correctly stays silent rather than inventing inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List every progressive-disclosure skill the server exposes') and immediately distinguishes itself from the sibling get_skill by noting it is the enumeration step that precedes fetching. An agent can tell what it returns and how it differs from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('when you want to know what guidance is available before running a tool'), names the follow-up alternative get_skill(name), and prescribes a preference order against list_resources for MCP-resource-capable clients, naming this tool as the explicit fallback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesList WorkspacesA
List all workspaces you have access to.
Returns workspace names, display names, and basic metadata.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden; it does disclose that results are limited to workspaces the caller can access and that no filtering is applied. It does not mention pagination, result-size expectations, ordering, or any failure/auth modes, which is a meaningful gap for a listing endpoint with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and scope before the return content. The second sentence partially duplicates what the output schema already conveys, so it is efficient but not maximally economical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters and an output schema already documenting the returned fields, the description covers what the agent needs to select and call this tool. Only minor operational details (pagination, ordering) are absent, which is acceptable given the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters (schema coverage is 100% trivially), so per the baseline there is nothing for the description to clarify. It correctly avoids inventing filter or paging arguments that the schema does not support.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (workspaces) with an explicit scope qualifier, 'you have access to', so the agent knows the result set is permission-filtered. No sibling tool competes for this action, so the lack of explicit differentiation isn't a real gap, but there's nothing that elevates it above a clear, standard listing tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intent ('get the set of workspaces available to me') is implied clearly by the name and description, and for a zero-argument listing tool that is largely sufficient. However, there is no explicit guidance on when to prefer this over e.g. get_workspace_context or search_workspace, nor any note about prerequisites such as authentication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_codecollection_skillRender Codecollection SkillA
Render a tested tool-builder task as a private Custom Discovery CodeCollection.
Skills:
runwhen-skill://commit-to-codecollection (GitOps workflow)
runwhen-skill://build-runwhen-task (authoring + testing first)
Emits the standard codecollection layout (generation rule + Jinja templates) for
workspace-builder discovery. Templates delegate runtime to
rw-generic-codecollection/codebundles/tool-builder with base64 GEN_CMD.
Also writes .runwhen/SKILL_TEMPLATE.md with the decoded script summary
and .runwhen/raw_script.{py,sh} with the full decoded script so PR reviewers
and automated systems never need to base64-decode TaskSet templates.
This tool does not push to git or mutate the workspace — it renders files locally
(or returns them inline) for you to git add / commit / push.
Default generation rule uses platform: runwhen and resourceTypes: [workspace].
For cloud/Kubernetes discovery, set platform to kubernetes, azure,
aws, or gcp and pass resource_types / match_rules /
slx_qualifiers from the bundled indexer catalogs
(list_indexed_resource_types). Discovery SLX templates include the
platform tag/hierarchy includes (e.g. kubernetes-tags.yaml).
Requires runwhen-local with the matching platform indexer enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | 'logs-bulk', 'config', or 'logs-stacktrace'. | logs-bulk |
| tags | No | Resource tags ({name, value} dicts). | |
| alias | Yes | Human-readable SLX display name. | |
| access | No | 'read-write' or 'read-only'. | read-write |
| owners | No | Owner emails for the review file (defaults to current user). | |
| script | No | The full script source code (not base64). | |
| env_vars | No | Environment variables baked into the TaskSet config. | |
| platform | No | Generation rule platform: runwhen (one SLX per workspace), kubernetes, azure, aws, or gcp (per-resource discovery). Call list_discovery_platforms() before choosing — agents must confirm the user's target platform and scope. | runwhen |
| base_name | No | Short SLX suffix in generation rule (<15 chars). Default: bundle_name. | |
| hierarchy | No | Tag names for hierarchical grouping. | |
| image_url | No | Icon URL for the SLX. | |
| statement | Yes | SLX statement describing what should be true. | |
| output_dir | No | Write rendered files to this directory (stdio mode). When omitted, files are returned in the tool response only. | |
| sli_script | No | Optional separate SLI script (defaults to main script if include_sli). | |
| task_title | No | Human-readable task title (static literal). | |
| bundle_name | Yes | Codebundle directory name (kebab-case, e.g. 'azure-function-cold-start'). | |
| include_sli | No | Also emit an SLI template (tool-builder SLI). | |
| interpreter | No | 'python' or 'bash'. | python |
| match_rules | No | Match predicates forwarded into the generation rule YAML. | |
| script_path | No | Local file path for script. **stdio mode only.** | |
| secret_vars | No | Secret name → workspace secret key mappings. | |
| runtime_vars | No | Per-run runtime variables (task-only). | |
| resource_path | No | Resource path for search indexing. | |
| script_base64 | No | UTF-8 script as standard base64. | |
| resource_types | No | Resource types for the generation rule (default: ['workspace']). | |
| slx_qualifiers | No | SLX name qualifiers (default: ['workspace']). | |
| workspace_name | Yes | Workspace used during tool-builder testing (provenance in review file). | |
| sli_interpreter | No | Interpreter for SLI script. | |
| source_slx_name | No | Original inline SLX short name (provenance in review file). | |
| timeout_seconds | No | Task timeout passed to tool-builder runbook. | |
| script_base64_path | No | Local path to base64-encoded script file. **stdio mode only.** | |
| script_gzip_base64 | No | UTF-8 script as base64(gzip(...)). | |
| generic_runtime_ref | No | Git ref for rw-generic-codecollection pinned in templates. | main |
| sli_interval_seconds | No | SLI interval when include_sli is true. | |
| generic_runtime_repo_url | No | Override rw-generic-codecollection repo URL in templates. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it explicitly disclaims git push and workspace mutation, discloses the side-effect of writing .runwhen files to disk, and states the environment precondition. It stops short of covering failure modes, whether rendering is idempotent, or how output_dir behaves on invalid input, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then segmented into skills, emitted layout, non-goals, platform defaults, and preconditions using bold and short paragraphs. Slightly long for a tool definition and repeats the git non-goal mildly, but every block carries distinct routing or behavioral information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 35 parameters and an existing output schema (so return values need no explanation), the description covers the pieces an agent cannot infer: the emitted file layout, the platform-dependent generation rule, required runtime environment, and the git hand-off boundary. Remaining gaps — error handling, idempotency, and any limits on repeated rendering — are minor rather than blocking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds genuine meaning by grouping the discovery-related parameters — platform default 'runwhen' vs kubernetes/azure/aws/gcp per-resource discovery, and the paired resource_types/match_rules/slx_qualifiers sourced from the bundled indexer catalogs. It explains base_name (<15 chars, defaults to bundle_name) and the base64 GEN_CMD delegation, going beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Render a tested tool-builder task as a private Custom Discovery CodeCollection') and immediately enumerates the concrete artifacts emitted (generation rule + Jinja templates, .runwhen/SKILL_TEMPLATE.md, raw_script files). This clearly separates it from siblings like commit_slx or deploy_registry_codebundle, which the agent can rule out 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the prerequisite workflow explicitly via the runwhen-skill URIs ('build-runwhen-task (authoring + testing first)') and draws the boundary against git operations: 'does not push to git or mutate the workspace — it renders files locally ... for you to git add / commit / push.' It also routes platform selection to list_discovery_platforms/list_indexed_resource_types and states the 'Requires runwhen-local with the matching platform indexer enabled' precondition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_scriptRun ScriptA
Execute a script on a RunWhen runner for testing.
Sends the script to the workspace's runner at the specified location. Returns a run ID that can be used with get_run_status and get_run_output to monitor execution and retrieve results.
The script must follow the RunWhen contract:
Python task: define main() returning List[Dict] with keys 'issue title', 'issue description', 'issue severity' (1-4), 'issue next steps'.
Python SLI: define main() returning a float 0-1.
Bash task: define main() writing issue JSON array to FD 3 (>&3).
Bash SLI: define main() writing a metric float to FD 3.
Provide exactly one of: script | script_base64 | script_gzip_base64 | script_path (stdio) | script_base64_path (stdio). Use script_gzip_base64 for scripts >5KB to maximise transport headroom.
Use validate_script first to check compliance.
| Name | Required | Description | Default |
|---|---|---|---|
| script | No | The full script source code (raw text). | |
| env_vars | No | Environment variables (e.g. {'NAMESPACE': 'default'}). | |
| location | No | Runner location (use get_workspace_locations). | |
| run_type | No | 'task' or 'sli'. | task |
| interpreter | No | 'bash' or 'python'. | bash |
| script_path | No | Local file path to read the script from. **stdio mode only.** Mutually exclusive with the other script_* params. | |
| secret_vars | No | Secret mappings (e.g. {'kubeconfig': 'kubeconfig'}). | |
| script_base64 | No | UTF-8 script as standard base64. Prefer over inline 'script' when JSON-escaping multiline content is error-prone. | |
| workspace_name | Yes | The workspace to run in (e.g. 't-oncall'). | |
| script_base64_path | No | Local file path to a file containing the base64-encoded script. **stdio mode only.** | |
| script_gzip_base64 | No | UTF-8 script as base64(gzip(...)). Best inline option for scripts >5KB — 3-5x denser than 'script_base64'. Encode with: base64.b64encode(gzip.compress(script.encode())).decode(). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses the async return contract (run ID + which tools consume it), the runner/location requirement, and the mandatory RunWhen script contract for four execution modes. It omits auth/permission requirements and any timeout or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then follow-up tools, then the contract block, then transport guidance — a logical order. The contract enumeration is dense but each line is load-bearing; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation-style tool with an output schema, the description covers the essentials an agent needs: execution semantics, prerequisite validation, transport encoding selection, and the required script contract. Return format details are rightly delegated to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3; the description exceeds it by consolidating a mutual-exclusivity rule ('provide exactly one of script | script_base64 | script_gzip_base64 | script_path | script_base64_path') and by recommending gzip for >5KB. It adds the RunWhen contract semantics (task vs SLI, Python vs Bash) that the schema fields alone do not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Execute a script on a RunWhen runner for testing', with an explicit statement that it returns a run ID for polling via get_run_status/get_run_output. It distinguishes itself implicitly from the sibling run_script_and_wait by framing execution as async/monitorable, but never names that sibling to draw the line explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context ('for testing') and an explicit prerequisite ('Use validate_script first to check compliance'). It also routes encoding choice ('use script_gzip_base64 for scripts >5KB'). It lacks explicit guidance on when to prefer this over run_script_and_wait, which is the closest alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_script_and_waitRun Script And WaitA
Execute a script and wait for results (combines run + poll + output).
This is a convenience tool that runs a script, polls until completion, and returns the full output — all in one call. Use this instead of calling run_script + get_run_status + get_run_output separately.
The script must follow the RunWhen contract:
Python task: define main() returning List[Dict] with keys 'issue title', 'issue description', 'issue severity' (1-4), 'issue next steps'.
Python SLI: define main() returning a float 0-1.
Bash task: define main() writing issue JSON array to FD 3 (>&3).
Bash SLI: define main() writing a metric float to FD 3.
Provide exactly one of: script | script_base64 | script_gzip_base64 | script_path (stdio) | script_base64_path (stdio). Use script_gzip_base64 for scripts >5KB to maximise transport headroom.
Bash scripts must NOT include main "$@" at the bottom. The runner
sources the script and invokes main() itself with FD 3 wired to a
run_output.json file. A trailing main "$@" triggers a preflight
invocation with FD 3 read-only and produces misleading "Bad file
descriptor" errors.
secret_vars entries are injected as env vars whose VALUE is a FILE
PATH on the runner — not the secret value itself. kubectl/KUBECONFIG
and gcloud/GOOGLE_APPLICATION_CREDENTIALS work unchanged. For tokens/
passwords the script must cat "$VAR" (bash) or
open(os.environ["VAR"]).read() (python) to get the actual value.
| Name | Required | Description | Default |
|---|---|---|---|
| script | No | The full script source code (raw text). | |
| env_vars | No | Environment variables for the script. | |
| location | No | Runner location (use get_workspace_locations). | |
| run_type | No | 'task' or 'sli'. | task |
| interpreter | No | 'bash' or 'python'. | bash |
| script_path | No | Local file path to read the script from. **stdio mode only.** Mutually exclusive with the other script_* params. | |
| secret_vars | No | Secret mappings (env var name to workspace secret key). | |
| script_base64 | No | UTF-8 script as standard base64. Prefer over inline 'script' when JSON-escaping multiline content is error-prone. | |
| workspace_name | Yes | The workspace to run in (e.g. 't-oncall'). | |
| script_base64_path | No | Local file path to a file containing the base64-encoded script. **stdio mode only.** | |
| script_gzip_base64 | No | UTF-8 script as base64(gzip(...)). Best inline option for scripts >5KB — 3-5x denser than 'script_base64'. | |
| runtime_var_overrides | No | Per-run override values for script variables (name → value). Merged into envVars at test time. Overrides win on name collision. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral burden and largely does: it discloses the blocking wait semantics, the RunWhen main() contract per run_type/interpreter, and the non-obvious secret_vars behavior (values are file paths, not secrets). It omits timeout limits, failure/error semantics, and any rate-limit or permission requirements, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose before the contract details, and bulleted structure keeps the dense content scannable. Given 12 parameters and a non-trivial execution contract, the length is mostly justified, though a few lines (e.g. the FD 3 pitfall) are verbose relative to their selection value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter execution tool with no annotations and an output schema (so returns need not be restated), the description covers the script contract, parameter selection, and secret handling. It is still missing timeout, error-handling, and permission/auth context needed to predict failure modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real meaning: it enumerates the mutually-exclusive script_* variants, recommends script_gzip_base64 for scripts over 5KB, and explains that secret_vars inject file paths rather than values. That is substantive semantics beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource (execute a script) and states the composite behavior (run + poll + output) in the first line. It explicitly distinguishes itself from the sibling tools run_script, get_run_status, and get_run_output, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use it ('Use this instead of calling run_script + get_run_status + get_run_output separately') and names the concrete alternatives. It does not specify when NOT to use it, e.g. for long-running scripts where fire-and-poll may be preferable, so it falls short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_slxRun SlxA
Run an existing SLX's runbook tasks on the workspace runner.
Skill: runwhen-skill://run-existing-slx — and default task_titles="*"
(a literal resolved title produces empty passedTitles).
This triggers execution of a previously committed SLX (not an ad-hoc script). Use this when you want to run a health check, troubleshooting task, or automation that already exists in the workspace.
IMPORTANT: This is different from run_script / run_script_and_wait, which execute ad-hoc scripts. Use run_slx to trigger SLXs that are already committed and configured in the workspace.
NOTE: workspace_chat CANNOT run tasks directly — it can only search for and describe them. Use this tool to actually execute an SLX.
The tool creates a RunSession with the run request, polls until completion, and returns the results including pass/fail status and any issues found.
| Name | Required | Description | Default |
|---|---|---|---|
| slx_name | Yes | The SLX short name (e.g. 'k8s-pod-health'). | |
| task_titles | No | Tasks to run: '*' for all, or '||'-separated titles. | * |
| workspace_name | Yes | The workspace (e.g. 't-oncall'). | |
| runtime_var_overrides | No | Per-run override values for runtime variables (name → value). Passed through to the runner at execution time. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose real behavior: it creates a RunSession, polls until completion, and returns pass/fail status and issues found — a synchronous, side-effecting execution. It also warns that the default task_titles='*' matters because a literal resolved title yields empty passedTitles. It stops short of stating permission/auth requirements or failure/timeout behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and well organized, but the warning about run_script is stated twice (the 'IMPORTANT' paragraph and the 'different from run_script' line), and the dangling 'Skill: runwhen-skill://...' fragment reads as an orphaned artifact rather than a complete sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. Combined with the alternatives, the commit-vs-ad-hoc distinction, and the polling/completion behavior, an agent has everything needed to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented, and the baseline is 3. The description adds only the task_titles='*' default nuance, which is already stated in the schema; it does not explain runtime_var_overrides behavior beyond what the schema says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run an existing SLX's runbook tasks on the workspace runner') and immediately scopes it as executing a previously committed SLX rather than an ad-hoc script. It explicitly contrasts itself with run_script / run_script_and_wait and workspace_chat, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('health check, troubleshooting task, or automation that already exists in the workspace') plus when-not-to-use, naming the exact alternative tools for ad-hoc execution. The NOTE that workspace_chat cannot run tasks but can search/describe them closes the most likely misroute.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_registrySearch RegistryA
Search the RunWhen CodeBundle Registry for reusable automation.
Skill: runwhen-skill://find-and-deploy-codebundle (search → deploy workflow).
Use this BEFORE writing a custom script — there may already be a production-ready codebundle for the task. Returns codebundles with their tasks, SLIs, required env vars, and deployment metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Comma-separated support tags (e.g. 'GKE,KUBERNETES'). | |
| search | Yes | Free-text search (e.g. 'kubernetes pod health', 'postgres backup'). | |
| platform | No | Filter by platform (e.g. 'Kubernetes', 'GCP', 'AWS'). | |
| max_results | No | Max results to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the read-only search nature and the shape of results (tasks, SLIs, required env vars, deployment metadata), but adds nothing about authentication, result limits beyond the param, or rate behavior. Adequate, with clear gaps for a no-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, followed by the routing hint and the value proposition. Every sentence earns its place; only the '(search → deploy workflow)' parenthetical is slightly compressed but still useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description covers purpose, timing, and follow-on workflow. It is complete enough for an agent to select and call it correctly, lacking only fallback-tool guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the four parameters (search, tags, platform, max_results) are already fully documented with examples. The description adds no syntax or formatting guidance beyond the schema's 'comma-separated' tags note, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search the RunWhen CodeBundle Registry') and scopes it to 'reusable automation.' It is clearly distinguishable from siblings like get_registry_codebundle and deploy_registry_codebundle, which operate on a single already-identified codebundle rather than searching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes when to use it ('Use this BEFORE writing a custom script' and 'there may already be a production-ready codebundle'), and routes to the follow-on skill search → deploy workflow. It stops short of naming the concrete alternatives (run_script / validate_script) as fallbacks, so it is strong but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_workspaceSearch WorkspaceA
Search for tasks, resources, and configuration in a workspace.
Uses the workspace's task search / autocomplete to find matching items.
NOTE: Prefer workspace_chat for most search queries — it uses
semantic search and keyword grep across issues, resources, SLXs, and
run sessions with much richer results. Use this tool only as a
lightweight autocomplete fallback.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query string. | |
| workspace_name | Yes | The workspace to search (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden; it discloses the mechanism (task search/autocomplete) and positions itself as a lightweight fallback versus the richer semantic search of workspace_chat. It does not mention auth, rate limits, or result scope beyond the autocomplete framing, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then the mechanism, then a clearly delimited NOTE carrying the routing advice. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the two params are fully covered by the schema. The description supplies purpose, mechanism, and sibling routing, leaving only minor unstated details (e.g. result limits) for a low-complexity search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both query and workspace_name are already documented in the schema, making 3 the baseline. The description adds no syntax, format, or matching-behavior detail for the parameters beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (tasks, resources, and configuration in a workspace), then clarifies the underlying mechanism as task search/autocomplete. It explicitly names and differentiates itself from the sibling workspace_chat, so an agent can disambiguate 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit alternative ('Prefer workspace_chat for most search queries'), the reason for that preference (semantic search + keyword grep with richer results), and the specific condition for using this tool ('only as a lightweight autocomplete fallback'). When-to-use, when-not, and the alternative are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_assistantUpdate AssistantA
Partially update an existing AI assistant (persona).
Fetches the current configuration, applies only the fields you provide
(leaving everything else intact), then writes the merged result back.
Use this instead of create_assistant when you only want to change a
few settings without resetting the rest.
| Name | Required | Description | Default |
|---|---|---|---|
| avatar_url | No | New avatar image URL. | |
| run_config | No | Replace the run configuration. | |
| description | No | New description. | |
| display_name | No | New display name. | |
| filter_scope | No | New scope filter. | |
| assistant_name | Yes | Assistant short name to update (e.g. 'azure-devops'). Workspace prefix optional. | |
| search_filters | No | Replace the vector-search filters. | |
| workspace_name | Yes | The workspace the assistant belongs to. | |
| filter_stop_words | No | Replace the stop-words list. | |
| run_confidence_threshold | No | New run confidence threshold (0-1). | |
| filter_codebundle_task_tags | No | Replace the task-tag filter list. | |
| filter_confidence_threshold | No | New filter confidence threshold (0-1). | |
| filter_issue_selection_strategy | No | New issue selection strategy. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it does disclose the key behavioral trait: a fetch-merge-write cycle that preserves unspecified fields. It doesn't cover auth/permissions or resolve whether passing null clears a field versus omits it, but the core mutation semantics are stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences: what it does, how it works, and when to prefer it. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter mutation tool with an output schema present (so return values need no explanation), the description covers purpose and merge semantics adequately. It leaves gaps on authorization requirements and the null/clear semantics, which keeps it from fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with per-field descriptions ('Replace the run configuration', etc.), so the schema does the heavy lifting. The description adds the omitted-fields-are-preserved rule, but does not resolve the null-versus-omit ambiguity for the 11 optional nullable fields, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (AI assistant/persona), and immediately clarifies the partial-update nature. It distinguishes itself from the sibling create_assistant, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing guidance: 'Use this instead of create_assistant when you only want to change a few settings without resetting the rest.' It names the alternative and the exact condition that selects this tool over it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_chat_commandUpdate Chat CommandA
Update an existing chat command by ID.
Omitted fields are left unchanged. Schedule fields (cron_schedule,
sink_configs, run_as_user, assistant_name, etc.) follow the
same partial-update semantics as the PAPI. Use clear_max_runs=True to
remove an existing run cap (MCP cannot send bare null for max_runs).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New command name. | |
| max_runs | No | Replace the run budget (must be >= 1 when scheduling). | |
| scope_id | No | New scope ID. | |
| is_active | No | Set active/inactive. | |
| command_id | Yes | The command ID to update. | |
| scope_type | No | New scope type. | |
| description | No | New description. | |
| run_as_user | No | Replace the run-as user email. | |
| sink_configs | No | Replace delivery targets for scheduled runs. | |
| cron_schedule | No | New cron expression, or empty string to clear scheduling. | |
| assistant_name | No | Replace the persona for scheduled runs (workspace prefix optional). | |
| clear_max_runs | No | When true, remove the run budget cap (unlimited scheduled runs). | |
| workspace_name | Yes | The workspace the command belongs to (e.g. 't-oncall'). | |
| command_content | No | New markdown content. | |
| schedule_paused | No | Pause or resume the cron schedule. | |
| reset_runs_completed | No | When true, reset runs_completed to 0 (e.g. after raising max_runs). | |
| auto_approve_readonly | No | Toggle auto-approve for read-only tasks on scheduled runs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden, and it does disclose the crucial partial-update contract ("Omitted fields are left unchanged") plus a real MCP-level constraint on clearing max_runs. It omits authorization requirements, reversibility, and side effects on in-flight scheduled runs, and defers schedule semantics to an opaque external "PAPI" reference.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then the update contract, then the one non-obvious workaround. The "etc." tail on the schedule-field list and the unexplained "PAPI" reference are the only wasted/opaque bits.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter mutation tool with 100% schema coverage and an output schema, the description covers the essential partial-update semantics an agent needs. It is thin only on permissions and scheduling side effects, which limits it below a top score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the per-field descriptions already explain each parameter (baseline 3). The description adds real value beyond the schema by explaining the interaction between max_runs and clear_max_runs and by grouping the schedule-related fields under a shared partial-update rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Update an existing chat command by ID") and the schema/name make it trivially distinguishable from create_chat_command and get_chat_command. It stops short of explicitly routing against siblings, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives conditional guidance for one parameter path (use clear_max_runs=True to remove a run cap, since MCP can't send bare null for max_runs), which is genuinely useful. However it never says when to choose update vs. create/get/delete, nor any prerequisites such as required permissions or whether the command must exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_chat_ruleUpdate Chat RuleC
Update an existing chat rule by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New rule name. | |
| rule_id | Yes | The rule ID to update. | |
| scope_id | No | New scope ID. | |
| is_active | No | Set active/inactive. | |
| scope_type | No | New scope type. | |
| rule_content | No | New markdown content. | |
| workspace_name | Yes | The workspace the rule belongs to (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and supplies almost nothing. It does not disclose that this is a partial update (only rule_id and workspace_name are required, all other fields nullable/optional), whether omitted fields are preserved, whether rule_content markdown is validated, or any permission requirements for the mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, which is structurally clean. It is arguably terse to the point of under-informing, but it wastes no words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A 7-parameter mutation tool with no annotations and no explicit guidance is under-described; a present output schema means returns need not be explained, but the description fails to cover partial-update semantics, required vs optional field behavior, or authorization context. The agent lacks enough to call this safely beyond the raw schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 7 parameters is documented in the schema (name, scope_id, is_active, scope_type, rule_content, rule_id, workspace_name). The description only adds a restatement of the ID lookup and no extra semantics such as how scope_type/scope_id interact as a pair. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Update') and resource ('chat rule') plus the ID-based lookup, which is enough to distinguish it from create_chat_rule or list_chat_rules by name alone. It does not explicitly name an alternative sibling, but the action-resource pairing is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of prerequisites (e.g. needing an existing rule_id from get_chat_rule or list_chat_rules), and no routing to alternatives like update_chat_command. The agent must infer all usage context from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_knowledge_base_articleUpdate Knowledge Base ArticleA
Update an existing Knowledge Base article.
Only provided fields are updated; omitted fields remain unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Updated human-readable article title (max 255 chars). Title is the primary field for title-weighted KB search and the global-note catalog. | |
| status | No | Set to 'active' or 'deprecated'. | |
| content | No | Updated article content (max 20000 chars). | |
| note_id | Yes | The UUID of the KB article to update. | |
| verified | No | Mark as human-verified (true/false). | |
| resource_paths | No | Updated resource paths. | |
| workspace_name | Yes | The workspace (e.g. 't-oncall'). | |
| abstract_entities | No | Updated entity tokens. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses PATCH semantics (omitted fields unchanged), which is meaningful for a mutation tool, but says nothing about required permissions, authorization, or the side effects of changing fields like status or title. An output schema exists, so return format need not be covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste. The core action is front-loaded and the partial-update constraint follows immediately. Nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, the essentials are present (what it does, patch semantics, a fully documented schema, and an output schema). The remaining gaps are behavioral - permissions/auth requirements and side effects on search indexing or cataloging when title/status change - which a mutation tool should ideally cover.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all eight parameters, including lengths, enums like 'active'/'deprecated', and field meanings. The description adds no parameter-level detail beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Update) and resource (existing Knowledge Base article), clearly separating it from create_knowledge_base_article, delete_knowledge_base_article, and the get/list siblings. It does not, however, explicitly name or contrast with any sibling, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb and by contrast with the create/delete/get siblings, and it does clarify the partial-update behavior ('Only provided fields are updated; omitted fields remain unchanged'). But there is no explicit when-to-use guidance, prerequisites, or named alternatives, leaving it at implied-usage level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_scriptValidate ScriptA
Validate a script against the RunWhen contract before running it.
Checks that the script follows the required structure (main function, correct output format, etc.) and extracts referenced environment variables.
Task scripts must return/write issues with keys: 'issue title', 'issue description', 'issue severity' (1-4), 'issue next steps', and optionally 'issue observed at'.
Script-source parameter matrix (provide exactly one):
Variant | Best for | Mode |
script | Small scripts <~5KB, readable | any |
script_base64 | Any size; safe JSON escaping | any |
script_gzip_base64 | >5KB; 3-5x denser than b64 | any |
script_path | Local file, raw text | stdio only |
script_base64_path | Local file containing base64 blob | stdio only |
Skill: runwhen-skill://build-runwhen-task (full authoring workflow).
| Name | Required | Description | Default |
|---|---|---|---|
| script | No | The full script source code (raw text). | |
| task_type | No | 'task' (returns issues) or 'sli' (returns 0-1 metric). | task |
| interpreter | No | 'bash' or 'python'. | bash |
| script_path | No | Local file path to read the script from. **stdio mode only.** Mutually exclusive with the other script_* params. | |
| script_base64 | No | UTF-8 script as standard base64. Prefer over inline 'script' when JSON-escaping multiline content is error-prone. Mutually exclusive with the other script_* params. | |
| script_base64_path | No | Local file path to a file containing the base64-encoded script. **stdio mode only.** Convenient when the agent has already written the encoded script to a scratch file. Mutually exclusive with the other script_* params. | |
| script_gzip_base64 | No | UTF-8 script as base64(gzip(...)). Best inline option for scripts >5KB — typically 3-5x denser than 'script_base64'. Encode with: base64.b64encode(gzip.compress(script.encode())).decode(). Mutually exclusive with the other script_* params. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does reasonably well: it discloses the checks performed (structure, main function, output format), the side effect of extracting referenced environment variables, and the task-script issue-key contract. It does not state side effects, idempotency, or failure behavior, but it does convey that validation is a non-executing pre-flight step.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary purpose, then a compact variant table that earns its space by compressing five mutually exclusive options into a scannable grid. The issue-key paragraph is slightly dense but necessary; overall minimal waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters, a 100% covered schema, an output schema, and no annotations, the description supplies the contract rules, mode constraints, and variant guidance an agent needs to call it correctly. Minor gap: no mention of what a failed validation looks like or whether it can ever mutate state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 variant matrix pushes it higher by explaining the selection tradeoffs (small vs. large scripts, density, escaping safety) and the 'provide exactly one' mutual-exclusion rule, adding real decision value beyond the per-property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (validate) plus resource (script) plus the standard it is checked against (the RunWhen contract), with the temporal scope 'before running it' that separates it from the run_script/run_script_and_wait siblings. An agent can tell 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the context of use ('before running it') and enumerates which script-source variant fits which situation, including the stdio-only limitation for path-based variants. It stops short of explicitly naming the run siblings it precedes (run_script, run_script_and_wait), so the routing is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_chatWorkspace ChatA
Ask the RunWhen AI assistant about your infrastructure.
This is the PRIMARY tool for investigating infrastructure. It sends your message to the RunWhen workspace AI agent, which searches (keyword, semantic, and fuzzy), navigates and correlates across resources, SLXs, issues, run sessions, and the knowledge base, and returns rich markdown reports, diagrams, and tables.
PREFER THIS TOOL over direct read/query tools (get_workspace_issues, get_workspace_slxs, search_workspace, etc.) for any question that involves searching by topic, keyword, or context — e.g. "issues related to neo4j", "what's failing in namespace X?", "health of the watcher cluster". workspace_chat produces materially better answers because it can search, filter, and correlate across all workspace data internally.
Use direct tools instead ONLY for: executing tasks (run_slx), task
authoring, registry operations, chat config CRUD, KB mutations, or when
you specifically need raw structured JSON for programmatic processing.
Returns: JSON with message, sessionId, widgets, chatUrl (full browser URL to continue this session in the RunWhen UI — run tasks, review history), and chatExportLink (shareable chat-export path when available).
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Your question or request about the workspace infrastructure. | |
| session_id | No | Optional session ID to continue a previous conversation. | |
| persona_name | No | AI persona to use (default: 'default'). | default |
| workspace_name | Yes | The workspace to query (e.g. 't-oncall'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose meaningful behavior: it searches by keyword/semantic/fuzzy, correlates across resources/SLXs/issues/sessions/KB, and returns markdown reports, diagrams and tables. It does not cover permissions, auth requirements, rate limits, or latency, which are the remaining behavioral gaps for a chat/agent tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and routing guidance, then cleanly sectioned with a 'Returns:' block. It is somewhat long, and the return-value enumeration is largely redundant since an output schema exists, which slightly undercuts economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex AI-assisted query tool, the description covers purpose, routing against numerous siblings, internal behavior, and usage conditions. Since a full output schema is present, the extra return-value prose is redundant but harmless, and 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so message, session_id, persona_name, and workspace_name are already documented in the schema. The description adds essentially nothing to parameter meaning (e.g., it does not explain session continuation semantics beyond what the schema says), so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Ask the RunWhen AI assistant about your infrastructure') and elaborates on the internal search/correlation behavior. It explicitly distinguishes itself from siblings by naming get_workspace_issues, get_workspace_slxs, search_workspace, and run_slx, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('any question that involves searching by topic, keyword, or context') with concrete examples, plus a when-NOT-to-use list ('executing tasks, task authoring, registry operations, chat config CRUD, KB mutations, or raw structured JSON'). It also names the alternative tools to use instead, 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.1.4- Changed
create_knowledge_base_article1 field changed- added
Input schema / properties / titleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Human-readable article title (max 255 chars). Strongly recommended: title is the primary field for title-weighted KB search and the workspace global-note catalog. If omitted the note is stored title-less and under-performs on retrieval." +}
- Changed
update_knowledge_base_article1 field changed- added
Input schema / properties / titleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Updated human-readable article title (max 255 chars). Title is the primary field for title-weighted KB search and the global-note catalog." +}
3 tool updates
v0.1.3- Added
list_discovery_platforms - Added
list_indexed_resource_types - Changed
render_codecollection_skill1 field changed- changed
Input schema / properties / platform / descriptionPrevious value: -"Generation rule platform. Use 'runwhen' for workspace-scoped tool-builder."New value: +"Generation rule platform: runwhen (one SLX per workspace), kubernetes, azure, aws, or gcp (per-resource discovery). Call list_discovery_platforms() before choosing — agents must confirm the user's target platform and scope."
2 tool updates
v0.1.1- Changed
delete_slx2 fields changed- removed
Input schema / properties / branchRemoved value: -{ - "default": "main", - "description": "Git branch to delete from.", - "type": "string" -} - removed
Input schema / properties / commit_messageRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Custom commit message." -}
- Added
render_codecollection_skill
44 tool updates
v0.1.0- First observed
commit_slx - First observed
create_assistant - First observed
create_chat_command - First observed
create_chat_rule - First observed
create_knowledge_base_article - First observed
delete_assistant - First observed
delete_knowledge_base_article - First observed
delete_slx - First observed
deploy_registry_codebundle - First observed
get_assistant - First observed
get_chat_command - First observed
get_chat_rule - First observed
get_issue_details - First observed
get_knowledge_base_article - First observed
get_registry_codebundle - First observed
get_run_output - First observed
get_run_sessions - First observed
get_run_status - First observed
get_skill - First observed
get_slx_runbook - First observed
get_workspace_chat_config - First observed
get_workspace_config_index - First observed
get_workspace_context - First observed
get_workspace_issues - First observed
get_workspace_locations - First observed
get_workspace_secrets - First observed
get_workspace_slxs - First observed
list_assistants - First observed
list_chat_commands - First observed
list_chat_rules - First observed
list_knowledge_base_articles - First observed
list_skills - First observed
list_workspaces - First observed
run_script - First observed
run_script_and_wait - First observed
run_slx - First observed
search_registry - First observed
search_workspace - First observed
update_assistant - First observed
update_chat_command - First observed
update_chat_rule - First observed
update_knowledge_base_article - First observed
validate_script - First observed
workspace_chat
TDQS
Scored across 47 tools
Most tools target distinct resources and actions, and the descriptions go out of their way to explain when to prefer workspace_chat over the raw JSON read tools (get_workspace_issues, get_workspace_slxs, search_workspace). Some residual overlap remains in the read/query cluster (search_workspace vs workspace_chat vs get_workspace_config_index) and among run_script vs run_script_and_wait vs run_slx, but the guidance largely resolves it.
Nearly all tools follow a predictable snake_case verb_noun pattern (get_*, list_*, create_*, update_*, delete_*, run_*, search_*). The main deviation is workspace_chat, which uses a noun_verb shape with no verb prefix, plus minor inconsistencies in the domain prefixing (get_workspace_chat_config vs list_chat_rules).
At 47 tools this is well past the point where a set feels heavy; several clusters could be consolidated (run_script + run_script_and_wait + get_run_status + get_run_output; the nine chat-rule/command tools; multiple overlapping workspace read tools). The domain is broad, but the surface is bloated beyond what each sub-area needs.
Coverage is strong: full CRUD for assistants, knowledge-base articles, and chat rules/commands, plus runs, registry, and discovery/codecollection workflows. Minor gaps exist (no create/update/delete for workspaces, only list_workspaces; no delete for chat rules) but the core lifecycles are represented.
Maintenance
Related MCP Connectors
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
The Cortex MCP server provides read-only access to real-time engineering context from the Cortex developer portal, allowing AI coding assistants to answer natural language questions about your organization's catalog (microservices, libraries, domains, teams, infrastructure), scorecards (engineering standards and best practices), initiatives (goals and deadlines), and Engineering Intelligence metrics. It includes tools for querying documentation, tracking personal entities, and accessing AI-assisted insights across the entire Cortex ecosystem.
Real-time chat for AI agents. Claude Code, Cursor, Cline and Codex join channels over MCP.
Agent-native notes, tasks, dev-docs, vaults, sync & handoffs. MCP + OpenAPI dual surface.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides AI agents with operational customer context, including typed revenue objects, persistent state, scoped tools, and human-in-the-loop handoffs through MCP, REST, and CLI.11 npm12Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to interact with Databricks workspaces, running SQL queries, managing jobs, and exploring schemas via the Model Context Protocol.1GPL 3.0
- FlicenseBqualityDmaintenanceMCP server for IBM Watson Orchestrate (WXO). Manage tools, agents, connections, flows, and execute tools from Cursor, VS Code Copilot, Claude Desktop, Antigravity, Windsurf, or the WxO Builder extension.35-
- AlicenseAqualityBmaintenanceEnables MCP-capable agents to create and invoke OpenServerless endpoints, manage secrets, and configure integrations such as S3, PostgreSQL, Redis, Milvus, and MongoDB.13Apache 2.0