meerko

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

namestringrequiredTable name
columnsobject[]optional

Each item in columns

namestringrequired
typetext | number | email | url | boolean | jsonoptional
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_idstringrequiredA table's id, from list_tables.
namestringrequired
typetext | number | email | url | boolean | jsonoptional
promptstringoptionalInstruction 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_idstringrequiredA table's id, from list_tables.
columnstringrequiredThe AI column's name or key
limitinteger · 1–200optionalRows per batch (default 25)
filterobjectoptional
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_idstringrequiredA table's id, from list_tables.
updatesobject[]required

Each item in updates

idstringrequired
dataobjectrequired
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_idstringrequiredA table's id, from list_tables.
rowsobject[]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_idstringrequiredA table's id, from list_tables.
filterobjectoptional
stagenew | contacted | replied | meeting | won | lostoptional
limitinteger · 1–1000optional
offsetintegeroptional

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

queryobjectrequired
limitinteger · 1–1000optionalMax results to fetch (default 25). Each result costs 1 credit (none with your own Icypeas key); count first.
table_idstringoptionalAppend results to this table
table_namestringoptionalName for a new table, used when table_id is omitted
count_onlybooleanoptionalOnly 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

queryobjectrequired
limitinteger · 1–1000optionalMax results to fetch (default 25). Each result costs 1 credit (none with your own Icypeas key); count first.
table_idstringoptionalAppend results to this table
table_namestringoptionalName for a new table, used when table_id is omitted
count_onlybooleanoptionalOnly 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_idstringrequiredA table's id, from list_tables.
fieldsstring[]optionalDefault: both
filterobjectoptionalOnly enrich rows matching this exact-match filter
limitinteger · 1–50optionalRows per call (default 25)
overwritebooleanoptionalRe-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

emailstringoptionalGoogle 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_idstringrequiredFrom list_mailboxes.
daily_limitinteger · 1–500optional
display_namestringoptional
rampbooleanoptionaltrue 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_idstringrequiredFrom list_mailboxes.
tostringrequired
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_idstringrequiredA table's id, from list_tables.
namestringrequired
mailbox_idsstring[] · 1–50required
assignmentcapacity | evenoptionalHow leads are spread over the mailboxes: capacity (default) gives more to mailboxes that can send more today; even gives each the same number
stepsobject[] · 1–10required
timezonestringoptionalIANA timezone of the recipients, e.g. Europe/Madrid (default)
window_start_hourinteger · 0–23optionalLocal hour sending starts on weekdays (default 9)
window_end_hourinteger · 1–24optionalLocal hour sending stops (default 17)

Each item in steps

subjectstringoptionalOnly for step 1; follow-ups reply in the same thread
bodystringrequiredPlain text. Use {{column_key}} for row values, e.g. {{first_name}}. An unsubscribe line is appended automatically.
delay_daysintegeroptionalDays 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_idstringrequiredFrom list_sequences.
namestringoptional
mailbox_idsstring[] · 1–50optional
assignmentcapacity | evenoptional
stepsobject[] · 1–10optional
timezonestringoptional
window_start_hourinteger · 0–23optional
window_end_hourinteger · 1–24optional

Each item in steps

subjectstringoptionalOnly for step 1; follow-ups reply in the same thread
bodystringrequiredPlain text. Use {{column_key}} for row values, e.g. {{first_name}}. An unsubscribe line is appended automatically.
delay_daysintegeroptionalDays 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_idstringrequiredFrom list_sequences.
row_idstringoptionalA 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_idstringrequiredFrom list_sequences.
row_idsstring[]optionalRow ids, from query_rows.
filterobjectoptionalExact-match filter, e.g. {"email_certainty": "ultra_sure"}
limitinteger · 1–5000optional
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.

Parameters

sequence_idstringrequiredFrom list_sequences.
pause_sequencePause a sequence; nothing more is sent until it's started again.

Parameters

sequence_idstringrequiredFrom 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_idstringrequiredFrom 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_idstringoptionalFrom list_sequences.
intentstringoptionalOnly replies with this intent (then classified ones are included)
include_automaticbooleanoptional
limitinteger · 1–100optional
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_idstringrequiredFrom list_replies.
intentinterested | not_interested | not_now | question | referral | wrong_person | otherrequired
handledbooleanoptional
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_idstringrequiredFrom list_replies.
bodystringrequiredPlain 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.

Parameters

draft_idstringrequiredFrom list_drafts.
bodystringoptional
discard_draftThrow a pending draft away.

Parameters

draft_idstringrequiredFrom 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_idstringoptionalA 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_idstringrequiredA table's id, from list_tables.
row_idsstring[] · ≥ 1requiredRow ids, from query_rows.
stagenew | contacted | replied | meeting | won | lostrequired

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.