Skip to main content
Glama
RawTree MCP Server

RawTree MCP Server

Official
by rawtreedb

RawTree MCP Server

An MCP server for RawTree, an analytics database for unstructured data. Query data with SQL, insert JSON, inspect table schemas, review RawTree logs, and manage database credentials from MCP clients like Claude Code, Cursor, and Claude Desktop.

Features

  • Queries — Execute SQL reads and supported writes, including inserts from queries, table configuration, and access management, with permissions enforced by the Query API.

  • Workflows — Create, inspect, update, pause, resume, and delete scheduled SQL workflows with HTTP or table sinks.

  • Saved queries — List, create, update, and delete saved SQL definitions. Run a saved query by passing its SQL and database to run-query.

  • Ingest — Insert a single JSON object, arrays of JSON objects, or public URL data.

  • Tables — List tables, describe table columns, sizes, and sorting keys, set and change a table's sorting key, and delete tables after explicit confirmation.

  • Logs — Inspect RawTree query and insert history with structured filters for type, status, origin, table, hints, time window, and pagination.

  • API Keys — List, create, and revoke RawTree API keys for a cluster. Creation responses include the one-time API key value and expiration.

  • Organizations — List organizations and manage their members and roles with an OAuth-authenticated user.

  • Databases — List, create, verify S3 access for, and delete databases in a cluster.

  • Clusters — List, inspect, pause, resume, discover current creation options, verify optional customer-owned S3 access, configure independent per-database S3 access, and provision vertically autoscaling dedicated clusters after explicit confirmation where required. RawTree enforces user and organization-admin authorization.

  • Apps — List the app catalog for a cluster, inspect installation state, and install or uninstall apps after explicit confirmation.

  • Transports — Supports stdio for local MCP clients and dual-era Streamable HTTP for remote or multi-client deployments, including stateless MCP 2026-07-28 requests and legacy initialize-handshake clients.

Related MCP server: Azure SQL MCP Server

Setup

Create a RawTree API key from the RawTree CLI, dashboard, or API. A database API key starts with rt_ and is enough for data tools such as run-query, insert-json, list-tables, and list-logs.

Usage

The server supports two transport modes: stdio (default) and HTTP.

Stdio Transport

Quick Setup

npx add-mcp @rawtree/mcp --name rawtree --env "RAWTREE_API_KEY=rt_xxxxxxxxx"

Claude Code

claude mcp add rawtree -e RAWTREE_API_KEY=rt_xxxxxxxxx -- npx -y @rawtree/mcp

Cursor

Open the command palette and choose "Cursor Settings" > "MCP" > "Add new global MCP server".

{
  "mcpServers": {
    "rawtree": {
      "command": "npx",
      "args": ["-y", "@rawtree/mcp"],
      "env": {
        "RAWTREE_API_KEY": "rt_xxxxxxxxx"
      }
    }
  }
}

Claude Desktop

Open Claude Desktop settings > "Developer" tab > "Edit Config".

{
  "mcpServers": {
    "rawtree": {
      "command": "npx",
      "args": ["-y", "@rawtree/mcp"],
      "env": {
        "RAWTREE_API_KEY": "rt_xxxxxxxxx"
      }
    }
  }
}

HTTP Transport

Run the server over HTTP for remote or web-based integrations. In HTTP mode, each MCP client authenticates by passing its RawTree API key in the Authorization header.

Start the server:

npx -y @rawtree/mcp --http --port 3000

The server listens on http://127.0.0.1:3000 and exposes the MCP endpoint at /mcp using Streamable HTTP.

Claude Code

claude mcp add rawtree --transport http http://127.0.0.1:3000/mcp --header "Authorization: Bearer rt_xxxxxxxxx"

Cursor

{
  "mcpServers": {
    "rawtree": {
      "url": "http://127.0.0.1:3000/mcp",
      "headers": {
        "Authorization": "Bearer rt_xxxxxxxxx"
      }
    }
  }
}

You can also set the port via the MCP_PORT environment variable:

MCP_PORT=3000 npx -y @rawtree/mcp --http

Options

  • --api-key: RawTree database API key for stdio mode

  • --api-url: RawTree API base URL, default https://api.rawtree.com

  • --database: Database name for scoped routes

  • --org: Organization name for scoped routes

  • --http: Use HTTP transport instead of stdio

  • --port: HTTP port when using --http, default 3000 or MCP_PORT

Environment variables:

  • RAWTREE_API_KEY: RawTree database API key

  • RAWTREE_API_URL: RawTree API base URL, default https://api.rawtree.com

  • RAWTREE_DATABASE: Database name for scoped routes

  • RAWTREE_ORG: Organization name for scoped routes

  • MCP_PORT: HTTP port when using --http

Tools

Data

  • run-query — Execute one supported SQL statement and return RawTree's JSON query response. Supports reads and writes described below, with organization, cluster, and database overrides.

  • query-format — Format complete SQL without execution or database query logs. Accepts the same scope overrides and forwards cancellation to the API.

  • insert-json — Insert JSON object(s) into a table.

  • insert-from-url — Ingest data from a public URL and wait for completion, returning the inserted row count (or null when unavailable).

Query statements and permissions

run-query calls POST /v1/query using the existing connection. An API key with sufficient permission can execute supported writes without browser login. The tool advertises readOnlyHint: false, destructiveHint: true, and idempotentHint: false because SQL can change persistent data and access controls. The backend validates syntax, scope, and permissions; MCP does not implement a separate SQL allowlist.

Statement family

Permission

Supported forms and limits

Reads

read_only, read_write, admin, or signed-in session; database-role keys use their grants

SELECT, WITH, EXPLAIN, DESCRIBE. Use bounded, ordered reads for exploration.

Insert from query

read_write, admin, or signed-in session

INSERT INTO <table> [(columns)] SELECT ..., including a WITH source. Existing target in the selected user database; no VALUES, FORMAT, url(), or urlCluster(). SQL SETTINGS are validated by the engine; default execution time is 30 seconds.

Create table

admin or signed-in session

CREATE TABLE [IF NOT EXISTS] <table> ENGINE = ReplicatedRawMergeTree [ORDER BY <expressions>]. Selected user database only. Optional ON CLUSTER 'default' is accepted. No columns, engine arguments, other engines, AS SELECT, or other table clauses.

Table configuration

admin or signed-in session

ALTER TABLE <table> MODIFY ORDER BY ..., or ADD/MATERIALIZE/CLEAR/DROP PROJECTION or INDEX, including text indexes. One operation, in the selected user database; no ON CLUSTER or IN PARTITION. ADD accepts IF NOT EXISTS; the other operations accept IF EXISTS. Index creation requires an expression and TYPE, with optional positive integer GRANULARITY; no AFTER.

Cancel mutations

admin or signed-in session

KILL MUTATION WHERE table = '<table>' [AND mutation_id = '<id>']. The backend adds the selected user database filter. Only these equality conditions are accepted, in either order; doubled quotes are supported, backslash escapes are not.

Roles and grants

admin or organization administrator session

CREATE ROLE <name>, DROP ROLE [IF EXISTS] <name>, GRANT SELECT/INSERT [(columns)] ON <database>.<table> TO <role>. Grants may combine both privileges and use database.* or *.*. The grant target must be an existing role. No user grants, inheritance, delegation, REVOKE, or role replacement.

Workloads and resources

admin or organization administrator session

CREATE [OR REPLACE] WORKLOAD/RESOURCE, CREATE WORKLOAD/RESOURCE IF NOT EXISTS, DROP WORKLOAD/RESOURCE [IF EXISTS]. Workloads accept IN <parent> and numeric/string SETTINGS, optionally FOR <resource>. Resources accept MASTER THREAD, WORKER THREAD, READ/WRITE DISK <name>, and READ/WRITE ANY DISK; no memory or query-slot resources.

Settings profiles

admin or organization administrator session

CREATE SETTINGS PROFILE [OR REPLACE | IF NOT EXISTS] and DROP SETTINGS PROFILE [IF EXISTS]. Only workload = '<name>' and use_concurrency_control = 0/1, optionally READONLY/CONST, assigned TO 1–32 distinct existing roles. No user targets, inheritance, other settings, or ALTER.

Row policies

admin or organization administrator session

CREATE ROW POLICY [OR REPLACE | IF NOT EXISTS] and DROP ROW POLICY [IF EXISTS], on one table in the selected user database. A scalar SELECT USING filter, optional AS PERMISSIVE/RESTRICTIVE, and 1–32 distinct existing roles. No subqueries, wildcard/user targets, access-storage selectors, or ALTER.

Named collections

admin or organization administrator session

CREATE NAMED COLLECTION [IF NOT EXISTS] <name> AS key = literal, .... Unique keys with string, numeric, or boolean literals and optional OVERRIDABLE/NOT OVERRIDABLE. No expressions, replacement, ALTER, or DROP.

write_only keys cannot use the Query API. Database-role keys support reads here, even if their roles have insert grants; their inserts use the JSON insert API. Grant, profile, and policy targets must be existing roles without same-named database users. Profiles and policies reject selectors such as ALL, NONE, and CURRENT_USER. All write families reject RawTree's internal organization. Table writes and row policies reject system databases. Other mutations, including UPDATE, DELETE, DROP TABLE, and arbitrary ALTER, are unsupported; use delete-table for table deletion.

Role, workload/resource, profile, policy, and named-collection management accept optional ON CLUSTER 'default', preserving engine replication semantics. No other cluster name is accepted. Row policies with that clause require an explicit database.table matching the selected database. Management can affect the cluster beyond the selected database: grant scopes are explicit, while roles, workloads, resources, profiles, and collections are not database-local. Consult the API reference and role reference for syntax, local versus replicated storage, and distributed DDL limitations. Named-collection credentials in ON CLUSTER statements are visible to readers of the distributed DDL queue; use Keeper-backed collection storage without that clause for credentials.

Index and projection definitions use storage paths such as __raw_data.field, with casts where a concrete type is required. ADD applies to new data; MATERIALIZE builds existing data. CLEAR removes stored index/projection data while keeping its definition; DROP removes the definition. MATERIALIZE and CLEAR run in the background. Inspect system.mutations for progress and mutation IDs, and system.projections or system.data_skipping_indices for definitions.

Responses contain meta, data, rows, statistics, and optional hints. DDL normally returns an empty result; inserts also report statistics.written_rows; KILL MUTATION returns matched mutations. Writes are not generally idempotent, and distributed DDL is not transactional: inspect state before retrying an error or timeout. A successful materialization request does not mean its background build has finished.

This contract is derived from Platform's backend/src/validation.rs, Query API dispatch, and each statement family's validators, checked against the canonical public API and authentication docs. It describes Query API execution, not the separate workflow SQL restrictions or the formatter's broader syntax support.

Workflows

These tools target the /v1/workflows API with cron schedules. The backend must have the workflow schedule, query, and sinks with nested settings contracts deployed; top-level enabled and interval_seconds are rejected. The former workflow destinations field is rejected; connector destinations are unchanged. Flattened sink settings are rejected. There are no trigger aliases or workflow-specific telemetry tools.

All five tools require explicit organization and cluster names, including standalone/API-key usage. Configured defaults do not replace these required tool arguments. Workflow definitions have their own query.database; the MCP's default database is never added as a workflow query parameter or substituted for that field.

Tool

Required parameters

Optional parameters

Result

list-workflows

organization, cluster

None

{ "workflows": [...] }; no pagination

get-workflow

organization, cluster, id

None

Complete workflow object

create-workflow

organization, cluster, name, query.database, query.sql

description, schedule, sinks

Complete saved workflow object

update-workflow

organization, cluster, id, and at least one changed field

name, description, query, schedule, sinks

Complete saved workflow object

delete-workflow

organization, cluster, id

None

{ "id": "...", "deleted": true } after confirmed deletion

API-key access requires an admin key bound to the selected organization and cluster. With OAuth, organization members can read and organization admins can create/update/delete. The backend enforces authorization. Workflows execute with organization credentials; expiration or revocation of the creating key does not stop scheduled execution.

Create (create-workflow):

{
  "organization": "acme",
  "cluster": "production",
  "name": "recent-events",
  "query": {
    "database": "default",
    "sql": "SELECT 1 AS value"
  },
  "description": "Recent events every 30 seconds",
  "schedule": {"cron": "*/30 * * * * *", "enabled": false},
  "sinks": [
    {"type": "http", "settings": {"url": "https://example.com/events", "headers": {"Authorization": "Bearer example-only"}}},
    {"type": "table", "settings": {"database": "default", "table": "alerts"}},
    {"type": "slack", "settings": {"integration_id": "00000000-0000-4000-8000-000000000004", "channel_name": "#alerts"}}
  ]
}

Defaults on creation are schedule: {"cron": "* * * * * *", "enabled": true} and sinks: []; schedule.enabled defaults to true when a schedule is supplied, and schedule: null creates a manual-only workflow. Enabled schedules activate recurring SQL execution and sink delivery. SQL supports reads and INSERT INTO ... SELECT ...; validation is performed by the API. schedule.cron is a UTC expression with five fields (minute hour day-of-month month day-of-week) or six with a leading seconds field; the API validates it. If creation has an uncertain result, inspect list-workflows before retrying.

Create, get, and update return the same complete object shape:

{
  "id": "00000000-0000-4000-8000-000000000001",
  "name": "recent-events",
  "query": {
    "database": "default",
    "sql": "SELECT 1 AS value"
  },
  "description": "Recent events every 30 seconds",
  "schedule": {"cron": "*/30 * * * * *", "enabled": false, "next_run_at": null},
  "revision": 1,
  "created_at": "2026-10-05T10:00:00Z",
  "updated_at": "2026-10-05T10:00:00Z",
  "sinks": [
    {"type": "http", "id": "00000000-0000-4000-8000-000000000002", "settings": {"url": "https://example.com/events", "url_configured": true, "header_names": ["Authorization"]}},
    {"type": "table", "id": "00000000-0000-4000-8000-000000000003", "settings": {"database": "default", "table": "alerts"}},
    {"type": "slack", "id": "00000000-0000-4000-8000-000000000005", "settings": {"integration_id": "00000000-0000-4000-8000-000000000004", "channel_id": "C0123456789", "channel_name": "alerts"}}
  ]
}

List (list-workflows):

{ "organization": "acme", "cluster": "production" }

Returns { "workflows": [<workflow objects as above>] }, or { "workflows": [] } when empty.

Get (get-workflow):

{ "organization": "acme", "cluster": "production", "id": "00000000-0000-4000-8000-000000000001" }

Update / resume (update-workflow):

{
  "organization": "acme",
  "cluster": "production",
  "id": "00000000-0000-4000-8000-000000000001",
  "schedule": {"cron": "0 * * * *", "enabled": true}
}

The returned object includes the new schedule, its next_run_at, and the backend's updated revision and timestamp. Set schedule.enabled: false to pause; omitted schedule.cron or schedule.enabled keep their saved values, and schedule: null makes the workflow manual-only. Scheduling a manual-only workflow again requires schedule.cron. description: null clears the description. Other omitted fields stay unchanged; empty updates are rejected. Already buffered deliveries may continue after pausing.

Supplying sinks replaces the whole list (maximum five); omission preserves it and [] removes all. New sinks omit id; new HTTP sinks require settings.url. When editing an existing sink, preserve its id and type. Header values are write-only: returned HTTP settings contains url (null when the stored configuration is unreadable), url_configured, and header_names. For an existing HTTP sink, omit settings, settings.url, or settings.headers to preserve the stored configuration. Within a supplied settings.headers map, null preserves the existing value for that name, omitted header names are removed, and {} clears all headers.

Slack sinks post a summary and a preview of the result rows through an organization's Slack integration. They take settings.integration_id from list-integrations (with an API key, which cannot call it, reuse the integration_id of an existing Slack sink) and exactly one of channel_name (such as "#alerts") or channel_id (such as "C0123456789"), and always require settings, including when editing. Use list-slack-channels with name to search for a channel. A name is resolved to its channel ID on every save, and only the ID is stored; responses return both channel_id and channel_name. To keep an existing Slack sink unchanged without a Slack lookup, send back its saved channel_id. Unknown names fail with "Slack channel not found.", and workspaces too large to search by name require channel_id. Each Slack sink must use a distinct integration and channel, and the RawTree app must be a member of private channels.

For example, this update keeps one existing HTTP sink and its Authorization value, replaces its header list, and removes every other sink:

{
  "organization": "acme",
  "cluster": "production",
  "id": "00000000-0000-4000-8000-000000000001",
  "sinks": [
    {"type": "http", "id": "00000000-0000-4000-8000-000000000002", "settings": {"headers": {"Authorization": null, "X-Source": "workflow"}}}
  ]
}

Delete (delete-workflow):

{ "organization": "acme", "cluster": "production", "id": "00000000-0000-4000-8000-000000000001" }

Returns { "id": "00000000-0000-4000-8000-000000000001", "deleted": true }. Deletion removes the definition and schedule; it does not undo previous SQL writes or completed deliveries. API failures are returned as MCP tool errors rather than successful deletion results.

As with existing tools, the JSON results above are serialized in the MCP content text block.

Workflow SQL and its database belong to query: {"query":{"database":"default","sql":"SELECT 1"}}. Create requires both fields. Updates preserve omitted query fields. Top-level database and sql are rejected.

Saved queries

  • list-saved-queries — Return all visible saved queries in a cluster, across databases, as { "queries": [...] }. There is no cursor or pagination.

  • save-query — Create a saved query when id is omitted, or update one when id is supplied. Returns the saved query as a flat object.

  • delete-saved-query — Delete a query you own. Returns { "id": "...", "deleted": true } after the API confirms deletion.

  • run-query — Execute SQL separately using the saved query's sql and database, with the same organization and cluster. Saving and listing never execute SQL.

User sessions and OAuth can list their own private queries and cluster-shared queries. Standard API keys with admin, read_write, or read_only permission can list only cluster-shared queries in their bound cluster. Write-only and database-role keys cannot read saved queries. Reading a definition does not grant permission to execute its SQL or access its database.

Creating, updating, and deleting require a user session or OAuth. The API assigns new queries to the authenticated user; callers do not supply a user ID. Only the owner can update or delete a query, including a cluster-shared query. With an API key, these actions return: “This action requires a user session. API keys aren’t supported.”

All examples below show explicit organization and cluster names, as required by hosted deployments configured with requireExplicitScope. Standalone clients may omit names already configured on RawTreeClient. Saved-query requests never inherit the client's database: it is a field of the saved definition, not a list filter.

List saved queries

{
  "organization": "acme",
  "cluster": "production"
}

Response:

{
  "queries": [
    {
      "id": "00000000-0000-4000-8000-000000000001",
      "organization_id": "00000000-0000-4000-8000-000000000002",
      "cluster_id": "00000000-0000-4000-8000-000000000003",
      "user_id": "00000000-0000-4000-8000-000000000004",
      "name": "Recent events",
      "sql": "SELECT * FROM events LIMIT 10",
      "database": "analytics",
      "visibility": "private",
      "created_at": "2026-10-02T10:00:00Z",
      "updated_at": "2026-10-02T10:00:00Z"
    }
  ]
}

No visible queries returns { "queries": [] }.

Save query: create

{
  "organization": "acme",
  "cluster": "production",
  "name": "Recent events",
  "sql": "SELECT * FROM events LIMIT 10",
  "database": "analytics",
  "visibility": "private"
}

name, sql, and database are required when creating. visibility is optional and defaults to private; use cluster to share the definition. The response is the flat query object shown inside the list above, including the generated id and authenticated user_id.

Save query: update

{
  "organization": "acme",
  "cluster": "production",
  "id": "00000000-0000-4000-8000-000000000001",
  "name": "Shared recent events",
  "visibility": "cluster"
}

Supply at least one of name, sql, database, or visibility. Omitted fields stay unchanged; null is rejected. The response is the complete updated query, with the same id and an updated updated_at.

Delete saved query

{
  "organization": "acme",
  "cluster": "production",
  "id": "00000000-0000-4000-8000-000000000001"
}

Response:

{
  "id": "00000000-0000-4000-8000-000000000001",
  "deleted": true
}

This removes the saved definition only; the underlying data is unchanged. A failed deletion returns an MCP tool error, not a success confirmation.

Run query

{
  "organization": "acme",
  "cluster": "production",
  "database": "analytics",
  "sql": "SELECT count() AS events FROM events"
}

Example response:

{
  "meta": [{ "name": "events", "type": "UInt64" }],
  "data": [{ "events": "42" }],
  "rows": 1,
  "statistics": { "elapsed": 0.001, "rows_read": 42, "bytes_read": 336 }
}

run-query also forwards optional query hints from the API. All responses above are JSON encoded in the MCP text content, following the server's existing response format.

Formatting SQL

Call query-format with the complete SQL document:

{ "sql": "select 1; select 'hello'", "organization": "acme", "cluster": "production" }

The MCP text content contains JSON with the complete result, including trailing newlines:

{ "formatted": "SELECT 1;\n\nSELECT 'hello';\n\n" }

Organization, cluster, and database follow the usual tool defaults and overrides; hosts configured with requireExplicitScope require organization and cluster. The native formatter supports multiple statements and preserves literal values. Inline INSERT ... VALUES data is copied verbatim without completeness or schema validation. The API accepts up to 50 MiB of JSON, allows 100 MiB of formatted output, and times formatting out after 30 seconds. Errors return no partial SQL. The bundled HTTP and stdio transports accept MCP requests up to 51 MiB to allow for the API payload plus the MCP envelope. Your MCP client or hosting gateway may impose smaller message limits, including on responses.

Requires deployment of Platform PR #1468. The tool calls POST /v1/query-format; it does not execute SQL or fall back to a query.

Tables

  • list-tables — List tables in the configured database.

  • create-table — Create an empty table with an optional sorting key, using the storage configured on its database or cluster.

  • describe-table — Inspect columns, row count, byte count, sorting key, database, and organization.

  • update-table — Change a table's sorting key. Requires admin permission.

  • delete-table — Delete a table after explicit confirmation. Requires admin permission.

sortingKey is an optional string on create-table. Omit it and the table picks a sorting key per part from the ingested data; set it to comma-separated SQL expressions in key order, such as region, ifNull(cityHash64(host, instanceId), 0). A bare name such as user.id is read as a path into the ingested JSON. describe-table reports the current key as a string, and update-table changes it: the new key applies to newly inserted parts and wins later merges, so existing parts are re-sorted in the background rather than rewritten by the call. A key must contain at least one expression; a table's sorting key cannot be removed once set.

Tables have no storage configuration of their own: a table uses its database's storage when the database configures one, and the cluster's default storage otherwise. Customer-owned S3 is configured with create-cluster.s3Storage or create-database.s3Storage.

Logs

  • list-logs — Read RawTree query and insert logs. Defaults to the last hour when no time window is provided.

Structured log filters include:

{
  "statuses": ["error"],
  "types": ["insert"],
  "tables": ["events"],
  "origins": ["api"],
  "hints": "any",
  "limit": 50
}

API Keys

  • list-api-keys — List API keys for a cluster, including expires_at (UTC timestamp or null for never).

  • create-api-key — Create a key with admin, read_write, write_only, or read_only permission. Optional expires_at accepts a future RFC 3339 timestamp with a timezone, validated by the API. Omit it or pass null to never expire. Creation returns the expiration and one-time token. Expiration is fixed at creation; no API-key update tool is available.

  • delete-api-key — Revoke a key after explicit confirmation.

Databases

  • list-databases — List databases in an organization and cluster.

  • verify-database-s3-access — Verify a customer-owned S3 configuration before creating a database.

  • create-database — Create a database with cluster-default storage or an optional customer-owned S3 configuration.

  • delete-database — Delete a database and all its data after explicit confirmation.

create-database.s3Storage is optional. Omit it to use the cluster's default storage. When provided, tables in that database inherit its storage. Call verify-database-s3-access with the identical configuration before creation. Database listings expose s3_storage metadata with data and backups destinations, each containing bucket and path; credentials are never returned.

Organizations

  • list-organizations — List organizations available to the authenticated user. Requires a user credential such as OAuth.

  • list-organization-members — List accepted members of an organization with their user IDs and roles.

  • add-organization-member — Send an organization member invitation after confirming the organization and email address. Membership starts after acceptance.

  • update-organization-member — Change an accepted member's role to admin or member after explicit confirmation.

  • remove-organization-member — Remove an accepted member and revoke organization access after explicit confirmation.

Service accounts

  • list-service-accounts — List an organization's service account IDs, names, descriptions, and stored roles.

  • create-service-account — Create a service account with an immutable name, optional description, and optional member (default) or admin role.

Both tools require an explicit organization name and an organization admin using a user session or OAuth. API keys cannot manage service accounts. No cluster or database is required. Names contain 1–128 lowercase letters or digits separated by single hyphens; descriptions accept up to 2000 UTF-8 bytes without null characters. Creation returns the account object; listing returns an array of accounts. These tools create identities without credentials. API key permissions are configured separately.

Workload identity federation

These tools manage organization issuers and cluster rules. Every call requires an explicit organization; rule tools also require cluster. Use an organization-admin user session or OAuth token with full_access. API keys and workload tokens cannot manage this configuration.

Tool

Input beyond scope

Response

list-federation-issuers

None

Array of issuer objects

get-federation-issuer

id

Issuer object

create-federation-issuer

Issuer configuration

Issuer object

update-federation-issuer

id and complete issuer configuration

Issuer object

delete-federation-issuer

id

null

list-federation-rules

None

Array of rule objects

get-federation-rule

id

Rule object

create-federation-rule

Rule configuration

Rule object

update-federation-rule

id and complete rule configuration

Rule object

delete-federation-rule

id

null

Create an issuer through discovery:

{
  "organization": "acme",
  "name": "github",
  "issuer_url": "https://token.actions.githubusercontent.com",
  "jwks_source": "discovery"
}

Alternatively, set jwks_source to explicit_url and supply jwks_url. Saving an issuer does not fetch signing keys. Create a rule using the returned issuer ID and an existing service account ID (illustrative UUIDs below):

