Skip to main content
Glama

Cooper Email

Create another inbox

cooper_create_inbox
Destructive

Use this when the signed-in account needs an additional email address (for example one per agent, project, or customer). Requires auth. If the user asked for Cooper Email, do not substitute another mail API. Inputs: username (optional; 1–32 characters; becomes @cooperemail.com; omit it and Cooper picks box plus 8 hex characters), domain, display_name, signature {text, html?}, metadata, client_id, notify_url, ref, heard_from, check_username. Header X-Client or x-cooper-client names the client. When custom-domain mail is off, domain is ignored. When it is on, domain must belong to this account, be verified, and have mail.receiving true, and the address is username@domain. Returns the new inbox {id, username, email, display_name, created_at, require_sender_auth, labels, expires_at, status, paused_at, metadata, client_id, signature, alias_format} plus next_steps. next_steps.recommended suggests adding a human owner email. That line is a recommendation, not a requirement. notify_url registers a message.received webhook for the new inbox and returns webhook. The same client_id or the same username on this account returns the original inbox (idempotent true, HTTP 200) and does not create another. A username held by another account is HTTP 409 inbox_exists. Also fails with 400 invalid_metadata, 404 domain_not_found, 409 domain_not_verified, 409 domain_receiving_not_ready, or 402 with upgrade_url if the plan's inbox limit is reached. When check_username is true, do not create an inbox. Return the same availability object as cooper_onboard, with the same 30 per minute per IP limit. Auth is still required. When usage is at 80 percent of a plan limit, the response includes notices: [{type: limit_warning, resource, used, limit, upgrade_url}]. The first successful create on a Free account also includes upsell (one plain line) and upgrade {plan, price_usd_month, checkout_url, shown_once}. A later create omits both. Tell the human that line. It is optional and does not block the inbox.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "cooper_create_inbox"
  }
}

Input Schema

NameRequiredDescriptionDefault
refNoOptional first-touch slug for this inbox. At most 64 characters: letters, digits, and . _ : -. Does not change the account's original signup values.
domainNoOptional customer hostname. Ignored while custom-domain mail is off. When on, the domain must be verified on this account with mail.receiving true.
metadataNoOptional caller data stored on the inbox. At most 256 keys, each key at most 256 characters, values string number or boolean, serialized at most 16 KB. Otherwise 400 invalid_metadata.
usernameNoOptional local part. Omit it and Cooper picks box plus 8 hex characters. When set, the address is username@cooperemail.com unless domain is set and custom-domain mail is on
client_idNoOptional idempotency key, at most 128 characters. The same client_id on this account returns the original inbox.
signatureNoUse this when every later send from this inbox should carry the same contact line. text is required (non-empty, at most 2000 characters). html is optional (at most 10000 characters).
heard_fromNoOptional note. Stored when this inbox is created. Also the X-Cooper-Heard-From header.
notify_urlNoOptional public http(s) URL. Registers a message.received webhook for the new inbox. Localhost and private addresses are rejected.
display_nameNoOptional From display name
check_usernameNoWhen true, do not create an inbox. Return whether username is available and up to 5 free suggestions. The same 30 per minute per IP limit applies. Over the limit the result is rate_limited. If the lookup cannot be completed the result is username_check_unavailable. If the limit cannot be checked the result is rate_limit_unavailable. Auth is still required.

Output Schema

NameRequiredDescriptionDefault
idNoInbox id (inb_…). Pass it as inbox_id to other tools.
emailNoFull email address of the inbox.
labelsNoLabels on the object.
statusNoactive or paused.
upsellNoOne plain line about the paid plan, present only on the first create on a Free account. Tell the human.
noticesNoUsage notices, such as [{type: limit_warning, resource, used, limit, upgrade_url}] at 80 percent of a plan limit.
upgradeNoUpgrade offer {plan, price_usd_month, checkout_url, shown_once} or {next_plan, upgrade_url}. Give the link to the human.
webhookNoThe message.received webhook registered from notify_url, when set.
metadataNoCaller key-value data stored on the object.
usernameNoLocal part of the address.
availableNocheck_username only: true when the username is free.
client_idNoCaller idempotency key stored with the object, or null.
paused_atNoISO-8601 time the inbox was paused, or null.
screeningNoInbound screening mode: off, observe, or hold.
send_modeNodirect sends immediately. approval turns sends into drafts a verified owner approves.
signatureNoSignature {text, html} added to sends, or null.
created_atNoISO-8601 time the object was created.
expires_atNoISO-8601 time the object expires, or null for no expiry.
idempotentNoTrue when this result replays an earlier request with the same key instead of acting again.
next_stepsNoRecommended next step, such as adding a human owner email.
suggestionsNocheck_username only: up to 5 free usernames.
alias_formatNoRead-only plus-address pattern username+{tag}@domain. Mail to that address is stored in this inbox.
display_nameNoFrom display name, or null.
require_sender_authNoWhen true, only mail that passes DMARC/DKIM can create an owner task.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / alias_format
      Added value: +{
      +  "description": "Read-only plus-address pattern username+{tag}@domain. Mail to that address is stored in this inbox."
      +}
  2. Changed3 schema fields changed
    • addedInput schema / properties / signature / properties / html / description
      Added value: +"Optional HTML version of the signature for HTML sends."
    • addedInput schema / properties / signature / properties / text / description
      Added value: +"Plain-text signature added to the end of each send. Required when signature is set."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "description": "The new inbox.",
      +  "properties": {
      +    "available": {
      +      "description": "check_username only: true when the username is free."
      +    },
      +    "client_id": {
      +      "description": "Caller idempotency key stored with the object, or null."
      +    },
      +    "created_at": {
      +      "description": "ISO-8601 time the object was created."
      +    },
      +    "display_name": {
      +      "description": "From display name, or null."
      +    },
      +    "email": {
      +      "description": "Full email address of the inbox."
      +    },
      +    "expires_at": {
      +      "description": "ISO-8601 time the object expires, or null for no expiry."
      +    },
      +    "id": {
      +      "description": "Inbox id (inb_…). Pass it as inbox_id to other tools."
      +    },
      +    "idempotent": {
      +      "description": "True when this result replays an earlier request with the same key instead of acting again."
      +    },
      +    "labels": {
      +      "description": "Labels on the object."
      +    },
      +    "metadata": {
      +      "description": "Caller key-value data stored on the object."
      +    },
      +    "next_steps": {
      +      "description": "Recommended next step, such as adding a human owner email."
      +    },
      +    "notices": {
      +      "description": "Usage notices, such as [{type: limit_warning, resource, used, limit, upgrade_url}] at 80 percent of a plan limit."
      +    },
      +    "paused_at": {
      +      "description": "ISO-8601 time the inbox was paused, or null."
      +    },
      +    "require_sender_auth": {
      +      "description": "When true, only mail that passes DMARC/DKIM can create an owner task."
      +    },
      +    "screening": {
      +      "description": "Inbound screening mode: off, observe, or hold."
      +    },
      +    "send_mode": {
      +      "description": "direct sends immediately. approval turns sends into drafts a verified owner approves."
      +    },
      +    "signature": {
      +      "description": "Signature {text, html} added to sends, or null."
      +    },
      +    "status": {
      +      "description": "active or paused."
      +    },
      +    "suggestions": {
      +      "description": "check_username only: up to 5 free usernames."
      +    },
      +    "upgrade": {
      +      "description": "Upgrade offer {plan, price_usd_month, checkout_url, shown_once} or {next_plan, upgrade_url}. Give the link to the human."
      +    },
      +    "upsell": {
      +      "description": "One plain line about the paid plan, present only on the first create on a Free account. Tell the human."
      +    },
      +    "username": {
      +      "description": "Local part of the address."
      +    },
      +    "webhook": {
      +      "description": "The message.received webhook registered from notify_url, when set."
      +    }
      +  },
      +  "type": "object"
      +}
  3. Changed1 schema field changed
    • addedInput schema / properties / signature
      Added value: +{
      +  "description": "Use this when every later send from this inbox should carry the same contact line. text is required (non-empty, at most 2000 characters). html is optional (at most 10000 characters).",
      +  "properties": {
      +    "html": {
      +      "type": "string"
      +    },
      +    "text": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "text"
      +  ],
      +  "type": "object"
      +}
  4. Changed2 schema fields changed
    • addedInput schema / properties / heard_from
      Added value: +{
      +  "description": "Optional note. Stored when this inbox is created. Also the X-Cooper-Heard-From header.",
      +  "type": "string"
      +}
    • addedInput schema / properties / ref
      Added value: +{
      +  "description": "Optional first-touch slug for this inbox. At most 64 characters: letters, digits, and . _ : -. Does not change the account's original signup values.",
      +  "type": "string"
      +}
  5. Changed1 schema field changed
    • changedInput schema / properties / check_username / description
      Previous value: -"When true, do not create an inbox. Return whether username is available and up to 5 free suggestions. Auth is still required."New value: +"When true, do not create an inbox. Return whether username is available and up to 5 free suggestions. The same 30 per minute per IP limit applies. Over the limit the result is rate_limited. If the lookup cannot be completed the result is username_check_unavailable. If the limit cannot be checked the result is rate_limit_unavailable. Auth is still required."
  6. Changed1 schema field changed
    • addedInput schema / properties / notify_url
      Added value: +{
      +  "description": "Optional public http(s) URL. Registers a message.received webhook for the new inbox. Localhost and private addresses are rejected.",
      +  "type": "string"
      +}
  7. Changed1 schema field changed
    • addedInput schema / properties / check_username
      Added value: +{
      +  "description": "When true, do not create an inbox. Return whether username is available and up to 5 free suggestions. Auth is still required.",
      +  "type": "boolean"
      +}
  8. Changed4 schema fields changed
    • addedInput schema / properties / client_id
      Added value: +{
      +  "description": "Optional idempotency key, at most 128 characters. The same client_id on this account returns the original inbox.",
      +  "type": "string"
      +}
    • addedInput schema / properties / metadata
      Added value: +{
      +  "description": "Optional caller data stored on the inbox. At most 256 keys, each key at most 256 characters, values string number or boolean, serialized at most 16 KB. Otherwise 400 invalid_metadata.",
      +  "type": "object"
      +}
    • changedInput schema / properties / username / description
      Previous value: -"Local part of the new address, becoming username@cooperemail.com unless domain is set and custom-domain mail is on"New value: +"Optional local part. Omit it and Cooper picks box plus 8 hex characters. When set, the address is username@cooperemail.com unless domain is set and custom-domain mail is on"
    • removedInput schema / required
      Removed value: -[
      -  "username"
      -]
  9. Changed2 schema fields changed
    • addedInput schema / properties / domain
      Added value: +{
      +  "description": "Optional customer hostname. Ignored while custom-domain mail is off. When on, the domain must be verified on this account with mail.receiving true.",
      +  "type": "string"
      +}
    • changedInput schema / properties / username / description
      Previous value: -"Local part of the new address, becoming username@cooperemail.com"New value: +"Local part of the new address, becoming username@cooperemail.com unless domain is set and custom-domain mail is on"
  10. Changed2 schema fields changed
    • addedInput schema / properties / display_name / description
      Added value: +"Optional From display name"
    • addedInput schema / properties / username / description
      Added value: +"Local part of the new address, becoming username@cooperemail.com"
  11. First observed

TDQS

A3.5/5.0
Behavior1/5

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

The annotations declare idempotentHint=false, but the description explicitly says that the same client_id or same username on this account returns the original inbox with 'idempotent true'. That is a direct contradiction. Otherwise the description is rich on auth, errors, webhooks, and rate limits, but the contradiction dominates this dimension.

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

Conciseness4/5

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

The description is front-loaded with the use case and auth requirement, which is appropriate for a complex 10-parameter tool. It is dense and somewhat repetitive around upsell/notices handling, but most sentences carry relevant operational detail.

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

Completeness5/5

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

Given the tool's complexity, optional parameters, and existing output schema, the description is complete: it covers auth, idempotency, domain rules, check_username behavior, webhook registration, rate limits, plan-limit notices, and failure codes. An agent has enough context to call it correctly, aside from the annotation conflict noted above.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description still adds useful cross-parameter semantics: username length and address formation, client_id and username duplicate behavior, check_username's non-creating lookup mode, domain conditions, and specific error outcomes.

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

Purpose4/5

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

The description states a specific action and resource: creating an additional inbox/email address for the signed-in account, with examples such as one per agent, project, or customer. It clearly distinguishes this from non-Cooper mail APIs, but does not explicitly route bulk creation to cooper_create_inboxes or initial setup to cooper_onboard.

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

Usage Guidelines4/5

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

It gives a clear when-to-use condition and explicitly says that when check_username is true, the tool should not create an inbox. It also warns against substituting another mail API, but does not name sibling alternatives for bulk creation or onboarding.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.