OpenLeads

io.github.Samyrrrrrr990Published by GitHub account Samyrrrrrr990v5.2.0Updated Nov 5, 2026

Find leads with honest email evidence, then work them: CRM, sequences, tasks, deals. No API keys.

Overview

AI-generated overview

OpenLeads finds B2B leads and work emails from free public sources and manages them in a local CRM with lists, sequences, tasks and deals.

What you can do
  • Find leads from a plain-English description and look up or verify work emails, with each address labeled by evidence and deliverability tier
  • List the public data sources it can search
  • Search and inspect saved contacts and companies, including stage, fit score, tech stack, notes and activity
  • Manage the workspace: save contacts, add them to lists, set stages, tag, add notes, and view workspace stats
  • Run the follow-up queue: create and complete tasks, and draft personalized cold emails without sending
  • Track deals and outreach: create and move deals through the pipeline, list sequences, enroll contacts, and list or run automation workflows
When to use it
Useful when you prospect, recruit or research and want an assistant to gather leads and emails from public sources and then keep them organized in a local CRM. It suits small outbound workflows where you want lists, follow-up tasks, sequences and a deal pipeline without a paid data provider.
Requirements
Runs locally over stdio as a Python package (Python 3.8 or newer) or via npx, which sets up a private Python environment. No API keys or account are declared. Data is stored locally in a workspace directory. Some email checks depend on port 25, which many home providers block.
Before you install
It collects personal contact data from public sources and drafts outreach, so you are responsible for anti-spam and privacy law and each source's terms. Workspace tools write to your local CRM, and workflow runs in real mode change the workspace and can export data. Sending is not done by the assistant, but sequences and workflows can queue or send email on a schedule.

Installation

In SourceWeft

  1. Open OpenLeads in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

OpenLeads

Describe a customer. Get the people, with every email labeled by how we know it.

OpenLeads searches free public sources for the businesses and people you describe, finds their work emails, and marks each one found, pattern or guessed. Then it works them like Apollo does: lists, ICP scoring, sequences, tasks and a deal pipeline. It runs on your machine, with no API keys and nothing to pay.

[PyPI] [npm] [Python 3.8+] [CI] [Live benchmark] [License: AGPL v3]

Website  |  Docs  |  Live benchmark  |  Changelog

bash
pipx install "openleads[all]"          # or: pip install "openleads[all]", or: npx openleadsopenleads find "dentists in Austin"    # ten leads, every email labeledopenleads web                          # the workspace at http://127.0.0.1:8787
[The People page of the OpenLeads dashboard: a filter column beside a table of contacts with title, company, email with its evidence mark, stage and last contact.]

The local dashboard on the demo workspace (openleads demo, invented data).

Every email says how we know it

Most free finders call a first.last@ guess "valid". OpenLeads labels each address with where it came from, then decides separately whether it is safe to send:

EvidenceMeaning
foundPublished on the company's site, in a public commit or security.txt, or confirmed by the mail server
patternBuilt from an address format already seen at that company
guessedThe most common format for that name. Nothing confirms it, and the label says so
TierWhat happens
safeSent by default
riskyHeld for your review unless you opt in
badDropped (no mail server, disposable, or it bounced)

Seven checks decide the tier, and most of them work without port 25, which home internet providers block: two DNS-over-HTTPS resolvers that must agree on the mail server, SPF and DMARC, disposable/role/free-mail lists, Gravatar, published addresses, learned company patterns, and SMTP with catch-all detection when port 25 is open. How the scoring works.

Measured against live data every night

Unit tests can't tell you whether "dentists in Austin" returns dentists, so a GitHub Action runs the same real searches against the live sources every night, asks for ten leads each, and commits what came back to BENCHMARK.md, empty nights included. Run it yourself with openleads bench.

What you can search

One sentence fans out across the sources that fit it. You never have to pick one, but -s name pins a source.

Ask forSearchedExample
Local businesses, any cityOpenStreetMap (Overpass and Nominatim)"accountants in Toronto"
Startup founders, companies hiringY Combinator, Hacker News"AI startup founders"
Companies by industryWikidata, SEC EDGAR"fintech companies"
DevelopersGitHub"rust developers in Berlin"
ML buildersHugging Face"ML engineers"
ResearchersOpenAlex"machine learning researchers"
Everyone at one companythe company's own site"emails at stripe.com"
US healthcare providersNPI Registry"pediatricians"

Companies are turned into named people from their team and about pages. When a search comes back short, OpenLeads says which source failed or ran out of time and what to try next. Need a source we don't have? A source is one Python file.

Work your leads

Everything you find lands in a local workspace: the same data in the dashboard, the terminal and your AI assistant.

[The dashboard home: the date and what is due, four figures (contacts, emails sent, reply rate, open pipeline), today's tasks and the best leads to contact.][A sequence editor: a day-by-day step timeline (automatic email, threaded bump, call) with counts per step, and a live preview of the email for a contact with its spam score.]
Home. What is due today, how outreach is going, and the strongest leads you haven't contacted.Sequences. Email, call, LinkedIn and task steps with A/B variants and same-thread follow-ups. People leave when they reply, bounce or unsubscribe.
[A deal pipeline board with Qualify, Meeting, Proposal, Negotiation, Won and Lost columns, each with its value, under open pipeline, weighted forecast, won and win rate.][The dashboard home page in dark mode.]
Deals. A drag-and-drop pipeline with a weighted forecast. Winning a deal makes the contact a customer.Everything else. People and companies with Apollo-style filters, lists, ICP fit from A to D, a task queue, templates, CSV import, duplicate merge and a ⌘K palette.
bash
openleads people --fit A --never-contacted                 # best untouched leadsopenleads lists add "Q4 dentists" --where dentalopenleads seq enroll "Q4 outbound" --list "Q4 dentists"openleads tasks --bucket todayopenleads import apollo-export.csv --list "Imported"

Workspace guide  |  Sequences guide  |  Moving from Apollo

Use it from Python

python
import openleads
leads = openleads.find("gyms in Sydney", count=20)for lead in leads:    print(lead.email, lead.evidence, lead.tier)leads.write("gyms.csv")            # .csv, .json or .jsonlprint(leads.report.summary())      # which sources ran, what failed, why it stopped

Python API

Use it from Claude, Cursor or Claude Code

OpenLeads is an MCP server. Your assistant can find and verify leads mid-conversation, and work your lists, tasks and sequences:

bash
claude mcp add openleads -- openleads mcp
json
{ "mcpServers": { "openleads": { "command": "openleads", "args": ["mcp"] } } }

"Find 10 law firms in London with emails we can actually send to, save them to a list called London law, and give me a call task for each partner."

The assistant can search and edit your workspace, but it never sends email itself.

Automate it

Workflows are n8n-style node graphs you draw in the dashboard: triggers (schedule, new leads, a reply), find, verify, filter and split by tier, write email, wait, send, add to a list or sequence, create tasks, and export. Test runs never send; every run shows what each node did. Sends stay inside your daily cap, warmup ramp and business hours, and stop for anyone who replies.

bash
openleads workflow templates                       # 7 ready-made workflowsopenleads workflow new dentists --from local-business-outreach   # arrives pausedopenleads workflow run dentists      # a test run: finds and writes, never sends
bash
openleads recipe add miami "marketing agencies in Miami" --every "weekdays 9am" --sendopenleads watch add new-dentists "dentists in Austin"     # tell me only about new matchesopenleads schedule on      # one agent: launchd, cron or Windows Task Scheduleropenleads runs             # what ran, what it found, what failed

Workflows  |  Writing emails  |  Timed runs. Exports go to CSV, Google Sheets, Notion, Airtable, HubSpot or any webhook. There is also a GitHub Action:

yaml
- uses: Samyrrrrrr990/[email protected]  with: { query: "marketing agencies in Miami", count: 50 }

Install

bash
pipx install "openleads[all]"     # recommendedpip install openleads             # minimal: the standard-library engine and CLInpx openleads                     # Node: sets up a private Python environment on first run
bash
openleads doctor    # checks your setup: DNS, port 25, mailboxopenleads demo      # the dashboard on an invented workspaceopenleads           # chat: type what you want

Python 3.8 or newer on macOS, Linux or Windows. Full walkthrough: quickstart.

Commands

bash
# findopenleads find "50 fintech founders, verified only" -o leads.csvopenleads find "accountants in Toronto" --explain     # the plan, each source's status, hintsopenleads company stripe.com                           # tech stack, socials, phones, peopleopenleads enrich my-list.csv                           # your names and companies, emails labeledopenleads verify [email protected]
# reach out (a dry run unless you add --live)openleads write "rust developers in Berlin" --variants 2 --explain   # drafts, scored, with the briefopenleads run "rust developers in Berlin"
# the workspaceopenleads people | companies | lists | seq | tasks | dealsopenleads import | export | dedupe | stats | backup
# set up and automateopenleads init | config | doctor | web | mcp | benchopenleads recipe | watch | schedule | runs

openleads --help lists every command by group.

How it works

mermaid
flowchart LR    Q["'dentists in Austin'"] --> P[Query parser]    P --> F[Planner<br/>picks the sources]    F --> S1[OpenStreetMap]    F --> S2[YC, HN, GitHub, Hugging Face,<br/>OpenAlex, EDGAR, Wikidata, NPI]    S1 & S2 --> D[People from team pages<br/>+ real-name check]    D --> E[Email checks<br/>harvest, pattern, MX, SMTP, Gravatar]    E --> L[Leads with evidence and tier]    L --> W[Workspace, sequences, exports]    E <--> DB[(Local SQLite<br/>learned patterns, workspace)]

The engine is Python standard library only. Requests that fail transiently are retried, a search returns within its time budget with whatever finished, and every run produces a report of which sources answered, which fell back and why. Your leads, drafts, mailbox credentials, learned patterns and the whole workspace live in ~/.openleads. There is no hosted backend, no account and no telemetry. Architecture.

Responsible use

OpenLeads is for legitimate prospecting, recruiting and research. You are responsible for anti-spam law (CAN-SPAM, GDPR, CASL) and each source's terms. It ships the guardrails: dry runs by default, a suppression list, one-click unsubscribe, warmup caps and no tracking pixels. Responsible use.

License

Open source under AGPL-3.0. Using OpenLeads is free, including at your company. If you embed it in a closed-source product, or run a modified version as a service without publishing your changes, you need a commercial license.

Contributing

The most useful contribution is a new source (guide); the next is a query that openleads bench scores badly, with the fix. See CONTRIBUTING.md. Thanks to everyone who has sent a pull request, including @xmejl, @harrisonoconnorhover and @Shalinipks for 5.1.

Thanks

OpenStreetMap contributors, OpenAlex, yc-oss/api, Hugging Face, the NPI Registry, SEC EDGAR, Wikidata, Gravatar, and the US Social Security Administration for its given-name data. The dashboard and website use Atkinson Hyperlegible by the Braille Institute.

Source: README.md at commit dd836b3

Tools

25

find_leads

Find B2B leads from free public sources and verify their emails. Describe who you want in plain English, e.g. 'dentists in Austin', 'marketing agencies in Miami', 'fintech founders', 'rust developers in Berlin', or 'emails at stripe.com'. Returns people/companies with an email, a deliverability tier (safe/risky), and evidence (found/pattern/guessed).

Parameterscountqueryrequiredsourcelocationsenioritydepartmentsave_to_listverified_onlybudget_seconds

find_email

Find the most likely work email for a person at a company domain.

Parametersnamerequireddomainrequired

verify_email

Check whether an email address is deliverable (safe/risky/bad) and why.

Parametersemailrequired

list_sources

List the public data sources OpenLeads can search.

Takes no parameters.

search_contacts

Search contacts

Search the people saved in your OpenLeads workspace (like Apollo's People tab). Filter by free text (name, email, company, title), stage, email status, seniority, department, tag, list, or minimum ICP fit score. Returns contacts with stage, fit score (0-100) and email tier.

Parameterstaglisttierlimitquerystagefit_minsenioritydepartmentnever_contacted

get_contact

Get a contact

Everything about one contact: profile, company, tags, lists, notes, open tasks, deals, sequences they're in, and recent activity.

Parametersemailrequired

search_companies

Search companies

Search companies in the workspace by text, technology they use (e.g. HubSpot, Shopify), industry or stage. Returns people counts and tech stack.

Parameterslimitquerystageindustrytechnology

get_company

Get a company

One company: profile, tech stack, its people, deals, open tasks and notes.

Parametersdomainrequired

list_tasks

List tasks

The follow-up queue (calls, emails, LinkedIn touches, to-dos) by due date.

Parametersbucket

pipeline

Deal pipeline

The deal pipeline by stage with totals: open value, probability-weighted forecast, won value and win rate.

Takes no parameters.

list_sequences

List sequences

Outreach sequences with their steps, status and reply/bounce numbers.

Takes no parameters.

draft_email

Draft an email

Write a personalized cold email (or a follow-up) for a saved contact, or for a lead object from find_leads. Nothing is sent or saved. Returns the subject and body, a 0-100 quality score with reasons, the research brief (the facts the email may use: company, tech stack, signals like hiring or YC, the person's role) and why each line was chosen. Shared inboxes (info@, office@) get a 'who should I talk to' email. Uses the configured LLM when there is one (facts-checked), else the built-in writer.

Parametersleadsteptoneangleemailuse_llmvariants

workspace_stats

Workspace stats

The workspace at a glance: contacts, sends, reply rate, tasks due, pipeline, ICP grades and data-quality issues.

Takes no parameters.

save_contacts

Save contacts

Save people to the workspace (e.g. results from find_leads), optionally into a list and with tags. Existing contacts are updated without blanking fields. Each contact needs an email; other fields are optional.

Parameterslisttagscontactsrequired

add_to_list

Add to list

Add saved contacts to a people list (created if it doesn't exist).

Parameterslistrequiredemailsrequired

set_stage

Set stage

Move contacts to a stage: new, approaching, replied, interested, meeting, customer, not_interested, unresponsive, do_not_contact, bad_data.

Parametersstagerequiredemailsrequired

tag_contacts

Tag contacts

Add (or with remove=true, remove) tags on contacts.

Parameterstagsrequiredemailsrequiredremove

add_note

Add a note

Add a note to a contact's record (call notes, context, next steps).

Parameterstextrequiredemailrequiredpinned

create_task

Create a task

Create a follow-up task. kind: call, email, linkedin or todo. due accepts today, tomorrow, +3d, +2h, a weekday (fri) or YYYY-MM-DD.

Parametersduekindnotetitlerequiredcontactpriority

complete_task

Complete a task

Mark a task done (a sequence task moves that contact to their next step).

Parametersidrequired

create_deal

Create a deal

Open a deal. stage: qualify, meeting, proposal, negotiation, won, lost. amount accepts 12000, 12k or $2.5k.

Parametersnamerequiredstageamountcompanycontactclose_date

move_deal

Move a deal

Move a deal to another stage (won makes its contact and company customers).

Parametersidrequiredstagerequired

enroll_in_sequence

Enroll in a sequence

Add contacts (by email or a whole list) to an existing sequence. People who are suppressed, unverified, or already in a sequence are skipped with a reason. Nothing is sent immediately; steps run on schedule.

Parameterslistemailssequencerequired

list_workflows

List workflows

Your automation workflows (node graphs: triggers, find leads, filters, write, send, export…) and recipes, with whether each is active, live, when it runs and how many items are waiting.

Takes no parameters.

run_workflow

Run a workflow

Run one workflow and report what each node did (items in/out, notes, errors). By default this is a TEST RUN: it searches and drafts but never sends, exports, notifies or changes the workspace. mode='run' does a real run (workspace changes and exports happen; Send only previews). Only live=true with mode='run' sends real email, inside the warmup cap. Never set live=true unless the user explicitly asked to send.

Parameterslivemodenamerequired

Version history

4
  1. v5.2.0LatestNov 5, 2026
  2. v5.1.1Oct 30, 2026
  3. v5.0.0Oct 15, 2026
  4. v4.6.1Oct 13, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts