Skill: lessieai/people-search (version 1.0.0)

--- name: people-search metadata: version: 2.1.0 tags: [people-search, b2b, enrichment, kol, recruiting, web-research] description: > Search, qualify, and enrich people and companies. Use this skill whenever the user wants to find professionals, candidates, or KOLs by title, company, location, seniority, or audience; enrich known contacts with email, phone, or LinkedIn; research companies for industry, funding, tech stack, or hiring activity; look up someone's contact info; source candidates for recruiting; generate B2B lead lists; or perform background web research on people or organizations. Trigger this skill even when the user doesn't explicitly say "search" or "enrich" — any mention of finding contacts, sourcing, prospecting, looking up a person or company, or gathering business intelligence should activate it. --- # Lessie — People Search & Enrichment ## Setup Lessie supports two modes: **CLI** (default, recommended) and **MCP Server**. ### Mode A: CLI (default) Install the Lessie CLI binary: ```bash npm install -g @lessie/cli ``` Or use without installing: ```bash npx @lessie/cli --version ``` First-time authorization: ```bash lessie auth ``` This opens a browser for login/registration. Token is cached at `~/.lessie/oauth.json`. Verify connection: ```bash lessie status ``` ### Mode B: MCP Server Add to your MCP config (Claude Code `~/.claude/mcp.json`, Cursor `~/.cursor/mcp.json`, etc.): ```json { "mcpServers": { "lessie": { "command": "npx", "args": ["-y", "@lessie/mcp-server"], "env": { "LESSIE_REMOTE_MCP_URL": "https://app.lessie.ai/mcp-server/mcp" } } } } ``` ### Uninstall - **CLI:** `npm uninstall -g @lessie/cli && rm -rf ~/.lessie/` - **MCP:** Remove the `"lessie"` entry from your `.mcp.json` and `rm -rf ~/.lessie/` ## Quick start After setup, try saying to Claude: - "Find Engineering Managers at Stripe in San Francisco" - "Look up Sam Altman's contact info" - "Research OpenAI — recent news and open job postings" ## Mode detection Determine which mode to use at the start of each session: 1. Check if `lessie` CLI is available: run `lessie status` 2. If the command succeeds → use **CLI mode** (call tools via Bash) 3. If the command fails (not found) → attempt auto-install: `npm install -g @lessie/cli` 4. After install, run `lessie status` again to verify 5. If install succeeds → use **CLI mode** 6. If install fails (no npm, permission denied, network error, etc.) → check if MCP tools are available (`authorize`, `use_lessie`) 7. If MCP tools are available → use **MCP mode** 8. If neither → inform the user that installation failed and suggest manual install or MCP setup ## Credits & Pricing Lessie is a credit-based service. New accounts receive free trial credits. View your balance and purchase more at https://lessie.ai/pricing. The agent will disambiguate company names before searching to avoid wasting credits on wrong results. ## Data & Privacy - **Data sources:** Contact and company information is aggregated from publicly available sources (business directories, social profiles, corporate websites). - **Query logging:** Search queries are logged for service improvement and abuse prevention. No query data is shared with third parties. - **Data compliance:** Lessie follows applicable data protection regulations. Users are responsible for using retrieved contact data in compliance with local laws (GDPR, CAN-SPAM, etc.). - **Privacy policy:** https://lessie.ai/privacy - **Terms of service:** https://lessie.ai/terms-of-service ## Authorization ### CLI mode 1. Run `lessie status` to check token validity. 2. If `authorized: false` → run `lessie auth` to open browser for login. 3. After the user completes login, run `lessie status` again to confirm. ### MCP mode 1. Call `authorize` to check connection status. 2. **If already authorized** → proceed to use tools directly. 3. **If not authorized** → `authorize` returns an authorization URL. Tell the user you need to open a browser for Lessie login/registration, and open it using the appropriate system command: - macOS: `open "<url>"` - Linux: `xdg-open "<url>"` - Windows: `start "<url>"` 4. Tell the user the browser has been opened and they need to complete login/registration. 5. After the user confirms, call `authorize` again to verify the connection. 6. If authorization fails (timeout, denied, port conflict), follow the diagnostic hints returned by `authorize` and retry. Always inform the user before opening the browser — never silently redirect. ## Agent behavior rules ### CRITICAL: Confirm before every credit-consuming action Every Lessie tool call costs credits. Credit costs per tool: | Tool | Cost | |------|------| | `find-people` | **20 credits** per search | | `enrich-people` | 1 credit × number of people (only charged for successful matches) | | `review-people` | 1 credit × number of people | | `enrich-org` | 1 credit | | `find-orgs` | 1 credit | | `job-postings` | 1 credit | | `company-news` | 1 credit | | `web-search` | 1 credit | | `web-fetch` | 1 credit | **Before executing any command**, you MUST: 1. Tell the user what you are about to do and the estimated cost (e.g., "I'll enrich 3 people — this costs ~3 credits"). 2. **Wait for explicit confirmation** before executing. 3. Never batch multiple credit-consuming calls without confirming the full plan first. **Exception — skip confirmation** if the user has explicitly said they don't want to be prompted (e.g., "don't ask me every time", "just do it", "skip confirmations"). In that case, proceed directly but still log what you executed and the credits spent after each call. ### CRITICAL: Report credit usage after every call After each conversation turn that involved one or more Lessie tool calls, append a one-line summary of credits consumed. Format: > Used `<tool-name>`, cost <N> credit(s). If multiple tools were called in the same turn, combine them: > Used `web-search` + `enrich-org`, cost 2 credits total. ### CRITICAL: Read references before first CLI call **Before executing any `lessie` CLI command for the first time in a session**, you MUST read [references/cli-reference.md](references/cli-reference.md) to learn the exact parameter syntax. Do NOT guess parameter names — the CLI uses `--filter` with JSON, not `--title`/`--company` style flags. ### Entity disambiguation When a user mentions a company name that could refer to multiple entities (e.g., "Manus" could be Manus AI, Manus Bio, Manus Plus, etc.), disambiguate before searching: 1. **Ask the user** which company they mean, or present the top candidates and let them pick. 2. If context makes it unambiguous (e.g., user previously discussed AI agents), state your assumption and confirm: "你是指做 AI Agent 的 Manus AI (manus.im) 吗？" 3. **Never silently assume** one entity over another — wrong domain = wasted search credits and irrelevant results. ## Tools overview ### People | Tool | CLI command | When to use | |------|-------------|-------------| | `find_people` | `lessie find-people` | Discover people by title, company, location, seniority, audience. Default strategy is `hybrid`. **If a request times out or fails, retry with `--strategy saas_only`** — it's faster (~30s vs ~60s) and more stable, though recall may be lower | | `enrich_people` | `lessie enrich-people` | Enrich known people with full profiles. **Two paths**: B2B (via linkedin_url or name+domain → email, phone, work history) and KOL (via twitter/instagram/tiktok/youtube username → follower count, social links). Max 10 per call | | `review_people` | `lessie review-people` | Deep-qualify **ambiguous** candidates via web research — skip for obvious matches/mismatches | ```bash # Find people — uses --filter with JSON, NOT --title/--company flags lessie find-people \ --filter '{"person_titles":["Engineering Manager"],"organization_domains":["stripe.com"]}' \ --checkpoint 'EMs at Stripe' \ --strategy hybrid \ --target-count 10 # Enrich people (B2B) — linkedin_url is best; fallback: name + domain lessie enrich-people \ --people '[{"linkedin_url":"https://www.linkedin.com/in/samaltman/"}]' # Enrich people (B2B) — name + domain fallback lessie enrich-people \ --people '[{"first_name":"Sam","last_name":"Altman","domain":"openai.com"}]' # Enrich people (B2B) — include personal emails lessie enrich-people \ --people '[{"first_name":"Sam","last_name":"Altman","domain":"openai.com"}]' \ --include-personal-emails # Enrich people (KOL) — Twitter/X lessie enrich-people \ --people '[{"twitter_screen_name":"elonmusk"}]' # Enrich people (KOL) — Instagram lessie enrich-people \ --people '[{"instagram_username":"natgeo"}]' # Enrich people (KOL) — TikTok lessie enrich-people \ --people '[{"tiktok_username":"charlidamelio"}]' # Enrich people (KOL) — YouTube lessie enrich-people \ --people '[{"youtube_username":"MrBeast"}]' # Review people — deep-qualify from a previous search lessie review-people \ --search-id 'mcp_xxx' \ --person-ids '["id1","id2"]' \ --checkpoints '[{"key":"Relevance","description":"...","title":"Relevance","category":"career"}]' ``` ### Companies | Tool | CLI command | When to use | |------|-------------|-------------| | `find_organizations` | `lessie find-orgs` | Discover companies by name, keyword, location, size, funding | | `enrich_organization` | `lessie enrich-org` | Get full profile for known company domain(s) — industry, employees, funding, tech stack | | `get_company_job_postings` | `lessie job-postings` | View active job openings (needs `organization_id` from enrich) | | `search_company_news` | `lessie company-news` | Find recent news articles (needs `organization_id` from enrich) | ```bash # Find organizations lessie find-orgs \ --keyword-tags '["AI","SaaS"]' \ --locations '["China"]' \ --employees '["51,200"]' # Enrich organization lessie enrich-org --domains '["stripe.com"]' # Job postings (needs org ID from enrich) lessie job-postings --org-id '5f5e100...' # Company news lessie company-news --org-ids '["5f5e100..."]' ``` ### Web research | Tool | CLI command | When to use | |------|-------------|-------------| | `web_search` | `lessie web-search` | General web search; cached results make follow-up `web_fetch` free | | `web_fetch` | `lessie web-fetch` | Extract specific info from a URL via AI summarization | ```bash # Web search lessie web-search --query 'OpenAI official website' --count 5 # Web fetch lessie web-fetch --url 'https://example.com' --instruction 'Extract job title and company' ``` ## Detailed references - **CLI command examples & MCP calling**: See [references/cli-reference.md](references/cli-reference.md) - **Workflow patterns** (domain resolution, company research, search+qualify): See [references/workflow-patterns.md](references/workflow-patterns.md) - **Domain resolution decision tree**: See [references/domain-resolution.md](references/domain-resolution.md) ## Key constraints - `enrich_people` / `enrich_organization`: max 10 per call; split larger lists into batches - `find_people` / `find_organizations`: paginated — use `--page` for more results - `web_search` caches page content; if a result has `has_content: true`, calling `web_fetch` on that URL is instant - Seniority levels: `owner`, `founder`, `c_suite`, `partner`, `vp`, `head`, `director`, `manager`, `senior`, `entry`, `intern` - For people enrichment, providing `domain` (company domain) alongside name greatly improves match accuracy - CLI output is JSON on stdout, status messages on stderr — parse stdout for data

path: references/workflow-patterns.md
content: # Workflow Patterns

## 1. Search people at a company (company name only, domain unknown)

**Always resolve the company domain first.** Domain accuracy directly determines search quality.

Priority chain: `web_search` result → `enrich_organization` verification → agent knowledge (lowest)

**CLI mode:**
```bash
# Step 1: Find domain
lessie web-search --query 'CompanyName official website' --count 3

# Step 2: Verify domain
lessie enrich-org --domains '["candidate.com"]'

# Step 3: Search people with verified domain
lessie find-people \
  --filter '{"person_titles":["CTO"]}' \
  --checkpoint 'CTOs at CompanyName' \
  --domain '["verified_domain.com"]'
```

**MCP mode:**
1. `web_search("CompanyName official website")` → extract candidate domain
2. `enrich_organization(domains=["candidate.com"])` → verify
3. `find_people(filter={...}, website_domain=["verified_domain"])`

See [domain-resolution.md](domain-resolution.md) for the full decision tree and examples.

**Validation:**
- After Step 2, verify the enriched company name matches the user's intent. If the returned company is different, stop and confirm with the user before proceeding.
- After Step 3, if 0 results → try relaxing filters (remove location or broaden titles). If still 0, the domain may be wrong — go back to Step 1 with alternative search terms.

## 2. Search people at a company (domain already known)

```bash
lessie enrich-org --domains '["stripe.com"]'
lessie find-people --filter '{"person_titles":["Engineer"]}' --checkpoint 'Engineers at Stripe' --domain '["stripe.com"]'
lessie enrich-people --people '[{"first_name":"Jane","last_name":"Doe","domain":"stripe.com"}]'
```

**Validation:**
- If `enrich-org` returns a different primary domain than expected, use the enriched domain for `find-people`.
- If `find-people` returns fewer results than expected, try `--strategy saas_only` or broaden the title filter.

## 3. Research a company

```bash
lessie enrich-org --domains '["openai.com"]'
lessie job-postings --org-id '...'          # from enrich result
lessie company-news --org-ids '["..."]'
lessie find-people --filter '{"person_seniorities":["c_suite"]}' --checkpoint 'OpenAI leadership' --domain '["openai.com"]'
```

**Validation:**
- If `enrich-org` returns no result, fall back to `web_search` + `web_fetch` to gather company info manually.
- If `job-postings` or `company-news` returns empty, inform the user — the company may not have active postings or recent coverage in Lessie's data sources.

## 4. Verify a specific person

```bash
lessie enrich-people --people '[{"first_name":"Sam","last_name":"Altman","domain":"openai.com"}]'
# If no match:
lessie web-search --query 'Sam Altman OpenAI LinkedIn'
lessie web-fetch --url '...' --instruction 'Extract job title, company, and social links'
```

**Validation:**
- Cross-check: if `enrich-people` returns a match, verify the job title and company against the user's expectation. Enrichment data can be stale — if the user says "current CTO" but enrichment shows a different title, flag the discrepancy.
- If both enrichment and web search fail, inform the user the person could not be verified rather than guessing.

## 5. Search + qualify (find → self-judge or review)

1. `lessie find-people --filter '...' --checkpoint '...'` → returns `search_id` and `people`

2. **Triage the results yourself first.** Scan the returned profiles against the user's criteria:
   - **Obviously good** (title/company/location clearly match) → keep directly, no deep review needed
   - **Obviously bad** (wrong industry, wrong country, clearly irrelevant) → discard directly
   - **Ambiguous** (partially matching, unclear fit, need deeper verification) → send to `review_people`

3. Only call review for the ambiguous subset:
   ```bash
   lessie review-people --search-id '...' --person-ids '[...]' --checkpoints '[...]'
   ```
   This runs deep web research per person — takes 1-3 min, so skip it when you can already tell.

**Validation:**
- After triage, present results to the user grouped by confidence level (strong match / needs review / excluded) before running `review_people`, so the user can adjust criteria if needed.
- If `find-people` returns 0 results, do NOT immediately call review. Instead: relax filters (broader titles, remove location), try `--strategy saas_only`, or verify the domain is correct.


path: references/domain-resolution.md
content: # Domain Resolution

When a user mentions a company name without providing its domain, you must resolve the domain before calling `find_people`. An incorrect domain means zero or wrong results.

## Priority chain

1. **`enrich_organization` verified domain** — highest confidence
2. **`web_search` multi-source confirmed domain** — reliable when enrichment has no match
3. **Agent's own knowledge** — lowest priority, only as last resort

## Decision tree

```
User mentions company name
│
├─ Domain already known (e.g. user said "stripe.com")
│   └─ Go directly to enrich_organization → find_people
│
└─ Domain unknown
    │
    ├─ Step 1: web_search("[company] official website")
    │   └─ Extract candidate domain from results
    │
    ├─ Step 2: enrich_organization(domains=["candidate_domain"])
    │   ├─ Found → use the returned domain (may differ from candidate)
    │   └─ Not found → Step 3
    │
    ├─ Step 3: Check web_search results
    │   ├─ Multiple sources agree (official site, LinkedIn, etc.) → use that domain
    │   └─ Ambiguous → ask user to confirm
    │
    └─ Step 4: find_people(website_domain=["resolved_domain"], ...)
```

## Examples

**Scenario A: enrichment returns a different domain**

1. `web_search("Havelsan official website")` → havelsan.com.tr
2. `enrich_organization(domains=["havelsan.com.tr"])` → returns domain: "havelsan.com"
3. Use `havelsan.com` (enrichment result takes precedence)
4. `find_people(website_domain=["havelsan.com"], filter={...})`

**Scenario B: enrichment has no match**

1. `web_search("Havelsan official website")` → havelsan.com.tr
2. `enrich_organization(domains=["havelsan.com.tr"])` → not found
3. Web results consistently point to havelsan.com.tr → adopt it
4. `find_people(website_domain=["havelsan.com.tr"], filter={...})`

## When to skip

For widely recognized domains (google.com, microsoft.com, apple.com), you may skip the full resolution flow and go directly to `enrich_organization` for verification.


