Skip to main content
Glama

Server Details

AI growth engineer for software businesses: SEO pages, AI answers, Reddit replies, lifecycle email.

Ownership verified
Status
Healthy
Uptime
99.9% over 22 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

B3.1/5.0

Scored across 31 tools

Disambiguation2/5

There are two parallel surfaces covering the same resources: direct tools (create_domain, verify_domain, apply_domain_dns, list_templates, publish_template, add_suppression, create_webhook) and near-identical operations exposed as ranla_command subcommands (domain add/verify/apply-dns, template create/publish, suppression add, webhook remove). An agent has no guidance on which to pick, so misselection between surfaces is likely. The email log tools (list_emails/get_email vs list_received_emails/get_received_email) are distinct, but the duplication elsewhere dominates.

Naming Consistency4/5

Tool names themselves are consistently snake_case, mostly verb_noun (list_emails, get_domain, create_webhook, cancel_email) with a clean ranla_ prefix group for chat tools. The minor inconsistency is that the meta-command surface inverts the convention ("<noun> <verb>" like "campaign list"), so the same action is named two different ways.

Tool Count2/5

31 top-level tools already exceeds a comfortable surface, and ranla_command alone fans out into dozens of additional nouns and hundreds of subcommands, making the effective API far larger than the count suggests. The email-domain CRUD tools are individually justified, but the overlapping meta-layer bloats the set considerably.

Completeness4/5

The email platform lifecycle is well covered: domains (create/apply DNS/verify/list), templates (create/get/list/publish), sending (send_email, cancel_email), suppressions, webhooks, inbound email reads, and deliverability metrics. Gaps are minor—template editing and domain settings exist only through the ranla_command path, not as first-class tools—so agents can still work around them.

Available Tools

31 tools
add_suppressionAdd suppressionC
Idempotent
Inspect

Add an address to the suppression list.

NameRequiredDescriptionDefault
emailYesAddress to stop sending to
reasonNoOptional note on why, e.g. "asked to stop"

Output Schema

NameRequiredDescription
suppressionYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and openWorldHint=false, covering the safety profile. The description adds no extra behavioral context such as permission requirements, effect on future sends, or rate limits. It does not contradict 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?

A single front-loaded sentence with no wasted words. It is terse but efficient, though arguably under-specified given the tool's side effects.

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 an output schema and full parameter descriptions already present, the description need not explain return values. However, it omits usage context and the operational meaning of suppression, leaving minor gaps for a mutation tool.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds no syntax or format details beyond what the schema already provides for email and reason.

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: 'Add an address to the suppression list.' It is clearly an additive operation, distinguishable from list_suppressions and remove_suppression, but it does not explicitly name or contrast those siblings.

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

Usage Guidelines2/5

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

No when-to-use, when-not-to-use, or alternative-tool guidance is provided. The agent must infer that this is for suppressing an address and that remove_suppression handles the reverse operation.

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

apply_domain_dnsApply domain DNS recordsA
Destructive
Inspect

Create the sending domain's DNS records at your DNS provider (Cloudflare, GoDaddy, or Vercel), using the connection stored in the dashboard. Connect the provider in the dashboard first; registrar credentials are never passed through here.

NameRequiredDescriptionDefault
domainYesDomain id or name (example.com)
providerYesDNS provider that hosts the domain

Output Schema

NameRequiredDescription
domainYes
recordsNoThe records that were applied
resultsYesWhat happened to each record
providerYescloudflare, godaddy, or vercel

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and openWorldHint=true; the description adds value beyond them by explaining that the write happens against an external provider using a stored dashboard connection and that registrar credentials are never passed through. It could go further by warning that this mutates live DNS at the provider, but the auth-model disclosure is substantive.

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

Conciseness5/5

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

Two tight sentences, front-loaded with the action and resource, followed by the prerequisite. Every clause carries information; nothing is redundant.

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

Completeness4/5

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

With an output schema present, return values need no explanation, and the description covers the two required inputs plus the auth prerequisite. It omits any mention of failure modes (e.g., provider not yet connected) but is otherwise sufficient for a two-parameter tool.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters (domain id/name and the provider enum) are already fully documented in the schema. The description's provider list mirrors the enum without adding format or lookup semantics, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Create the sending domain's DNS records') and enumerates the supported providers, making it clearly distinct from generic sibling names like create_domain or verify_domain. It stops short of explicitly naming which sibling to prefer, so it does not reach the top tier of explicit differentiation.

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 concrete prerequisite ('Connect the provider in the dashboard first') and clarifies the auth route, which is genuinely actionable ordering guidance. It does not state when to choose this over verify_domain, so it lacks explicit exclusions/alternatives.

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

cancel_emailCancel emailA
Destructive
Inspect

Cancel a scheduled email before it sends.

NameRequiredDescriptionDefault
idYesEmail id (msg_…) of a scheduled send

Output Schema

NameRequiredDescription
idYesEmail id (msg_…)
statusYesDelivery status, e.g. queued, scheduled, sent, cancelled

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation profile is covered. The description adds that cancellation applies only to scheduled sends before dispatch, which is useful context, but it does not disclose reversibility, idempotency, or the error behavior for already-sent emails.

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?

One sentence, front-loaded with the action and resource, no filler. Every word earns its place.

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?

Output schema exists and annotations carry the safety profile, so the description need not explain return values. For a one-parameter cancel operation it is nearly complete, with only edge-case behavior (already-sent, repeated cancellation) left 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?

Schema description coverage is 100%, so the single 'id' parameter is fully documented ('Email id (msg_…) of a scheduled send') including its format. The description repeats the scheduled-send qualifier but adds no new syntactic or semantic detail beyond the schema.

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

Purpose4/5

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

Specific verb+resource: 'Cancel a scheduled email', with the scope constraint 'before it sends' clarifying that only pre-send scheduled emails are affected. It is distinguishable from siblings like send_email or get_email, though it does not explicitly name them.

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

Usage Guidelines3/5

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

The phrase 'before it sends' implies the applicable condition, but there is no explicit when-to-use guidance, no statement of what to do if the email has already been sent, and no routing to sibling tools. Usage must be inferred.

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

create_domainCreate domainAInspect

Add a sending domain. DNS must still be applied and verified before production sends.

NameRequiredDescriptionDefault
nameYesDomain name (example.com)
inbound_enabledNoEnable inbound receiving on this domain

Output Schema

NameRequiredDescription
domainYes
recordsYesSending DNS records to add at the DNS provider
inbound_noteNo
inbound_recordsNoRecords for inbound receiving
mail_server_dns_errorNoWhy registering it failed, when it did
mail_server_dns_syncedNoTrue when the domain was registered on the mail server

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely new context beyond them: that a newly created domain is not production-ready until DNS is applied and verified. It doesn't cover auth requirements or whether creation is idempotent, but the lifecycle caveat is a meaningful addition.

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

Conciseness5/5

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

Two short sentences, zero filler, with the core action front-loaded and the prerequisite caveat immediately after. Every sentence earns its place.

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?

An output schema exists, so return values need not be explained. The description covers the action and the critical post-creation prerequisite, which is the main thing an agent needs to avoid a failed production send. It is only slightly thin on the inbound_enabled capability, which is arguably a distinct mode of the tool.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters (name, inbound_enabled) are already documented in the schema. The description adds only the framing of 'sending domain' and says nothing about the inbound_enabled toggle, so it does not meaningfully extend parameter meaning beyond the structured fields. 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 ('Add a sending domain') with enough scope to distinguish it from siblings like apply_domain_dns, verify_domain, get_domain, and list_domains. An agent can tell immediately that this is the creation step of the domain lifecycle.

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 second sentence establishes the workflow context – DNS must be applied and verified before production sends – which implicitly positions apply_domain_dns and verify_domain as the required follow-up steps. It gives clear timing guidance but never names those alternatives explicitly or states when not to use this tool.

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

create_templateCreate templateAInspect

Create a draft email template (html or blocks format). Publish it before sending with it.

NameRequiredDescriptionDefault
htmlNoHTML body (html format). Variables like {{name}} are allowed
nameYesTemplate name shown in the dashboard
textNoPlain-text body
aliasNoStable name to send with (template_alias), e.g. password-reset
formatNohtml for a raw HTML body, or blocks for the dashboard block editor
subjectNoDefault subject line. Variables like {{name}} are allowed

Output Schema

NameRequiredDescription
templateYes

TDQS

A4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, so the write-but-non-destructive profile is already covered. The description adds genuinely useful behavioral context beyond that: the created template is a draft, not immediately sendable, and must be published first. It does not mention duplicate-name/alias handling or permissions, but the key state transition is disclosed.

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

Conciseness5/5

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

Two short sentences, zero padding, with the core action (create draft) and the format scope front-loaded before the publish prerequisite. Every sentence earns its place.

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?

An output schema exists, so return values need no explanation here, and annotations cover the safety profile. The description supplies the essential lifecycle fact (draft must be published before sending), leaving only minor items like duplicate alias behavior 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?

Schema description coverage is 100% and the schema already documents all six parameters including the html/blocks enum. The description's 'html or blocks format' merely echoes the format parameter, adding no syntax, default, or validation meaning beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb+resource (create an email template) and narrows the artifact to a 'draft' in html or blocks format, which separates it from publish_template, get_template, and list_templates. It stops short of naming a sibling explicitly, so it is clear but not fully differentiated.

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

Usage Guidelines4/5

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

'Publish it before sending with it' gives a concrete follow-up workflow step and implicitly frames this as the first stage of a two-step create/publish flow, distinguishing it from publish_template. There is no explicit when-not or alternative-selection guidance, but the context is clear.

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

create_webhookCreate webhookAInspect

Create a webhook endpoint. Returns the endpoint plus a signing secret (shown once).

NameRequiredDescriptionDefault
urlYesHTTPS URL that receives events
eventsNoEvent types to deliver (all of them when omitted)

Output Schema

NameRequiredDescription
secretYesSigning secret for verifying deliveries. Shown only once.
webhookYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare the write/openWorld/non-destructive profile, lowering the bar. The description adds a genuinely useful behavioral fact beyond that: the signing secret is returned and shown only once. It omits auth requirements, rate limits, and duplicate-endpoint behavior, keeping it from a 5.

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

Conciseness5/5

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

Two short sentences, front-loaded with the core action and followed immediately by the key return-value caveat. 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?

With an output schema present and annotations covering the safety profile, the description needn't restate return structure. It still contributes the critical "shown once" secret semantics, which the schema would not convey. Complete enough 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%, so the schema already documents url and the events list (including the "all of them when omitted" default). The description adds no parameter-level detail, making the baseline 3 correct.

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 webhook endpoint"), which naturally separates it from delete_webhook and list_webhooks. It stops short of explicitly naming a sibling or differentiating itself, so it lands just under a 5.

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

Usage Guidelines2/5

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

The description offers no when-to-use guidance, no prerequisites, and no pointer to related tools such as send_test_webhook_event or list_webhooks. An agent gets no help deciding when this tool is the right call versus its siblings.

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

delete_webhookDelete webhookC
Destructive
Inspect

Delete a webhook endpoint by id.

NameRequiredDescriptionDefault
idYesWebhook id

Output Schema

