commune-mcp
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@commune-mcpCheck my support inbox for new emails"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Email for Claude Desktop, Cursor & Windsurf
Give Claude (or any MCP client) a real email inbox and SMS. Install in 30 seconds — no cloning required.
Your AI agent can:
Read email — list threads, search by topic, get full message history
Send email — reply in existing threads, compose fresh messages, attach files
Manage inboxes — create programmatic inboxes, set up custom domains, triage with tags and status
Track delivery — get delivery stats, suppression lists, bounce and complaint events
Send and receive SMS — provision phone numbers, send messages, search SMS history
Works with Claude Desktop, Cursor, Windsurf, or any MCP client.
Install via Smithery
Commune is published on Smithery. One-line install for any supported client:
# Install Smithery CLI (once)
npm install -g @smithery/cli@latest
# Add Commune to your client
npx @smithery/cli install commune-dev/commune --client claude # Claude Desktop
npx @smithery/cli install commune-dev/commune --client cursor # Cursor
npx @smithery/cli install commune-dev/commune --client windsurf # Windsurf
npx @smithery/cli install commune-dev/commune --client vscode # VS Code
npx @smithery/cli install commune-dev/commune --client claude-code # Claude Code
npx @smithery/cli install commune-dev/commune --client cline # Cline
npx @smithery/cli install commune-dev/commune --client roo-cline # Roo Code
npx @smithery/cli install commune-dev/commune --client goose # GooseOr connect via the Smithery API for agent-to-agent use:
https://commune--commune-dev.run.toolsRelated MCP server: Envoi MCP
Example prompts
Once configured, you can give your AI assistant natural language instructions for email and SMS:
Reading email:
"Check my support inbox for new emails"
"Show me all unread threads in the billing inbox"
"Find emails from customers asking about refunds this week"
"Search for all threads about the payment issue from last month"
"What's the full conversation history for thread conv_abc123?"
"Show me all threads that haven't been replied to"
Sending email:
"Reply to John's email saying we'll process his refund within 48 hours"
"Send an email to alice@example.com with subject 'Meeting tomorrow' and tell her the meeting is moved to 3pm"
"Reply to the last message in the support thread about the broken login, staying in thread"
"Send a follow-up to all leads from last week who didn't respond"
Organizing and triaging:
"Tag this thread as urgent and assign it to the billing team"
"Mark all threads older than 30 days with no reply as closed"
"Show me the deliverability stats for the past 7 days"
"List all suppressed email addresses in the support inbox"
SMS:
"Provision a phone number for my agent"
"Send an SMS to +14155551234 saying 'Your order has shipped'"
"Show me all my SMS conversations"
"Search my SMS messages for anything about delivery issues"
Domain and inbox management:
"Create a new inbox called 'billing' under example.com"
"What DNS records do I need to add to verify example.com?"
"Show me all my verified domains"
Setup
1. Get your API key
Create an API key from your Commune dashboard. It starts with comm_.
2. Add to your MCP client
Pick your client and add the Commune server. No local files needed — uvx fetches the package automatically.
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
{
"mcpServers": {
"commune": {
"command": "uvx",
"args": ["commune-mcp"],
"env": {
"COMMUNE_API_KEY": "comm_your_key_here"
}
}
}
}Cursor
Open Settings → MCP → Add Server:
{
"commune": {
"command": "uvx",
"args": ["commune-mcp"],
"env": {
"COMMUNE_API_KEY": "comm_your_key_here"
}
}
}Windsurf
Open Settings → MCP, same format as Cursor.
Alternative: pip install
If you prefer pip over uvx:
pip install commune-mcpThen use commune-mcp as the command:
{
"commune": {
"command": "commune-mcp",
"env": {
"COMMUNE_API_KEY": "comm_your_key_here"
}
}
}How It Works
Once configured, your AI agent can use Commune tools in natural conversation:
You: Check my support inbox for new emails
Agent: (calls
list_domains→list_inboxes→list_threads) You have 3 new threads in support@example.com:
"Order not received" — 4 messages, last activity 2h ago
"Billing question" — 1 message, received today
"Feature request" — 2 messages, last activity yesterday
You: What's the order issue about?
Agent: (calls
get_thread_messages) Customer john@gmail.com says their order #4521 shipped 5 days ago but hasn't arrived. They've followed up twice asking for tracking info.
You: Reply that we're checking with shipping and will update within 24h
Agent: (calls
send_emailwiththread_id) Done — reply sent to john@gmail.com in the existing thread.
The agent decides which tools to call based on your request. You don't need to specify tool names.
How email flows through Commune MCP
Inbound (you receive email):
User sends email
|
v
Commune receives at your inbox (support@yourdomain.com)
|
v
Commune fires webhook to your app (8 retries, HMAC signed)
|
v
Your MCP client reads thread via list_threads / get_thread_messages
|
v
You ask Claude: "Reply to John saying we're on it"
|
v
Claude calls send_email with thread_id --> reply appears in John's email threadOutbound (you send email):
You: "Send an update email to all VIP customers"
|
v
Claude calls list_threads --> get_thread_messages --> send_email (per thread)
|
v
Commune delivers via DKIM-signed SMTP
|
v
Delivery events tracked: sent --> delivered / bounced / complainedTools Reference
Domain Tools
These manage your email domains. Domains must be verified via DNS before you can send/receive.
list_domains
List all email domains in your account.
Parameters: None
Output:
[
{
"id": "d_abc123",
"name": "example.com",
"status": "verified",
"region": "us-east-1"
}
]create_domain
Create a new custom domain. After creating, use get_domain_records to see required DNS entries, then verify_domain to check.
Parameter | Type | Required | Description |
|
| Yes | Domain name (e.g. |
|
| No | AWS region (e.g. |
Output: The created domain object with its ID and status.
get_domain_records
Get DNS records you need to add at your registrar before verification passes.
Parameter | Type | Required | Description |
|
| Yes | Domain ID from |
Output:
[
{ "type": "MX", "name": "example.com", "value": "inbound-smtp.us-east-1.amazonaws.com", "status": "pending" },
{ "type": "TXT", "name": "example.com", "value": "v=spf1 include:amazonses.com ~all", "status": "pending" }
]verify_domain
Trigger DNS verification. Call after adding records at your registrar.
Parameter | Type | Required | Description |
|
| Yes | Domain ID |
Inbox Tools
Inboxes are mailboxes under a domain. support under example.com → support@example.com.
list_inboxes
List inboxes. Without domain_id, lists all inboxes across all domains.
Parameter | Type | Required | Description |
|
| No | Filter by domain (lists all if omitted) |
Output:
[
{
"id": "i_xyz789",
"localPart": "support",
"address": "support@example.com",
"webhook": { "endpoint": "https://..." }
}
]create_inbox
Create a new inbox. Domain is auto-resolved if not provided — no DNS setup needed.
Parameter | Type | Required | Description |
|
| Yes | Part before |
|
| No | Domain to create under. Auto-resolved if omitted. |
|
| No | Agent name for the inbox |
|
| No | Sender display name shown in email clients |
|
| No | URL for email notifications |
delete_inbox
Delete an inbox permanently.
Parameter | Type | Required | Description |
|
| Yes | Domain ID |
|
| Yes | Inbox ID |
set_extraction_schema
Configure structured extraction for an inbox using a JSON Schema.
Parameter | Type | Required | Description |
|
| Yes | Domain ID |
|
| Yes | Inbox ID |
|
| Yes | Schema name |
|
| Yes | JSON string of schema object |
|
| No | Human-readable description |
|
| No | Enable extraction (default true) |
remove_extraction_schema
Remove structured extraction from an inbox.
Parameter | Type | Required | Description |
|
| Yes | Domain ID |
|
| Yes | Inbox ID |
Thread Tools
Threads are email conversations — groups of related messages. These are the most commonly used tools.
list_threads
List threads for an inbox with cursor-based pagination. Returns newest first by default.
Parameter | Type | Required | Description |
|
| One of these | Filter by inbox |
|
| required | Filter by domain |
|
| No | 1–100, default 20 |
|
| No | Pagination cursor from previous response |
|
| No |
|
Output:
{
"data": [
{
"thread_id": "conv_abc123",
"subject": "Order not received",
"message_count": 4,
"last_message_at": "2025-03-15T14:30:00Z",
"snippet": "Hi, I ordered 5 days ago and still haven't...",
"last_direction": "inbound",
"has_attachments": false
}
],
"next_cursor": "eyJsYXN0...",
"has_more": true
}To get the next page, pass next_cursor as the cursor parameter.
get_thread_messages
Get all messages in a thread. Returns oldest first (chronological).
Parameter | Type | Required | Description |
|
| Yes | Thread ID from |
|
| No | 1–1000, default 50 |
|
| No |
|
Output:
[
{
"message_id": "msg_001",
"direction": "inbound",
"participants": [
{ "role": "sender", "identity": "john@gmail.com" },
{ "role": "to", "identity": "support@example.com" }
],
"content": "Hi, I placed order #4521 five days ago...",
"metadata": {
"subject": "Order not received",
"created_at": "2025-03-10T09:15:00Z"
}
},
{
"message_id": "msg_002",
"direction": "outbound",
"content": "We're looking into this for you...",
"metadata": {
"subject": "Re: Order not received",
"created_at": "2025-03-10T10:30:00Z"
}
}
]Search Tools
search_threads
Search across email threads by subject or content. Uses vector search (semantic) when available, falls back to text matching.
Parameter | Type | Required | Description |
|
| Yes | Search query (natural language) |
|
| One of these | Filter by inbox |
|
| required | Filter by domain |
|
| No | 1–100, default 20 |
Triage Tools
Manage thread status, tags, and assignment — agent-native workflow primitives.
get_thread_metadata
Get triage metadata for a thread: tags, status, and assignment.
Parameter | Type | Required | Description |
|
| Yes | Thread ID |
set_thread_status
Set the triage status of a thread.
Parameter | Type | Required | Description |
|
| Yes | Thread ID |
|
| Yes |
|
tag_thread
Add tags/labels to a thread. Tags are additive — existing tags are preserved.
Parameter | Type | Required | Description |
|
| Yes | Thread ID |
|
| Yes | Comma-separated tags (e.g. |
untag_thread
Remove tags from a thread.
Parameter | Type | Required | Description |
|
| Yes | Thread ID |
|
| Yes | Comma-separated tags to remove |
assign_thread
Assign a thread to an agent or user. Pass empty to unassign.
Parameter | Type | Required | Description |
|
| Yes | Thread ID |
|
| No | Agent/user identifier (empty to unassign) |
Deliverability Tools
get_deliverability_stats
Get delivery metrics: sent, delivered, bounced, complained, failed counts and rates.
Parameter | Type | Required | Description |
|
| One of these | Filter by inbox |
|
| required | Filter by domain |
|
| No |
|
get_suppressions
List suppressed email addresses (bounces, complaints, unsubscribes).
Parameter | Type | Required | Description |
|
| No | Filter by inbox |
|
| No | Filter by domain |
|
| No | Max results (default: 50) |
get_delivery_events
Get delivery event log for tracking individual emails.
Parameter | Type | Required | Description |
|
| No | Filter for a specific message |
|
| No | Filter by inbox |
|
| No | Filter by domain |
|
| No |
|
|
| No | Max results (default: 50) |
Message Tools
send_email
Send an email. Can send fresh emails or reply within an existing thread.
Parameter | Type | Required | Description |
|
| Yes | Recipient(s), comma-separated for multiple |
|
| Yes | Subject line |
|
| No* | HTML body |
|
| No* | Plain text body |
|
| No | Sender address |
|
| No | Reply-to address |
|
| No | Reply in existing thread |
|
| No | Send from specific inbox |
|
| No | Send from specific domain |
|
| No | Comma-separated attachment IDs |
*Provide at least html or text.
To reply in a thread, pass the thread_id from list_threads or get_thread_messages. The email will be threaded in the recipient's mailbox.
Attachment Tools
upload_attachment
Upload a file. Returns an attachment_id to use with send_email.
Parameter | Type | Required | Description |
|
| Yes | Base64-encoded file content |
|
| Yes | Filename (e.g. |
|
| Yes | MIME type (e.g. |
Output:
{
"attachment_id": "att_abc123",
"filename": "report.pdf",
"mime_type": "application/pdf",
"size": 45230
}get_attachment_url
Get a temporary download URL for an attachment.
Parameter | Type | Required | Description |
|
| Yes | Attachment ID |
|
| No | Seconds until URL expires (default: 3600) |
Output:
{
"url": "https://res.cloudinary.com/...",
"expires_in": 3600,
"filename": "report.pdf",
"mime_type": "application/pdf",
"size": 45230
}Phone Number Tools
Manage provisioned phone numbers for SMS.
list_phone_numbers
List all provisioned phone numbers in your account.
Parameters: None
get_phone_number
Get details for a single provisioned phone number.
Parameter | Type | Required | Description |
|
| Yes | Phone number ID from |
list_available_phone_numbers
Browse available phone numbers before purchasing.
Parameter | Type | Required | Description |
|
| No |
|
|
| No | Two-letter country code (default: |
|
| No | Max results (default: 10) |
provision_phone_number
Purchase a phone number for SMS. Deducts credits from your balance.
Parameter | Type | Required | Description |
|
| No | Specific E.164 number to buy (auto-selected if omitted) |
|
| No |
|
|
| No | Human-readable label |
update_phone_number
Update a phone number's friendly name or auto-reply message.
Parameter | Type | Required | Description |
|
| Yes | Phone number ID |
|
| No | Human-readable label |
|
| No | Auto-reply text for all inbound SMS (empty string to disable) |
release_phone_number
Release a provisioned phone number back to the pool. No credit refund. Message history is retained.
Parameter | Type | Required | Description |
|
| Yes | Phone number ID to release |
set_phone_number_webhook
Configure a webhook for a phone number to receive SMS event notifications.
Parameter | Type | Required | Description |
|
| Yes | Phone number ID |
|
| Yes | HTTPS URL to receive webhook payloads |
|
| No | Webhook signing secret for payload verification |
|
| No | Event types (default: |
set_phone_number_allow_list
Set the allow list for a phone number — only these numbers can send SMS to it. Replaces existing list.
Parameter | Type | Required | Description |
|
| Yes | Phone number ID |
|
| Yes | E.164 phone numbers to allow (empty list to clear) |
set_phone_number_block_list
Set the block list for a phone number — these numbers are rejected. Replaces existing list.
Parameter | Type | Required | Description |
|
| Yes | Phone number ID |
|
| Yes | E.164 phone numbers to block (empty list to clear) |
SMS Tools
send_sms
Send an SMS message.
Parameter | Type | Required | Description |
|
| Yes | Recipient in E.164 format (e.g. |
|
| Yes | SMS message text |
|
| No | Send from a specific phone number (auto-assigned if omitted) |
list_sms_conversations
List SMS conversation threads.
Parameter | Type | Required | Description |
|
| No | Filter by phone number (lists all if omitted) |
|
| No | 1–100, default 20 |
get_sms_thread
Get all messages in an SMS thread with a specific number.
Parameter | Type | Required | Description |
|
| Yes | External phone number in E.164 format |
|
| Yes | Your Commune phone number ID |
search_sms
Semantic search across SMS messages.
Parameter | Type | Required | Description |
|
| Yes | Search query |
|
| No | Scope to a specific phone number |
|
| No | 1–100, default 20 |
list_sms_suppressions
List phone numbers suppressed from receiving SMS (opted out via STOP keyword).
Parameter | Type | Required | Description |
|
| No | Filter by phone number (lists all if omitted) |
remove_sms_suppression
Remove a phone number from the SMS suppression list (re-enable SMS delivery).
Parameter | Type | Required | Description |
|
| Yes | E.164 phone number to remove from suppressions |
Credits Tools
get_credit_balance
Get current credit balance for your Commune account.
Parameters: None
list_credit_bundles
List available credit bundles that can be purchased.
Parameters: None
credits_checkout
Create a Stripe checkout session to purchase a credit bundle.
Parameter | Type | Required | Description |
|
| Yes | Bundle ID: |
|
| No | URL to redirect to after payment |
FAQ
How do I add Commune to Claude Desktop?
Edit ~/Library/Application Support/Claude/claude_desktop_config.json and add the commune MCP server block (see Setup above). Restart Claude Desktop. The Commune tools will appear in Claude's tool list automatically.
What's the difference between commune-mcp and the Python/TypeScript SDKs? commune-mcp is for interactive use in MCP clients like Claude Desktop or Cursor — you give natural language instructions and the AI calls the tools. The Python/TypeScript SDKs are for building autonomous agents programmatically in code. Both connect to the same Commune backend.
Does it work with Cursor's agent mode? Yes. Add commune-mcp to Cursor via Settings → MCP → Add Server using the JSON block shown in the Setup section. Once configured, Cursor's agent mode can use all Commune tools — reading threads, sending email, and managing inboxes — during any chat or Composer session.
How do I create a new inbox through the MCP server?
Just ask: "Create a new inbox called support under example.com." The agent will call create_inbox with local_part: "support" and your domain ID. If you don't specify a domain, Commune auto-assigns one — so you can create an inbox with just a local part and no DNS configuration.
Can Claude actually send real emails through this?
Yes. When the agent calls send_email, Commune delivers a real email via DKIM-signed SMTP to the recipient's inbox. The email appears exactly like a normal email — it threads correctly in Gmail and Outlook, supports HTML and attachments, and generates delivery events you can track.
What happens to emails that arrive while I'm not in a chat session?
Commune stores all inbound emails and threads persistently. When you open a new chat and ask to check your inbox, the agent calls list_threads and retrieves everything that arrived since your last session. Optionally, you can configure a webhook on each inbox so your app gets notified in real-time (8 retries, HMAC-signed).
How do I reply in a thread instead of starting a new email?
Pass the thread_id to send_email. The easiest way is to say "Reply to this thread saying..." after asking the agent to show you a thread — it will keep the thread_id in context and pass it automatically. The reply appears threaded in the recipient's email client.
Is my email content private? Your email content is transmitted over TLS and stored encrypted at rest on Commune's infrastructure. API keys authenticate every request, and webhooks are HMAC-signed so your app can verify the payload hasn't been tampered with. Your content is never used for training AI models.
Can I use this with my own email domain?
Yes. Use create_domain to register your domain, then get_domain_records to see the required MX, TXT, and CNAME records, add them at your registrar, and call verify_domain. Once verified, all inboxes under that domain use your domain as the sender address (e.g. support@yourdomain.com).
What does the API key look like?
Commune API keys start with the prefix comm_ followed by a random string — for example, comm_sk_live_abc123xyz. Create one from your Commune dashboard. Keep it secret: treat it like a password and never commit it to source control.
How do I search my inbox for a specific topic?
Use the search_threads tool by asking naturally: "Search my support inbox for emails about refunds." The agent calls search_threads with your query. Commune uses semantic search, so it finds relevant threads even if the exact words don't match — for example, "money back" will surface threads about refunds.
Can multiple people use the same Commune MCP server?
Yes. Commune uses organizations — multiple team members can share the same account and API key, or each member can have their own API key scoped to the same organization. All keys access the same domains and inboxes. For isolation between projects, create separate inboxes (e.g. billing@, support@) and filter by inbox_id in tool calls.
Environment Variables
Variable | Required | Description |
| Yes | Your API key (starts with |
| No | Override API URL (default: Commune cloud) |
Ecosystem
Package | Description |
Email & SMS infrastructure — self-hostable backend | |
TypeScript/Node.js SDK | |
Python SDK | |
MCP server for Claude Desktop, Cursor, Windsurf | |
Command-line interface |
License
Apache-2.0
Available Tools
27 toolsassign_threadA
Assign a thread to an agent or user. Pass null/empty to unassign.
Args: thread_id: The thread ID assigned_to: Agent/user identifier to assign to (empty or omit to unassign)
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | ||
| assigned_to | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and explicitly discloses that passing null or empty unassigns, which is a key behavioral trait. It doesn't discuss permissions or error cases, but the core semantics are transparent for a simple mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus a minimal args list; every sentence serves a purpose and the main action is front-loaded. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter assignment tool with an output schema, the description covers the operation, parameter semantics, and unassign behavior. It doesn't address edge cases, but overall context is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description compensates by explaining assigned_to semantics (empty/omit = unassign) and clarifying thread_id. The assigned_to definition adds meaning beyond the schema's type/default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'assign' with a clear resource 'thread' and target 'agent or user', and distinguishes itself from sibling thread tools like tag_thread or set_thread_status by describing a distinct operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (to manage thread assignment) and explicitly explains the unassign behavior, but it doesn't name alternatives or exclusion scenarios. It's functional but lacks explicit 'use this instead of X' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_domainA
Create a new custom email domain.
After creating a domain, you need to:
Call get_domain_records to see the required DNS records
Add those records at your domain registrar
Call verify_domain to check verification status
Args: name: Domain name, e.g. "example.com" region: AWS region (optional), e.g. "us-east-1" or "eu-west-1"
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| region | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the required follow-up sequence (DNS records, verification), which is critical context. It does not mention potential side effects like cost or errors, but the workflow transparency is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by a concise numbered list of required next steps and an Args section. Every sentence adds value, and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (not shown), the description need not explain return values. It covers the creation workflow and required post-steps, making it contextually complete for a create operation. Minor gaps like prerequisites or failure handling exist, but they are implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so effectively by explaining 'name' with a domain example and 'region' as an optional AWS region with examples. This adds meaning well beyond the raw schema types and required list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Create a new custom email domain' with a specific verb and resource, clearly distinguishing it from sibling tools like get_domain_records and verify_domain. The purpose is immediately obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear post-creation workflow: call get_domain_records, add DNS records, then verify_domain. This implies this tool is the initial step, but it does not explicitly mention when not to use it or alternatives beyond the follow-up steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_inboxA
Create a new inbox for receiving emails.
The inbox email address will be {local_part}@{domain}. If no domain_id is provided, Commune auto-assigns your inbox to an available domain — no DNS setup required.
Args: local_part: Part before @ (e.g. "support", "billing", "hello") domain_id: Domain to create under (optional, auto-resolved if omitted) name: Agent name for the inbox (optional, also used as display_name fallback) display_name: Sender display name shown in email clients (e.g. "Support Agent", "Acme Sales"). If set, outbound emails show as '"Display Name" ' in Gmail/Outlook. webhook_endpoint: URL to receive notifications on new emails (optional)
| Name | Required | Description | Default |
|---|---|---|---|
| local_part | Yes | ||
| domain_id | No | ||
| name | No | ||
| display_name | No | ||
| webhook_endpoint | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses useful behavioral detail (auto-assign to available domain if domain_id omitted; no DNS setup needed) but does not cover failure modes, uniqueness constraints, or confirmation behavior. While it adds value, a more complete picture would improve safety and predictability for a write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a lead statement, a concise explanation of the auto-assignment behavior, and a clear list of argument meanings. No word is wasted. Each part earns its place and the format is easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 params, one required) and the presence of an output schema, the description provides near-complete invocation guidance. It covers all params, the core behavior, and a deployment nuance. It doesn't detail return values (output schema likely covers that) but is otherwise adequate for correct use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (no parameter descriptions in schema), but the description thoroughly documents all five parameters, including examples (e.g., local_part as 'support', 'billing', display_name as 'Support Agent'). It explains the role of `name` as a fallback for display_name and clarifies `domain_id` is optional, which is exactly the semantic information the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Create a new inbox for receiving emails.' It also provides the resulting email address format, distinguishing this tool from siblings like list_inboxes or create_domain. The verb is specific ('Create') and the resource is well-defined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool (when you need a new inbox) and includes a key benefit ('no DNS setup required'). It doesn't explicitly mention alternatives or exclusion cases, but the purpose is distinct enough from sibling tools, and the auto-assignment note helps the agent decide when to omit domain_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
credits_checkoutA
Create a Stripe checkout session to purchase a credit bundle.
Returns a checkout_url to open in the browser to complete payment. Valid bundles: "starter", "growth", "scale".
Args: bundle: The bundle ID to purchase — "starter", "growth", or "scale" return_url: URL to redirect to after payment (optional)
| Name | Required | Description | Default |
|---|---|---|---|
| bundle | Yes | ||
| return_url | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the primary output ('Returns a checkout_url') and valid bundle options, which is useful. However, it does not mention potential side effects, prerequisites (e.g., authentication), or error behavior (e.g., invalid bundle handling). For a payment tool, more transparency about the actual charge and session behavior would be expected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the primary purpose, followed by the main output and valid bundles. The Args section is clean and directly useful. Every sentence contributes meaning without unnecessary fluff, making it well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists (and the description already mentions the key output), the description covers the essential inputs and valid values. It lacks information about error cases, authentication requirements, or whether the checkout session is immediately charged, but for a straightforward purchase tool, it is reasonably complete. The 0% schema coverage raises the burden, but the Args section mitigates this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must fully compensate. It does: the Args section explicitly explains both bundle (listing valid values) and return_url (optional, purpose). This adds significant semantic meaning that the schema itself lacks, making parameter understanding clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb+resource: 'Create a Stripe checkout session to purchase a credit bundle.' This distinguishes it from siblings like list_credit_bundles (listing) and get_credit_balance (querying). It is unambiguous about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage is implied: it is for purchasing a credit bundle and returns a checkout URL. However, it does not explicitly state when to use this tool versus alternatives, nor does it mention any exclusions. The description gives context (valid bundles, return_url) but lacks direct guidance on selecting this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_inboxC
Delete an inbox.
Args: domain_id: The domain ID inbox_id: The inbox ID to delete
| Name | Required | Description | Default |
|---|---|---|---|
| domain_id | Yes | ||
| inbox_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosing side effects. It only says 'Delete an inbox,' which restates the tool name and gives no details on permanence, permissions, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise, using a single sentence for purpose and a simple arg list. It is front-loaded and free of fluff, but it omits useful context that could be added without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a destructive function, but the description gives no context about consequences, when to use it, or what output to expect. The presence of an output schema doesn't compensate for missing operational details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description lists the two parameters with minimal explanations: 'The domain ID' and 'The inbox ID to delete.' These add only slightly to the schema's titles ('Domain Id', 'Inbox Id') and do not explain the meaning of a domain or why it's required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Delete an inbox,' which is a specific verb+resource statement. It distinguishes from siblings like create_inbox and list_inboxes by the delete verb, though it doesn't mention alternatives or scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus siblings such as create_inbox or list_inboxes. It lacks context about prerequisites, such as whether the inbox must be empty or belong to a specific domain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_attachment_urlA
Get a temporary download URL for an attachment.
Args: attachment_id: The attachment ID expires_in: URL lifetime in seconds (default: 3600 = 1 hour)
| Name | Required | Description | Default |
|---|---|---|---|
| attachment_id | Yes | ||
| expires_in | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It discloses that the URL is temporary and the default expiration (1 hour), but does not mention any other side effects, auth requirements, or error behavior. This is adequate for a simple get operation but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, with a clear first sentence followed by a concise parameter list. Every word earns its place; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (2 params, output schema exists). The description covers the core functionality and parameters, and with an output schema present, return values need not be spelled out. It could mention prerequisites like having an existing attachment ID, but overall it is sufficiently complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, but the description explains both parameters: attachment_id as 'The attachment ID' and expires_in as 'URL lifetime in seconds (default: 3600 = 1 hour)'. This adds meaning beyond the schema types and defaults, effectively compensating for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Get' with a clear resource 'temporary download URL for an attachment', and the 'temporary' qualifier distinguishes it from any other URL retrieval tool. It clearly states what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool vs alternatives, but the purpose is clear enough that it implies usage after an attachment has been uploaded. However, there are no exclusions or alternative tool references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_credit_balanceA
Get current credit balance for your Commune account.
Returns included credits, purchased credits, total available, and credits used this billing cycle.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It transparently lists the return components (included credits, purchased credits, total available, credits used this billing cycle), which gives the agent insight into what to expect. However, it doesn't mention any potential side effects or prerequisites, though for a simple getter this is largely sufficient. It adds value beyond the name by detailing the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the primary purpose, and free of any fluff or repetition. Every sentence adds value: the first states what it does, the second details the return fields. This is an exemplary model of conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (no parameters, no annotations, output schema exists), the description is fully complete. It clearly names the resource ('Commune account'), states the action, and enumerates the returned data. The agent has everything needed to select and invoke this tool correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is empty with 100% coverage. The description doesn't need to explain any parameters. Per the rubric, a baseline of 4 is appropriate for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get current credit balance for your Commune account.' This is a specific verb+resource structure that distinguishes it from siblings like 'list_credit_bundles' or 'credits_checkout'. It also enumerates the exact pieces of information returned, leaving no ambiguity about the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly conveys when to use this tool—whenever a user needs their current credit balance and its breakdown. It doesn't explicitly mention alternatives or exclusions, but the sibling tools are functionally distinct, so context alone is sufficient. The description is clear and unambiguous, warranting a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_deliverability_statsA
Get email deliverability metrics: sent, delivered, bounced, complained, failed.
Provides bounce rate, complaint rate, and delivery rate percentages. Use this to monitor sender reputation and identify deliverability issues.
Args: inbox_id: Filter metrics by inbox (recommended) domain_id: Filter metrics by domain period: Time period — "24h", "7d", "30d" (default: "7d")
| Name | Required | Description | Default |
|---|---|---|---|
| inbox_id | No | ||
| domain_id | No | ||
| period | No | 7d |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the metrics and rates returned, and recommends inbox_id filtering. However, it does not clarify aggregate scope when no filters are passed or mention read-only behavior explicitly, though the 'get' verb implies it. No contradiction with annotations (none exist).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with purpose. It has a clean structure with a purpose statement, a sentence on outputs, a usage context sentence, and an args list. Every sentence provides value without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description sufficiently covers purpose, usage, and all parameters. An output schema exists, so return value details are encoded elsewhere. It could mention when to prefer get_delivery_events for individual events, but this is not critical for basic tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no descriptions (0% coverage), so the description fully compensates by explaining each parameter: 'inbox_id: Filter metrics by inbox (recommended)', 'domain_id: Filter metrics by domain', and 'period: Time period — "24h", "7d", "30d" (default: "7d")'. This adds meaning beyond the schema properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get email deliverability metrics: sent, delivered, bounced, complained, failed' with a specific verb and resource. It also lists derived rates (bounce, complaint, delivery) and distinguishes itself from siblings like get_delivery_events (which fetches individual events) and get_suppressions (which manages suppressions), making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear use case: 'Use this to monitor sender reputation and identify deliverability issues.' It does not explicitly mention alternatives or when not to use the tool, but the context is sufficient for an agent to decide between this and related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_delivery_eventsA
Get delivery event log: sent, delivered, bounced, complained, failed.
Track the lifecycle of individual emails or audit delivery across an inbox.
Args: message_id: Filter events for a specific message inbox_id: Filter events by inbox domain_id: Filter events by domain event_type: Filter by type: "sent", "delivered", "bounced", "complained", "failed" limit: Max results (default: 50)
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | No | ||
| inbox_id | No | ||
| domain_id | No | ||
| event_type | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries full responsibility for behavioral transparency. It clearly indicates a read-only operation via 'Get' and lists the event types. However, it does not disclose pagination behavior, ordering, or any potential side effects. The lack of explicit safety statements is somewhat mitigated by the inherently read-only nature of the tool, but important behavioral details are missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is succinct and well-structured, with a brief summary followed by a clean Args list. Every sentence adds value, and there is no redundant or filler content. The format makes it easy for an agent to parse the core purpose and parameter semantics quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (five optional filters, output schema present), the description covers the essential aspects: purpose, filters, and default limit. It does not explain ordering or pagination behavior, but the presence of a limit parameter implies basic paging. Overall, the description is sufficiently complete for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no property descriptions (0% coverage). The description's Args list fully compensates by explaining all five parameters: message_id, inbox_id, domain_id, event_type, and limit. It provides enum-like values for event_type and the default limit, adding meaning beyond the schema's bare type information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get delivery event log' and enumerates the event types (sent, delivered, bounced, complained, failed), specifying the resource and action. It also explains the use case: 'Track the lifecycle of individual emails or audit delivery across an inbox.' This distinguishes it from sibling tools like get_deliverability_stats and get_suppressions by focusing on the event log itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: tracking individual email lifecycle or auditing delivery across an inbox. It implies when to use the tool but does not explicitly contrast it with alternatives or state when not to use it. There are no exclusionary guidelines, so this meets the 'clear context, no exclusions' criterion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_domain_recordsA
Get the DNS records required to verify a domain.
Returns MX, TXT, and CNAME records that must be added at your domain registrar before calling verify_domain.
Args: domain_id: The domain ID (from list_domains)
| Name | Required | Description | Default |
|---|---|---|---|
| domain_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full transparency burden. It correctly specifies the return types (MX, TXT, CNAME) and the registrar context, but it does not explicitly state that the operation is read-only/no side effects, nor does it mention potential error conditions, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and front-loaded, with the main purpose stated first. The return type summary and the parameter explanation each add value with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a single parameter and an output schema, the description covers the essential purpose, usage context, and parameter origin. The output schema handles return structure, so the description is sufficiently complete, though it could mention error scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only defines 'domain_id' as a string with 0% description coverage. The description compensates by explaining that the ID comes from list_domains, adding practical source context that the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'DNS records required to verify a domain.' It explicitly distinguishes from the sibling verify_domain by explaining these records are prerequisites for that action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by stating 'before calling verify_domain,' indicating when this tool should be used. It does not explicitly name alternatives or when-not scenarios, but the guidance is clear enough for a simple read operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_suppressionsA
List suppressed email addresses (bounces, complaints, unsubscribes).
Suppressed addresses are automatically skipped when sending. Use this to audit why certain recipients aren't receiving emails.
Args: inbox_id: Filter by inbox (optional) domain_id: Filter by domain (optional) limit: Max results (default: 50)
| Name | Required | Description | Default |
|---|---|---|---|
| inbox_id | No | ||
| domain_id | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden. It explains that suppressed addresses are automatically skipped during sending and that the tool lists them, which conveys read-only behavior and domain context. It doesn't mention rate limits or pagination beyond the limit parameter, but the output schema covers return structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: a one-line purpose, a one-line usage note, and a clear Args list. Every sentence serves a purpose and the structure makes parameters easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with an output schema and three optional parameters, the description covers purpose, usage, and parameters well. The existence of an output schema means return value details are already available. There are no missing critical details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description includes an Args section that explains each parameter (inbox_id, domain_id, limit) and their optional/default nature, while the schema only provides types and defaults. This fully compensates for the 0% schema description coverage and adds meaningful context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List suppressed email addresses' – a specific verb and resource – and immediately clarifies the types (bounces, complaints, unsubscribes). This clearly differentiates it from sibling tools like list_sms_suppressions and get_delivery_events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Use this to audit why certain recipients aren't receiving emails' provides a clear context for when to invoke the tool. It doesn't explicitly compare to alternatives or state when not to use it, so it falls short of a perfect 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_thread_messagesA
Get all messages in an email thread.
Returns the full conversation with sender, content, timestamps.
Args: thread_id: The thread ID (from list_threads) limit: Max messages, 1-1000 (default: 50) order: "asc" for chronological (default), "desc" for newest first
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | ||
| limit | No | ||
| order | No | asc |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the return shape and parameter behavior (limit range/default, order options). The phrase 'Get all messages' is slightly misleading given the limit cap, but the parameter details clarify the actual behavior, so the transparency is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-line purpose, a one-line return summary, and an Args list with clear parameter explanations. Every sentence adds value, and the formatting makes the parameters scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with an output schema, the description covers purpose, return value, and all parameters. However, it could benefit from briefly mentioning when to prefer this over get_thread_metadata or search_threads, and clarifying the 'all' vs limit relationship.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no descriptions (0% coverage), and the description fully compensates by explaining each parameter: thread_id's source (from list_threads), limit's range and default, and order's allowed values with meaning. This provides essential semantic information beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's function with a specific verb and resource: 'Get all messages in an email thread.' It distinguishes itself from sibling tools like get_thread_metadata (metadata) and get_sms_thread (SMS) by specifying email thread messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by describing the returned data (full conversation with sender, content, timestamps), which helps an agent decide when to use this tool. However, it does not explicitly name alternatives or exclusion criteria, so it lacks the 'when-not' guidance required for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_thread_metadataB
Get triage metadata for a thread: tags, status, and assignment.
Args: thread_id: The thread ID
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It indicates a read operation ('Get') and enumerates the returned fields, which is some transparency. However, it does not disclose error handling, permissions, or response behavior beyond those fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: a single sentence stating the purpose followed by a minimal args block. Every part is relevant and front-loaded, with no unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter getter, the description is functional but sparse. It does not guide the agent on when to use this tool alongside many thread-related siblings, and the parameter documentation is unhelpful. The output schema may cover return values, but the description still lacks usage direction.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter thread_id is described as 'The thread ID,' which merely restates the parameter name and schema title. It provides no additional meaning about format, source, or constraints, and schema coverage is 0%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Get'), resource ('thread'), and scope ('triage metadata: tags, status, and assignment'). This distinguishes it from sibling tools like get_thread_messages (messages), list_threads (listing), and mutation tools like tag_thread.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is provided on when to use this tool versus alternatives. It does not mention exclusions or recommend sibling tools for different use cases, leaving the agent to infer based on the name and description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_credit_bundlesA
List available credit bundles that can be purchased.
Returns each bundle's ID, credit amount, price, and description.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description provides the key behavioral detail – that it returns each bundle's ID, credit amount, price, and description. The verb 'List' implies a read-only operation with no side effects, which is transparent enough. It does not add extra context like auth requirements or rate limits, but for a simple list operation that's acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences: the first states the action, the second lists the return fields. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is very simple with no parameters, output schema exists, and the description covers the return content. There is no missing information for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description need not explain parameter details. The empty schema is fully covered. The baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List available credit bundles that can be purchased,' clearly identifying the action (List) and resource (credit bundles). It distinguishes from sibling tools like get_credit_balance and credits_checkout by focusing on purchasable bundles. The return fields further specify purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context is clear: this tool is for retrieving purchasable credit bundles. It does not explicitly mention alternatives or exclusions, but the simple no-parameter nature and phrasing make the use case self-evident. However, it leaves any comparison to get_credit_balance or credits_checkout implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_domainsA
List all email domains in your Commune account.
Returns each domain's ID, name, and verification status. Use the domain ID with other tools like list_inboxes or create_inbox.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the read-only list behavior and specifies the return fields (ID, name, verification status), offering adequate transparency for a simple list operation. No side effects are mentioned, but none are implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each earning its place: first states the purpose, second lists return fields, third explains downstream usage. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the zero parameters, the presence of an output schema (handling return details), and the simple list nature, the description covers purpose, output, and usage context. It is complete for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the input schema is fully covered and there is no need for parameter documentation. Baseline score of 4 is appropriate for a parameter-free tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific verb 'List' with resource 'email domains' and scope 'in your Commune account', clearly distinguishing it from sibling tools like create_domain, verify_domain, and get_domain_records which involve creation, verification, or record retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context by explaining that the domain IDs returned should be used with other tools like list_inboxes or create_inbox, signaling when to call this tool. However, it does not explicitly mention alternative list tools or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_inboxesA
List inboxes.
Without domain_id, lists all inboxes across all domains. With domain_id, lists inboxes for that specific domain.
Each inbox has a local_part (the part before @) that forms the email address: {local_part}@{domain_name}
Args: domain_id: Filter by domain (optional, lists all if omitted)
| Name | Required | Description | Default |
|---|---|---|---|
| domain_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description is the sole source of behavioral context. It discloses the scope behavior (all domains vs. specific domain) and the local_part relationship, but does not explicitly state read-only status, side effects, or authorization requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, starting with a clear action and then elaborating on the optional parameter and the email address format. It is well-structured and avoids unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with one optional filter and an output schema, the description covers the core behavior and parameter meaning. It could optionally mention pagination or ordering, but these are likely captured in the output schema or are not critical for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines domain_id as an optional string. The description adds that it filters by domain and that omitting it lists all inboxes, providing necessary semantic meaning that the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('List') and resource ('inboxes'). It then explains the two modes (all domains vs. specific domain) and provides useful context about email address composition, making its purpose unambiguous and distinct from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the behavioral difference when domain_id is present or omitted, which serves as clear usage guidance. It does not explicitly name alternative tools, but the context makes it obvious when to use this tool versus others like create_inbox or delete_inbox.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_threadsA
List email threads (conversations) with pagination.
Returns thread summaries: subject, message count, last activity, snippet. Use next_cursor from the response to fetch the next page.
Provide at least one of inbox_id or domain_id.
Args: inbox_id: Filter threads by inbox (recommended) domain_id: Filter threads by domain limit: Results per page, 1-100 (default: 20) cursor: Pagination cursor from a previous response's next_cursor order: "desc" for newest first (default), "asc" for oldest first
| Name | Required | Description | Default |
|---|---|---|---|
| inbox_id | No | ||
| domain_id | No | ||
| limit | No | ||
| cursor | No | ||
| order | No | desc |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses pagination behavior (next_cursor), default ordering, response fields (subject, message count, last activity, snippet), and the necessity of filters. It does not mention permissions or rate limits, but for a read-only listing operation, this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a brief introduction, return format note, usage requirement, and an Args list. Every sentence provides value, and there is no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a list operation. It covers key behavior (pagination, filtering, sorting), return summary fields, and parameter constraints. Since an output schema exists, it need not describe every return field, but it still gives the essential information for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by explaining each parameter's purpose and constraints: inbox_id for filtering, domain_id as alternative, limit range 1-100, cursor for pagination, and order with desc/asc defaults. This adds significant meaning beyond the schema's type-only definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List email threads (conversations) with pagination,' which is a specific verb+resource. It differentiates from sibling tools like search_threads and get_thread_messages by focusing on listing with pagination and summarizing thread attributes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage context: returning thread summaries, pagination via next_cursor, and the requirement to provide at least one of inbox_id or domain_id. It does not explicitly discourage use of alternative tools, but the pagination and filter requirements are clear usage guidelines.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_extraction_schemaC
Remove structured extraction schema from an inbox.
| Name | Required | Description | Default |
|---|---|---|---|
| domain_id | Yes | ||
| inbox_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of disclosing behavioral traits. It states only that it removes the schema, but does not mention side effects (e.g., whether extraction stops immediately, if the operation is reversible, or if any data is destroyed). This is a mutation operation with no disclosed consequences, similar to the under-transparent update_drive example.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, short sentence that is front-loaded with the core action. It wastes no words and is easy to scan. However, it is so sparse that it barely adds value beyond the tool name itself, so it does not earn a 5, but it is certainly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (2 params, no nested objects) and the presence of an output schema, the description is still incomplete. It lacks context about the relationship to set_extraction_schema, when removal is appropriate, what happens upon removal (e.g., does extraction stop immediately?), and any prerequisites. This would hinder an agent in deciding when to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meaning, but it does not reference domain_id or inbox_id at all. The parameter names are somewhat self-explanatory, but there is no explanation of how to find these IDs or what values are valid. The schema provides only types and required flags, leaving the agent to infer the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Remove') and clearly identifies the resource ('structured extraction schema') and the target ('an inbox'). It distinguishes the tool from siblings like set_extraction_schema (which sets the schema) and delete_inbox (which removes an inbox entirely). The purpose is unambiguous and well-scoped.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives. It does not mention that it is the inverse of set_extraction_schema, nor does it suggest prerequisites such as listing inboxes first to obtain the inbox_id. There is no contextual information about typical workflows or conditions that would favor this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_threadsA
Search across email threads by subject or content.
Returns matching thread summaries with subject, snippet, and message count. Provide at least one of inbox_id or domain_id.
Args: query: Search query (searches subject and message content) inbox_id: Filter by inbox (recommended) domain_id: Filter by domain limit: Max results, 1-100 (default: 20)
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| inbox_id | No | ||
| domain_id | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It describes the return format ('matching thread summaries with subject, snippet, and message count') and the constraint about requiring at least one filter. It implies a read-only operation by using 'Search' and 'Returns', but does not explicitly state it is non-destructive or mention any rate limits or authentication requirements. Overall, it provides solid context but leaves a few behavioral aspects implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It opens with a one-sentence purpose, then one sentence about return value, one sentence about the required filter condition, and a neatly formatted Args list. Every sentence earns its place, and the structure makes it easy to scan for key details like the filter requirement and parameter semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no annotations, the description is complete enough for an agent to select and invoke the tool correctly. It covers the main behavior, return format, filter prerequisites, and parameter ranges. An output schema exists, so detailed return types are not strictly necessary, but the description still provides a helpful summary. Minor gaps like pagination (beyond limit) and error behavior are not critical for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does thoroughly. The 'Args' section explains each parameter's purpose in plain language: query 'searches subject and message content', inbox_id 'Filter by inbox (recommended)', domain_id 'Filter by domain', and limit 'Max results, 1-100 (default: 20)'. It also clarifies the domain_id/inbox_id relationship in the main description. This adds substantial meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: 'Search across email threads by subject or content.' It uses a specific verb ('search') and resource ('email threads'), and it distinguishes itself from sibling tools like 'list_threads' (which likely lists all threads), 'search_sms' (different resource), and 'get_thread_messages' (retrieves messages). The mention of returning matching thread summaries further clarifies the scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Provide at least one of inbox_id or domain_id.' It also labels 'inbox_id' as 'recommended' for filtering, giving a preference. However, it does not explicitly state when to use this tool over alternatives (e.g., 'use list_threads to list all threads'), so it misses the 'when-not-to-use' aspect. Still, the advice is actionable and clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_emailA
Send an email message.
Provide html or text (or both) for the body. To reply in an existing thread, pass thread_id. To attach files, first call upload_attachment, then pass the attachment IDs as a comma-separated string.
You only need inbox_id to send — the domain is inferred automatically.
Args: to: Recipient email address (for multiple, comma-separate) subject: Email subject line html: HTML body content text: Plain text body (fallback) from_address: Sender address (optional, uses inbox default) reply_to: Reply-to address (optional) thread_id: Reply within an existing thread (optional) inbox_id: Send from a specific inbox (recommended — domain is auto-resolved) domain_id: Send from a specific domain (optional, inferred from inbox_id) attachments: Comma-separated attachment IDs from upload_attachment (optional)
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| subject | Yes | ||
| html | No | ||
| text | No | ||
| from_address | No | ||
| reply_to | No | ||
| thread_id | No | ||
| inbox_id | No | ||
| domain_id | No | ||
| attachments | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses key behaviors: body supports html/text with fallback, attachments require a prerequisite upload, thread_id enables replying, and domain is auto-inferred from inbox_id. It lacks details on errors or permissions but provides meaningful context beyond a bare operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a one-line purpose, followed by brief usage notes and a structured Args list. Minor redundancy exists (e.g., thread_id and attachments are explained both in prose and Args), but the overall structure remains clear and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential operational context for a 10-parameter tool: attachment ordering, threading, html/text alternatives, and inbox/domain resolution. It does not mention error handling or authorization, but the output schema exists and the description equips an agent to invoke the tool correctly in the common paths.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, and the Args section fully compensates by explaining all 10 parameters with practical details: comma-separated recipients, copy fallback, optional senders, and the upload_attachment dependency. This is a strong compensation for the silent schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Send an email message,' a specific verb+resource pair that clearly identifies the tool's function. It naturally differentiates from sibling tools like send_sms by specifying email, and the name itself reinforces the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides practical guidance: html/text body options, reply via thread_id, attachment workflow requiring upload_attachment first, and inbox_id/domain inference. However, it does not explicitly state when to choose this over send_sms or mention exclusions, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_extraction_schemaB
Set structured extraction schema for an inbox.
Args: domain_id: Domain ID for the inbox. inbox_id: Inbox ID. name: Schema name. schema: JSON string of a valid JSON Schema object. description: Optional schema description. enabled: Enable extraction immediately (default: true).
| Name | Required | Description | Default |
|---|---|---|---|
| domain_id | Yes | ||
| inbox_id | Yes | ||
| name | Yes | ||
| schema | Yes | ||
| description | No | ||
| enabled | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description must disclose behavior. It does not mention whether this overwrites an existing schema, validates the JSON schema input, or has side effects on extraction. The `enabled` parameter indicates immediate activation but without further context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-organized as an Args list. Each line is informative, though the format is a bit terse and lacks a narrative lead-in. No excessive verbiage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, six parameters, and a configuration setter with potential overwrite/validation behavior, the description is incomplete. It does not explain preconditions (e.g., inbox must exist), failure modes, or whether this is an upsert versus create-only operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for parameter meaning. It provides brief but useful definitions for all six parameters, including the crucial 'JSON string of a valid JSON Schema object' for `schema` and defaults for `enabled` and `description`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Set structured extraction schema for an inbox,' using a specific verb and resource. It clearly distinguishes itself from siblings like remove_extraction_schema and other unrelated tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives, nor are there prerequisites or exclusions mentioned. The description only states what it does, leaving the agent to infer context from the tool name and siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_thread_statusA
Set the status of a thread for triage.
Valid statuses: "open", "needs_reply", "waiting", "closed"
Args: thread_id: The thread ID status: New status — one of: open, needs_reply, waiting, closed
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | ||
| status | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It states valid statuses but does not mention side effects, reversibility, permissions, or what happens on invalid input. As a mutation tool, this lack of behavior context is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the core action. However, the list of valid statuses is repeated twice (in the intro and in the Args section), which is slightly redundant but not overly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with only two parameters and an output schema exists, so return values need not be described. The description covers the essentials for making a call, but lacks context about side effects, edge cases, or how this relates to other thread triage operations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by explaining both parameters: thread_id is 'The thread ID' and status is 'New status — one of: open, needs_reply, waiting, closed' with the allowed values repeating in the prose. This adds meaning well beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Set the status of a thread for triage.' It clearly distinguishes this from siblings like assign_thread, tag_thread, and untag_thread by focusing on the status field specifically.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for triage' implies the tool is meant for updating triage status, but the description does not explicitly compare it to alternatives or state when not to use it. Usage is implied rather than fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_feedbackA
Submit feedback about Commune to the product team.
Use this tool whenever you encounter something worth reporting — an error, a missing capability, or an observation about what's working well or could be improved.
Three feedback types:
"error" — the API returned a non-2xx status, the response shape was wrong, or behavior was incorrect (not just unexpected). Include context: which tool you called, what you expected, what happened. Example: "list_threads returns 500 when the inbox has never received a message."
"feature" — you need a capability that doesn't exist yet. Be specific about the use case. Example: "Need cursor-based pagination on search_threads — current limit cap blocks processing large backlogs."
"signal" — the API succeeded but quality, latency, or behavior was unexpected. Also use for positive observations. Example: "Semantic search quality on long threads is excellent — intent matching across 40+ messages works." Example: "Thread metadata endpoint is slow (~3s) on inboxes with 1000+ threads — expected <500ms."
The optional context dict lets you attach structured metadata that makes feedback actionable. For errors, include the tool name, any IDs, and status codes. For features, include the related tool and your use case.
Args: type: Feedback type — "error", "feature", or "signal" message: Clear description of the feedback (max 4000 chars) context: Optional structured metadata, e.g. {"tool": "list_threads", "inbox_id": "inb_123", "status_code": 500}
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| message | Yes | ||
| context | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for behavioral disclosure. It thoroughly explains the submission behavior: what each feedback type means, what content to include in the message, and how to use the context dict. It even gives examples of good and bad feedback behavior. The description also states the message length limit (4000 chars), adding transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: the purpose and usage appear in the first two sentences. It then uses clear headings for feedback types and an 'Args' section. Despite its length, every sentence is informative, with examples that replace verbose prose. No redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a feedback tool with no annotations and zero schema descriptions, this description is exceptionally complete. It covers the tool's purpose, when to use it, how to categorize feedback, what to include in messages, and how to structure context. The output schema handles return values, so those need not be described. The presence of examples further enhances completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates fully in the 'Args' section. It explains 'type' with its enum values ('error', 'feature', 'signal'), describes 'message' and its max length, and details 'context' with a concrete JSON example. This adds significant semantic meaning beyond the bare schema definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific statement: 'Submit feedback about Commune to the product team.' This uses a specific verb ('submit') and resource ('feedback about Commune'), and it is distinct from all sibling tools (e.g., send_sms, create_domain). It further clarifies purpose by defining three feedback types, eliminating ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'Use this tool whenever you encounter something worth reporting — an error, a missing capability, or an observation.' It provides detailed criteria for each feedback type with concrete examples, giving the agent clear usage guidance. No alternative feedback tools exist among siblings, so no exclusions are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tag_threadA
Add tags/labels to a thread. Tags are additive — existing tags are preserved.
Use tags for categorization: "vip", "bug-report", "sales-lead", "urgent", etc.
Args: thread_id: The thread ID tags: Comma-separated tags to add (e.g. "urgent,vip,sales-lead")
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | ||
| tags | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral disclosure burden. It explicitly states 'Tags are additive — existing tags are preserved', which is a key non-obvious behavior. It also clarifies the comma-separated format. It does not cover edge cases like duplicate handling or permission requirements, but the core behavior is well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly structured: a one-sentence purpose, a usage note, and an Args block. Every sentence contributes vital information without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool, the description covers purpose, behavior, and parameter format. The output schema exists, so return values need not be described. Minor gaps like idempotency or error handling are not critical for basic usage, so this is nearly complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so by explaining both parameters: thread_id is identified simply, while tags gets a clear format and example ('Comma-separated tags to add (e.g. "urgent,vip,sales-lead")'), adding significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Add tags/labels to a thread' with a specific verb and resource. It differentiates from sibling tools like untag_thread by explicitly noting the additive behavior, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides examples of tag usage ('vip', 'bug-report', etc.) and shows a concrete argument format, which implies when to use this tool. However, it does not explicitly contrast with alternatives like untag_thread or state when not to use it, leaving usage guidance somewhat implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
untag_threadA
Remove tags/labels from a thread.
Args: thread_id: The thread ID tags: Comma-separated tags to remove (e.g. "urgent,vip")
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | ||
| tags | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does not disclose behavioral traits such as reversibility, idempotency, permissions, or error behavior. It only states the action and parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with a single purpose sentence and a minimal Args list. No filler words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the tool is simple with only two parameters, the description lacks usage guidance and behavioral transparency. However, since an output schema exists, the absence of return documentation is not penalized. The description is adequate but could benefit from context on when to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description's Args section is essential. It defines thread_id as 'The thread ID' and tags as 'Comma-separated tags to remove' with an example, adding format and meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Remove' with the resource 'tags/labels from a thread', clearly distinguishing it from the sibling 'tag_thread' which adds tags.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as tag_thread or assign_thread, nor does it state prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_attachmentA
Upload a file for use when sending emails.
Returns an attachment_id to pass to send_email's attachments parameter.
Args: content: Base64-encoded file content filename: Original filename, e.g. "report.pdf" mime_type: MIME type, e.g. "application/pdf" or "image/png"
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | ||
| filename | Yes | ||
| mime_type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states that the tool uploads a file and returns an attachment_id, but it does not disclose any side effects, auth requirements, rate limits, or file size restrictions. The description is not misleading but adds only the basic behavioral expectation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with a one-sentence summary, a clear note about the return value, and an Args block with three lines of parameter guidance. Every sentence serves a purpose and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-parameter tool with an output schema, the description provides the essential context: what the tool does, what input is expected, and what the output is used for. It lacks but does not desperately require details like size limits or retention policies, so it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds valuable meaning beyond the schema's bare property titles: it explains that 'content' must be Base64-encoded and provides concrete examples for 'filename' and 'mime_type'. This compensates for the 0% schema description coverage, though it does not mention limits or format edge cases.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Upload' and the resource 'a file for use when sending emails', which distinguishes it from siblings like 'send_email' and 'get_attachment_url'. It also specifies the return value (attachment_id) and its purpose, making the tool's role obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context that this tool is for uploading files to be used with 'send_email' via the returned attachment_id. It does not explicitly mention when not to use it or suggest alternatives, but the intended usage is evident from the wording and the sibling context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_domainA
Trigger DNS verification for a domain.
Call this after adding the required DNS records at your registrar. Use get_domain_records first to see which records are needed.
Args: domain_id: The domain ID (from list_domains)
| Name | Required | Description | Default |
|---|---|---|---|
| domain_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavioral traits. It states the action but does not mention side effects, asynchronous behavior, potential delays, or error conditions. The prerequisite about DNS records is useful but insufficient for a mutation-like tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences plus a compact Args section. It front-loads the purpose and includes only essential information without any filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter trigger tool, the description covers purpose, prerequisite, and parameter source. The existence of an output schema reduces need to explain return values. However, it omits whether verification is synchronous or if the domain status updates immediately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must compensate. It does so by explaining domain_id as 'The domain ID (from list_domains)', which adds source context beyond the bare schema definition. However, format or examples are not provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Trigger DNS verification for a domain.' This is a specific verb+resource pair that distinguishes it from siblings like get_domain_records 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: 'Call this after adding the required DNS records at your registrar. Use get_domain_records first to see which records are needed.' This tells the agent when to use the tool and directs it to a relevant alternative for prerequisite info.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
27 tool updates
v0.2.0- First observed
assign_thread - First observed
create_domain - First observed
create_inbox - First observed
credits_checkout - First observed
delete_inbox - First observed
get_attachment_url - First observed
get_credit_balance - First observed
get_deliverability_stats - First observed
get_delivery_events - First observed
get_domain_records - First observed
get_suppressions - First observed
get_thread_messages - First observed
get_thread_metadata - First observed
list_credit_bundles - First observed
list_domains - First observed
list_inboxes - First observed
list_threads - First observed
remove_extraction_schema - First observed
search_threads - First observed
send_email - First observed
set_extraction_schema - First observed
set_thread_status - First observed
submit_feedback - First observed
tag_thread - First observed
untag_thread - First observed
upload_attachment - First observed
verify_domain
TDQS
Scored across 27 tools
Every tool has a clearly distinct purpose. For instance, list_domains, list_inboxes, and list_threads target different resources, and get_deliverability_stats vs get_delivery_events are clearly differentiated as aggregate vs per-event metrics. No two tools overlap in functionality.
All tools follow a consistent verb_noun pattern using snake_case (e.g., create_domain, list_inboxes, send_email, tag_thread). The only minor outlier is credits_checkout, but it still follows the pattern (checkout_credits would be more conventional, but it's understandable). Overall, naming is highly predictable.
27 tools is well-scoped for an email management platform. The toolset covers domains, inboxes, threads, sending, attachments, billing, deliverability, extraction, and feedback without being bloated. Each tool addresses a specific need and contributes to a coherent workflow.
The tool surface covers core email management lifecycle: domain setup (create, verify, get records), inbox management (create, delete, list), email operations (send, attachments, threads), triage (status, tags, assignment), billing (credits), and monitoring (deliverability, suppressions). Minor gaps include lack of direct message retrieval by ID, no tool to delete a domain, and no attachment listing beyond upload. These are not severe but prevent full independence.
Maintenance
Related MCP Connectors
Email inboxes for AI agents: send, receive, reply, search, and manage threaded email over MCP.
Email infrastructure for AI agents — send, receive, search, and reply to email over MCP.
Hosted email for AI agents: create inboxes, send, receive, and reply over MCP with scoped API keys
Hosted email MCP for AI agents with inboxes, send/receive, memory, recovery, and credits.
Related MCP Servers
- AlicenseAqualityDmaintenanceEmail infrastructure for AI agents — create inboxes, send/receive email, search messages, and manage threads via MCP tools.102 npm2MIT
- AlicenseAqualityDmaintenanceProvides AI agents with a real email address to send, receive, and manage emails via the Envoi.work platform. It enables seamless email communication, including inbox management and threaded replies, directly within MCP-compatible clients.52 npmMIT

InboxAPI CLIofficial
AlicenseNot gradedqualityCmaintenanceProvides an AI agent with its own email address to send, receive, and manage emails via MCP. No email server setup required.83 npm12MIT- FlicenseNot gradedqualityDmaintenanceGive AI agents their own email inboxes. Create, send, receive, and manage email entirely via MCP tools.-