path: references/cli-reference.md
content: # CLI Tool Calling Reference

## Command examples

```bash
# Search people
lessie find-people \
  --filter '{"person_titles":["CTO"],"person_locations":["US"]}' \
  --checkpoint 'CTOs at AI startups in the US' \
  --strategy hybrid \
  --target-count 20

# Enrich people (B2B) — linkedin_url is best; fallback: name + domain
lessie enrich-people \
  --people '[{"linkedin_url":"https://www.linkedin.com/in/samaltman/"}]'

# Enrich people (B2B) — name + domain fallback
lessie enrich-people \
  --people '[{"first_name":"Sam","last_name":"Altman","domain":"openai.com"}]'

# Enrich people (B2B) — include personal emails
lessie enrich-people \
  --people '[{"first_name":"Sam","last_name":"Altman","domain":"openai.com"}]' \
  --include-personal-emails

# Enrich people (KOL) — Twitter/X
lessie enrich-people \
  --people '[{"twitter_screen_name":"elonmusk"}]'

# Enrich people (KOL) — Instagram
lessie enrich-people \
  --people '[{"instagram_username":"natgeo"}]'

# Enrich people (KOL) — TikTok
lessie enrich-people \
  --people '[{"tiktok_username":"charlidamelio"}]'

# Enrich people (KOL) — YouTube
lessie enrich-people \
  --people '[{"youtube_username":"MrBeast"}]'

# Review people (from a previous search)
lessie review-people \
  --search-id 'mcp_xxx' \
  --person-ids '["id1","id2"]' \
  --checkpoints '[{"key":"Relevance","description":"...","title":"Relevance","category":"career"}]'

# Find organizations
lessie find-orgs \
  --keyword-tags '["AI","SaaS"]' \
  --locations '["China"]' \
  --employees '["51,200"]'

# Enrich organization
lessie enrich-org --domains '["stripe.com"]'

# Job postings (needs org ID from enrich/search)
lessie job-postings --org-id '5f5e100...'

# Company news
lessie company-news --org-ids '["5f5e100..."]'

# Web search
lessie web-search --query 'OpenAI official website' --count 5

# Web fetch
lessie web-fetch --url 'https://example.com' --instruction 'Extract job title and company'
```

Output is always JSON on stdout. Use `--pretty` for human-readable formatting.

## MCP mode — call via MCP tools

Use `use_lessie(tool="tool_name", arguments={...})` or call remote tools directly if already exposed.

Parameter names are identical to the CLI arguments.

## Generic tool call

`tools` and `call` are the universal fallback for any tool — including shortcuts that fail due to argument changes or server-side updates.

```bash
lessie tools                                    # List all available remote tools with full parameter schemas
lessie call <tool_name> --args '{"key":"val"}'  # Call any tool by name with raw JSON arguments
```

**`lessie tools`** fetches the latest tool list directly from the remote server. Each tool entry includes:
- Tool name (the identifier you pass to `lessie call`)
- Description
- Full input schema (`properties`, `required` fields, types, defaults)

**`lessie call`** bypasses the CLI shortcut commands and sends the arguments directly to the remote tool. This is useful when:
- A shortcut command doesn't exist for a tool
- The remote server has added new tools not yet covered by CLI shortcuts
- You need to pass parameters that the shortcut doesn't expose

### Error recovery: fall back to `tools` + `call`

**When a CLI shortcut command fails 3+ times** (argument errors, schema mismatches, unexpected parameters), stop retrying the shortcut and switch to the generic `tools` + `call` workflow:

1. Run `lessie tools` to fetch the **current** remote tool schema (the server may have updated parameter names or added required fields since the CLI was built).
2. Find the matching tool name (e.g., `find_people` for `lessie find-people`, `web_fetch` for `lessie web-fetch`).
3. Read its `inputSchema` to understand the exact parameter names, types, and required fields.
4. Call it via `lessie call <tool_name> --args '{ ... }'` using the correct schema.

Example:
```bash
# Step 1: Shortcut fails repeatedly
lessie web-fetch --url 'https://...' --instruction '...'
# Error: --url is required. URL to fetch   (3rd failure)

# Step 2: Fall back to tools + call
lessie tools                                    # Check current schema for web_fetch
lessie call web_fetch --args '{"url":"https://...","instruction":"..."}'
```


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)