NameRequiredDescription
okYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and openWorldHint=false, so the safety classification is covered. The description adds nothing beyond that—it does not state that deletion is permanent, whether in-flight deliveries are affected, or what happens to associated events, which is the value a destructive tool's description should add.

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

Conciseness4/5

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

A single short sentence that front-loads the action and resource with no filler. It is efficient, though almost to the point of under-specification rather than tight prose.

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?

An output schema exists so return values need not be explained, and the input schema is fully documented. However, for a destructive operation the description should at minimum signal permanence or side effects; it is adequate but leaves real gaps.

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

Parameters3/5

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

Schema description coverage is 100% with a single 'id' parameter already documented as 'Webhook id'. The description only restates 'by id' and adds no format, prefix, or sourcing guidance, so the baseline 3 applies.

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

Purpose4/5

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

The description names a specific verb+resource combination ('Delete a webhook endpoint by id'), which is unambiguous and clearly distinct from create_webhook and list_webhooks. It stops short of explicitly differentiating siblings, but the action itself leaves no ambiguity.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus alternatives, no prerequisites (e.g., required permissions), and no warning about irreversibility. The agent must infer everything from the name alone.

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

get_deliverabilityGet deliverabilityB
Read-only
Inspect

Fetch best-effort deliverability metrics for recent sends (7d or 30d window).

NameRequiredDescriptionDefault
windowNoLook-back window. Default 30d

Output Schema

NameRequiredDescription
notesNoHow to read the numbers
windowYes7d or 30d
summaryYesCounts and rates across all sends in the window
by_domainNoThe same, per sending domain
generated_atNoISO 8601
window_startNoISO 8601
top_bounce_reasonsNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds a genuinely useful caveat with 'best-effort', signaling the metrics may be approximate or incomplete, but says nothing about aggregation scope, latency, or account-level vs domain-level resolution.

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

Conciseness5/5

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

A single sentence with the caveat ('best-effort') and the scope ('recent sends', window size) front-loaded. There is no filler and nothing redundant.

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

Completeness4/5

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

For a one-optional-parameter, read-only tool with full schema coverage, an output schema, and annotations covering the safety profile, the description supplies the two things the structured fields cannot: the accuracy caveat and the fact that results cover 'recent sends'. The missing usage guidance is a minor gap given the tool's simplicity.

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 enum values and default (30d) are fully documented in the schema. The description only restates '7d or 30d window' without adding meaning such as what a 30d look-back actually aggregates, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb and resource: 'Fetch deliverability metrics for recent sends', with the scope narrowed to a 7d/30d window. No sibling tool overlaps with deliverability reporting, so the purpose is unambiguous, though it does not explicitly differentiate itself from neighbors like get_domain or list_emails.

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

Usage Guidelines2/5

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

The description gives no when-to-use guidance, no prerequisites, and no alternatives. It mentions the two windows but does not say which to pick or when this tool is the right call versus inspecting a specific domain or email.

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

get_domainGet domainA
Read-only
Inspect

Get one sending domain by id or name, with its DNS records and verification status.

NameRequiredDescriptionDefault
domainYesDomain id or name (example.com)

Output Schema

NameRequiredDescription
domainYes
recordsYesSending DNS records to add at the DNS provider
analysisNoDMARC and BIMI findings for the domain
inbound_noteNo
tracking_dnsNoThe tracking record, when tracking is on
inbound_recordsNoRecords for inbound receiving

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, covering the safety profile. The description adds useful context beyond them by disclosing what the call surfaces (DNS records and verification status), which helps an agent judge the tool's richness and cost.

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?

One front-loaded sentence with zero filler; the lookup key is stated before the returned content. Every clause earns its place.

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 only one parameter, full schema coverage, an output schema, and annotations covering safety, the description carries enough to select and invoke the tool correctly. Only minor operational notes (e.g., behavior when the domain is not found) are absent, which is acceptable here.

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 the single parameter documented as 'Domain id or name (example.com)'. The description's 'by id or name' mirrors the schema without adding format, validation, or lookup-precedence detail, 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 states a specific verb (get), a specific resource (sending domain), and the lookup keys (id or name), and it notes the returned payload (DNS records and verification status). It contrasts implicitly with list_domains by emphasizing singular lookup, though it never names a sibling explicitly.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this is for fetching a single domain when the identifier is known. There is no explicit when-to-use vs. list_domains/get_deliverability guidance and no stated prerequisites, but the purpose does not mislead.

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

get_emailGet emailA
Read-only
Inspect

Get a single email by public id (msg_…).

NameRequiredDescriptionDefault
idYesEmail id (msg_…)

Output Schema

NameRequiredDescription
emailYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds nothing behavioral beyond that, only restating the id prefix that also appears in the schema, so it meets the minimum bar without adding context.

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

Conciseness5/5

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

A single front-loaded sentence that names the verb, the resource, the selector, and the id format with zero filler. Nothing in it is redundant within the description itself.

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 trivial one-parameter read, an output schema exists, annotations cover safety, and the parameter is fully documented, so the description is essentially sufficient. The only gap is that it does not distinguish this tool from get_received_email for an agent choosing between them.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter is fully documented with the same msg_… format hint the description repeats. Per the rubric, a fully-covered schema sets the baseline at 3, and the description adds no extra 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?

States a specific verb and resource ('Get a single email') plus the key selector ('by public id (msg_…)'), so an agent knows this is a single-item fetch rather than a list. It does not differentiate itself from the sibling get_received_email, which is the main residual ambiguity.

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

Usage Guidelines3/5

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

Usage is only implied: the mention of 'by public id' signals it is the tool to call when you already hold a msg_ id, but there is no explicit when-to-use, no prerequisite statement, and no routing against list_emails or get_received_email.

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

get_received_emailGet received emailB
Read-only
Inspect

Get one inbound email, including its headers and body.

NameRequiredDescriptionDefault
idYesReceived email id

Output Schema

NameRequiredDescription
received_emailYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds only the return content (headers and body), not pagination, body format, or error behavior for an unknown id; with annotations carrying the profile this is a modest addition.

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?

One short sentence, front-loaded with the verb and resource, and the payload clause adds information rather than padding. No waste.

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 an output schema present, the description need not describe return structure, and the annotations cover the safety profile. What remains thin is routing context – nothing says when to choose this over get_email or list_received_emails – but for a simple one-param read the description is nearly sufficient.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'id' parameter is documented as 'Received email id'. The description adds no syntax, format, or source guidance beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Get one inbound email') and enumerates the payload ('headers and body'), which tells the agent what comes back. It does not differentiate itself from the sibling get_email, leaving the inbound-vs-outbound distinction implicit in the word 'received' rather than explicit.

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

Usage Guidelines2/5

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

No when-to-use guidance, no prerequisites, and no mention of alternatives such as list_received_emails or get_email. The agent must infer from the name alone that this is the single-item lookup counterpart to the list tool.

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

get_templateGet templateB
Read-only
Inspect

Get a template by id or alias.

NameRequiredDescriptionDefault
idNoTemplate id
aliasNoPublished alias (alternative to id)

Output Schema

NameRequiredDescription
templateYes

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, covering the safety profile. The description adds no behavioral context beyond that — nothing about failure modes when the id/alias is unknown, or about draft vs published template behavior.

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

Conciseness5/5

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

A single eight-word sentence, front-loaded with the verb and resource. Every word earns its place; nothing is padded or redundant.

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

Completeness4/5

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

For a simple single-record read with an output schema, full parameter documentation, and annotations covering safety, the definition is nearly complete. The only gap is the absence of any routing hint toward list_templates or note on alias resolution, which is minor here.

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, including that alias is an alternative to id. The description's 'by id or alias' merely restates that, adding no format or precedence detail. Baseline 3 is appropriate.

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

Purpose4/5

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

The description states a specific verb ('Get') and resource ('template') and clarifies the lookup key ('by id or alias'). This distinguishes it from list_templates and create_template, though it does not explicitly name those siblings. Clear and unambiguous, but not maximally differentiated.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus list_templates, nor on prerequisites such as whether the alias must be published. The agent must infer usage entirely from the name and schema.

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

list_domainsList domainsB
Read-only
Inspect

List sending domains for this account.

NameRequiredDescriptionDefault
limitNoPage size (1–100)
cursorNoOpaque cursor for the next page
inbound_enabledNoOnly domains with inbound receiving on (or off)

Output Schema

NameRequiredDescription
domainsYesSending domains
has_moreNoTrue when another page follows
next_cursorNoPass as cursor for the next page; null on the last page

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, destructiveHint=false and openWorldHint=false, so the safety profile is covered without description help. The description adds only the account-scoping fact; it says nothing about pagination behavior or result size limits, which would be the useful extra context given the cursor parameter.

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

Conciseness4/5

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

A single short sentence with no filler and the resource stated up front. It is efficient, though arguably too terse for a paginated list tool.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and all parameters are documented in the schema. What is missing is any acknowledgement of paging behavior or the relationship to domain-management siblings, leaving the definition minimally viable.

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 (limit, cursor, inbound_enabled) are already fully documented in the schema. The description adds no parameter-level detail, which makes the baseline 3 appropriate.

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

Purpose4/5

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

The description states a specific verb+resource ('List sending domains') scoped to 'this account', which is enough to distinguish it from get_domain and create_domain by inference. However, it never explicitly contrasts itself with those siblings, so an agent must rely on the naming convention rather than the text.

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 statement of when to use this tool versus get_domain (single domain) or list_emails, and no mention of pagination workflow despite the cursor parameter. Usage is only implied by the verb 'List'.

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

list_emailsList emailsA
Read-only
Inspect

List recent emails sent from this account.

NameRequiredDescriptionDefault
limitNoPage size (1–100)
cursorNoOpaque cursor for the next page

Output Schema

NameRequiredDescription
emailsYesSent emails, newest first
has_moreNoTrue when another page follows
next_cursorNoPass as cursor for the next page; null on the last page

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is structured data. The description adds only the scoping detail that results are limited to mail sent from this account; it says nothing about ordering, time window behind "recent", or pagination behavior beyond what the schema implies.

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

Conciseness4/5

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

A single short sentence with no filler and the resource front-loaded. It is efficient, though it is lean enough that there was room to add scoping detail without bloat.

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 low-complexity, zero-required-parameter read tool with full schema coverage and an output schema, the description is largely sufficient — return shape and pagination are covered elsewhere. The one soft gap is that "recent" is never quantified.

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 limit (page size 1–100) and cursor (opaque next-page cursor) are both documented in the schema. The description contributes no additional parameter meaning, so the baseline 3 applies.

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

Purpose4/5

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

Specific verb+resource ("List recent emails") with a scope qualifier ("sent from this account") that implicitly separates it from siblings like list_received_emails and get_email. It does not name those siblings directly, so differentiation is inferred rather than stated.

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

Usage Guidelines3/5

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

The phrase "sent from this account" implies usage (outbound mail listing) but the description never states when to use this tool versus list_received_emails, get_email, or get_received_email. It offers implied context only, with no explicit alternatives or exclusions.

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

list_received_emailsList received emailsB
Read-only
Inspect

List inbound emails received on domains with inbound enabled.

NameRequiredDescriptionDefault
limitNoPage size (1–100)
cursorNoOpaque cursor for the next page
domainNoOnly messages received on this domain

Output Schema

NameRequiredDescription
has_moreNoTrue when another page follows
next_cursorNoPass as cursor for the next page; null on the last page
received_emailsYesInbound emails, newest first

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, openWorldHint=false, destructiveHint=false, establishing this is a safe read. The description adds the domain-scoping constraint but no pagination behavior, ordering, or empty-result semantics beyond what the schema hints. With annotations covering the safety profile, this is adequate but not rich.

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

Conciseness4/5

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

A single, front-loaded sentence with no waste. However, at this brevity it could afford one more clause to route the agent or clarify scope, so it's efficient but slightly under-informative.

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?

Output schema exists, so return values needn't be described, and annotations cover safety. What's missing is differentiation from list_emails and any pagination or ordering context. For a list tool with a rich schema and annotations, this is minimally complete but leaves the sibling-routing gap.

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

Parameters3/5

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

Schema description coverage is 100%, so limit, cursor, and domain are fully documented in the schema. The description adds no syntax or format detail beyond what's already provided. 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.

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 (inbound emails) with a scope qualifier (domains with inbound enabled). Clear what it does, though it doesn't explicitly differentiate from sibling list_emails, which presumably lists outbound/sent emails. An agent can infer the inbound/outbound split, but it's not spelled out.

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

Usage Guidelines3/5

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

The phrase 'on domains with inbound enabled' implies usage context (only meaningful when inbound is configured), but there's no explicit when-to-use vs alternatives. It doesn't say to use get_received_email for a single message or how this differs from list_emails. Guidance is implied rather than stated.

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

list_suppressionsList suppressionsC
Read-only
Inspect

List suppressed recipient addresses.

NameRequiredDescriptionDefault
emailNoOptional filter by email
limitNoPage size (1–100)
cursorNoOpaque cursor for the next page

Output Schema

NameRequiredDescription
dataYesSuppressed addresses
has_moreNoTrue when another page follows
next_cursorNoPass as cursor for the next page; null on the last page

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered without description help. The description adds nothing beyond this — no note on pagination behavior, filtering semantics, or result ordering — so it does no work the structured fields don't already do.

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

Conciseness4/5

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

A single front-loaded sentence with zero filler or redundancy. It is efficient, though the brevity edges toward under-specification for a paginated list operation.

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

Completeness3/5

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

The output schema covers return values and the annotations cover safety, so the remaining burden is light. However, the description omits pagination and filter behavior implied by the cursor/limit/email parameters, leaving it merely adequate for a low-complexity 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 description coverage is 100%, so all three parameters (email, limit, cursor) are fully documented in the schema. The description adds no parameter meaning beyond that, making the baseline 3 appropriate.

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

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 ('suppressed recipient addresses'), which is clear enough to distinguish it from add_suppression and remove_suppression by name alone. It stops short of an explicit sibling comparison, but the read vs. write distinction 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?

No guidance on when to use this tool versus alternatives, no mention of prerequisites, and no exclusions. The agent must infer that this is the read counterpart to add_suppression/remove_suppression and that pagination via cursor is expected.

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

list_templatesList templatesC
Read-only
Inspect

List email templates.

NameRequiredDescriptionDefault
limitNoPage size (1–100)
cursorNoOpaque cursor for the next page
statusNoOnly drafts or only published templates

Output Schema

NameRequiredDescription
dataYesEmail templates
has_moreNoTrue when another page follows
next_cursorNoPass as cursor for the next page; null on the last page

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds nothing further — no pagination behavior, no mention that the cursor drives paging, and no note on default ordering or result size.

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

Conciseness4/5

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

A single short, front-loaded sentence with no padding or wasted words. It is efficient, though its brevity borders on under-specification rather than true conciseness.

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?

Output schema exists, so return values need no explanation, and annotations plus the schema cover safety and parameters. Still missing is positioning against the many sibling list/get tools, which an agent needs to choose 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%, with limit, cursor, and status fully documented and an enum on status. The description adds no meaning 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.

Purpose3/5

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

States a clear verb+resource ('List email templates'), so an agent knows it enumerates templates rather than fetching one. However, it is essentially a restatement of the name/title and adds only the word 'email', with no differentiation from siblings like get_template, list_emails, or create_template.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus get_template (single template) or list_emails, and no mention of the filtering behavior implied by the status enum. The agent must infer usage entirely from the tool name.

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

list_webhooksList webhooksA
Read-only
Inspect

List webhook endpoints for this account.

NameRequiredDescriptionDefault
limitNoPage size (1–100)
cursorNoOpaque cursor for the next page

Output Schema

NameRequiredDescription
has_moreNoTrue when another page follows
webhooksYesWebhook endpoints
next_cursorNoPass as cursor for the next page; null on the last page

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered without the description doing any work. The description adds only the 'for this account' scoping constraint and says nothing about result limits, ordering, or pagination cost beyond what the schema already carries.

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

Conciseness5/5

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

A single front-loaded sentence with zero filler; the resource and scope are stated before anything else and nothing redundant is included.

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?

An output schema exists, so return values need not be explained, and the annotations carry the safety profile. The definition is complete enough to invoke correctly, though pagination expectations and the account-scoping boundary could have been made more explicit.

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

Parameters3/5

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

Schema description coverage is 100%, so both limit and cursor are fully documented in the schema. The description adds no format, default, or range detail on top of that, 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?

Clear verb + resource ('List webhook endpoints') with an account scope qualifier. It is readily distinguishable from create_webhook, delete_webhook, and send_test_webhook_event, but the description never names those siblings or contrasts itself with them.

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, when-not-to-use, or alternative routing. For a simple account-scoped listing this is adequate but leaves the agent to infer that this is the enumeration counterpart to create_webhook/delete_webhook.

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

publish_templatePublish templateAInspect

Publish a template, snapshotting an immutable version for sends.

NameRequiredDescriptionDefault
idNoTemplate id
aliasNoTemplate alias (alternative to id)
labelNoOptional name for this version in the template history

Output Schema

NameRequiredDescription
templateYes

TDQS

A4/5.0
Behavior4/5

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

Annotations declare a non-read-only, non-destructive, closed-world write. The description adds a crucial behavioral fact: publishing creates an immutable snapshot version, which informs the agent about versioning side effects. It does not cover auth, rate limits, or what happens to previous versions, but it meaningfully extends the annotation coverage.

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

Conciseness5/5

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

Single sentence, front-loaded with the action and its key effect. 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?

With an output schema present and annotations covering safety, the description supplies the essential purpose and the immutability consequence. It could clarify the id vs alias requirement (both optional in schema) or label usage, but the schema descriptions likely suffice for 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%, so parameter meanings are fully documented in the schema. The description adds no additional semantics for id, alias, or label. 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 'publish' and resource 'template', plus the key effect: 'snapshotting an immutable version for sends'. This distinguishes it from create_template (creation) and get_template (retrieval) without needing the schema.

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

Usage Guidelines3/5

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

No explicit when-to-use or alternatives are given. The phrase 'for sends' implies the purpose (making a template sendable), but an agent must infer that this is the step after create_template and before send_email. No exclusions or prerequisites are stated.

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

ranla_approveApprove a Ranla stepB
Destructive
Inspect

Approve a pending Ranla approval and resume the run.

NameRequiredDescriptionDefault
messageIdYesThe pending approval's messageId, from ranla_list_approvals or a pendingApproval result

Output Schema

NameRequiredDescription
textNoRanla's reply
errorNoSet when the turn failed
toolsNoSteps Ranla took in the turn
artifactsNoWhat Ranla made or opened, by id
connectRequiredNoAn account the founder must connect in the app before Ranla can go on
pendingApprovalNoThe step waiting on ranla_approve. It does nothing until approved.
connectsRequiredNoEvery account to connect, when there is more than one
pendingApprovalsNoEvery step waiting, when there is more than one

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuine value by stating the side effect that the run resumes, but it says nothing about irreversibility, required permissions, or what happens if the approval is stale.

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

Conciseness4/5

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

A single, front-loaded sentence with no wasted words; the action and its effect are both immediately visible. It is appropriately sized for a one-parameter 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?

An output schema exists, so return values need not be described, and the single required parameter is covered by the schema. For a simple approve-and-resume mutation, the description is nearly complete; only the reversibility/permission 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?

Schema description coverage is 100% and the single messageId parameter is fully documented in the schema, including where to obtain it. The description adds no parameter-level meaning beyond that, so the baseline of 3 applies.

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

Purpose4/5

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

The description names a specific verb and resource ("Approve a pending Ranla approval") and adds the consequential effect ("resume the run"), which clearly separates it from the sibling ranla_reject. It stops short of explicitly naming the alternative, so it is clear but not fully sibling-differentiating.

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

Usage Guidelines2/5

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

The phrase "pending Ranla approval" hints at the precondition, but there is no explicit when/when-not guidance and no reference to the counterpart ranla_reject. The agent must infer that reject is the sibling for the opposite decision.

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

ranla_commandRun a Ranla commandA
Destructive
Inspect

Run one of Ranla's commands in this account. command is " ", such as "campaign list" or "page propose", and input holds its fields. "help " lists a noun's commands with every field. A command that needs sign-off does nothing yet: it comes back with pendingApproval, and ranla_approve with its messageId applies it. For strategy, or anything that needs Ranla's judgement or research, use ranla_message.

