Leonidas of the Web
Provides built-in SMTP support for cPanel-hosted mailboxes, allowing approved cold emails to be sent through cPanel's secure SSL/TLS or STARTTLS SMTP servers with AUTH PLAIN/LOGIN and environment-variable password handling.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Leonidas of the WebFind 20 dental clinics in Denver, add them, and draft first-touch emails for qualified leads."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Leonidas of the Web
Formerly leadwright. The npm package is now @kurtfrancisco/leonidas and the command is leonidas; leadwright still works as a deprecated alias.
A compliance-first outbound sales pipeline that runs as an MCP server for Claude Code, Cursor and Codex.
Your coding agent researches leads, scores them against an industry ICP, and drafts cold email. Leonidas checks every draft against CAN-SPAM and deliverability rules, logs why each lead was contacted, and holds everything for a human to approve. By default nothing is ever sent.
Based on Harvey by Ethan Rogers (MIT). Leonidas of the Web is an independent project. It is not affiliated with or endorsed by Ethan Rogers. The skills library and the content rules (banned phrases, merge-tag, link and plain-text checks) come from Harvey. The MCP server, compliance gate, send window, caps, audit log and ICP templates are new.
Why
Autonomous SDR agents fail in the same ways: a fake "Re:" subject, a missing unsubscribe line, a burned domain, an email to someone who already opted out, and no record of why that person was emailed. Leonidas puts deterministic code between the model and the outbox.
Related MCP server: prospector
Features
MCP server (stdio, zero dependencies) with 18 tools:
leo_add_leads,leo_writer_prompt,leo_check_email,leo_queue_email,leo_why,leo_send_approved,leo_objection,leo_dns_check, and more. The 0.1.xlw_*names still work as aliases.Never auto-sends.
sending.modedefaults to"draft". Only a human approves (leonidas approve <id>). Agents can approve only if you setapproval.allowAgentApproval: trueyourself.CAN-SPAM gate. Every message gets a footer with your physical postal address and an opt-out line.
List-Unsubscribeheaders are added (one-click when you set a URL). DeceptiveRe:/Fwd:subjects on a first touch are blocked.Cold email bodies under 100 words (footer excluded). Hard error at queue and send time. Config can tighten it but can't loosen it.
Subject lines under 30 characters. This is a hard error. Config can tighten the limit but can't loosen it.
Tuesday/Wednesday sending only. This is a hard rule:
sending.allowedDayscan narrow it to one of those days but can't add others. It must be Tue/Wed both in the lead'stimezone(falling back tosending.timezone) and in America/Chicago. Approved mail that comes up on another day is markedscheduledfor the next Tuesday or Wednesday and goes out on the nextleonidas sendrun on or after that date.Built-in SMTP (zero dependencies) for cPanel and other hosted mailboxes: port 465 SSL or 587 STARTTLS, AUTH PLAIN/LOGIN, password from an environment variable only. A 550 on the recipient records a hard bounce and suppresses the address.
Verified-only sending by default: leads must be marked
emailVerified: true(orverification: "valid").Deliverability. Daily cap, per-domain cap, a warmup ramp (5/day, +3/day, or an explicit
sending.ramp), a send window, a minimum gap between sends, quiet hours, a bounce-rate circuit breaker (pauses above 5% hard bounces), and SPF/DMARC/DKIM checks.Do-not-contact list. Blocks exact emails (case and
+tagnormalized) and whole domains. Hard bounces and complaints are added automatically, and adding an entry pulls any pending mail to that address.Audit log of decisions. Each step records who acted and why, the evidence and the score reasons. The log is append-only JSONL with a SHA-256 hash chain, so tampering shows up.
leonidas why <email>shows the full trail.Eight industry ICP templates: SaaS, agencies, home services, dental/clinics, e-commerce, real estate, professional services and manufacturing. Each lead is scored with readable reasons.
Content gate from Harvey: banned spam and AI-tell phrases, unrendered merge tags, a one-link budget, plain text only, and a word ceiling. Also blocks role addresses and header injection.
CSV import and export. Exports are protected against formula injection.
Quick start
npx -y @kurtfrancisco/leonidas init --icp home_services
# edit .leonidas/config.json (or use YAML: .leonidas/config.yaml, see examples/): sender.name/company/email/physicalAddress, compliance.unsubscribe
npx -y @kurtfrancisco/leonidas install-snippets # prints configs for all three hostsClaude Code: claude mcp add leonidas -- npx -y @kurtfrancisco/leonidas mcp
Cursor (.cursor/mcp.json): {"mcpServers":{"leonidas":{"command":"npx","args":["-y","@kurtfrancisco/leonidas","mcp"]}}}
Codex (~/.codex/config.toml):
[mcp_servers.leonidas]
command = "npx"
args = ["-y", "@kurtfrancisco/leonidas", "mcp"]Then ask your agent, for example: "Find 20 HVAC companies in Austin, add them to Leonidas, and draft first-touch emails for the qualified ones."
Review and send:
leonidas outbox pending_approval
leonidas show <id>
leonidas approve <id> "looks right"
leonidas send # only works with sending.mode="send"; only Tue/Wed
leonidas why owner@example.comConfiguration (.leonidas/config.json or config.yaml)
The config is found at $LEONIDAS_CONFIG, else .leonidas/config.yaml, config.yml or config.json. An existing .leadwright/ folder and the LEADWRIGHT_* environment variables from 0.1.x keep working.
Key | Default | Meaning |
|
| Must be set to |
|
| Weekdays when cold email may go out |
|
| Used when a lead has no |
| 30 / 3 | Hard caps per day |
| 5/day +3/day | Ramp for a new mailbox |
| 0.05 | Hard-bounce rate that pauses sending (after 20 sends) |
|
|
|
|
| Explicit warmup caps per day, e.g. |
| none |
|
| 0 | Minimum gap between two sends |
|
| Hold mail to leads not marked verified |
|
| The writer brief requires a business-specific first line |
| none |
|
| 100 | Budget hint shown in status for the host agent. Not measured or enforced by Leonidas |
|
| List of benefits. The writer brief offers the 3 most relevant to each lead and asks for at most one |
|
| Map of objection to answer. |
|
| Given to the writer as the only prices it may quote |
|
|
|
| 15 | Number of minutes ( |
|
| Lets the MCP agent approve its own drafts. Leave this off |
| 99 | Can only go lower. Bodies must be under 100 words, excluding the footer |
| 29 | Can only go lower. Subjects must be under 30 characters |
|
| One of the 8 templates ( |
SMTP for cPanel mailboxes
In cPanel go to Email Accounts > Connect Devices and copy the "Secure SSL/TLS Settings" (outgoing server, usually mail.yourdomain.com).
sending:
mode: send # only when you are ready
transport: smtp
smtp:
host: mail.yourdomain.com
port: 465 # 465 = SSL/TLS. Or 587 = STARTTLS (required; Leonidas refuses to log in unencrypted)
user: you@yourdomain.com # the full mailbox address
passwordEnv: LEONIDAS_SMTP_PASSWORDexport LEONIDAS_SMTP_PASSWORD='mailbox password' # never put it in the config file; config check rejects it
leonidas config checksecure defaults to true on 465 and false (STARTTLS) on 587. The certificate is verified. If your host's certificate only covers its server name (e.g. server123.hostingcompany.com), use that name as host. caFile points at a custom CA, and rejectUnauthorized: false turns verification off (not recommended). Also set SPF, DKIM and DMARC for the domain (leonidas dns yourdomain.com default). Every gate still runs before a connection is opened: approval, Tue/Wed, subject and word limits, footer, ramp and caps, window, quiet hours, verified-only and the bounce breaker. A 5xx on RCPT marks the message failed, records a hard bounce and suppresses the address. A 4xx leaves it approved for the next run.
YAML configs, Harvey import and validation
leonidas import-harvey harvey.yaml .leonidas/config.yaml # convert a Harvey-style config (persona/product/offer/icp/channels/usage/brain)
leonidas config check [file] # schema and safety check; exit code 1 on errorsimport-harvey maps snake_case Harvey fields onto this schema and prints a note for each change. For example, meeting_duration: 10 minutes becomes meetingDurationMinutes: 10, company_size: 1-20 employees becomes "1-20", and provider: smtp becomes transport: smtp. Duplicate YAML keys are reported (the last value wins). Imported configs always start in draft mode. config check warns about risky values: send days other than Tue/Wed, sendUnverified: true, approval turned off, plaintext SMTP. See examples/local-web-agency.yaml for a full example with placeholders.
Pro ($11 launch price)
Leonidas Pro adds:
Sequence and playbook packs for 8 industries
A deeper compliance and deliverability checker: CASL/GDPR/PECR region rules, list hygiene, spam scoring, a full DNS audit and pack validation
A one-command installer that registers the server with Claude Code, Cursor and Codex
Pro is sold separately. The core in this repo is MIT and fully usable without it. Existing leadwright Pro keys keep working.
Buy Leonidas Pro: $11 one-time →
Legal
Leonidas helps you follow the rules, but it isn't legal advice. You're responsible for complying with CAN-SPAM, CASL, GDPR/PECR and your mail provider's terms.
License
MIT. Copyright (c) 2026 Ethan Rogers (original Harvey) and Copyright (c) 2026 Kurt Francisco (modifications). See LICENSE.
Related MCP Connectors
Analyze leads, draft follow-up campaigns, and launch SMS outreach only with explicit human approval.
- LayrcakeOAuthdev.layrcake
Go-to-market infrastructure for AI agents: find leads, verify emails, read signals, run campaigns.
Find LinkedIn prospects, draft outreach, and run human-paced campaigns from your AI agent.
B2B outreach CRM for AI agents: contacts, verification, approved campaigns, replies, follow-ups.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables personalized cold email outreach through research, drafting, template management, and deliverability checks, all locally with no required API keys.6MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to run a GTM lead pipeline that scrapes sources, applies ICP gates to disqualify leads, checks email deliverability, and requires human approval before any lead is marked qualified.3 npm1Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to discover companies showing buying signals, enrich them with public homepage data, score them against custom rules, and draft review-ready briefs.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables agents to find leads, read buying signals, write and send email and LinkedIn outreach, handle replies, and report results, with built-in safety gates, approvals, limits, and compliance controls.5Apache 2.0