{
  "organization": "acme",
  "cluster": "production",
  "name": "ci-read",
  "issuer_id": "11111111-1111-4111-8111-111111111111",
  "allowed_audiences": ["rawtree"],
  "claim_conditions": {"sub": "repo:acme/app:ref:refs/heads/main"},
  "principal_type": "service_account",
  "principal_id": "22222222-2222-4222-8222-222222222222",
  "permission": "read_only",
  "database": "default",
  "enabled": true
}

A user principal must be your own user ID. Use exactly one access mode: permission (admin, read_only, or read_write) or a nonempty database_roles array. Claim conditions are exact string matches, not expressions or row filters. The database and enabled state must be explicit.

Updates replace the entire configuration (PUT). Add id to the complete create input; omitted optional fields are cleared. Changes invalidate existing workload access tokens. Delete referencing rules before deleting their issuer; an issuer still in use returns 409.

Responses preserve the API's snake_case fields and nullable values. Issuers include configuration, id, organization_id, created_at, and updated_at. Rules also include cluster_id and the resolved principal details. Empty lists are []; successful deletions are null.

These tools require the Platform federation-management OAuth routes. Deploy that backend change together with the hosted MCP dependency pin.

Integrations

  • list-integrations — List an organization's connected integrations, such as Slack workspaces, with slack_available and a settings_url link to the organization's integrations page in the RawTree app.

  • list-slack-channels — List a Slack integration's channels (id, name, is_private). Optional name returns channels whose name contains it, ignoring a leading #, surrounding spaces, and case. Pass next_cursor back as cursor (with the same name) to continue; it is null when there are no more results. A search scans a bounded part of the workspace per request, so a page can be empty while next_cursor is still set.

Both are read-only and require a user credential such as OAuth; API keys are not supported. Connecting or disconnecting Slack is not available through MCP: an organization admin does it at settings_url. Its app URL follows the API URL: https://rawtree.com for hosted APIs, https://rawtree.dev for development ones, and the API URL's origin otherwise, such as a local gateway.

Clusters

  • list-clusters — List dedicated clusters accessible in an organization. User-authenticated discovery spans enabled regions with a five-second limit per deployment. Partial outages return healthy clusters plus unavailable_regions (IDs and names); retry before concluding a missing cluster does not exist. Authentication failures and total regional outages remain errors.

  • list-regions — List public and BYOC regions accessible to an organization.

  • list-cluster-sizes — List current replica limits, supported per-replica sizes, and default vertical autoscaling bounds.

  • verify-cluster-s3-access — Verify an optional customer-owned S3 configuration before cluster creation. The check temporarily writes, reads, and removes a probe object in both configured destinations.

  • create-cluster — Provision a dedicated cluster after confirming its organization, replica count, minimum size, maximum size, autoscaling behavior, optional idle timeout, optional customer-owned default S3 configuration, and immutable cluster identity.

  • get-cluster — Get one dedicated cluster and its current lifecycle status by ID.

  • update-cluster — Change a dedicated cluster's idle timeout after confirming the organization, cluster ID, and new value. Use 0 to disable idling.

  • pause-cluster — Pause a dedicated cluster after explicit confirmation. Its databases become unavailable until the cluster is resumed.

  • resume-cluster — Resume a paused dedicated cluster after explicit confirmation.

Cluster tools are advertised to every MCP client. To choose a region, call list-regions with organization, then pass the same organization and regionId to list-cluster-sizes, verify-cluster-s3-access (when needed), and create-cluster. These requests use the selected deployment; creation also saves its region_id. Omitted regionId preserves the default backend. Explicit unavailable regions fail before creation, except the supported legacy public default. Region selection requires a user credential such as OAuth; API keys retain their embedded routing. Call list-cluster-sizes before create-cluster; creation starts at the selected minimum per-replica size and can vertically autoscale to the selected maximum. idleTimeoutMinutes accepts 0 to disable idling or a value from 15 through 43200; omit it during creation to use the server default.

create-cluster accepts optional s3StorageAccess containing externalId and resourceTag. The API generates omitted values independently as rawtree-<UUID> using secure randomness; MCP forwards optional values without generating identities. Both are persisted when the cluster is created and remain immutable. Cluster list/get responses expose s3_storage_access containing external_id and resource_tag; older clusters without identity may return null. resourceTag is the value of the rawtree.com/cluster AWS resource tag on eligible customer buckets and IAM roles.

s3Storage is optional. Omit it for RawTree-managed default storage. Custom storage requires data and backups destinations (each with bucket and optional path), plus roleArn. When specifying custom cluster storage, you must supply an explicit s3StorageAccess.externalId matching the IAM trust policy. Call verify-cluster-s3-access first, passing that same s3StorageAccess.externalId and the identical s3Storage, then reuse both for creation. Repeat verification after changing either.

Example create-cluster tool arguments (choose replica counts and sizes from list-cluster-sizes):

{
  "organization": "acme",
  "name": "production",
  "replicas": 2,
  "minimumSize": { "cpuCores": 2, "memoryGiB": 8 },
  "maximumSize": { "cpuCores": 4, "memoryGiB": 16 },
  "s3StorageAccess": {
    "externalId": "rawtree-5b71c457-7d83-474b-9db9-6dc48a1ec042",
    "resourceTag": "rawtree-dc1fb78e-341d-48f8-a183-9ecea12eb41d"
  },
  "s3Storage": {
    "data": { "bucket": "acme-data", "path": "production/data" },
    "backups": { "bucket": "acme-backups", "path": "production/backups" },
    "roleArn": "arn:aws:iam::123456789012:role/RawTreeS3"
  }
}

For verify-database-s3-access and create-database, pass only the database name, scope, and s3Storage. The backend reuses the cluster's saved External ID and resource tag; neither tool accepts identity overrides. Tables inherit database storage, falling back to cluster storage when the database has none.

The old databaseS3Access block, flat dataBucket/backupBucket fields, and s3Storage.externalId are rejected. These tools target the API introduced by Platform PR #1482 and must be released with that server contract.

The RawTree API remains the authorization boundary: cluster access requires a user access token, and cluster creation, S3 verification, updates, pausing, and resuming additionally require organization-admin access.

Apps

  • list-apps — List the available apps and installation state for one cluster.

  • install-app — Install an app on a cluster after confirming the organization, cluster name, and app ID.

  • uninstall-app — Uninstall an app and disable its native endpoints after confirming the organization, cluster name, and app ID. Existing cluster data is not deleted.

App tools require a user credential. Organization members can list apps; installing and uninstalling require organization-admin access. Use the app IDs returned by list-apps.

Connectors

  • list-connectors — List the managed connectors and destinations in a cluster.

  • get-connector — Get one connector's status and sanitized configuration.

  • create-connector — Create an active Kafka connector with one or more destinations.

  • get-connector-metrics — Read connector and per-destination health, lag, buffers, delivery counters, errors, source lag, and HTTP latency counters.

  • add-connector-destination — Preserve the existing routes and add another topic-to-table destination.

  • set-connector-status — Pause or resume all destinations in a connector.

Connector tools use the same nested field names as the RawTree API. A minimal Kafka connector request looks like:

{
  "organization": "acme",
  "cluster": "production",
  "name": "orders",
  "type": "kafka",
  "destinations": [
    {
      "topics": ["orders"],
      "database": "default",
      "table": "orders"
    }
  ],
  "settings": {
    "bootstrap_servers": "kafka.example.com:9092",
    "auto_offset_reset": "largest",
    "tls": { "enabled": true },
    "sasl": {
      "enabled": true,
      "mechanism": "PLAIN",
      "username": "connector-user",
      "password": "secret"
    },
    "batch": { "max_events": 1000, "timeout_secs": 1 }
  }
}

Creating connectors, adding destinations, and changing status require organization-admin access. Credentials are encrypted by RawTree and omitted from connector responses. get-connector-metrics returns cumulative counters; take two samples and divide counter differences by elapsed time to calculate event rates.

Programmatic hosted deployments can require explicit resource selection on every applicable tool. Organization and cluster identify the resource boundary; database remains an optional override and defaults to default when omitted. This lets one OAuth-backed MCP connection switch between organizations, clusters, and databases without encoding context in the MCP URL:

const server = createMcpServer(client, { requireExplicitScope: true });

Examples

Query

{
  "organization": "acme",
  "cluster": "production",
  "database": "analytics",
  "sql": "SELECT count() AS rows FROM events"
}

Insert JSON

{
  "table": "events",
  "data": [
    {
      "event": "signup",
      "user_id": "user_123",
      "source": "mcp"
    }
  ]
}

Debug Failed Inserts

{
  "statuses": ["error"],
  "types": ["insert"],
  "startTime": "2026-05-28T09:00:00.000Z",
  "endTime": "2026-05-28T10:00:00.000Z",
  "limit": 25
}

Local Development

  1. Install and build:

pnpm install
pnpm build
  1. Use the local build from an MCP client:

claude mcp add rawtree -e RAWTREE_API_KEY=rt_xxxxxxxxx -- node /absolute/path/to/rawtree-mcp/dist/index.js

Live federation test

The default suite uses mocked HTTP responses. To exercise all ten federation tools against a bootstrapped Platform with the OAuth management routes, set:

export RAWTREE_LIVE_API_URL=http://localhost:8206
export RAWTREE_LIVE_ORGANIZATION=your-local-organization
export RAWTREE_LIVE_CLUSTER=your-local-cluster
export RAWTREE_LIVE_USER_ID=your-user-uuid
# Supply RAWTREE_LIVE_OAUTH_TOKEN securely from a user OAuth grant with full_access.
pnpm test tests/live/federation.test.ts

The live test creates temporary issuers and rules, verifies replacement and in-use deletion behavior, and removes its resources. It is skipped when RAWTREE_LIVE_API_URL is unset. Never use production credentials for this test.

Live Testing with an MCP Client

Run TypeScript in watch mode, then point a separate MCP client at the built server:

pnpm tsc --watch
{
  "mcpServers": {
    "rawtree-dev": {
      "command": "node",
      "args": ["/absolute/path/to/rawtree-mcp/dist/index.js"],
      "env": {
        "RAWTREE_API_KEY": "rt_xxxxxxxxx"
      }
    }
  }
}

Restart the MCP client session after each rebuild.

Programmatic usage

The package root exposes the reusable MCP server layer. The Node HTTP transport is available separately from @rawtree/mcp/http, so hosted adapters can use the server factory without importing the local process entrypoint.

import { createMcpServer, RawTreeClient } from '@rawtree/mcp';

const client = new RawTreeClient({ apiKey: process.env.RAWTREE_API_KEY! });
const server = createMcpServer(client);

Publishing

Publishing is handled by the GitHub Actions Publish workflow.

Required repository secret:

  • NPM_TOKEN: npm automation token with permission to publish @rawtree/mcp.

Release flow:

  1. Update package.json to the new version.

  2. Push the change to main.

  3. Create and publish a GitHub release with a tag that matches the package version, such as v0.2.0.

The workflow verifies that the release tag matches package.json, runs lint, tests, and build, then publishes with npm provenance:

npm publish --provenance --access public

Testing with MCP Inspector

Build first:

pnpm build

Start the inspector:

RAWTREE_API_KEY=rt_xxxxxxxxx pnpm inspector

In the Inspector UI, choose stdio:

  • Command: node

  • Args: dist/index.js

  • Environment: RAWTREE_API_KEY=rt_xxxxxxxxx

RawTree References

Available Tools

62 tools
add-connector-destinationAdd Connector DestinationA
Idempotent

Purpose: Add one Kafka topic-to-table destination to an existing connector without changing its current destinations.

Behavior: The tool reads the latest connector, preserves every existing destination, and appends the new destination. Omit group_id to let RawTree generate an independent consumer group. An exact existing database/table destination is treated as an idempotent success; conflicting settings are rejected.

Auth: Requires organization-admin access.

Safety: Confirm the exact organization, cluster, connector ID, topics, optional consumer group, database, and table before calling.

NameRequiredDescriptionDefault
clusterNoRawTree cluster to use for this operation.
connectorIdYesConnector ID returned by list-connectors or create-connector.
destinationYes
organizationNoRawTree organization containing the target cluster.

TDQS

A4.7/5.0
Behavior5/5

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

Adds substantial detail beyond annotations: read-modify-append workflow, idempotent success for exact matches, rejection of conflicting settings, and required organization-admin auth. The annotations already cover idempotency/safety, but the description enriches them meaningfully.

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

Conciseness5/5

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

Organized under Purpose/Behavior/Auth/Safety headers, front-loading the key action and constraints with zero filler. Each section earns its space.

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

Completeness5/5

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

For a mutation tool with nested parameters and no output schema, the description covers behavior, auth, idempotency, and safety checks needed before calling. Complete for decision-making.

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

Parameters4/5

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

Schema coverage is 75%, and the description adds operational meaning: omitting group_id triggers auto-generation of an independent consumer group, and conflicting settings are rejected. It doesn't document each field's format, but complements the schema well.

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

Purpose5/5

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

States a specific verb (add), resource type (Kafka topic-to-table destination), and scope (one destination to an existing connector). Distinguishes from create-connector and related connector siblings by emphasizing appending to an existing connector's destination list.

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

Usage Guidelines4/5

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

Clarifies the additive intent ('without changing its current destinations') and semantics (omit group_id for auto-generation; idempotency for identical destinations). It doesn't explicitly name alternative tools, but the design of the tool makes its use context clear.

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

add-organization-memberAdd Organization MemberA

Purpose: Start adding a member to a RawTree organization by sending an invitation to their email address.

Returns: Whether the invitation was created, its invite link, and its expiration time.

Behavior: This creates a pending invitation. The person becomes a member only after accepting it and will not appear in list-organization-members before acceptance. New members join with the member role; use update-organization-member after acceptance to promote them.

Auth: Requires a user credential with organization admin access. Authorization is enforced by the RawTree API.

Safety: This sends an external email and creates a pending access invitation. You MUST confirm the exact organization and email address with the user before calling this tool.

NameRequiredDescriptionDefault
emailYesEmail address to invite. Validated by the RawTree API.
organizationYesOrganization to which the person should be invited.

TDQS

A4.4/5.0
Behavior5/5

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

It adds substantial behavioral context beyond the annotations: the invitation is pending, the user joins with the member role only after accepting, an external email is sent, and admin credentials are required. The safety warning to confirm the exact organization and email before calling is especially valuable for a mutating invitation tool.

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

Conciseness4/5

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

The description is front-loaded with Purpose and organized into Purpose, Returns, Behavior, Auth, and Safety sections. It is somewhat long, but each section adds actionable information rather than repeating structured fields.

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

Completeness5/5

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

With no output schema, the description explicitly covers return values, pending-invitation behavior, role assignment, authentication requirements, and safety constraints. Nothing material is missing for an agent deciding whether and how to invoke this tool.

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

Parameters3/5

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

Schema coverage is 100% and both parameters already have descriptions, so the description need not carry the parameter burden. It adds no syntax or format details beyond what the schema provides, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb and resource: starting to add a member by sending an invitation to an email address. It clearly distinguishes this from list-organization-members and update-organization-member by explaining the pending-invitation lifecycle and post-acceptance promotion path.

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

Usage Guidelines4/5

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

It gives clear usage context, including that the person will not appear in list-organization-members until acceptance and that update-organization-member should be used afterward to promote them. It stops short of naming explicit when-not-to-use conditions or all alternative member-management tools.

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

create-api-keyCreate API KeyA

Purpose: Create a new RawTree API key for a cluster.

NOT for: User login. Use RawTree auth/CLI or the dashboard for that workflow.

Returns: The new API key value and expires_at (UTC timestamp or null for never). The API key is only shown once, so you MUST display it to the user.

Auth: Uses POST /v1/keys and requires admin permission for database API key auth.

When to use:

  • User needs a key for CI, an agent, a connector, or a script

  • User wants a read-only, write-only, read-write, or admin credential

  • User asks to rotate credentials by creating a replacement before revoking the old key

NameRequiredDescriptionDefault
nameYesHuman-readable API key name.
clusterNoRawTree cluster to use for this operation.
databaseNoOptional default database for the new key. RawTree uses the default database when omitted.
expires_atNoOptional expiration as a future RFC 3339 timestamp with a timezone. The API validates and normalizes it to UTC. Omit or use null to never expire. Expiration cannot be updated; create a replacement key to change it.
permissionNoPermission level. Prefer read_only for query-only agents and write_only for ingest-only connectors.read_write
organizationNoRawTree organization containing the target cluster.

TDQS

A4.6/5.0
Behavior5/5

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

No annotations exist, so the description carries the full burden and does: it discloses the one-time visibility of the key value, the returns shape (key value + expires_at, null meaning never), the auth requirement (POST /v1/keys, admin permission), and the immutability of expiration. These are exactly the non-obvious traits an agent needs before invoking.

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

Conciseness4/5

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

Front-loaded purpose, then exclusions, returns, auth, and use cases — every block earns its place. The heavy markdown sectioning is slightly more scaffolding than the content requires, keeping it off a 5.

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

Completeness5/5

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

With no output schema, the description supplies the return contract itself (key value shown once, expires_at semantics), plus auth and failure-relevant constraints. Enough for an agent to call and then handle the result correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters are already documented; the description only nudges on the permission enum ('prefer read_only for query-only agents'). That is additive but thin, so the baseline 3 is right.

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

Purpose5/5

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

States a specific verb and resource ('Create a new RawTree API key for a cluster') and scopes it to a cluster. The 'NOT for: User login' line plus sibling names (list-api-keys, delete-api-key) make it trivially distinguishable from adjacent tools.

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

Usage Guidelines5/5

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

Provides an explicit exclusion ('NOT for user login — use RawTree auth/CLI or the dashboard') and three concrete when-to-use scenarios (CI/agents/scripts, permission tier selection, rotation-before-revoke). Nothing about the decision 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.

create-clusterCreate ClusterA

Purpose: Provision a new RawTree dedicated cluster in an organization.

Returns: The newly created cluster, including its ID, lifecycle status, and initial resources. Provisioning continues asynchronously after the request is accepted; use get-cluster to check progress.

Behavior: The cluster starts at minimumSize and can vertically autoscale per replica up to maximumSize. The replica count remains fixed. s3Storage is optional: omit it to use RawTree-managed storage. When provided, it configures customer-owned data and backup destinations through a customer IAM role. Destination paths are optional; data and backups (each with a bucket), plus roleArn are required inside s3Storage. s3StorageAccess contains the immutable externalId and resourceTag for this cluster's S3 storage access. The API generates omitted values independently using secure UUIDs, but requires an explicit s3StorageAccess.externalId for custom S3 matching the customer IAM trust policy. The MCP client forwards optional identity values without generating them. Tag eligible customer buckets and IAM roles with rawtree.com/cluster=. Database operations reuse this saved identity automatically.

Auth: The RawTree API requires a user access token with organization admin access. Authorization is enforced by the API.

Safety: When selecting a region, first call list-regions and use the same regionId for list-cluster-sizes, verify-cluster-s3-access and create-cluster. You MUST first call list-cluster-sizes, then confirm the exact organization, region, name, replica count, minimum per-replica size, maximum per-replica size, vertical autoscaling behavior, and idle timeout with the user. If idleTimeoutMinutes is omitted, explain that the server default will apply. For one replica, warn that the cluster has no redundancy. If s3Storage is provided, first call verify-cluster-s3-access with the identical configuration and confirm the data and backup buckets, optional paths, role ARN, and External ID. Pass the same s3StorageAccess.externalId to verification and creation. Never reuse a successful verification after changing s3StorageAccess.externalId or any s3Storage field. Confirm any explicitly supplied identity values with the user; generated values are returned with the cluster.

Reliability: This operation is not idempotent. If the response is ambiguous, call list-clusters to reconcile by organization and name before retrying.

NameRequiredDescriptionDefault
nameYesURL-friendly cluster name using letters, numbers, '_' or '-'.
regionIdNoRegion ID returned by list-regions. Use the same region for sizes, S3 verification and creation. Omit for the default backend.
replicasYesNumber of cluster replicas.
s3StorageNoOptional customer-owned S3 configuration. Omit to use RawTree-managed storage. Verify the identical configuration with verify-cluster-s3-access before creation.
maximumSizeYesMaximum vertical autoscaling size returned by list-cluster-sizes. Must be at or above minimumSize in the returned catalog.
minimumSizeYesInitial and minimum vertical autoscaling size returned by list-cluster-sizes.
organizationYesOrganization in which to create the cluster.
s3StorageAccessNoCreation-only S3 storage identity overrides. Omit to let the API generate values. Custom storage requires externalId matching verification.
idleTimeoutMinutesNoMinutes of inactivity before automatically pausing. Use 0 to disable idling. Omit to use the server default.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare write/non-idempotent/non-destructive; the description goes far beyond that by disclosing asynchronous provisioning after acceptance, fixed replica count with vertical autoscaling between minimumSize and maximumSize, required admin token, non-idempotency with a retry-reconciliation protocol, and specific safety warnings (single-replica no redundancy, verification invalidation on identity change). This is exactly the behavioral context annotations cannot carry.

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

Conciseness4/5

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

The labeled sections (Purpose/Returns/Behavior/Auth/Safety/Reliability) front-load the essentials and each section carries distinct, decision-relevant content. It is long and occasionally restates schema facts (paths optional, required s3Storage children), which costs a point, but the length is justified by a 9-parameter provisioning tool with a multi-step prerequisite chain.

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

Completeness5/5

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

No output schema exists, and the description compensates by describing the return payload (ID, lifecycle status, initial resources) and the async follow-up path. Auth, safety workflow, identity generation, and failure reconciliation are all covered — an agent has everything required to invoke this correctly and safely.

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

Parameters4/5

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

Schema coverage is 100%, so the schema baseline is already satisfied; the description still adds real meaning beyond it — when to omit s3Storage, the externalId generation rule vs the requirement for custom storage, the required-vs-optional split inside s3Storage, and the resourceTag tagging convention for buckets and roles. It stops short of enumerating every field, but the added semantics are substantive.

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

Purpose5/5

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

States a specific verb and resource ("Provision a new RawTree dedicated cluster in an organization") and is clearly distinguishable from siblings like update-cluster, get-cluster and create-database. An agent knows exactly what this does without opening the schema.

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

Usage Guidelines5/5

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

Explicitly names prerequisites and sequencing (list-regions → list-cluster-sizes → verify-cluster-s3-access → create-cluster), names the alternatives for progress checking (get-cluster) and reconciliation (list-clusters), and specifies when s3Storage should be supplied vs omitted. Nothing about when to use this path 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.

create-connectorCreate ConnectorA

Purpose: Create an active Kafka connector with one or more independent topic-to-table destinations.

Behavior: Consumption starts after the runtime applies the connector. Each destination uses its own consumer group; omit group_id to let RawTree generate one. Destination tables can be created automatically when their first events arrive.

Auth: Requires organization-admin access.

Safety: Confirm the exact organization, cluster, connector name, bootstrap servers, offset policy, topics, consumer groups, and destination tables before calling. Treat SASL values as secrets and never repeat them in confirmation text or logs.

Reliability: Creation is not idempotent. If the response is ambiguous, call list-connectors and reconcile by name before retrying.

NameRequiredDescriptionDefault
nameYes
typeYes
clusterNoRawTree cluster to use for this operation.
settingsYes
destinationsYes
organizationNoRawTree organization containing the target cluster.

TDQS

A4.4/5.0
Behavior5/5

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

Adds substantial context beyond the annotations: destination tables can be auto-created on first events, each destination gets its own consumer group, admin auth is required, and creation is non-idempotent with a concrete reconciliation step (call list-connectors and match by name). This enriches the idempotentHint=false/destructiveHint=false profile rather than merely restating it.

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

Conciseness4/5

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

Front-loads Purpose and organizes Behavior/Auth/Safety/Reliability as labeled blocks, so it is scannable despite its length. A few points (e.g., the group_id behavior) overlap with schema text, which is mild redundancy.

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

Completeness5/5

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

For a complex tool with nested objects, no output schema, and low parameter-description coverage, the definition supplies the missing operational context: auth requirements, safety/secret handling, non-idempotency, and reconciliation on ambiguity. Nothing critical to correct invocation is absent.

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

Parameters3/5

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

Schema coverage is only 33%, but the description only partially compensates: it clarifies group_id omission behavior (which the schema already states), the offset policy, and that SASL values are secrets, while leaving name, type, destinations structure, and most settings subfields unexplained. Marginal value over the schema given the coverage gap.

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

Purpose5/5

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

States a specific verb and resource ('Create an active Kafka connector') plus scope ('one or more independent topic-to-table destinations'), which distinguishes it from siblings like add-connector-destination and set-connector-status. An agent can identify the operation without opening the schema.

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

Usage Guidelines4/5

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

Gives clear context on when creation applies and its downstream effect ('Consumption starts after the runtime applies the connector'), plus preconditions like org-admin access. It never explicitly names an alternative sibling (e.g., add-connector-destination) or says when-not to use it, so it stops short of full routing guidance.

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

create-databaseCreate DatabaseA

Purpose: Create a database in a RawTree organization and cluster.

Returns: The created database and organization context.

Behavior: s3Storage is optional. Omit it to use the cluster's default storage. When provided, it configures customer-owned database storage that all tables in the database inherit. Destination paths are optional; data and backups (each with a bucket), plus roleArn are required inside s3Storage. The API reuses the cluster's saved External ID; do not supply an identity override.

Safety: You MUST first call list-databases and confirm the exact organization, cluster, database name, and optional S3 configuration with the user. If s3Storage is provided, first call verify-database-s3-access with the identical configuration. Never reuse a successful verification after changing any s3Storage field.

Auth: Organization-admin access is required. Authorization is enforced by the RawTree API.

Reliability: This operation is not idempotent. If the response is ambiguous, call list-databases to reconcile by organization, cluster, and database name before retrying.