Commands:

  • ad: list, set — an ad's copy. list {campaignId, adId} is each ad's headlines and descriptions word for word (pins, Google's rating), its ad group's keywords and Quality Score, and Ranla's copy changes to it in 30 days (applied when, or a card waiting): read it before quoting or rewriting copy and to confirm a change went in. set {adId, headlines, descriptions, replaceHeadlines, replaceDescriptions, pins: [{text, pinnedField}], replace, moveKeywords, newAdGroupName, rationale} adds or replaces lines (the card shows old → new); with moveKeywords and newAdGroupName it moves those keywords into their own ad group with this copy

  • ad-account-assets: pause — pause {resourceNames} pauses account-level sitelinks, callouts and snippets, a card

  • ad-campaign: checklist, create, diagnostics, list, search-history, set, terms — a Google Ads Search campaign (never email). list {days} is each campaign's spend, clicks, conversions, serving status, impression share, whole served life (history), bidding with biddingRecommendation, searchPartners and landingPages. terms {campaignId, limit} is what people typed in the last 90 days and which terms cost money without converting. search-history {days, contains, campaignId, includeHistory, limit} is up to 365 days across every campaign ever run, split by campaign. diagnostics is why a campaign is not spending, as findings each with the card that fixes it (low_quality_score, launch_checklist, primary_conversion_unrelated, conversion_feed, conversion_not_biddable). checklist {campaignId} is the launch checklist, pass/warn/fail per setting. create {finalUrl, dailyBudgetCents, countries, languages, locationType, name, planItemId, plannedFrom, replaceActionId, adGroups: [{name, keywords: [{text, matchType}], maxCpcCents}], negativeKeywords, headlines, descriptions, path1, path2, sitelinks, callouts, structuredSnippets, maxCpcCents, biddingStrategy, cpcCeilingCents, targetCpaCents, searchPartners, accountDailyCapCents, budgetChanges} plans a new Search campaign for one landing page as a plan card (created PAUSED); it runs the launch checklist and fills what is not given with the account's defaults (presence targeting, the copy's language, Google Search only, safe shared lists, starter negatives), and puts any FAIL on the card. set {campaignId, rationale, and one change: status paused|enabled, dailyBudgetCents (founderRequested, accountDailyCapCents), strategy (cpcCeilingCents, targetCpaCents), maxCpcCents (adGroupIds; Manual CPC only), searchPartners, locationType and languages, sitelinks / callouts / structuredSnippets (removeAccountSitelinks, accountSitelinkMode), ads: [{adId, path1, path2}]} changes one setting of a live campaign, a card; it answers with what each card will change

  • ad-conversion: set, verify — Google Ads conversion actions. set {conversionActionId, primary: true|false, rationale} makes one primary or secondary, a card. verify {signupUrl} checks conversion tracking end to end (snippet live, click ids carried to signup, signups arriving, Google Ads accepts an upload) and raises one card only when a check fails, with the fixes

  • ad-group: add — add {campaignId, name, keywords: [{text, matchType}], headlines, descriptions, finalUrl, path1, path2, maxCpcCents, rationale} adds an ad group with its own ad, a card

  • ad-history: list, set — what each campaign, conversion action and shared negative list in the ad account was for: current (the offer sold today), legacy (an offer or goal that no longer exists) or other_product. Evidence reads leave out legacy and other_product and say so; removed and long-paused campaigns and removed or hidden conversion actions are legacy until the founder says otherwise. list {type}. set {items: [{type, id, label, note}], founderSaid} stores what the founder said; without founderSaid it stores Ranla's own reading (never over the founder's labels), no card

  • ad-keyword: add, set — a keyword in a live campaign. add {campaignId, adGroupId, text, matchType: EXACT|PHRASE|BROAD, rationale}, a card. set {keyword (its text) or criterionId, campaignId, status: paused|enabled|removed, rationale}, or {keyword or criterionId, toCampaignId, toAdGroup or toAdGroupId, rationale} to move it (the destination's only ad group when it has one), a card; removed cannot be undone

  • ad-negative: add, leaks — campaign negative keywords. add {campaignId, text, matchType, rationale} for one, or {campaignId, terms, matchType, rationale} for a list (a new campaign's starter list needs no search data), one card; founderRequested marks the founder's own ask and any clash with converting searches or the campaign's keywords goes on the card as a note. leaks {campaignId} runs the search-term leak review and puts up one card with the negatives for searches judged not buyers, each checked against the campaign's own keywords, plus a pause card for a keyword that mostly buys non-buyers

  • ad-plan: discard, edit, list, request-approval, show, withdraw — Search campaigns Ranla proposed that are not in Google Ads yet. list {status: proposed|applied|failed|rejected|all, limit, offset} returns total and says whether each has an approval card waiting (awaitingApproval). show {actionId}. edit {actionId, name, dailyBudgetCents, finalUrl, searchPartners, biddingStrategy, cpcCeilingCents, targetCpaCents, countries, languages, locationType, sitelinks, callouts, structuredSnippets, sharedNegativeLists: ["list name"], changes: [{op: remove_keyword|add_keyword|set_headline|set_description|set_paths|set_max_cpc|add_ad_group|remove_ad_group|add_negative|remove_negative, adGroup, text, matchType, index, path1, path2, maxCpcCents, keywords, headlines, descriptions}]}; index is 1-based (1 is the first line) and empty text removes that line; a negative is created with the campaign; sharedNegativeLists attaches the account's shared negative lists at create (each checked against the plan's keywords). Every edit is saved and re-runs the launch checklist; FAIL lines come back as notes for the founder and go on the card. Change a plan with edit rather than proposing a second plan for the same landing page. request-approval {actionId} puts the approval card up again for a plan with none; approving it creates that plan paused. discard {actionId, reason} drops a plan. withdraw {actionId, reason} takes back any pending paid proposal

  • ads: keywords, landers, spend, sync — the ad account. spend {days} is total spend next to verified conversions. landers {dailyBudgetCents, countries} recommends landing pages to build first, from real search demand. keywords {terms, campaignId, countries} prices exact terms, or a live campaign's own keywords: monthly searches, competition, top-of-page bid low/high. sync {action: status|sync_segment|stop_segment|map_goal, segment, goal, conversionAction} is what goes back to Google Ads; a segment upload is a card

  • aeo: competitors, refresh, run, setup, sources, status — AI search: what ChatGPT, Perplexity, Gemini, Claude and Google AI say about us. status {days: 7|14|28|90, engine} is visibility, share of voice and how the answers describe us; read enabled and chats before quoting. competitors {days, engine}. sources {days, engine, gapOnly, domain} is which pages the engines read. run asks every engine now. setup {tracking: true|false, engines: chatgpt|perplexity|gemini|claude|google_ai_mode|google_ai_overview, cadence: daily|weekly, country, language, maxActivePrompts, brandNames}: send only what changes; turning it on or spending more is a card. refresh {job: suggest_prompts|fixes|readiness|volumes|fanout, topic, count} runs one of the desk jobs now

  • aeo-fanout: list, set — a Google search the engines run before answering (best X, X reviews, X alternatives), checked weekly. list {gapsOnly, status: active|dismissed|all} is our position and the lists that name us. set {queryIds, status: active|dismissed}: dismissed is no longer checked, active is checked again

  • aeo-fix: do, list, pitch, set — a thing to do about the AI answers. list {status: open|done|snoozed|dismissed, kind}, biggest first. set {actionId, status: done|snoozed|dismissed|open, snoozeDays} returns it before and after. do {actionIds or all, pageTypes} does them: page fixes go to the SEO desk, listings come back to draft the asks. pitch {actionId, type: pitch|listing, to, subject, body, why} drafts the founder’s outreach for a get_listed or review_site fix, a card; they send it

  • aeo-prompt: add, ask, delete, get, list, set, suggest — a buyer question tracked in AI search. list {status: active|suggested|paused|all, days, engine}, lowest visibility first. get {promptId, day, engine} is what each engine answered. set {promptIds, status: active|paused|dismissed|suggested, stage, topic, tags, text} changes them and returns each before and after; active is tracked (asked on every scheduled run, metered), a card. add {prompts: short questions built on a real search, fromFounder: true only when the founder gave these exact questions, topic, stage}; your own go in as suggestions with their demand looked up. suggest {topic, count} proposes new ones as suggestions. ask {promptIds} asks every engine now (at most 5, metered), a card. delete {promptIds} drops them with their answers and history, a card

  • aeo-topic: delete — delete {topic: its name}; its prompts stay, ungrouped

  • affiliate: add-coupon, add-link, approve, delete, get, import, invite, list, login-link, reactivate, reject, remove-coupon, remove-link, rename-link, suspend, update — a partner in the affiliate program; affiliate is their id or email. list {status, campaign, q, days}. get {affiliate} is their links and codes. invite {emails, campaign}. approve, reject {affiliate, reason}, reactivate {affiliate}. suspend {affiliate, reason} and delete {affiliate} are cards. update {affiliate, campaign, changes: {notes, tags, commissionOverride: {commissionType, commissionBps}, …}, clear}. add-link {affiliate, token, destinationUrl}. rename-link {affiliate, token}. remove-link {affiliate, link}, a card. add-coupon {affiliate, code}. remove-coupon {affiliate, coupon}, a card. login-link {affiliate} emails them a sign-in link. import {csv, campaign}. Never their payout or tax details

  • affiliate-campaign: archive, create, default, list, restore, update — commission rules partners earn under, never an email campaign. list. create {changes: {name, commissionType, commissionBps, commissionDuration, cookieDays, holdDays, …}, makeDefault, stripeCouponId}. update {campaign, changes, clear, stripeCouponId}. default, archive {campaign, moveAffiliatesTo}, restore {campaign}

  • affiliate-commission: add, list, reverse — the ledger. list {status, affiliate}. add {affiliate, amountCents, currency, description, earnedNow}. reverse {commissionId, reason, note}

  • affiliate-payout: cancel, draft, list, mark-paid, revert, skip — payout runs. list, or list {runId} for its payouts. draft {currency, affiliateIds} puts the founder's approval card up; only they approve. cancel {runId}, skip {runId, affiliate} before approval. mark-paid {payoutId, reference} when they paid by hand. revert {payoutId}

  • affiliate-program: domain-add, domain-remove, domain-verify, email, live, pause, settings, status — status {days} first on any affiliate question: numbers per currency, top partners, what waits on the founder, setup gaps. settings {changes: {portalHeadline, minPayoutCents, payoutSchedule, payoutMethods, blockSelfReferrals, …}, clear}. live (the first go-live is a card), pause. email {kind, subject, body, enabled, reset} is one partner email. domain-add {domain}, domain-verify, domain-remove (a card). Auto-pay, its cap and the payout keys are the founder's: no command

  • affiliate-referral: approve, attribute, clear-flag, import-invoices, list, reassign, reject — people a partner sent. list {status, flagged, affiliate, q}. attribute {affiliate, email or stripeCustomerId, importInvoices} only when the founder names both. approve, reject, clear-flag, import-invoices {referralId}. reassign {referralId, affiliate} moves a referral and its unpaid commissions to another partner

  • affiliate-resource: add, list, remove, reorder, update — what partners see in the portal. list. add {title, kind, url or body}. update {resourceId, …}. remove {resourceId}, a card. reorder {ids}

  • analytics: act, list — list {days, limit}. act {source: posthog|amplitude|mixpanel, events}

  • approval-rule: add, list, remove — the kinds of change the founder always approves. list. add {key} is a card. remove {key}

  • attribute: inspect, instrument — instrument {repoFullName, attributeKey, type, whenSet, backfill, revisePullRequest}. To change an open PR you opened, revise it: the same attribute with revisePullRequest (its number) and the change in whenSet — never a second PR

  • audience: list

  • audit: read, retest, scan — the technical site audit. read {url} is the latest scan, one page in full with url. scan runs it again. retest {url} re-tests one page's speed

  • automation: delete, draft, events, get, list, runs, set, suggest, test — a lifecycle flow, one object in any status (draft, active, paused). list. get {id} opens it on the canvas. set {id, name, trigger, steps} changes those fields and returns them before and after; on an active flow it is a card and the flow stays active. set {id, status: active} turns it on, a card; set {id, status: paused} turns it off. suggest {automationId, change: add_step|edit_step|remove_step|pause, label, why, step, index, forAutomationId} puts one change on the flow, drawn dashed, for the founder to accept or reject; nothing changes until they accept. test {automationId, to, mode: dry_run}. events is the lifecycle event names the brief names

  • background-job: clear, list, retry, start, stop — list: your jobs, running and finished, and every pull request you opened in any repo (open, merged or closed). stop {jobId} (also drops one waiting on your estimate, when the founder says no). clear {jobId}. retry {jobId, fix, note} only when the founder asks. start {jobId}: a job waiting on a go from the founder after your estimate, only when they say go

  • brain: check, fallback, remove, show, use — what Ranla thinks with: Included or the workspace's own model key. show. use {choice}. fallback {on}: think on Included when the key fails. check {provider} after the founder fixed a key. remove {provider}, a card. Keys are added only in Settings › Ranla's brain or the CLI, never in chat

  • brand: get, update — update {section: profile|voice|product|competitors|style|pov|kit|competitor|product_context, purpose, audience, tone}. Kit is the logo corner

  • brief: get, update — update {icp, antiIcp, oneLiner, valueProposition, websiteUrl}

  • browser: back, click, close, fill, key, open, read, result, screenshot, scroll, select, status, tabs, task, type, upload, wait — the founder's own Chrome, signed in as them, through Ranla for Chrome. task {goal, facts, url}: a whole job (a directory submission, a message, a listing) done step by step by a fast browser agent, answering with what it did; use it for any job of more than a step or two. Single steps, to look or do one thing: status. open {url}. read {tab, find}. fill {tab, fields: [{ref, text|value|check}], press}: a whole form in one step. click {tab, ref}. type {tab, ref, text, clear, submit}. select {tab, ref, value}. upload {tab, ref, url}. key {tab, key}. scroll {tab, direction}. wait {tab, find}. back, screenshot, close {tab}. tabs. result {id}. Each change answers with the page after it. confirm (what it does, in a sentence) on the one step that pays, publishes, submits, sends or deletes: it waits for the founder's yes. Never a password or card field

  • campaign: delete, draft, evaluation, get, list, performance, replies, resync, schedule, set, test — an email send, one object in any status (draft, scheduled, sending, paused, sent, cancelled). list {status, query} finds them. get {campaignId} is the whole campaign: sender, audience, category, goal, schedule, and each variant's subject, preheader and body (markdown, its blocks with their ids, or its html). set {campaignId, …} changes any field and returns each one before and after: name, audience, fromName, fromEmail, replyTo, category, templateId, goalId, holdoutFraction, hypothesis, primaryMetric, variants: [{key, subject, preheader, bodyMarkdown, templateVariables}], removeVariantKeys; subject and preheader on their own are one variant's (variantKey, else the first), whatever its body is made of; a body laid out in blocks changes with edits: [{op: set_text|set_image|set_button|insert|delete, blockId, …}] on variantKey, or html replaces the whole email; status: paused|cancelled|declined|resumed with reason (declined is the founder's no, kept as their preference; resumed restarts sends, a card). A change to a campaign that is scheduled, sending or paused is a card. draft {name, audience: {listIds or segmentIds}, fromName, fromEmail, variants: [{subject, bodyMarkdown}], category: newsletter|product}; optional hypothesis, primaryMetric: conversion_rate|reply_rate|click_rate, and retrievalId + dispositions to record the learnings used; a play on a pattern adds patternId. test {campaignId, email} sends one test; without email it goes to the founder

  • cms: changes, confirm-map, discard, draft, inventory, map, mappings, publish, read, revert, status — the founder's CMS (WordPress), for a site not in a repo. status is what is connected and what the site runs on. inventory {collection, search}. read {url} or {id, collection}. map {collection} proposes how a written page fills that collection's fields (background), then confirm-map {collection} is the founder's card; nothing is drafted into an unconfirmed collection. draft {pageActionId, collection} puts an SEO page there as a draft, checked as rendered. publish {changeId} is the card; it goes live on their yes. revert {changeId} puts it back. discard {changeId}. changes lists them

  • codebase: access, activity, get, read, research, search — research {repo}. access {reason}

  • comms: get, update — update {midweekPingCap, quietMode, pingDelivery, routes: {needs_you, broke, done, digest}, nudgeEveryDays, maxNudges}. routes sends one kind of message its own way; null puts that kind back on pingDelivery

  • connection: request, skip — request {slot, reason}. skip {slot}

  • contact: delete, export, get, import, resubscribe, save, unsubscribe, verification, verify — get {contacts}. save {contacts, firstName, lastName, attributes}. unsubscribe {contacts}. resubscribe {contacts}. delete {contacts}. import {attachmentId, csv}. export. verify {list | segment | everyone}, a card: checks addresses can receive email. verification {list | segment | everyone}

  • creative: propose — propose {preset, template, headline, founderChose, backgroundMode: stock|generate|library, sizePack, backgroundAssetId, generatePrompt}. Without founderChose it lists the photos there are and the question to ask the founder about where the picture comes from; nothing is proposed until they answer

  • document: list

  • domain: add, apply-dns, list, remove, settings, verify — sending domains. list. add {domain}. verify {domain} checks DNS. apply-dns {domain, provider: cloudflare|godaddy|vercel} writes the records, a card. settings {domain, openTracking, clickTracking, tlsMode, inboundEnabled}. remove {domain}, a card

  • email: find, resend — the send log. find {search, status}. resend {emailId}, a card

  • event: instrument, list — instrument {eventName, triggerDescription, repoFullName, revisePullRequest}. Pass the event name; it checks whether that name is already ingested. To change an open PR you opened, revise it: the same event with revisePullRequest (its number) and the change in triggerDescription — never a second PR

  • file: read — read {id, offset} reads more of an attached file

  • follow-up: cancel, list, reschedule, schedule

  • funnel: get — get {days}: sign-ups, trials and paid as separate steps (one per conversion goal), each counted once per person with the workspace's own team left out, and where each step's people came from. Answer every "how many sign-ups / trials / customers" and "where do sign-ups come from" from it, one number per step, never added together

  • goal: configure, create, delete, list, primary, update — create {name, type, eventName}. update {goal: name or id, name, eventName}. primary {goal: name or id}. configure {goal: name or id, type, valuePath, currency, attributionWindowHours}. delete {goal: name or id}

  • growth: get

  • guardrail: update — update {autopilot: off|approve_each|full, maxSendsPerDay, maxSendsPerContactPerWeek}. Ask me before every send is autopilot approve_each

  • heartbeat: run — run checks every signal now, within the working mode

  • idea: create, delete, list — create {title, note}. delete {ideaId} for good, a card

  • identify: instrument — instrument {repoFullName, callSiteHint}

  • image: delete, list, stock-import, stock-search — list is the Library. stock-search {query, orientation}. stock-import {photoId}. delete {imageId}, a card

  • inbox: archive, dismiss-draft, edit-draft, mark-read, mark-unread, read, reply, save-draft, send-draft, unarchive — read {view: inbox|unread|archived|all, search, offset, limit, messageId, before}. reply {messageIds, body, subject, to}, a card. archive, unarchive, mark-read, mark-unread {messageIds}. save-draft {messageIds, body, subject} leaves a reply for the founder, no card. edit-draft {replyId, body}. send-draft {replyId, body}, a card. dismiss-draft {replyId}

  • install: show

  • integration: disconnect, settings, test — a connected integration: github|slack|search_console|posthog|amplitude|mixpanel|stripe|cloudflare|godaddy|vercel|twilio|gtm|google_ads|cursor|claude. settings {integration, …}. test {integration}. disconnect {integration}, a card

  • job: get, run, update — update {kind: occasion_scan|performance_review, hour, enabled, timezone, dayOfWeek}. run {kind}

  • learning: list, write — write {retrievalId, sourceEvaluationId, evidenceIds, statement, dispositions}. A bad evidence id comes back with the valid ones

  • list: add, create, delete, list, remove, update — create {name}. add {list: name or id, contacts}. remove {list: name or id, contacts}. update {list: name or id, name, description}. delete {list: name or id}

  • mac-run: get, list — code work the founder's own coding agent ran on their Mac (Run on your Mac). list {status, limit}, with each run's files and first changed lines. get {runId, steps, diff} is what it did step by step, the whole diff, and the approved task it ran: what a run changed, or whether it matches what was approved, is read there, never guessed

  • needs-you: approve-safe, groups — groups: what waits, by kind, and which kinds are safe in bulk. approve-safe {ids} raises a card; spend, sends and posts stay one by one

  • negative-list: list, set — the account's shared negative lists. list {sharedSetId, name, offset} is every term with the live keywords it blocks and the 90-day searches it matched. set {campaignId, sharedSetId, attach: true|false, rationale} attaches or detaches a list (a clash with the campaign's keywords is refused unless founderRequested), or {sharedSetId, add, remove, move: [{text, matchType, campaignIds, reason}], rationale} changes its terms; a card

  • note: create, delete, update — create. delete {id}

  • onsite-message: delete, draft, get, list, update — banners and modals for anonymous visitors. list shows views, clicks and dismissals. get {id}. draft {name, headline, body, display: banner|modal, status: draft|active, path_prefix, page_rules, frequency: every_page_until_dismiss|once_per_session|once, cta_mode: link|email_capture, cta_label, cta_url, show_trigger: immediate|exit_intent|scroll|delay}. update {id, status: draft|active|paused|ended, headline, body, …}: active shows it, paused or ended stops it. delete {id}

  • onsite-theme: get, update — the brand tokens every banner and modal uses. get. update {primary_color, background_color, text_color, font_family: system|serif|mono, border_radius_px, logo_asset_id}

  • opportunity: decide, list — decide {opportunityId, status, reason, campaignId}

  • page: check, find, get, research, screenshots, set, ship — an SEO page, one object in any status (plan, draft, approved, live, declined). find {status: open|live|declined|all, search, limit, offset} lists them with their actionId, status and url. get {actionId} is the whole page: plan, draft, questions, research. set {actionId, url, move, title, h1, description, body, edits: [{find, replace}], status: approved|declined|live|open, liveUrl, reason, answers: [{n, answer}]} changes any of those fields and returns each one before and after; a live page edited reopens as a draft. research runs the writer: without actionId {foundationNew: {query, pageType, pitch} or foundationImprove: {existingUrl, query, pageType, pitch}, opportunityKey, plan} researches a new page or an improvement; {actionId, note} rewrites a draft from the founder's words; {actionId, fresh: true, direction} researches it again. check {actionId, apply, only} fact-checks a draft against the vendors' own pages; apply: true makes its fixes as edits. screenshots {actionId, pages: [{url, shows}]}. ship {actionId, agent} builds it where their code runs (their Mac, or Cursor/Claude in the cloud), a card; agent ranla builds a free tool

  • paid: audit — the paid self-audit. audit runs it on every live Search campaign in the background (launch checklist, search-term leaks, ceilings, conversion upload health, keywords in the wrong campaign, account-level template assets, economics), raises the cards and posts one pass / warn / fail report in the Paid conversation. audit {campaignId} reads one campaign now and raises nothing

  • pattern: list, off, on — early behaviour that predicts converting to paid or early churn here, with its evidence: a correlation, never a cause. list is each outcome and every pattern. list {patternId, limit, offset} is one pattern, its later checks and who matches it now. on turns the weekly scan on, a card. off stops it and clears the matches

  • person: inspect — inspect {email, days} returns that person's recent events

  • plan: create, list, update — create {name}. update {itemId, status: raw|proposed|approved|scheduled|sent|skipped|dismissed, title, scheduledFor, campaignId}. Nothing sent yet is status skipped

  • product: read

  • rank: list — who is worth asking

  • reddit: activity, check, citations, rankings, scan, status, strategy — the Reddit desk. status first on any Reddit question: on or off, mode, posture, caps, what is watched, the accounts. activity is the last seven days. rankings is which Reddit threads Google shows for our keywords. citations is which threads ChatGPT, Perplexity and Google AI cite. scan finds new threads now. check {check: rankings|ai_citations|post_ideas|watchlist|karma|rewrite_for_own_account}. strategy {enabled, mode: watch|draft|autopilot, posture: founder|burner|fleet|any, opportunityMode: strict|balanced|volume, disclose, maxCommentsPerDay, maxPostsPerWeek, goal, icp, voiceNotes, brandNames, syncFromBrand: fill|overwrite}: send only what changes; autopilot or a higher cap is a card

  • reddit-account: list, update — list is karma, warmth, warming and who can post. update {username, action: watch|set_kind|warming|remove, kind, warming: true|false}: warming switches warming replies on or off

  • reddit-draft: delete, get, list, post, set — a reply or post written for Reddit. list {status: draft|approved|scheduled|posted|rejected|failed|any, kind: comment|post|any, subreddit}. get {draftId} is the text, its checks and its thread. set {draftId, body, title, status: rejected|draft|posted, postedUrl, reason} returns each field before and after; posted records one they posted by hand; a new body on a reply already posted fixes it on Reddit in place, behind a card. delete {draftId}, a card. post {draftId, account} posts it to Reddit, always behind a card; an approved draft is one going out

  • reddit-idea: add, draft, list, update — post ideas. list {status: open|drafted|posted|dismissed|any}. add {subreddit, title, kind: question|story|guide|comparison|showcase|ama, angle, reason, keyword, outline}. draft {ideaId, tone, instruction} writes the post as a draft. update {ideaId, status: dismissed|open}

  • reddit-lead: list, update — people who asked for what we do. list {status: new|contacted|replied|converted|dismissed|any}. update {leadId, status, note, reason, messageSubject, messageBody, rewriteMessage}

  • reddit-thread: get, list, reply, set — a thread worth answering. list {status: new|drafted|approved|posted|dismissed|saved|ai_cited|any, lane, subreddit, minRelevance, limit}, best first. get {threadId} is the thread, its top comments, its score and every draft for it. set {threadId, status: dismissed|open, reason, saved} returns it before and after: dismissed takes it out of the inbox, open puts it back, saved is the founder's bookmark. reply {threadId, tone: helpful_expert|casual_founder|community_member, posture, instruction} writes a reply as a draft with its safety checks; nothing posts

  • reddit-watch: add-keyword, add-subreddit, edit — what the desk watches. add-subreddit {name, risk: low|medium|high, reason}. add-keyword {text, kind: keyword|competitor|brand|question}. edit {keywords: [{text, action: remove|pause|resume|edit, kind}], subreddits: [{name, action, risk, rulesNote}], clearInbox}

  • repo: inspect, list, select, set, task — the GitHub repos Ranla works in. list is the repos, each one's pull request base, and whether code reading is on. set changes one thing a call: {repos} replaces the list (a card); {reading: false} turns code reading off (on is codebase access, the founder's yes); {repo, branch} is the branch her pull requests target. select {reason} shows the founder a picker. inspect {repo} is a deep read of a repo (minutes, no PR). task {handoff: {type, id}} runs an approved page, title/H1/description change, SEO action or AI-search fix from its stored task, the approved text word for word; {title, brief, freeForm: true} for code work none of those covers. {title, brief, pullRequest} puts a change on one of your own open pull requests (the founder reviewed it and asked for changes): it starts from that PR's branch and adds to it, no new PR; Mac only. It goes where their code runs (Run on your Mac, or Cursor/Claude in the cloud), a card

  • revenue: assume, churn, get — get is MRR, paying customers (logos: distinct customers with a paid subscription) next to paying subscriptions (add-ons count separately), LTV at the entry price and at ARPU, CAC, and economics: the churn, LTV and target CAC every paid figure uses, each with its source. churn is logo and MRR churn by month for 12 months per currency and tier, the trailing-90-day rate, and one-off events. assume {monthlyChurnPct, ltvCents, targetCacCents, highValueMrrCents, highValuePlanPattern, note} stores figures the founder states; they then win everywhere

  • routine: add, delete, list, run, set — the founder's own recurring asks (every Friday, tell me X). add {title, prompt: what to do each run in their words, cadence, dayOfWeek, dayOfMonth, hour, timezone} is a card: each run uses credits; at most 5 on. list. set {id, enabled, title, prompt, schedule fields}. run {id} now. delete {id}

  • segment: create, delete, get, list, preview, reach, recount, update — create {name, description, definition: {kind: filter, match: all|any, conditions: [{type: attribute|event|engagement|list|rank|pattern, path, operator, value}]}}; a pattern condition is {type: pattern, patternId, operator: in|not_in}. preview {definition} counts it first. reach {listIds, segmentIds, category} is who a send would reach

  • seo: authority, cadence, competitors, inspect, intel, lift, opportunities, performance, plan, structure — search. plan {refresh} is what to rank for, a reason per page; call it first when they say let us do SEO or ask what to write. performance is Search Console clicks, impressions and queries for 28 days. structure {section: summary|pages|money|spokes|coverage|all} is the money-keyword map and the next pages. opportunities {include: proposed|refused|both}. competitors. authority is the link profile. lift is fixes priced in extra clicks. intel queues the competitor pass. inspect {url} is everything known about one live page. cadence {perApproval: 1-10, perRollingMonth: 1-40} reads or sets how many new pages one approval and a rolling month may carry (default 3 and 8); only when the founder asks, a card

  • seo-action: list, send, set — an item on the SEO Actions queue. list is open work by value, and apart from it what was set aside. set {key, status: done|snoozed|ignored|open, days, note} returns it before and after. send {key}: a technical fix (audit:…) to where their code runs (their Mac or a cloud agent), brief traced from the repo, or a fix to pages the site already has (existing:…), a card. removePages: true only after they said to remove the pages that fix takes off the site

  • set: add, approve, check, create, data, deliver, pause, quote, resume, sample, status, stop — a set of pages from one template and a list of items. create {name, pageType, patternQuery with {item}, template: {sections, differentiator, cta}, items or fromBrand, pathPattern, batchCap 1-25}. add {setId, items or fromBrand}. data {item, points: [{kind: price|limit|screenshot|feature|source, value, sourceUrl}]} — a page is not written until the item has 4 facts that appear on their https source pages. A screenshot point is that page text, not an image. sample writes 3. check compares the drafts and pauses the set when they are too alike. quote is the credit total. approve is one card for the next batch (10 unless batchCap is lower, never more than 25). deliver {agent: cursor|claude} sends the finished pages to that coding agent as one pull request, and stops at a card. pause, resume, stop. status reads it. Hired accounts only

  • setup: code-runs, coding-agent, connection, first-look, get, home-layout, pet, pr-bar, share-first-look, start, status, test-email — start {repoFullName, kind}. home-layout {order, hidden}. first-look {siteUrl, retry, agent}: agent starts one desk's look as its idea card does (Google asks for Search Console first); it says its own line, so add nothing. connection {slot, skip}. pet {pet} sets their own pet in the Ranla view (none is the plane; no pet reads it). code-runs {detail} sets how much of a run on their Mac they see in the conversation (no detail reads it). pr-bar {prBar: show|hide} sets whether they see the pull request bar above the conversation (no prBar reads it). coding-agent {subfolder | clear} sets the folder inside their linked repo that is their site, for a repo with several sites: use it when the founder names a folder ('there's a movement marketing folder'), with subfolder exactly as listed (no subfolder reads what is set and the folders listed). The repo and which repo stay theirs, in Settings. Confirm in one line: Set to apps/x in owner/repo; run the task again. test-email sends the setup test email to the founder

  • site: colors, research — research {url}

  • suppression: add, add-unverifiable, check, remove — the do-not-email list. check {emails}. add {emails, reason, scope: newsletter|product|all, attachmentId}. remove {emails, scope}, a card. add-unverifiable: everyone an address check found can't receive email, a card

  • target: add, drop, list, quest, remove, replan, set, start, step-apart, step-done, step-skip, step-to-agent — the founder's growth goals and the plan toward each (where they are switched on): MRR, paying customers, monthly churn, visits from a channel (ai is AI assistants), Google search clicks, AI answer share, or people who did an event. list is every goal, where it stands, the gap, its bets and the weekly scorecard. add {metric, metricParam, targetValue, deadline: YYYY-MM-DD, note}, targetValue in the metric's unit (cents for mrr). set {targetId, …}. remove {targetId}. replan {targetId}. start {betId} starts a bet's work. drop {betId, why}

  • team: cancel-invite, invite, list, unlink-slack — list. invite {email}, a card. cancel-invite {id}. unlink-slack {id}

  • template: create, delete, get, list, publish, set, starters, suggest, test — an email template, one object (draft or published). list. get {template_id}. set {templateId, subject, preheader, html, text, design, variables, name, alias, category: transactional|product|newsletter, unsubscribeEnabled} changes those fields and returns them before and after; content changes go into the draft, and mail keeps sending the published version until publish {templateId} makes the draft live (republishing a template that sends is a card). suggest {templateId, label, why, op, blockId, …} puts one edit in their editor as a tracked change for the founder to accept or reject; nothing changes until they accept. starters lists the starter catalog. create {name, format: blocks|html, html}, or {starter, name} from a starter. test {templateId, to}. delete {templateId}, a card

  • testimonial: add, edit, list, restore, retire, revoke, use — a quote from the founder's own user, with their written yes. list {status, testimonialId} first: the switch, counts, and quotes; an id gives its consent record. add {quote, personName, email, title, company, attribution, consentEvidence} is a card and needs their written yes. use {testimonialId} puts a collection-page submission (pending) into use, a card. edit {testimonialId, attribution, showCompany, logoUrl, quote}: naming them less applies now; a trimmed quote (cuts only, ... for middle cuts) goes back to them as an ask. retire, restore, revoke {testimonialId}. Repeat a quote exactly; never reword one

  • testimonial-request: accept, edit, find, list, send, skip — an ask for a testimonial. list {status, requestId}: default open. send {requestId} is a card. edit {requestId, subject, body} before it goes; the quote stays word for word and nothing is offered in exchange. skip {requestId}. accept {requestId, quote, attribution, title, company} records an unclear reply as a yes, a card. find looks for new praise and moments now

  • testimonial-settings: off, on, set — on (a card), off. set {askFoundPraise, askMoments, autoSend, fromName, fromEmail, defaultAttribution, collectEnabled, collectHeadline}; autoSend on is a card; collectEnabled opens the hosted page users leave a quote on

  • testimonial-widget: create, end, list, pause, resume, start, update — quotes on the founder's own site, with a holdout. list {widgetId}: lift on signups and paid, withheld until 14 days; only proven is a result. create {name, layout, pagePath, testimonialIds, maxQuotes, holdoutFraction} returns the embed code. update {widgetId, …}. start {widgetId} is a card. pause, resume, end {widgetId}

  • tracker-move: check, done, later, reopen — the task to move a Google Tag Manager tracker into their site code. check looks at their site for the tracker in its own code (a consent loader counts) and closes the task when it is there. done is the founder saying they did it: checked at once, and the task leaves Needs you either way. later is Not now. reopen puts it back

  • tracking: get, install, verify — get is the tracker for their site code, and the task for their coding agent. verify checks pageviews. install puts it in Google Tag Manager, only when they cannot edit their site code

  • traffic: breakdown, efforts, summary — summary. breakdown {dimension: path|channel|referrer|country|device}. efforts. Its conversions add every goal together: never quote them as sign-ups (funnel get)

  • url: read

  • webhook: list, remove, test — list. test {webhookId, event}. remove {webhookId}, a card. Adding one stays in Webhooks

  • week-plan: approve, approve-item, change, drop-item, link-draft, move-item, no-draft, plan-rest, rename-item, status — next week's content plan, built by Friday: what goes out which day on email, pages and Reddit. status {planId} (omit for the current one) lists each item, its id, channel and state. Only on the founder's word in this conversation: approve {planId}; change {planId, text} plans it again (before approval the whole week; after, the days from tomorrow, keeping what they approved or what went out); plan-rest {text?} when they ask for the rest of this week planned: from tomorrow to Saturday, making this week's plan if there is none; approve-item, move-item {day: YYYY-MM-DD, time: HH:MM 10:00-11:00}, drop-item, rename-item {title} take {itemId, channel}; approve-item approves the item's draft as it is; rename-item changes that item's title, including a stand-in. Your own step: link-draft {itemId, channel, subjectType: campaign | reddit_draft | growth_action, subjectId} links the draft you wrote for an item. The plan's approval never approves its items: each needs their yes before its day ends, or it is skipped; an approved item goes out at its time

  • working-mode: update — update {mode: off|watch|own, checkEveryMinutes, maxConcurrentMissions, maxMissionsPerDay, maxProposalsPerDay, autoReplyMode: off|draft|send, pausedRoles, askFirstChannels, …}: how Ranla works unasked. watch is notice and tell; own is start work. askFirstChannels is the full list of channels held at Ask first under Autopilot

  • workspace: timezone, update — timezone {timezone}. update {workspaceName, firstName, lastName, username}

