Parallel CLI
One interface for Parallel web data work: extract, deep research, enrichment, findall, memory, and monitor. CLI-backed workflows require parallel-cli installed, authenticated, and funded; the search routing below avoids the CLI where possible.
Routing: MCP first, CLI for depth
- General web search, quick lookups, fact-checks: use the
parallel-search MCP server (web_search) when it is configured. It is free. Do not call parallel-cli search for these. For current official facts (framework/library/API documentation), prefer the harness's native web search per repo convention. When the MCP server is absent, use the harness's native web search, or fall back to parallel-cli search.
- Escalate to
parallel-cli search only when MCP is insufficient: --mode advanced for hard multi-step questions, --after-date freshness, --include-domains / --exclude-domains, --location geo-targeting, or high-volume batch queries.
- URL content extraction:
parallel-cli extract (cleaner than MCP web_fetch for PDFs, JS-heavy pages, and long articles).
- Deep/exhaustive research (user says "deep", "exhaustive", "comprehensive report", "thorough investigation"): prefer the repository's
deep-researcher skill for deep cited research when available (repo convention); research run + poll is the engine and the route when deep-researcher is unavailable.
- Structured entity lists ("find all X", "list every Y"):
findall. Add fields to a list you already have: enrich.
- Recall prior runs:
memory. Continuous change tracking: monitor.
- Do not use the parallel-task MCP for research or enrichment; the CLI is the tool of record.
Setup
Check and install, requiring parallel-cli >= 0.8.1:
command -v parallel-cli && parallel-cli --version
# install: brew install parallel-web/tap/parallel-cli (macOS)
# uv tool install "parallel-web-tools[cli]" (pipx: pipx install "parallel-web-tools[cli]" && pipx ensurepath)
# npm install -g parallel-web-cli
# upgrade by install method: parallel-cli update | uv tool upgrade "parallel-web-tools[cli]" | pipx upgrade parallel-web-tools | npm update -g parallel-web-cli | brew update && brew upgrade parallel-web/tap/parallel-cli
When the CLI is present but old, detect the install method before upgrading:
command -v parallel-cli, then readlink "$(command -v parallel-cli)" if it is a symlink. Paths under ~/.local/share/uv/tools/ mean uv tool install; paths under ~/.local/share/parallel-cli/ mean the standalone installer (use parallel-cli update only for standalone installs).
Authenticate if parallel-cli auth --json shows "authenticated": false or "selected_org_id": "legacy":
parallel-cli login --json # add --no-browser in headless sessions
This triggers device OAuth. Wait for {"event": "auth_success"}. Then check balance: parallel-cli balance --json get. If zero, ask the user before running parallel-cli balance add <AMOUNT_IN_CENTS>. A 403 on any command usually means balance is required; offer balance --json get and ask before topping up.
Common execution rules
- Prefer writing results to disk with
-o "/tmp/<descriptive>.json" and reading that file over parsing stdout. Large JSON floods or truncates tool output.
- Do NOT pass
--json to poll commands; it floods context. -o saves results to disk.
- Use
--timeout 540 (9 minutes) on polls to stay within tool execution limits.
- Cite only URLs that appear in command output. Never invent or guess URLs.
- After any run, tell the user the output file path so they can ask follow-ups.
Workflows
Extract: URL content
parallel-cli extract "https://example.com/article" --json -o "/tmp/<name>.json"
Options: --objective "focus area", -q "keyword" (repeatable), --full-content (complete page body; also retry with this when excerpts come back empty), --no-excerpts, --session-id to group related search/extract calls. Use --full-content when the user asks for a complete page or long-article reproduction; without it the result reflects the excerpt output. On failure (errors field, empty results, 404/timeout), do NOT fabricate content: report the failure, suggest verifying the URL, retrying with --full-content, or locating the current URL via search.
Present the result as Page Title with its URL, followed by the extracted content: preserve every numbered/bulleted item, fact, name, number, date, and quote in the returned content, and reproduce the full page verbatim only when --full-content was requested; strip only obvious noise (nav menus, footers, ads).
Deep research
parallel-cli research run "<topic>" --processor pro-fast --text --no-wait --json
parallel-cli research poll "<RUN_ID>" -o "/tmp/<name>" --timeout 540
parallel-cli research status "<RUN_ID>" --json # quick status check
--text returns a markdown report with inline citations; --text-description steers length/focus. Drop --text for structured JSON.
--no-wait is required on run; the call returns instantly with {run_id, interaction_id, result_url, processor, status, output_schema}. Share the result_url for monitoring and the expected latency, and delegate the poll (see Delegation).
- Default processor
pro-fast; follow-ups reuse the prior interaction_id via --previous-interaction-id with a lighter tier (lite-fast). -fast tiers use cached data; non--fast tiers re-fetch fresher data for very recent events. See the reference for the full processor table.
- Poll writes
<name>.json always, plus <name>.md when run used --text. On timeout, re-run the same poll. After completion: share the executive summary printed to stdout, the file paths, and the interaction_id. Do NOT re-share the monitoring URL. Do NOT read the result files into context unless asked.
- Pass
--memory-scope-key to scope research to a workspace.
Enrichment
parallel-cli enrich suggest "Find CEO and recent funding info" --json # optional: columns + processor recommendation
parallel-cli enrich run --data '[{"company": "Google"}, {"company": "Microsoft"}]' --intent "CEO name and founding year" --target "/tmp/enrichment-<name>.csv" --no-wait --json
parallel-cli enrich poll "<TASKGROUP_ID>" --timeout 540 --output "/tmp/enrichment-<name>.json"
- CSV source:
--source-type csv --source "input.csv" --target "/tmp/enrichment-<name>.csv" --source-columns '[{"name": "company", "description": "Company name"}]'.
--target is syntactically required on enrich run even though --no-wait polling writes the real results through poll --output.
- Use
--enriched-columns (array from suggest, in place of --intent) when the user gave a vague intent.
- Output envelope:
{taskgroup_id, url, num_runs}; there is no interaction_id. Tell the user enrichment is running and share the url, then delegate the poll.
- Output is a JSON array of
{input, output} objects regardless of file extension. Report row count, preview a few rows, give the path.
FindAll: entity discovery
parallel-cli findall run "<objective>" -n 50 --no-wait --json # comprehensive; explicit -n (default 10)
parallel-cli findall poll "<FINDALL_ID>" -o "/tmp/<name>.json" --timeout 540
parallel-cli findall entity-search "<objective>" -t companies -n 100 -o "/tmp/<name>.json" # fast, throwaway lists only
parallel-cli findall enrich "<FINDALL_ID>" '{"properties":{"ceo":{"type":"string"}}}' # add fields
parallel-cli findall extend "<FINDALL_ID>" 50 # more matches
parallel-cli findall ingest "<objective>" --json # preview inferred schema before paying for a run
findall run defaults: generator core, match limit 10. For "find all X" / "list every Y" requests, set -n explicitly (5-1000, e.g. -n 50) so the result matches the requested completeness. -g pro for comprehensive coverage, -g base only when the user accepts noise. Exclusions: --exclude '[{"name":"Google","url":"google.com"}]'.
entity-search is synchronous, companies/people only, no exclusions/enrichment, and its entity_set_id cannot be used with enrich/extend. Use only when the user explicitly wants a fast, rough list.
- Filter noise before presenting: drop entries with empty/missing
url, names that echo the query, and third-party directory/profile URLs (entity-search's directory links are expected; keep them). Sanity-check -g base matches against source URLs for falsifiable criteria.
- Present matches as a markdown table, lead with the count, cite each entity's URL.
Memory
parallel-cli memory retrieve --query "serverless inference vendors" # topic recall
parallel-cli memory retrieve --limit 5 # recent runs
parallel-cli memory evict --kind task --id "trun_example"
parallel-cli memory clear --confirm-clear
- Recall prior Task, Monitor, or FindAll runs before launching overlapping work; fetch the source run for full records. Empty
results is a successful miss, not an error.
- On a memory-eligibility error, report the returned reason: it distinguishes rollout, organization settings, account opt-in, and key eligibility. On a key-eligibility error, tell the user to reauthenticate.
- Fields vary by kind:
task uses id/updated_at/input_excerpt/output_excerpt; monitor uses event excerpts; findall uses objective excerpt and matched_count.
- Evicting/clearing only affects Memory, not the underlying runs. Confirm before
clear unless already asked. Ingestion is asynchronous; a just-completed run may not be retrievable yet.
Monitor
parallel-cli monitor create "<query>" --frequency 1d --json # 1h|1d|1w or daily/weekly; --webhook URL optional
parallel-cli monitor list -n 10 --json
parallel-cli monitor events "<MONITOR_ID>" --json # --cursor pages; --event-group-id for full payload
parallel-cli monitor get "<MONITOR_ID>" --json
parallel-cli monitor update "<MONITOR_ID>" --frequency 1w --json
parallel-cli monitor trigger "<MONITOR_ID>" --json # one real off-schedule run
parallel-cli monitor cancel "<MONITOR_ID>" --json # always confirm; irreversible
- Monitors are server-side, persist until cancelled, and can deliver events via
--webhook. The query cannot be updated; create a new monitor instead.
- Match frequency to change rate: hourly for prices/news, weekly for filings/staffing.
Delegation
Long-running work (research poll, enrich poll, findall poll) should run in a background subagent with a self-contained prompt: the exact command, the output file path, and the instruction to return only the executive summary and file paths, never inventing URLs. Spawn per harness:
opencode: task subagent on opencode-go/deepseek-v4-flash or luna high/max, with Bash access only.
Codex: spawn a fresh thread via codex exec (the native multi_agent_v2 tool does not support luna), launched in the background, writing results to a writable path:
codex exec -C "<repo>" -m gpt-5.6-luna -c model_reasoning_effort="max" --sandbox workspace-write --output-last-message "/tmp/codex-out.md" "<self-contained prompt>" &
# follow-ups: codex exec resume --last "<instruction>"
The prompt must name the exact parallel-cli ... -o "/tmp/<name>.json" command; the thread needs workspace-write so its -o writes succeed.
Claude Code: subagent with pinned model and effort, tools: Bash, bounded maxTurns, dispatched via Task. Prefer a model: inherit-free pin per the repo routing matrix.
Kimi Code: Agent tool spawn with subagent_type: coder (or explore for read-only), with a model override where the harness router supports one. UNVERIFIED: luna wiring depends on the local Kimi provider/alias configuration.
Reference
Workflow reference, processor table, JSON envelopes, and version gates: references/parallel-cli-reference.md.
1---2name: parallel-cli3description: Use the Parallel CLI for web data work: URL extraction, deep research, data enrichment, entity discovery (findall), memory recall, and web monitoring. Web search goes to the parallel-search MCP server (free); escalate to `parallel-cli search` only when MCP is insufficient. Use for deep research, exhaustive investigation, extracting full content from URLs, enriching lists, finding entities, recalling prior runs, tracking web changes, and CLI setup/auth/balance.4license: MIT5---67# Parallel CLI89One interface for Parallel web data work: extract, deep research, enrichment, findall, memory, and monitor. CLI-backed workflows require `parallel-cli` installed, authenticated, and funded; the search routing below avoids the CLI where possible.1011## Routing: MCP first, CLI for depth1213- **General web search, quick lookups, fact-checks**: use the `parallel-search` MCP server (`web_search`) when it is configured. It is free. Do not call `parallel-cli search` for these. For current official facts (framework/library/API documentation), prefer the harness's native web search per repo convention. When the MCP server is absent, use the harness's native web search, or fall back to `parallel-cli search`.14- Escalate to `parallel-cli search` only when MCP is insufficient: `--mode advanced` for hard multi-step questions, `--after-date` freshness, `--include-domains` / `--exclude-domains`, `--location` geo-targeting, or high-volume batch queries.15- **URL content extraction**: `parallel-cli extract` (cleaner than MCP `web_fetch` for PDFs, JS-heavy pages, and long articles).16- **Deep/exhaustive research** (user says "deep", "exhaustive", "comprehensive report", "thorough investigation"): prefer the repository's `deep-researcher` skill for deep cited research when available (repo convention); `research run` + `poll` is the engine and the route when `deep-researcher` is unavailable.17- **Structured entity lists** ("find all X", "list every Y"): `findall`. **Add fields to a list you already have**: `enrich`.18- **Recall prior runs**: `memory`. **Continuous change tracking**: `monitor`.19- Do not use the parallel-task MCP for research or enrichment; the CLI is the tool of record.2021## Setup2223Check and install, requiring `parallel-cli >= 0.8.1`:2425```bash26command -v parallel-cli && parallel-cli --version27# install: brew install parallel-web/tap/parallel-cli (macOS)28# uv tool install "parallel-web-tools[cli]" (pipx: pipx install "parallel-web-tools[cli]" && pipx ensurepath)29# npm install -g parallel-web-cli30# upgrade by install method: parallel-cli update | uv tool upgrade "parallel-web-tools[cli]" | pipx upgrade parallel-web-tools | npm update -g parallel-web-cli | brew update && brew upgrade parallel-web/tap/parallel-cli31```3233When the CLI is present but old, detect the install method before upgrading:34`command -v parallel-cli`, then `readlink "$(command -v parallel-cli)"` if it is a symlink. Paths under `~/.local/share/uv/tools/` mean `uv tool install`; paths under `~/.local/share/parallel-cli/` mean the standalone installer (use `parallel-cli update` only for standalone installs).3536Authenticate if `parallel-cli auth --json` shows `"authenticated": false` or `"selected_org_id": "legacy"`:3738```bash39parallel-cli login --json # add --no-browser in headless sessions40```4142This triggers device OAuth. Wait for `{"event": "auth_success"}`. Then check balance: `parallel-cli balance --json get`. If zero, ask the user before running `parallel-cli balance add <AMOUNT_IN_CENTS>`. A `403` on any command usually means balance is required; offer `balance --json get` and ask before topping up.4344## Common execution rules4546- Prefer writing results to disk with `-o "/tmp/<descriptive>.json"` and reading that file over parsing stdout. Large JSON floods or truncates tool output.47- Do NOT pass `--json` to poll commands; it floods context. `-o` saves results to disk.48- Use `--timeout 540` (9 minutes) on polls to stay within tool execution limits.49- Cite only URLs that appear in command output. Never invent or guess URLs.50- After any run, tell the user the output file path so they can ask follow-ups.5152## Workflows5354### Extract: URL content5556```bash57parallel-cli extract "https://example.com/article" --json -o "/tmp/<name>.json"58```5960Options: `--objective "focus area"`, `-q "keyword"` (repeatable), `--full-content` (complete page body; also retry with this when excerpts come back empty), `--no-excerpts`, `--session-id` to group related search/extract calls. Use `--full-content` when the user asks for a complete page or long-article reproduction; without it the result reflects the excerpt output. On failure (errors field, empty results, 404/timeout), do NOT fabricate content: report the failure, suggest verifying the URL, retrying with `--full-content`, or locating the current URL via search.6162Present the result as **Page Title** with its URL, followed by the extracted content: preserve every numbered/bulleted item, fact, name, number, date, and quote in the returned content, and reproduce the full page verbatim only when `--full-content` was requested; strip only obvious noise (nav menus, footers, ads).6364### Deep research6566```bash67parallel-cli research run "<topic>" --processor pro-fast --text --no-wait --json68parallel-cli research poll "<RUN_ID>" -o "/tmp/<name>" --timeout 54069parallel-cli research status "<RUN_ID>" --json # quick status check70```7172- `--text` returns a markdown report with inline citations; `--text-description` steers length/focus. Drop `--text` for structured JSON.73- `--no-wait` is required on `run`; the call returns instantly with `{run_id, interaction_id, result_url, processor, status, output_schema}`. Share the `result_url` for monitoring and the expected latency, and delegate the poll (see Delegation).74- Default processor `pro-fast`; follow-ups reuse the prior `interaction_id` via `--previous-interaction-id` with a lighter tier (`lite-fast`). `-fast` tiers use cached data; non-`-fast` tiers re-fetch fresher data for very recent events. See the reference for the full processor table.75- Poll writes `<name>.json` always, plus `<name>.md` when `run` used `--text`. On timeout, re-run the same poll. After completion: share the executive summary printed to stdout, the file paths, and the `interaction_id`. Do NOT re-share the monitoring URL. Do NOT read the result files into context unless asked.76- Pass `--memory-scope-key` to scope research to a workspace.7778### Enrichment7980```bash81parallel-cli enrich suggest "Find CEO and recent funding info" --json # optional: columns + processor recommendation82parallel-cli enrich run --data '[{"company": "Google"}, {"company": "Microsoft"}]' --intent "CEO name and founding year" --target "/tmp/enrichment-<name>.csv" --no-wait --json83parallel-cli enrich poll "<TASKGROUP_ID>" --timeout 540 --output "/tmp/enrichment-<name>.json"84```8586- CSV source: `--source-type csv --source "input.csv" --target "/tmp/enrichment-<name>.csv" --source-columns '[{"name": "company", "description": "Company name"}]'`.87- `--target` is syntactically required on `enrich run` even though `--no-wait` polling writes the real results through `poll --output`.88- Use `--enriched-columns` (array from `suggest`, in place of `--intent`) when the user gave a vague intent.89- Output envelope: `{taskgroup_id, url, num_runs}`; there is no `interaction_id`. Tell the user enrichment is running and share the `url`, then delegate the poll.90- Output is a JSON array of `{input, output}` objects regardless of file extension. Report row count, preview a few rows, give the path.9192### FindAll: entity discovery9394```bash95parallel-cli findall run "<objective>" -n 50 --no-wait --json # comprehensive; explicit -n (default 10)96parallel-cli findall poll "<FINDALL_ID>" -o "/tmp/<name>.json" --timeout 54097parallel-cli findall entity-search "<objective>" -t companies -n 100 -o "/tmp/<name>.json" # fast, throwaway lists only98parallel-cli findall enrich "<FINDALL_ID>" '{"properties":{"ceo":{"type":"string"}}}' # add fields99parallel-cli findall extend "<FINDALL_ID>" 50 # more matches100parallel-cli findall ingest "<objective>" --json # preview inferred schema before paying for a run101```102103- `findall run` defaults: generator `core`, match limit `10`. For "find all X" / "list every Y" requests, set `-n` explicitly (5-1000, e.g. `-n 50`) so the result matches the requested completeness. `-g pro` for comprehensive coverage, `-g base` only when the user accepts noise. Exclusions: `--exclude '[{"name":"Google","url":"google.com"}]'`.104- `entity-search` is synchronous, companies/people only, no exclusions/enrichment, and its `entity_set_id` cannot be used with `enrich`/`extend`. Use only when the user explicitly wants a fast, rough list.105- Filter noise before presenting: drop entries with empty/missing `url`, names that echo the query, and third-party directory/profile URLs (entity-search's directory links are expected; keep them). Sanity-check `-g base` matches against source URLs for falsifiable criteria.106- Present matches as a markdown table, lead with the count, cite each entity's URL.107108### Memory109110```bash111parallel-cli memory retrieve --query "serverless inference vendors" # topic recall112parallel-cli memory retrieve --limit 5 # recent runs113parallel-cli memory evict --kind task --id "trun_example"114parallel-cli memory clear --confirm-clear115```116117- Recall prior Task, Monitor, or FindAll runs before launching overlapping work; fetch the source run for full records. Empty `results` is a successful miss, not an error.118- On a memory-eligibility error, report the returned reason: it distinguishes rollout, organization settings, account opt-in, and key eligibility. On a key-eligibility error, tell the user to reauthenticate.119- Fields vary by kind: `task` uses `id/updated_at/input_excerpt/output_excerpt`; `monitor` uses event excerpts; `findall` uses objective excerpt and `matched_count`.120- Evicting/clearing only affects Memory, not the underlying runs. Confirm before `clear` unless already asked. Ingestion is asynchronous; a just-completed run may not be retrievable yet.121122### Monitor123124```bash125parallel-cli monitor create "<query>" --frequency 1d --json # 1h|1d|1w or daily/weekly; --webhook URL optional126parallel-cli monitor list -n 10 --json127parallel-cli monitor events "<MONITOR_ID>" --json # --cursor pages; --event-group-id for full payload128parallel-cli monitor get "<MONITOR_ID>" --json129parallel-cli monitor update "<MONITOR_ID>" --frequency 1w --json130parallel-cli monitor trigger "<MONITOR_ID>" --json # one real off-schedule run131parallel-cli monitor cancel "<MONITOR_ID>" --json # always confirm; irreversible132```133134- Monitors are server-side, persist until cancelled, and can deliver events via `--webhook`. The query cannot be updated; create a new monitor instead.135- Match frequency to change rate: hourly for prices/news, weekly for filings/staffing.136137## Delegation138139Long-running work (research poll, enrich poll, findall poll) should run in a background subagent with a self-contained prompt: the exact command, the output file path, and the instruction to return only the executive summary and file paths, never inventing URLs. Spawn per harness:140141- **opencode**: `task` subagent on `opencode-go/deepseek-v4-flash` or luna `high`/`max`, with Bash access only.142- **Codex**: spawn a fresh thread via `codex exec` (the native multi_agent_v2 tool does not support luna), launched in the background, writing results to a writable path:143144 ```bash145 codex exec -C "<repo>" -m gpt-5.6-luna -c model_reasoning_effort="max" --sandbox workspace-write --output-last-message "/tmp/codex-out.md" "<self-contained prompt>" &146 # follow-ups: codex exec resume --last "<instruction>"147 ```148149 The prompt must name the exact `parallel-cli ... -o "/tmp/<name>.json"` command; the thread needs `workspace-write` so its `-o` writes succeed.150- **Claude Code**: subagent with pinned `model` and `effort`, `tools: Bash`, bounded `maxTurns`, dispatched via Task. Prefer a `model: inherit`-free pin per the repo routing matrix.151- **Kimi Code**: `Agent` tool spawn with `subagent_type: coder` (or `explore` for read-only), with a model override where the harness router supports one. UNVERIFIED: luna wiring depends on the local Kimi provider/alias configuration.152153## Reference154155Workflow reference, processor table, JSON envelopes, and version gates: `references/parallel-cli-reference.md`.