NameRequiredDescriptionDefault
nameYesName of the database to create.
clusterNoRawTree cluster to use for this operation.
s3StorageNoOptional customer-owned S3 configuration. Omit to use the cluster's default storage.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/destructive, but the description goes well beyond them: org-admin auth requirement, non-idempotency, the reconciliation procedure on ambiguous responses, the External ID reuse rule and identity-override prohibition, and the inheritance behavior of s3Storage on all tables. This is substantive context not derivable from structured fields.

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

Conciseness4/5

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

Bold-labeled sections (Purpose/Returns/Behavior/Safety/Auth/Reliability) make it skimmable and front-loaded, with no filler sentences. It is on the longer side, and the Returns line is largely superseded by the schema, but every other sentence carries decision-relevant information.

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

Completeness5/5

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

For a non-idempotent mutation with a nested s3Storage object and no output schema, the definition still covers auth, failure recovery, optionality, and the verify-then-create prerequisite. Nothing an agent needs in order to call it safely is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description still adds meaning by explaining that s3Storage is optional, defaults to cluster storage, and that its contents are inherited by all tables in the database, plus which inner fields are required. It stops short of describing path/prefix semantics, which the schema already handles.

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

Purpose5/5

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

States a specific verb+resource ('Create a database') scoped to an organization and cluster, which cleanly separates it from create-cluster, create-table, and delete-database among the siblings. An agent needs no further reading to know what this tool produces.

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

Usage Guidelines5/5

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

Gives explicit preconditions and ordering: call list-databases and confirm org/cluster/name with the user first, and call verify-database-s3-access with an identical configuration before supplying s3Storage. It also states an exclusion — never reuse a verification after changing any s3Storage field — which is exactly the disambiguation an agent needs.

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

create-federation-issuerCreate Federation IssuerA
Destructive

Create an organization issuer with discovery or an explicit JWKS URL. Saving does not fetch keys. Returns an issuer object with its full configuration, id, organization_id, created_at and updated_at. Requires an organization admin using a user session or OAuth with full_access. API keys and workload tokens cannot manage federation configuration.

NameRequiredDescriptionDefault
nameYes
jwks_urlNoRequired for explicit_url; omit or null for discovery.
issuer_urlYesExact expected token issuer; do not normalize it.
descriptionNo
jwks_sourceNodiscovery
organizationYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds genuinely non-obvious context: 'Saving does not fetch keys' (a side effect an agent would otherwise assume), the auth modes required, and the shape of the returned issuer object. Remaining gaps are duplicate-name behavior and whether issuer_url is validated against live discovery, which the agent must discover by trial.

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

Conciseness5/5

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

Four short sentences in a deliberate order: what it creates, the key non-obvious side effect, the return value, then the authorization gate. Nothing is repeated and nothing could be dropped without losing information the agent needs.

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

Completeness4/5

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

For a six-parameter creation tool with no output schema, the description covers the important bases: creation modes, the no-key-fetch caveat, the returned fields, and the auth constraint. It stops short of describing what happens on a duplicate issuer name or whether jwks_url is verified at save time, which matters for an operation annotated as destructive and non-idempotent.

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

Parameters3/5

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

Schema coverage is only 33%, and the description compensates only partially: it explains the discovery-vs-explicit-JWKS dichotomy that governs jwks_url/jwks_source, but leaves 'organization' ambiguous (ID vs. slug) and says nothing about the 'name' slug pattern or the free-form 'description'. The mode relationship is the useful addition beyond the schema's own parameter descriptions.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Create an organization issuer') and immediately scopes it to the two supported modes (discovery vs. explicit JWKS URL). The verb alone separates it from the get/list/update/delete-federation-issuer siblings, and the 'organization issuer' phrasing separates it from create-federation-rule.

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

Usage Guidelines4/5

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

It states the precondition clearly (organization admin via user session or OAuth with full_access) and adds an explicit exclusion ('API keys and workload tokens cannot manage federation configuration'), which tells the agent when the call will fail. What it does not do is route between this and its siblings, e.g. that update-federation-issuer should be used for existing issuers.

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

create-federation-ruleCreate Federation RuleA
Destructive

Create a cluster rule mapping an external identity to your user or a service account. An enabled rule permits authentication and grants the configured access. Returns a rule object with its full configuration, id, organization_id, cluster_id, created_at and updated_at. Requires an organization admin using a user session or OAuth with full_access. API keys and workload tokens cannot manage federation configuration.

NameRequiredDescriptionDefault
nameYes
clusterYes
enabledYesWhether this rule permits workload token exchange.
databaseYesDefault database for this rule; not inherited from the MCP connection.
issuer_idYes
permissionNo
descriptionNo
organizationYes
principal_idYesYour own user ID or a service account ID in this organization.
database_rolesNo
principal_typeYes
claim_conditionsYes
allowed_audiencesYes

TDQS

A3.7/5.0
Behavior5/5

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

Goes well beyond the annotations by naming the security consequence (the rule grants access and permits authentication), the exact return payload and its fields, and concrete authorization constraints: org admin, user session or OAuth with full_access, and an explicit exclusion for API keys and workload tokens. That exclusion is precisely the kind of failure mode an agent cannot derive from readOnlyHint/destructiveHint/idempotentHint.

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

Conciseness5/5

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

Four short sentences ordered by importance: what it does, its effect, what it returns, then who may call it. No filler and no repetition of schema constraints.

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

Completeness3/5

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

Auth requirements and return shape are covered well and the absence of an output schema is mitigated by the explicit return description. However, for a 13-parameter privileged-creation tool with a nested claim_conditions object, the description gives no guidance on how to obtain an issuer_id or principal_id, or what claim_conditions keys are valid, leaving required-parameter construction under-specified.

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

Parameters2/5

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

Schema description coverage is only 23% across 13 parameters (10 required), and the description supplies almost nothing to compensate. The phrase about mapping an external identity loosely gestures at issuer_id/claim_conditions/principal_type, but claim_conditions structure, allowed_audiences, database_roles, permission, name pattern, and the non-inherited database default are all left undocumented.

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

Purpose4/5

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

States a specific verb and resource ("Create a cluster rule") plus the core effect ("mapping an external identity to your user or a service account"), which is far more informative than the title. It stops short of explicitly contrasting itself with update-federation-rule or create-federation-issuer, so an agent must infer the boundary from the name alone.

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

Usage Guidelines3/5

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

Usage is implied by "An enabled rule permits authentication and grants the configured access," which hints this is the setup step before token exchange works. There is no explicit when-to-use/when-not guidance and no pointer to update-federation-rule for modifying an existing rule, so routing between the federation CRUD siblings 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.

create-service-accountCreate Service AccountA

Create an organization service account with an immutable, unique name. Returns its ID, organization ID, name, description, and stored role. Requires an organization admin using a user session or OAuth; API keys cannot manage service accounts. This creates an identity without credentials. API key permissions are configured separately. An organization can have up to 100 service accounts.

NameRequiredDescriptionDefault
nameYesImmutable name: lowercase letters and digits separated by single hyphens.
roleNoStored organization role; API key permissions are configured separately.member
descriptionNoOptional description, at most 2000 UTF-8 bytes.
organizationYesOrganization name from list-organizations.

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false), the description discloses authorization requirements, an explicit auth-method exclusion, the fact that no credentials are minted, the separation of role from API key permissions, and a hard quota of 100 service accounts. These are exactly the behavioral traits an agent cannot infer from annotations or schema.

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

Conciseness4/5

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

Sentences are dense and front-loaded, leading with the action and constraint before auth and quota details. The one small redundancy is restating that API key permissions are configured separately, which the role parameter description already says.

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

Completeness5/5

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

For a non-idempotent mutation with no output schema, the description still states the returned fields, the auth model, the credential-free nature of the result, and the account quota. An agent has everything needed to decide whether to call it and what to expect.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters (name pattern, role enum, description length, organization source) are already fully documented in the schema. The description echoes the immutability of the name and the stored-role distinction but adds no new syntax or format meaning, so the baseline of 3 applies.

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

Purpose4/5

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

The first sentence gives a specific verb and resource ("Create an organization service account") plus a key constraint ("immutable, unique name"). It also implies the distinction from create-api-key by saying "This creates an identity without credentials," 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.

Usage Guidelines4/5

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

Clear preconditions are given: an organization admin, a user session or OAuth, and the exclusion of API keys as a management path. It does not explicitly say when to prefer create-api-key over this tool, but "API key permissions are configured separately" points the agent in that direction.

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

create-tableCreate TableA
Idempotent

Purpose: Create an empty RawTree table in a database.

Returns: The database and table names, the resolved storage destination, and the table's sorting key.

Behavior: The table uses the database's storage when the database configures one, and the cluster's default storage otherwise. Storage is configured on the cluster or the database, never per table.

Sorting key: sortingKey is an optional string of comma-separated SQL expressions. Omit it and the table picks a sorting key per part from the ingested data, which suits exploratory tables. Set it when the query pattern is known, listing expressions in key order, lowest cardinality first. Use update-table to change it later.

Auth: Requires organization admin access. Authorization is enforced by the RawTree API.

Reliability: If the response is ambiguous, call list-tables to reconcile by database and table name before retrying.

NameRequiredDescriptionDefault
nameYesName of the table to create.
clusterNoRawTree cluster to use for this operation.
databaseNoOptional RawTree database override. RawTree uses the default database when omitted.
sortingKeyNoOptional comma-separated SQL sorting expressions in key order. Omit it to let the table pick a key per part from the ingested data.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false) by disclosing storage resolution (database storage if configured, otherwise cluster default, never per-table), stating that the auth requirement is organization admin, and giving explicit ambiguous-response recovery via list-tables. That is exactly the extra context annotations cannot carry.

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

Conciseness5/5

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

Uses front-loaded bold headers (Purpose, Returns, Behavior, Sorting key, Auth, Reliability) so an agent can scan to the relevant section. Each section carries information an agent needs when calling the tool, including the Returns section, which compensates for the missing output schema, and there is no filler.

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

Completeness5/5

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

For a 5-parameter creation tool with no output schema, the definition covers what is created, what is returned, how storage is resolved, how the sorting key is chosen and later changed, the auth level required, and how to recover from an ambiguous response. Nothing material is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning to sortingKey: the comma-separated SQL expression format, ordering with lowest cardinality first, and the omit-vs-set trade-off. It also clarifies that the storage relationship is between the cluster and the database, not per table. It adds nothing beyond the schema for name, organization, and cluster.

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

Purpose5/5

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

States a specific verb and resource with scope: 'Create an empty RawTree table in a database.' That is unambiguous against siblings like create-database, create-cluster, and create-connector, which target different resources.

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

Usage Guidelines4/5

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

Gives conditional guidance for the optional sortingKey (omit for exploratory tables, set when the query pattern is known) and routes to a named sibling: 'Use update-table to change it later.' It also gives a recovery path via list-tables. It does not say when not to create a table (for example, when one already exists), so it falls short of a full 5.

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

create-workflowCreate WorkflowA
Destructive

Create a scheduled SQL workflow. Requires name and query (database and sql). Defaults: schedule={ cron: "* * * * * *", enabled: true }, sinks=[]. An enabled schedule starts recurring SQL execution and sink delivery; use schedule.enabled=false to create it paused, or schedule=null for manual-only. SQL may write rows through INSERT SELECT. Creation is not idempotent: reconcile an uncertain result with list-workflows before retrying. Returns the workflow object: id, name, description, query, schedule, revision, created_at, updated_at, and sinks. The query object contains database and sql. schedule is null for manual-only workflows; otherwise it contains cron, enabled, and next_run_at (null while paused). Each sink has id, type, and settings. HTTP settings contain url (null when unreadable), url_configured, and header_names; header values are never returned. Table settings contain database and table. Slack settings contain integration_id, channel_id, and channel_name, resolved from Slack when the sink was saved. Requires an admin API key bound to the selected organization and cluster, or OAuth. Organization members may read; organization admins may create, update, or delete. Workflows execute with organization credentials and continue after the creating key is revoked or expires.

NameRequiredDescriptionDefault
nameYes
queryYes
sinksNoUp to five sinks. Omit for none. New HTTP sinks require settings.url. Slack sinks post a summary and a preview of the result rows through an organization Slack integration from list-integrations. Give the channel as channel_name (such as "#alerts"), or as channel_id; search channels with list-slack-channels and name. A name is resolved to its channel ID on every save, and only the ID is stored. Each Slack sink must use a distinct integration and channel. All sink IDs are assigned by the API.
clusterYesRawTree cluster to use for this operation.
scheduleNoOmit for the default schedule, "* * * * * *" (every second), enabled. null creates a manual-only workflow. enabled defaults to true.
descriptionNoFree-form text. The API trims it and stores blank values as null.
organizationYesRawTree organization containing the target cluster.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already flag non-idempotent and destructive, but the description goes well beyond them: it explains that an enabled schedule starts recurring execution and sink delivery, that workflows run with organization credentials and survive revocation of the creating key, and that write capability comes from INSERT SELECT in the SQL. It also states the authorization model (admin API key bound to org and cluster, or OAuth; members read, admins write), which is behavior an agent cannot infer from the annotations.

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

Conciseness4/5

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

Front-loaded with purpose, defaults, and the non-idempotency warning before drifting into detail. The long trailing block enumerating returned fields is verbose, but it is the only place that information exists since there is no output schema, so it largely earns its space.

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

Completeness5/5

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

For a 7-parameter nested-object mutation with no output schema, the description covers side effects, defaults, auth prerequisites, permission boundaries, non-idempotency recovery, and the full return shape including the security-relevant note that header values and some URLs are never returned. An agent has everything needed to call this correctly and safely.

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

Parameters4/5

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

Schema coverage is 71%, so the schema already documents most parameters; the description still adds meaning by stating the concrete defaults (cron "* * * * * *" enabled, sinks=[]), the semantics of schedule=null, and the rule that each Slack sink must use a distinct integration and channel with IDs assigned by the API. Those constraints appear nowhere in the schema.

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

Purpose5/5

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

Opens with a specific verb and resource: "Create a scheduled SQL workflow." That is unambiguously distinguishable from update-workflow, get-workflow, list-workflows, and delete-workflow in the sibling list, and the rest of the opening sentence scope (scheduled SQL execution) narrows it further.

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

Usage Guidelines4/5

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

Gives concrete selection context: use schedule.enabled=false to create paused, schedule=null for manual-only, and reconcile an uncertain result with list-workflows before retrying. It also names list-integrations and list-slack-channels as prerequisite lookups. It never explicitly says when to choose update-workflow instead of create, which keeps it below a 5.

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

delete-api-keyDelete API KeyA
Destructive

Purpose: Permanently revoke and delete a RawTree API key by UUID or full API key value.

NOT for: Deleting a table, database, or user session.

Returns: Deletion confirmation.

Safety: You MUST list or identify the key first, ask the user to confirm the exact key name or ID, and warn that services using it will lose access. This action cannot be undone.

NameRequiredDescriptionDefault
clusterNoRawTree cluster to use for this operation.
idOrApiKeyYesAPI key UUID or full rt_ API key value to delete.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description goes further by disclosing irreversibility ('This action cannot be undone'), the downstream consequence (services using the key lose access), the accepted key formats, and a required confirmation protocol. This is exactly the extra context annotations cannot carry.

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

Conciseness4/5

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

Bold section labels (Purpose/NOT for/Returns/Safety) front-load the essential facts and make scanning easy, with each block contributing distinct information. The formatting is slightly heavier than a two-sentence description would need, but nothing is filler.

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

Completeness5/5

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

For a destructive, no-output-schema tool, the description covers return value ('Deletion confirmation'), safety profile, identifier formats, and scope exclusions. An agent has everything needed to invoke it correctly and responsibly.

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

Parameters3/5

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

Schema description coverage is 100%, so cluster, organization, and idOrApiKey are already documented. The description restates that the key may be given as a UUID or a full rt_ value, which mirrors the schema rather than adding new semantics; baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource ('Permanently revoke and delete a RawTree API key') and names the accepted identifier forms (UUID or full rt_ key value). The 'NOT for' line explicitly excludes sibling operations like delete-table, delete-database, and session deletion, so the agent can disambiguate from the many delete/list siblings 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.

Usage Guidelines5/5

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

Explicitly says when not to use it (tables, databases, sessions) and prescribes a mandatory pre-flight workflow: list/identify the key first, obtain user confirmation of the exact name or ID, and warn about access loss. There is no reliance on inference.

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

delete-databaseDelete DatabaseA
Destructive

Purpose: Permanently delete a RawTree database and all data it contains.

Returns: RawTree's deletion result, usually { "deleted": true }.

Safety: You MUST list databases first and ask the user to confirm the exact organization, cluster, and database name before calling this tool. This action cannot be undone.

Auth: Authorization is enforced by the RawTree API.

NameRequiredDescriptionDefault
clusterNoRawTree cluster to use for this operation.
databaseYesDatabase name to delete.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, it discloses that deletion is permanent, removes all contained data, cannot be undone, returns a deletion result, and is governed by RawTree API authorization. This is rich behavioral context for a destructive operation.

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

Conciseness5/5

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

The description is structured under Purpose, Returns, Safety, and Auth headings. Each section is short, front-loads the purpose, and every sentence adds actionable information.

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

Completeness5/5

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

For a destructive tool with no output schema, the description covers the return shape, irreversibility, authorization, and required confirmation steps. An agent has enough context to call it correctly and safely.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents the cluster, database, and organization parameters. The description reinforces that all three values must be confirmed exactly but adds no syntax or format details beyond what the schema provides.

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

Purpose5/5

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

The description states a specific verb and resource: 'Permanently delete a RawTree database and all data it contains.' It clearly distinguishes this destructive database operation from sibling tools like create-database, list-databases, and delete-table.

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

Usage Guidelines5/5

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

It gives an explicit mandatory workflow: list databases first and ask the user to confirm the exact organization, cluster, and database name before calling. This directly addresses when and under what precautions to use the tool.

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

delete-federation-issuerDelete Federation IssuerA
DestructiveIdempotent

Delete the issuer. Referencing rules must be deleted first; otherwise the API returns 409. Returns null on success. Requires an organization admin using a user session or OAuth with full_access. API keys and workload tokens cannot manage federation configuration.

NameRequiredDescriptionDefault
idYes
organizationYes

TDQS

A4/5.0
Behavior5/5

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

Beyond the annotations (destructive, idempotent), the description discloses the 409 conflict condition, the null return on success, the required role (organization admin), and which credential types are rejected (API keys, workload tokens). These are operative facts an agent cannot get from the structured fields.

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

Conciseness5/5

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

Four tight sentences ordered action → precondition → return → authorization, with zero filler. Every sentence conveys a distinct operational fact and the most decision-relevant content is front-loaded.

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

Completeness4/5

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

For a destructive, two-parameter tool with no output schema, the description covers error behavior, return value, and auth constraints well. The remaining gap is parameter meaning, which is undocumented in both the schema and the description.

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

Parameters2/5

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

Schema description coverage is 0% for two required parameters, so the description carries the full burden and fails to compensate. It never explains what 'id' refers to (issuer UUID) or what 'organization' expects (slug vs. identifier), leaving both parameters semantically opaque.

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

Purpose4/5

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

The description opens with a specific verb and resource ("Delete the issuer"), which is unambiguous against siblings like create-federation-issuer and update-federation-issuer. It doesn't explicitly name the related sibling delete-federation-rule as the alternative, 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.

Usage Guidelines4/5

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

It gives a concrete precondition for use: referencing rules must be deleted first or the API returns 409, which strongly implies delete-federation-rule is the prior step. It also states the auth contexts in which the call is valid. It does not explicitly say when not to use this tool versus update/get alternatives.

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

delete-federation-ruleDelete Federation RuleA
DestructiveIdempotent

Delete the rule and revoke workload access through it. Returns null on success. Requires an organization admin using a user session or OAuth with full_access. API keys and workload tokens cannot manage federation configuration.

NameRequiredDescriptionDefault
idYes
clusterYes
organizationYes

TDQS

A4/5.0
Behavior5/5

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

Goes beyond the destructiveHint/idempotentHint annotations by disclosing the actual side effect (workload access through the rule is revoked), the return contract ('Returns null on success'), and the authentication requirements with explicit credential exclusions. These are exactly the operational details annotations cannot express.

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

Conciseness5/5

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

Three tight sentences, each carrying distinct load: effect, return value, then authorization constraints. The destructive consequence is front-loaded, so an agent reading only the first clause still knows this is a destructive operation.

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

Completeness4/5

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

For a simple destructive delete with no output schema, the description covers effect, return value, and auth, which is most of what an agent needs. The remaining gap is parameter-level clarity, since three required undocumented params are never explained and error behavior for a missing rule is unstated.

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

Parameters2/5

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

All three parameters (organization, cluster, id) have 0% schema description coverage, and the description never mentions any of them. It does not clarify that id is a rule UUID, whether organization/cluster are names or identifiers, or what happens if the id does not match an existing rule in that scope.

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

Purpose4/5

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

States a specific verb and resource ('Delete the rule') and adds the consequence ('revoke workload access through it'), which tells an agent exactly what operation this is. It relies on the tool name to establish that 'the rule' is a federation rule, and it does not explicitly contrast with update-federation-rule, but the verb alone separates it from the other federation siblings.

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

Usage Guidelines4/5

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

Gives concrete preconditions and exclusions: organization admin, user session or OAuth with full_access, and explicitly rules out API keys and workload tokens. What's missing is guidance on alternatives — e.g., whether update-federation-rule should be preferred when the goal is only to suspend access temporarily rather than revoke it.

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

delete-saved-queryDelete Saved QueryA
DestructiveIdempotent

Delete a saved query you own by its id. Requires a user session or OAuth; API keys are not supported. Deletes only the saved definition and does not execute SQL or delete underlying data. Returns { id, deleted: true } after successful deletion.

NameRequiredDescriptionDefault
idYesID of the saved query to delete.
clusterNoRawTree cluster to use for this operation.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.2/5.0
Behavior4/5

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

With destructiveHint=true and idempotentHint=true already declared, the description still adds real value: the exact destruction boundary (definition only, no data), the authentication constraint (API keys unsupported), and the success return shape. What it omits is the behavior on a missing or non-owned id, which matters given the idempotent hint.

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

Conciseness5/5

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

Four short sentences, each carrying distinct information: action, auth requirement, blast radius, and return value. The action and scope are front-loaded with no filler.

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

Completeness4/5

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

Covers auth, destruction scope, and the return value even though no output schema exists. The one gap is failure semantics for a nonexistent or unowned query id, which an agent needs given the idempotency declaration.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters are already documented, establishing a baseline of 3. The description adds only the ownership qualifier on id and says nothing about the cluster/organization parameters beyond what the schema states.

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

Purpose5/5

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

States a specific verb and resource ('Delete a saved query') plus an ownership scope ('you own') and the identifier basis ('by its id'). This clearly separates it from sibling deletions such as delete-table, delete-database, delete-workflow, and delete-api-key.

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

Usage Guidelines4/5

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

The description sets the boundary 'Deletes only the saved definition and does not execute SQL or delete underlying data,' which effectively tells the agent when this is the wrong tool (data/SQL deletion). It also states the auth context (session/OAuth, not API keys). It does not point at list-saved-queries as the way to obtain an id, so it stops short of full alternative routing.

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

delete-tableDelete TableA
Destructive

Purpose: Permanently delete a RawTree table and its data.

NOT for: Clearing a query result or undoing a single insert. This deletes the whole table.

Returns: Deletion confirmation.

Safety: You MUST ask the user to confirm the exact table name before calling this tool. This action requires an admin key and cannot be undone.

NameRequiredDescriptionDefault
tableYesTable name to delete.
clusterNoRawTree cluster to use for this operation.
databaseNoOptional RawTree database override. RawTree uses the default database when omitted.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the destructiveHint=true annotation, the description adds critical operator context: an admin key is required, the action cannot be undone, and the agent MUST confirm the exact table name with the user first. These are meaningful behavioral disclosures not present in the annotations or schema.

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

Conciseness5/5

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

Bold headers (Purpose/NOT for/Returns/Safety) front-load the identity, the exclusions, and the safety constraint in four tight lines with no filler. Every section carries actionable content.

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

Completeness5/5

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

For a destructive single-target operation with no output schema, the definition covers purpose, disambiguation, return confirmation, auth requirement, irreversibility, and the pre-call confirmation step. Nothing an agent needs to invoke it safely is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters are already documented. The description only reinforces the 'exact table name' requirement already implied by the schema, adding no new syntax or format detail, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Permanently delete a RawTree table and its data'), clearly distinguishing it from siblings like create-table, delete-database, and run-query. The scope ('the whole table') makes the target unambiguous.

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

Usage Guidelines5/5

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

The 'NOT for' section gives explicit exclusions ('Clearing a query result or undoing a single insert'), telling the agent when this tool is the wrong choice. This is exactly the when-not guidance the dimension rewards.

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

delete-workflowDelete WorkflowA
DestructiveIdempotent

Delete a workflow definition and its schedule, stopping future evaluations. Does not undo previous SQL writes or completed deliveries. Returns { id, deleted: true } only after the API confirms deletion. Requires an admin API key bound to the selected organization and cluster, or OAuth. Organization members may read; organization admins may create, update, or delete. Workflows execute with organization credentials and continue after the creating key is revoked or expires.

NameRequiredDescriptionDefault
idYesWorkflow ID returned by list-workflows, get-workflow, or create-workflow.
clusterYesRawTree cluster to use for this operation.
organizationYesRawTree organization containing the target cluster.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing non-reversibility scope ("does not undo previous SQL writes or completed deliveries"), the exact success shape ({ id, deleted: true }) and the fact it is only returned after API confirmation, plus credential binding and workflow execution semantics. This is the kind of context annotations cannot carry.

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

Conciseness4/5

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

Purpose and irreversibility caveat are front-loaded, and the return-value contract is placed well. The final sentence about workflows running under organization credentials and surviving key revocation is tangential to performing a delete, so a sentence does not fully earn its place.

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

Completeness5/5

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

With no output schema present, the description supplies the return contract itself, along with side effects, authorization prerequisites, and scope limits. For a three-parameter destructive tool this covers everything an agent needs before invoking.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents id, cluster, and organization; baseline 3 applies. The description adds a small amount by implying why organization and cluster are required (the admin key must be bound to them), but it adds no syntax, format, or ID-sourcing detail beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ("Delete a workflow definition and its schedule") plus the operational consequence ("stopping future evaluations"), which cleanly separates it from delete-saved-query, delete-table, and the sibling workflow tools (get-workflow, update-workflow). An agent needs no schema lookups to know what this removes.

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

Usage Guidelines4/5

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

Gives clear authorization context (admin API key bound to the org/cluster, or OAuth) and the role model, which tells the agent when the call is permitted. It does not explicitly say what to use instead when the intent is to temporarily stop evaluations (e.g., update-workflow) rather than remove the definition, so there is no exclusion guidance.

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

describe-tableDescribe TableA

Purpose: Inspect a RawTree table's columns, row count, byte count, sorting key, database, and organization.

NOT for: Sampling actual row values. Use run-query for SELECT queries.

Returns: Table metadata and columns. sorting_key is a comma-separated SQL expression string, empty when the table picks a key per part from the ingested data.

When to use:

  • You need to know available fields before writing SQL

  • A query fails because a column may not exist

  • You just inserted data and want to inspect the dynamic schema

  • You want the current sorting key before changing it with update-table

NameRequiredDescriptionDefault
tableYesTable name to describe.
clusterNoRawTree cluster to use for this operation.
databaseNoOptional RawTree database override. RawTree uses the default database when omitted.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden itself and does disclose the return shape, including the non-obvious semantics of sorting_key (comma-separated SQL expression, empty when keyed per part from ingested data). It does not state side-effect freedom explicitly, nor permission/auth requirements or behavior when the table doesn't exist, so it stops short of full disclosure.

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

Conciseness5/5

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

Bold-labeled sections front-load purpose, exclusion, and return shape before the usage list, and each line contributes distinct information. No filler sentences; the length is proportionate to a four-parameter metadata tool.

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

Completeness4/5

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

With no output schema and no annotations, the description covers purpose, anti-purpose, return contents, and trigger scenarios — enough to call it correctly. It leaves out error behavior (nonexistent table, dynamic-schema edge cases) and any auth/permission notes, which keeps it short of a 5.

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

Parameters3/5

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

Schema description coverage is 100% with four well-documented parameters, so the schema already does the work and baseline 3 applies. The description only glosses the table name implicitly and does not explain cluster/database/organization precedence, which is where added value would have been possible.

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

Purpose5/5

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

States a specific verb ("Inspect") against a specific resource (a table's columns, row count, byte count, sorting key, database, organization), and explicitly excludes the closest sibling behavior by naming run-query for row sampling. An agent can distinguish this from run-query, list-tables, update-table, and create-table without opening any schema.

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

Usage Guidelines5/5

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

Provides an explicit "NOT for" exclusion with the alternative (run-query for SELECT), plus four concrete trigger conditions (before writing SQL, after a column-not-found failure, after insert to inspect dynamic schema, before changing the sorting key). Both the when and the when-not are present, which is the top of the scale.

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

get-clusterGet ClusterA
Read-only

Purpose: Get one RawTree dedicated cluster and its current lifecycle status.

Returns: The cluster ID, name, creation time, lifecycle status, resources, whether it can be paused or resumed, optional s3_storage metadata for customer-owned default storage, and s3_storage_access containing external_id and resource_tag (null for older clusters without saved identity). s3_storage exposes data and backups, each with bucket and path. An empty path means the bucket root. Role ARNs and secret credentials are never returned.

Auth: The RawTree API requires a user access token and organization membership. Authorization is enforced by the API.

When to use:

  • User asks for the current status of one cluster

  • You need to check progress after pausing or resuming a cluster

  • You already have a cluster ID and do not need the full organization cluster list

NameRequiredDescriptionDefault
clusterIdYesDedicated cluster ID returned by list-clusters.
organizationYesOrganization containing the cluster.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds real value beyond that: the auth requirement (user access token plus organization membership), the guarantee that role ARNs and secrets are never returned, and the null semantics for older clusters lacking saved identity. It does not cover error behavior, such as what happens when the cluster ID is unknown or outside the organization.

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

Conciseness4/5

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

Bold section headers front-load purpose, returns, auth, and usage in a scannable order with no filler sentences. The Returns paragraph is dense and long, but each clause describes a distinct field the caller must interpret.

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

Completeness5/5

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

No output schema exists, so the description carries the return-shape burden and does so thoroughly, including the nested s3_storage data/backups structure and the empty-path-means-bucket-root convention. Auth preconditions and the single-cluster scope are both stated, leaving nothing an agent needs before calling.

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

Parameters3/5

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

Schema description coverage is 100%, with both parameters documented in-schema (clusterId sourced from list-clusters, organization as the containing scope). The description adds no further syntax or format detail, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ("Get one RawTree dedicated cluster and its current lifecycle status") and implicitly contrasts with the bulk listing operation. An agent can distinguish it from list-clusters and update-cluster without opening any schema.

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

Usage Guidelines4/5

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

A dedicated "When to use" block gives three concrete triggering conditions, including the post-pause/resume status check. The last bullet routes the agent away from the full-list alternative, though it describes that sibling by behavior rather than naming list-clusters.

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

get-connectorGet ConnectorA
Read-only

Purpose: Get one managed connector and its complete public configuration.

Returns: The connector status, sanitized connection settings, destinations with topics and consumer groups, revision, and timestamps. Stored credentials are never returned.

When to use: Inspect the latest connector before adding a destination or changing its status.

NameRequiredDescriptionDefault
clusterNoRawTree cluster to use for this operation.
connectorIdYesConnector ID returned by list-connectors or create-connector.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that: it enumerates what is returned (status, sanitized settings, destinations/topics/consumer groups, revision, timestamps) and explicitly states credentials are never returned, which is a useful security-relevant guarantee.

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

Conciseness4/5

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

Bold-labeled Purpose/Returns/When-to-use sections make it front-loaded and scannable, with no filler. Slightly header-heavy for three short blocks, but every sentence carries information.

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

Completeness4/5

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

With no output schema, the description correctly compensates by describing the return payload and the credential-exclusion behavior. Combined with full schema coverage and read-only annotations, an agent has enough to call it correctly; only deeper pagination/error semantics are unstated.

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

Parameters3/5

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

Schema description coverage is 100%, so connectorId, cluster, and organization are all documented in the schema itself (connectorId even notes it comes from list-connectors/create-connector). The prose adds no further parameter detail, making the baseline 3 appropriate.

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

Purpose5/5

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

States a specific verb and resource ('Get one managed connector and its complete public configuration'). The scope word 'one' plus 'complete public configuration' implicitly separates it from list-connectors (many) and get-connector-metrics (metrics only), so an agent can route correctly.

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

Usage Guidelines4/5

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

The 'When to use' section gives a concrete trigger: inspect the latest connector before adding a destination or changing its status. This ties it to the add-connector-destination and set-connector-status workflows, though it does not explicitly name those siblings as alternatives.

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

get-connector-metricsGet Connector MetricsA
Read-only

Purpose: Read current health and runtime counters for one connector and each destination.

Returns: Runtime status, observation time, Kafka consumer lag, buffered events, consumed and delivered event totals, errors, discarded events, source lag, and HTTP latency counters.

Interpretation: Event values are cumulative counters. Take two samples and divide their difference by elapsed time to calculate rates. A status of applying or unavailable includes an explanatory message.

NameRequiredDescriptionDefault
clusterNoRawTree cluster to use for this operation.
connectorIdYesConnector ID returned by list-connectors or create-connector.
organizationNoRawTree organization containing the target cluster.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description goes further by disclosing that counters are cumulative and must be sampled twice to derive rates, and that applying/unavailable statuses carry an explanatory message. That is genuinely useful operational context beyond the structured fields, though permissions or required connector state are not mentioned.

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

Conciseness4/5

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

The Purpose/Returns/Interpretation structure is front-loaded and each block carries distinct information; the Returns enumeration is long but earns its place because no output schema exists. Slightly verbose but no filler sentences.

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

Completeness4/5

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

With no output schema, the description compensates by enumerating returned fields and explaining how to interpret cumulative counters and status messages. It stops short of covering prerequisites (e.g., whether the connector must be running) or auth needs, but is otherwise sufficient for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents cluster, connectorId (with provenance from list-connectors/create-connector), and organization. The description adds no syntax or format detail for these parameters, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Read current health and runtime counters') plus scope ('for one connector and each destination'), which cleanly separates it from sibling get-connector (configuration) and list-connectors (enumeration). An agent can pick this tool without opening any schema.

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

Usage Guidelines3/5

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

The scope wording implies when the tool is appropriate (runtime health of a single connector), but there is no explicit when-to-use/when-not statement and no named alternative for related needs such as get-connector or list-logs. Usage is inferable rather than stated.

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

get-federation-issuerGet Federation IssuerA
Read-onlyIdempotent

Read the saved configuration. Returns an issuer object with its full configuration, id, organization_id, created_at and updated_at. Requires an organization admin using a user session or OAuth with full_access. API keys and workload tokens cannot manage federation configuration.

NameRequiredDescriptionDefault
idYes
organizationYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description adds substantial operational context: it requires an organization admin, a user session or OAuth with full_access, and explicitly excludes API keys and workload tokens. That access constraint is exactly the kind of behavior an agent cannot get from annotations.

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

Conciseness4/5

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

Three sentences, front-loaded with purpose and return shape, then the access constraint. No filler or repetition; the only mild looseness is that the return-field sentence could be trimmed since there is no output schema to complement it.

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

Completeness4/5

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

With no output schema, the description usefully enumerates the returned object's fields, and it covers the authentication prerequisites. The remaining gap is input semantics — for a two-parameter tool at 0% schema coverage, that missing piece keeps it from being fully self-sufficient.

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

Parameters2/5

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

Schema description coverage is 0% for two required parameters, so the description must carry the burden — and it does not. It never explains what 'organization' expects (slug, name, or ID) or that 'id' is the issuer UUID, leaving both inputs effectively undefined beyond their JSON types.

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

Purpose4/5

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

The description names a specific action ('Read the saved configuration') and enumerates the returned fields (id, organization_id, created_at, updated_at), which makes clear this fetches a single federation issuer. It stops short of explicitly contrasting with list-federation-issuers, but the singular resource plus 'get-' naming makes the distinction workable.

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

Usage Guidelines3/5

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

Usage is only implied: 'read the saved configuration' suggests inspecting an existing issuer rather than listing or mutating. There is no explicit when-to-use/when-not statement or named alternative (e.g., 'use list-federation-issuers to enumerate'), so an agent must infer the selection between get- and list- siblings.

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

get-federation-ruleGet Federation RuleB
Read-onlyIdempotent

Read the saved configuration. Returns a rule object with its full configuration, id, organization_id, cluster_id, created_at and updated_at. Requires an organization admin using a user session or OAuth with full_access. API keys and workload tokens cannot manage federation configuration.

NameRequiredDescriptionDefault
idYes
clusterYes
organizationYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: the required role (organization admin), acceptable session types, and the explicit exclusion of API keys and workload tokens for federation configuration. It stops short of covering not-found behavior or errors.

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

Conciseness4/5

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

Three short sentences, front-loaded with the operation and followed by return shape and access constraints, with no filler. The opening phrase 'Read the saved configuration' is slightly generic for a tool whose subject is a federation rule, but nothing is wasted.

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

Completeness3/5

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

With no output schema, describing the return object is valuable, and the auth constraints are covered. However, for a 3-required-parameter lookup tool it leaves the meaning of those identifiers undocumented and says nothing about behavior when the rule does not exist, so the definition is adequate but incomplete.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry parameter meaning, but it only names returned fields rather than explaining what organization, cluster and id refer to (name vs slug vs UUID lookup) and how they scope the fetch. The one hint, that a rule object includes organization_id and cluster_id, is indirect at best.

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

Purpose4/5

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

The description states a specific read operation and enumerates the returned rule object's fields (id, organization_id, cluster_id, created_at, updated_at), making the resource clear. It does not distinguish itself from close siblings such as get-federation-issuer or list-federation-rules, so an agent must rely on the tool name to tell them apart.

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

Usage Guidelines3/5

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

Usage is only implied by 'Read the saved configuration' plus the eligibility constraints (org admin, user session or OAuth full_access). It never states when to use this versus list-federation-rules or get-federation-issuer, and it gives no when-not-to-use guidance beyond the credential exclusions.

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

get-workflowGet WorkflowA
Read-onlyIdempotent

Read a workflow and its current schedule configuration. Returns the workflow object: id, name, description, query, schedule, revision, created_at, updated_at, and sinks. The query object contains database and sql. schedule is null for manual-only workflows; otherwise it contains cron, enabled, and next_run_at (null while paused). Each sink has id, type, and settings. HTTP settings contain url (null when unreadable), url_configured, and header_names; header values are never returned. Table settings contain database and table. Slack settings contain integration_id, channel_id, and channel_name, resolved from Slack when the sink was saved. Requires an admin API key bound to the selected organization and cluster, or OAuth. Organization members may read; organization admins may create, update, or delete. Workflows execute with organization credentials and continue after the creating key is revoked or expires.

NameRequiredDescriptionDefault
idYesWorkflow ID returned by list-workflows, get-workflow, or create-workflow.
clusterYesRawTree cluster to use for this operation.
organizationYesRawTree organization containing the target cluster.

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the readOnlyHint/idempotentHint annotations, it discloses important behavioral details: schedule is null for manual-only workflows, next_run_at is null while paused, url is null when unreadable, and header values are never returned. It also explains that workflows execute with organization credentials and persist after the creating key is revoked, which materially shapes how an agent should treat this resource.

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

Conciseness4/5

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

The purpose is front-loaded in the first sentence, followed by a dense but organized field-by-field breakdown of the return object. It is long, but nearly every clause conveys a distinct fact (null semantics, security redaction, permission model); some field enumeration could be deferred to an output schema that does not currently exist.

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

Completeness5/5

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

With no output schema, the description carries the full burden of describing the return shape, and it does so comprehensively for the workflow object, query, schedule, and the three sink setting variants. Permission and credential requirements are also covered, leaving little an agent needs to call it correctly.

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

Parameters3/5

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

Schema coverage is 100%, so id, cluster, and organization are already documented in the schema. The description reinforces that the organization and cluster must be the ones the credential is bound to, but adds no new syntax or constraints beyond that; baseline 3 applies when the schema carries the load.

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

Purpose4/5

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

The description opens with a specific verb and resource: 'Read a workflow and its current schedule configuration,' and immediately enumerates the returned fields. An agent can distinguish this singular read from list-workflows by the required 'id' parameter and the singular object return, though no sibling is named explicitly.

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

Usage Guidelines4/5

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

It states the credential prerequisites ('Requires an admin API key bound to the selected organization and cluster, or OAuth') and the read/write permission split between members and admins. It does not, however, explicitly route the agent away from list-workflows or create/update-workflow, leaving the choice to be inferred from the singular read semantics.

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

insert-from-urlInsert From URLA

Purpose: Ask RawTree to ingest JSON/JSONL data from a public URL into a table. Waits for the import to complete.

NOT for: Private files on your machine or authenticated URLs. Normalize or transform data before making it available at the public URL.

Returns: The completed import result as JSON: inserted is the row count, or null when unavailable.

When to use:

  • User has a public JSON or JSONL file URL

  • You need RawTree to fetch and ingest the file directly

  • The data is too large or inconvenient to paste into the MCP call

Workflow: Confirm the URL is public → call insert-from-url → use list-logs and run-query to verify.

Key trigger phrases: "ingest this URL", "load JSONL from", "import from public file"

NameRequiredDescriptionDefault
urlYesPublic URL containing data RawTree can fetch.
tableYesTarget table name.
clusterNoRawTree cluster to use for this operation.
databaseNoOptional RawTree database override. RawTree uses the default database when omitted.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses that the call is blocking ('Waits for the import to complete'), the public-URL requirement, and the return shape (inserted row count or null). It does not cover error behavior, permissions/auth for RawTree itself, or whether existing rows are affected, leaving some 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.

Conciseness5/5

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

Front-loaded with Purpose, then scoping, returns, and workflow in clearly labeled sections. Each block earns its place and nothing is redundant padding; trigger phrases aid selection without bloating the text.

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

Completeness4/5

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

For an ingestion tool with no output schema and no annotations, the description is largely complete: it explains what happens (blocking import), what is returned, and the preconditions. It could go further on error handling and authentication, but nothing critical for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all five parameters including url, table, cluster, database, and organization. The description adds only the 'public URL' constraint, which the schema also states, so it does not meaningfully extend parameter meaning beyond structured data. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb (ingest JSON/JSONL from a public URL) and resource (into a table), and explicitly scopes it against alternatives by declaring what it is NOT for (private/authenticated URLs). An agent can distinguish it from insert-json without opening either schema.

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

Usage Guidelines5/5

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

Provides an explicit 'When to use' list, a 'NOT for' exclusion, and a workflow (confirm URL is public → call → verify with list-logs/run-query). It even hints at the sibling alternative by contrasting with data 'too large or inconvenient to paste into the MCP call.'

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

insert-jsonInsert JSONA

Purpose: Insert one JSON object or an array of JSON objects into a RawTree table. RawTree auto-creates the table on first insert.

NOT for: Loading data from a public URL (use insert-from-url).

Returns: Insert confirmation, usually { "inserted": <row_count> }.

When to use:

  • User wants to send events, logs, traces, metrics, or arbitrary records to RawTree

  • You need to create a table by inserting the first row

  • You need to validate that RawTree accepts a payload shape

Workflow: Choose a table name → send a small representative payload → run describe-table or run-query to verify.

Key trigger phrases: "insert this", "send event", "write to RawTree", "create table with data", "ingest JSON"

NameRequiredDescriptionDefault
dataYesA JSON object or a non-empty array of JSON objects to insert.
tableYesTarget table name. RawTree accepts identifiers like events, traces, api_logs.
clusterNoRawTree cluster to use for this operation.
databaseNoOptional RawTree database override. RawTree uses the default database when omitted.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It discloses auto table creation on first insert, the return shape ({inserted: n}), and a verification workflow. It omits auth/permission requirements, failure modes, and behavior on schema conflicts, leaving some gaps for a write tool.

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

Conciseness4/5

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

Front-loaded with Purpose, NOT for, Returns, When to use, and Workflow. Structured and scannable, though the trigger-phrase list is somewhat redundant with the When-to-use bullets.

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

Completeness4/5

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

Covers purpose, exclusions, return shape, workflow, and verification steps without an output schema. Adequate for a write tool, though auth context and error behavior are absent.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all five parameters. The description adds little parameter-level meaning beyond the payload workflow narrative. 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.

Purpose5/5

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

States a specific verb (Insert) and resource (JSON objects into a RawTree table), and explicitly distinguishes from the sibling insert-from-url. The auto-create-table behavior is a concrete distinguishing trait.

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

Usage Guidelines5/5

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

Provides an explicit 'When to use' list with three concrete triggers, a 'NOT for' exclusion naming the sibling alternative insert-from-url, and key trigger phrases. Routing is unambiguous.

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

install-appInstall AppA
Idempotent

Purpose: Install a RawTree app on one cluster and enable its native endpoints.

Returns: The app ID, display name, and installed state set to true.

Auth: Requires a user credential with organization admin access. Authorization is enforced by the RawTree API.

Safety: This changes the app functionality enabled for the cluster. You MUST confirm the exact organization, cluster name, and app ID with the user before calling this tool.

NameRequiredDescriptionDefault
appIdYesApp ID returned by list-apps.
clusterYesCluster name returned by list-clusters.
organizationYesOrganization containing the target cluster.

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), it discloses the exact auth requirement ('organization admin access'), notes authorization is server-enforced, states the semantic effect on the cluster, mandates user confirmation, and even summarizes the return shape. Nothing here contradicts the annotations; idempotency and non-destructiveness are consistent with 'install.'

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

Conciseness4/5

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

Four short, bold-labeled sections with the purpose front-loaded; an agent can scan it in seconds. It is slightly padded by the redundant sentence 'Authorization is enforced by the RawTree API,' which restates that auth is required without new information.

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

Completeness5/5

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

For a 3-param mutation with no output schema, the definition covers everything needed: purpose, auth, safety warning, confirmation requirement, and the returned fields. No critical decision input is left to inference.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters are already documented in the schema (appId from list-apps, cluster from list-clusters, organization). The description only echoes these names in the confirmation sentence and adds no format, source, or constraint detail beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

The description opens with a specific verb+resource+scope: 'Install a RawTree app on one cluster,' and adds the effect ('enable its native endpoints'). It is clearly distinguishable from siblings like uninstall-app and list-apps in practice, but it never names an alternative, so it falls short of the explicit sibling differentiation required for a 5.

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

Usage Guidelines4/5

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

It gives a concrete pre-call precondition ('You MUST confirm the exact organization, cluster name, and app ID with the user'), which is real usage guidance an agent must obey. It does not, however, state when to prefer this over alternatives or what conditions make installation inappropriate, so it stops short of explicit when/when-not routing.

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

list-api-keysList API KeysA

Purpose: List API keys for a RawTree cluster.

NOT for: Creating or revoking credentials. Use create-api-key or delete-api-key for those workflows.

Returns: API key names, IDs, API key hints, permissions or database roles, default database, creation dates, and expires_at (UTC timestamp or null for never).

Auth: Uses GET /v1/keys and requires an admin database API key.

When to use:

  • User asks what API keys exist

  • You need the key ID before revoking a key

  • You need to audit permissions for a database

NameRequiredDescriptionDefault
clusterNoRawTree cluster to use for this operation.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does: it discloses the auth requirement (admin database API key), the underlying endpoint (GET /v1/keys), the exact returned fields, and the null-vs-UTC semantics of expires_at. This is exactly the context an agent needs before calling a credentialed read.

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

Conciseness5/5

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

Header-labelled sections are front-loaded with Purpose and exclusions first, then returns/auth/usage. The returns enumeration is long but earns its place because there is no output schema.

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

Completeness5/5

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

No output schema exists, yet the description enumerates return fields, and it covers auth, endpoint, and exclusions. Nothing an agent needs in order to call this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (cluster, organization) are documented in the schema, so the baseline is 3. The description adds no additional meaning about scoping or defaults for these parameters.

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

Purpose5/5

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

States a specific verb+resource (list API keys for a RawTree cluster) and explicitly distinguishes itself from the sibling create-api-key and delete-api-key tools. 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.

Usage Guidelines5/5

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

Includes an explicit 'NOT for' block naming the alternatives, plus three concrete 'When to use' triggers (audit permissions, need key ID before revoking, inventory question). Both the positive and negative routing cases are covered.

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

list-appsList AppsA
Read-only

Purpose: List the RawTree app catalog and installation state for one cluster.

Returns: The cluster ID and name, plus every available app with its ID, display name, and installed state.

Auth: Requires a user credential and organization membership. Authorization is enforced by the RawTree API.

When to use:

  • You need a valid app ID before installing or uninstalling an app

  • You want to check which apps are installed on a cluster

  • You want to verify installation state after a change

NameRequiredDescriptionDefault
clusterYesCluster name returned by list-clusters.
organizationYesOrganization containing the target cluster.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds meaningful context beyond them: the auth requirement (user credential + organization membership) and the exact return content. It doesn't mention pagination or catalog size limits, which keeps it short of a 5.

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

Conciseness5/5

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

Front-loaded with labeled Purpose/Returns/Auth/When-to-use sections that scan quickly. Every sentence carries distinct information with no filler.

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

Completeness5/5

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

No output schema exists, so the description's Returns section is doing necessary work by describing the cluster metadata and per-app fields. Combined with the auth note and usage triggers, 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.

Parameters3/5

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

Schema coverage is 100% and both parameters are already documented (cluster 'returned by list-clusters', organization). The description only restates the cluster scoping, adding no syntax or format detail beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb (List) and resource (RawTree app catalog plus installation state) scoped to a single cluster. An agent can distinguish it from install-app/uninstall-app siblings without opening any schema.

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

Usage Guidelines5/5

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

Provides an explicit 'When to use' list: obtaining a valid app ID before install/uninstall, checking installed apps, and verifying state after a change. This directly routes the agent relative to the install-app and uninstall-app siblings.

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

list-clustersList ClustersA

Purpose: List RawTree dedicated clusters accessible in an organization.

Returns: Cluster IDs, names, creation times, lifecycle status, resources, whether each cluster can be paused or resumed, optional s3_storage metadata for customer-owned default storage, and s3_storage_access containing external_id and resource_tag (null for older clusters without saved identity). s3_storage exposes data and backups, each with bucket and path. An empty path means the bucket root. Role ARNs and secret credentials are never returned.

With user authentication, discovery spans enabled regions. If a region is unavailable, healthy clusters are returned with unavailable_regions (region IDs and names). This is a partial list: do not infer that missing clusters do not exist; retry discovery. Each regional lookup is limited to five seconds. Authentication failures and total regional outages remain errors.

Auth: The RawTree API requires a user access token and organization membership. Authorization is enforced by the API.

When to use:

  • User asks which dedicated clusters exist

  • You need a cluster ID or current lifecycle status

  • You need to inspect provisioned resources before creating another cluster

NameRequiredDescriptionDefault
organizationYesOrganization whose dedicated clusters should be listed.

TDQS

A4.4/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it enumerates the returned fields, discloses that role ARNs and secrets are never returned, warns that results can be a partial list with unavailable_regions and that five-second per-region lookups apply, and states which conditions still error. This is exactly the behavioral context an agent needs beyond structured fields.

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

Conciseness4/5

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

Bold-labeled sections (Purpose / Returns / Auth / When to use) with purpose front-loaded make it scannable. It is on the long side and the nested s3_storage field walkthrough is dense, but since no output schema exists, that detail earns most of its space.

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

Completeness5/5

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

No output schema exists, and the description fully compensates by describing the return payload, null/empty-path semantics, partial-result behavior, and error conditions. Combined with the auth requirements, an agent has everything needed to call this correctly and interpret the result.

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

Parameters3/5

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

Schema description coverage is 100% for the single `organization` parameter, so the schema already defines its meaning. The description reinforces the org-scoping constraint ("accessible in an organization") but adds no format or lookup guidance 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.

Purpose5/5

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

States a specific verb and resource ("List RawTree dedicated clusters") plus the scope ("accessible in an organization"). Plural list scope makes it naturally distinct from get-cluster (single cluster), list-cluster-sizes and create-cluster without needing to name them.

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

Usage Guidelines4/5

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

The "When to use" block gives three concrete triggering conditions: existence questions, needing a cluster ID/lifecycle status, and inspecting resources before creating another cluster. It lacks explicit exclusions or sibling routing (e.g. "for one cluster's details use get-cluster"), so it stops 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-cluster-sizesList Cluster SizesA
Read-only

Purpose: List the current RawTree cluster creation options.

Returns: Supported per-replica sizes, minimum and maximum replica counts, and the default minimum and maximum vertical autoscaling sizes.

Auth: Requires a user credential such as OAuth. Authorization is enforced by the RawTree API.

When to use: You MUST call this tool before create-cluster so replicas and both sizes come from the current backend-controlled catalog.

NameRequiredDescriptionDefault
regionIdNoRegion ID returned by list-regions. Use the same region for sizes, S3 verification and creation. Omit for the default backend.
organizationNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds genuine context beyond them: the auth requirement (OAuth user credential, API-enforced authorization) and the fact that values are backend-controlled and therefore may change. It does not cover caching or whether the catalog varies by region, which would have pushed it to a 5.

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

Conciseness4/5

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

Front-loaded with a bolded Purpose line, then Returns, Auth, and When-to-use in priority order — easy to scan. Slightly verbose with four labeled sections for a two-parameter read tool, but no sentence is filler.

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

Completeness4/5

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

A read-only catalog tool with no output schema needs its return shape and ordering constraint explained, and both are. The remaining gap is the undocumented 'organization' parameter and how the catalog differs per region, which an agent may need in a multi-tenant or multi-region call.

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

Parameters2/5

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

Schema coverage is 50% and the description says nothing about either parameter. regionId is self-documented in the schema, but 'organization' has no description anywhere, and the description does not explain the default-backend behavior for omitted regionId beyond what the schema already states.

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

Purpose5/5

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

States a specific verb and resource ('List the current RawTree cluster creation options') and explicitly enumerates what the catalog contains (per-replica sizes, min/max replica counts, default autoscaling bounds). This clearly separates it from list-clusters, get-cluster, and list-regions.

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

Usage Guidelines5/5

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

Gives an explicit, hard prerequisite: 'You MUST call this tool before create-cluster so replicas and both sizes come from the current backend-controlled catalog.' The alternative path (hardcoding values) is implicitly ruled out, which is exactly the routing information an agent needs.

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

list-connectorsList ConnectorsA
Read-only

Purpose: List managed connectors for one RawTree cluster.

Returns: Connector IDs, names, types, statuses, destinations, sanitized settings, revisions, and timestamps. Stored credentials are never returned.

Auth: Requires a user credential and organization membership. Connector management may be unavailable in some environments.

NameRequiredDescriptionDefault
clusterNoRawTree cluster to use for this operation.
organizationNoRawTree organization containing the target cluster.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered, but the description goes further: it enumerates returned fields, explicitly states credentials are never returned, and warns connector management may be unavailable in some environments — genuine behavioral context beyond the annotations.

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

Conciseness4/5

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

Three bold-labelled sections keep Purpose, Returns, and Auth front-loaded and scannable with no filler sentences. Slightly expository for a list tool, but every sentence carries information.

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

Completeness4/5

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

With no output schema, the description compensates by enumerating return fields, and it also covers auth and availability caveats. Only gap is pagination/volume behavior for a list operation, which an agent might care about.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both 'cluster' and 'organization'. The description echoes cluster scoping but adds no format or semantics beyond what the schema supplies, which is the baseline case.

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

Purpose5/5

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

States a specific verb (List) and resource (managed connectors) plus the scope constraint (one RawTree cluster). An agent can distinguish this from get-connector, create-connector, and add-connector-destination without opening any schema.

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

Usage Guidelines3/5

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

The listing/scope semantics imply when to call it, and the auth sentence gives useful preconditions (user credential + organization membership), but there is no explicit when-to-use vs alternatives routing (e.g., 'to inspect a single connector, use get-connector'). Usage is inferred 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-databasesList DatabasesA

Purpose: List databases in a RawTree organization and cluster.

Returns: Database names and their organization context. Databases with explicit customer-owned storage include s3_storage metadata; null means the database inherits the cluster's default storage. This metadata contains bucket and path values only; credentials are never returned.

When to use:

  • You need a database name before using query, table, ingest, or log tools

  • The user wants to switch databases without configuring another MCP server

NameRequiredDescriptionDefault
clusterNoRawTree cluster to use for this operation.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.1/5.0
Behavior4/5

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 disclose meaningful return semantics (s3_storage metadata, null = inherits cluster default) and a security guarantee ('credentials are never returned'). It omits auth/permission requirements and rate-limit or pagination behavior, which keeps it below 5.

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

Conciseness4/5

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

Well front-loaded with a bold 'Purpose' line and organized into Returns/When-to-use sections; every block carries information. Slightly verbose with its header scaffolding, but nothing is filler.

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

Completeness4/5

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

There is no output schema, so the description correctly assumes responsibility for explaining return values, and it does so including the s3_storage nuance. Given zero required params and full schema coverage, this is nearly complete; only auth/prerequisite-permission context is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (cluster, organization) are already documented in the schema, so the baseline of 3 applies. The description adds no syntax, format, or defaulting guidance beyond what the schema provides.

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

Purpose5/5

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

States a specific verb and resource ('List databases') plus the scope ('in a RawTree organization and cluster'), which is more precise than the name alone. An agent can distinguish it from list-tables, list-clusters, and delete-database without opening a schema.

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

Usage Guidelines4/5

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

The 'When to use' section gives concrete triggering conditions, including the prerequisite relationship ('need a database name before using query, table, ingest, or log tools'). It stops short of naming when NOT to use it or naming a sibling alternative, so it earns 4 rather than 5.

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

list-federation-issuersList Federation IssuersB
Read-onlyIdempotent

List all federation issuers. Returns an array of complete objects with configuration, IDs and timestamps. Requires an organization admin using a user session or OAuth with full_access. API keys and workload tokens cannot manage federation configuration.

NameRequiredDescriptionDefault
organizationYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new context beyond them: the required organization-admin role, the acceptable credential types (user session or OAuth full_access), and the explicit exclusion of API keys and workload tokens.

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

Conciseness4/5

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

Three short sentences, front-loaded with the action and return shape, followed by the access constraint. Nothing is padded, though the credential sentence runs slightly long relative to its value.

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

Completeness3/5

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

For a simple read-only list tool with no output schema, the description explains the return shape and auth requirements well. It still leaves gaps on the organization parameter semantics and on pagination or result-size behavior, which matter for a "list all" endpoint.

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

Parameters2/5

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

Schema description coverage is 0% for the single required organization parameter, so the description carries the burden of explaining it and does not. It never says whether organization is a name, slug, or ID, nor that it scopes the listing to that org.

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

Purpose4/5

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

The description opens with a specific verb and resource ("List all federation issuers") and adds the return shape ("array of complete objects with configuration, IDs and timestamps"). It does not explicitly distinguish itself from the sibling get-federation-issuer, though "List all" versus a singular get is reasonably implied.

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

Usage Guidelines3/5

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

Usage is implied by the list semantics and the tool is constrained by an organization parameter, but there is no explicit when-to-use guidance such as "use get-federation-issuer to fetch a single issuer" or "use list-federation-rules for its rules". The access restrictions given are auth preconditions rather than selection guidance.

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

list-federation-rulesList Federation RulesB
Read-onlyIdempotent

List all federation rules. Returns an array of complete objects with configuration, IDs and timestamps. Requires an organization admin using a user session or OAuth with full_access. API keys and workload tokens cannot manage federation configuration.

NameRequiredDescriptionDefault
clusterYes
organizationYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: the admin/user-session/full_access OAuth requirement and the explicit exclusion of API keys and workload tokens. It does not add rate limits, pagination, or result-size behavior, so it sits above baseline but is 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.

Conciseness4/5

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

Three short sentences, front-loaded with the action and return shape, then the authorization constraints. Every sentence carries information; nothing is padding.

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

Completeness3/5

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

For a read-only list tool with no output schema, the description covers return shape and auth requirements adequately. However, the two required scoping parameters are left entirely unexplained, which is a meaningful gap given 0% schema description coverage.

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

Parameters3/5

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

Schema description coverage is 0% and both required parameters, 'organization' and 'cluster', are undocumented in the schema, so the description should compensate but largely does not. It never explains that results are scoped by organization and cluster, and 'List all federation rules' arguably implies a global listing, which the required scoping parameters contradict.

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

Purpose4/5

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

The description states a specific verb and resource ('List all federation rules') and clarifies that complete objects with configuration, IDs and timestamps are returned. It does not differentiate itself from close siblings such as get-federation-rule or list-federation-issuers, but the core 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.

Usage Guidelines2/5

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

There is no guidance on when to choose this tool over get-federation-rule, list-federation-issuers, or the create/update/delete rule siblings. The only context given is a prerequisite ('requires an organization admin'), which tells the agent about authorization, not about tool selection.

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

list-integrationsList IntegrationsA
Read-onlyIdempotent

Purpose: List the integrations connected to a RawTree organization, such as Slack workspaces.

Returns: { integrations, slack_available, settings_url }. Each integration has id, organization_id, type ("slack"), settings (team_id, team_name, bot_user_id, scopes), and created_at. slack_available is false when Slack is not configured for this RawTree deployment. settings_url links to the organization's integrations settings page in the RawTree app.

Behavior: Connecting or disconnecting Slack is not available through MCP: an organization admin must do it on the integrations settings page in the RawTree app. Share settings_url with the user when no Slack workspace is connected.

Auth: Requires a user credential such as OAuth and membership in the organization. API keys are not supported. Authorization is enforced by the RawTree API.

When to use:

  • You need a Slack integration ID for a workflow Slack sink

  • The user wants to know which Slack workspaces the organization has connected

NameRequiredDescriptionDefault
organizationYesOrganization whose integrations should be used.

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the read-only annotations, the description discloses authentication requirements (user OAuth and organization membership, no API keys), the exact return fields, the meaning of slack_available, and the settings_url fallback behavior. This is substantial operational context that an agent could not infer from the annotations or schema.

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

Conciseness4/5

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

The description is structured with clear Purpose, Returns, Behavior, Auth, and When to use sections, and it is front-loaded with the core purpose. It is somewhat long for a one-parameter list tool, but most of the detail is useful given the absence of an output schema.

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

Completeness5/5

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

The tool has no output schema, but the description supplies the return shape, auth requirements, behavioral limitations, and usage scenarios. An agent has everything needed to call it correctly and interpret the response.

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

Parameters3/5

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

Schema coverage is 100% for the single organization parameter, so the schema already explains it adequately. The description adds that the organization must be one the user belongs to, but this is auth context rather than parameter-level meaning.

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

Purpose4/5

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

The description states a specific verb and resource: list integrations connected to a RawTree organization, with Slack workspaces as the concrete example. It is clear what the tool does, but it does not explicitly contrast itself with sibling tools such as list-slack-channels.

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

Usage Guidelines4/5

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

The 'When to use' section gives two concrete scenarios, and the behavior section explains that connecting or disconnecting Slack cannot be done through MCP. This covers when to use and when not to use the tool, though it does not name direct alternative tools.

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

list-logsList LogsA

Purpose: List recent RawTree insert/query/describe/explain activity for a database.

NOT for: Reading application log files from disk or infrastructure logs. This tool reads RawTree's product query and insert logs.

Returns: Log entries with time, type, status, origin, query, exception, rows, duration, bytes, tables, projections, hints, and pagination.

When to use:

  • An insert or query failed and you need the RawTree exception or hints

  • You need to verify whether an agent, CLI, API, or UI call reached RawTree

  • You need recent activity for a table

  • You want the exact SQL RawTree saw

Workflow: Start with status=error for the last hour. Narrow by table or type if needed. Use next_offset for pagination.

Key trigger phrases: "check RawTree logs", "why did the insert fail", "show query history", "recent errors"

NameRequiredDescriptionDefault
hintsNoFilter to logs with any hints or no hints.
limitNoNumber of logs to return. Default: 50. Max: 200.
typesNoFilter by log type.
offsetNoNumber of logs to skip for pagination.
searchNoOptional raw RawTree search string, for example "type:insert status:error table:events". Structured filters are appended to it.
tablesNoFilter by one or more table names.
clusterNoRawTree cluster to use for this operation.
endTimeNoInclusive upper bound as an ISO datetime. Defaults to now.
originsNoFilter by origin.
databaseNoOptional RawTree database override. RawTree uses the default database when omitted.
statusesNoFilter by status.
startTimeNoInclusive lower bound as an ISO datetime. Defaults to one hour before endTime.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does well: it lists returned fields, default time window, pagination, origin types, and the exact SQL RawTree saw. It does not state read-only/permission requirements explicitly, and it says 'next_offset' for pagination while the schema exposes an 'offset' input.

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

Conciseness5/5

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

The description is appropriately sized for a 13-parameter tool and is strongly front-loaded with purpose and exclusions. Bulleted sections keep it scannable, and the trigger phrases aid retrieval without replacing the core semantics.

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

Completeness4/5

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

Given no annotations, no output schema, and 13 optional parameters, the description is largely complete: it covers purpose, exclusions, return fields, and workflow. It still omits permission/authentication context and has the 'next_offset' versus 'offset' naming inconsistency.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 13 parameters. The description adds useful workflow guidance for status, table, and type filters, but it does not explain most parameters and introduces a minor mismatch by referencing 'next_offset' instead of the schema's 'offset'.

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

Purpose5/5

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

States a specific verb and resource: list RawTree insert/query/describe/explain activity. It explicitly distinguishes itself from application/infrastructure log reading, 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.

Usage Guidelines5/5

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

Provides explicit when-to-use bullets, a suggested workflow, and a clear NOT-for section. It names concrete scenarios such as failed inserts, agent/CLI/API/UI verification, and filtering by table.

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

list-organization-membersList Organization MembersA
Read-only

Purpose: List accepted members of a RawTree organization.

Returns: Member user IDs, email addresses, roles, and creation times. Pending invitations are not included.

Auth: Requires a user credential and membership in the organization. Authorization is enforced by the RawTree API.

When to use:

  • You need the member user ID before changing a role or removing access

  • The user wants to inspect who belongs to an organization

NameRequiredDescriptionDefault
organizationYesOrganization whose accepted members should be listed.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds valuable specifics: the return fields (user IDs, emails, roles, creation times), the exclusion of pending invitations, and the auth requirement of user credential plus org membership. It doesn't cover pagination or rate limits, keeping it below a 5.

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

Conciseness5/5

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

Well front-loaded with Purpose, Returns, Auth, and When to use sections. The markdown structure is clear, scannable, and every sentence contributes information with no redundancy.

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

Completeness5/5

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

For a single-parameter read-only list tool, the description covers purpose, return shape, auth requirements, and usage scenarios. Combined with annotations covering the safety profile and a fully documented schema, nothing an agent needs to invoke this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and there is only one parameter, so the schema already documents 'organization' fully. The description adds no syntax or format details beyond what the schema provides, making the baseline 3 appropriate.

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

Purpose5/5

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

States a specific verb (List) and resource (accepted members of a RawTree organization), and explicitly scopes out pending invitations. This distinguishes it clearly from siblings like add-organization-member or remove-organization-member.

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

Usage Guidelines5/5

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

The 'When to use' section provides two concrete scenarios: needing a member user ID before role changes or removals, and inspecting organization membership. This routes the agent away from mutation siblings and toward the correct read tool.

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

list-organizationsList OrganizationsA

Purpose: List RawTree organizations available to the authenticated user.

Returns: Organization names, roles, plans, and avatar URLs.

Auth: Requires a user credential such as OAuth. Database API keys are not user credentials and cannot list organizations.

When to use:

  • You need an organization name before listing clusters

  • The user wants to work across multiple organizations through one MCP connection

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does add real value: it discloses the return shape (names, roles, plans, avatar URLs) and a genuine auth pitfall (needs a user credential, database API keys cannot list organizations). It omits pagination or rate-limit behavior, so it's not exhaustive.

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

Conciseness5/5

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

Purpose is front-loaded, then returns, auth, and usage are cleanly delineated with bold headers and bullets. Each section adds needed information and nothing is redundant.

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

Completeness5/5

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

For a parameterless read tool with no output schema and no annotations, the description supplies everything required: what comes back, how to authenticate, and when to reach for it. Nothing essential is missing.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline for a no-parameter schema is 4.

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

Purpose4/5

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

States a specific verb (List) and resource (RawTree organizations) scoped to 'available to the authenticated user,' so an agent knows exactly what comes back. It does not explicitly contrast itself with neighbors like list-organization-members, but the resource is unambiguous.

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

Usage Guidelines4/5

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

A dedicated 'When to use' block gives two concrete triggers (need an org name before listing clusters; working across multiple orgs in one connection). It stops short of naming an alternative tool or an explicit when-not, so it's clear context rather than full routing guidance.

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

list-regionsList RegionsA
Read-only

List the public and BYOC regions accessible to an organization. Use an enabled region ID for cluster creation and its prerequisite size and S3 checks. Regions need a ready deployment, except the legacy public default.

NameRequiredDescriptionDefault
organizationYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish this as a safe read, and the description adds real behavioral context: only regions with a ready deployment are returned, with an exception for the legacy public default. That filtering behavior and the public/BYOC distinction are not derivable from the annotations or schema.

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

Conciseness5/5

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

Two sentences, front-loaded with the core purpose, then the actionable condition. No redundant restatement of the name or title.

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

Completeness4/5

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

With no output schema, the description usefully signals what comes back (regions with an enabled/ready state) and how to consume it. The only meaningful gap is the undocumented organization identifier format.

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

Parameters2/5

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

Schema description coverage is 0% for the single required `organization` parameter, so the description must carry the burden — but it only implies 'organization' conceptually and never says whether it expects an ID, slug, or name. The agent has no format guidance to construct a valid call.

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

Purpose4/5

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

States a specific verb and resource — listing public and BYOC regions accessible to an organization — which is well beyond tautology. It hints at adjacent siblings (cluster size and S3 checks, cluster creation) but never names them explicitly, so full sibling differentiation is only implicit.

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

Usage Guidelines4/5

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

'Use an enabled region ID for cluster creation and its prerequisite size and S3 checks' tells the agent what to do with the result and points downstream. It also sets a filtering condition (ready deployment required, except the legacy public default) but gives no explicit when-not or named alternative tool.

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

list-saved-queriesList Saved QueriesA
Read-onlyIdempotent

List all saved SQL queries visible to you in a cluster, across databases. Returns { queries: [...] } with each query's id, organization_id, cluster_id, user_id, name, sql, database, visibility, created_at, and updated_at. There is no pagination.

User sessions and OAuth can see their own private queries and cluster-shared queries. Standard API keys with read permission can see only cluster-shared queries; write-only and database-role keys are not supported.

To execute a saved query, pass its sql and database to run-query with the same organization and cluster. Listing does not execute SQL or grant access to the underlying data.

NameRequiredDescriptionDefault
clusterNoRawTree cluster to use for this operation.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, yet the description adds real depth: there is no pagination, the exact response envelope and field set are given, and the visibility model is broken down per auth type (user sessions/OAuth vs read API keys vs write-only/database-role keys). This is disclosure well beyond the structured annotations.

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

Conciseness4/5

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

Four sentences with the core action and return shape front-loaded, then access constraints, then the sibling hand-off. The field enumeration is long but earns its place because there is no output schema; only slight density keeps it off a 5.

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

Completeness5/5

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

With no output schema, the description supplies the return envelope and field list; with sparse annotations, it supplies the permission and pagination model. Nothing an agent needs in order to call this correctly, or to interpret the result, is missing.

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

Parameters3/5

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

Both parameters (cluster, organization) are fully documented in the schema at 100% coverage, so the baseline is 3. The description only implies their meaning ('in a cluster', 'same organization and cluster') without adding format, default, or interaction detail beyond the schema.

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

Purpose5/5

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

The description opens with a specific verb and resource plus scope: list all saved SQL queries visible to you in a cluster, across databases. It also distinguishes itself from run-query by naming what the sibling does (execution) versus what this tool does (listing only).

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

Usage Guidelines5/5

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

It explicitly routes the agent to run-query for execution ('pass its sql and database to run-query with the same organization and cluster') and states what this tool does not do ('Listing does not execute SQL or grant access to the underlying data'). It also spells out which caller identities may use it and which auth modes are unsupported.

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

list-service-accountsList Service AccountsA
Read-onlyIdempotent

List service accounts in an organization, including their IDs, names, descriptions, and stored organization roles. Requires an organization admin using a user session or OAuth; API keys cannot manage service accounts.

NameRequiredDescriptionDefault
organizationYesOrganization name from list-organizations.

TDQS

A3.8/5.0
Behavior4/5

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

The annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds meaningful context beyond them: the admin requirement, the accepted auth mechanisms, and the explicit exclusion of API keys. It does not mention pagination or result-size limits, which is the remaining behavioral gap.

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

Conciseness5/5

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

Two sentences, front-loaded with what the tool returns and followed by the access constraint. Nothing is redundant or padded.

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

Completeness4/5

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

For a one-parameter read tool with rich annotations and no output schema, the description is nearly sufficient: it describes return contents in lieu of an output schema and covers the auth prerequisite. Only pagination/result-count behavior is unaddressed.

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

Parameters3/5

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

There is a single parameter with 100% schema coverage whose description already explains it comes from list-organizations. The description only restates 'in an organization' and adds no format or sourcing detail beyond the schema, so the baseline of 3 applies.

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

Purpose4/5

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

The description states a specific verb and resource ('List service accounts in an organization') and enumerates the returned fields (IDs, names, descriptions, stored organization roles). It is clearly distinct from siblings like create-service-account and list-organization-members, though it never names an alternative explicitly.

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

Usage Guidelines3/5

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

Usage is only implied by the verb 'List'; there is no explicit when-to-use or when-not-to-use guidance relative to siblings. The one constraint given is real and useful, that the caller must be an org admin on a user session or OAuth and cannot use an API key, but that is a prerequisite rather than selection guidance.

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

list-slack-channelsList Slack ChannelsA
Read-onlyIdempotent

Purpose: List or search the channels of a Slack workspace connected to a RawTree organization.

Returns: { channels, next_cursor }. Each channel has id, name, and is_private. next_cursor is null when there are no more results.

Behavior: Results are paginated. Pass next_cursor as cursor, with the same name when searching, to continue. With name, returns channels whose name contains it, ignoring a leading #, surrounding spaces, and case. Each search request scans a bounded part of the workspace, so a page can have no channels while next_cursor is set: the search has not finished, so call again with that cursor and the same name. Workflow Slack sinks accept a channel_name directly; use this tool to find a channel or confirm its exact name. The RawTree app must be a member of a private channel before it can post there.

Auth: Requires a user credential such as OAuth and membership in the organization. API keys are not supported. Authorization is enforced by the RawTree API.

When to use:

  • You need to find a Slack channel for a workflow Slack sink

  • The user describes a channel only partially and you need its exact name or ID

NameRequiredDescriptionDefault
nameNoText that channel names must contain, such as alerts or #alerts. Omit to list all channels.
cursorNonext_cursor from a previous list-slack-channels response. Omit for the first page.
organizationYesOrganization whose integrations should be used.
integration_idYesSlack integration ID returned by list-integrations.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, yet the description adds substantially more: pagination mechanics, the counterintuitive case where a page returns zero channels but next_cursor is set because the search scan is bounded, and the prerequisite that the RawTree app must be a member of a private channel before posting. Auth constraints (user credential/OAuth required, API keys unsupported, RawTree-enforced authorization) are also disclosed, which no annotation conveys.

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

Conciseness4/5

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

Bold section labels (Purpose, Returns, Behavior, Auth, When to use) make it skimmable and front-loaded, and the works-as-documented return shape is stated in one line. It is somewhat long and repeats name-substring matching from the schema, so a small amount of content doesn't earn its place.

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

Completeness5/5

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

With no output schema and four parameters, the description supplies the missing return contract ({ channels, next_cursor } with channel fields and null-cursor termination), the pagination loop the agent must implement, and the auth model. Nothing needed to call it correctly — including how to recover from an empty-but-cursored page — is left to inference.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond it: cursor must be passed together with the same name used to produce it, and name matching ignores a leading '#', surrounding spaces, and case — normalization rules absent from the schema text. It stops short of a 5 because it doesn't discuss what organization/integration_id must be paired with (cross-org behavior).

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

Purpose5/5

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

Opens with a specific verb pair and resource: 'List or search the channels of a Slack workspace connected to a RawTree organization.' The scope (workspace of a connected org) and the two modes (list vs. search via name) are explicit, so an agent can distinguish this from siblings like list-integrations or get-workflow without opening the schema.

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

Usage Guidelines5/5

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

A dedicated 'When to use' block names both concrete triggers: finding a channel for a workflow Slack sink, and resolving a partially-described channel to an exact name or ID. It also pre-empts an alternative route by noting that Workflow Slack sinks accept channel_name directly, so the agent knows when this lookup is and isn't required.

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

list-tablesList TablesA

Purpose: List all tables in a RawTree database with row and byte counts.

NOT for: Reading table rows. Use run-query for data and describe-table for columns.

Returns: Tables plus database and organization context.

When to use:

  • User asks what data exists

  • You need a table name before querying

  • You want to verify that an insert auto-created a table