NameRequiredDescriptionDefault
inputNoThe command's fields.
commandYes"<noun> <verb>", or "help <noun>".
threadIdNoRanla thread to record it in (from ranla_open_thread). Optional.

Output Schema

NameRequiredDescription
nextNoWhat to do with the pending approval
nounNoFor help <noun>: the noun
resultNoWhat the command returned: content (any JSON, shaped by the command), plus steps and artifact when it has them
commandsNoFor help <noun>: each verb's input schema
pendingApprovalNoSet when the command needs sign-off. It does nothing until ranla_approve.

TDQS

A4.1/5.0
Behavior5/5

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

The description goes well beyond the destructive/open-world annotations by explaining the approval-card model, pendingApproval plus ranla_approve, and which commands are irreversible or require sign-off. It also discloses side effects and constraints such as "removed cannot be undone," "delete ... for good," browser tasks stopping at a confirm step, and the rule never to enter passwords or card fields.

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

Conciseness2/5

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

The core setup is front-loaded, but the description is an enormous command catalog and is not concise in practice. It also redundantly states that "help <noun>" lists every field and then enumerates every command and field anyway, which makes the definition very long and hard for an agent to scan.

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

Completeness5/5

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

Given the tool's complexity, the description is remarkably complete: it covers command grammar, the approval return path, irreversible behavior, help discovery, and per-command inputs. Since an output schema exists, the lack of a separate return-value section in the description is not a gap.

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 description coverage is already 100%, but the description adds substantial meaning: command is "<noun> <verb>" and input holds that command's fields, and every command entry documents its specific fields. The help <noun> convention further clarifies how to discover fields for any noun.

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: "Run one of Ranla's commands in this account," and the command grammar plus catalog make the dispatcher role clear. It explicitly distinguishes ranla_command from ranla_message and ranla_approve, but it does not explain its relationship to the many other sibling tools such as add_suppression, create_template, or list_domains.

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?

