# MCP tool reference

> Source: https://eesier.com/mcp/tools

The eesier MCP server at `https://mcp.eesier.com` exposes 234 tools to any MCP client. This page is generated from the running server, so it lists exactly what your agent gets.

- **Server URL**: `https://mcp.eesier.com`
- **Transport**: Streamable HTTP
- **Authentication**: `Authorization: Bearer <token>`
- **OAuth 2.1**: `/.well-known/oauth-protected-resource`
- **Get a token**: eesier console → Account → External Agents (MCP) → Generate Token. Tokens are revocable and scoped to your account.
- **Agent instructions**: `https://mcp.eesier.com/SKILL.md`

## Claude Code

```bash
claude mcp add eesier https://mcp.eesier.com/ -t http -H "Authorization: Bearer <TOKEN>"
```

## how the surface behaves

- **read, write, destructive** — Every tool is annotated. read never changes anything. write creates or updates. destructive removes or cancels something — treat it as irreversible and confirm with the user first.
- **whoami first** — Call whoami at the start of every session. It returns the account profile, the plan and timezone_offset_utc_hours, which you need to read every date correctly.
- **paging** — List tools take page (0-based) and page_size (default 20, capped at 100) and return the total alongside the rows.
- **dates** — Every timestamp is returned in UTC ISO 8601 (2026-01-31T14:05:00Z). Date filters accept ISO dates too.
- **errors** — A failed call returns a JSON object with an error field describing what went wrong, not an HTTP error. Read it and act on it — do not retry blindly.
- **plan gating** — A few write tools require an active plan (paid or trial). They return a clear message saying so instead of failing silently.
- **search_knowledge before answering** — Any question about how the platform itself works should go through search_knowledge first — it reads eesier's own knowledge base.
- **catching up** — list_account_events is a cursor feed of what happened since your last check. what_changed_since gives the same ground as a narrative digest.
- **stable names** — Tool names are the contract and every entry here links to itself, so you can point a teammate straight at one tool.

## the tools

### Session

Identify the connected account and read its pending notifications. whoami is the first call of every session — it returns the profile, the plan and the account timezone.

#### `acknowledge_notification` (write)

Acknowledge a notification you have already surfaced to the user — it stops appearing in list_pending_notifications for you. This is an agent-side bookmark only: the platform's own delivery of the notification to the user is unaffected.

| Parameters | | |
|---|---|---|
| `notification_id` | integer, required | Notification ID (from list_pending_notifications) |

#### `list_notification_history` (read)

List the customer's past and pending system notifications (newest first, paginated) — including ones already processed by the platform or already acknowledged. Use list_pending_notifications for just the new, unseen ones.

| Parameters | | |
|---|---|---|
| `page` | integer, optional, default `0` | Page number (0-based, default 0) |
| `page_size` | integer, optional, default `20` | Notifications per page (default 20, max 100) |

#### `list_pending_notifications` (read)

List all pending (unprocessed) system notifications queued for the customer. These are heads-up messages the platform wants the user to see — platform updates or action confirmations that haven't been surfaced yet. Surface them to the user; you cannot mark them as processed — they remain in the queue until the platform clears them internally. Sorted by oldest first. After surfacing one, call acknowledge_notification so it stops reappearing here; for past notifications use list_notification_history.

Parameters: —

#### `whoami` (read)

Returns the authenticated customer's profile information including name, phone, email, language, timezone offset from UTC (in hours, may be null if not set), subscription plan, and prospecting eligibility.

Parameters: —

### Leads

Search, read, register and update leads. Take a lead over from the agent, hand it back, stop it, or list everything waiting on a human right now.

#### `get_lead` (read)

Get a lead's full profile including contact info, company data, prospecting status, and conversation history. Email thread bodies are included inline (latest 50 per direction); WhatsApp and voice activity appear as counts — use get_lead_conversation for the full merged cross-channel timeline.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |

#### `list_lead_emails` (read)

List the emails exchanged with a specific lead (outbound and inbound), oldest first. Paginated — outbound_total/inbound_total report the full thread size. Set include_bodies=false for a lightweight metadata-only view (dates, subjects, attachment names).

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |
| `page` | integer, optional, default `0` | Page number (0-based, default 0) |
| `page_size` | integer, optional, default `20` | Emails per direction per page (default 20, max 100) |
| `include_bodies` | boolean, optional, default `true` | Include full email bodies (default true); false returns metadata only |

#### `list_paused_prospecting_leads` (read)

List leads with prospecting paused, including their pause time and reason. Cursor-paginated, 50 per page. Use resume_lead_prospecting to continue or stop_lead to end the pending work.

| Parameters | | |
|---|---|---|
| `after_lead_id` | integer, optional, default `0` | Last lead ID from the previous page, or 0 |

#### `list_pending_review` (read)

List leads that have been flagged for human review by the prospecting agent.

Parameters: —

#### `pause_lead_prospecting` (write)

Temporarily pause prospecting for one lead while awaiting owner approval or a later decision. Preserves status and pending instructions. Held leads remain visible in the console until resumed or stopped. Cannot retract an already dispatched message or active call.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |
| `reason` | string, required | Reason for the temporary hold |

#### `register_lead` (write)

Manually register a new lead so Blue Button can prospect it. A valid email is required for the lead to actually be contacted (phone alone only enables WhatsApp/voice). Deduplicates: if a lead with the same email or phone already exists, returns that lead's id instead of creating a duplicate. To bring in many leads at once use import_leads; for a lead referred by another lead use register_referral_lead.

| Parameters | | |
|---|---|---|
| `name` | string, required | Contact name |
| `email` | string, optional | Email address |
| `phone` | string, optional | Phone number |
| `company` | string, optional | Company name |
| `status` | string, optional | Initial status: Cold (default) or Confirmed |
| `campaign` | string, optional | Campaign name or numeric campaign_id to assign lead to |

#### `resume_lead_prospecting` (write)

Remove a lead's temporary prospecting pause after owner authorization. Preserves pending instructions and status; other blockers remain and are returned. Success means the pause was removed, not that a message was sent.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |

#### `return_lead_to_pipeline` (write)

Return a lead to the autonomous prospecting pipeline with optional instructions for the next touch.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |
| `instructions` | string, optional | Instructions for the agent's next touch |
| `next_touch_date` | string, optional | When to make the next touch (ISO date, default: now) |

#### `search_leads` (read)

Search leads by query, status, campaign, date range, or last prospecting message date. Supports sorting by date_created (default), last_prospecting_message, or status. Returns paginated results. Each result includes last_outbound_at (date of last outbound message sent to this lead) and last_inbound_at (date of last reply from this lead) so you can triage activity without opening the thread.

| Parameters | | |
|---|---|---|
| `query` | string, optional | Search query (matches name, company name, email) |
| `status` | string, optional | Filter by status: Pending, Cold, Confirmed, Aware, NotInterested, Interested, Closed, Unqualified, Rejected, Gatekeeper |
| `campaign` | string, optional | Filter by campaign name or numeric campaign_id |
| `created_after` | string, optional | Only leads created on or after this date (ISO format, e.g. 2026-01-01) |
| `created_before` | string, optional | Only leads created on or before this date (ISO format, e.g. 2026-03-31) |
| `last_prospecting_message_after` | string, optional | Only leads that received a prospecting message on or after this date (ISO format) |
| `sort_by` | string, optional | Sort order: date_created (default, newest first), last_prospecting_message (most recent activity first), status (by status then date). Unrecognized values default to date_created. |
| `page` | integer, optional, default `0` | Page number (0-based, default 0) |
| `page_size` | integer, optional, default `20` | Page size (default 20, max 100) |
| `has_linkedin` | boolean, optional | Filter by LinkedIn presence: true returns only leads that have a LinkedIn profile URL, false only leads without one. Omit for all leads. |

#### `send_message_to_lead` (write)

Send a direct email to a lead from the customer's Blue Button address. SIDE-EFFECT: this takes the lead over (removes it from the autonomous pipeline, same as take_over_lead) — the customer owns the conversation from then on. The email is queued for delivery, not sent instantly. If the customer only wants to steer the approach without taking over, use return_lead_to_pipeline with instructions instead. For WhatsApp use send_whatsapp_message_to_lead.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |
| `subject` | string, required | Email subject |
| `body` | string, required | Email body |

#### `stop_lead` (destructive)

Stop prospecting a lead — Blue Button finishes the lead and sends nothing further. Reversible: recover_lead_to_pipeline puts it back in the pipeline with re-engagement framing. Contrast: take_over_lead means the customer will personally handle the lead; stop_lead means nobody will. To record a final result (won/lost/gave_up), use register_lead_outcome — those results stop prospecting and preserve the volunteered context. Its negotiating/unresponsive reports only update the open situation and do not stop outreach.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |
| `reason` | string, optional | Reason for stopping |

#### `take_over_lead` (write)

Take over a lead — marks it as user-controlled, removing it from the autonomous prospecting pipeline (Blue Button stops contacting it; the customer handles it through their own channels). To hand the lead back to Blue Button later, use recover_lead_to_pipeline (gentle re-engagement). Contrast: stop_lead ends prospecting without implying the customer will handle it; send_message_to_lead also takes over as a side-effect; return_lead_to_pipeline is the post-human-review resume.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |

#### `update_lead` (write)

Update a lead's status, goal, or background. Pass only the fields you want to change. Note: setting a status here does NOT stop or pause prospecting — to remove the lead from the pipeline use stop_lead (finish permanently) pause_lead_prospecting (temporary hold), or take_over_lead (customer handles it personally). Frozen is reserved for automation and cannot be assigned.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |
| `status` | string, optional | New status: Pending, Cold, Confirmed, Aware, NotInterested, Interested, Closed, Unqualified, Rejected, Gatekeeper |
| `goal` | string, optional | Lead-specific outreach goal |
| `background` | string, optional | Background context about this lead |

### Lead operations

Act on a lead: send a WhatsApp message, import a list, reschedule the next touch, register a referral, or generate a presentation for one specific lead.

#### `create_lead_presentation` (write)

Generate a personalized strategic presentation (PDF) for a specific lead, based on the customer's business and the lead's context. Runs synchronously and can take a minute. Returns the PDF URL. If the lead already has a presentation, returns the existing one. Respects the customer/campaign 'generate custom presentations' toggle.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |

#### `import_leads` (write)

Import many leads at once. Provide EITHER an existing customer_file_id (an uploaded CSV/Excel/TXT file) OR inline rows (rows_json: a JSON array of objects with name, email, phone, company — email or phone required per row). The import is queued and processed in the background (deduped against existing leads); new leads enter prospecting automatically. For a single lead use register_lead.

| Parameters | | |
|---|---|---|
| `customer_file_id` | integer, optional | Id of an already-uploaded customer file (.csv, .xlsx, .xls, .txt) to import from |
| `rows_json` | string, optional | Inline leads as a JSON array, e.g. [{"name":"Ana","email":"ana@acme.com","phone":"+5511999999999","company":"Acme"}]. Max 500 rows per call. |
| `instructions` | string, optional | Special instructions for extraction (column mappings, filters) |
| `status` | string, optional | Initial status for imported leads (e.g. Cold, Confirmed) |
| `preferred_channel` | string, optional | First-contact channel: Email or WhatsApp (applied per lead only when it has that contact info) |
| `first_message_instructions` | string, optional | Instructions for the first prospecting message to imported leads |
| `prospecting_background` | string, optional | Background about the imported leads (e.g. 'Leads from TechConf 2026 workshop on AI') |
| `prospecting_goal` | string, optional | Outreach goal for the imported leads, overriding the customer-level goal |
| `campaign` | string, optional | Campaign name or numeric campaign_id to assign the imported leads to |

#### `register_referral_lead` (write)

Register a NEW lead that an existing lead referred ('talk to X'). Goes through the shared referral pipeline: dedupe, email verification, company-data copy when same_company, enrichment, and automatic entry into prospecting. Needs at least an email or a phone for the referred person. Requires an active paid plan.

| Parameters | | |
|---|---|---|
| `referring_lead_id` | integer, required | ID of the existing lead who made the referral |
| `lead_name` | string, required | Name of the referred person |
| `lead_email` | string, optional | Email of the referred person |
| `lead_phone` | string, optional | Phone of the referred person |
| `same_company` | boolean, optional, default `false` | True when the referred person works at the SAME company as the referring lead (company data is copied over) |
| `status` | string, optional | Initial status (e.g. Cold, Confirmed) |
| `instructions_for_first_touch` | string, optional | Instructions for the first touch to the referred lead |

#### `reschedule_lead_touch` (write)

Update the next prospecting touch date and/or preferred channel for one or more actively-prospected leads, selected by explicit lead IDs and/or by the file they were imported from. Setting next_touch_date to now makes each lead be contacted as soon as possible. Leads the prospecting queue would not pick up (never started, finished, pending review, taken over, rejected, or frozen without a newer reply) are skipped and reported.

| Parameters | | |
|---|---|---|
| `lead_ids` | string, optional | Comma-separated lead IDs to update (optional if imported_from_file_id is provided) |
| `imported_from_file_id` | integer, optional | Update every actively-prospected lead imported from this customer file id |
| `next_touch_date` | string, optional | New next-touch date/time in UTC (ISO format). Pass the current UTC time to contact ASAP. Omit to keep each lead's schedule. |
| `preferred_channel` | string, optional | New preferred first-contact channel: Email or WhatsApp (applied only where the lead is reachable on that channel) |

#### `send_whatsapp_message_to_lead` (write)

Send a direct WhatsApp message to a lead on the customer's prospecting number. Behavior mirrors the in-app agent: if the lead is NOT taken over, the message is parked as next-touch instructions and delivered on the lead's next natural prospecting touch (the lead is NOT taken over). If the lead IS taken over and its 24h WhatsApp service window is open (the lead messaged within the last 24h), the message is sent now, verbatim; if the window is closed, the send is refused (WhatsApp policy) — use email via send_message_to_lead instead. Requires a live WhatsApp prospecting line (register_whatsapp_line).

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |
| `message` | string, required | The message to deliver, written exactly as it should reach the lead |
| `attachment_url` | string, optional | Optional absolute https URL of a file to send as a WhatsApp media message after the text |

### Outcomes

Close the loop: record what happened with a lead, answer a question it asked, recover it into the pipeline, or read its lifecycle history.

#### `answer_lead_question` (write)

Save the customer's answer to a question a lead previously asked that the platform couldn't answer (price, delivery area, specs, process...). Queues tracked replies to eligible waiting leads. Reuse as business knowledge requires explicit owner approval via reusable=true; otherwise the answer is only for the waiting leads. Pass open_question_id when known; otherwise pass question_text.

| Parameters | | |
|---|---|---|
| `answer_text` | string, required | The customer's answer, in their own words |
| `open_question_id` | integer, optional | ID of the open question being answered, when known |
| `question_text` | string, optional | The question text — required when no open_question_id is provided |
| `reusable` | boolean, optional, default `false` | True only with explicit owner approval to reuse this fact for future leads |
| `expected_answer_id` | integer, optional | Current answer ID when correcting an answer |
| `valid_until` | string (ISO 8601), optional | UTC expiry, when applicable |
| `request_id` | string, optional | Stable UUID reused on retry |

#### `list_lead_lifecycle_events` (read)

List the lifecycle/outcome history of a specific lead (outcome recorded, recovered, check-ins muted, questions answered, meeting outcomes...), newest first. The append-only audit trail behind register_lead_outcome and its siblings.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |
| `limit` | integer, optional, default `50` | Max events to return (default 50, max 200) |

#### `mute_lead_check_ins` (write)

