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-searchMCP server (web_search) when it is configured. It is free. Do not callparallel-cli searchfor 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 toparallel-cli search. - Escalate to
parallel-cli searchonly when MCP is insufficient:--mode advancedfor hard multi-step questions,--after-datefreshness,--include-domains/--exclude-domains,--locationgeo-targeting, or high-volume batch queries. - URL content extraction:
parallel-cli extract(cleaner than MCPweb_fetchfor PDFs, JS-heavy pages, and long articles). - Deep/exhaustive research (user says "deep", "exhaustive", "comprehensive report", "thorough investigation"): prefer the repository's
deep-researcherskill for deep cited research when available (repo convention);research run+pollis the engine and the route whendeep-researcheris 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
--jsonto poll commands; it floods context.-osaves 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
--textreturns a markdown report with inline citations;--text-descriptionsteers length/focus. Drop--textfor structured JSON.--no-waitis required onrun; the call returns instantly with{run_id, interaction_id, result_url, processor, status, output_schema}. Share theresult_urlfor monitoring and the expected latency, and delegate the poll (see Delegation).- Default processor
pro-fast; follow-ups reuse the priorinteraction_idvia--previous-interaction-idwith a lighter tier (lite-fast).-fasttiers use cached data; non--fasttiers re-fetch fresher data for very recent events. See the reference for the full processor table. - Poll writes
<name>.jsonalways, plus<name>.mdwhenrunused--text. On timeout, re-run the same poll. After completion: share the executive summary printed to stdout, the file paths, and theinteraction_id. Do NOT re-share the monitoring URL. Do NOT read the result files into context unless asked. - Pass
--memory-scope-keyto 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"}]'. --targetis syntactically required onenrich runeven though--no-waitpolling writes the real results throughpoll --output.- Use
--enriched-columns(array fromsuggest, in place of--intent) when the user gave a vague intent. - Output envelope:
{taskgroup_id, url, num_runs}; there is nointeraction_id. Tell the user enrichment is running and share theurl, 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 rundefaults: generatorcore, match limit10. For "find all X" / "list every Y" requests, set-nexplicitly (5-1000, e.g.-n 50) so the result matches the requested completeness.-g profor comprehensive coverage,-g baseonly when the user accepts noise. Exclusions:--exclude '[{"name":"Google","url":"google.com"}]'.entity-searchis synchronous, companies/people only, no exclusions/enrichment, and itsentity_set_idcannot be used withenrich/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 basematches 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
resultsis 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:
taskusesid/updated_at/input_excerpt/output_excerpt;monitoruses event excerpts;findalluses objective excerpt andmatched_count. - Evicting/clearing only affects Memory, not the underlying runs. Confirm before
clearunless 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:
tasksubagent onopencode-go/deepseek-v4-flashor lunahigh/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 needsworkspace-writeso its-owrites succeed. -
Claude Code: subagent with pinned
modelandeffort,tools: Bash, boundedmaxTurns, dispatched via Task. Prefer amodel: inherit-free pin per the repo routing matrix. -
Kimi Code:
Agenttool spawn withsubagent_type: coder(orexplorefor 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.