There is explicit routing for strategy/research to ranla_message and for pending approvals to ranla_approve, and many individual commands include when-to-use guidance such as reading ad copy before rewriting it. However, the tool description never explains when to use this broad dispatcher versus the numerous specific sibling tools that cover overlapping domain, template, suppression, email, and webhook operations.

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

ranla_get_threadRead a Ranla threadA
Read-only
Inspect

Read a Ranla thread: its messages (role, text, tools used, artifacts by id, approvals waiting on ranla_approve), newest page first. Pass earlierBefore as before for older messages.

NameRequiredDescriptionDefault
beforeNoISO timestamp from earlierBefore: the page of messages older than it.
threadIdYesFrom ranla_list_threads or ranla_open_thread.

Output Schema

NameRequiredDescription
threadYes
messagesYesOldest first within the page
earlierCountNoMessages older than this page
earlierBeforeNoPass as before for the page of older messages; null when there are none

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly/non-destructive/non-open-world, so the safety profile is covered. The description adds real behavior beyond that: results are ordered newest page first and older pages are reached via the before cursor, plus it surfaces that approvals appear inline and route to ranla_approve.

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

Conciseness5/5

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

A single dense sentence front-loads the verb and resource, the parenthetical enumerates content, and the trailing clause covers pagination. No filler and nothing misplaced.

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

