people-search — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited people-search (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Lessie supports two modes: CLI (default, recommended) and MCP Server.
Install the Lessie CLI binary:
npm install -g @lessie/cliOr use without installing:
npx @lessie/cli --versionFirst-time authorization:
lessie authThis opens a browser for login/registration. Token is cached at ~/.lessie/oauth.json.
Verify connection:
lessie statusAdd to your MCP config (Claude Code ~/.claude.json, Cursor ~/.cursor/mcp.json, Codex ~/.codex/config.toml, etc.):
{
"mcpServers": {
"lessie": {
"command": "npx",
"args": ["-y", "@lessie/mcp-server"],
"env": {
"LESSIE_REMOTE_MCP_URL": "https://app.lessie.ai/mcp-server/mcp"
}
}
}
}npm uninstall -g @lessie/cli && rm -rf ~/.lessie/"lessie" entry from your .json and rm -rf ~/.lessie/Run these checks once at the start of each session, before mode detection. Both checks are non-blocking — if any command fails (network error, timeout), skip silently and proceed.
version field above. curl -sf --max-time 5 https://raw.githubusercontent.com/LessieAI/lessie-skill/main/people-search/SKILL.md | head -5 | grep 'version:' | head -1 | awk '{print $2}'⬆️ A newer version of people-search skill is available ({local} → {remote}). Run this command to update: `` npx skills add LessieAI/lessie-skill -y -g `` lessie --version 2>/dev/null || npx @lessie/cli --version 2>/dev/null npm view @lessie/cli version 2>/dev/null⬆️ A newer version of Lessie CLI is available ({local} → {remote}). Run this command to update: `` npm install -g @lessie/cli ``After setup, try saying to Claude:
Determine which mode to use at the start of each session:
lessie CLI is available: run lessie statusnpm install -g @lessie/clilessie status again to verifyauthorize, use_lessie)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.
lessie status to check token validity.authorized: false → run lessie auth to open browser for login.lessie status again to confirm.authorize to check connection status.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:open "<url>"xdg-open "<url>"start "<url>"authorize again to verify the connection.authorize and retry.Always inform the user before opening the browser — never silently redirect.
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 |
unlock_emails | 3 credits per newly unlocked person (current rate; check price_per_unlock in the response for the live value). Already-unlocked persons (across any of your prior searches) are free. Failed lookups not charged |
unlock_email_by_handle | 3 credits per successful unlock (current rate; check price_per_unlock in the response for the live value). not_found and failed are free. Not idempotent — re-running on the same handle re-charges |
unlock_phones | 3 credits per newly unlocked person (current rate; check price_per_unlock in the response). Already-unlocked persons across any of your prior searches are free. non_unlockable / failed not charged. Same per-user idempotency contract as unlock_emails |
unlock_phone_by_handle | 3 credits per successful unlock (current rate). Only platform="linkedin" actually resolves — other platforms return not_found with reason="unsupported_platform" and are free. Not idempotent for the same (linkedin, handle) pair |
Before executing any command, you MUST:
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.
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:
Usedweb-search+enrich-org, cost 2 credits total.
Before executing any `lessie` CLI command for the first time in a session, you MUST read references/cli-reference.md to learn the exact parameter syntax. Each tool has its own flag set — find-people takes --query (NL), enrich-people takes --people (JSON), unlock-emails / unlock-phones take --search-id + --person-ids, unlock-email-by-handle / unlock-phone-by-handle take --handles, etc. Don't guess — read the section for the tool you're about to call.
Lessie supports two search modes with different data sources and result types:
When the user's intent is ambiguous — i.e., the query could reasonably target either professionals on LinkedIn or creators on social media — you MUST ask the user to clarify before searching. Present both options concisely:
Example ambiguous query: "Find individuals who have hands-on experience with brain-monitoring sleep devices to share their insights."
This could mean:
Ask: "This could be LinkedIn professionals (PMs, engineers at sleep-tech companies) or social media creators who review sleep devices. Which direction do you prefer — or both?"
When intent is clear, proceed directly:
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:
| Tool | CLI command | When to use |
|---|---|---|
find_people | lessie find-people | Discover people via a natural-language task. Pass the user's request verbatim through --query. The agent picks sources (B2B / KOL / web), keywords, and stops automatically. Hard cap: 3 tool calls + 60s budget per request. If the response has partial: true, the agent hit the budget — results are what it gathered before timeout |
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 |
| Tool | CLI command | When to use |
|---|---|---|
unlock_emails | lessie unlock-emails | Unlock email addresses for people from a previous find_people result. Per-user idempotent: people you've already unlocked (in any search) cost 0. Takes search_id + person_ids (1–50) |
unlock_email_by_handle | lessie unlock-email-by-handle | Unlock email by an explicit (platform, handle), without a prior search. Takes a list of {platform, handle} (1–10). NOT idempotent — repeat calls on the same handle re-charge. Use only when the handle isn't in any find_people you've run |
unlock_phones | lessie unlock-phones | Unlock company phone numbers for people from a previous find_people result. Same per-user idempotency contract as unlock_emails — already-unlocked people cost 0. Takes search_id + person_ids (1–50) |
unlock_phone_by_handle | lessie unlock-phone-by-handle | Unlock phone by an explicit (platform, handle), without a prior search. Only `linkedin` resolves — other platforms return not_found with reason="unsupported_platform" and aren't charged. NOT idempotent. Takes a list of {platform, handle} (1–10) |
Decision rules:
unlock_emails and unlock_phones are independent — calling both for the same person charges both rates. Don't unlock the phone if the user only wants emailfind_people result → use unlock_emails / unlock_phones (re-unlocks are free). If you got the handle from outside lessie (a LinkedIn URL the user pasted, a manual mention, etc.) → use unlock_email_by_handle / unlock_phone_by_handleunlock_phone_by_handle with a Twitter / Instagram / TikTok / YouTube handle will return not_found (with reason="unsupported_platform"), free of charge. Tell the user up-front rather than appearing to "try and fail"| 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) |
| 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 |
enrich_people / enrich_organization: max 10 per call; split larger lists into batchesfind_people: hard ceiling of 3 tool calls + 60s wall-clock budget per request. target_count 1-100 (default 30). NOT paginated — if you need more, run a new call with a different queryfind_organizations: paginated — use --page for more resultsweb_search caches page content; if a result has has_content: true, calling web_fetch on that URL is instantfind-people query: seniority terms (owner, founder, c_suite, partner, vp, head, director, manager, senior, entry, intern) and current vs past to bias employment recency. The agent uses these directly as filtersdomain (company domain) alongside name greatly improves match accuracy~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.