OpenLeads

io.github.Samyrrrrrr990由 GitHub 账号 Samyrrrrrr990 发布v5.2.0更新于 Nov 5, 2026

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

概览

AI 生成的概览

OpenLeads 从免费公开来源查找 B2B 线索和工作邮箱,并在本地 CRM 中管理名单、序列、任务和商机。

可以做什么
  • 用一句自然语言描述查找线索,并查找或验证工作邮箱,每个地址都标注证据来源和可投递等级
  • 列出可搜索的公开数据来源
  • 搜索并查看已保存的联系人和公司,包括阶段、匹配评分、技术栈、备注和活动记录
  • 管理本地工作区:保存联系人、加入名单、设置阶段、打标签、添加备注并查看统计
  • 处理跟进队列:创建和完成任务,并起草个性化冷邮件但不发送
  • 管理商机和触达:创建和推进商机阶段、查看序列、把联系人加入序列,以及列出和运行自动化工作流
适用场景
适合需要做销售开发、招聘或调研,并希望助手从公开来源收集线索和邮箱、再整理进本地 CRM 的场景。也适合希望不依赖付费数据服务、就能维护名单、跟进任务、序列和商机管道的小规模外呼工作。
运行要求
以 Python 包形式通过 stdio 在本机运行(需 Python 3.8 或更高版本),也可用 npx 安装,首次运行会创建独立的 Python 环境。未声明需要 API 密钥或账号。数据保存在本地工作区目录中。部分邮箱检查依赖 25 端口,许多家庭网络会封锁该端口。
安装前请注意
它会从公开来源收集个人联系信息并起草外呼邮件,你需要自行遵守反垃圾邮件与隐私法规以及各来源的使用条款。工作区工具会写入本地 CRM,工作流以真实模式运行时会修改工作区并可能导出数据。助手本身不发送邮件,但序列和工作流可按计划排队或发送邮件。

安装

在 SourceWeft 中

  1. 打开 控制台中的 OpenLeads,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

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.

来源:README.md,提交 dd836b3

工具

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).

输入参数countquery必填sourcelocationsenioritydepartmentsave_to_listverified_onlybudget_seconds

find_email

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

输入参数name必填domain必填

verify_email

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

输入参数email必填

list_sources

List the public data sources OpenLeads can search.

无需输入参数。

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.

输入参数taglisttierlimitquerystagefit_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.

输入参数email必填

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.

输入参数limitquerystageindustrytechnology

get_company

Get a company

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

输入参数domain必填

list_tasks

List tasks

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

输入参数bucket

pipeline

Deal pipeline

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

无需输入参数。

list_sequences

List sequences

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

无需输入参数。

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.

输入参数leadsteptoneangleemailuse_llmvariants

workspace_stats

Workspace stats

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

无需输入参数。

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.

输入参数listtagscontacts必填

add_to_list

Add to list

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

输入参数list必填emails必填

set_stage

Set stage

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

输入参数stage必填emails必填

tag_contacts

Tag contacts

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

输入参数tags必填emails必填remove

add_note

Add a note

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

输入参数text必填email必填pinned

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.

输入参数duekindnotetitle必填contactpriority

complete_task

Complete a task

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

输入参数id必填

create_deal

Create a deal

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

输入参数name必填stageamountcompanycontactclose_date

move_deal

Move a deal

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

输入参数id必填stage必填

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.

输入参数listemailssequence必填

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.

无需输入参数。

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.

输入参数livemodename必填

版本历史

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

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分