Completeness4/5

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

For a two-parameter read tool with an output schema, the description covers what the thread holds, the ordering, and how to page backward, so an agent has what it needs. Only explicit sibling routing and any auth/permission notes are 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 meaning the schema does not fully convey by tying the output field earlierBefore to the input parameter before, clarifying the pagination contract between the two fields.

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

Purpose4/5

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

States a specific verb ('Read') and resource ('a Ranla thread') and enumerates what the thread contains (role, text, tools used, artifacts by id, approvals). An agent can distinguish it from a list tool, though it never explicitly names ranla_list_threads or ranla_open_thread as alternatives.

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 gives pagination guidance ('Pass earlierBefore as before for older messages') which is useful procedural context. However, it never says when to reach for this tool over ranla_list_threads or ranla_open_thread, so selection between 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.

ranla_list_approvalsList pending approvalsA
Read-only
Inspect

List pending Ranla approvals across threads.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
approvalsYesPending approvals across threads

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds the genuinely useful fact that results span threads rather than being scoped to one thread, but says nothing about ordering, limits, or whether the list is user-scoped.

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

Conciseness5/5

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

A single seven-word sentence with no filler, front-loading the verb and the scoping constraint. Nothing is wasted.

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?

An output schema exists, so return values need no explanation, and with zero parameters there is little else to specify. Only minor gaps remain around result scope and ordering.

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

Parameters4/5

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

Zero parameters, so the baseline is 4. Nothing in the schema needs explanation and the description correctly does not invent parameters.

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?

Specific verb (List) plus resource (pending Ranla approvals) and scope (across threads). This distinguishes it from ranla_list_threads and the action tools ranla_approve/ranla_reject, though it never names a sibling explicitly.

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

Usage Guidelines2/5

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

No statement of when to use this versus ranla_list_threads or ranla_get_thread, and no prerequisites. The only guidance is implied by the word 'pending'.

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

ranla_list_threadsList Ranla threadsA
Read-only
Inspect

List Ranla chat threads for this account, most recent first: id, title, desk, last activity and a one-line preview. Pass nextBefore as before for older threads. Read one with ranla_get_thread.

NameRequiredDescriptionDefault
limitNoThreads per page. Default 50, max 100.
beforeNoISO timestamp from nextBefore: only threads last active before it.

Output Schema

NameRequiredDescription
threadsYesMost recent first
nextBeforeNoPass as before for older threads; null on the last page

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, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful non-annotation behavior: result ordering, the compact shape of each row, and the cursor flow from the response's nextBefore into the before parameter.

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 tightly written sentences with the list/ordering information front-loaded, followed by pagination and routing instructions. No filler and every clause carries 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?

An output schema exists, so the description need not enumerate return values; instead it usefully cross-references nextBefore from the output back to the before input. For a 0-required-param read tool with annotations covering safety, nothing needed to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so both parameters are already documented, but the description adds meaning the schema does not: it explains that nextBefore from a prior response is what feeds the before parameter, turning two isolated params into a coherent pagination loop.

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 Ranla chat threads'), bounds the scope ('for this account'), and specifies ordering ('most recent first') plus the projected fields. It is clearly distinguishable from ranla_get_thread, which is named explicitly for the single-thread case.

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 gives concrete usage guidance: how to paginate ('Pass nextBefore as before for older threads') and which sibling to use to read an individual thread ('Read one with ranla_get_thread'). It does not state when-not to use this tool, but the routing context is clear.

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

ranla_messageMessage RanlaA
Destructive
Inspect

Send a message to Ranla and wait for the turn. Use for strategy and anything that changes the account. Returns text, artifacts (drafts, plans, and documents it made or opened, by id), and pendingApproval when a step needs approval. Long research turns are followed to the end; one still going after 15 minutes comes back with running: true, and ranla_get_thread reads the answer later.

NameRequiredDescriptionDefault
textYesMessage for Ranla
threadIdNoRanla thread id (from ranla_open_thread)

Output Schema

NameRequiredDescription
noteNo
textNoRanla's reply
errorNoSet when the turn failed
runIdNoThe turn's run, while it is followed
toolsNoSteps Ranla took in the turn
runningNoTrue when Ranla is still working after 15 minutes; read the answer with ranla_get_thread
threadIdYesThe thread the turn ran in
artifactsNoWhat Ranla made or opened, by id
connectRequiredNoAn account the founder must connect in the app before Ranla can go on
pendingApprovalNoThe step waiting on ranla_approve. It does nothing until approved.
connectsRequiredNoEvery account to connect, when there is more than one
pendingApprovalsNoEvery step waiting, when there is more than one
setAsideApprovalsNoApprovals that were waiting and were set aside by this message

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, destructiveHint=true, openWorldHint=true), the description discloses the blocking/waiting semantics, the artifact and pendingApproval return shapes, and the concrete 15-minute timeout behavior with running:true plus the follow-up path via ranla_get_thread. That timeout and follow-up contract is not derivable from annotations and is exactly what an agent needs to handle a long turn.

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 sentences, front-loaded with the action, then usage, then return shape, then the timeout edge case. Every sentence carries distinct information and nothing is repeated.

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 mutating, open-world tool with annotations and an output schema, the description covers when to use it, what it returns, and the async timeout path. The only gap is that it does not state that omitting threadId starts a new thread, leaving the optional-parameter behavior 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 text and threadId are already documented in the schema (including the pointer to ranla_open_thread). The description adds no parameter-level detail and never mentions threadId or what happens when it is omitted, 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 ('Send a message to Ranla and wait for the turn') and scopes the tool via 'strategy and anything that changes the account.' It implicitly separates itself from ranla_command but never names that sibling, so an agent must infer the boundary.

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 for strategy and anything that changes the account' gives clear positive selection criteria, and the closing sentence routes the agent to ranla_get_thread for late answers. There is no explicit 'do not use when...' statement or named alternative for simpler operations, so the boundary with ranla_command is left implicit.

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

ranla_open_threadOpen a Ranla threadA
Idempotent
Inspect

Find or create a durable Ranla thread for MCP (default title “MCP”). Returns { threadId, title }.

NameRequiredDescriptionDefault
titleNoThread title (default MCP)
threadIdNoReuse this thread id if it still exists

Output Schema

NameRequiredDescription
titleNo
threadIdYesPass to ranla_message and ranla_command

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare idempotentHint=true, openWorldHint=false, and non-destructive. The description adds that the thread is "durable" and states the return shape, which is useful, but adds little behavioral depth beyond the annotations (e.g., no mention of what happens if threadId is invalid, no auth notes).

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

Conciseness5/5

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

A single efficient sentence that front-loads the core action and appends return shape. Nothing 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?