NameRequiredDescriptionDefault
clusterNoRawTree cluster to use for this operation.
databaseNoOptional RawTree database override. RawTree uses the default database when omitted.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it does disclose the return payload (tables with row/byte counts plus database and organization context), which is real behavioral context. It stops short of stating auth requirements, pagination, or behavior on a missing/ambiguous database, leaving those gaps.

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

Conciseness5/5

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

Front-loaded purpose statement, then compact labelled sections (NOT for / Returns / When to use). Every sentence carries routing or scope information with no filler; the header scaffolding aids scanning rather than padding.

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

Completeness4/5

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

For a read-only list tool with no output schema and no annotations, the description supplies what the returns look like and how it differs from siblings. It is nearly complete; only edge-case behavior (empty database, permission failures) is unaddressed, which is minor for this tool class.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents cluster, database, and organization, including which is optional. The description references database and organization context but adds no syntax, format, or defaulting detail beyond the schema. Baseline 3 applies 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.

Purpose5/5

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

States a specific verb+resource (list tables in a RawTree database) and immediately scopes what it returns (row and byte counts). It explicitly distinguishes itself from siblings run-query and describe-table, 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.

Usage Guidelines5/5

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

The 'NOT for' section names alternatives (run-query for data, describe-table for columns) with the condition that selects them, and the 'When to use' bullets give three concrete triggering scenarios. Both when-to-use and when-not-to-use are explicit.

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

list-workflowsList WorkflowsA
Read-onlyIdempotent

List all workflows in one cluster across databases. Returns { workflows: [...] } with complete workflow objects; no pagination. Returns the workflow object: id, name, description, query, schedule, revision, created_at, updated_at, and sinks. The query object contains database and sql. schedule is null for manual-only workflows; otherwise it contains cron, enabled, and next_run_at (null while paused). Each sink has id, type, and settings. HTTP settings contain url (null when unreadable), url_configured, and header_names; header values are never returned. Table settings contain database and table. Slack settings contain integration_id, channel_id, and channel_name, resolved from Slack when the sink was saved. Requires an admin API key bound to the selected organization and cluster, or OAuth. Organization members may read; organization admins may create, update, or delete. Workflows execute with organization credentials and continue after the creating key is revoked or expires.

NameRequiredDescriptionDefault
clusterYesRawTree cluster to use for this operation.
organizationYesRawTree organization containing the target cluster.

TDQS

A4/5.0
Behavior5/5

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

Annotations already cover read-only, idempotent, and non-destructive behavior, but the description adds no pagination, full return shape, auth requirements, permission levels, and that workflows continue after key revocation. These are meaningful behavioral traits beyond structured fields.

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

Conciseness4/5

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

The first sentence states purpose and scope; return fields, auth, and permissions follow in a logical order. It is dense and lacks bullet structure, but the detail earns its place because there is no output schema.

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

Completeness5/5

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

No output schema exists, so the description must explain the return value, and it does so down to nested sink settings and null conditions. It also covers auth, permissions, and persistence, making it complete for this read tool.

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

Parameters3/5

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

Schema coverage is 100% and both required parameters are documented there. The description only references organization and cluster indirectly in auth text; it adds no syntax, defaults, or constraints beyond the schema.

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

Purpose4/5

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

States a specific verb and resource, listing workflows, plus the scope of one cluster across databases. It is clear but does not explicitly distinguish from sibling get-workflow, so it misses the top level of sibling differentiation.

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

Usage Guidelines3/5

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

The opening sentence implies usage for retrieving all workflows, and the auth paragraph clarifies read permissions. It never states when to use this instead of get-workflow or any other sibling, and provides no exclusions, so guidance is only implied.

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

pause-clusterPause ClusterA
Destructive

Purpose: Request that a RawTree dedicated cluster pause.

Returns: The updated cluster, including its lifecycle status. Pausing continues asynchronously after the request is accepted. Use get-cluster to check one cluster's progress.

Auth: The RawTree API requires a user access token with organization admin access. Authorization is enforced by the API.

Safety: Pausing makes the cluster's databases unavailable until it is resumed. You MUST confirm the exact organization and cluster ID before calling this tool.

NameRequiredDescriptionDefault
clusterIdYesDedicated cluster ID returned by list-clusters.
organizationYesOrganization containing the cluster to pause.

TDQS

A4.2/5.0
Behavior5/5

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

Goes well beyond the annotations (destructiveHint=true, readOnlyHint=false) by disclosing that pausing is asynchronous, that databases become unavailable until resumed, and that an org-admin access token is required. The async behavior and availability impact are exactly the kind of traits annotations cannot convey.

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

Conciseness4/5

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

Sectioned into Purpose/Returns/Auth/Safety with the core action front-loaded, so an agent can skim efficiently. The bold headers are slightly heavy for the amount of content, but no sentence is filler.

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

Completeness5/5

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

With no output schema, the description still explains the return value (the updated cluster and its lifecycle status), plus auth requirements, async timing, and safety consequences. Nothing an agent needs to invoke this mutation correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are documented in the schema, so the description's brief mention of organization and cluster ID adds little. Baseline 3 applies when the schema carries parameter semantics.

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

Purpose5/5

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

States a specific verb and resource ('Request that a RawTree dedicated cluster pause') with the target object named precisely. An agent can distinguish this from sibling mutations like resume-cluster, update-cluster, or delete-cluster without opening the schema.

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

Usage Guidelines3/5

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

Gives a follow-up path ('Use get-cluster to check one cluster's progress') and a precondition (confirm org and cluster ID), but does not compare against alternatives such as resume-cluster or state when pausing is the right action versus other lifecycle operations. Usage is implied rather than explained.

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

query-formatFormat QueryA
Read-onlyIdempotent

Format complete SQL with the native RawTree formatter without executing statements or writing database query logs. Supports multiple statements and preserves literals. Inline INSERT VALUES data is copied verbatim without completeness or schema validation.

Returns JSON { "formatted": "..." } containing the entire formatted SQL. The API allows a 50 MiB JSON request, 100 MiB formatted output, and 30 seconds of formatting. Requires a backend with POST /v1/query-format.

NameRequiredDescriptionDefault
sqlYesComplete SQL document to format.
clusterNoRawTree cluster to use for this operation.
databaseNoOptional RawTree database override. RawTree uses the default database when omitted.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent/destructive annotations: it discloses concrete limits (50 MiB request, 100 MiB output, 30 second timeout), that no query logs are written, that multiple statements are supported, that literals are preserved, and that inline INSERT VALUES are copied verbatim with no completeness or schema validation. These are exactly the failure modes an agent needs to anticipate.

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

Conciseness4/5

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

Front-loaded with purpose and non-behavior, then the return shape, then limits. Nearly every sentence carries distinct information, though the limits/dependency sentence is dense enough that it borders on overloading a short two-paragraph block.

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

Completeness5/5

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

No output schema exists, and the description supplies the return shape explicitly with `Returns JSON { "formatted": "..." }`. Combined with the size/time limits and backend prerequisite, an agent has everything needed to call it correctly and predict responses.

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

Parameters3/5

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

Schema description coverage is 100%, so sql, cluster, database, and organization are already documented with baseline clarity. The description reinforces that the SQL must be 'complete' and hints at a backend, but adds no cluster/database/organization resolution semantics beyond the schema. Baseline 3 applies when the schema carries the load.

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

Purpose5/5

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

States a specific verb and resource ('Format complete SQL with the native RawTree formatter') and immediately delimits scope with 'without executing statements or writing database query logs', which separates it from run-query among the siblings. An agent can identify this as a pure formatting utility without opening the schema.

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

Usage Guidelines4/5

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

'without executing statements or writing database query logs' gives clear selection context versus execution tools, and the backend requirement ('Requires a backend with POST /v1/query-format') is a useful precondition. It stops short of naming run-query as the alternative for agents who actually want execution, so it is clear but not fully explicit about when-not.

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

remove-organization-memberRemove Organization MemberA
Destructive

Purpose: Remove an accepted member from a RawTree organization and revoke their organization access.

Returns: Whether the member was removed.

NOT for: Revoking a pending invitation. Use list-organization-members to identify an accepted member and obtain their user ID.

Auth: Requires a user credential with organization admin access. Authorization is enforced by the RawTree API. RawTree prevents removing the last organization admin.

Safety: This revokes the member's access to the organization. You MUST confirm the exact organization and member with the user before calling this tool.

NameRequiredDescriptionDefault
userIdYesMember user ID returned by list-organization-members.
organizationYesOrganization containing the member.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare destructiveHint=true and readOnlyHint=false; the description goes well beyond them by disclosing the authorization model (organization admin, enforced by the API), a server-side guard (RawTree prevents removing the last organization admin), and a required confirmation workflow. This is exactly the extra context a destructive mutation needs.

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

Conciseness5/5

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

Bold-labeled sections (Purpose/Returns/NOT for/Auth/Safety) front-load the action, then the exclusions, then the risk. Four short paragraphs, each carrying distinct information with no filler.

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

Completeness5/5

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

With no output schema, the description compensates by stating the return ('Whether the member was removed'). Auth, safety, alternatives, and prerequisites are all covered for a 2-parameter destructive tool.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it clarifies that userId must belong to an *accepted* member (not a pending invite) and that organization is the container being affected. That constraint affects which value is valid and is not fully captured by the schema's terse descriptions.

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

Purpose5/5

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

States a specific verb and resource ('Remove an accepted member from a RawTree organization') plus the effect ('revoke their organization access'). It explicitly distinguishes itself from the sibling list-organization-members and from invitation revocation, 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.

Usage Guidelines5/5

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

Gives an explicit exclusion ('NOT for: Revoking a pending invitation') and names the prerequisite tool (list-organization-members) needed to obtain the user ID. It also states the required credential level and a mandatory user-confirmation step, leaving no inference to the agent.

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

resume-clusterResume ClusterA
Destructive

Purpose: Request that a paused RawTree dedicated cluster resume.

Returns: The updated cluster, including its lifecycle status. Resuming continues asynchronously after the request is accepted. Use get-cluster to check one cluster's progress.

Auth: The RawTree API requires a user access token with organization admin access. Authorization is enforced by the API.

Safety: You MUST confirm the exact organization and cluster ID before calling this tool.

NameRequiredDescriptionDefault
clusterIdYesDedicated cluster ID returned by list-clusters.
organizationYesOrganization containing the cluster to resume.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and destructiveHint=true, signaling a mutating operation. The description adds important context beyond annotations: that resuming is asynchronous, it returns the updated cluster, and that the RawTree API requires an organization admin token. These details help the agent understand side effects and required permissions.

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

Conciseness4/5

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

The description is well-structured with bolded sections (Purpose, Returns, Auth, Safety) and is front-loaded with the core action. It is slightly verbose in the Safety section, but each sentence contributes useful information.

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

Completeness4/5

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

Given the complexity of a mutation tool and the lack of an output schema, the description covers the essential aspects: purpose, asynchronous behavior, return value, authorization requirements, and a safety warning. It is nearly complete, though it could mention error conditions or rate limits.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema already fully documents the two parameters (organization and clusterId). The description does not add any new semantic details about parameter formatting or constraints. 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.

Purpose5/5

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

The description states a specific action (resume) for a specific resource (paused RawTree dedicated cluster), clearly distinguishing it from the sibling pause-cluster. It names the required precondition ('paused') so the agent knows the tool only applies to paused clusters.

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

Usage Guidelines4/5

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

The description explicitly says to use get-cluster to check progress after resuming, and implies the tool is for paused clusters. It does not explicitly state when NOT to use it (e.g., for running clusters) or list alternatives like pause-cluster, but the context is sufficiently clear from the 'paused' precondition.

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

run-queryRun QueryA
Destructive

Execute one SQL statement through RawTree's Query API. Supports reads and the writes below; this tool can change data, table configuration, and access controls. Use the existing connection with sufficient permission; supported writes do not require a browser login or a different execution surface.

Supported statements and permissions:

  • SELECT, WITH, EXPLAIN, DESCRIBE: read_only, read_write, or admin API key, or a signed-in session. Database-role keys support reads subject to their database grants; they cannot execute the write families below. write_only keys cannot use this endpoint.

  • INSERT INTO [(columns)] SELECT ... (including a WITH source): read_write/admin or a signed-in session. The target must already exist in the selected user database. VALUES, FORMAT, and url()/urlCluster() sources are unsupported; use insert-json or insert-from-url for ingestion.

  • CREATE TABLE [IF NOT EXISTS] ENGINE = ReplicatedRawMergeTree [ORDER BY ]: admin API key or a signed-in session. No column definitions, engine arguments, other engines, AS SELECT, or other table clauses except optional ON CLUSTER 'default'.

  • ALTER TABLE MODIFY ORDER BY ; ADD/MATERIALIZE/CLEAR/DROP PROJECTION; ADD/MATERIALIZE/CLEAR/DROP INDEX (including text indexes): admin API key or a signed-in session. One operation per statement, on a table in the selected user database; no ON CLUSTER or IN PARTITION. ADD accepts IF NOT EXISTS; MATERIALIZE/CLEAR/DROP accept IF EXISTS. ADD INDEX requires an expression and TYPE, optionally positive integer GRANULARITY; AFTER is unsupported. Use storage paths such as __raw_data.field in index/projection definitions, with casts as needed.

  • KILL MUTATION WHERE table = '' [AND mutation_id = '']: admin API key or a signed-in session. The backend applies the selected user database automatically. Only these equality filters are supported; use doubled quotes, not backslash escapes, in string values.

  • CREATE ROLE , DROP ROLE [IF EXISTS] , GRANT SELECT/INSERT [(columns)] ON . TO : admin API key or organization administrator session. Grants can combine SELECT and INSERT and use database.* or .; the target must be an existing role, not a user. No role inheritance, delegation options, or REVOKE.

  • CREATE [OR REPLACE] WORKLOAD/RESOURCE, CREATE WORKLOAD/RESOURCE IF NOT EXISTS, DROP WORKLOAD/RESOURCE [IF EXISTS]: admin API key or organization administrator session. Workloads support IN and literal SETTINGS; resources support MASTER/WORKER THREAD and READ/WRITE DISK or ANY DISK operations.

  • CREATE SETTINGS PROFILE [OR REPLACE | IF NOT EXISTS], DROP SETTINGS PROFILE [IF EXISTS]: admin API key or organization administrator session. Only workload = '' and use_concurrency_control = 0/1, optionally READONLY/CONST, assigned TO 1–32 distinct existing roles.

  • CREATE ROW POLICY [OR REPLACE | IF NOT EXISTS], DROP ROW POLICY [IF EXISTS]: admin API key or organization administrator session. One table in the selected user database; SELECT USING a scalar filter, optional AS PERMISSIVE/RESTRICTIVE, TO 1–32 distinct existing roles. No subqueries, user targets, or wildcard targets.

  • CREATE NAMED COLLECTION [IF NOT EXISTS] AS key = literal, ...: admin API key or organization administrator session. Unique keys with string/numeric/boolean values and optional OVERRIDABLE/NOT OVERRIDABLE; no ALTER or DROP.

Role, workload/resource, profile, policy, and named-collection management accept optional ON CLUSTER 'default' and preserve the engine's replication semantics; row policies with ON CLUSTER require an explicit matching database.table. These management operations can affect the cluster beyond the selected database. All write families are unavailable in RawTree's internal organization. Other SQL mutations, including UPDATE, DELETE, DROP TABLE, and arbitrary ALTER, are unsupported; use delete-table for table deletion.

Returns JSON meta, data, rows, statistics, and optional hints. DDL normally returns an empty result; INSERT SELECT reports statistics.written_rows; KILL MUTATION returns matched mutations. MATERIALIZE/CLEAR run in the background: inspect system.mutations for progress and system.projections or system.data_skipping_indices for definitions. Repeating writes may duplicate data or change state; inspect results before retrying. For exploratory reads, use LIMIT and deterministic ORDER BY.

Detailed syntax and replication limits: https://rawtree.com/docs/reference/api and https://rawtree.com/docs/reference/authentication#existing-database-roles.

NameRequiredDescriptionDefault
sqlYesOne supported SQL statement to execute: a read query or an authorized INSERT SELECT, CREATE TABLE, ALTER TABLE, KILL MUTATION, or management statement listed in the tool description. Writes can change persistent state. Use LIMIT for exploratory reads.
clusterNoRawTree cluster to use for this operation.
databaseNoOptional RawTree database override. RawTree uses the default database when omitted.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.8/5.0
Behavior5/5

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

The annotations already mark this tool as non-read-only, non-idempotent, and destructive; the description adds substantial context beyond that, including permission requirements, data/state mutation risks, duplicate-write warnings, background operation behavior, and restrictions in internal organizations. It also explains what DDL and KILL MUTATION return, which is meaningful behavioral detail absent from annotations.

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

Conciseness5/5

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

Although long, the length is justified by the number of supported SQL families and permission combinations. The description is front-loaded with purpose and risk, then organized into readable bullet categories, with no obvious filler.

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

Completeness4/5

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

There is no output schema, and the description compensates well by explaining the JSON result shape, DDL empty results, INSERT SELECT written_rows, KILL MUTATION matched mutations, and background MATERIALIZE/CLEAR behavior. It is nearly complete, though some advanced SQL limitations are deferred to external documentation links.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds significant meaning for the sql parameter by enumerating the statement forms and constraints that are valid. It also clarifies database and organization targeting behavior, though cluster and organization semantics are largely already covered by schema descriptions.

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

Purpose5/5

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

The description opens with a specific verb and resource: "Execute one SQL statement through RawTree's Query API." It then enumerates supported read and write statement families, which clearly distinguishes this general SQL execution tool from siblings like insert-json, insert-from-url, and delete-table.

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

Usage Guidelines5/5

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

Usage is unusually explicit: it lists which statements are supported, which permissions each family requires, and which statements are unsupported. It also names alternatives for excluded operations, such as insert-json and insert-from-url for ingestion and delete-table for table deletion.

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

save-querySave QueryA
Destructive

Save SQL for reuse without executing it. Omit id to create a query; name, sql, and database are required. Visibility defaults to private. Supply id to update an existing query, with at least one of name, sql, database, or visibility. Omitted fields remain unchanged; null is invalid. Use the id returned by list-saved-queries or a previous save-query call.

Requires a user session or OAuth; API keys are not supported. The authenticated user owns new queries and can update only their own queries. Set visibility to cluster to share the definition with cluster members. Returns the saved query: id, organization_id, cluster_id, user_id, name, sql, database, visibility, created_at, and updated_at.

NameRequiredDescriptionDefault
idNoExisting query ID to update. Omit to create.
sqlNoSQL to save without executing. Required when creating.
nameNoQuery name. Required when creating.
clusterNoRawTree cluster to use for this operation.
databaseNoDatabase stored with the query. Required when creating; omit on update to keep the saved database.
visibilityNoprivate (default on create) or shared with the cluster. Omit on update to preserve visibility.
organizationNoRawTree organization containing the target cluster.

TDQS

A5/5.0
Behavior5/5

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

Beyond the annotations, it discloses auth constraints (user session or OAuth, no API keys), ownership rules (you own new queries and can update only your own), OS-level sharing semantics via visibility=cluster, partial-update semantics (omitted fields unchanged, null invalid), and the full return payload. Since no output schema exists, the field list is doing real work here.

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

Conciseness5/5

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

Two tight paragraphs: behavior and conditional requirements first, environment/permission constraints second. The enumerated return fields are long but earn their place because there is no output schema.

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

Completeness5/5

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

A 7-parameter mutation tool with no output schema and no required params is fully covered: create vs update paths, required-field rules, auth viability, ownership, sharing, and return shape all appear. An agent can invoke it correctly without further lookup, aside from organization/cluster which the schema documents.

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

Parameters5/5

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

Schema coverage is already 100%, so the baseline is 3; the description goes further by stating the conditional-required rules that the schema only hints at per-property ("Required when creating") and by declaring that update requires at least one field and that null is rejected. It also states the visibility default of private.

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

Purpose5/5

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

The very first sentence pins down a specific verb and resource plus a crucial negative behavior: "Save SQL for reuse without executing it." That single clause separates it from run-query and query-format, and the following sentences split the tool's two distinct modes (create without id, update with id).

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

Usage Guidelines5/5

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

The description gives concrete branch conditions: omit id to create (name, sql, database required), supply id to update with at least one of name/sql/database/visibility. It also tells the agent where to get an id (list-saved-queries or a prior save-query call), which removes the main inference an agent would otherwise have to make.

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

set-connector-statusSet Connector StatusA
DestructiveIdempotent

Purpose: Pause or resume every destination in one connector.

Behavior: paused removes the connector from the active runtime. active restores it with the same destination consumer groups, so Kafka resumes from their committed offsets subject to Kafka retention and at-least-once delivery.

Auth: Requires organization-admin access.

Safety: Confirm the exact organization, cluster, connector ID, and requested status. Pausing interrupts ingestion for all destinations until resumed.

NameRequiredDescriptionDefault
statusYes
clusterNoRawTree cluster to use for this operation.
connectorIdYesConnector ID returned by list-connectors or create-connector.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and idempotentHint=true, but the description adds substantial context: paused removes the connector from active runtime, active restores consumer groups with Kafka offset semantics (retention, at-least-once), auth requires org-admin, and pausing interrupts ingestion until resumed. This goes well beyond the structured annotations.

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

Conciseness5/5

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

Well-structured with bold headers and front-loaded purpose. Every sentence earns its place: behavior, auth, and safety each add distinct operational context. No wasted words.

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

Completeness4/5

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

Complete for a mutation tool with destructive annotations: purpose, behavior, auth, and safety are covered. The lack of output schema means return values could be mentioned, but for a status setter this is a minor gap.

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

Parameters4/5

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

Schema coverage is 75% (cluster, connectorId, organization have descriptions). The description explains the enum values for the status parameter—what 'paused' and 'active' do—adding meaning the schema lacks. It also reinforces required parameters via the safety note, though it does not add format/syntax details for the other parameters.

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

Purpose5/5

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

States a specific verb (pause/resume) and resource (every destination in one connector). No sibling tool performs the same connector-level status action; cluster pause/resume is clearly distinct by name and description. An agent can select it without opening the schema.

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

Usage Guidelines3/5

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

Implies usage through the purpose and safety note, but offers no explicit when-to-use vs alternatives or when-not-to-use. The safety instruction to confirm parameters adds practical guidance but is not a usage condition. No comparison to pause-cluster/resume-cluster or other connector tools.

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

uninstall-appUninstall AppA
DestructiveIdempotent

Purpose: Uninstall a RawTree app from one cluster and disable its native endpoints.

Returns: The app ID, display name, and installed state set to false.

Behavior: Uninstalling removes the app installation state. It does not delete existing data stored in the cluster.

Auth: Requires a user credential with organization admin access. Authorization is enforced by the RawTree API.

Safety: This makes the app's native endpoints unavailable for the cluster. You MUST confirm the exact organization, cluster name, and app ID with the user before calling this tool.

NameRequiredDescriptionDefault
appIdYesApp ID returned by list-apps.
clusterYesCluster name returned by list-clusters.
organizationYesOrganization containing the target cluster.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description goes further by clarifying that uninstall removes installation state but does NOT delete stored data, that native endpoints become unavailable, and that org-admin credentials are required – exactly the kind of beyond-annotation context that matters for a destructive operation.

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

Conciseness5/5

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

Front-loaded with labeled sections (Purpose, Returns, Behavior, Auth, Safety) that let an agent scan the operative facts quickly. Every section carries information the agent needs, including return values that are otherwise unavailable since no output schema exists.

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

Completeness5/5

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

For a destructive, 3-required-param mutation with no output schema, the description covers purpose, return shape, data-retention behavior, auth requirements, and a confirmation safeguard. Nothing material is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents organization, cluster, and appId (including provenance from list-apps/list-clusters). The description's mention of the three identifiers adds confirmation guidance but no new syntax or format detail, so the baseline of 3 applies.

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

Purpose5/5

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

States a precise verb+resource: uninstall a RawTree app from one cluster and disable its native endpoints. This is clearly distinguished from the sibling install-app and from cluster-level tools like pause-cluster.

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

Usage Guidelines4/5

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

Gives a clear precondition – the user must confirm organization, cluster, and app ID before calling – which implies the context of use. It stops short of explicitly contrasting with alternatives or stating when-not-to-use (e.g., pausing vs uninstalling).

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

update-clusterUpdate Cluster SettingsA
Idempotent

Purpose: Update the idle timeout for a RawTree dedicated cluster.

Returns: The updated cluster, including its effective idle timeout and current lifecycle status.

Behavior: idleTimeoutMinutes controls how many minutes of inactivity pass before the cluster automatically pauses. Use 0 to disable idling. Values from 15 through 43200 minutes are supported.

Auth: The RawTree API requires a user access token with organization admin access. Authorization is enforced by the API.

Safety: You MUST confirm the exact organization, cluster ID, and new idle timeout with the user before calling this tool.

NameRequiredDescriptionDefault
clusterIdYesDedicated cluster ID returned by list-clusters.
organizationYesOrganization containing the cluster to update.
idleTimeoutMinutesYesMinutes of inactivity before automatically pausing. Use 0 to disable idling.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly=false and idempotent=true, but the description adds substantial context beyond them: the auto-pause semantics (inactivity threshold), the supported range, the org-admin token requirement, and a mandatory user-confirmation safety step. It could say more about what happens to an already-paused cluster, but coverage is strong.

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

Conciseness5/5

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

Bolded, front-loaded sections (Purpose, Returns, Behavior, Auth, Safety) make it scannable, and every line carries actionable content with no filler.

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

Completeness4/5

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

With no output schema, the description usefully explains the return value ('the updated cluster, including its effective idle timeout'), and it covers auth and safety. Complete enough for a 3-param mutation tool, though return details are brief.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema: it clarifies that 0 disables idling and that the effective supported range is 15-43200 minutes, which refines the raw 0-43200 min/max in the schema.

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

Purpose4/5

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

The description states a specific verb and resource: 'Update the idle timeout for a RawTree dedicated cluster.' It is tightly scoped to a single field, which differentiates it from siblings like pause-cluster/resume-cluster, though it doesn't name those alternatives explicitly.

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

Usage Guidelines3/5

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

It explains how to use idleTimeoutMinutes (0 disables idling; 15-43200 supported), which implies intended usage, but it never states when to reach for this tool versus pause-cluster, resume-cluster, or create-cluster. Alternatives are left to inference.

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

update-federation-issuerUpdate Federation IssuerA
DestructiveIdempotent

Replace the complete configuration (PUT), not a partial update. Omitted optional fields are cleared. Changes invalidate existing workload access tokens. Returns an issuer object with its full configuration, id, organization_id, created_at and updated_at. Requires an organization admin using a user session or OAuth with full_access. API keys and workload tokens cannot manage federation configuration.

NameRequiredDescriptionDefault
idYes
nameYes
jwks_urlNoRequired for explicit_url; omit or null for discovery.
issuer_urlYesExact expected token issuer; do not normalize it.
descriptionNo
jwks_sourceNodiscovery
organizationYes

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the destructiveHint=true annotation, the description explains exactly what is destroyed — existing workload access tokens are invalidated — and that omitted optional fields are cleared rather than preserved. It also discloses the auth requirement (org admin via user session or OAuth with full_access) and explicitly rules out API keys and workload tokens, context the annotations cannot convey.

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

Conciseness5/5

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

Five short sentences, each carrying distinct load-bearing information: request semantics, field-clearing behavior, side effects, return shape, and authorization. The most decision-critical facts (PUT semantics, omitted fields cleared) are front-loaded and nothing is repeated from the schema or annotations.

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

Completeness4/5

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

With no output schema, the description correctly compensates by enumerating the returned issuer object fields, and it covers auth, side effects, and mutation semantics for a 7-parameter destructive tool. The remaining gap is parameter-level detail for the low-coverage schema (name, organization, id), which is the one area an agent could still get wrong.

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

Parameters3/5

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

Schema description coverage is only 29%, so only jwks_url and issuer_url carry inline meaning. The sentence "Omitted optional fields are cleared" adds real semantics for the three optional parameters (jwks_url, description, jwks_source), but name, organization, and id get no explanation in either place — e.g., whether organization is a slug or ID, or the format constraint on name.

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

Purpose5/5

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

"Replace the complete configuration (PUT), not a partial update" states a specific verb (replace/update) and resource (federation issuer config) and immediately resolves the ambiguity with update semantics that most similar tools leave implicit. Combined with the name and title, an agent knows exactly which operation this is and how it differs from a read (get-federation-issuer) or a rule update (update-federation-rule).

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

Usage Guidelines4/5

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

It clearly establishes the when/when-not boundary: full replacement only, omitted optional fields are cleared, and API keys or workload tokens cannot call it. It stops short of naming an alternative tool (e.g., get-federation-issuer to read current values before replacing), so the agent must infer the read-modify-write workflow from the sibling list.

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

update-federation-ruleUpdate Federation RuleA
DestructiveIdempotent

Replace the complete configuration (PUT), not a partial update. Omitted optional fields are cleared. Changes invalidate existing workload access tokens. Returns a rule object with its full configuration, id, organization_id, cluster_id, created_at and updated_at. Requires an organization admin using a user session or OAuth with full_access. API keys and workload tokens cannot manage federation configuration.

NameRequiredDescriptionDefault
idYes
nameYes
clusterYes
enabledYesWhether this rule permits workload token exchange.
databaseYesDefault database for this rule; not inherited from the MCP connection.
issuer_idYes
permissionNo
descriptionNo
organizationYes
principal_idYesYour own user ID or a service account ID in this organization.
database_rolesNo
principal_typeYes
claim_conditionsYes
allowed_audiencesYes

TDQS

A4/5.0
Behavior5/5

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

Beyond the annotations, it discloses the PUT replacement model, that omitted optional fields are cleared, that changes invalidate existing workload access tokens, the exact return shape, and a strict auth profile (org admin, user session or OAuth full_access, but not API keys or workload tokens). All of this is consistent with destructiveHint=true and idempotentHint=true, and it flags the token invalidation consequence that annotations cannot express.

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

Conciseness5/5

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

Four dense sentences, no filler, with the most consequential constraint (full replacement, not partial) front-loaded. Every sentence carries distinct information: replacement semantics, clearing behavior, token invalidation, return shape, and auth requirements.

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

Completeness4/5

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

For a destructive 14-parameter mutation with no output schema, the description covers the critical gaps: the return object's fields, the auth preconditions, and the side effect on workload tokens. The remaining gap is per-field meaning for the undocumented claim and audience parameters, which the description does not attempt.

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

Parameters3/5

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

With schema description coverage at only 21% across 14 parameters, the description must carry the burden. It contributes one genuinely important rule — that omitted optional fields (permission, description, database_roles) are cleared — but says nothing about claim_conditions, allowed_audiences, principal_type, issuer_id, or database_roles, leaving most of the surface undocumented.

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

Purpose4/5

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

The description states a specific operation and semantics: 'Replace the complete configuration (PUT), not a partial update' on a federation rule (resource is named by the title). It is clear what the tool does and how it differs from a hypothetical partial update, but it never names its actual siblings (create-federation-rule, delete-federation-rule) to disambiguate.

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

Usage Guidelines3/5

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

It establishes that this is a full-replacement operation and that omitted optional fields are cleared, which implicitly tells the agent when to prefer it over a partial update. However, there is no explicit guidance on when to use this versus create-federation-rule, delete-federation-rule, or update-federation-issuer, and no stated prerequisite flow such as fetching the current rule first.

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

update-organization-memberUpdate Organization MemberA
Destructive

Purpose: Change an accepted organization member's role to admin or member.

Returns: The member's updated role.

NOT for: Pending invitations. Use list-organization-members to identify an accepted member and obtain their user ID.

Auth: Requires a user credential with organization admin access. Authorization is enforced by the RawTree API. RawTree prevents demoting the last organization admin.

Safety: Changing a role can grant administrative privileges or revoke them. You MUST confirm the exact organization, member, and new role with the user before calling this tool.

NameRequiredDescriptionDefault
roleYesNew organization role: admin or member.
userIdYesMember user ID returned by list-organization-members.
organizationYesOrganization containing the member.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark this as a non-read-only, destructive operation. The description adds meaningful behavioral context beyond annotations: admin auth is required, RawTree prevents demoting the last admin, and user confirmation is mandated before calling.

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

Conciseness5/5

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

The description is front-loaded and organized into Purpose, Returns, NOT for, Auth, and Safety sections. Every sentence carries useful information for correct invocation, with no filler.

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

Completeness5/5

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

Given the schema, annotations, and absence of an output schema, the description is complete: it covers the operation, exclusions, return value, authorization, last-admin guard, and safety confirmation requirement.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema already documents user ID source, organization, and role enum. The description largely repeats that the role is admin or member and does not add syntax or format details beyond the structured fields.

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

Purpose5/5

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

The description states a specific verb and resource: 'Change an accepted organization member's role to admin or member.' It also distinguishes the target scope from pending invitations, so an agent can tell it apart from invite-handling siblings.

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

Usage Guidelines5/5

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

Explicitly says NOT for pending invitations and directs to list-organization-members to identify an accepted member. This gives both when-not guidance and the correct alternative tool, leaving little ambiguity.

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

update-tableUpdate TableA
Idempotent

Purpose: Change the sorting key of an existing RawTree table.

NOT for: Renaming a table, adding columns, or changing storage. Only the sorting key can be updated.

Returns: The database and table names plus the new sorting key.

Behavior: Provide a comma-separated SQL expression string in key order, lowest cardinality first. A bare name such as user.id is read as a path into the ingested JSON. The new key applies to newly inserted parts and wins later merges, so existing parts are re-sorted in the background instead of being rewritten by this call. Call describe-table first to see the current key.

Limits: The key must contain at least one expression; a table's sorting key cannot be removed once set. RawTree validates the SQL expressions and the engine may reject an unusable key.

Auth: Requires organization admin access. Authorization is enforced by the RawTree API.

Safety: You MUST confirm the exact table name and sorting expression order with the user before calling this tool.

NameRequiredDescriptionDefault
tableYesTable name to update.
clusterNoRawTree cluster to use for this operation.
databaseNoOptional RawTree database override. RawTree uses the default database when omitted.
sortingKeyYesComma-separated SQL sorting expressions in key order, for example "region, ifNull(cityHash64(host, instanceId), 0)". A bare name such as "user.id" is read as a path into the ingested JSON.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.6/5.0
Behavior4/5

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

Beyond the annotations, it discloses that existing parts are re-sorted in the background rather than rewritten, that the key applies only to newly inserted parts and wins later merges, and that a set key cannot be removed. It also states the org-admin auth requirement and that the engine may reject an unusable key. The behavior is consistent with readOnlyHint=false, idempotentHint=true, and destructiveHint=false, though it does not discuss error/retry behavior when validation fails.

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

Conciseness4/5

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

The labeled sections (Purpose, NOT for, Returns, Behavior, Limits, Auth, Safety) make it easy to scan and the critical routing information is front-loaded. It runs slightly long and partly restates the sortingKey schema description, but no section is wasted.

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

Completeness5/5

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

For a mutation tool with no output schema, the description supplies the return shape, the auth requirement, the irreversibility limit, background re-sort semantics, and the pre-call confirmation rule. An agent has everything needed to invoke it safely.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds ordering guidance ('lowest cardinality first') and the minimum-expression constraint that the schema does not state. It largely repeats the schema's note about comma-separated expressions and bare names resolving as JSON paths, so it is additive rather than transformative.

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

Purpose5/5

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

The first line names a specific verb and resource and narrows the scope to a single facet: changing the sorting key of a RawTree table. The 'NOT for' clause explicitly rules out renaming, adding columns, and storage changes, which distinguishes it from siblings like create-table and update-cluster.

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

Usage Guidelines5/5

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

It gives explicit when-not conditions, names describe-table as the prerequisite for inspecting the current key, and mandates user confirmation of the table name and key order before invocation. Nothing is left to inference about when this tool is appropriate.

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

update-workflowUpdate WorkflowA
Destructive

Update only supplied fields of an existing workflow; at least one changed field is required. Omitted fields remain unchanged. Set schedule.enabled=false to pause or schedule.enabled=true to resume; set schedule.cron to change the cadence. Supplying sinks replaces the whole list and may remove delivery targets. Read get-workflow before editing sinks so you can preserve their IDs. Already buffered deliveries can continue after pausing. Returns the workflow object: id, name, description, query, schedule, revision, created_at, updated_at, and sinks. The query object contains database and sql. schedule is null for manual-only workflows; otherwise it contains cron, enabled, and next_run_at (null while paused). Each sink has id, type, and settings. HTTP settings contain url (null when unreadable), url_configured, and header_names; header values are never returned. Table settings contain database and table. Slack settings contain integration_id, channel_id, and channel_name, resolved from Slack when the sink was saved. Requires an admin API key bound to the selected organization and cluster, or OAuth. Organization members may read; organization admins may create, update, or delete. Workflows execute with organization credentials and continue after the creating key is revoked or expires.

NameRequiredDescriptionDefault
idYesWorkflow ID returned by list-workflows, get-workflow, or create-workflow.
nameNo
queryNoOmit to preserve the query. Omitted database or sql fields retain their saved values.
sinksNoReplaces the entire list. Omit to preserve it; [] removes all. Preserve IDs when editing. Existing HTTP sinks may omit settings, settings.url, or settings.headers to retain them; table and Slack sinks always require settings. To keep an existing Slack sink unchanged without a Slack lookup, send back its saved integration_id and channel_id, not channel_name. Within a supplied settings.headers map, null preserves a stored value; omitted header names are removed.
clusterYesRawTree cluster to use for this operation.
scheduleNoOmit to preserve the schedule; null makes the workflow manual-only. Omitted cron or enabled keep their saved values. cron is required when scheduling a manual-only workflow.
descriptionNoOmit to preserve the description; null or blank clears it.
organizationYesRawTree organization containing the target cluster.

TDQS

A4.6/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: supplying sinks replaces the whole list and may remove delivery targets, buffered deliveries continue after pausing, header values are never returned, url is null when unreadable, and workflows keep executing with org credentials after the creating key is revoked. This is exactly the kind of destructive side effect (reinforcing destructiveHint=true) an agent needs before calling.

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

Conciseness4/5

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

Front-loaded with the omit/preserve rule, then pause/resume, then sink hazards, then return shape and auth. The return-value block is long, though with no output schema it earns its place; a few sink-type restatements could be trimmed without loss.

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

Completeness5/5

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

For an 8-parameter tool with deeply nested sinks, destructive semantics, and no output schema, the description covers mutation scope, nested-object hazards, the return shape (including nested query/schedule/sink fields), and credential requirements. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is already 88%, but the description contributes cross-parameter rules the schema cannot express: at-least-one-changed-field requirement, omit-to-preserve / null-to-clear semantics for schedule and description, sinks list replacement, and reading get-workflow first to preserve sink IDs. The per-field return-side details duplicate some schema info but the interaction rules add real value.

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

Purpose5/5

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

States a specific verb and resource ('Update only supplied fields of an existing workflow') plus the key constraint that at least one changed field is required. Combined with 'Omitted fields remain unchanged', an agent can distinguish this from create-workflow, get-workflow, and delete-workflow without touching the schema.

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

Usage Guidelines4/5

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

Gives concrete conditional guidance: use schedule.enabled=false/true to pause/resume, schedule.cron to change cadence, and 'Read get-workflow before editing sinks so you can preserve their IDs.' It also spells out the permission model (members read, admins create/update/delete). It does not explicitly exclude cases where delete-workflow or create-workflow would be the better call, so it falls short of the full when/when-not/alternatives bar.

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

verify-cluster-s3-accessVerify Cluster S3 AccessA
Idempotent

Purpose: Verify that RawTree can use a customer IAM role to access customer-owned S3 storage before cluster creation.

Returns: Whether access was verified and a human-readable result message.

Behavior: RawTree assumes roleArn using s3StorageAccess.externalId, checks the data and backup bucket locations, lists each configured path, and writes, reads, then removes a temporary probe object under each path. Paths are optional and default to the bucket root. Both configured buckets must be in the cluster environment's AWS region.

Auth: The RawTree API requires a user access token with organization admin access. Authorization is enforced by the API.

When to use: Use this tool after the IAM trust and permissions policies are configured and immediately before create-cluster whenever its optional s3Storage field will be provided. It is unnecessary when RawTree-managed storage will be used.

Safety: This check temporarily writes to and deletes from both configured destinations. Confirm the exact organization, buckets, paths, role ARN, and External ID before running it. The IAM trust policy's External ID must match s3StorageAccess.externalId exactly.

Reliability: The check is safe to retry. Newly changed IAM policies may require a short propagation delay before verification succeeds.

NameRequiredDescriptionDefault
regionIdNoRegion ID returned by list-regions. Use the same region for sizes, S3 verification and creation. Omit for the default backend.
s3StorageYesCustomer-owned S3 configuration to verify before cluster creation.
organizationYesOrganization that will own the cluster.
s3StorageAccessYes

TDQS

A4.8/5.0
Behavior5/5

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

Adds substantial detail beyond the annotations: it discloses that the check temporarily writes, reads, and deletes a probe object under each path, that both buckets must live in the cluster's AWS region, the admin-token requirement, and that new IAM policies may need propagation time. This also reconciles the destructiveHint=false annotation with the described temporary writes — a genuinely important disclosure for an agent about to touch customer buckets.

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

Conciseness4/5

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

Bold section headers front-load purpose, return, behavior, auth, and safety, so an agent can scan to the needed part. Slightly long, with some overlap between the Behavior and Safety sections, but no filler.

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

Completeness5/5

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

Covers return value shape despite no output schema, documents auth, retry semantics, and the nested data/backups/roleArn structure, and flags the exact preconditions (region matching, External ID match). Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

With 75% schema coverage the baseline is 3, and the description goes further: it explains that paths are optional and default to the bucket root, that the trust policy's External ID must equal s3StorageAccess.externalId exactly, and that roleArn is assumed using that External ID. It does not explain regionId or resourceTag, which remain schema-only.

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

Purpose5/5

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

States a specific verb and resource: verify that RawTree can assume a customer IAM role and access customer-owned S3 before cluster creation. The pre-cluster-creation framing distinguishes it from the sibling verify-database-s3-access and from create-cluster itself.

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

Usage Guidelines5/5

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

Explicit sequencing guidance ('after the IAM trust and permissions policies are configured and immediately before create-cluster whenever its optional s3Storage field will be provided') plus an explicit exclusion ('unnecessary when RawTree-managed storage will be used'). No inference required.

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

verify-database-s3-accessVerify Database S3 AccessA
Idempotent

Purpose: Verify that RawTree can use a customer IAM role to access customer-owned S3 storage before creating a database.

Returns: Whether access was verified and a human-readable result message.

Behavior: RawTree assumes roleArn using the cluster's saved external_id, checks the data and backup bucket locations, lists each configured path, and writes, reads, then removes a temporary probe object under each path. Paths are optional and default to the bucket root. Both configured buckets must be in the cluster environment's AWS region.

Safety: This check temporarily writes to and deletes from both configured destinations. Confirm the exact organization, cluster, database name, buckets, paths, role ARN, and External ID before running it. The IAM trust policy's External ID must match the cluster's saved external_id exactly; this tool does not accept an identity override.

Auth: Organization-admin access is required. Authorization is enforced by the RawTree API.

Reliability: The check is safe to retry. Newly changed IAM policies may require a short propagation delay before verification succeeds.

NameRequiredDescriptionDefault
nameYesDatabase name to verify customer-owned S3 storage for.
clusterNoRawTree cluster to use for this operation.
s3StorageYesCustomer-owned S3 configuration to verify for the database.
organizationNoRawTree organization containing the target cluster.

TDQS

A4.3/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the actual mechanics: role assumption with the cluster's saved external_id, listing each path, and write/read/delete of a temporary probe object in both buckets. It also adds non-obvious constraints the annotations cannot express (both buckets must be in the cluster's AWS region, external_id must match exactly, no identity override, admin auth required, retry-safe, IAM propagation delay) and is consistent with idempotentHint=true.

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

Conciseness4/5

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

Bold headers (Purpose/Returns/Behavior/Safety/Auth/Reliability) front-load the essentials and make scanning easy. The Safety paragraph is slightly repetitive in listing every identifier to confirm, but the redundancy is defensible for a tool that writes to customer buckets.

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

Completeness5/5

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

With no output schema, the description still explains the return value (verification boolean plus human-readable message). Combined with auth requirements, retry semantics, region constraints, and the exact probe behavior, an agent has everything needed to decide whether to call it and what will happen on disk.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: paths are optional and default to bucket root, roleArn is assumed using the cluster's saved external_id (not a caller-supplied value), and both configured buckets must reside in the cluster environment's region. It does not mention the optional `cluster` parameter or how organization/cluster resolution interacts, which is the main remaining gap.

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

Purpose4/5

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

States a specific verb (verify), resource (customer IAM role access to customer-owned S3 via RawTree), and the pre-condition context (before creating a database). It does not explicitly distinguish itself from the sibling verify-cluster-s3-access, which covers a nearly identical check at the cluster level, leaving that differentiation to inference from the name.

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

Usage Guidelines4/5

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

Clearly frames the tool as a pre-flight check to run before create-database, and the Safety section tells the agent to confirm all identifiers before running. It does not name verify-cluster-s3-access as the alternative for cluster-level verification, so the cluster-vs-database routing decision is only implied.

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