Mute or snooze outcome reminders for a lead. For remind-me-later requests, set snooze_days; use 7 if no duration was given. Omit snooze_days to stop reminders. Does not change the outcome or pipeline state.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |
| `reason` | string, optional | Why the customer wants to stop hearing about this lead, in their own words |
| `snooze_days` | integer, optional | Days to snooze instead of muting permanently (1-365); use 7 for remind me later without a duration |

#### `recover_lead_to_pipeline` (write)

Bring a lead the customer had taken over (or given up on) BACK into the autonomous prospecting pipeline with gentle re-engagement framing (the lead already knows the business). Use this — NOT return_lead_to_pipeline — when the customer PERSONALLY took over or stopped pursuing the lead and now wants Blue Button to resume it. Refuses unsubscribed leads and leads with a recorded won/lost outcome. The first re-engagement touch happens after a short delay.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |
| `owner_context` | string, optional | Context the customer gave for the recovery, in their words (e.g. 'he asked to talk after the holidays') |

#### `register_lead_outcome` (write)

Record the customer's report about a lead: won (sale completed), lost (the LEAD declined to buy), gave_up (the OWNER explicitly stopped pursuing), negotiating (ongoing discussions), or unresponsive (lead stopped replying). Only won/lost/gave_up are final results and stop prospecting. Negotiating/unresponsive keep the final outcome unknown and do not start or stop outreach. Do not infer a loss or owner withdrawal from silence or vague wording; clarify ambiguity. Preserve any volunteered reason/context for every situation without inventing or requiring one. Deal value is only for a won sale when volunteered; never ask for it.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |
| `outcome` | string, required | The situation: 'won', 'lost', 'gave_up', 'negotiating', or 'unresponsive' |
| `reason` | string, optional | The customer's volunteered reason/context for any of the five situations; do not invent or require it |
| `deal_value_brl` | number, optional | Deal value in BRL — ONLY when the customer explicitly mentioned an amount |

### Meetings

List the meetings booked with leads, confirm or cancel them, and record who actually showed up.

#### `cancel_lead_meeting` (destructive)

Cancel a meeting on the customer's side and send the lead back into the prospecting pipeline so the executor communicates the cancellation on the next touch.

| Parameters | | |
|---|---|---|
| `meeting_id` | integer, required | Id of the meeting to cancel |
| `next_touch_date` | string, required | When the executor should re-engage the lead about the cancellation (ISO 8601 UTC, usually within a few hours) |
| `reason` | string, optional | Optional cancellation reason — appended to the meeting notes and included in the next-touch instructions |
| `additional_instructions` | string, optional | Optional extra next-touch instructions for the executor, written in the customer's language |

#### `confirm_lead_meeting` (write)

Confirm a meeting on the customer's side (call when the customer accepts a meeting the lead proposed). Stamps the customer's acceptance.

| Parameters | | |
|---|---|---|
| `meeting_id` | integer, required | Id of the meeting the customer is confirming |

#### `list_lead_meetings` (read)

List meetings between the customer and their leads. Optionally filter by a specific lead, include cancelled meetings, or include past meetings.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, optional | Optional lead id to filter by |
| `include_cancelled` | boolean, optional, default `false` | Include cancelled meetings (default false) |
| `include_past` | boolean, optional, default `true` | Include past meetings from the last 30 days (default true). Set false for upcoming only. |

#### `update_lead_meeting_attendance` (write)

Record attendance for a meeting that already happened — whether the customer and/or the lead showed up, plus optional outcome notes. Pass at least one field.

| Parameters | | |
|---|---|---|
| `meeting_id` | integer, required | Id of the meeting to update |
| `has_customer_attended` | boolean, optional | Whether the customer attended |
| `has_lead_attended` | boolean, optional | Whether the lead attended |
| `notes` | string, optional | Optional outcome notes — appended to existing notes |

### Timing intelligence

Read the timing signals collected for a lead — when this kind of contact tends to answer.

#### `get_lead_timing_intelligence` (read)

Get a lead's timing intelligence: the best times to reach out (by day of week, in the lead's local time), when the lead historically responds, and their average response time. Built from this lead's history, falling back to their sector, this customer, then platform-wide data (the source field says which). Use it to time send_message_to_lead / return_lead_to_pipeline touches.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |

### Conversations

Read what was actually said. Full cross-channel timeline for one lead, the WhatsApp thread on its own, or a meaning-based search across every lead conversation at once.

#### `get_lead_conversation` (read)

Get a lead's full cross-channel conversation timeline — email, WhatsApp, and voice calls — merged chronologically, each item tagged with its channel and direction. Paginated. This is the one tool that shows the WHOLE conversation as the lead experienced it; for a single channel use list_lead_emails or list_lead_whatsapp_messages.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |
| `page` | integer, optional, default `0` | Page number (0-based, default 0) |
| `page_size` | integer, optional, default `30` | Items per page (default 30, max 100) |
| `order` | string, optional, default `newest_first` | Ordering: newest_first (default) or oldest_first |
| `include_transcripts` | boolean, optional, default `false` | Include full voice-call transcripts (default false — only the outcome summary) |

#### `list_lead_whatsapp_messages` (read)

List the WhatsApp messages exchanged with a specific lead (outbound and inbound), oldest first. Paginated — outbound_total/inbound_total report the full thread size. Set include_bodies=false for a lightweight metadata-only view. For the lead's emails use list_lead_emails; for the merged email+WhatsApp+voice timeline use get_lead_conversation.

| Parameters | | |
|---|---|---|
| `lead_id` | integer, required | Lead ID |
| `page` | integer, optional, default `0` | Page number (0-based, default 0) |
| `page_size` | integer, optional, default `20` | Messages per direction per page (default 20, max 100) |
| `include_bodies` | boolean, optional, default `true` | Include full message bodies (default true); false returns metadata only |

#### `search_lead_conversations` (read)

Semantic search ACROSS ALL the customer's LEAD conversations — lead emails and lead WhatsApp messages — by meaning, not keywords (e.g. 'leads who asked about pricing', 'objections about contract length'). Returns snippets with lead_id; fetch full threads via get_lead_conversation / list_lead_emails / list_lead_whatsapp_messages. Optionally scope to one lead or one channel. NOT for the customer's own chat with their Blue Button agent — that is search_my_agent_conversation.

| Parameters | | |
|---|---|---|
| `query` | string, required | What to search for, phrased by meaning (any language) |
| `lead_id` | integer, optional | Restrict to one lead's conversation (optional) |
| `channel` | string, optional | Restrict channel: email, whatsapp, email_inbound, email_outbound, whatsapp_inbound, whatsapp_outbound (optional; default = all) |
| `top_k` | integer, optional, default `10` | Max results (default 10, max 25) |
| `min_score` | number, optional | Minimum similarity score 0..1 (optional) |

#### `search_my_agent_conversation` (read)

Semantic search over the customer's OWN past conversation with their Blue Button agent (the WhatsApp assistant they talk to) — use it to recall what the customer previously discussed, decided, or asked for. NOT for lead conversations — that is search_lead_conversations.

| Parameters | | |
|---|---|---|
| `query` | string, required | What to search for, phrased by meaning (any language) |
| `top_k` | integer, optional, default `5` | Max results (default 5, max 10) |

### Mailbox

The account's own email inbox, as a full mail client: folders and threads, hybrid search by meaning and by exact text, read / star / archive / delete in bulk, in-thread replies with correct threading, and new messages to any recipient.

#### `delete_mailbox_messages` (destructive)

Move one or more messages to the trash (a soft delete — restore_mailbox_messages brings them back, and list_mailbox_messages with folder=trash lists them). SAFETY: a sent message that is still queued and has not gone out yet is REFUSED, because deleting it would silently cancel the send; the row comes back with blocked_reason="pending_send" (or "pending_processing" for an inbound message still being classified). Pass force_cancel_pending_send=true only when the customer actually wants that send cancelled. Accepts a comma-separated list of message handles (max 100 per call).

| Parameters | | |
|---|---|---|
| `message_ids` | string, required | Comma-separated message handles, e.g. "in-42,out-9" (max 100) |
| `force_cancel_pending_send` | boolean, optional, default `false` | Delete even when it cancels a queued send or a pending classification (default false) |

#### `get_mailbox_message` (read)

Read one message in full by its handle ("in-42" / "out-42") — subject, body, counterparty, dates, mailbox state and its attachments (file name + public URL). For the whole conversation around it use get_mailbox_thread.

| Parameters | | |
|---|---|---|
| `message_id` | string, required | Message handle from a list or search result, e.g. "in-42" |
| `include_attachments` | boolean, optional, default `true` | Include the attachment list (default true) |

#### `get_mailbox_overview` (read)

The mailbox at a glance: the customer's Blue Button email address, whether it is configured, and the unread / inbox / starred / archived / sent / trash counts plus the newest message timestamps. Counts come in two units and BOTH are reported: *_conversations counts threads and always equals the total that list_mailbox_messages returns for the same folder and filter, while *_messages counts the individual emails inside them — a mailbox with 3 conversations can hold 40 messages, so never compare the two. Call this first — it answers "is there anything waiting for me?" without paging any list. For the messages themselves use list_mailbox_messages.

Parameters: —

#### `get_mailbox_thread` (read)

Open the whole conversation a message belongs to — every inbound and outbound message merged oldest first. A lead-linked message opens the lead's full email history; a non-lead message opens the thread stitched from the counterparty address and the normalized subject. Paginated (total_messages reports the full thread size) so a long thread never floods the context. Set mark_read=true to clear the unread state of the inbound messages on the page, exactly as opening the thread in the console does.

| Parameters | | |
|---|---|---|
| `message_id` | string, required | Message handle from a list or search result, e.g. "in-42" |
| `page` | integer, optional, default `0` | Page number (0-based, default 0) |
| `page_size` | integer, optional, default `50` | Messages per page (default 50, max 200) |
| `mark_read` | boolean, optional, default `false` | Mark the inbound messages on this page as read (default false) |

#### `list_mailbox_contacts` (read)

List the people the customer can email — every lead with an address that is confirmed or further along and still allowed to receive email, alphabetical and paginated. Use it to find the right recipient before send_mailbox_message. This is the compose picker, not the full lead list — for that use search_leads.

| Parameters | | |
|---|---|---|
| `page` | integer, optional, default `0` | Page number (0-based, default 0) |
| `page_size` | integer, optional, default `50` | Contacts per page (default 50, max 200) |

#### `list_mailbox_messages` (read)

List the mailbox one row per conversation, newest first — inbox, sent or trash. filter narrows the inbox to unread, starred or console-archived mail ("all" returns everything that is not deleted, archived included). Paginated: total reports the full match count. Each row carries a message_id handle like "in-42" / "out-42" — pass that handle to every other mailbox tool. Set include_bodies=true for full bodies instead of the preview snippet. This is the whole mailbox, including mail that belongs to no lead; for one lead's email thread use list_lead_emails.

| Parameters | | |
|---|---|---|
| `folder` | string, optional, default `inbox` | Folder: inbox, sent or trash (default inbox) |
| `filter` | string, optional, default `all` | Filter: all, unread, starred or archived (default all). unread applies to the inbox only |
| `page` | integer, optional, default `0` | Page number (0-based, default 0) |
| `page_size` | integer, optional, default `20` | Rows per page (default 20, max 100) |
| `include_bodies` | boolean, optional, default `false` | Include full message bodies (default false); false returns the preview snippet only |

#### `reply_to_mailbox_message` (write)

Reply inside the conversation a message belongs to — works on ANY thread, whether the other party is a lead or not. Unlike send_message_to_lead this threads correctly: it carries the In-Reply-To and References headers of the thread's newest message plus the "Re:" subject, so the reply lands in the recipient's existing thread instead of starting a new one. SIDE-EFFECT: on a lead-linked thread this takes the lead over (the autonomous agent stops messaging it), pushes the next scheduled touch out a week, and the body is translated to the lead's language when they differ — a non-lead reply does none of that and is sent exactly as written. Refused when the recipient is blacklisted or has unsubscribed. The email is queued for delivery, not sent instantly. Attachments must already be public URLs — generate them with the media tools or register_business_file first.

| Parameters | | |
|---|---|---|
| `message_id` | string, required | Message handle of any message in the thread to reply to, e.g. "in-42" |
| `body` | string, required | The reply body, in the customer's own language |
| `attachment_urls` | string, optional | Comma-separated public URLs to attach (optional, max 5 files, 20MB total) |

#### `restore_mailbox_messages` (write)

Restore one or more messages from the trash. WARNING: restoring a sent message that was deleted before it ever went out puts it back in the send queue and it WILL be delivered — the queue only skips deleted rows. Accepts a comma-separated list of message handles (max 100 per call).

| Parameters | | |
|---|---|---|
| `message_ids` | string, required | Comma-separated message handles, e.g. "in-42,out-9" (max 100) |

#### `search_mailbox` (read)

Search the mailbox by meaning AND by exact text — semantic matches over the embedded message bodies merged with exact matches on the counterparty address, display name and the lead's name / email / company. Returns one row per matching conversation, most relevant first, paginated. Needs at least 3 characters. This searches the customer's own mailbox, including non-lead mail; to search inside one lead's conversations use search_lead_conversations, and for the customer's own chat with their Blue Button agent use search_my_agent_conversation.

| Parameters | | |
|---|---|---|
| `query` | string, required | What to search for, in any language — phrased by meaning or as an exact name / address |
| `folder` | string, optional, default `inbox` | Folder: inbox or sent (default inbox) |
| `page` | integer, optional, default `0` | Page number (0-based, default 0) |
| `page_size` | integer, optional, default `10` | Rows per page (default 10, max 50) |
| `include_bodies` | boolean, optional, default `false` | Include full message bodies (default false) |

#### `send_mailbox_message` (write)

Send a new email from the customer's Blue Button address to any address — it does not have to be an existing lead. Set register_as_lead=true to also register an unknown recipient as a lead so the conversation is tracked. SIDE-EFFECT: when the recipient IS an existing lead this takes that lead over (the autonomous agent stops messaging it). Refused when the recipient is blacklisted or has unsubscribed, lead or not. The email is queued for delivery, not sent instantly. To reply inside an existing conversation use reply_to_mailbox_message, which threads the reply properly.

| Parameters | | |
|---|---|---|
| `to_address` | string, required | Recipient email address |
| `subject` | string, required | Email subject; when blank a default is generated |
| `body` | string, optional | The message body, in the customer's own language |
| `register_as_lead` | boolean, optional, default `false` | Register an unknown recipient as a new lead (default false) |
| `attachment_urls` | string, optional | Comma-separated public URLs to attach (optional, max 5 files, 20MB total) |

#### `set_mailbox_messages_archived` (write)

Archive or unarchive one or more messages, in either folder. Archiving hides a message from the default mailbox list but keeps it fully searchable and readable — it is not a delete. Accepts a comma-separated list of message handles (max 100 per call).

| Parameters | | |
|---|---|---|
| `message_ids` | string, required | Comma-separated message handles, e.g. "in-42,out-9" (max 100) |
| `archived` | boolean, optional, default `true` | true archives, false unarchives (default true) |

#### `set_mailbox_messages_read` (write)

Mark one or more inbound messages read or unread. Accepts a comma-separated list of message handles (max 100 per call) so a whole triage pass is a single call. Sent mail has no read state and is rejected.

| Parameters | | |
|---|---|---|
| `message_ids` | string, required | Comma-separated message handles, e.g. "in-42,in-43" (max 100) |
| `read` | boolean, optional, default `true` | true marks read, false marks unread (default true) |

#### `set_mailbox_messages_starred` (write)

Star or unstar one or more messages, in either folder. Accepts a comma-separated list of message handles (max 100 per call). Starring is a toggle-free set: passing starred=true twice leaves the message starred.

| Parameters | | |
|---|---|---|
| `message_ids` | string, required | Comma-separated message handles, e.g. "in-42,out-9" (max 100) |
| `starred` | boolean, optional, default `true` | true stars, false unstars (default true) |

### Campaigns

Run separate prospecting tracks for different products or markets: create, pause, resume, rename, archive, compare results, and move leads between them.

#### `archive_campaign` (destructive)

Archives a campaign permanently. Every lead in it has its campaign link cleared and goes back to default prospecting, and the campaign stops appearing in campaign lists. Use pause_campaign instead for a temporary stop.

| Parameters | | |
|---|---|---|
| `name` | string, required | Campaign name or numeric campaign_id |

#### `compare_campaigns` (read)

Compare two campaigns side-by-side: configuration and lead stats.

| Parameters | | |
|---|---|---|
| `name_a` | string, required | First campaign name |
| `name_b` | string, required | Second campaign name |

#### `create_campaign` (write)

Creates a new prospecting campaign. Name and business_name are required. Each campaign is ISOLATED — it does NOT inherit any field from the customer-level defaults, so populate every field that matters at creation time.

| Parameters | | |
|---|---|---|
| `name` | string, required | Campaign name (unique per customer) |
| `business_name` | string, required | Business name for this campaign |
| `business_description` | string, optional | Business description for this campaign — the product/service it represents. REQUIRED when the campaign represents a different product than the customer's main business, otherwise prospecting copy will have no product context. |
| `business_website` | string, optional | Business website URL for this campaign |
| `icp` | string, optional | Ideal customer profile |
| `cnae_filter` | string, optional | Comma-separated CNAE codes to include |
| `cnae_exclusion_filter` | string, optional | Comma-separated CNAE codes to exclude |
| `instructions` | string, optional | Prospecting instructions |
| `email_instructions` | string, optional | Email-channel instructions overlay — extra guidance applied ONLY when reaching a lead by email for THIS campaign, layered on top of the campaign's general instructions (raw replace of the email overlay). |
| `whatsapp_instructions` | string, optional | WhatsApp-channel instructions overlay — extra guidance applied ONLY when reaching a lead on WhatsApp for THIS campaign, layered on top of the campaign's general instructions (raw replace of the WhatsApp overlay). |
| `voice_instructions` | string, optional | Voice-channel instructions overlay — extra guidance applied ONLY on outbound calls for THIS campaign, layered on top of the campaign's general instructions (raw replace of the voice overlay). |
| `goal` | string, optional | Outreach goal |
| `lead_qualification_instructions` | string, optional | Lead qualification instructions — rules for HOW to evaluate leads against the ICP (hard requirements vs. flexible preferences, override conditions, leniency rules, disqualification thresholds) |
| `human_review_criteria` | string, optional | Human review criteria — when to flag a lead for manual review instead of auto-advancing |
| `email_display_name` | string, optional | Email display name override for this campaign (e.g. 'Carlos from PrimeAssist'). Leave blank to use the customer-level display name. |
| `uf_filter` | string, optional | Comma-separated Brazilian state codes (e.g. 'SP,RJ,MG') |
| `city_filter` | string, optional | Comma-separated city names |
| `country_filter` | string, optional | ISO country codes |
| `min_employee_count` | integer, optional | Minimum employee count |
| `max_employee_count` | integer, optional | Maximum employee count |
| `min_annual_revenue` | number, optional | Minimum annual revenue |
| `max_annual_revenue` | number, optional | Maximum annual revenue |
| `company_size_filter` | string, optional | Comma-separated company sizes: Micro,Small,Medium,Large |
| `company_type_filter` | string, optional | Comma-separated company types to include in lead searches: Private, Individual, Government, StateOwned, NonProfit. Empty = inherit the customer's company type filter (customer default = Private only — MEI / individual entrepreneurs, government, state-owned and non-profit entities excluded). |
| `company_audience_filter` | string, optional | Comma-separated audiences the target company sells to: B2B, B2C, B2BAndB2C, Government, NonCommercial. Derived from the registered activity, so a campaign aimed at 'empresas B2B' needs no CNAE list. Asking for B2B also returns companies that sell to both, and companies whose activity gives no signal are never excluded. Empty = inherit the customer's audience filter. |
| `lead_generation_active` | boolean, optional | Whether to auto-generate NEW leads for this track. Defaults to true. Set to false ONLY when the campaign should ONLY work on a list the user imports themselves and never receive auto-generated leads. Existing leads still get prospected — only new lead acquisition is paused when false. |

#### `get_campaign` (read)

Returns full configuration and lead stats for a specific campaign. Accepts the campaign name or its numeric campaign_id (as returned by list_campaigns, search_leads, get_lead).

| Parameters | | |
|---|---|---|
| `name` | string, required | Campaign name or numeric campaign_id |

#### `list_campaigns` (read)

Lists all prospecting campaigns for the customer with their lead stats (total, interested, confirmed, cold, aware, frozen, not interested, taken over, pending review) and email metrics (emails sent, replies received, reply rate).

Parameters: —

#### `move_leads_to_campaign` (write)

Move leads from one campaign to another, or remove them from their campaign and return them to default (no-campaign) prospecting. Pass the target campaign name, or 'default' to remove the leads from any campaign. Optionally filter by lead status.

| Parameters | | |
|---|---|---|
| `target_campaign` | string, required | Target campaign name or numeric campaign_id, or 'default' (or 'none') to remove the leads from their campaign and return them to default prospecting |
| `lead_ids` | string, required | Comma-separated lead IDs to move |
| `status_filter` | string, optional | Only move leads with this status (optional) |

#### `pause_campaign` (write)

Pauses a campaign. Leads in this campaign will not be processed until resumed.

| Parameters | | |
|---|---|---|
| `name` | string, required | Campaign name or numeric campaign_id |

#### `rename_campaign` (write)

Renames a campaign.

| Parameters | | |
|---|---|---|
| `old_name` | string, required | Current campaign name |
| `new_name` | string, required | New campaign name |

#### `resume_campaign` (write)

Resumes a paused campaign.

| Parameters | | |
|---|---|---|
| `name` | string, required | Campaign name or numeric campaign_id |

#### `set_campaign_lead_generation_active` (write)

Toggles whether the system AUTO-GENERATES new leads for a campaign. true = generate new leads (default). false = stop generating new leads — only work the existing list. INDEPENDENT from pause/resume: a campaign with lead_generation_active=false but is_active=true still prospects its existing leads, just no new lead acquisition. Use this when the user wants a campaign to work ONLY on a list they imported themselves.

| Parameters | | |
|---|---|---|
| `name` | string, required | Campaign name or numeric campaign_id |
| `active` | boolean, required | true to keep generating new leads, false to stop generating new leads (existing leads still get prospected) |

#### `update_campaign` (write)

Updates an existing campaign's configuration. Pass only the fields you want to change. For numeric filters (employee count, revenue), set to -1 to clear.

| Parameters | | |
|---|---|---|
| `name` | string, required | Current campaign name |
| `business_name` | string, optional | New business name |
| `business_description` | string, optional | Business description |
| `business_website` | string, optional | Business website |
| `icp` | string, optional | Ideal customer profile |
| `cnae_filter` | string, optional | CNAE inclusion filter |
| `cnae_exclusion_filter` | string, optional | CNAE exclusion filter |
| `uf_filter` | string, optional | Comma-separated Brazilian state codes (e.g. 'SP,RJ,MG') |
| `city_filter` | string, optional | Comma-separated city names |
| `country_filter` | string, optional | Country filter |
| `instructions` | string, optional | Prospecting instructions |
| `email_instructions` | string, optional | Email-channel instructions overlay — extra guidance applied ONLY when reaching a lead by email for THIS campaign, layered on top of the campaign's general instructions (raw replace of the email overlay). |
| `whatsapp_instructions` | string, optional | WhatsApp-channel instructions overlay — extra guidance applied ONLY when reaching a lead on WhatsApp for THIS campaign, layered on top of the campaign's general instructions (raw replace of the WhatsApp overlay). |
| `voice_instructions` | string, optional | Voice-channel instructions overlay — extra guidance applied ONLY on outbound calls for THIS campaign, layered on top of the campaign's general instructions (raw replace of the voice overlay). |
| `goal` | string, optional | Outreach goal |
| `strategy` | string, optional | Strategy |
| `human_review_criteria` | string, optional | Human review criteria |
| `lead_qualification_instructions` | string, optional | Lead qualification instructions — rules for HOW to evaluate leads against the ICP (hard requirements vs. flexible preferences, override conditions, leniency rules, disqualification thresholds) |
| `email_display_name` | string, optional | Email display name |
| `min_employee_count` | integer, optional | Minimum employee count (-1 to clear) |
| `max_employee_count` | integer, optional | Maximum employee count (-1 to clear) |
| `min_annual_revenue` | number, optional | Minimum annual revenue (-1 to clear) |
| `max_annual_revenue` | number, optional | Maximum annual revenue (-1 to clear) |
| `company_size_filter` | string, optional | Comma-separated company sizes: Micro,Small,Medium,Large (empty to clear) |
| `company_type_filter` | string, optional | Comma-separated company types to include in lead searches: Private, Individual, Government, StateOwned, NonProfit. Empty string clears the campaign override and inherits the customer's company type filter (customer default = Private only — MEI / individual entrepreneurs, government, state-owned and non-profit entities excluded). |
| `company_audience_filter` | string, optional | Comma-separated audiences the target company sells to: B2B, B2C, B2BAndB2C, Government, NonCommercial. Derived from the registered activity, so a campaign aimed at 'empresas B2B' needs no CNAE list. Asking for B2B also returns companies that sell to both. Empty string clears the campaign override and inherits the customer's audience filter. |
| `lead_generation_active` | boolean, optional | Whether to auto-generate NEW leads for this track. true = generate new leads (default for new campaigns). false = stop generating new leads, only work the existing list. Independent from pause/resume — when false the campaign keeps prospecting its existing leads, just doesn't acquire new ones. |
| `is_active` | boolean, optional | Whether this campaign is running at all. false pauses the whole track (same as pause_campaign), true resumes it. |
| `voice_calling_active` | boolean, optional | Per-track outbound voice calling. true calls this track's leads, false never calls them, omit to keep the current setting. Cleared to inherit the customer-level toggle via clear_voice_calling_active. |
| `generate_custom_presentations` | boolean, optional | Whether to generate a per-lead custom presentation for this track (true/false) |
| `notify_on_interested` | boolean, optional | Alert when a lead of this track shows interest (true/false) |
| `notify_on_confirmed` | boolean, optional | Alert when a lead of this track is confirmed (true/false) |
| `min_founding_date` | string, optional | Earliest company founding date to include, as 'yyyy-MM-dd' (empty to clear) |
| `max_founding_date` | string, optional | Latest company founding date to include, as 'yyyy-MM-dd' (empty to clear) |

### Prospecting settings

The master switch plus everything that shapes who gets contacted and how: targeting, rules and preferences.

#### `get_prospecting_config` (read)

Returns all prospecting configuration: filters (CNAE, location), instructions, goal, strategy, human review criteria, lead qualification instructions, notification settings, mode, and activation status.

Parameters: —

#### `set_allow_template_whatsapp_messages` (write)

Allows or blocks agent-initiated WhatsApp template messages to leads. When blocked the agent may only reply to leads who wrote first, inside WhatsApp's 24-hour window, and never opens a conversation by template. Free-form replies are unaffected.

| Parameters | | |
|---|---|---|
| `allowed` | boolean, required | true to allow agent-initiated template messages, false to reply-only |

#### `set_prospecting_active` (write)

Activates or deactivates autonomous prospecting. Returns the new status and eligibility information.

| Parameters | | |
|---|---|---|
| `active` | boolean, required | true to activate, false to deactivate |

#### `set_prospecting_preferences` (write)

Updates prospecting preferences: mode (Active/Passive), custom presentations, and notification settings. Pass only the fields you want to change.

| Parameters | | |
|---|---|---|
| `mode` | string, optional | Prospecting mode: 'Active' (searching for leads) or 'Passive' (paused until review) |
| `generate_presentations` | boolean, optional | Whether to generate custom presentations per lead (true/false) |
| `notification_email` | string, optional | Email address to receive prospecting notifications |
| `notify_on_interested` | boolean, optional | Notify (in-app/WhatsApp) when leads show interest (true/false) |
| `notify_on_confirmed` | boolean, optional | Notify (in-app/WhatsApp) when leads are confirmed (true/false) |
| `notify_on_interested_via_email` | boolean, optional | Send the branded EMAIL when leads show interest (true/false) — independent of the in-app/WhatsApp alert |
| `notify_on_confirmed_via_email` | boolean, optional | Send the branded EMAIL when leads are confirmed (true/false) — independent of the in-app/WhatsApp alert |
| `notify_on_first_whatsapp_message` | boolean, optional | Notify (one-time heads-up) when a lead sends their first WhatsApp message (true/false) |
| `cc_on_interested_lead_emails` | boolean, optional | Copy the customer on the interested-lead emails sent to the notification addresses (true/false) |

#### `set_prospecting_rules` (write)

Updates prospecting rules: instructions for the agent, outreach goal, strategy, human review criteria, and lead qualification instructions. Pass only the fields you want to change.

| Parameters | | |
|---|---|---|
| `instructions` | string, optional | Instructions for how the agent should prospect (raw replace) |
| `goal` | string, optional | Desired outreach goal (e.g. 'schedule a demo', 'book a meeting') |
| `strategy` | string, optional | Prospecting strategy document |
| `human_review_criteria` | string, optional | Criteria for when to escalate leads to human review |
| `lead_qualification_instructions` | string, optional | Rules for HOW to evaluate leads against the ICP — which characteristics are hard requirements vs. flexible preferences, override conditions, leniency rules, disqualification thresholds. Distinct from the ICP itself (who to target). |
| `email_instructions` | string, optional | Email-channel instructions overlay — extra guidance applied ONLY when reaching a lead by email, layered on top of the general instructions (raw replace of the email overlay). |
| `whatsapp_instructions` | string, optional | WhatsApp-channel instructions overlay — extra guidance applied ONLY when reaching a lead on WhatsApp, layered on top of the general instructions (raw replace of the WhatsApp overlay). |
| `voice_instructions` | string, optional | Voice-channel instructions overlay — extra guidance applied ONLY on outbound calls, layered on top of the general instructions (raw replace of the voice overlay). |
| `email_signature` | string, optional | Exact signature block appended verbatim to every prospecting email. When set, the copywriter writes no signature of its own. Pass an empty string to clear it and go back to the default name-only signature. |

#### `set_targeting` (write)

Updates prospecting targeting filters. Pass only the fields you want to change. Comma-separated values for multi-value fields. For numeric filters (employee count, revenue), set to -1 to clear.

| Parameters | | |
|---|---|---|
| `cnae_filter` | string, optional | Comma-separated CNAE codes to include (e.g. '6201,6202,6311') |
| `cnae_exclusion_filter` | string, optional | Comma-separated CNAE codes to exclude |
| `uf_filter` | string, optional | Comma-separated Brazilian state codes (e.g. 'SP,RJ,MG') |
| `city_filter` | string, optional | Comma-separated city names |
| `country_filter` | string, optional | Comma-separated ISO country codes (e.g. 'BR,US') |
| `min_employee_count` | integer, optional | Minimum employee count (-1 to clear) |
| `max_employee_count` | integer, optional | Maximum employee count (-1 to clear) |
| `min_annual_revenue` | number, optional | Minimum annual revenue (-1 to clear) |
| `max_annual_revenue` | number, optional | Maximum annual revenue (-1 to clear) |
| `company_size_filter` | string, optional | Comma-separated company sizes: Micro,Small,Medium,Large (empty to clear) |
| `company_type_filter` | string, optional | Comma-separated company types to include in lead searches: Private, Individual, Government, StateOwned, NonProfit. Default (empty) = Private only — MEI / individual entrepreneurs, government, state-owned and non-profit entities are excluded. |
| `company_audience_filter` | string, optional | Comma-separated audiences the target company sells to: B2B, B2C, B2BAndB2C, Government, NonCommercial. Derived from the company's registered activity, so an ICP of simply 'empresas B2B' needs no CNAE list. Asking for B2B also returns companies that sell to both, and companies whose activity gives no signal are never excluded. Default (empty) = no audience filter. |
| `min_founding_date` | string, optional | Earliest company founding date to include, as 'yyyy-MM-dd' (empty to clear) |
| `max_founding_date` | string, optional | Latest company founding date to include, as 'yyyy-MM-dd' (empty to clear) |

### Prospecting simulation

Test real prospecting behavior before activation: sandboxed email and WhatsApp conversations plus explicitly confirmed voice calls to a test number.

#### `get_voice_simulation_status` (read)

Reads the status, transcript, and outcome summary of a customer voice simulation. Poll with the simulationLeadId and callId returned by start_voice_simulation until finished=true.

| Parameters | | |
|---|---|---|
| `simulation_lead_id` | integer, required | simulationLeadId returned by start_voice_simulation. |
| `call_id` | integer, required | callId returned by start_voice_simulation. |

#### `run_prospecting_simulation` (write)

Starts, continues, inspects, or finishes an isolated prospecting simulation using the SAME email/WhatsApp prospecting agents and current customer/campaign configuration used in production. No real lead is contacted. Lifecycle: simulation_lead_id=0 starts a new fake lead; pass lead_message to also role-play the lead's next message; reuse the returned simulation_lead_id with another lead_message for later turns; omit lead_message with an existing ID to inspect the merged transcript and lead state; set finish=true to close it. Use a fresh simulation after configuration edits when validating from a clean baseline.

| Parameters | | |
|---|---|---|
| `channel` | string, required | Inbound test channel: 'email' or 'whatsapp'. On a new agent-started simulation this is also the opening channel. The real agent may respond on another channel. |
| `simulation_lead_id` | integer, optional, default `0` | Existing simulation lead ID to continue/inspect/finish. Omit or 0 to start a new simulation. |
| `lead_message` | string, optional | Message to send while role-playing the fake lead. On a new simulation, this runs immediately after creation/the opener. Omit with an existing ID to inspect only. |
| `last_email_subject` | string, optional | Email subject for this fake lead reply. Used only when channel='email'. |
| `campaign` | string, optional | Campaign name or numeric campaign_id. Omit for customer-level/default prospecting. Used only when starting a new simulation. |
| `lead_starts` | boolean, optional, default `false` | If true on a new simulation, the fake lead initiates the conversation and no agent opener is generated before lead_message. |
| `finish` | boolean, optional, default `false` | Close the existing simulation. Requires simulation_lead_id; no turn is run. |
| `lead_name` | string, optional | Fake lead name. Optional; an agent-started test gets a realistic fallback. Leave blank with lead_starts=true to test an unknown inbound lead. |
| `company_name` | string, optional | Fake lead company name. Optional; an agent-started test gets a realistic fallback. |
| `company_description` | string, optional | Fake lead company description. Include fit/disqualifying facts needed by the scenario. |
| `website` | string, optional | Fake lead company website. |
| `phone` | string, optional | Fake lead phone number. |
| `city` | string, optional | Fake lead city. |
| `state` | string, optional | Fake lead state/region. |
| `cnae` | string, optional | Fake lead CNAE/industry classification. |
| `cnpj` | string, optional | Fake lead CNPJ/company registration number. |
| `country` | string, optional | Fake lead country. |
| `background` | string, optional | Scenario-specific prospecting background known about the fake lead. |
| `goal` | string, optional | Lead-specific goal override for this simulation. |
| `notes` | string, optional | Lead-specific notes visible to the prospecting agent. |
| `first_touch_instructions` | string, optional | Lead-specific first-touch instructions for this simulation. |

#### `start_voice_simulation` (destructive)

Starts an isolated VOICE prospecting simulation that places a REAL phone call to the authenticated account owner's saved profile number. Never calls a lead or an arbitrary supplied number. Get the user's explicit confirmation immediately before calling this tool because the phone will ring and telephony/LLM usage is incurred. Uses the current customer or campaign voice instructions and returns simulationLeadId + callId for get_voice_simulation_status polling.

| Parameters | | |
|---|---|---|
| `campaign` | string, optional | Campaign name or numeric campaign_id. Omit for customer-level/default voice prospecting. |
| `lead_name` | string, optional | Fake lead name. A realistic fallback is used when omitted. |
| `company_name` | string, optional | Fake lead company name. A realistic fallback is used when omitted. |
| `company_description` | string, optional | Fake lead company description. Include fit/disqualifying facts needed by the voice scenario. |
| `website` | string, optional | Fake lead company website. |
| `background` | string, optional | Scenario-specific prospecting background known about the fake lead. |
| `goal` | string, optional | Lead-specific goal override for this simulation. |
| `notes` | string, optional | Lead-specific notes visible to the prospecting agent. |
| `first_touch_instructions` | string, optional | Lead-specific first-touch instructions for this simulation. |

### Prospecting files

The catalog of files the agent may send to a lead — presentations, price tables, guides — scoped to a campaign or to the whole account.

#### `list_prospecting_files` (read)

List the prospecting files catalog — the materials the prospecting agent can offer and send to leads, with each file's title, description, url and campaign scope.

Parameters: —

#### `register_prospecting_file` (write)

Register a file in the prospecting files catalog — the materials the prospecting agent can offer and SEND TO LEADS during outreach (price table, institutional presentation, onboarding guide), via email attachments and WhatsApp documents. Provide either customer_file_id (an already-uploaded customer file — preferred) or a direct url. If no description is given, one is auto-generated from the file's content so the agent knows when to send it. NOT for business knowledge the agent answers questions from (register_business_file) and NOT the per-lead AI-generated custom guide.

| Parameters | | |
|---|---|---|
| `title` | string, required | Short lead-facing title, e.g. 'Tabela de precos' |
| `description` | string, optional | What the file contains and when to send it to a lead (1-3 sentences). Leave empty to auto-generate from the file's content. |
| `customer_file_id` | integer, optional | Id of an existing customer file to register (preferred over a raw url) |
| `url` | string, optional | Direct public URL of the file (alternative to customer_file_id) |
| `campaign` | string, optional | Optional campaign name to make the file sendable ONLY to that campaign's leads. Leave empty for a customer-wide file sendable to every lead. |
| `sort_order` | integer, optional, default `0` | Catalog display/prompt order (lower first, default 0) |

#### `remove_prospecting_file` (destructive)

Remove a file from the prospecting files catalog so the prospecting agent stops offering and sending it to leads. Find the id with list_prospecting_files.

| Parameters | | |
|---|---|---|
| `prospecting_file_id` | integer, required | Id of the prospecting file to remove |

#### `update_prospecting_file` (write)

Update a prospecting file's title, description, campaign scope or display order. Find the id with list_prospecting_files. To change the file itself, remove the entry and register a new one.

| Parameters | | |
|---|---|---|
| `prospecting_file_id` | integer, required | Id of the prospecting file to update |
| `title` | string, optional | New lead-facing title |
| `description` | string, optional | New description of what the file contains and when to send it |
| `campaign` | string, optional | Campaign name to scope the file to, or 'all' to make it customer-wide |
| `sort_order` | integer, optional | New catalog display/prompt order (lower first) |

### Prospecting links

The catalog of web pages the agent may send to a lead as links — documentation pages, online presentations, pricing pages — scoped to a campaign or to the whole account.

#### `list_prospecting_links` (read)

List the prospecting links catalog — the web pages the prospecting agent can send to leads, with each link's title, description, url and campaign scope.

Parameters: —

#### `register_prospecting_link` (write)

Register a web page in the prospecting links catalog — pages the prospecting agent can SEND TO LEADS during outreach as a link at the end of the message (documentation page, online presentation, pricing page). Provide the page url and a short title. If no description is given, one is auto-generated from the page content so the agent knows when to send it. A web page is never a file — use register_prospecting_file for PDFs and documents.

| Parameters | | |
|---|---|---|
| `title` | string, required | Short lead-facing title, e.g. 'Apresentacao online' |
| `url` | string, required | Public URL of the web page |
| `description` | string, optional | What the page contains and when to send it to a lead (1-3 sentences). Leave empty to auto-generate from the page content. |
| `campaign` | string, optional | Optional campaign name to make the link sendable ONLY to that campaign's leads. Leave empty for a customer-wide link sendable to every lead. |
| `sort_order` | integer, optional, default `0` | Catalog display/prompt order (lower first, default 0) |

#### `remove_prospecting_link` (destructive)

Remove a web page from the prospecting links catalog so the prospecting agent stops sending it to leads. Find the id with list_prospecting_links.

| Parameters | | |
|---|---|---|
| `prospecting_link_id` | integer, required | Id of the prospecting link to remove |

#### `update_prospecting_link` (write)

Update a prospecting link's title, description, campaign scope or display order. Find the id with list_prospecting_links. To change the URL itself, remove the entry and register a new one.

| Parameters | | |
|---|---|---|
| `prospecting_link_id` | integer, required | Id of the prospecting link to update |
| `title` | string, optional | New lead-facing title |
| `description` | string, optional | New description of what the page contains and when to send it |
| `campaign` | string, optional | Campaign name to scope the link to, or 'all' to make it customer-wide |
| `sort_order` | integer, optional | New catalog display/prompt order (lower first) |

### Prospecting learnings

List, search and dismiss learnings from prospecting activity.

#### `dismiss_prospecting_learning` (write)

Hide a prospecting learning when the customer says it is incorrect or outdated; preserve their reason. Does not change source outcomes or operational instructions.

| Parameters | | |
|---|---|---|
| `learning_id` | integer, required | Learning ID from list or search. |
| `reason` | string, required | Customer's reason, 1–2000 characters. |

#### `list_prospecting_learnings` (read)

List evidence-backed learnings about this customer's prospecting, separate from company reference documents. Returns all fixed reports over the last 90 days: email reply days/hours, every recorded decline reason with counts, lead regions, and industries/CNAEs. Content contains the ready-to-use insight; Summary contains the numerical overview. Preserves scope, dates and limitations; does not change prospecting rules.

Parameters: —

#### `search_prospecting_learnings` (read)

Search this customer's prospecting learnings semantically using your own reasoning-driven query: recorded decline reasons, email reply days/hours lead cities/states or industries/CNAEs. Observations are not causal proof. Separate from company reference documents.

| Parameters | | |
|---|---|---|
| `query` | string, required | Prospecting topic or question, 1–2000 characters. |

### Reports

The numbers: headline prospecting report, funnel by industry and by state, performance trends, message performance, volume estimates, and a narrative catch-up of what changed.

#### `estimate_lead_volume` (read)

Returns a benchmark of what a typical PAID Blue Button customer (and paid customers with a similar ICP) produces in the last 30 days: new leads found, confirmed responses (real conversations), interested (hot) leads, and messages sent — each shown as a range from median (typical customer) to top (more active ones) per week and per month. Free-trial-only users are excluded. The tool picks the most relevant benchmark automatically — Similar (CNAE-overlapping paid customers) when available, Global (all paid customers) otherwise.

Parameters: —

#### `get_funnel_by_industry` (read)

Get a funnel breakdown by industry. For Brazilian customers, groups by CNAE division. For international customers, groups by the CompanyIndustry field from Apollo data. Optionally filter by campaign.

| Parameters | | |
|---|---|---|
| `campaign` | string, optional | Filter by campaign name or numeric campaign_id (optional, omit for global funnel) |

#### `get_funnel_timeline` (read)

Count of leads ENTERING each funnel stage per time bucket (day or week). Stages tracked: cold (DateProspectingStarted), confirmed (DateConfirmedProspectingQualification), interested (DateConfirmedInterest), closed (DateStatusChanged while current Status=Closed — APPROXIMATION: a lead that was Closed and later moved to another status will not be counted, because the platform does not store status history). Aware is not exposed — the platform does not reliably track entry into that stage. Missing buckets gap-filled with zeros, newest-first. Optionally filter by campaign.

| Parameters | | |
|---|---|---|
| `days` | integer, optional, default `30` | Number of days to look back (default 30, max 365) |
| `bucket` | string, optional, default `day` | Bucket size: 'day' (default) or 'week' (Monday-aligned) |
| `campaign` | string, optional | Filter by campaign name or numeric campaign_id (optional, omit for global timeline) |

#### `get_message_performance` (read)

Reply rate broken down by campaign and/or message type over a time window. Returns total sent, replied (distinct outbound emails with at least one reply), reply_rate_pct, plus a breakdown. Breakdown shape depends on group_by: 'campaign' returns one row per campaign (message types collapsed); 'type' returns one row per message type (campaigns collapsed); 'both' (default) returns one row per campaign×type combination (a matrix — NOT two separate lists — so expect up to N_campaigns × N_types rows). Message types: first_contact (AutonomousFirstTouch), follow_up (AutonomousFollowUp), response (AutonomousResponse to inbound), direct (DirectMessage sent on user's behalf), user_written (UserWrittenMessage sent manually by user). Defaults to 30 days.

| Parameters | | |
|---|---|---|
| `days` | integer, optional, default `30` | Number of days to look back (default 30, max 365) |
| `campaign` | string, optional | Filter by campaign name or numeric campaign_id (optional, omit for all campaigns) |
| `group_by` | string, optional, default `both` | How to group the breakdown: 'campaign', 'type', or 'both' (default) |

#### `get_metrics_by_state_and_industry` (read)

Breaks down every prospecting metric by Brazilian STATE and by INDUSTRY (CNAE description) over a time window, so you can compare which states/industries are performing best. For each dimension it returns the top groups by lead volume — each with new_leads, emails_sent, responses, whatsapp_sent, whatsapp_responses, conscientizados, interested (became interested in the window), confirmed_aware_interested_or_takenover, referrals, and meeting counts (invitations made/received, booked, made) — plus the top-performing group per metric category. Leads with no state/CNAE fall into 'Não informado' and are excluded from the top-performer picks. interested is counted by DateConfirmedInterest (the moment the lead converted). Optionally filter by campaign.

| Parameters | | |
|---|---|---|
| `days` | integer, optional, default `30` | Number of days to look back (default 30, max 365) |
| `campaign` | string, optional | Filter by campaign name or numeric campaign_id (optional, omit for whole account) |

#### `get_performance_trends` (read)

Get prospecting performance trends per day over the specified window. All metrics are daily FLOW counts (events that happened on that day), not cumulative stocks. Each row has: leads_generated (leads created that day), emails_sent (outbound prospecting emails sent that day), replies_received (inbound replies to outbound emails received that day), confirmed (leads whose status became Confirmed for the first time on that day, i.e. DateConfirmedProspectingQualification falls on the day), interested (leads whose status became Interested for the first time on that day, i.e. DateConfirmedInterest falls on the day — this is the per-day entry count, NOT the total number of leads currently with Status=Interested), whatsapp_sent (prospecting WhatsApp messages sent that day, by DateSent), whatsapp_replies_received (WhatsApp replies from leads that day, by the lead's send timestamp). Missing days are gap-filled with zeros. Optionally filter by campaign.

| Parameters | | |
|---|---|---|
| `days` | integer, optional, default `30` | Number of days to look back (default 30, max 365) |
| `campaign` | string, optional | Filter by campaign name or numeric campaign_id (optional, omit for global trends) |

#### `get_prospecting_report` (read)

Get an overall prospecting report: total leads, leads by status, emails sent, response rate, and pipeline summary. Also returns WhatsApp activity: whatsapp_sent (prospecting WhatsApp messages sent), whatsapp_responses (WhatsApp replies received, counted separately from email responses), and leads_talked_to_on_whatsapp (distinct leads with any WhatsApp message in either direction). Optionally filter by campaign.

| Parameters | | |
|---|---|---|
| `campaign` | string, optional | Filter by campaign name or numeric campaign_id (optional, omit for global report) |

#### `get_whatsapp_message_performance` (read)

WhatsApp reply performance broken down by campaign and/or message type over a time window. NOTE: unlike get_message_performance (email), WhatsApp reply rate is reported at the LEAD level — WhatsApp inbound has no per-message link to a specific outbound, so 'replied' cannot be attributed per message. Returns total sent (message count), leads_messaged (distinct leads contacted), leads_replied (distinct leads who sent at least one inbound on/after their first outbound of that type in the window), lead_reply_rate_pct (leads_replied / leads_messaged), plus a breakdown. group_by: 'campaign' (one row per campaign), 'type' (one row per message type), 'both' (default, campaign×type matrix). Message types: first_contact (AutonomousFirstTouch), follow_up (AutonomousFollowUp), response (AutonomousResponse), direct (DirectMessage), user_written (UserWrittenMessage). Defaults to 30 days.

| Parameters | | |
|---|---|---|
| `days` | integer, optional, default `30` | Number of days to look back (default 30, max 365) |
| `campaign` | string, optional | Filter by campaign name or numeric campaign_id (optional, omit for all campaigns) |
| `group_by` | string, optional, default `both` | How to group the breakdown: 'campaign', 'type', or 'both' (default) |

#### `list_prospecting_optimizations` (read)

Lists the autonomous prospecting optimization history in reverse-chronological order (newest first). Paginated. Each entry shows when the prospecting reviewer agent ran and what targeting/configuration changes it made and why. Optionally filter by campaign.

| Parameters | | |
|---|---|---|
| `campaign` | string, optional | Filter by campaign name or numeric campaign_id (optional, omit for all optimizations) |
| `page` | integer, optional, default `0` | Page number (0-based, default 0) |
| `page_size` | integer, optional, default `20` | Page size (default 20, max 100) |

#### `what_changed_since` (read)

Full digest of what happened in the prospecting operation since a given date — built for the 'I've been away for months, what happened?' case. Blocks: (1) activity_summary — the engine's raw work in the window: new_leads, emails_sent, email_replies, whatsapp_sent, whatsapp_replies; (2) funnel_progress — leads that reached each stage in the window: reached_confirmed, became_interested; (3) new_interested_leads — the interested leads themselves (up to 100, plus total_count); (4) outcomes — deals closed in the window: won_count, lost_count, gave_up_count, total_deal_value_brl, and won_items; (5) meetings — booked, cancelled, held, no_show counts in the window plus items; (6) pending_human_review — the CURRENT pile of leads waiting on the owner (a live snapshot, NOT limited to the window): total_count plus items; (7) support_answered — support requests the team answered in the window (message + answer); (8) campaign_performance_changes — campaigns whose reply rate shifted by at least 3 percentage points (30-day window ending on since_date vs since_date→now, skipping windows with fewer than 50 sent); (9) optimizer_adjustments — prospecting-optimizer changes persisted since that date (capped at 500 items; total_count/returned_count/truncated report the true total). All windowed counts cover since_date→now; timestamps are UTC.

| Parameters | | |
|---|---|---|
| `since_date` | string, required | ISO date in YYYY-MM-DD format (e.g. 2026-01-15) |

### Voice calls

Place a goal-driven phone call to a lead, read the calls already placed, and switch voice calling on or off per account or per campaign.

#### `get_campaign_voice_calling_active` (read)

Read a campaign's voice-calling toggle. A null value means the campaign inherits the customer-level toggle.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | Name of the campaign |

#### `get_voice_call` (read)

Get the status and outcome of a goal-driven phone call placed with place_goal_driven_call: lifecycle status, whether a person picked up, whether the goal was achieved, the outcome summary, and the full transcript.

| Parameters | | |
|---|---|---|
| `voice_call_request_id` | integer, required | The voice_call_request_id returned by place_goal_driven_call |

#### `get_voice_calling_active` (read)

Read whether autonomous outbound voice calling to leads is active at the customer level.

Parameters: —

#### `get_voice_prospecting_voice` (read)

Read which voice the agent speaks with on outbound prospecting phone calls ('Male' or 'Female').

Parameters: —

#### `list_voice_calls` (read)

List the customer's goal-driven phone calls (newest first) with status and outcome summary. Use get_voice_call for the full transcript of one call.

| Parameters | | |
|---|---|---|
| `page` | integer, optional, default `0` | Page number (0-based, default 0) |
| `page_size` | integer, optional, default `20` | Page size (default 20, max 100) |

#### `place_goal_driven_call` (write)

Place a REAL phone call to a number the customer gives you, to accomplish a stated goal (e.g. 'call this restaurant and ask if they have a table tonight'). A real-time voice assistant makes the call in the background; this only enqueues the request — the call is placed shortly after and cannot be recalled once dialing. Poll get_voice_call with the returned voice_call_request_id for the outcome (status, goal_achieved, summary, transcript); the result also arrives as a platform notification.

| Parameters | | |
|---|---|---|
| `phone_number` | string, required | The phone number to call, international format e.g. +5511999999999 |
| `goal` | string, required | The goal of the call in plain language and the customer's language — exactly what to accomplish or find out |
| `context` | string, optional | Optional background/context: who is being called and any helpful info |

#### `set_campaign_voice_calling_active` (write)

Enable or disable autonomous outbound voice calls for a specific campaign, overriding the customer-level toggle for that campaign only.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | Name of the campaign |
| `active` | boolean, required | True to enable, false to disable, for this campaign |

#### `set_voice_calling_active` (write)

Enable or disable autonomous outbound voice calls to leads at the customer level. Separate from email prospecting.

| Parameters | | |
|---|---|---|
| `active` | boolean, required | True to enable, false to disable |

#### `set_voice_prospecting_voice` (write)

Set which voice the agent speaks with on outbound prospecting phone calls. 'Male' is the default. This only changes how the agent sounds - it does not change what it says, and it does not affect WhatsApp or email.

| Parameters | | |
|---|---|---|
| `voice` | string, required | The voice to use on prospecting calls: 'Male' or 'Female' |

### WhatsApp line

Register and inspect the prospecting WhatsApp line, set its monthly and daily cost caps, and update its business profile.

#### `get_whatsapp_line` (read)

Get the customer's WhatsApp prospecting line — the one-stop status/diagnostic read: whether it is live/ready to send, its number, quality rating, full WhatsApp business profile, the pending one-click Meta signup link (when the customer still needs to connect their WhatsApp Business Account), any ACTIVE HEALTH ISSUE with the exact fix the customer must apply (payment method, reconnect link, Meta restriction), and the day- and month-to-date WhatsApp spend vs the customer's daily and monthly cost caps. Refreshes the live snapshot from Meta first.

Parameters: —

#### `register_whatsapp_line` (write)

Register a dedicated WhatsApp prospecting line (a real WhatsApp number). Provisioning is automatic and takes a few minutes. If the customer already has a line, returns that line instead of creating another (one line per customer). Requires an active paid plan that includes WhatsApp prospecting. By default Eesier provides a brand-new number; pass use_own_number=true when the customer wants to prospect from their OWN WhatsApp number — they then receive a one-click Meta link whose official popup connects their WhatsApp Business Account (or creates one), lets them pick which of their numbers to use, or verifies a new number on the spot.

| Parameters | | |
|---|---|---|
| `use_own_number` | boolean, optional, default `false` | True when the customer wants to use their OWN WhatsApp number instead of a new Eesier-provided one. Default false. |

#### `set_whatsapp_daily_cost_cap` (write)

Set (or clear) the customer's daily WhatsApp prospecting spending cap, in the currency Meta bills the customer in. Meta bills WhatsApp conversation fees to the customer's own account, so this cap lets the customer decide the maximum they want to spend per day. When the cap is reached, paid (conversation-opening) WhatsApp messages pause until the next day — replies to leads who message first keep working, and email prospecting is unaffected. Pass 0 or a negative value to remove the cap. The current spend and cap are visible on get_whatsapp_line.

| Parameters | | |
|---|---|---|
| `daily_cap` | number, required | Maximum daily WhatsApp spend, in the currency Meta bills this customer's WhatsApp account in (returned as cost_cap_currency by get_whatsapp_line — NOT necessarily BRL). Never convert the amount to another currency. 0 or negative removes the cap. |

#### `set_whatsapp_line_profile_picture` (write)

Set the WhatsApp line's profile picture from a public image URL or an already-uploaded customer file. Any JPG/PNG/WebP — non-square, small or oversized images are automatically fitted into a square avatar. The line must already be live.

| Parameters | | |
|---|---|---|
| `image_url` | string, optional | Public URL of the image (any JPG/PNG/WebP — automatically fitted into a square avatar) |
| `customer_file_id` | integer, optional | Id of an already-uploaded customer file to use as the picture. Preferred when the user uploaded an image. |

#### `set_whatsapp_monthly_cost_cap` (write)

Set (or clear) the customer's monthly WhatsApp prospecting spending cap, in the currency Meta bills the customer in. Meta bills WhatsApp conversation fees to the customer's own account, so this cap lets the customer decide the maximum they want to spend per calendar month. When the cap is reached, paid (conversation-opening) WhatsApp messages pause until the 1st of the next month — replies to leads who message first keep working, and email prospecting is unaffected. Pass 0 or a negative value to remove the cap. The current spend and cap are visible on get_whatsapp_line.

| Parameters | | |
|---|---|---|
| `monthly_cap` | number, required | Maximum monthly WhatsApp spend, in the currency Meta bills this customer's WhatsApp account in (returned as cost_cap_currency by get_whatsapp_line — NOT necessarily BRL). Never convert the amount to another currency. 0 or negative removes the cap. |

#### `update_whatsapp_line_profile` (write)

Update the WhatsApp line's business profile. Only provided fields change. The line must already be live. Display name is not managed here.

| Parameters | | |
|---|---|---|
| `about` | string, optional | Short 'about' text (max 139 chars) |
| `description` | string, optional | Business description (max 512 chars) |
| `address` | string, optional | Business street address |
| `email` | string, optional | Business contact email |
| `websites` | string, optional | Business website URLs, comma-separated (WhatsApp shows at most 2) |
| `vertical` | string, optional | Business category (WhatsApp vertical), e.g. PROF_SERVICES, RETAIL, EDU, HEALTH, FINANCE, RESTAURANT, OTHER |

### Business profile

What the account sells and to whom. Read the profile, read the agent's assessment of it, and rewrite it.

#### `get_business` (read)

Returns the customer's business profile: name, description, website, ideal customer profile, and default presentation URL.

Parameters: —

#### `get_business_assessment` (read)

Read the last business-fundamentals assessment Blue Button's internal advisor recorded for this customer: verdict, results probability, the full assessment JSON, when it was made, and the customer's known paying-client examples. Read-only data — bring your own analysis on top of it; there is no tool to re-run the assessment.

Parameters: —

#### `set_business` (write)

Updates the customer's business profile. Pass only the fields you want to change. Fields: business_name, business_description, business_website, ideal_customer_profile, paying_customer_examples. For the files the prospecting agent sends to leads (presentation, price table, ...), use the prospecting-file tools (register_prospecting_file / list_prospecting_files).

| Parameters | | |
|---|---|---|
| `business_name` | string, optional | Business name |
| `business_description` | string, optional | Business description |
| `business_website` | string, optional | Business website URL |
| `ideal_customer_profile` | string, optional | Ideal customer profile text |
| `paying_customer_examples` | string, optional | Real paying-customer examples the ICP and the business advisor reason from |

### Business files

The reference material the agent reads to understand the business — register, list and remove it.

#### `list_business_files` (read)

List the business-knowledge files registered for this customer, with each file's indexing state and campaign scope.

Parameters: —

#### `register_business_file` (write)

Register text (or an already-uploaded customer file) as business knowledge so the prospecting agents can answer questions about the business (services, processes, pricing, FAQs). The content is chunked + embedded in the background and becomes searchable shortly. Provide either text or customer_file_id.

| Parameters | | |
|---|---|---|
| `title` | string, required | Short descriptive title, e.g. 'Tabela de precos 2026' |
| `text` | string, optional | Raw text to register as business knowledge (use when the content was pasted directly) |
| `customer_file_id` | integer, optional | Id of an existing customer file to register (find it with list_business_files or the file list) |
| `campaign` | string, optional | Optional campaign name to scope this knowledge to one campaign. Leave empty for customer-level knowledge shared across every campaign. |

#### `remove_business_file` (destructive)

Remove a registered business-knowledge file and its indexed chunks so the agents stop answering from it. Find the id with list_business_files.

| Parameters | | |
|---|---|---|
| `business_file_id` | integer, required | Id of the business knowledge file to remove |

### FAQ

The questions leads keep asking: the answered business FAQ, and the ones still open waiting for an answer.

#### `list_business_faq` (read)

List the business FAQ — every question-and-answer pair the platform has accumulated about this business (each answer given via answer_lead_question lands here, and the prospecting agents use it to answer leads). Read it before asking the user something that may already be answered.

Parameters: —

#### `list_open_lead_questions` (read)

List the questions LEADS asked that the agent could not answer and that are still waiting for the business owner's input. High-value loop: surface these to the user, get the answers, then record each via answer_lead_question (pass the open_question_id) — ask whether the answer is reusable or only for this lead.

Parameters: —

### Suggestions

Ask the platform to draft targeting for you — an ideal customer profile, or the activity codes to include and exclude.

#### `generate_cnae_exclusion_suggestion` (read)

Generate suggested CNAE exclusion codes based on an ideal customer profile and business description. These codes identify competitors and bad-fit industries to exclude from prospecting. Only works for Brazilian customers. Returns codes without saving — use set_targeting to save.

| Parameters | | |
|---|---|---|
| `icp_text` | string, optional | ICP text to analyze. If omitted, uses the customer's current ICP. |

#### `generate_cnae_suggestion` (read)

Generate suggested CNAE inclusion codes based on an ideal customer profile. CNAE codes are used to target specific industries in Brazilian lead prospecting. Only works for Brazilian customers. Returns codes without saving — use set_targeting to save.

| Parameters | | |
|---|---|---|
| `icp_text` | string, optional | ICP text to analyze. If omitted, uses the customer's current ICP. |

#### `generate_icp_suggestion` (read)

Generate an ideal customer profile (ICP) suggestion based on the customer's business information. Uses AI to analyze the business and suggest who the ideal customers are. Returns the suggestion without saving it — use set_business to save.

Parameters: —

### Reference lookups

Search the platform's own knowledge base before answering any question about how it works, and resolve activity codes and cities.

#### `lookup_city` (read)

Look up a Brazilian city code (código IBGE) from a city name. Only works for Brazilian customers. Returns matching cities. Used for city-based prospecting filters.

| Parameters | | |
|---|---|---|
| `city_name` | string, required | City name to search for (e.g. 'São Paulo', 'Curitiba') |

#### `lookup_cnae` (read)

Look up a CNAE code's name and description. CNAE (Classificação Nacional de Atividades Econômicas) is the Brazilian industry classification system. Only works for Brazilian customers. Provide a code to get its name at division (2-digit), group (3-digit), class (5-digit), or subclass (7-digit) level.

| Parameters | | |
|---|---|---|
| `code` | string, required | CNAE code (e.g. '62' for IT division, '6201' for software development group, '6201501' for software development subclass) |

#### `search_knowledge` (read)

Search the Blue Button knowledge base for authoritative answers about how the platform works — pricing, plans, onboarding, targeting capabilities, email sending, takeovers, reports, privacy, cancellation, and every other platform-specific question. Uses semantic RAG (embedding similarity) over curated knowledge pieces, so the query can be a natural-language question, a keyword, or a topic. ALWAYS call this tool whenever the user asks anything specific about Blue Button — never improvise from general knowledge. Returns the top matches with title, content, and similarity score.

| Parameters | | |
|---|---|---|
| `query` | string, required | Natural-language query describing what the user wants to know about Blue Button (e.g. 'how much does it cost', 'can I target by company size', 'what happens when I take over a lead', 'international prospecting'). |
| `top_k` | integer, optional, default `3` | Number of top results to return. Default 3. Use a higher value (up to 10) when the question is broad or you want multiple angles. |
| `min_score` | number, optional, default `0.7` | Minimum similarity score threshold (0.0–1.0). Default 0.7. Lower values return more results but may be less relevant. |

### Blacklist

Never contact these again: block and unblock e-mail addresses, whole domains and phone numbers.

#### `add_blacklisted_domain` (write)

Add a whole DOMAIN to the blacklist. Every email at that domain (e.g. anyone@acme.com) is blocked. Do not pass a full email address — use add_blacklisted_email for that.

| Parameters | | |
|---|---|---|
| `domain` | string, required | The domain to blacklist, e.g. 'acme.com'. Subdomains are not auto-included. |
| `reason` | string, optional | Reason: Competitor, Client, or Other |

#### `add_blacklisted_email` (write)

Add a single email address to the blacklist. Blacklisted emails never receive prospecting messages. To block an entire company, use add_blacklisted_domain instead.

| Parameters | | |
|---|---|---|
| `email` | string, required | The email address to blacklist |
| `reason` | string, optional | Reason: Competitor, Client, or Other |

#### `add_blacklisted_phone` (write)

Add a PHONE NUMBER to the blacklist. The number never receives a WhatsApp message or a voice call. Digits are kept and everything else is stripped, so any formatting is accepted.

| Parameters | | |
|---|---|---|
| `phone` | string, required | The phone number to blacklist, in any format (e.g. '+55 11 99999-9999') |
| `reason` | string, optional | Reason: Competitor, Client, or Other |

#### `list_blacklisted_emails` (read)

List blacklisted entries (individual emails, whole domains and phone numbers) with their reason and times-blocked count. Paginated — 'total' reports the full list size.

| Parameters | | |
|---|---|---|
| `page` | integer, optional, default `0` | Page number (0-based, default 0) |
| `page_size` | integer, optional, default `50` | Entries per page (default 50, max 200) |

#### `remove_blacklisted_domain` (destructive)

Remove a whole DOMAIN from the blacklist, allowing addresses at that domain to receive prospecting messages again.

| Parameters | | |
|---|---|---|
| `domain` | string, required | The domain to remove from the blacklist, e.g. 'acme.com' |

#### `remove_blacklisted_email` (destructive)

Remove a single email address from the blacklist, allowing it to receive prospecting messages again.

| Parameters | | |
|---|---|---|
| `email` | string, required | The email address to remove from the blacklist |

#### `remove_blacklisted_phone` (destructive)

Remove a PHONE NUMBER from the blacklist, allowing it to receive WhatsApp messages and voice calls again.

| Parameters | | |
|---|---|---|
| `phone` | string, required | The phone number to remove from the blacklist, in any format |

### Account settings

Timezone, user name, preferences, call permission, notification e-mails, sending e-mail settings, sender domain setup, and tax data.

#### `get_email_settings` (read)

Get the customer's Blue Button email settings: the full address, handle, display name, and notification instructions.

Parameters: —

#### `get_general_settings` (read)

Get the customer's general account settings: voice mode, autonomous-message sending, account email, and timezone offset.

Parameters: —

#### `get_notification_emails` (read)

Get the email addresses currently set for autonomous prospecting notifications and daily reports.

Parameters: —

#### `lookup_municipality_code` (read)

Look up the 7-digit IBGE municipality code for a Brazilian city. Returns all matches when the city exists in multiple states. Use before update_tax_info.

| Parameters | | |
|---|---|---|
| `city_name` | string, required | Brazilian city name (accent-insensitive) |
| `state` | string, optional | Optional state — 2-letter UF (RS, SP...) or full Portuguese name — to disambiguate |

#### `set_agent_phone_call_permission` (write)

Get or set whether the agent may place outbound phone calls to the customer. Omit 'enabled' to read the current value; pass true/false to change it.

| Parameters | | |
|---|---|---|
| `enabled` | boolean, optional | True to allow calls, false to block. Omit to just read the current value. |

#### `set_email_notification_instructions` (write)

Set the free-text rules that decide which inbound emails deserve an immediate notification to the customer. Pass an empty string to clear them and fall back to the default behaviour.

| Parameters | | |
|---|---|---|
| `instructions` | string, required | Rules describing which inbound emails warrant an immediate heads-up (empty to clear) |

#### `set_personal_email` (write)

Set the account's own personal email address — the single address tied to the account itself, distinct from the comma-separated prospecting notification list managed by update_notification_emails.

| Parameters | | |
|---|---|---|
| `email` | string, required | The account owner's personal email address |

#### `set_timezone` (write)

Set the customer's timezone by telling the agent the current local hour (0-23, 24h format). The offset is computed from UTC.

| Parameters | | |
|---|---|---|
| `current_hour` | integer, required | Hour part of the customer's current local time, 0-23 (24h format) |

#### `setup_custom_domain` (write)

Set up, verify, or remove a custom-domain email address (e.g. sales@yourcompany.com). Requires an active paid plan. action: 'activate' (needs email_address), 'verify', or 'remove'.

| Parameters | | |
|---|---|---|
| `action` | string, required | 'activate' to set a new custom email, 'verify' to check DNS, 'remove' to remove it |
| `email_address` | string, optional | The full custom email address, e.g. 'sales@yourcompany.com'. Required for 'activate'. |

#### `setup_email_subdomain` (write)

Set up or verify a custom email subdomain (e.g. yourcompany.eesiermail.com). Requires an active paid plan. action: 'activate' (needs subdomain) or 'verify'.

| Parameters | | |
|---|---|---|
| `action` | string, required | 'activate' to set a new subdomain, 'verify' to check DNS verification status |
| `subdomain` | string, optional | The subdomain name, e.g. 'mycompany'. Required for 'activate'. |

#### `update_email_settings` (write)

Update the Blue Button email handle (the part before @, max 20 chars, unique) and/or the display name shown in outgoing emails. Pass at least one field.

| Parameters | | |
|---|---|---|
| `handle` | string, optional | New email handle (lowercase, no spaces, max 20 chars). Accents/invalid chars are stripped. |
| `display_name` | string, optional | New display name for outgoing emails (the 'From' name recipients see) |

#### `update_notification_emails` (write)

Set the email address(es) for autonomous prospecting notifications and daily reports (comma-separated). The first address also becomes the account email.

| Parameters | | |
|---|---|---|
| `emails` | string, required | Email address(es) for notifications, comma-separated |

#### `update_preferences` (write)

Update customer preferences: language, whether to show the business on the Blue Button website, and push notifications. Pass at least one field.

| Parameters | | |
|---|---|---|
| `language_key` | string, optional | Language key, e.g. pt-BR, en-US, es-AR |
| `show_on_website` | boolean, optional | Whether to show the business on the Blue Button website |
| `push_notifications` | boolean, optional | Whether push (console) notifications are enabled |

#### `update_tax_info` (write)

Update tax/invoice information. Pass whichever fields need updating. Tax document must be CPF (11 digits) or CNPJ (14 digits); CEP must be 8 digits; municipality code must be a valid 7-digit IBGE code (use lookup_municipality_code first). financial_email is the address that also receives the Nota Fiscal (NFS-e) PDFs, in addition to the account email (pass an empty string to clear it).

| Parameters | | |
|---|---|---|
| `tax_name` | string, optional | Tax-registered name (company or person) |
| `tax_document` | string, optional | Tax document, digits only: CPF (11) or CNPJ (14) |
| `street` | string, optional | Street name |
| `number` | string, optional | Address number |
| `neighborhood` | string, optional | Neighborhood |
| `cep` | string, optional | Postal code (CEP, 8 digits) |
| `municipality_code` | integer, optional | IBGE municipality code (7 digits) |
| `financial_email` | string, optional | Financial email that also receives the Nota Fiscal (NFS-e) PDFs (empty string clears it) |

#### `update_user_name` (write)

Update the customer's display name.

| Parameters | | |
|---|---|---|
| `name` | string, required | The new name for the customer |

### Team members

Who else is on the account — add, list and remove members.

#### `add_member` (write)

Add another person (an additional phone number) to this account. Queues a WhatsApp opener and branded access email when an email is provided. They get their own conversation with the agent but full shared access to the same company, settings, and prospecting. Returns actual onboarding status; queued does not mean delivered. Fails if the phone number already belongs to any account.

| Parameters | | |
|---|---|---|
| `name` | string, required | The person's name |
| `phone_number` | string, required | The person's phone number in international format, e.g. +5511999999999 |
| `email` | string, optional | Optional email — when set, they receive copies of email notifications (interested/confirmed-lead emails) |

#### `list_members` (read)

List everyone on this account: the account owner plus any additional people that were added.

Parameters: —

#### `remove_member` (destructive)

Remove an additional person from this account, identified by name or phone number. The account owner cannot be removed.

| Parameters | | |
|---|---|---|
| `name_or_phone` | string, required | The name or phone number of the person to remove |

#### `resend_member_welcome` (write)

Explicitly resend a member welcome by Email, WhatsApp or Both. Reuses pending work; queued does not mean sent or delivered.

| Parameters | | |
|---|---|---|
| `member_id` | integer, required |  |
| `channel` | string, optional, default `Both` |  |

#### `update_member` (write)

Update an existing member name or email in place. Changed email queues branded access; omission preserves a field and empty email clears it.

| Parameters | | |
|---|---|---|
| `member_id` | integer, required |  |
| `name` | string, optional |  |
| `email` | string, optional |  |

### Access tokens

Manage the tokens that authenticate this connection: list them, issue a new one, revoke one.

#### `generate_mcp_token` (write)

Create a new MCP access token for this account. The token value is returned ONCE and never again — pass it to the caller immediately and tell them to store it securely.

| Parameters | | |
|---|---|---|
| `label` | string, optional | A short label naming what will use this token, e.g. 'n8n workflow' |

#### `list_mcp_tokens` (read)

List the account's MCP access tokens. The token values themselves are never returned — only the id, label, creation date, last-used date and whether the token has been revoked.

Parameters: —

#### `revoke_mcp_token` (destructive)

Revoke an MCP access token so it can no longer connect. Use list_mcp_tokens to find the token_id. Revoking the token the caller is currently authenticated with immediately ends their own access.

| Parameters | | |
|---|---|---|
| `token_id` | integer, required | The id of the token to revoke, from list_mcp_tokens |

### Events & webhooks

The account event feed with a cursor, plus outbound webhook subscriptions — create, list, test and delete them.

#### `create_webhook_subscription` (write)

Register an HTTPS webhook endpoint that receives account events as they happen (signed POSTs) — for automation systems the customer runs (Agent SDK apps, n8n, Zapier, custom backends). The signing secret is returned ONCE in this response — store it securely. Note: this does NOT push into this MCP session; agents that can only poll should use list_account_events instead.

| Parameters | | |
|---|---|---|
| `url` | string, required | The HTTPS endpoint to POST events to |
| `event_types` | string, optional | Comma-separated event types to deliver (optional; default = all). Same values as list_account_events. |
| `description` | string, optional | A short label for this subscription (e.g. 'my n8n flow') |

#### `delete_webhook_subscription` (destructive)

Delete a webhook subscription — deliveries to its endpoint stop immediately. Irreversible (create a new subscription to resume; it will get a new secret).

| Parameters | | |
|---|---|---|
| `subscription_id` | integer, required | Subscription ID (from list_webhook_subscriptions) |

#### `list_account_events` (read)

Poll the account's event feed — new lead replies (email/WhatsApp), any email arriving in the customer's mailbox (lead or not), leads flagged for review, leads becoming interested/confirmed, meetings booked/cancelled, voice calls finished, imports finished, support answered. Cursor-paged: pass the next_cursor from the previous call to get only what happened since. This is about ACCOUNT ACTIVITY — not calendar events (list_calendar_events / list_calendly_upcoming_events) and not one lead's history (list_lead_lifecycle_events).

| Parameters | | |
|---|---|---|
| `since_cursor` | integer, optional, default `0` | Return only events with id greater than this (0 = from the beginning of the feed). Use the next_cursor from the previous call. |
| `event_types` | string, optional | Comma-separated event types to include (optional; default = all). Valid: lead_replied_email, lead_replied_whatsapp, lead_sent_for_human_review, lead_became_interested, lead_confirmed, meeting_booked, meeting_cancelled, voice_call_finished, import_finished, support_request_answered, email_received |
| `limit` | integer, optional, default `50` | Max events to return (default 50, max 200) |

#### `list_webhook_subscriptions` (read)

List the account's webhook subscriptions with delivery health (last success/failure, consecutive failures, disabled state). Secrets are never shown again.

Parameters: —

#### `test_webhook_subscription` (write)

Send a signed test 'ping' event to a webhook subscription's endpoint so the customer can verify their receiver and signature check. The delivery result appears in list_webhook_subscriptions (date_last_success / last_failure_reason) within ~1 minute.

| Parameters | | |
|---|---|---|
| `subscription_id` | integer, required | Subscription ID (from list_webhook_subscriptions) |

### CRM integrations

Connect and disconnect a CRM, check sync status, force a resync, map custom fields, and manage the Apollo and RD Station links.

#### `connect_crm` (write)

Connect a CRM integration. Each CRM needs different credentials: Pipedrive (api_key), RdStation (marketing_api_key and/or crm_token), HubSpot (access_token), Odoo (url + database + username + api_key), Omie (app_key + app_secret), Agendor/ExactSales/Piperun/Venttra (api_token), SystemeIo (api_key), Twenty (api_key + optional url when self-hosted). Requires an active paid plan. The credential is LIVE-VERIFIED against the provider before being stored (a bad key returns an error and stores nothing); the response's 'verified' field says whether verification was possible — ExactSales, Piperun, Venttra, and the RdStation marketing key are write-only APIs and are stored unverified.

| Parameters | | |
|---|---|---|
| `crm_name` | string, required | CRM name: Pipedrive, RdStation, HubSpot, Odoo, Omie, Agendor, ExactSales, Piperun, SystemeIo, Venttra, Twenty |
| `api_key` | string, optional | API key (Pipedrive, Odoo, SystemeIo, Twenty) |
| `api_token` | string, optional | API token (Agendor, ExactSales, Piperun, Venttra) |
| `access_token` | string, optional | Access token (HubSpot) |
| `url` | string, optional | URL (Odoo; optional for Twenty when self-hosted) |
| `database` | string, optional | Database name (Odoo) |
| `username` | string, optional | Username (Odoo) |
| `app_key` | string, optional | App key (Omie) |
| `app_secret` | string, optional | App secret (Omie) |
| `marketing_api_key` | string, optional | Marketing API key (RdStation) |
| `crm_token` | string, optional | CRM token (RdStation) |
| `pipeline_id` | integer, optional | Pipeline id deals are created in (Pipedrive) |
| `funnel_id` | integer, optional | Funnel id deals are created in (Agendor) |

#### `disconnect_crm` (destructive)

Disconnect a CRM integration by clearing its credentials.

| Parameters | | |
|---|---|---|
| `crm_name` | string, required | CRM name: Pipedrive, RdStation, HubSpot, Odoo, Omie, Agendor, ExactSales, Piperun, SystemeIo, Venttra, Twenty |

#### `get_crm_sync_status` (read)

Show how many leads have been synced to each connected CRM: synced, pending, and stuck counts, the last sync time, and a few recently-synced lead names.

Parameters: —

#### `list_crm_integrations` (read)

List all CRM integrations with their connection status, the minimum lead status filter for CRM sync, and the configured custom fields.

Parameters: —

#### `manage_apollo_integration` (write)

Connect or disconnect the Apollo lead-source integration. Requires an active paid plan. action: 'connect' (needs api_key) or 'disconnect'. The api_key is live-verified against Apollo before being stored — a bad key returns an error and stores nothing.

| Parameters | | |
|---|---|---|
| `action` | string, required | Action: connect or disconnect |
| `api_key` | string, optional | Apollo API key (required for connect) |
| `list_id` | string, optional | Apollo list id to sync leads from (optional) |

#### `manage_crm_custom_fields` (write)

Manage custom fields sent with every lead to CRM integrations. action: 'list', 'add' (needs field_name + field_value), or 'remove' (needs field_id).

| Parameters | | |
|---|---|---|
| `action` | string, required | Action: list, add, or remove |
| `field_name` | string, optional | Field name (required for 'add') |
| `field_value` | string, optional | Field value (required for 'add') |
| `field_id` | integer, optional | Field id (required for 'remove') |

#### `manage_rd_station_crm_lead_source` (write)

Enable or disable importing RD Station CRM contacts as prospecting leads. Requires an active paid plan and the RD Station CRM token to already be connected (use connect_crm). action: 'enable' (optionally scoped by pipeline_id and deal_stage_id so only contacts attached to deals there are imported) or 'disable'. Enabling live-verifies the stored token against RD Station CRM first. Does not affect the outbound lead-to-CRM sync.

| Parameters | | |
|---|---|---|
| `action` | string, required | Action: enable or disable |
| `pipeline_id` | string, optional | RD Station CRM deal pipeline id to limit the import to (optional; omit to import all contacts) |
| `deal_stage_id` | string, optional | RD Station CRM deal stage id inside the pipeline to limit the import to (optional; requires pipeline_id) |

#### `resync_crm_leads` (write)

Manually re-queue eligible leads that have not yet been sent to the CRM so the background sync retries them. Already-synced leads are never re-sent (no duplicates). The send happens in the background within a few minutes.

Parameters: —

#### `update_crm_minimum_status` (write)

Set the minimum lead status required before a lead is synced to the CRM (Pending, Cold, Confirmed, Aware, NotInterested, Interested). Omit 'status' to clear the filter and sync all leads.

| Parameters | | |
|---|---|---|
| `status` | string, optional | Minimum lead status for CRM sync. Omit to sync all leads. |

### Calendly

Connect Calendly, pick the event type leads get booked into, and read upcoming bookings.

#### `disconnect_calendly` (destructive)

Disconnects the customer's Calendly account: deletes the webhook subscription on Calendly's side, revokes the access token, and clears all stored Calendly fields. Pass user_has_confirmed=true only when the user has explicitly confirmed they want to disconnect.

| Parameters | | |
|---|---|---|
| `user_has_confirmed` | boolean, required | Must be true — the agent must have explicit user confirmation before disconnecting. |

#### `get_calendly_connection_url` (read)

Returns the URL the user must click to connect their Calendly account to Eesier. Share this URL with the user — they open it, sign into Calendly, click Authorize, and the connection is established server-side. After the user completes the flow, call get_calendly_status again to confirm. Idempotent: returns the same URL whether or not Calendly is already connected (so the user can reconnect a different account).

Parameters: —

#### `get_calendly_event` (read)

Returns full details for a specific scheduled Calendly event, including the list of invitees with their names, emails, status, and any answers they gave to scheduling questions. Use this for follow-up questions about a specific meeting after list_calendly_upcoming_events.

| Parameters | | |
|---|---|---|
| `event_uri` | string, required | Full Calendly scheduled event URI (e.g. 'https://api.calendly.com/scheduled_events/'). Get it from list_calendly_upcoming_events. |

#### `get_calendly_status` (read)

Returns the current Calendly connection status for the customer: whether OAuth is connected, the connected Calendly account email, and which event type (if any) is selected as the default for prospecting links.

Parameters: —

#### `list_calendly_event_types` (read)

Lists all active event types in the customer's Calendly account (e.g. '15-min intro call', '30-min consultation'). Each entry includes uri (use this when calling set_calendly_default_event_type), name, slug, duration_minutes, scheduling_url, and is_default. Required: Calendly must be connected first.

Parameters: —

#### `list_calendly_upcoming_events` (read)

Lists scheduled Calendly events on the customer's calendar within a date range. Use this for 'what's on my agenda' / 'do I have any meetings tomorrow' style requests. Returned `start_utc`/`end_utc` come back in UTC — pull `timezone_offset_utc_hours` from `whoami` and convert before showing them to the user. Calendly imposes a 100-day max range.

| Parameters | | |
|---|---|---|
| `start_date` | string, optional | Start of the window in YYYY-MM-DD format (UTC, inclusive). Defaults to today's UTC date if omitted. |
| `end_date` | string, optional | End of the window in YYYY-MM-DD format (UTC, INCLUSIVE — events at any time on this day are returned). Defaults to 7 days after start_date. |
| `status` | string, optional, default `active` | Status filter: 'active' (default — confirmed bookings) or 'canceled'. |

#### `set_calendly_default_event_type` (write)

Sets the default Calendly event type. The default is the event type Blue Button uses when generating scheduling links inside lead conversations. Pass either event_type_uri (preferred — get it from list_calendly_event_types) or event_type_name (fuzzy-matched against active event types). Pass empty event_type_uri to clear the default.

| Parameters | | |
|---|---|---|
| `event_type_uri` | string, optional | Full Calendly event type URI (preferred). Pass empty string to clear the current default. |
| `event_type_name` | string, optional | Or the event type's display name — fuzzy-matched against the customer's active event types. Used only when event_type_uri is not provided. |

### Google Calendar

Connect Google Calendar and work the calendar itself: list, create, update, delete and respond to events.

#### `create_calendar_event` (write)

Create a Google Calendar event. Times are UTC — convert the customer's local time using timezone_offset_utc_hours from whoami BEFORE calling. Returns the event id and a Meet link when one was generated.

| Parameters | | |
|---|---|---|
| `summary` | string, required | Event title |
| `start_utc` | string, required | Event start in UTC, ISO format (e.g. 2026-07-10T14:00:00Z) |
| `end_utc` | string, required | Event end in UTC, ISO format |
| `attendees` | string, optional | Comma-separated attendee emails |
| `calendar_id` | string, optional, default `primary` | Calendar ID (default 'primary') |

#### `delete_calendar_event` (destructive)

Delete a Google Calendar event. This cancels the event for all attendees and cannot be undone.

| Parameters | | |
|---|---|---|
| `event_id` | string, required | ID of the calendar event |
| `calendar_id` | string, optional, default `primary` | Calendar ID (default 'primary') |

#### `get_google_connection_url` (read)

Get the OAuth URL for the customer to connect their Google account (required for the Google Calendar tools). Share the URL with the user; the connection completes server-side after they authorize. Idempotent — also works for reconnecting.

Parameters: —

#### `list_calendar_events` (read)

List the customer's Google Calendar events for one calendar day (UTC). Returns start/end in UTC ISO format.

| Parameters | | |
|---|---|---|
| `date` | string, required | The day to list, yyyy-MM-dd (interpreted in UTC) |
| `calendar_id` | string, optional, default `primary` | Calendar ID (default 'primary') |

#### `respond_calendar_event` (write)

Accept or decline a Google Calendar event invitation on the customer's behalf.

| Parameters | | |
|---|---|---|
| `event_id` | string, required | ID of the calendar event |
| `accept` | boolean, required | true to accept the invitation, false to decline |
| `calendar_id` | string, optional, default `primary` | Calendar ID (default 'primary') |

#### `update_calendar_event` (write)

Update a Google Calendar event (title, times, attendees). Pass only the fields to change. Times are UTC.

| Parameters | | |
|---|---|---|
| `event_id` | string, required | ID of the calendar event |
| `summary` | string, optional | New event title |
| `start_utc` | string, optional | New start in UTC, ISO format |
| `end_utc` | string, optional | New end in UTC, ISO format |
| `attendees` | string, optional | New comma-separated attendee emails (replaces the current list) |
| `calendar_id` | string, optional, default `primary` | Calendar ID (default 'primary') |

### Google Ads

The paid side: campaigns, budgets, billing, performance reports, diagnostics, ad groups, keywords, negatives, search ads and audiences.

#### `add_google_ads_keywords` (write)

Add keywords to an ad group in a Google Ads campaign. One keyword per line in the keywords parameter (keywords may contain commas). match_type: Broad, Phrase, or Exact (default Broad).

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |
| `ad_group_id` | integer, required | The ad group id (from list_google_ads_ad_groups) |
| `keywords` | string, required | The keywords to add, ONE PER LINE |
| `match_type` | string, optional | Match type: Broad (default), Phrase, or Exact |

#### `add_google_ads_negative_keywords` (write)

Add CAMPAIGN-LEVEL negative keywords to a Google Ads campaign (searches these terms will never trigger ads). One keyword per line. match_type: Broad (default), Phrase, or Exact.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |
| `keywords` | string, required | The negative keywords to add, ONE PER LINE |
| `match_type` | string, optional | Match type: Broad (default), Phrase, or Exact |

#### `create_google_ads_campaign_draft` (write)

Create a NEW Google Ads campaign as a DRAFT. It does NOT serve until the customer recharges its balance via the returned console recharge_url — share that link and never claim the campaign is live. channel_type: Search (default) or PerformanceMax (only recommend PMax after a Search campaign has real conversion data).

| Parameters | | |
|---|---|---|
| `name` | string, required | The campaign name as it will appear in Google Ads |
| `daily_budget_brl` | number, required | Daily budget in BRL (positive, e.g. 20) |
| `channel_type` | string, optional | Channel type: Search (default) or PerformanceMax |

#### `create_google_ads_search_ad` (write)

Create a Responsive Search Ad in an ad group of a Google Ads campaign. Headlines max 30 chars each, descriptions max 90 chars each — ONE PER LINE. Provide at least 3 headlines and 2 descriptions.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |
| `ad_group_id` | integer, required | The ad group id (from list_google_ads_ad_groups) |
| `final_url` | string, required | The landing page URL the ad clicks through to |
| `headlines` | string, required | The ad headlines, ONE PER LINE, max 30 characters each |
| `descriptions` | string, required | The ad descriptions, ONE PER LINE, max 90 characters each |

#### `diagnose_google_ads_campaign` (read)

Diagnose why a Google Ads campaign is (or isn't) serving: live serving status, primary status with reasons, and per-ad approval/review status.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |

#### `get_google_ads_audience_status` (read)

Get a Google Ads campaign's Customer Match audience status: how many emails were on the last upload, when, and whether the list is attached.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |

#### `get_google_ads_billing` (read)

Read Google Ads billing/funding data for a campaign's account. section: AccountInfo, AccountBudgets, BillingSetups, Proposals, Invoices (needs year+month), or CampaignBudgets.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |
| `section` | string, required | Section: AccountInfo, AccountBudgets, BillingSetups, Proposals, Invoices, CampaignBudgets |
| `year` | integer, optional | Invoice issue year (Invoices only) |
| `month` | integer, optional | Invoice issue month 1-12 (Invoices only) |

#### `get_google_ads_campaign` (read)

Get one Google Ads campaign's full detail: lifecycle status, hold reason, funding balance, the stored performance snapshot (spend, impressions, clicks, conversions, CTR, CPC), and the console management/recharge link. Pass the campaign name or id.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id (from list_google_ads_campaigns) |

#### `get_google_ads_keyword_ideas` (read)

Get keyword ideas with search volume from Google's Keyword Planner for a campaign. Provide seed keywords (one per line) and/or a page URL to extract ideas from.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |
| `seed_keywords` | string, optional | Seed keywords, ONE PER LINE |
| `page_url` | string, optional | A page URL to extract keyword ideas from |
| `max_results` | integer, optional, default `50` | Max results (default 50) |

#### `get_google_ads_performance_report` (read)

Pull a LIVE Google Ads performance report for a campaign. report_type: Campaign (totals), AdGroup, Keyword (with quality score), Ad, SearchTerms (what users actually searched), Daily, Device, Conversion, ImpressionShare (share of impressions + % lost to budget vs rank), AdAssets (per-headline/description LOW/GOOD/BEST labels), Hourly, Geographic, Demographics. Costs in BRL.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |
| `report_type` | string, required | Report type: Campaign, AdGroup, Keyword, Ad, SearchTerms, Daily, Device, Conversion, ImpressionShare, AdAssets, Hourly, Geographic, Demographics |
| `date_range` | string, optional | Date range: a preset (LAST_7_DAYS, LAST_30_DAYS, LAST_90_DAYS, THIS_MONTH, LAST_MONTH) or a custom 'yyyy-MM-dd AND yyyy-MM-dd' window. Default LAST_30_DAYS. |

#### `list_google_ads_ad_groups` (read)

List a Google Ads campaign's ad groups (id, name, status, CPC bid). Ad-group ids are needed for the keyword and ad tools.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |

#### `list_google_ads_campaigns` (read)

List the customer's Google Ads campaigns with status, channel type, daily budget, hold reason, and balance (recharged, spent, remaining) — all in BRL. The entry point: call this first, then pass a returned name or id to the other google_ads tools.

Parameters: —

#### `list_google_ads_keywords` (read)

List the keywords of one ad group in a Google Ads campaign (text, match type, status, CPC bid, quality score).

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |
| `ad_group_id` | integer, required | The ad group id (from list_google_ads_ad_groups) |

#### `nudge_google_ads_provisioning` (write)

Re-run the go-live provisioning gate for a Google Ads campaign that seems stuck after being funded (nudges the provisioning state machine forward).

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |

#### `refresh_google_ads_audience` (write)

Re-upload the Google Ads campaign's Customer Match audience from the customer's current lead emails (keeps the remarketing list fresh). Returns the number of emails uploaded.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |

#### `set_google_ads_campaign_status` (destructive)

Pause, resume, or END a Google Ads campaign. Resume is gated on remaining balance + at least one enabled ad (and keyword for Search). END IS IRREVERSIBLE — it removes the campaign in Google Ads; get the customer's explicit confirmation before ending.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |
| `action` | string, required | Action: Pause, Resume, or End (End is irreversible) |

#### `sync_google_ads_spend` (write)

Refresh a Google Ads campaign's spend from the live Google API (updates the stored snapshot and funding math). Call this before quoting spend or balance numbers to the customer.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |

#### `update_google_ads_campaign_budget` (write)

Update a Google Ads campaign's daily budget (BRL). Returns the effective value after platform clamping.

| Parameters | | |
|---|---|---|
| `campaign` | string, required | The campaign name or id |
| `new_daily_budget_brl` | number, required | The new daily budget in BRL |

### Websites

Register a site and change it by conversation: settings, subdomain, source code, snapshots and restores, screenshots, and crawling.

#### `archive_website` (destructive)

Archive (remove) a website.

| Parameters | | |
|---|---|---|
| `website_id` | integer, required | Id of the website to archive |

#### `cancel_website_change` (destructive)

Cancel the ongoing (unfinished) change request for a website.

| Parameters | | |
|---|---|---|
| `website_id` | integer, required | Id of the website |

#### `change_website` (write)

Request a change to a website. The change is queued and rendered in the background — this returns immediately with a code id; poll get_website for completion.

| Parameters | | |
|---|---|---|
| `website_id` | integer, required | Id of the website to change |
| `prompt` | string, required | Prompt describing the desired change |
| `data_storage_required` | boolean, optional, default `false` | True if the change requires data storage (a database) |
| `ignore_existing_code` | boolean, optional, default `false` | True to ignore the existing code and rebuild from scratch (full overhaul) |
| `reasoning_mode` | string, optional | Coding agent reasoning: Fast (simple changes, default) or Thinking (complex changes) |
| `generation_type` | string, optional | Generation type: Fast (default) or Quality |

#### `change_website_subdomain` (write)

Change a website's subdomain (the part before .eesier.website).

| Parameters | | |
|---|---|---|
| `website_id` | integer, required | Id of the website |
| `new_subdomain` | string, required | New subdomain part without the .eesier.website suffix (letters, numbers, hyphens only) |

#### `create_website_snapshot` (write)

Create a snapshot of a website's current code, tagged with a description, so it can be restored later.

| Parameters | | |
|---|---|---|
| `website_id` | integer, required | Id of the website |
| `snapshot_description` | string, required | Description for the snapshot |

#### `export_website_code` (write)

Export a website's current code to an HTML file and email it to the given address.

| Parameters | | |
|---|---|---|
| `website_id` | integer, required | Id of the website |
| `email_address` | string, required | Destination email address |

#### `get_website` (read)

Get full information about one website: title, URL, type, language, generation status, and code-editor link.

| Parameters | | |
|---|---|---|
| `website_id` | integer, required | Id of the website |

#### `get_website_code` (read)

Get the HTML code of a specific website code entry.

| Parameters | | |
|---|---|---|
| `website_code_id` | integer, required | Id of the website code entry |

#### `get_website_settings` (read)

Get a website's configurable settings (title, language, restriction, agent guidelines).

| Parameters | | |
|---|---|---|
| `website_id` | integer, required | Id of the website |

#### `list_website_code` (read)

List the successful code generations for a website (without the HTML itself), newest first.

| Parameters | | |
|---|---|---|
| `website_id` | integer, required | Id of the website |

#### `list_website_snapshots` (read)

List a website's snapshots (saved code versions), newest first.

| Parameters | | |
|---|---|---|
| `website_id` | integer, required | Id of the website |

#### `list_websites` (read)

List all of the customer's websites with their generation status, URL, and code-editor link.

Parameters: —

#### `register_website` (write)

Register a new AI-generated website. Generation runs in the background — this returns immediately with an id; poll get_website / list_websites for the finished URL and status.

| Parameters | | |
|---|---|---|
| `description` | string, required | Concise but complete description of the website: purpose, main features, target audience, style, and what it sells/promotes |
| `language` | string, required | Language code in xx-xx form, e.g. pt-br, en-us |
| `application_type` | string, optional | Application type: Website (default) or LeadCapturePage. For an interactive site with logins/dashboards, keep Website and set data_storage_required=true. |
| `generation_type` | string, optional | Generation type: Fast (default, simpler sites) or Quality (slower, better for complex sites) |
| `data_storage_required` | boolean, optional, default `false` | True if the site needs persistent data storage (accounts, orders, dashboards); false for static sites. Default false. |
| `restricted` | boolean, optional, default `false` | True to restrict the site behind a login page; false for public. Default false. |
| `copy_from_website_id` | integer, optional | Optional id of another of this customer's websites to copy code from |
| `business_or_brand_name` | string, optional | Optional name of the existing business/brand the site is for (triggers online research for content and branding) |

#### `restore_website_snapshot` (destructive)

Restore a snapshot (or any past code entry) as the website's current code.

| Parameters | | |
|---|---|---|
| `website_code_id` | integer, required | Id of the website code entry to restore |

#### `set_website_settings` (write)

Update a website's settings. Pass only the fields you want to change.

| Parameters | | |
|---|---|---|
| `website_id` | integer, required | Id of the website |
| `title` | string, optional | Website title (max 60 characters) |
| `language_key` | string, optional | Language key, e.g. pt-BR, en-US |
| `restricted` | boolean, optional | Whether the website is restricted behind a login |
| `guidelines` | string, optional | Persistent guidelines for how the agent should work on this website |

### Lead capture pages

The inbound side: create capture pages, change them, list them and archive them.

#### `archive_lead_capture_page` (destructive)

Archive (remove) a lead-capture page.

| Parameters | | |
|---|---|---|
| `lead_capture_page_id` | integer, required | Id of the lead-capture page |

#### `change_lead_capture_page` (write)

Request a change to a lead-capture page. The change is queued and rendered in the background — this returns immediately with a code id.

| Parameters | | |
|---|---|---|
| `lead_capture_page_id` | integer, required | Id of the lead-capture page |
| `prompt` | string, required | Prompt describing the desired change |

#### `create_lead_capture_page` (write)

Create a lead-capture page. Generation runs in the background — this returns immediately with an id; poll list_lead_capture_pages for the finished URL.

| Parameters | | |
|---|---|---|
| `description` | string, required | Concise but complete description: what info to capture, target audience, the offer/value proposition, and any design preferences |
| `language` | string, required | Language code in xx-xx form, e.g. pt-br, en-us |

#### `list_lead_capture_pages` (read)

List all of the customer's lead-capture pages with their generation status and URL.

Parameters: —

### Console page

The account's own dashboard page inside the platform: read its HTML, publish a new version you wrote yourself, roll back instantly, and pull the always-current data API and design docs.

#### `get_console_page` (read)

Get the customer's custom console dashboard page (/MyConsole): whether it exists, its live URL, whether a build is currently running, and the version history. Every version is kept and restorable.

Parameters: —

#### `get_console_page_docs` (read)

REQUIRED READING before writing console page HTML: the page contract (sandbox, security, self-containment), the full Console Data API reference the page may fetch, and the Eesier design system. Always rendered live from the platform's own source of truth — call it again any time, it is never stale.

Parameters: —

#### `get_console_page_html` (read)

Get the full HTML of the customer's console dashboard page — the current version by default, or a specific version by id. Use it to inspect or modify the page before calling set_console_page_html.

| Parameters | | |
|---|---|---|
| `version_id` | integer, optional | Optional version id from get_console_page; omit for the current live version |

#### `restore_console_page_version` (write)

Restore a previous version of the customer's console dashboard page — instant repoint, no rebuild. Get version ids from get_console_page.

| Parameters | | |
|---|---|---|
| `version_id` | integer, required | Version id to restore, from get_console_page |

#### `set_console_page_html` (write)

Publish new HTML for the customer's console dashboard page. YOU are the coding agent: write the complete self-contained HTML yourself following get_console_page_docs (call it first). Stored as a new version and made live instantly; previous versions remain restorable.

| Parameters | | |
|---|---|---|
| `html` | string, required | The COMPLETE self-contained HTML document (doctype through , inline CSS/JS only, fetches only relative /ConsoleDataApi/ paths) |
| `change_summary` | string, required | One short sentence describing what this version is or changes — shown in the version history |

### Media

Generate images, drawings and videos, edit a video, and read back everything already generated.

#### `create_video` (write)

Generate a short AI video from a text prompt and an optional first-frame reference image. Renders in the background — this returns immediately with an id; poll list_videos for the finished video_url.

| Parameters | | |
|---|---|---|
| `prompt` | string, required | The video prompt |
| `model` | string, optional | Engine: SeedancePro, SeedanceProFast (default), Grok |
| `reference_image_url` | string, optional | Optional first-frame image URL (absolute https). The video animates from this image. |
| `duration` | integer, optional | Duration in seconds (clamped per engine) |
| `aspect_ratio` | string, optional | Aspect ratio, e.g. 16:9, 9:16, 1:1, 4:3 |
| `resolution` | string, optional | Resolution: 480p, 720p, or 1080p |

#### `edit_video` (write)

Generate a new video that iterates on a previously generated one. When no reference_image_url is given, the first-frame strategy decides how the starting frame is produced.

| Parameters | | |
|---|---|---|
| `video_id` | integer, required | Id of the previously generated video to iterate on |
| `prompt` | string, required | The new video prompt |
| `model` | string, optional | Engine: SeedancePro, SeedanceProFast (default), Grok |
| `reference_image_url` | string, optional | Optional new first-frame image URL (absolute https). Overrides the strategy. |
| `first_frame_strategy` | string, optional | How to handle the first frame: KeepPreviousFirstFrame (default), EditPreviousFirstFrame, GenerateBrandNewFirstFrame |
| `duration` | integer, optional | Duration in seconds (clamped per engine) |
| `aspect_ratio` | string, optional | Aspect ratio, e.g. 16:9, 9:16, 1:1, 4:3 |
| `resolution` | string, optional | Resolution: 480p, 720p, or 1080p |

#### `generate_drawing` (write)

Generate a drawing (shapes, wireframes, page layouts, diagrams, tables, charts, grids, vector shapes, maps). Runs in the background — this returns immediately with an id; poll list_drawings for the finished image_url.

| Parameters | | |
|---|---|---|
| `prompt` | string, required | Description of the drawing to generate |
| `caption` | string, optional | Optional caption to accompany the delivered image |
| `reference_image_url` | string, optional | Optional absolute https URL of a reference image to send with the prompt |
| `drawing_id` | integer, optional | Optional id of an existing drawing to edit/iterate on |

#### `generate_image` (write)

Generate an image from a text prompt (or edit existing images by passing reference URLs). Generation runs in the background — this returns immediately with an id; poll list_images for the finished image_url.

| Parameters | | |
|---|---|---|
| `prompt` | string, required | Prompt describing the image to generate |
| `aspect_ratio` | string, optional | Image format: Square (1:1), Landscape (wider), or Portrait (taller). Default Square. |
| `transparent` | boolean, optional, default `false` | Transparent background (default false) |
| `reference_image_urls` | string, optional | Comma-separated absolute https URLs of reference images to send with the prompt |
| `profile` | string, optional | Optimization profile: None, SocialMediaInstagramPostFeed, SocialMediaInstagramPostStories. Default None. |
| `model` | string, optional | Generation model: OpenAI (default), BytePlus. Don't change unless the user asks. |

#### `get_drawing` (read)

Get one generated drawing by id — the poll target for generate_drawing. Shows the generation status and, once finished, the image_url.

| Parameters | | |
|---|---|---|
| `drawing_id` | integer, required | The drawing_id returned by generate_drawing |

#### `get_image` (read)

Get one generated image by id — the poll target for generate_image. Shows the generation status and, once finished, the image_url.

| Parameters | | |
|---|---|---|
| `image_id` | integer, required | The image_generation_id returned by generate_image |

#### `get_video` (read)

Get one generated video by id — the poll target for create_video/edit_video (list_videos only shows FINISHED videos, so poll this for in-progress ones). is_finished=true with a video_url means done; is_finished=true without a URL means the render failed.

| Parameters | | |
|---|---|---|
| `video_id` | integer, required | The video_id returned by create_video or edit_video |

#### `list_drawings` (read)

List generated drawings (newest first, paginated). Includes each drawing's generation status and, once finished, its image_url.

| Parameters | | |
|---|---|---|
| `page` | integer, optional, default `1` | Page number (1 = first page) |
| `page_size` | integer, optional, default `10` | Page size (default 10, max 50) |

#### `list_images` (read)

List generated images (newest first, paginated). Includes each image's generation status and, once finished, its image_url.

| Parameters | | |
|---|---|---|
| `page` | integer, optional, default `1` | Page number (1 = first page) |
| `page_size` | integer, optional, default `10` | Page size (default 10, max 50) |

#### `list_videos` (read)

List previously generated videos (newest first, paginated). Only successfully finished videos with a URL are returned.

| Parameters | | |
|---|---|---|
| `page` | integer, optional, default `1` | Page number (1 = first page) |
| `page_size` | integer, optional, default `10` | Page size (default 10, max 50) |

### Online research

Queue a research task on the open web and read the result when it is done.

#### `get_online_search` (read)

Get one online search's status and result.

| Parameters | | |
|---|---|---|
| `online_search_id` | integer, required | Id of the online search |

#### `list_online_searches` (read)

List the customer's most recent online searches (up to 10, newest first) with their status.

Parameters: —

#### `register_online_search` (write)

Register an online research job. It runs in the background — this returns immediately with an id; poll get_online_search for the result. Optionally emails the result when finished.

| Parameters | | |
|---|---|---|
| `query` | string, required | The query to research online |
| `send_to_email` | string, optional | Optional email address(es), comma-separated, to send the result to when finished |
| `type` | string, optional | Search depth: Fast, Standard (default), or Deep |

### Support

The private line to the eesier team — open a request and read the ones already open.

#### `create_support_request` (write)

Open a direct line to the Blue Button support team. This is YOU, the connected agent, talking to the support and engineering team directly — use it to ask a question or report an issue on your own initiative in the background (the end user is NOT notified), or when the user explicitly asks you to contact support. Specify the type (technical, sales, human, or question) and severity (low/medium/high/critical). The team's reply comes back to you — read it later with list_support_requests.

| Parameters | | |
|---|---|---|
| `message` | string, required | What you want to ask or report to the Blue Button team |
| `type` | string, required | Request type: 'technical' (product/technical issue), 'sales' (commercial, billing, plan — the customer wants a sales rep to reach out), 'human' (the customer asks for a human contact, no specific reason), or 'question' (a simple information request you cannot answer yourself) |
| `severity` | string, required | How urgent it is: 'low', 'medium', 'high', or 'critical' |

#### `list_support_requests` (read)

List the customer's support requests — your thread with the Blue Button team — with each request's status, type, severity, and the team's answer (null until they reply). Filter by status: pending, answered, closed, or all (default all).

| Parameters | | |
|---|---|---|
| `status` | string, optional, default `all` | Status filter: pending, answered, closed, or all (default all) |

### Incidents

Read the platform incidents that affect this account.

#### `list_incidents` (read)

Lists platform incidents (outages / degradations / instabilities) reported by the Blue Button team, each with its public update timeline. Returns ongoing (active) incidents and recently resolved past ones. Call this when the user asks whether the platform is having problems, or when tool calls are failing unexpectedly — an active incident usually explains the failures.

| Parameters | | |
|---|---|---|
| `scope` | string, optional | Which incidents to return: 'active' (ongoing only), 'past' (resolved only) or 'all' (default) |
| `limit` | integer, optional | Max past incidents to return (default 10, max 50) |

## Frequently asked questions

**Is this list always up to date?**

Yes. It is generated from the running MCP server's tool registry, and a build test fails if the page and the server ever disagree.

**Do I need to read this to use eesier?**

No. Your agent discovers every tool automatically once connected. This page is for deciding whether to integrate, and for debugging a specific call.

**Can my agent do anything I cannot do myself?**

No. A token acts as your account and nothing more — the same data, the same limits, the same permissions.

**What happens if I revoke a token?**

The connection stops working immediately. Generate a new one in the console and reconnect; nothing else is affected.

**Are the descriptions here the same ones my agent sees?**

Exactly the same. The tool names, descriptions and parameter texts on this page are the verbatim strings the server sends to your agent.

