Server definition
- Hash
- sha256:bb6ec08143bbde86a837a252627865dd502900f1082ec3aa009453a044e15da4
- What it is
- What a remote MCP server returned when asked what it offers: 13 tools
The blob, as servednamed by its sha256
{
"instructions": "LeadMarina finds local-business leads with every contact verified (emails SMTP-checked; phones verified with line type + carrier). Typical flow: search_leads → poll get_search_results until enrichment is 'complete' → export_leads to the user's CRM (Close/GoHighLevel), Google Sheets, or an emailed CSV/Excel/JSON file. query_leads searches everything already collected (free — no leads spent); list_searches finds past search_ids. Searching/enriching spends leads from the account's lead allowance — a monthly pool on metered plans, a 7-day period allowance on Unlimited (get_balance reports whichever applies). Exports update previously exported leads in place (Google CID identity) — they never duplicate and never touch the user's own CRM notes/columns.",
"tools": [
{
"description": "Create an automation: re-run a search on a schedule and send the results somewhere automatically. Pass cities as plain strings (e.g. ['Austin, TX', 'Dallas, TX']) — they're resolved for you. IT SPENDS LEADS ON EVERY RUN, one per result, so confirm the niche, cities and cadence with the user before creating one. A destination of 'close', 'ghl' or 'google_sheets' requires that integration to be connected already (Close also needs one manual export first to save its field mapping); 'csv' | 'xlsx' | 'json' emails a file and needs nothing set up. Up to 20 automations, 25 cities each.",
"inputSchema": {
"properties": {
"cadence": {
"description": "How often it repeats.",
"enum": [
"once",
"daily",
"weekly",
"monthly",
"yearly"
],
"type": "string"
},
"cities": {
"description": "Cities to search, e.g. ['Austin, TX'] (max 25).",
"items": {
"type": "string"
},
"type": "array"
},
"destination": {
"description": "Where each run's leads go. 'none' just saves them to the library.",
"enum": [
"none",
"close",
"ghl",
"google_sheets",
"csv",
"xlsx",
"json"
],
"type": "string"
},
"keyword": {
"description": "The niche to search, e.g. 'roofing contractor'.",
"type": "string"
},
"spreadsheet_id": {
"description": "google_sheets only: append to this existing LeadMarina-created sheet.",
"type": "string"
},
"start_at": {
"description": "ISO timestamp for the first run. Defaults to now (runs on the next tick, within 15 min).",
"type": "string"
}
},
"required": [
"keyword",
"cities",
"cadence"
],
"type": "object"
},
"name": "create_automation",
"outputSchema": {
"properties": {
"cadence": {
"type": "string"
},
"cities": {
"items": {
"type": "string"
},
"type": "array"
},
"destination": {
"type": "string"
},
"id": {
"type": "string"
},
"keyword": {
"type": "string"
},
"next_run_at": {
"type": [
"string",
"null"
]
},
"note": {
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
}
},
{
"description": "Permanently delete an automation. This cannot be undone — confirm with the user first, and prefer update_automation with active=false if they only want it to stop for now. Leads already collected by past runs are kept; only the schedule is removed.",
"inputSchema": {
"properties": {
"id": {
"description": "The automation id from list_automations.",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "delete_automation",
"outputSchema": {
"properties": {
"deleted": {
"type": "boolean"
},
"id": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"id",
"deleted"
],
"type": "object"
}
},
{
"description": "Already have businesses? Pass up to 10 website domains to run the full enrichment + verification pipeline on them (verified emails + phones, owner name, socials). Costs 1 lead per domain. Returns a search_id to poll with get_search_results.",
"inputSchema": {
"properties": {
"domains": {
"description": "Business domains, e.g. ['acme.com'] (max 10).",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"domains"
],
"type": "object"
},
"name": "enrich_domains",
"outputSchema": {
"properties": {
"enriching": {
"description": "Domains accepted (balance-capped).",
"items": {
"type": "string"
},
"type": "array"
},
"enrichment": {
"type": "string"
},
"next_step": {
"type": "string"
},
"search_id": {
"type": "string"
}
},
"required": [
"search_id",
"enriching",
"enrichment"
],
"type": "object"
}
},
{
"description": "Push leads into a connected destination: 'close' (CRM — uses the account's saved field mapping), 'ghl' (GoHighLevel sub-account), 'google_sheets' (new spreadsheet, or pass spreadsheet_id for one LeadMarina created before), or a file — 'csv' | 'xlsx' | 'json' (emailed to the account owner + download link). Exports EITHER one search's leads (pass search_id) or the whole library (set all=true, optionally narrowed with the same filters as query_leads). LIMITS PER CALL, which differ by destination because CRMs take one API call per lead: csv/xlsx 50,000 · json 25,000 · google_sheets 5,000 · close/ghl 1,000. For a big library going to a CRM, export csv and import the file instead. If more leads match than the limit, the response sets truncated=true — relay that to the user, the export was partial. Previously exported leads are UPDATED in place (matched by Google CID) — never duplicated; the user's own CRM notes/columns are never touched.",
"inputSchema": {
"properties": {
"all": {
"description": "Export the whole library instead of one search.",
"type": "boolean"
},
"destination": {
"description": "Where the leads go.",
"enum": [
"close",
"ghl",
"google_sheets",
"csv",
"xlsx",
"json"
],
"type": "string"
},
"filters": {
"description": "With all=true: narrow the library using query_leads-style filter rows.",
"items": {
"type": "object"
},
"type": "array"
},
"search_id": {
"description": "Export this search's leads.",
"type": "string"
},
"spreadsheet_id": {
"description": "google_sheets only: add to this existing LeadMarina-created sheet instead of a new one.",
"type": "string"
}
},
"required": [
"destination"
],
"type": "object"
},
"name": "export_leads",
"outputSchema": {
"properties": {
"download_url": {
"description": "File exports only: 7-day download link.",
"type": "string"
},
"exported": {
"description": "Leads sent to the destination.",
"type": "number"
},
"file": {
"description": "File exports only: the file name.",
"type": "string"
},
"limit": {
"description": "The per-call limit that applied, when truncated.",
"type": "number"
},
"note": {
"type": "string"
},
"outcome": {
"description": "Human-readable result, e.g. added/updated counts.",
"type": "string"
},
"truncated": {
"description": "True when more leads matched than this destination's limit — the export was PARTIAL.",
"type": "boolean"
},
"warning": {
"description": "Present when truncated: what happened and how to get the rest.",
"type": "string"
}
},
"required": [
"exported",
"outcome"
],
"type": "object"
}
},
{
"description": "What the account has left, and when it resets. On a plan with a rate limit (no monthly quota) this is the leads left in the current 7-day period; on a metered plan it is the monthly allotment remaining.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "get_balance",
"outputSchema": {
"properties": {
"leads_remaining": {
"type": "number"
},
"note": {
"type": "string"
},
"period_limit": {
"type": "number"
},
"period_resets_at": {
"type": [
"string",
"null"
]
},
"period_used": {
"type": "number"
},
"plan": {
"type": "string"
}
},
"required": [
"leads_remaining",
"plan"
],
"type": "object"
}
},
{
"description": "Fetch a search's leads with verification filled in as enrichment progresses. Poll until enrichment is 'complete'. Each lead includes verified emails (SMTP status), verified phones (line type + carrier), owner name where identified, socials, and the business profile.",
"inputSchema": {
"properties": {
"limit": {
"description": "Max leads to return (default 25, max 1000).",
"type": "number"
},
"offset": {
"description": "Pagination offset (default 0).",
"type": "number"
},
"search_id": {
"description": "The search_id returned by search_leads or enrich_domains.",
"type": "string"
}
},
"required": [
"search_id"
],
"type": "object"
},
"name": "get_search_results",
"outputSchema": {
"properties": {
"enrichment": {
"description": "'pending' or 'complete'.",
"type": "string"
},
"leads_remaining": {
"description": "Leads spendable now. On a plan with no monthly quota this is what is left in the current 7-day period, not a monthly balance.",
"type": [
"number",
"null"
]
},
"location": {
"type": [
"string",
"null"
]
},
"next_offset": {
"description": "Pass as offset to fetch the next page; null on the last page.",
"type": [
"number",
"null"
]
},
"period": {
"description": "On a rate-limited plan: { limit, used, resets_at }. Null on a metered plan.",
"type": [
"object",
"null"
]
},
"progress": {
"description": "{ done, total } rows enriched so far.",
"type": [
"object",
"null"
]
},
"query": {
"type": [
"string",
"null"
]
},
"queue_position": {
"description": "For queued searches, the place in this account's own queue (1 = next).",
"type": [
"number",
"null"
]
},
"results": {
"items": {
"properties": {
"category": {
"type": [
"string",
"null"
]
},
"city": {
"type": [
"string",
"null"
]
},
"emails_data": {
"description": "Verified emails with SMTP status."
},
"enrichment_status": {
"type": [
"string",
"null"
]
},
"name": {
"type": [
"string",
"null"
]
},
"owner_name": {
"type": [
"string",
"null"
]
},
"phones_data": {
"description": "Verified phones with line type + carrier."
},
"rating": {
"type": [
"number",
"null"
]
},
"reviews": {
"type": [
"number",
"null"
]
},
"socials": {
"description": "Social profile links keyed by platform."
},
"state": {
"type": [
"string",
"null"
]
},
"website": {
"type": [
"string",
"null"
]
}
},
"type": "object"
},
"type": "array"
},
"search_id": {
"type": "string"
},
"showing": {
"description": "Range shown, e.g. '1–25'.",
"type": "string"
},
"stage": {
"description": "queued | discovering | enriching | verifying | complete | failed | cancelled. 'verifying' means every row is delivered and contacts are being verified — often the longest phase, not a stall.",
"type": "string"
},
"total_leads": {
"type": "number"
}
},
"required": [
"search_id",
"enrichment",
"total_leads",
"results"
],
"type": "object"
}
},
{
"description": "The account's automations — saved searches that re-run on a schedule and export themselves. Shows each one's niche, cities, cadence, destination, whether it's active, when it next runs, and how the last run went.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "list_automations",
"outputSchema": {
"properties": {
"automations": {
"items": {
"properties": {
"active": {
"type": "boolean"
},
"cadence": {
"type": "string"
},
"cities": {
"items": {
"type": "string"
},
"type": "array"
},
"destination": {
"type": "string"
},
"id": {
"type": "string"
},
"keyword": {
"type": "string"
},
"last_run_at": {
"type": [
"string",
"null"
]
},
"last_status": {
"type": [
"string",
"null"
]
},
"next_run_at": {
"type": [
"string",
"null"
]
}
},
"type": "object"
},
"type": "array"
},
"count": {
"type": "number"
}
},
"required": [
"count",
"automations"
],
"type": "object"
}
},
{
"description": "Which export destinations this account has connected (Close, GoHighLevel, Google Sheets) and whether each is ready to receive leads. Check this BEFORE export_leads or create_automation with a CRM destination — those fail if the integration isn't connected, and Close additionally needs one manual export first to save its field mapping. File destinations (csv/xlsx/json) always work and need nothing connected.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "list_integrations",
"outputSchema": {
"properties": {
"integrations": {
"items": {
"properties": {
"connected": {
"type": "boolean"
},
"note": {
"type": "string"
},
"provider": {
"type": "string"
},
"ready": {
"description": "Connected AND usable as an export destination right now.",
"type": "boolean"
}
},
"type": "object"
},
"type": "array"
}
},
"required": [
"integrations"
],
"type": "object"
}
},
{
"description": "The account's recent searches (id, niche, location, result count, when) — use a search_id with get_search_results or export_leads.",
"inputSchema": {
"properties": {
"limit": {
"description": "Max searches (default 10, max 25).",
"type": "number"
}
},
"type": "object"
},
"name": "list_searches",
"outputSchema": {
"properties": {
"searches": {
"items": {
"properties": {
"created_at": {
"type": [
"string",
"null"
]
},
"id": {
"type": "string"
},
"keyword": {
"type": [
"string",
"null"
]
},
"location_name": {
"type": [
"string",
"null"
]
},
"result_count": {
"type": [
"number",
"null"
]
}
},
"type": "object"
},
"type": "array"
}
},
"required": [
"searches"
],
"type": "object"
}
},
{
"description": "The account's saved views from the leads table — each a named set of filters the user already built (e.g. 'Roofers with a mobile number'). Returns each view's filter conditions in the exact shape query_leads and export_leads accept, so \"export my Hot Leads view to Close\" works without rebuilding the filters by hand.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "list_views",
"outputSchema": {
"properties": {
"count": {
"type": "number"
},
"views": {
"items": {
"properties": {
"filters": {
"description": "Pass straight to query_leads or export_leads.",
"items": {
"type": "object"
},
"type": "array"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"type": "object"
},
"type": "array"
}
},
"required": [
"count",
"views"
],
"type": "object"
}
},
{
"description": "Search ALL leads the account has ever collected (across every search) with filters and sorting — no new search is run and no leads are spent. Filter fields include: name, category, city, state, rating, reviews, website, claimed, owner_name, phone_1, email_1, email_status, phone_1_type, google_cid. Operators: contains, not_contains, is, is_not, starts_with, gt, gte, lt, lte, is_empty, is_not_empty, is_true, is_false. Combine rows with conj 'and'/'or'. Example: find rated-4.5+ plumbers in Austin with a verified email: filters=[{field:'category',operator:'contains',value:'plumb'},{field:'city',operator:'is',value:'Austin',conj:'and'},{field:'email_status',operator:'is',value:'safe',conj:'and'}].",
"inputSchema": {
"properties": {
"cursor": {
"description": "Opaque pagination cursor from a previous call.",
"type": "string"
},
"filters": {
"description": "Filter conditions (optional — omit for everything, newest data first).",
"items": {
"properties": {
"conj": {
"enum": [
"and",
"or"
],
"type": "string"
},
"field": {
"type": "string"
},
"operator": {
"type": "string"
},
"value": {
"type": "string"
}
},
"required": [
"field",
"operator"
],
"type": "object"
},
"type": "array"
},
"limit": {
"description": "Max leads to return (default 25, max 1000).",
"type": "number"
},
"sort": {
"description": "Sort keys, e.g. [{id:'reviews',dir:-1}]. Optional.",
"items": {
"properties": {
"dir": {
"enum": [
1,
-1
],
"type": "number"
},
"id": {
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"type": "array"
}
},
"type": "object"
},
"name": "query_leads",
"outputSchema": {
"properties": {
"next_cursor": {
"description": "Pass back as 'cursor' for the next page.",
"type": [
"string",
"null"
]
},
"results": {
"items": {
"properties": {
"category": {
"type": [
"string",
"null"
]
},
"city": {
"type": [
"string",
"null"
]
},
"emails_data": {
"description": "Verified emails with SMTP status."
},
"enrichment_status": {
"type": [
"string",
"null"
]
},
"name": {
"type": [
"string",
"null"
]
},
"owner_name": {
"type": [
"string",
"null"
]
},
"phones_data": {
"description": "Verified phones with line type + carrier."
},
"rating": {
"type": [
"number",
"null"
]
},
"reviews": {
"type": [
"number",
"null"
]
},
"socials": {
"description": "Social profile links keyed by platform."
},
"state": {
"type": [
"string",
"null"
]
},
"website": {
"type": [
"string",
"null"
]
}
},
"type": "object"
},
"type": "array"
},
"returned": {
"type": "number"
},
"total_matching": {
"description": "Exact match count (first page only; absent on later pages).",
"type": [
"number",
"null"
]
}
},
"required": [
"returned",
"results"
],
"type": "object"
}
},
{
"description": "Run a live search for local businesses by niche + city (e.g. query 'electrician', location 'Austin, TX'). Returns the first batch immediately with a search_id; more results are found and verified in the background — every email is SMTP-checked and every phone verified with line type + carrier. Spends 1 lead per result. Poll get_search_results until enrichment is 'complete'.",
"inputSchema": {
"properties": {
"location": {
"description": "City, e.g. 'Austin, TX'. Ignored if location_code is given.",
"type": "string"
},
"location_code": {
"description": "Optional exact location code (skips the city lookup).",
"type": "number"
},
"query": {
"description": "Business niche/category keyword, e.g. 'electrician'.",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "search_leads",
"outputSchema": {
"properties": {
"delivered_so_far": {
"type": "number"
},
"enrichment": {
"description": "'pending' until background verification finishes.",
"type": "string"
},
"leads_remaining": {
"description": "Leads spendable now. On a plan with no monthly quota this is what is left in the current 7-day period.",
"type": "number"
},
"location": {
"type": [
"string",
"null"
]
},
"next_step": {
"type": "string"
},
"query": {
"type": "string"
},
"search_id": {
"type": "string"
}
},
"required": [
"search_id",
"query",
"delivered_so_far",
"enrichment"
],
"type": "object"
}
},
{
"description": "Pause an automation (active=false) so it stops running and stops spending leads, or resume it (active=true). Pausing is the safe way to stop an automation you might want back — use delete_automation only when the user wants it gone for good.",
"inputSchema": {
"properties": {
"active": {
"description": "false to pause, true to resume.",
"type": "boolean"
},
"id": {
"description": "The automation id from list_automations.",
"type": "string"
}
},
"required": [
"id",
"active"
],
"type": "object"
},
"name": "update_automation",
"outputSchema": {
"properties": {
"active": {
"type": "boolean"
},
"id": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"id",
"active"
],
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:bb6ec08143bbde86a837a252627865dd502900f1082ec3aa009453a044e15da4 | sha256sum