An output schema exists, so return shape needn't be spelled out at length, though it is. For a simple 2-param, 0-required tool with rich annotations, the description is largely complete; the only gap is interaction semantics when both params are provided.

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 documented in the schema with descriptions, so baseline is 3. The description repeats the default title "MCP" but adds no semantics beyond what the schema already provides, such as precedence when both title and threadId are supplied.

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 (find or create) and resource (durable Ranla thread), making the upsert semantics clear. It distinguishes itself from ranla_message and ranla_get_thread by the "find or create" framing, though it doesn't explicitly name siblings.

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 find-or-create semantics: use when you have no thread yet, or want to reuse one. But there's no explicit when-to-use vs alternatives like ranla_get_thread or ranla_message, and no exclusions stated.

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

ranla_rejectReject a Ranla stepA
Destructive
Inspect

Reject a pending Ranla approval and resume the run.

NameRequiredDescriptionDefault
messageIdYesThe pending approval's messageId, from ranla_list_approvals or a pendingApproval result

Output Schema

NameRequiredDescription
textNoRanla's reply
errorNoSet when the turn failed
toolsNoSteps Ranla took in the turn
artifactsNoWhat Ranla made or opened, by id
connectRequiredNoAn account the founder must connect in the app before Ranla can go on
pendingApprovalNoThe step waiting on ranla_approve. It does nothing until approved.
connectsRequiredNoEvery account to connect, when there is more than one
pendingApprovalsNoEvery step waiting, when there is more than one

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=true, openWorldHint=false), so the description's job is narrower. It still adds real value by disclosing the post-condition — the run resumes — which annotations cannot express. It omits reversibility, staleness/error behavior, and any permission requirements, keeping 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?

A single front-loaded sentence pairing the action with its effect. No filler, no restatement of the title, and the behavioral consequence is placed where it will be read first.

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?

An output schema exists, so return values need not be explained, and the one parameter is fully covered. Still, for a destructive mutation it should say more about failure modes — already-resolved approvals, whether the rejection is reversible, and who can reject — leaving it adequate but with clear gaps.

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

Parameters3/5

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

Schema description coverage is 100% and the single messageId parameter is already documented in the schema, including its source (ranla_list_approvals or a pendingApproval result). The description adds no format, validation, or sourcing detail beyond that, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb ('Reject') and a specific resource ('a pending Ranla approval'), plus the condition under which rejection is valid. It implicitly contrasts with the sibling ranla_approve, but never names it, so an agent must infer the pairing rather than being told.

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 word 'pending' supplies the precondition for use, implying the agent must have an unresolved approval (obtained via ranla_list_approvals/ranla_get_thread). However, there is no explicit when-not guidance, no mention of the approve alternative, and no statement about what happens if the approval is already resolved or expired.

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

remove_suppressionRemove suppressionC
Destructive
Inspect

Remove a suppression by id or email address.

NameRequiredDescriptionDefault
idNoSuppression id
emailNoEmail address (alternative to id)

Output Schema

NameRequiredDescription
okYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, which tell the agent this is an irreversible-style mutation. The description adds nothing behavioral beyond restating the removal action - no note on irreversibility, auth requirements, or behavior when the target is absent.

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

Conciseness4/5

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

A single front-loaded sentence with zero filler. It is efficient, though the brevity comes partly at the cost of the usage and behavioral context noted elsewhere.

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?

An output schema exists, so return values need not be explained, and both params are fully documented in the schema. For a destructive tool it is still thin - nothing about irreversibility or missing-target behavior - leaving it only minimally adequate.

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 both id and email, including the 'alternative to id' relationship. The description's 'by id or email address' repeats the schema rather than adding format or constraint detail, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb (remove) and resource (suppression), and the id/email targeting clarifies scope. It is distinguishable from add_suppression and list_suppressions by the verb, though it does not explicitly name those siblings.

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

Usage Guidelines2/5

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

The description gives no when-to-use context, no exclusions, and no pointer to alternatives. It does not tell the agent when removal is appropriate versus using list_suppressions to inspect first, nor any prerequisites.

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

send_emailSend emailA
Destructive
Inspect

Send an email. Provide subject + html/text, or a published template_id / template_alias with optional variables. Set scheduled_at to send later (cancel with cancel_email).

NameRequiredDescriptionDefault
ccNoCc recipients: one address, several separated by commas, or an array of addresses
toYesRecipients: one address, several separated by commas, or an array of addresses
bccNoBcc recipients: one address, several separated by commas, or an array of addresses
fromYesSender address on a verified domain (or `Name <address>`). Before a domain is verified, use the sandbox sender noreply@mail.ranla.ai and send only to the account email.
htmlNoHTML body. Send html, text or both, unless you use a template
tagsNoTags as name → value, for filtering and webhooks
textNoPlain-text body. Sent alongside html, or on its own
headersNoExtra email headers as name → value
subjectNoOptional when using a published template
categoryNoDefault transactional. product and newsletter add an unsubscribe link and skip recipients who opted out of that category.
reply_toNoReply-To: one address, several separated by commas, or an array of addresses
variablesNoTemplate variables when using template_id or template_alias
template_idNoPublished template id
unsubscribeNoAdd a managed unsubscribe link to this send
scheduled_atNoISO 8601 time to send, e.g. 2026-10-01T09:00:00Z
template_aliasNoPublished template alias
idempotency_keyNoRetry-safe key: the same key within 24 hours returns the first send instead of sending twice

Output Schema

NameRequiredDescription
idYesEmail id (msg_…)
statusYesDelivery status, e.g. queued, scheduled, sent, cancelled

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=true, so the risky/irreversible nature of a live external send is covered structurally. The description adds scheduling behavior and the cancel_email counterpart, but says nothing about deliverability consequences, rate limits, or what an outbound send does to suppression/opt-out state. Adds some value over annotations, not a lot.

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

Conciseness5/5

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

Three short sentences, zero filler, and the core action is front-loaded ahead of the mode conditions and the scheduling escape hatch. Each clause carries distinct operational 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 an output schema present, return values need not be described, and the schema carries the 17 parameters, sandbox-sender rule, and idempotency behavior. The description covers action, content modes, and scheduling, which is sufficient for correct invocation, though it omits any note on failure behavior or prerequisites like verified domains.

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 per-parameter meaning is already documented in full and the baseline is 3. The description reinforces the cross-cutting rule that subject is optional when a template is used, but that relationship is already stated in the subject and html/text schema descriptions, so it adds little 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 (send an email) and immediately qualifies the two content modes: subject + html/text, or a published template_id/template_alias with variables. That is enough to separate it from siblings like create_template, publish_template, and send_test_webhook_event 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?

Gives conditional usage for the two send modes and explicitly names the alternative for the deferral case ('Set scheduled_at to send later (cancel with cancel_email)'). It stops short of when-not-to-use guidance, such as preferring a template over inline bodies or preconditions on domain verification, which is left to the schema.

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

send_test_webhook_eventSend test webhook eventBInspect

Simulate a webhook event (POST /emails/test) for CI or local webhook testing. Optionally deliver to subscribed endpoints.

NameRequiredDescriptionDefault
eventYesEmail event to simulate (email.received cannot be simulated — send a real inbound message)
deliverNoWhen true (default), enqueue delivery to account webhooks
email_idNoOptional existing email id (msg_…)
webhook_idNoDeliver to this one webhook endpoint only

Output Schema

NameRequiredDescription
okYes
payloadNoThe simulated event payload, as a webhook would receive it
deliveredNoTrue when it was sent to webhook endpoints
deliveriesNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=true, so the write-but-not-destructive profile is covered. The description adds that events can be delivered to subscribed endpoints, a real side effect, but 'Optionally deliver' sits awkwardly against the schema's default-true 'deliver' flag, leaving the default behavior ambiguous.

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

Conciseness4/5

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

Two compact sentences with the core action front-loaded and the endpoint tucked into parentheses rather than padding the opening. No wasted clauses.

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?

An output schema exists, so return values need no explanation, and the purpose is clear. However, for a tool that fires real webhook deliveries, the description should clarify the default delivery behavior and any environment restrictions; that gap keeps it at adequate rather than complete.

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

Parameters3/5

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

Schema description coverage is 100%, so the four parameters are fully documented in the schema itself and the baseline is 3. The description adds only the loose notion of optional delivery and nothing about email_id, webhook_id, or the event enum's constraints.

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

Purpose4/5

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

The description names a specific verb and resource ('Simulate a webhook event'), pins the underlying endpoint (POST /emails/test), and states the intended scenario (CI or local webhook testing). That is enough to separate it from send_email or create_webhook, though it never names a sibling explicitly.

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

Usage Guidelines3/5

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

'for CI or local webhook testing' implies the intended context, but there is no statement of when NOT to use it (e.g. use send_email for real sends) and no named alternative. Usage is inferable rather than prescribed.

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

verify_domainVerify domainA
Idempotent
Inspect

Verify DNS for a sending domain after records are applied.

NameRequiredDescriptionDefault
domainYesDomain id or name (example.com)

Output Schema

NameRequiredDescription
autoNo
checksNo
domainYes
recordsNoSending DNS records to add at the DNS provider
analysisNoDMARC and BIMI findings for the domain
verifiedYesTrue once DNS checks out. A domain whose DNS is not ready comes back as an error instead.
inbound_noteNo
tracking_dnsNoThe tracking record, when tracking is on
inbound_errorNo
signing_readyNoTrue when the mail server can sign mail for the domain
inbound_pendingNo
inbound_recordsNoRecords for inbound receiving
inbound_configuredNo
mail_server_signingNo
mail_server_registeredNo

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds only the sequencing constraint; it says nothing about what state changes on success/failure, how long propagation takes, or whether the check is synchronous, which are the behaviors an agent actually needs 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?

One sentence, front-loaded with the action and resource, and every clause (DNS, sending domain, after records applied) carries information. No filler.

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?

An output schema exists so return values need not be explained, and the single parameter is fully documented. However, for a DNS verification tool the description omits practically relevant context such as propagation delay, expected failure modes, or whether re-verification is safe to repeat.

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

Parameters3/5

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

Schema coverage is 100% and the single 'domain' parameter is documented as an id-or-name, so the schema carries the load. The description adds no format or syntax detail beyond that, which is the expected baseline when the schema is complete.

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') plus the resource and scope ('DNS for a sending domain'), which is more precise than the bare title. It is distinguishable from the adjacent write tool apply_domain_dns, though it never names it or any 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 Guidelines3/5

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

'after records are applied' supplies a clear prerequisite/sequencing cue relative to apply_domain_dns, but there are no explicit when-not conditions, no mention of retry cadence, and no named alternative. Usage is implied rather than stated.

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

Publisher details

Operator
Ranla · Publisher source
Vendor relationship
First-party · Publisher source
Restrictions
Requires a free Ranla account. · Publisher source

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to answer growth questions in plain English by connecting to marketing and product data via 49 MCP tools.
    25
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Growth marketing, SEO and GEO as agent tools: 29 tools for AI answer visibility across ChatGPT, Gemini, Perplexity and Google AI Overviews, a ranked backlog of growth moves, drafted deliverables, and ship actions. Hosted remote server at https://afterlaunch.io/api/mcp.
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides AI agents with unified marketing toolkits for SEO, GEO, paid media, and analytics, enabling audits, analysis, and approved changes across GA4, Search Console, Google Ads, Meta, X, LinkedIn, Reddit, TikTok, WordPress, and GoHighLevel.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources