Reference
MCP tools
Everything your agent can call once the Meerko MCP server is connected: 32 tools and 4 commands. This page is generated from the server's own definitions, so it matches what your agent sees.
Docs menu
start_sequence and approve_draft send real email. Their descriptions tell your agent to call them only after you've seen the preview or the draft and said yes.
Tables 7
How it works: Tables.
list_tablesList all prospect tables in the Meerko workspace, with their columns and row counts.
Parameters
None.
create_tableCreate a new prospect table (e.g. 'Fintech CTOs Spain'). Columns are optional; they are also auto-created on import.
Parameters
| name | string | required | Table name |
| columns | object[] | optional |
Each item in columns
| name | string | required | |
| type | text | number | email | url | boolean | json | optional |
add_columnAdd a column to a table. Give it a `prompt` to make it an AI column: an instruction that you (the agent) answer per row, e.g. "Score ICP fit 1-5 for {{company}}: {{description}}" or "Write a one-line opener for {{first_name}} at {{company}}".
Meerko doesn't run the prompt itself. Fill the column with get_pending_cells + update_rows. Calling this again with a new prompt replaces the instruction.
Parameters
| table_id | string | required | A table's id, from list_tables. |
| name | string | required | |
| type | text | number | email | url | boolean | json | optional | |
| prompt | string | optional | Instruction for an AI column; {{column_key}} inserts that row's value |
get_pending_cellsFetch rows whose AI column is still empty, each with the column's instruction already filled in from that row ("instruction") plus the full row data.
Answer each instruction yourself from the row data (and research, if the instruction asks for it), then save all answers in one update_rows call. Repeat while "remaining" > 0. Write "N/A" when a row lacks what the instruction needs, so it isn't returned again.
Parameters
| table_id | string | required | A table's id, from list_tables. |
| column | string | required | The AI column's name or key |
| limit | integer · 1–200 | optional | Rows per batch (default 25) |
| filter | object | optional |
update_rowsWrite values into existing rows by row id. Each update's `data` is merged into the row; new keys become new columns. Max 1,000 rows per call.
Parameters
| table_id | string | required | A table's id, from list_tables. |
| updates | object[] | required |
Each item in updates
| id | string | required | |
| data | object | required |
import_rowsInsert rows (objects of column -> value) into a table. Keys are normalized to snake_case and unknown keys become new columns. Max 10,000 rows per call.
Parameters
| table_id | string | required | A table's id, from list_tables. |
| rows | object[] | required |
query_rowsRead rows from a table, each with its pipeline stage. `filter` is an exact-match object on column keys, e.g. {"country": "Spain"}; `stage` filters by stage (new, contacted, replied, meeting, won, lost).
Parameters
| table_id | string | required | A table's id, from list_tables. |
| filter | object | optional | |
| stage | new | contacted | replied | meeting | won | lost | optional | |
| limit | integer · 1–1000 | optional | |
| offset | integer | optional |
Leads 3
How it works: Leads.
find_peopleSearch the lead database for people and save them as rows in a table (first_name, last_name, title, company, domain, company_size, location, linkedin_url).
Filters are objects keyed by field. Text fields take {include?: string[], exclude?: string[]}; numeric fields take range operators {">=": n, "<=": n}. Use alpha-2 country codes for location ("ES", "US"). Expand titles across languages and acronyms (["CTO", "Chief Technology Officer", "Director de Tecnología"]). People fields: currentJobTitle, pastJobTitle, firstname, lastname, location, keyword, skills, languages, school, currentCompanyName, currentCompanyWebsite, currentCompanyUrn, "currentCompany.industry", "currentCompany.location", "currentCompany.keyword"; ranges: "currentCompany.headcount", "currentCompany.revenue", totalYearsOfExperience; growth: "currentCompany.headcountGrowth" {timespan: "6months"|"12months"|"24months", min, max}.
Parameters
| query | object | required | |
| limit | integer · 1–1000 | optional | Max results to fetch (default 25). Each result costs 1 credit (none with your own Icypeas key); count first. |
| table_id | string | optional | Append results to this table |
| table_name | string | optional | Name for a new table, used when table_id is omitted |
| count_only | boolean | optional | Only return how many leads match. Free; use before a paid search. |
find_companiesSearch the lead database for companies and save them as rows in a table (company, domain, industry, employees, location, description, linkedin_url, company_urn).
Filters are objects keyed by field. Text fields take {include?: string[], exclude?: string[]}; numeric fields take range operators {">=": n, "<=": n}. Use alpha-2 country codes for location ("ES", "US"). Expand titles across languages and acronyms (["CTO", "Chief Technology Officer", "Director de Tecnología"]). Company fields: name, industry (LinkedIn industry names, e.g. "Financial Services", "Software Development"), location, keyword, domain, type; ranges: headcount, revenue (USD); growth: headcountGrowth {timespan, min, max}. To get decision-makers at the found companies, pass their company_urn values to find_people as currentCompanyUrn.
Parameters
| query | object | required | |
| limit | integer · 1–1000 | optional | Max results to fetch (default 25). Each result costs 1 credit (none with your own Icypeas key); count first. |
| table_id | string | optional | Append results to this table |
| table_name | string | optional | Name for a new table, used when table_id is omitted |
| count_only | boolean | optional | Only return how many leads match. Free; use before a paid search. |
enrich_rowsFind work emails (from first_name, last_name and domain or company columns) and verify them, writing email, email_certainty and email_verification back to each row.
Only rows missing a result are processed, at most `limit` per call (~3s per row). Keep calling while `remaining` > 0. Costs: 8 credits per email found, 1 per verification; misses are free. Emails found as ultra_sure/very_sure count as verified at no cost. email_certainty values: ultra_sure, very_sure, probable (deliverability unconfirmed), not_found, missing_input (row lacks a name or domain).
Parameters
| table_id | string | required | A table's id, from list_tables. |
| fields | string[] | optional | Default: both |
| filter | object | optional | Only enrich rows matching this exact-match filter |
| limit | integer · 1–50 | optional | Rows per call (default 25) |
| overwrite | boolean | optional | Re-run rows that already have a result |
Mailboxes 5
How it works: Mailboxes.
connect_gmailStart connecting a Gmail/Google Workspace inbox to send from. Returns a Google consent URL: give it to the user to open and approve, then call list_mailboxes to confirm it's connected.
Parameters
| string | optional | Google account to pre-select |
list_mailboxesList connected sending mailboxes with their daily limit, what they may send today (effectiveLimit, lower while a new mailbox ramps up; rampDay) and status. A mailbox in `error` status lost access and must be reconnected with connect_gmail.
Parameters
None.
update_mailboxSet a mailbox's daily send limit, the sender name recipients see, or its ramp.
New mailboxes ramp up automatically: they start at 10 emails a day and grow to their daily limit over 21 days (list_mailboxes shows effectiveLimit and rampDay). Turn the ramp off only for an inbox that already sends regularly.
Parameters
| mailbox_id | string | required | From list_mailboxes. |
| daily_limit | integer · 1–500 | optional | |
| display_name | string | optional | |
| ramp | boolean | optional | true restarts the 21-day ramp from today; false sends at the full daily limit now |
send_test_emailSend a test email from a connected mailbox to check it works. Only send to the user's own address.
Parameters
| mailbox_id | string | required | From list_mailboxes. |
| to | string | required |
check_domainsCheck SPF, DKIM and DMARC for every domain the workspace sends from. A missing record is a common reason mail lands in spam: tell the user which record to add before starting a sequence. "managed" means consumer Gmail, where Google handles it. DKIM is checked at Google Workspace's default selector ("google").
Parameters
None.
Sequences 8
How it works: Sequences.
create_sequenceCreate a DRAFT email sequence for a table, sent from a pool of one or more connected mailboxes (see list_mailboxes). Each lead is assigned one mailbox and every step comes from it, in the same thread; more mailboxes means more volume per day.
Write short, plain, personal emails: step 1 with a subject, 1-3 follow-ups that reply in the same thread. Use only {{vars}} that the table's rows actually have; rows missing a used variable are skipped at enrollment. Then: preview_sequence to check, enroll_rows, show the user the preview and enrollment counts, and only call start_sequence after the user approves.
Parameters
| table_id | string | required | A table's id, from list_tables. |
| name | string | required | |
| mailbox_ids | string[] · 1–50 | required | |
| assignment | capacity | even | optional | How leads are spread over the mailboxes: capacity (default) gives more to mailboxes that can send more today; even gives each the same number |
| steps | object[] · 1–10 | required | |
| timezone | string | optional | IANA timezone of the recipients, e.g. Europe/Madrid (default) |
| window_start_hour | integer · 0–23 | optional | Local hour sending starts on weekdays (default 9) |
| window_end_hour | integer · 1–24 | optional | Local hour sending stops (default 17) |
Each item in steps
| subject | string | optional | Only for step 1; follow-ups reply in the same thread |
| body | string | required | Plain text. Use {{column_key}} for row values, e.g. {{first_name}}. An unsubscribe line is appended automatically. |
| delay_days | integer | optional | Days after the previous step (default 3) |
update_sequenceEdit a sequence's name, mailbox pool, assignment, send window or steps (steps replace all existing ones; pause an active sequence first). Changing mailbox_ids moves leads not yet emailed to the new pool; leads already mid-thread stay on their mailbox, or stop if it was removed.
Parameters
| sequence_id | string | required | From list_sequences. |
| name | string | optional | |
| mailbox_ids | string[] · 1–50 | optional | |
| assignment | capacity | even | optional | |
| steps | object[] · 1–10 | optional | |
| timezone | string | optional | |
| window_start_hour | integer · 0–23 | optional | |
| window_end_hour | integer · 1–24 | optional |
Each item in steps
| subject | string | optional | Only for step 1; follow-ups reply in the same thread |
| body | string | required | Plain text. Use {{column_key}} for row values, e.g. {{first_name}}. An unsubscribe line is appended automatically. |
| delay_days | integer | optional | Days after the previous step (default 3) |
preview_sequenceRender every step of a sequence for one row (the first row by default), exactly as it will be sent, plus any template variables that row is missing.
Parameters
| sequence_id | string | required | From list_sequences. |
| row_id | string | optional | A row's id, from query_rows. |
enroll_rowsEnroll rows from the sequence's table. Skips (and counts) rows with no email, an undeliverable email, an unsubscribed address, a missing template variable, or already enrolled. Enrolling doesn't send anything until the sequence is started.
Parameters
| sequence_id | string | required | From list_sequences. |
| row_ids | string[] | optional | Row ids, from query_rows. |
| filter | object | optional | Exact-match filter, e.g. {"email_certainty": "ultra_sure"} |
| limit | integer · 1–5000 | optional |
start_sequenceStart sending a sequence. Real emails go to real people from the user's mailbox: only call this after the user has seen the preview and explicitly approved. Sends respect the send window, the mailbox's daily limit and spacing. needs your OK
Parameters
| sequence_id | string | required | From list_sequences. |
pause_sequencePause a sequence; nothing more is sent until it's started again.
Parameters
| sequence_id | string | required | From list_sequences. |
list_sequencesList sequences with status and enrollment counts.
Parameters
None.
sequence_statsA sequence's enrollment states (active, completed, replied, unsubscribed, failed...), emails sent, reply rate, and its mailbox pool: each mailbox's sends today against its limit, ramp day and number of leads.
Parameters
| sequence_id | string | required | From list_sequences. |
Replies & drafts 6
How it works: Replies & drafts.
list_repliesReplies to the user's sequences that nobody has classified yet (newest first). Each has the reply text (quoted history removed), the earlier emails in the thread, and the prospect's table row.
Meerko already stopped the sequence for anyone who replied, and handled bounces, unsubscribe requests and out-of-office replies by itself (hidden here unless include_automatic). Read each reply, decide its intent and save it with classify_reply. Summarize the interested ones and questions for the user.
Parameters
| sequence_id | string | optional | From list_sequences. |
| intent | string | optional | Only replies with this intent (then classified ones are included) |
| include_automatic | boolean | optional | |
| limit | integer · 1–100 | optional |
classify_replySet a reply's intent after reading it: interested (wants to talk / asks for a meeting), question (asks something before deciding), not_now (timing), not_interested, referral (points to someone else), wrong_person, other. Set handled: true when no further action is needed.
Parameters
| reply_id | string | required | From list_replies. |
| intent | interested | not_interested | not_now | question | referral | wrong_person | other | required | |
| handled | boolean | optional |
draft_replySave a draft answer to a reply (from list_replies). Nothing is sent: the user reviews it first.
Write like a person answering an email: short, specific to what they said, in their language, with one clear next step (e.g. two meeting times or a booking link if the user gave you one). Sign off with the sender's first name: Gmail doesn't add the user's signature to emails sent through Meerko. Drafting again for the same reply replaces the pending draft.
Parameters
| reply_id | string | required | From list_replies. |
| body | string | required | Plain text |
list_draftsPending drafts with the reply each answers, the thread so far and the prospect's row. Show them to the user for approval.
Parameters
None.
approve_draftSend a draft as a reply in the same email thread, from the user's mailbox. Only call this after the user has read this specific draft and explicitly said to send it. Pass `body` if the user edited the text. needs your OK
Parameters
| draft_id | string | required | From list_drafts. |
| body | string | optional |
discard_draftThrow a pending draft away.
Parameters
| draft_id | string | required | From list_drafts. |
Pipeline 2
How it works: Pipeline.
pipelineLead counts per stage (new → contacted → replied → meeting → won → lost), for one table or the whole workspace. Meerko moves leads to contacted when the first email is sent and to replied when they answer; meeting, won and lost are set with move_stage.
Parameters
| table_id | string | optional | A table's id, from list_tables. |
move_stageMove leads (rows) to a pipeline stage, e.g. meeting when a call is booked, won or lost. Use query_rows with `stage` to find leads at a stage.
Parameters
| table_id | string | required | A table's id, from list_tables. |
| row_ids | string[] · ≥ 1 | required | Row ids, from query_rows. |
| stage | new | contacted | replied | meeting | won | lost | required |
Credits 1
How it works: Credits.
get_creditsShow the workspace's credit balance (null when self-hosted with your own provider keys).
Parameters
None.
Commands
Ready-made prompts that chain the tools. In Claude Code they show up as slash commands; other clients list them as prompts.
/mcp__meerko__find-leads
Find leads
Build a lead list from your ideal customer, with verified emails.
icp
/mcp__meerko__write-sequence
Write a sequence
Draft a 3-step email sequence for a table, in your voice.
table · offer?
/mcp__meerko__triage-replies
Triage replies
Sort new replies by intent and draft answers for you to approve.
/mcp__meerko__pipeline
Pipeline
See who's interested, booked and won, and what needs you.