Vibe Prospecting CLI
Use the CLI: npx @vibeprospecting/vpai@latest. Treat every tool response as JSON.
Cowork mode: always use this connector flow. Before doing any work in Cowork mode, check whether the Vibe Prospecting MCP connector tools are available in your tool list (look for a tool matching the pattern mcp__*__fetch-entities).
If those tools are present, use the connector directly and follow its tool descriptions and schemas. If those tools are NOT present:
- Call
mcp__mcp-registry__search_mcp_registrywith keywords["vibe prospecting", "explorium"] - Call
mcp__mcp-registry__suggest_connectorswith the UUID1bdcb159-b6f0-4f13-bc08-fdb40b007828and keywords["prospecting"] - Tell the user to click Connect on the card — the tools unlock automatically once authorized
- Poll until connected. On every subsequent turn, re-check your tool list for
mcp__*__fetch-entities. Do not start prospecting work until those tools appear. Never fall back to the CLI, the npmvpaitool, or an OAuth URL in Cowork mode — the Cowork connector store is the only path. If the user cannot connect from the suggested card, tell them to open the connector store and install Vibe Prospecting from there, then poll again. If tools are still missing, remind the user to connect and wait; repeat until the connector is available.
If the CLI does not work outside Cowork mode (e.g. npx unavailable, sandboxed environment, permission denied), and the user's agent environment supports connectors, suggest the Vibe Prospecting connector to the user. The rest of this file is CLI-only. In Cowork mode, use the connector store flow above.
Hard Rules
- Sample first, always. Run the COMPLETE workflow on exactly 5 entities (
--number-of-results 5) before any full run. That cap is a quality gate only: Explorium can match many more rows for the same filters. Never describe those 5 rows as the full dataset, "all results," or "what the database has." Show the sample, state clearly that it is a preview and the index has more, then after explicit approval re-run the same CLI tool(s) you used in the sample chain with full-scale parameters (same--args, session, and filters; raise caps such as--number-of-resultsto the user's real target where that flag applies). Runfetch-entities-statisticsonly when all of your discoveryfetch-entitiesfilters (and any supported scope flags) are valid for statistics too — see rule 8. Never auto-export. "Find 100" still means sample 5 first, then scale up after approval. --tool-reasoning '<user wording>'on every real call. Use the user's request verbatim. Reuse across the whole workflow. Skip ONLY when running<tool> --all-parameterswith no--args.- Chain via session DB, never paste IDs. Each step prints
session_id,db_path, andtable_name. Pass--session-idwith thesession_idfrom the prior JSON output so the next command uses the same SQLite session store. With--session-id,--table-nameis required forenrich-business,enrich-prospects,fetch-businesses-events, andfetch-prospects-events— pass the prior step'stable_nameexactly. Formatch-*only,--table-nameis optional (CLI can pick the first table with the right ID column when omitted). Forfetch-entitiesprospects scoped to earlier companies, use--businesses-table-nameplus--session-id. --csvonly on the final step. Intermediate steps emit JSON for chaining. Add--csvonce, at the end.autocompletefirst for:naics_category,linkedin_category,company_tech_stack_tech,job_title,business_intent_topics,city_region. Use returned standardized values, not raw user wording.- Never invent tool parameters. Before the first
--argsexecution of each distinct tool in a workflow, runnpx @vibeprospecting/vpai@latest <tool> --all-parametersfor that tool (once per tool per task unless you already printed its schema earlier in the same workflow). That command prints one JSON object to stdout:name,description, andinputSchema(the tool input JSON Schema). Do this even when the planned call matches the examples and you are not uncertain—examples can drift; the printed schema is authoritative. Run--all-parametersagain if you change tools, filters, or shapes materially, or if anything still feels ambiguous. You may use examples and reference docs as shortcuts only after they align with that live schema. Build--argsonly from fields and shapes confirmed byinputSchemafrom--all-parameters(and examples when they match it). --session-idis a CLI flag (not inside--args). Use thesession_idvalue returned by the MCP in each prior step's JSON. Omit only on the first call in a chain.fetch-entities-statisticsonly when stats supports the full fetch. Compare your plannedfetch-entitiespayload to the input schema fromfetch-entities-statistics --all-parameters. Call statistics only if every filter key, value shape,entity_type, and any scope you rely on (e.g.--session-id/--businesses-table-name) is accepted by the statistics tool the same way it is forfetch-entities. If any part of the discovery query is missing from the stats schema, unsupported, or would require a different shape, skip stats — do not call it with a partial or guessed subset. When you do call it, reuse the same--argsfilter object (and supported flags) asfetch-entities, plus--tool-reasoning. Prefer running stats before presenting the sample so you can headline 5 of [total] when the response includes a usable count. When you did not run statistics (or stats had no usable total), present Sample preview (5 rows) and tell the user Explorium has much more matching the same filters—do not quote how many remain, do not say statistics failed or a total was unavailable, and never invent a number. Call stats again before a full-scale fetch if filters or scope changed and the full fetch filter set still fits statistics.
Auth
If the mount fails or config.json is missing, follow login.md [blocked].
Sample Gate
The sample is the complete workflow on 5 entities, not a fetch preview.
Universe vs sample: The 5 rows are a small fixed preview so the user can validate filters and enrichment before spending quota. The underlying match set is typically much larger (often thousands or more). Do not equate "we returned 5" with "only 5 exist." Ground volume with fetch-entities-statistics only when the entire planned fetch-entities filter set is valid for stats (rule 8); never guess a total.
- When the full fetch filter set is supported by statistics, run
fetch-entities-statisticswith the same discoveryentity_type,filters, and supported CLI flags as the upcomingfetch-entities(per rule 8). Otherwise skip stats; still tell the user Explorium has much more for the same filters (no numeric total, no mention of statistics gaps). - Fetch exactly 5 (
--number-of-results 5). - Run every subsequent step (
match-*,enrich-*,fetch-*-events) on those 5. - Show the fully enriched final rows as a markdown table with all useful columns.
- Stop. Wait for approval in a new message. Then run at full scale.
NEVER stop after the fetch to ask for approval. Complete the full chain on 5 first.
Example — user says "find 100 Israeli companies, get 30 CEOs, find contact info":
- WRONG: fetch 5 companies → show table → ask "continue?"
- RIGHT: when the full
fetch-entitiesfilter set is supported byfetch-entities-statistics, run stats first (same--argsfilters) → fetch 5 companies → fetch CEOs at those 5 → enrich CEOs with contacts → show final table (5 of [total] when stats gave a total; otherwise Sample preview (5 rows) plus a short line that much more matches exist for these filters—no count, no stats apology) → ask "run full 100?"
Presenting the sample
Always frame the table as a sample, not the full population.
- When statistics returned a usable total (you only called stats because every
fetch-entitiesfilter was valid forfetch-entities-statistics): Sample preview (5 of [total] matches) — [total] must come fromfetch-entities-statistics, never from counting the 5 rows. - When you did not use a numeric total (no stats, or no usable total): Sample preview (5 rows) and one plain sentence that Explorium has much more matching these filters—do not say how many more, do not mention statistics or missing totals, never invent [total].
Results Found: [X] [entity type] from [Y] [companies/sources] [qualifier] (optional context line)
Headline: Sample preview (5 of [total] matches): only with a stats-backed [total]; otherwise Sample preview (5 rows): then a single framing line that much more records exist for the same filters (qualitative only).
End with an explicit next step, for example: After you confirm, I will re-run the same tool(s) with full-scale limits (e.g. --number-of-results [user's N] where you used fetch-entities) to pull the real batch.
When the preview is a subset of what the user asked for (more rows or fields available at scale), add:
- With a stats-backed [total]:
More data available: Preview shows [n] of [total]. Confirm before I run the full export. - Without a numeric [total]: say the preview is five rows, much more exists in Explorium for the same filters, and ask to confirm a full export—do not give a remaining count or mention why no total was shown.
Do not mention export when everything the user asked for is already in chat.
Before the full export, confirm
- Export size (cap on records).
- Filter narrowing: industry, size, revenue, region, tech.
- For prospects: title variants, dedupe by company.
- For contacts: professional emails only or also personal/phones.
Workflow
Reference docs:
autocomplete.md[blocked] — controlled-vocab lookupsfetch.md[blocked] —fetch-entities,fetch-*-eventsmatch.md[blocked] — resolve known entities to IDsenrich.md[blocked] — enrichment after IDsfetch-stats.md[blocked] — counts and market sizinglogin.md[blocked] — auth fallback flow
Flags
Filter Pattern
Limits
Common Workflows
Replace SESSION_ID with the session_id from the previous step.