Tool Schema Changelog

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

  1. 17 tool updatesv0.4.3
    • Addedcreate-federation-issuer
    • Addedcreate-federation-rule
    • Addedcreate-service-account
    • Changedcreate-workflow2 fields changed
      • changedInput schema / properties / sinks / description
        Previous value: -"Up to five sinks. Omit for none. New HTTP sinks require settings.url; all sink IDs are assigned by the API."New value: +"Up to five sinks. Omit for none. New HTTP sinks require settings.url. Slack sinks post a summary and a preview of the result rows through an organization Slack integration from list-integrations. Give the channel as channel_name (such as \"#alerts\"), or as channel_id; search channels with list-slack-channels and name. A name is resolved to its channel ID on every save, and only the ID is stored. Each Slack sink must use a distinct integration and channel. All sink IDs are assigned by the API."
      • changedInput schema / properties / sinks / items / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "settings": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "headers": {
        -            "additionalProperties": {
        -              "type": "string"
        -            },
        -            "propertyNames": {
        -              "type": "string"
        -            },
        -            "type": "object"
        -          },
        -          "url": {
        -            "description": "Write-only sink URL. The API validates allowed origins.",
        -            "format": "uri",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "url"
        -        ],
        -        "type": "object"
        -      },
        -      "type": {
        -        "const": "http",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "settings"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "settings": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "database": {
        -            "pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
        -            "type": "string"
        -          },
        -          "table": {
        -            "pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "database",
        -          "table"
        -        ],
        -        "type": "object"
        -      },
        -      "type": {
        -        "const": "table",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "settings"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "settings": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "headers": {
        +            "additionalProperties": {
        +              "type": "string"
        +            },
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "url": {
        +            "description": "Write-only sink URL. The API validates allowed origins.",
        +            "format": "uri",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "http",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "settings"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "settings": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "database": {
        +            "pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
        +            "type": "string"
        +          },
        +          "table": {
        +            "pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "database",
        +          "table"
        +        ],
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "table",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "settings"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "settings": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "channel_name": {
        +                "description": "Slack channel name, such as #alerts. Resolved to its channel ID on every save.",
        +                "type": "string"
        +              },
        +              "integration_id": {
        +                "description": "Slack integration connected to the organization, from list-integrations. list-integrations needs a user credential such as OAuth; with an API key, reuse the integration_id of an existing Slack sink or ask the user for it.",
        +                "format": "uuid",
        +                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "integration_id",
        +              "channel_name"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "channel_id": {
        +                "description": "Slack channel ID, such as C0123456789. Send back the saved channel_id to keep an existing sink without a Slack lookup.",
        +                "pattern": "^[A-Z0-9]{2,64}$",
        +                "type": "string"
        +              },
        +              "integration_id": {
        +                "description": "Slack integration connected to the organization, from list-integrations. list-integrations needs a user credential such as OAuth; with an API key, reuse the integration_id of an existing Slack sink or ask the user for it.",
        +                "format": "uuid",
        +                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "integration_id",
        +              "channel_id"
        +            ],
        +            "type": "object"
        +          }
        +        ],
        +        "description": "integration_id and exactly one of channel_name or channel_id. The RawTree app must be a member of private channels."
        +      },
        +      "type": {
        +        "const": "slack",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "settings"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Addeddelete-federation-issuer
    • Addeddelete-federation-rule
    • Addedget-federation-issuer
    • Addedget-federation-rule
    • Addedlist-federation-issuers
    • Addedlist-federation-rules
    • Addedlist-integrations
    • Addedlist-service-accounts
    • Addedlist-slack-channels
    • Changedrun-query1 field changed
      • changedInput schema / properties / sql / description
        Previous value: -"Read-only SQL to execute. Prefer bounded SELECT queries with LIMIT for exploration."New value: +"One supported SQL statement to execute: a read query or an authorized INSERT SELECT, CREATE TABLE, ALTER TABLE, KILL MUTATION, or management statement listed in the tool description. Writes can change persistent state. Use LIMIT for exploratory reads."
    • Addedupdate-federation-issuer
    • Addedupdate-federation-rule
    • Changedupdate-workflow2 fields changed
      • changedInput schema / properties / sinks / description
        Previous value: -"Replaces the entire list. Omit to preserve it; [] removes all. Preserve IDs when editing. Existing HTTP sinks may omit settings, settings.url, or settings.headers to retain them. Within a supplied settings.headers map, null preserves a stored value; omitted header names are removed."New value: +"Replaces the entire list. Omit to preserve it; [] removes all. Preserve IDs when editing. Existing HTTP sinks may omit settings, settings.url, or settings.headers to retain them; table and Slack sinks always require settings. To keep an existing Slack sink unchanged without a Slack lookup, send back its saved integration_id and channel_id, not channel_name. Within a supplied settings.headers map, null preserves a stored value; omitted header names are removed."
      • changedInput schema / properties / sinks / items / anyOf
        Previous value: -[
        -  {
        -    "oneOf": [
        -      {
        -        "additionalProperties": false,
        -        "properties": {
        -          "settings": {
        -            "additionalProperties": false,
        -            "properties": {
        -              "headers": {
        -                "additionalProperties": {
        -                  "type": "string"
        -                },
        -                "propertyNames": {
        -                  "type": "string"
        -                },
        -                "type": "object"
        -              },
        -              "url": {
        -                "description": "Write-only sink URL. The API validates allowed origins.",
        -                "format": "uri",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "url"
        -            ],
        -            "type": "object"
        -          },
        -          "type": {
        -            "const": "http",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "type",
        -          "settings"
        -        ],
        -        "type": "object"
        -      },
        -      {
        -        "additionalProperties": false,
        -        "properties": {
        -          "settings": {
        -            "additionalProperties": false,
        -            "properties": {
        -              "database": {
        -                "pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
        -                "type": "string"
        -              },
        -              "table": {
        -                "pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "database",
        -              "table"
        -            ],
        -            "type": "object"
        -          },
        -          "type": {
        -            "const": "table",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "type",
        -          "settings"
        -        ],
        -        "type": "object"
        -      }
        -    ]
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "id": {
        -        "format": "uuid",
        -        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        -        "type": "string"
        -      },
        -      "settings": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "headers": {
        -            "additionalProperties": {
        -              "anyOf": [
        -                {
        -                  "type": "string"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ]
        -            },
        -            "propertyNames": {
        -              "type": "string"
        -            },
        -            "type": "object"
        -          },
        -          "url": {
        -            "description": "Write-only sink URL. The API validates allowed origins.",
        -            "format": "uri",
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "type": {
        -        "const": "http",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "id"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "id": {
        -        "format": "uuid",
        -        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        -        "type": "string"
        -      },
        -      "settings": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "database": {
        -            "pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
        -            "type": "string"
        -          },
        -          "table": {
        -            "pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "database",
        -          "table"
        -        ],
        -        "type": "object"
        -      },
        -      "type": {
        -        "const": "table",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "settings",
        -      "id"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "oneOf": [
        +      {
        +        "additionalProperties": false,
        +        "properties": {
        +          "settings": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "headers": {
        +                "additionalProperties": {
        +                  "type": "string"
        +                },
        +                "propertyNames": {
        +                  "type": "string"
        +                },
        +                "type": "object"
        +              },
        +              "url": {
        +                "description": "Write-only sink URL. The API validates allowed origins.",
        +                "format": "uri",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "url"
        +            ],
        +            "type": "object"
        +          },
        +          "type": {
        +            "const": "http",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "type",
        +          "settings"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "additionalProperties": false,
        +        "properties": {
        +          "settings": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "database": {
        +                "pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
        +                "type": "string"
        +              },
        +              "table": {
        +                "pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "database",
        +              "table"
        +            ],
        +            "type": "object"
        +          },
        +          "type": {
        +            "const": "table",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "type",
        +          "settings"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "additionalProperties": false,
        +        "properties": {
        +          "settings": {
        +            "anyOf": [
        +              {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "channel_name": {
        +                    "description": "Slack channel name, such as #alerts. Resolved to its channel ID on every save.",
        +                    "type": "string"
        +                  },
        +                  "integration_id": {
        +                    "description": "Slack integration connected to the organization, from list-integrations. list-integrations needs a user credential such as OAuth; with an API key, reuse the integration_id of an existing Slack sink or ask the user for it.",
        +                    "format": "uuid",
        +                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "integration_id",
        +                  "channel_name"
        +                ],
        +                "type": "object"
        +              },
        +              {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "channel_id": {
        +                    "description": "Slack channel ID, such as C0123456789. Send back the saved channel_id to keep an existing sink without a Slack lookup.",
        +                    "pattern": "^[A-Z0-9]{2,64}$",
        +                    "type": "string"
        +                  },
        +                  "integration_id": {
        +                    "description": "Slack integration connected to the organization, from list-integrations. list-integrations needs a user credential such as OAuth; with an API key, reuse the integration_id of an existing Slack sink or ask the user for it.",
        +                    "format": "uuid",
        +                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "integration_id",
        +                  "channel_id"
        +                ],
        +                "type": "object"
        +              }
        +            ],
        +            "description": "integration_id and exactly one of channel_name or channel_id. The RawTree app must be a member of private channels."
        +          },
        +          "type": {
        +            "const": "slack",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "type",
        +          "settings"
        +        ],
        +        "type": "object"
        +      }
        +    ]
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "format": "uuid",
        +        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +        "type": "string"
        +      },
        +      "settings": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "headers": {
        +            "additionalProperties": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "url": {
        +            "description": "Write-only sink URL. The API validates allowed origins.",
        +            "format": "uri",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "http",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "format": "uuid",
        +        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +        "type": "string"
        +      },
        +      "settings": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "database": {
        +            "pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
        +            "type": "string"
        +          },
        +          "table": {
        +            "pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "database",
        +          "table"
        +        ],
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "table",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "settings",
        +      "id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "format": "uuid",
        +        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +        "type": "string"
        +      },
        +      "settings": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "channel_name": {
        +                "description": "Slack channel name, such as #alerts. Resolved to its channel ID on every save.",
        +                "type": "string"
        +              },
        +              "integration_id": {
        +                "description": "Slack integration connected to the organization, from list-integrations. list-integrations needs a user credential such as OAuth; with an API key, reuse the integration_id of an existing Slack sink or ask the user for it.",
        +                "format": "uuid",
        +                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "integration_id",
        +              "channel_name"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "channel_id": {
        +                "description": "Slack channel ID, such as C0123456789. Send back the saved channel_id to keep an existing sink without a Slack lookup.",
        +                "pattern": "^[A-Z0-9]{2,64}$",
        +                "type": "string"
        +              },
        +              "integration_id": {
        +                "description": "Slack integration connected to the organization, from list-integrations. list-integrations needs a user credential such as OAuth; with an API key, reuse the integration_id of an existing Slack sink or ask the user for it.",
        +                "format": "uuid",
        +                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "integration_id",
        +              "channel_id"
        +            ],
        +            "type": "object"
        +          }
        +        ],
        +        "description": "integration_id and exactly one of channel_name or channel_id. The RawTree app must be a member of private channels."
        +      },
        +      "type": {
        +        "const": "slack",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "settings",
        +      "id"
        +    ],
        +    "type": "object"
        +  }
        +]
  2. 18 tool updatesv0.4.2
    • Changedcreate-api-key1 field changed
      • addedInput schema / properties / expires_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Optional expiration as a future RFC 3339 timestamp with a timezone. The API validates and normalizes it to UTC. Omit or use null to never expire. Expiration cannot be updated; create a replacement key to change it."
        +}
    • Changedcreate-cluster16 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / databaseS3Access
        Removed value: -{
        -  "description": "Optional independent per-database S3 capability. It may be supplied without s3Storage. Apply the databaseBucketTag to each customer-owned database bucket; if s3Storage is also supplied, externalId must match.",
        -  "properties": {
        -    "databaseBucketTag": {
        -      "description": "Lowercase tag value applied to every customer-owned database bucket as rawtree.com/cluster=<value>.",
        -      "maxLength": 256,
        -      "minLength": 1,
        -      "pattern": "^[a-z0-9][a-z0-9-]*$",
        -      "type": "string"
        -    },
        -    "externalId": {
        -      "description": "External ID used by customer IAM role trust policies. It must exactly match the cluster S3 storage External ID when both are configured.",
        -      "maxLength": 1224,
        -      "minLength": 2,
        -      "pattern": "^[A-Za-z0-9_+=,.@:/-]+$",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "externalId",
        -    "databaseBucketTag"
        -  ],
        -  "type": "object"
        -}
      • addedInput schema / properties / regionId
        Added value: +{
        +  "description": "Region ID returned by list-regions. Use the same region for sizes, S3 verification and creation. Omit for the default backend.",
        +  "format": "uuid",
        +  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +  "type": "string"
        +}
      • addedInput schema / properties / s3Storage / additionalProperties
        Added value: +false
      • addedInput schema / properties / s3Storage / properties / backups / additionalProperties
        Added value: +false
      • changedInput schema / properties / s3Storage / properties / backups / description
        Previous value: -"Customer-owned bucket and optional key prefix for backups."New value: +"Destination for backups."
      • addedInput schema / properties / s3Storage / properties / backups / properties / bucket / description
        Added value: +"Customer-owned S3 bucket."
      • addedInput schema / properties / s3Storage / properties / backups / properties / path / description
        Added value: +"Optional object-key prefix; defaults to the bucket root."
      • addedInput schema / properties / s3Storage / properties / data / additionalProperties
        Added value: +false
      • changedInput schema / properties / s3Storage / properties / data / description
        Previous value: -"Customer-owned bucket and optional key prefix for data."New value: +"Destination for table data."
      • addedInput schema / properties / s3Storage / properties / data / properties / bucket / description
        Added value: +"Customer-owned S3 bucket."
      • addedInput schema / properties / s3Storage / properties / data / properties / path / description
        Added value: +"Optional object-key prefix; defaults to the bucket root."
      • removedInput schema / properties / s3Storage / properties / externalId
        Removed value: -{
        -  "description": "External ID required by the IAM role trust policy. It must exactly match the value configured in AWS.",
        -  "maxLength": 1224,
        -  "minLength": 2,
        -  "pattern": "^[A-Za-z0-9_+=,.@:/-]+$",
        -  "type": "string"
        -}
      • changedInput schema / properties / s3Storage / properties / roleArn / description
        Previous value: -"ARN of the customer IAM role that RawTree may assume to access the configured buckets."New value: +"ARN of the customer IAM role RawTree may assume."
      • changedInput schema / properties / s3Storage / required
        Previous value: -[
        -  "data",
        -  "backups",
        -  "roleArn",
        -  "externalId"
        -]New value: +[
        +  "data",
        +  "backups",
        +  "roleArn"
        +]
      • addedInput schema / properties / s3StorageAccess
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Creation-only S3 storage identity overrides. Omit to let the API generate values. Custom storage requires externalId matching verification.",
        +  "properties": {
        +    "externalId": {
        +      "description": "Immutable S3 storage External ID. The API generates it when omitted for managed storage; required for custom storage.",
        +      "maxLength": 1224,
        +      "minLength": 2,
        +      "pattern": "^[A-Za-z0-9_+=,.@:/-]+$",
        +      "type": "string"
        +    },
        +    "resourceTag": {
        +      "description": "Immutable rawtree.com/cluster tag value for S3 storage access. Generated by the API when omitted.",
        +      "maxLength": 256,
        +      "minLength": 1,
        +      "pattern": "^[a-z0-9][a-z0-9-]*$",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcreate-database13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / s3Storage / additionalProperties
        Added value: +false
      • addedInput schema / properties / s3Storage / properties / backups / additionalProperties
        Added value: +false
      • changedInput schema / properties / s3Storage / properties / backups / description
        Previous value: -"Customer-owned bucket and optional key prefix for backups."New value: +"Destination for backups."
      • addedInput schema / properties / s3Storage / properties / backups / properties / bucket / description
        Added value: +"Customer-owned S3 bucket."
      • addedInput schema / properties / s3Storage / properties / backups / properties / path / description
        Added value: +"Optional object-key prefix; defaults to the bucket root."
      • addedInput schema / properties / s3Storage / properties / data / additionalProperties
        Added value: +false
      • changedInput schema / properties / s3Storage / properties / data / description
        Previous value: -"Customer-owned bucket and optional key prefix for data."New value: +"Destination for table data."
      • addedInput schema / properties / s3Storage / properties / data / properties / bucket / description
        Added value: +"Customer-owned S3 bucket."
      • addedInput schema / properties / s3Storage / properties / data / properties / path / description
        Added value: +"Optional object-key prefix; defaults to the bucket root."
      • removedInput schema / properties / s3Storage / properties / externalId
        Removed value: -{
        -  "description": "External ID required by the IAM role trust policy. It must exactly match the value configured in AWS.",
        -  "maxLength": 1224,
        -  "minLength": 2,
        -  "pattern": "^[A-Za-z0-9_+=,.@:/-]+$",
        -  "type": "string"
        -}
      • changedInput schema / properties / s3Storage / properties / roleArn / description
        Previous value: -"ARN of the customer IAM role that RawTree may assume to access the configured buckets."New value: +"ARN of the customer IAM role RawTree may assume."
      • changedInput schema / properties / s3Storage / required
        Previous value: -[
        -  "data",
        -  "backups",
        -  "roleArn",
        -  "externalId"
        -]New value: +[
        +  "data",
        +  "backups",
        +  "roleArn"
        +]
    • Changedcreate-table2 fields changed
      • removedInput schema / properties / s3Storage
        Removed value: -{
        -  "description": "Optional per-table S3 override. Omit to inherit the database or cluster's default storage.",
        -  "properties": {
        -    "backups": {
        -      "description": "Customer-owned bucket and optional key prefix for backups.",
        -      "properties": {
        -        "bucket": {
        -          "maxLength": 63,
        -          "minLength": 3,
        -          "type": "string"
        -        },
        -        "path": {
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "bucket"
        -      ],
        -      "type": "object"
        -    },
        -    "data": {
        -      "description": "Customer-owned bucket and optional key prefix for data.",
        -      "properties": {
        -        "bucket": {
        -          "maxLength": 63,
        -          "minLength": 3,
        -          "type": "string"
        -        },
        -        "path": {
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "bucket"
        -      ],
        -      "type": "object"
        -    },
        -    "externalId": {
        -      "description": "External ID required by the IAM role trust policy. It must exactly match the value configured in AWS.",
        -      "maxLength": 1224,
        -      "minLength": 2,
        -      "pattern": "^[A-Za-z0-9_+=,.@:/-]+$",
        -      "type": "string"
        -    },
        -    "roleArn": {
        -      "description": "ARN of the customer IAM role that RawTree may assume to access the configured buckets.",
        -      "minLength": 1,
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "data",
        -    "backups",
        -    "roleArn",
        -    "externalId"
        -  ],
        -  "type": "object"
        -}
      • addedInput schema / properties / sortingKey
        Added value: +{
        +  "description": "Optional comma-separated SQL sorting expressions in key order. Omit it to let the table pick a key per part from the ingested data.",
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Addedcreate-workflow
    • Addeddelete-saved-query
    • Addeddelete-workflow
    • Addedget-workflow
    • Changedlist-cluster-sizes2 fields changed
      • addedInput schema / properties / organization
        Added value: +{
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / regionId
        Added value: +{
        +  "description": "Region ID returned by list-regions. Use the same region for sizes, S3 verification and creation. Omit for the default backend.",
        +  "format": "uuid",
        +  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +  "type": "string"
        +}
    • Addedlist-regions
    • Addedlist-saved-queries
    • Addedlist-workflows
    • Addedquery-format
    • Addedsave-query
    • Addedupdate-table
    • Addedupdate-workflow
    • Changedverify-cluster-s3-access16 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / regionId
        Added value: +{
        +  "description": "Region ID returned by list-regions. Use the same region for sizes, S3 verification and creation. Omit for the default backend.",
        +  "format": "uuid",
        +  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +  "type": "string"
        +}
      • addedInput schema / properties / s3Storage / additionalProperties
        Added value: +false
      • addedInput schema / properties / s3Storage / properties / backups / additionalProperties
        Added value: +false
      • changedInput schema / properties / s3Storage / properties / backups / description
        Previous value: -"Customer-owned bucket and optional key prefix for backups."New value: +"Destination for backups."
      • addedInput schema / properties / s3Storage / properties / backups / properties / bucket / description
        Added value: +"Customer-owned S3 bucket."
      • addedInput schema / properties / s3Storage / properties / backups / properties / path / description
        Added value: +"Optional object-key prefix; defaults to the bucket root."
      • addedInput schema / properties / s3Storage / properties / data / additionalProperties
        Added value: +false
      • changedInput schema / properties / s3Storage / properties / data / description
        Previous value: -"Customer-owned bucket and optional key prefix for data."New value: +"Destination for table data."
      • addedInput schema / properties / s3Storage / properties / data / properties / bucket / description
        Added value: +"Customer-owned S3 bucket."
      • addedInput schema / properties / s3Storage / properties / data / properties / path / description
        Added value: +"Optional object-key prefix; defaults to the bucket root."
      • removedInput schema / properties / s3Storage / properties / externalId
        Removed value: -{
        -  "description": "External ID required by the IAM role trust policy. It must exactly match the value configured in AWS.",
        -  "maxLength": 1224,
        -  "minLength": 2,
        -  "pattern": "^[A-Za-z0-9_+=,.@:/-]+$",
        -  "type": "string"
        -}
      • changedInput schema / properties / s3Storage / properties / roleArn / description
        Previous value: -"ARN of the customer IAM role that RawTree may assume to access the configured buckets."New value: +"ARN of the customer IAM role RawTree may assume."
      • changedInput schema / properties / s3Storage / required
        Previous value: -[
        -  "data",
        -  "backups",
        -  "roleArn",
        -  "externalId"
        -]New value: +[
        +  "data",
        +  "backups",
        +  "roleArn"
        +]
      • addedInput schema / properties / s3StorageAccess
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "externalId": {
        +      "description": "Immutable cluster External ID. Use this exact value in customer IAM role trust policies.",
        +      "maxLength": 1224,
        +      "minLength": 2,
        +      "pattern": "^[A-Za-z0-9_+=,.@:/-]+$",
        +      "type": "string"
        +    },
        +    "resourceTag": {
        +      "description": "Immutable rawtree.com/cluster tag value for S3 storage access. Generated by the API when omitted.",
        +      "maxLength": 256,
        +      "minLength": 1,
        +      "pattern": "^[a-z0-9][a-z0-9-]*$",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "externalId"
        +  ],
        +  "type": "object"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "organization",
        -  "s3Storage"
        -]New value: +[
        +  "organization",
        +  "s3StorageAccess",
        +  "s3Storage"
        +]
    • Changedverify-database-s3-access13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / s3Storage / additionalProperties
        Added value: +false
      • addedInput schema / properties / s3Storage / properties / backups / additionalProperties
        Added value: +false
      • changedInput schema / properties / s3Storage / properties / backups / description
        Previous value: -"Customer-owned bucket and optional key prefix for backups."New value: +"Destination for backups."
      • addedInput schema / properties / s3Storage / properties / backups / properties / bucket / description
        Added value: +"Customer-owned S3 bucket."
      • addedInput schema / properties / s3Storage / properties / backups / properties / path / description
        Added value: +"Optional object-key prefix; defaults to the bucket root."
      • addedInput schema / properties / s3Storage / properties / data / additionalProperties
        Added value: +false
      • changedInput schema / properties / s3Storage / properties / data / description
        Previous value: -"Customer-owned bucket and optional key prefix for data."New value: +"Destination for table data."
      • addedInput schema / properties / s3Storage / properties / data / properties / bucket / description
        Added value: +"Customer-owned S3 bucket."
      • addedInput schema / properties / s3Storage / properties / data / properties / path / description
        Added value: +"Optional object-key prefix; defaults to the bucket root."
      • removedInput schema / properties / s3Storage / properties / externalId
        Removed value: -{
        -  "description": "External ID required by the IAM role trust policy. It must exactly match the value configured in AWS.",
        -  "maxLength": 1224,
        -  "minLength": 2,
        -  "pattern": "^[A-Za-z0-9_+=,.@:/-]+$",
        -  "type": "string"
        -}
      • changedInput schema / properties / s3Storage / properties / roleArn / description
        Previous value: -"ARN of the customer IAM role that RawTree may assume to access the configured buckets."New value: +"ARN of the customer IAM role RawTree may assume."
      • changedInput schema / properties / s3Storage / required
        Previous value: -[
        -  "data",
        -  "backups",
        -  "roleArn",
        -  "externalId"
        -]New value: +[
        +  "data",
        +  "backups",
        +  "roleArn"
        +]
  3. 39 tool updatesv0.3.2
    • Addedadd-connector-destination
    • Addedadd-organization-member
    • Removedcheck-health
    • Changedcreate-api-key4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / cluster
        Added value: +{
        +  "description": "RawTree cluster to use for this operation.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / database
        Added value: +{
        +  "description": "Optional default database for the new key. RawTree uses the default database when omitted.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / organization
        Added value: +{
        +  "description": "RawTree organization containing the target cluster.",
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Addedcreate-cluster
    • Addedcreate-connector
    • Addedcreate-database
    • Addedcreate-table
    • Changeddelete-api-key5 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / cluster
        Added value: +{
        +  "description": "RawTree cluster to use for this operation.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / confirm
        Removed value: -{
        -  "description": "Set to true only after the user explicitly confirms revocation of this exact API key.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / organization
        Added value: +{
        +  "description": "RawTree organization containing the target cluster.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "idOrApiKey",
        -  "confirm"
        -]New value: +[
        +  "idOrApiKey"
        +]
    • Addeddelete-database
    • Changeddelete-table6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / cluster
        Added value: +{
        +  "description": "RawTree cluster to use for this operation.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / confirm
        Removed value: -{
        -  "description": "Set to true only after the user explicitly confirms deletion of this exact table.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / database
        Added value: +{
        +  "description": "Optional RawTree database override. RawTree uses the default database when omitted.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / organization
        Added value: +{
        +  "description": "RawTree organization containing the target cluster.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "table",
        -  "confirm"
        -]New value: +[
        +  "table"
        +]
    • Changeddescribe-table4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / cluster
        Added value: +{
        +  "description": "RawTree cluster to use for this operation.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / database
        Added value: +{
        +  "description": "Optional RawTree database override. RawTree uses the default database when omitted.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / organization
        Added value: +{
        +  "description": "RawTree organization containing the target cluster.",
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Removedget_project
    • Addedget-cluster
    • Addedget-connector
    • Addedget-connector-metrics
    • Changedinsert-from-url4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / cluster
        Added value: +{
        +  "description": "RawTree cluster to use for this operation.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / database
        Added value: +{
        +  "description": "Optional RawTree database override. RawTree uses the default database when omitted.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / organization
        Added value: +{
        +  "description": "RawTree organization containing the target cluster.",
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Changedinsert-json6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / cluster
        Added value: +{
        +  "description": "RawTree cluster to use for this operation.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / columns
        Removed value: -{
        -  "description": "For transform=firehose only: TSV column names matching each Firehose record line.",
        -  "items": {
        -    "minLength": 1,
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • addedInput schema / properties / database
        Added value: +{
        +  "description": "Optional RawTree database override. RawTree uses the default database when omitted.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / organization
        Added value: +{
        +  "description": "RawTree organization containing the target cluster.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / transform
        Removed value: -{
        -  "description": "Optional RawTree built-in transform for JSON body inserts: otlp-traces, otlp-logs, otlp-metrics, cloudwatch-logs, cloudtrail, or firehose.",
        -  "enum": [
        -    "otlp-traces",
        -    "otlp-logs",
        -    "otlp-metrics",
        -    "cloudwatch-logs",
        -    "cloudtrail",
        -    "firehose"
        -  ],
        -  "type": "string"
        -}
    • Addedinstall-app
    • Changedlist-api-keys3 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / cluster
        Added value: +{
        +  "description": "RawTree cluster to use for this operation.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / organization
        Added value: +{
        +  "description": "RawTree organization containing the target cluster.",
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Addedlist-apps
    • Addedlist-cluster-sizes
    • Addedlist-clusters
    • Addedlist-connectors
    • Addedlist-databases
    • Changedlist-logs4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / cluster
        Added value: +{
        +  "description": "RawTree cluster to use for this operation.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / database
        Added value: +{
        +  "description": "Optional RawTree database override. RawTree uses the default database when omitted.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / organization
        Added value: +{
        +  "description": "RawTree organization containing the target cluster.",
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Addedlist-organization-members
    • Addedlist-organizations
    • Changedlist-tables4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / cluster
        Added value: +{
        +  "description": "RawTree cluster to use for this operation.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / database
        Added value: +{
        +  "description": "Optional RawTree database override. RawTree uses the default database when omitted.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / organization
        Added value: +{
        +  "description": "RawTree organization containing the target cluster.",
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Addedpause-cluster
    • Addedremove-organization-member
    • Addedresume-cluster
    • Changedrun-query4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / cluster
        Added value: +{
        +  "description": "RawTree cluster to use for this operation.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / database
        Added value: +{
        +  "description": "Optional RawTree database override. RawTree uses the default database when omitted.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / organization
        Added value: +{
        +  "description": "RawTree organization containing the target cluster.",
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Addedset-connector-status
    • Addeduninstall-app
    • Addedupdate-cluster
    • Addedupdate-organization-member
    • Addedverify-cluster-s3-access
    • Addedverify-database-s3-access
  4. 1 tool updatev0.2.0
    • Changeddelete-api-key3 fields changed
      • addedInput schema / properties / idOrApiKey
        Added value: +{
        +  "description": "API key UUID or full rt_ API key value to delete.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / idOrToken
        Removed value: -{
        -  "description": "API key UUID or full rt_ token to delete.",
        -  "minLength": 1,
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "idOrToken",
        -  "confirm"
        -]New value: +[
        +  "idOrApiKey",
        +  "confirm"
        +]
  5. 12 tool updatesv0.1.0
    • First observedcheck-health
    • First observedcreate-api-key
    • First observeddelete-api-key
    • First observeddelete-table
    • First observeddescribe-table
    • First observedget_project
    • First observedinsert-from-url
    • First observedinsert-json
    • First observedlist-api-keys
    • First observedlist-logs
    • First observedlist-tables
    • First observedrun-query

TDQS

A3.7/5.0

Scored across 62 tools

Disambiguation4/5

Most tools target a clearly distinct resource and action (clusters vs databases vs tables vs workflows vs connectors vs federation), and descriptions include explicit 'NOT for' cross-references. However, run-query explicitly supports CREATE TABLE and ALTER TABLE ... MODIFY ORDER BY, directly overlapping create-table and update-table, and verify-cluster-s3-access vs verify-database-s3-access differ only by scope. These overlaps are documented but still invite misselection.

Naming Consistency4/5

The set is overwhelmingly consistent kebab-case verb_noun (list-clusters, create-workflow, delete-federation-rule, add-connector-destination). The main deviation is query-format, which inverts the convention (would be format-query). Minor verb-style variance (add- vs create-, set- vs update-) is otherwise readable and predictable.

Tool Count2/5

62 tools is far above a well-scoped surface and pushes the agent toward selection errors, even given the broad platform domain. Several sub-areas (federation, connectors, workflows, service accounts) add many near-siblings. A more consolidated design (e.g. a single federation tool with action parameter, connector lifecycle bundled) would be more manageable.

Completeness3/5

Core data-plane workflows are well covered: tables, databases, queries, ingestion, logs, workflows, federation, and API keys all have list/create/read/delete paths. But there are notable lifecycle gaps: no delete-cluster despite pause/resume/create, no delete-connector or remove-connector-destination despite add-connector-destination, and no delete/update-service-account. Integrations and Slack are read-only by design (documented), which is acceptable.

Maintenance

ActivityActive
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables natural language queries and management of databases and subscribed data shares through Anthropic's Model Context Protocol.
    1
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Enables querying JSON/JSONL social datasets in Claude Desktop via MCP tools, using DuckDB as the backend database.
    8
    -
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI assistants to connect to 17+ databases and query/analyze data using natural language via MCP and HTTP APIs, supporting platforms like Claude Desktop, Cursor, and VS Code.
    42
    47 npm
    MIT