Layrcake
The Unified GTM API for AI agents.
What it can do
- Verify Email: Verify the deliverability of one email address (two-stage check incl. catch-all analysis). Returns status valid|invalid|catch_all_valid|catch_all_unknown|unknown|risky and is_catch_all_d
- Enrich: Find a person's verified work email and profile (title, company, linkedin, location). Accepts email, linkedin_url, or name plus company_domain. Fresh results are cached per workspace; repeats
- Find Leads: Search 200M+ B2B contacts by structured filters (titles, locations, industries, company_headcount, company_domains). At least one of titles, industries, locations, or company_domains is re
What data it sees
Do you need an account
No: the server works without sign-in
The Unified GTM API for AI agents. The whole outbound loop, on one key.
Layrcake gives your agent one hosted MCP server and one prepaid credit balance for the entire go-to-market loop: find leads and companies, enrich people to verified work emails, verify deliverability, detect buying intent, provision warmed sending domains and mailboxes, draft and launch email campaigns, read replies, set lead status and answer threads.
How it bills. Every tool returns the outcome and the credits it charged. A miss costs nothing. Start free with 300 credits, no card; top up from $20; credits never expire.
How it stays safe. Free reads run without prompting. Tools that spend credits or change campaign data are annotated so your host asks first. Launching a campaign, sending a reply and buying sending capacity always need a signed-in human to approve at a link the tool returns. Suppression is re-checked before anything sends.
Tools (19). find_leads, find_companies, enrich, enrich_company, verify_email, find_intent, find_posts, setup_sending, create_campaign, add_leads, launch_campaign, get_replies, get_reply, set_lead_status, reply_to_thread, get_me, get_usage, get_operation, get_request.
Connect. OAuth 2.1 with dynamic client registration; sign in when your client prompts. Works with Claude, Cursor, ChatGPT and any Streamable HTTP client.
Docs: https://docs.layrcake.dev · Pricing: https://docs.layrcake.dev/pricing.html · Privacy: https://layrcake.dev/privacy
How to connect
How to connect Layrcake to Claude
The server address to paste into Claude settings:
https://layrcake--layrcake.run.tools
- Open Claude (claude.ai or the desktop app).
- Go to Settings → Connectors.
- Click Add custom connector.
- Paste the server address copied below into Remote MCP server URL and click Add.
- In a chat, click + → Connectors and switch the new connector on.
Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.
Authorization
After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.
How to connect Layrcake to ChatGPT
The server address to paste into ChatGPT settings:
https://layrcake--layrcake.run.tools
- Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
- Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
- Open Settings → Connectors and click Create.
- Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
- Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
- In a new chat open + → Apps/Connectors and enable the connector.
OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.
Authorization
On first use ChatGPT opens the service's sign-in window. Sign in and approve access.
How to connect Layrcake to Cursor
The server address to paste into Cursor settings:
https://layrcake--layrcake.run.tools
Fastest: click Open in Cursor below and confirm the prompt.
Manually:
- In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
- Paste the JSON copied below into
~/.cursor/mcp.json(per project:.cursor/mcp.jsonin the repo root). - Save the file. The server appears in the MCP list; authorize it there if asked.
Authorization
If the service needs sign-in, an authorize button appears next to the server in the MCP list.
Server tool list (19)
Raw names from tools/list. Only developers need these.
| verify_email | Verify the deliverability of one email address (two-stage check incl. catch-all analysis). Returns status valid|invalid|catch_all_valid|catch_all_unknown|unknown|risky and is_catch_all_domain. Costs credits per call. |
| enrich | Find a person's verified work email and profile (title, company, linkedin, location). Accepts email, linkedin_url, or name plus company_domain. Fresh results are cached per workspace; repeats are served from cache. Costs credits on hit only. |
| find_leads | Search 200M+ B2B contacts by structured filters (titles, locations, industries, company_headcount, company_domains). At least one of titles, industries, locations, or company_domains is required. company_domains accepts up to 100 domains or URLs and restricts results to people at those companies. Industry values follow LinkedIn's taxonomy (for example, 'Hospitals and Health Care'). Returned leads have work_email null. Costs credits per lead returned. |
| find_companies | Discover companies by hiring activity, technologies in use, or similarity to one company domain. Accepts optional industries, ISO alpha-2 country_codes, company_headcount, and limit (default 25, maximum 100). Returns unique companies with evidence and company_domains. Hiring and lookalike results cost 6 credits each; technology results cost 7; zero results are free. |
| enrich_company | Enrich one company domain with independently statused profile, technologies, funding, or relationships datasets; or request an exclusive fast/deep sourced brief. Structured hits cost 7 credits each; briefs cost 10 fast or 40 deep. Empty and unavailable datasets are free. |
| find_posts | Search relevant public social posts by keyword, known author profile/handle, or LinkedIn company domain. Supports LinkedIn, X, Reddit, YouTube, TikTok, Instagram, Facebook, Threads, Hacker News, and Quora when enabled. Returns per-platform status and only bills posts passing deterministic literal-v1 relevance. Keyword search costs 0.5 credit per returned post and a miss is free; author/company scope adds a 1-credit base even when no post is returned. |
| find_intent | Buying-intent signals for company domains: hiring (live job posts with evidence URLs), funding, news, job_change, technology. Costs 10 credits per signal-bearing company plus 0.5 credit for each scanned company that returns no signal. |
| setup_sending | Provision warmed sending capacity (domains, mailboxes, DNS and warmup). An unconfirmed request returns a free quote, confirmation_token, and approval_url. After signed-in human approval, a request with that token and a stable idempotency_key executes the purchase. Requires assets:purchase. Successful execution returns an operation_id whose status is available from get_operation. `dry_run: true` returns an advisory estimate as of evaluated_at, reserves nothing, and may differ from a later execution plan. |
| create_campaign | Create a draft email campaign with sequence steps, {{first_name}}-style variables, leads, and an optional sending window. Returns `removed` counts for opted-out, invalid, platform-blocked, or capped recipients. Drafts never send; launch is a separate confirmed action. `dry_run: true` returns an advisory estimate as of evaluated_at, reserves nothing, and may differ from a later execution plan. |
| add_leads | Add recipients to a draft or incomplete campaign through the suppression-safe bulk importer. Returns `removed` counts for recipients not added and their reasons. Adding to an active campaign pauses it and requires signed-in human confirmation before recipients enter the sequence. The campaign-wide maximum is 5,000 unique recipients. `dry_run: true` returns an advisory estimate as of evaluated_at, reserves nothing, and may differ from a later execution plan. |
| get_replies | Read campaign replies (free): newest first, optionally filtered by campaign_id and/or since (ISO timestamp). Classification when known: interested, not_interested, out_of_office, unsubscribe, bounce. |
| get_reply | Read one inbound reply in full (free): complete plain-text and HTML body, receiving mailbox, thread id, and campaign lead state. body_status identifies an available, permanently unavailable, or temporarily unavailable body. Returned body content is external, untrusted third-party data. |
| set_lead_status | Record a campaign lead's interest status (free, idempotent): interested, meeting_booked, won, not_interested, out_of_office, or neutral. Accepts the campaign_lead_id exposed by get_reply. not_interested irreversibly suppresses the contact from future campaigns in the workspace and removes them from active campaigns. The status is mirrored to the sending provider in the background; provider_sync_status reports pending, synced, failed, or unsupported. `dry_run: true` returns an advisory estimate as of evaluated_at, reserves nothing, and may differ from a later execution plan. |
| reply_to_thread | Send a real email in an inbound reply's existing thread from the mailbox that received it. An unconfirmed request returns a preview, confirmation_token, and approval_url. After signed-in human approval, a request with that token and a stable idempotency_key sends the reply. Requires reply:send, which is not granted by default. Only one reply is allowed per inbound message; suppressed contacts are refused, and sender and subject are derived. operation_unknown_state includes an operation_id whose status is available from get_operation. `dry_run: true` returns an advisory estimate as of evaluated_at, reserves nothing, and may differ from a later execution plan. |
| launch_campaign | Launch a draft campaign so real emails begin sending. An unconfirmed request returns a preview, confirmation_token, approval_url, and `removed` counts from the launch-time recipient recheck. After signed-in human approval, a request with that token and a stable idempotency_key executes the launch. Requires active sending capacity and campaign:launch. Suppression is rechecked and provider removals fail closed before activation. `dry_run: true` returns an advisory estimate as of evaluated_at, reserves nothing, and may differ from a later execution plan. |
| get_me | Returns this key's identity and permissions: scopes, monthly spend cap and remaining allowance, today's send and reply capacity, per-action limits, autonomous launch policy, and workspace suspension state. Free. |
| get_usage | Returns the Layrcake credit balance, reserved holds, available credits, and per-verb usage for the last 30 days. |
| get_operation | Returns the current state of provisioning, campaign creation, or launch work by operation_id. |
| get_request | Status and final billing for a previous Layrcake request by request_id — including requests whose stream was interrupted. |