---
title: "parallel-web/parallel-agent-skills"
description: "Agent Skills from parallel-web/parallel-agent-skills."
source: https://github.com/parallel-web/parallel-agent-skills
ref: main
license: MIT
licenseName: "MIT License"
canonical: https://skillsdocs.com/parallel-web/parallel-agent-skills
base: https://github.com/parallel-web/parallel-agent-skills/blob/main/
chapters: 11
inlined: 11
withheld: 0
words: 6607
updated: 2026-08-10T20:17:28Z
generator: "Skills Docs"
---

> **parallel-web/parallel-agent-skills** — every Agent Skill in this repository, inlined verbatim.
>
> Canonical HTML: https://skillsdocs.com/parallel-web/parallel-agent-skills
> Per-chapter Markdown: https://skillsdocs.com/parallel-web/parallel-agent-skills/<skill>.md
> Machine manifest: https://skillsdocs.com/parallel-web/parallel-agent-skills/.well-known/agent-skills/index.json
> JSON: https://skillsdocs.com/api/v1/books/parallel-web/parallel-agent-skills
> Install: `npx skills add parallel-web/parallel-agent-skills`
> Upstream: https://github.com/parallel-web/parallel-agent-skills @ `main`
> Licence: MIT
>
> Content is mirrored from GitHub and © its authors, served unmodified. Takedown: https://github.com/DreambaseAI/skillsdocs/issues/new?labels=takedown&title=Takedown+request

# parallel-web/parallel-agent-skills


- **Chapters:** 11
- **Inlined:** 11 (licence detected)
- **Words:** 6,607
- **Reading time:** 32 min
- **Stars:** 67

## Table of contents

1. [migrate-to-parallel](https://skillsdocs.com/parallel-web/parallel-agent-skills/migrate-to-parallel.md) — Migrate Exa, Tavily, Perplexity, or Firecrawl web-data integrations completely to the appropriate Parallel products while preserving application behavior. Use…
2. [parallel-cli-setup](https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-cli-setup.md) — Set up and maintain the Parallel CLI (install, auth, balance, skills install)
3. [parallel-data-enrichment](https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-data-enrichment.md) — Bulk data enrichment. Adds web-sourced fields (CEO names, funding, contact info) to lists of companies, people, or products. Use for enriching CSV files or inl…
4. [parallel-deep-research](https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-deep-research.md) — ONLY use when user explicitly says 'deep research', 'exhaustive', 'comprehensive report', or 'thorough investigation'. Slower and more expensive than parallel-…
5. [parallel-findall](https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-findall.md) — Discover entities (companies, people, products, etc.) matching a natural-language description. Use when the user asks to 'find all X' or 'list every Y that…' —…
6. [parallel-memory](https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-memory.md) — Recall past Parallel Task, Monitor, and FindAll runs when they may help; evict runs or clear memory when asked.
7. [parallel-monitor](https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-monitor.md) — Continuously track the web for changes on a recurring cadence. Use when the user asks to 'monitor', 'track changes to', 'watch', or 'alert me when' something o…
8. [parallel-web-extract](https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-web-extract.md) — URL content extraction. Use for fetching any URL - webpages, articles, PDFs, JavaScript-heavy sites. Token-efficient: runs in forked context. Prefer over built…
9. [parallel-web-search](https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-web-search.md) — DEFAULT for all research and web queries. Use for any lookup, research, investigation, or question needing current info. Fast and cost-effective. Only use para…
10. [result](https://skillsdocs.com/parallel-web/parallel-agent-skills/result.md) — Get completed research task result by run ID
11. [status](https://skillsdocs.com/parallel-web/parallel-agent-skills/status.md) — Check running research task status by run ID


## Front matter

_The repository README, verbatim except that relative links are resolved against https://github.com/parallel-web/parallel-agent-skills/blob/main/._

# Parallel Agent Skills

[Agent Skills](https://agentskills.io/specification) for [Parallel](https://parallel.ai) — web search, content extraction, deep research, and data enrichment for AI coding agents.

## Prerequisites

Most execution skills require `parallel-cli` (installed, authenticated, and funded). The [`parallel-cli-setup`](https://github.com/parallel-web/parallel-agent-skills/blob/main/skills/parallel-cli-setup/SKILL.md) skill walks an agent through install, auth, balance, and skills install end-to-end — install the plugin/skills below, then run `/parallel:parallel-cli-setup` from your agent.

`migrate-to-parallel` updates an application's own web-data integration. It uses the appropriate Parallel API or SDK and needs `PARALLEL_API_KEY` only for an explicitly authorized live smoke test.

## Installation

### Agent Skills

Use `parallel-cli` to install skills into Cursor, Cline, GitHub Copilot, and other compatible agents.

```bash
# Install all Parallel skills
parallel-cli skills install
```

### Claude Code

Available as a [Claude Code Plugin Marketplace](https://code.claude.com/docs/en/discover-plugins).

```bash
/plugin marketplace add parallel-web/parallel-agent-skills
/plugin install parallel
# restart Claude Code before continuing!

# this will install/update CLI and authenticate if not done already
/parallel:parallel-cli-setup
```

### OpenAI Codex

Install skills using the built-in skill installer (run inside Codex):

```text
$skill-installer parallel-web/parallel-agent-skills
```

Then run the setup skill to install/auth the CLI:

```text
/parallel:parallel-cli-setup
```

## CDN and discovery

A human + machine-readable catalog is published at [skills.parallel.ai](https://skills.parallel.ai).

Useful endpoints:

- [skills.parallel.ai](https://skills.parallel.ai) — human-friendly catalog and install instructions
- [skills.parallel.ai/index.json](https://skills.parallel.ai/index.json) — machine-readable skill index
- `https://skills.parallel.ai/<skill>/SKILL.md` — live raw skill file
- `https://skills.parallel.ai/<skill>/manifest.json` — file manifest + checksums
- `https://skills.parallel.ai/<skill>/versions.json` — release history for that skill
- `https://skills.parallel.ai/archives/<skill>/<version>.zip` — immutable GitHub Release archive via CDN redirect

## Skills

Skills follow the [Agent Skills](https://agentskills.io/specification) specification and double as Claude Code slash commands.

| Skill                        | Description                                               |
| ---------------------------- | --------------------------------------------------------- |
| **parallel-web-search**      | Web search (default for most research queries)            |
| **parallel-web-extract**     | Extract content from URLs, articles, PDFs                 |
| **parallel-deep-research**   | Comprehensive research and analysis                       |
| **parallel-data-enrichment** | Enrich lists of companies, people, products               |
| **parallel-findall**         | Discover entities matching a natural-language description |
| **parallel-monitor**         | Continuously track the web for changes (with webhooks)    |
| **parallel-memory**          | Recall and manage saved Parallel runs                     |
| **migrate-to-parallel**      | Migrate Exa, Tavily, Perplexity, or Firecrawl integrations to Parallel |
| **parallel-cli-setup**       | Install/update CLI, authenticate, and handle balance      |
| **status**                   | Check running research task status                        |
| **result**                   | Get completed research task result                        |

## Examples

```text
/parallel:parallel-web-search latest React 19 features
/parallel:parallel-web-extract https://docs.parallel.ai
/parallel:parallel-deep-research competitive landscape of AI code assistants
/parallel:parallel-data-enrichment Apple, Microsoft, Google - get CEO names
/parallel:parallel-findall AI startups that raised Series A in 2026
/parallel:parallel-monitor track price changes for the iPhone 16 Pro
/parallel:parallel-memory retrieve past research about AI code assistants
/parallel:migrate-to-parallel migrate this app from Tavily to Parallel
/parallel:migrate-to-parallel migrate this app from Perplexity to Parallel
/parallel:migrate-to-parallel migrate this app from Firecrawl to Parallel
/parallel:parallel-cli-setup
```

## Contributing

See [MAINTAINERS.md](https://github.com/parallel-web/parallel-agent-skills/blob/main/MAINTAINERS.md) for maintainer workflows, release process, and dev setup.

## Resources

- [Documentation](https://docs.parallel.ai/home)
- [API Platform](https://platform.parallel.ai)
- [parallel-cli](https://github.com/parallel-web/parallel-web-tools)
- [Pricing](https://parallel.ai/pricing)

## Local Development

**Claude Code:**

```bash
git clone https://github.com/parallel-web/parallel-agent-skills.git
claude --plugin-dir /path/to/parallel-agent-skills
/parallel:parallel-cli-setup
```

**Codex:**

```bash
git clone https://github.com/parallel-web/parallel-agent-skills.git
cd parallel-agent-skills
codex
# Skills are auto-discovered via .agents/skills/
```

## License

MIT

---

<!-- chapter:begin slug=migrate-to-parallel position=1 -->

## 1. migrate-to-parallel

- **Source:** https://github.com/parallel-web/parallel-agent-skills/blob/main/skills/migrate-to-parallel/SKILL.md
- **Raw:** https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/migrate-to-parallel/SKILL.md
- **Markdown:** https://skillsdocs.com/parallel-web/parallel-agent-skills/migrate-to-parallel.md
- **Licence:** MIT — https://spdx.org/licenses/MIT.html

Bundled files (9), referenced from this skill's directory:
  - `agents/openai.yaml` — https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/migrate-to-parallel/agents/openai.yaml
  - `references/exa.md` — https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/migrate-to-parallel/references/exa.md
  - `references/firecrawl.md` — https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/migrate-to-parallel/references/firecrawl.md
  - `references/integration-patterns.md` — https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/migrate-to-parallel/references/integration-patterns.md
  - `references/parallel-products.md` — https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/migrate-to-parallel/references/parallel-products.md
  - `references/parallel-search.md` — https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/migrate-to-parallel/references/parallel-search.md
  - `references/perplexity.md` — https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/migrate-to-parallel/references/perplexity.md
  - `references/tavily.md` — https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/migrate-to-parallel/references/tavily.md
  - `scripts/scan_provider_usage.py` — https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/migrate-to-parallel/scripts/scan_provider_usage.py

<!-- Verbatim upstream SKILL.md follows, YAML frontmatter included. -->

---
name: migrate-to-parallel
description: Migrate Exa, Tavily, Perplexity, or Firecrawl web-data integrations completely to the appropriate Parallel products while preserving application behavior. Use when replacing these providers' SDKs or REST calls, dependencies, environment variables, request parameters, response parsing, model tools, search-plus-scrape paths, full-content or answer-synthesis paths, tests, and documentation; separating unsupported research-index, crawl, browser, file-parse, monitor, or other non-search capabilities; auditing for leftover provider usage; or finishing and verifying an in-progress provider migration.
---

# Migrate to Parallel

Replace the provider boundary end to end. Treat a successful HTTP response as the midpoint, not completion: migrate request construction, response consumers, dependencies, configuration, tests, and operational behavior.

Resolve `<skill-root>` to the directory containing this `SKILL.md`. Resolve every bundled reference and script from that directory, regardless of the current working directory. The scanner uses only the Python standard library. If Python 3.9 or newer is unavailable, perform equivalent repository searches with the harness's file-search tools and state that the bundled scan was not run.

## Load the right references

1. Read [references/exa.md](references/exa.md) when the repository contains Exa.
2. Read [references/tavily.md](references/tavily.md) when the repository contains Tavily.
3. Read [references/perplexity.md](references/perplexity.md) when the repository contains Perplexity Search, Sonar, Agent API web tools, or a Perplexity search wrapper.
4. Read [references/firecrawl.md](references/firecrawl.md) when the repository contains Firecrawl Search, Scrape, Batch Scrape, Extract, Agent, Research Index, Crawl, Map, Parse, Browser, Interact, Monitor, or MCP usage.
5. Read [references/parallel-search.md](references/parallel-search.md) when any call may route to Search or needs query, filter, freshness, mode, or result-list migration.
6. Read [references/parallel-products.md](references/parallel-products.md) when any call may route to Extract, Chat, Task, or entity discovery, or needs streaming, structured output, or citations.
7. Read [references/integration-patterns.md](references/integration-patterns.md) when queries are generated dynamically, the provider is exposed as a model tool, provider response types escape into multiple modules, or the application needs full content or synthesized answers.
8. Open current official documentation for any detected SDK, wrapper, parameter, or response field not covered by those references. Do not guess at provider behavior.

## Preserve these invariants

- Preserve caller-visible behavior unless the user explicitly authorizes a change.
- Never silently drop a filter, content field, synthesized answer, image, safety control, or score-based decision.
- Never print API keys or secret values. Check only whether a key is present.
- Do not add a hidden LLM call merely to manufacture `search_queries`.
- Do not treat an arbitrary user prompt as a keyword query merely because it fits an API length limit.
- Keep web-research intent, hard filters, handler policy, and answer-synthesis instructions in their separate contracts.
- Treat omitted provider parameters as behavior too: inspect their defaults before omitting a Parallel setting.
- Do not recreate the entire legacy provider SDK behind a compatibility shim. Normalize only the contract the application actually uses.
- Do not remove credentials from external secret managers or provider dashboards unless the user explicitly asks. Remove obsolete code references and update checked-in templates.
- Treat mode mappings as starting points. Verify latency, quality, and output behavior with the application's real queries.
- Stop before destructive edits when a required behavior has no supported Parallel equivalent and no in-scope substitute. Report the exact gap and the smallest decision needed.
- Stop when the Perplexity boundary requires embeddings; they are not a Parallel Search replacement. Route `finance_search` through Parallel's general index using Search, Chat, or Task according to the consumed contract, and stop only when a hard market-data coverage, freshness, or raw-result requirement remains unpreserved. Keep Agent API model routing, sandbox, MCP, and existing custom-function capabilities separate unless the user explicitly expands the migration scope.
- Stop when the Firecrawl boundary requires complete crawling or URL mapping, local/private file parsing, browser actions or sessions, screenshots or other rich scrape formats, change tracking, or Firecrawl-specific privacy/security controls without an approved replacement. Search and Extract do not reproduce those contracts.
- Follow repository-local instructions such as `AGENTS.md`, `CLAUDE.md`, and `CONTRIBUTING.md`. Preserve unrelated work and never reset or discard user changes.
- Complete safe repository-local migration work without stopping after an inventory or plan. Do not commit, push, change hosted secrets, or alter provider accounts unless the user asks.

## 1. Inventory the real migration surface

Record the current branch and working-tree state before editing. Run the bundled scanner from the target repository:

```bash
python3 <skill-root>/scripts/scan_provider_usage.py .
```

Use `--format json` for machine-readable output. The scanner intentionally skips dependency/generated directories, binaries, unreadable files, and oversized files; it cannot identify provider-neutral consumers from field names alone. Treat it as an inventory aid, not proof of completeness. Inspect the results and then trace each provider response to its consumers. Also inspect:

- package manifests and lockfiles;
- direct REST endpoints and auth headers;
- SDK clients, async clients, wrappers, and model-tool definitions;
- environment schemas, examples, deployment config, and docs;
- request builders, retries, timeouts, caches, observability, and error handling;
- response fields used for rendering, ranking, thresholds, citations, or model context;
- Firecrawl crawl, batch, extract, browser, interaction, webhook, and job-lifecycle consumers;
- tests, mocks, fixtures, and snapshots.

Run the existing focused tests before editing when feasible. Record which behavior is currently covered, which failures are pre-existing, and which behavior must be verified manually.

Before editing, write a decision row for every provider call site:

| Call site | Provider product | Consumed behavior | Parallel route | Semantic gap | Action |
| --- | --- | --- | --- | --- | --- |
| `path:line` | Search, Scrape, Agent, etc. | Inputs, outputs, lifecycle, and policy the caller relies on | Exact product path, if any | Anything the route cannot preserve | `migrate`, `retain`, or `block` |

Choose exactly one action before changing the call:

- `migrate` only when the proposed route preserves the consumed contract or the user has already approved the named difference;
- `retain` when the call is outside the migration boundary or is the smallest safe way to preserve an unsupported capability;
- `block` when the requested boundary cannot be completed without a user decision. Name the smallest decision, and continue any independent `migrate` rows.

Do not use a broader Parallel product merely to eliminate a provider import. A plausible result shape is not evidence that source scope, spend controls, model behavior, lifecycle, or privacy policy remains equivalent.

## 2. Choose the migration boundary

Consider both designs before editing:

- **Direct replacement:** Use when provider calls are few, nearby, and provider-specific response types do not escape. Replace each call and its consumers atomically.
- **Application-owned web-data module:** Use when calls are scattered, several Parallel products are needed, or provider fields escape into the application. Put request construction, response normalization, retries, and telemetry behind one small caller-facing interface. Make this a deep module that hides provider details; do not add a pass-through wrapper.

Prefer the design that localizes future search-provider changes and minimizes edits to unrelated callers. If the application publishes the old provider's raw response, either preserve only the documented application contract through a normalizer or update all consumers together.

## 3. Migrate requests intentionally

Build every Parallel Search API request around these facts:

- `search_queries` is required. Supply at least one non-empty keyword query; use two or three diverse keyword queries when the calling flow can provide them.
- `objective` is optional but recommended. Put the self-contained web-research goal there, not the whole user conversation or answer-format instructions.
- Use `https://api.parallel.ai/v1/search`, `x-api-key`, and `PARALLEL_API_KEY` for direct REST calls.
- Use the official `parallel-web` package for both Python and TypeScript unless the detected framework has a current first-party Parallel integration that preserves the needed contract.

Classify every legacy input before translating it:

- full web-research goal, context, or soft source/freshness preference → `objective`;
- concise retrieval probes → `search_queries`;
- must-only or must-never source restrictions → `advanced_settings.source_policy`;
- answer format, synthesis instructions, structured output, or streaming → the existing synthesis layer, Chat API, or Task API;
- latency, result count, cache, and excerpt controls → application-owned policy chosen and tested explicitly.

For static calls, write an explicit objective and two or three keyword probes. For model tools, use the exact-three-query schema in [references/integration-patterns.md](references/integration-patterns.md). A one-query direct-call fallback is only for an already keyword-style legacy value and must be evaluated. Do not silently truncate intent, invent keyword variants, add a hidden planner, or move hard filters into prose.

Apply the provider mapping only after that classification. Preserve only settings that implement a real product requirement; unnecessary `advanced_settings` can reduce quality.

Validate runtime values against the Parallel V1 contract before sending them. Pay particular attention to query count/length, objective length, the combined 200-domain limit, date normalization, and supported location codes. Do not carry the old provider's numeric ranges forward implicitly.

## 4. Migrate response behavior

Update every consumer to the Parallel response shape. The Search API returns ranked `results` with `url`, optional `title`, optional `publish_date`, and an `excerpts` array. It does not return the old provider's relevance score, generated answer, image fields, response time, or full-page body.

Preserve field semantics, not just field names. A date-only `publish_date` does not restore an old timestamp's time-of-day precision, a `search_id` is not a session identifier, and SKU usage counts are not provider credits or dollar cost. Normalize only when the application contract defines the conversion; otherwise make the contract change explicit.

Route non-search behavior explicitly:

- Use Search API excerpts directly for LLM context or concise evidence.
- Use the Extract API for full content from known result URLs, reusing the Search API `session_id`.
- Use the Chat API or the application's existing model for a grounded answer.
- Use the Task API for asynchronous multi-step research or structured synthesis.
- Use Entity Search for synchronous people or company discovery.

For Firecrawl, classify the product before choosing a route. Search generally maps to Search; public-URL markdown or full content may map to Extract; structured multi-page research may map to Task only when Task preserves the required source scope, spend policy, quality choice, and lifecycle. Exact known-URL structured extraction instead favors Extract plus an application-owned model/parser. Research Index, Crawl, Map, Parse uploads, Browser, Interact, Monitor, screenshots, and other rich scrape behavior are not Search field mappings. Follow [references/firecrawl.md](references/firecrawl.md) and preserve separate capabilities until an explicit replacement is approved.

Do not fill missing fields with plausible-looking constants. Remove obsolete consumers, redesign the application contract, or use the appropriate Parallel API.

## 5. Replace dependencies and configuration

- Add only the SDKs required by the chosen routes: `parallel-web` for Search, Extract, or Task; `openai` for Chat unless the application already has a compatible client; no SDK when direct REST is the simpler existing pattern.
- Remove a legacy provider package only when no `retain` row still depends on it, then regenerate the lockfile with the repository's package manager.
- Replace provider imports, client initialization, endpoints, and headers only inside `migrate` rows. Keep shared provider setup until retained calls have their own explicit boundary.
- Add `PARALLEL_API_KEY` to checked-in environment templates, validation schemas, setup scripts, deployment manifests, examples, and docs. Remove a legacy key from those surfaces only when no retained runtime capability still needs it.
- Preserve existing timeout, retry, cancellation, and logging behavior where the Parallel SDK supports it; otherwise implement the behavior at the application boundary and test it.
- Keep error messages provider-neutral unless the provider name helps the operator act.

Never expose or rewrite real secret values in logs, reports, patches, or fixtures.

## 6. Verify behavior, not just syntax

Add or update tests for:

- request construction, including `search_queries`, mode, filters, dates, and location;
- source-policy normalization for apex domains, subdomains, schemes, paths, wildcards, conflicting lists, and provider-specific limits;
- query-design behavior: static requests, direct one-query compatibility paths, and model-tool schemas;
- omitted legacy defaults, dual domain lists, and any approved semantic change;
- target-limit validation for dynamic queries and domain lists;
- response parsing and excerpt joining;
- empty results, missing optional titles/dates, warnings, and errors;
- any normalizer that preserves an application-owned contract;
- full-content, synthesis, or entity routes when used;
- removal of score thresholds or provider-specific fields.

Preserve the repository's test execution contract. If its focused tests previously stubbed the provider package and ran without installing that SDK, stub the replacement SDK or keep imports behind the injected boundary too. Rerun the exact pre-migration test command in an equivalently clean environment; a pass that depends on an ambient package is not evidence that the repository remains self-contained.

Then run, in order:

1. the narrow migration tests;
2. the repository's formatter, type checker, lint, build, and broader tests as appropriate;
3. `python3 <skill-root>/scripts/scan_provider_usage.py . --provider <legacy-provider> --fail-on-legacy` when that provider is being removed completely;
4. when approved non-search Perplexity or Firecrawl usage remains, run the provider scan without `--fail-on-legacy`, classify every finding, and then scan only the migrated roots or use narrow `--exclude` paths for isolated retained modules; never exclude a mixed search/non-search boundary;
5. an independent case-insensitive search for `exa`, `tavily`, `perplexity`, `sonar-`, `firecrawl`, exact `model` assignments to `sonar`, routed `perplexity/sonar` model IDs, package names, endpoints, and key names, excluding `<skill-root>` if the skill is installed inside the target repository;
6. a review of the final diff for unintended behavior changes, leaked values, unrelated edits, and stale lockfiles;
7. a live smoke test only when provider calls are explicitly authorized for this task and `PARALLEL_API_KEY` is already available, without printing it.

An ambient credential does not by itself authorize a paid network call. When authorized, use a small, non-sensitive synthetic query and inspect `warnings`, result ordering, excerpts, and error behavior. Compare representative production queries only when the user approves sending them to both providers or an existing repository test policy already permits that exact comparison. Do not require the user to paste secrets.

## Completion gate

Finish only when all applicable statements are true:

- No legacy-provider runtime dependency, import, endpoint, auth header, key reference, tool definition, fixture, or stale setup instruction remains inside the migrated boundary.
- Any Perplexity model-routing, embeddings, sandbox, MCP, or custom-function capability outside that boundary remains intact or is called out as an explicit blocker.
- Any migrated `finance_search` path preserves the consumed final-answer or `finance_results` contract through an evaluated Parallel route and, when needed, an application-owned normalizer; unresolved hard coverage or freshness requirements are explicit blockers.
- Any Firecrawl crawl, map, file-parse, browser, interaction, rich-format, change-tracking, security/privacy, MCP, or asynchronous-job capability outside that boundary remains intact or is called out as an explicit blocker.
- Every inventoried call has a recorded `migrate`, `retain`, or `block` decision, and no `block` row was edited as though the gap were resolved.
- Firecrawl exact-URL constraints, per-run credit ceilings, `spark-1-*` model choices, and synchronous/asynchronous behavior are preserved or changed only with explicit approval; a domain allow-list, omitted budget, or guessed Task processor does not satisfy this gate.
- Every used request feature and response field has an implemented Parallel path or an explicitly approved behavior change.
- Query construction preserves the research goal, uses keyword-shaped retrieval probes, and follows the applicable direct-call or model-tool contract.
- Source-policy migration preserves the intended URL scope; unsupported path or wildcard behavior is implemented explicitly or recorded as an approved gap.
- Tests and static checks pass, or unrelated pre-existing failures are identified with evidence.
- The provider-specific legacy scan passes when the provider was removed completely. Otherwise, every remaining finding belongs to an approved, isolated non-search boundary and every identified response has been traced through its downstream consumers.
- A live call passes when it was explicitly authorized and credentials are available; otherwise the missing live verification is stated clearly.
- The final report names the migrated boundary, important semantic choices, verification commands, and any external secret cleanup still left to the operator.

<!-- chapter:end slug=migrate-to-parallel -->

---

<!-- chapter:begin slug=parallel-cli-setup position=2 -->

## 2. parallel-cli-setup

- **Source:** https://github.com/parallel-web/parallel-agent-skills/blob/main/skills/parallel-cli-setup/SKILL.md
- **Raw:** https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/parallel-cli-setup/SKILL.md
- **Markdown:** https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-cli-setup.md
- **Licence:** MIT — https://spdx.org/licenses/MIT.html

<!-- Verbatim upstream SKILL.md follows, YAML frontmatter included. -->

---
name: parallel-cli-setup
description: Set up and maintain the Parallel CLI (install, auth, balance, skills install)
user-invocable: true
allowed-tools: Bash(command:*), Bash(brew:*), Bash(uv:*), Bash(npm:*), Bash(pipx:*), Bash(curl:*), Bash(rm:*), Bash(parallel-cli:*)
metadata:
  author: parallel
---

# Parallel CLI Setup

Set up or maintain `parallel-cli` with minimal friction. If you are running this prompt, your goal is to follow the instructions below and set up `parallel-cli` for the user so that they can execute searches, run extracts, deep research, etc.

## Step 1: Install or upgrade the CLI

Check whether the CLI exists:

```bash
command -v parallel-cli
```

If missing, install with any of these methods:

1. macOS only: `brew install parallel-web/tap/parallel-cli`
2. Linux/macOS/Windows (uv): `uv tool install "parallel-web-tools[cli]"`
3. Linux/macOS/Windows (npm): `npm install -g parallel-web-cli`
4. Linux/macOS/Windows (pipx): `pipx install "parallel-web-tools[cli]" && pipx ensurepath`

When `parallel-cli` is present, require version `>=0.8.1`. If older, identify the install method before advising an update. Use `command -v parallel-cli`, then inspect `readlink "$(command -v parallel-cli)"` if it is a symlink. Paths under `~/.local/share/uv/
  tools/` indicate `uv tool install`; paths under `~/.local/share/parallel-cli/` indicate the standalone installer.

Upgrade commands (choose based on how it was installed):

- standalone: `parallel-cli update`
- uv: `uv tool upgrade parallel-web-tools[cli]`
- pipx: `pipx upgrade parallel-web-tools[cli]`
- npm: `npm update -g parallel-web-cli`
- homebrew: `brew update && brew upgrade parallel-web/tap/parallel-cli`

## Step 2: Authenticate

Check auth status:

```bash
parallel-cli auth --json
```

You will get a response like:

```json
{
  "authenticated": true,
  "method": "oauth",
  "env_var_set": false,
  "has_stored_credentials": true,
  "stored_overridden_by_env": false,
  "token_file": "xxx",
  "version": 1,
  "selected_org_id": "legacy",
  "selected_org_name": null,
  "has_control_api_tokens": false
}
```

If `authenticated` is `false` or `selected_org_id` is `legacy`, prompt the user to log in:

```bash
parallel-cli login --json
```

If this is a headless session, append `--no-browser`.

This triggers device OAuth. The user will be prompted to go to a web browser and input the code the CLI outputs.

When invoking from an agent harness, prefer streaming stdout via a Monitor-style tool over blocking on completion.

The output will look like:

```json
{"event": "auth_start"}
{"event": "device_code", "verification_uri": "http://localhost:3000/getServiceKeys/device", "verification_uri_complete": "http://localhost:3000/getServiceKeys/device?user_code=CHQX-NQKP&onboard_variant=agent", "user_code": "CHQX-NQKP", "expires_in": 600, "browser_open_attempted": true, "browser_opened": true}
{"event": "auth_waiting"}
{"event": "auth_success"}
```

`{"event": "auth_success"}` is emitted only after the user has successfully authorized the CLI. Otherwise it blocks at `{"event": "auth_waiting"}`.

## Step 3: Check balance

After authentication, check the current balance:

```bash
parallel-cli balance get
```

If zero, prompt the user to add balance:

```bash
parallel-cli balance add <AMOUNT_IN_CENTS>
```

Make it clear that a payment method should have been added to the organization. If not, the user can go to <https://platform.parallel.ai/settings> to add one.

## Step 4: Install the Parallel skills

Install the skills for the user:

```bash
parallel-cli skills install
```

The user may need to restart their agent if it doesn't support hot reloading (e.g. Claude).

## Step 5: Suggest a first run

Prompt the user to use the newly installed skills in `~/.agents/skills` to run a search or extract right away. Suggest one of:

- `/parallel:parallel-web-search <query>` — fast web search
- `/parallel:parallel-web-extract <url>` — extract content from a URL
- `/parallel:parallel-deep-research <topic>` — comprehensive research
- `/parallel:parallel-data-enrichment <list>` — enrich a list of entities

<!-- chapter:end slug=parallel-cli-setup -->

---

<!-- chapter:begin slug=parallel-data-enrichment position=3 -->

## 3. parallel-data-enrichment

- **Source:** https://github.com/parallel-web/parallel-agent-skills/blob/main/skills/parallel-data-enrichment/SKILL.md
- **Raw:** https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/parallel-data-enrichment/SKILL.md
- **Markdown:** https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-data-enrichment.md
- **Licence:** MIT — https://spdx.org/licenses/MIT.html

<!-- Verbatim upstream SKILL.md follows, YAML frontmatter included. -->

---
name: parallel-data-enrichment
description: "Bulk data enrichment. Adds web-sourced fields (CEO names, funding, contact info) to lists of companies, people, or products. Use for enriching CSV files or inline data. Supports multi-turn: pass --previous-interaction-id from a prior research task to carry context forward."
user-invocable: true
argument-hint: <file or entities> with <fields to add>
compatibility: Requires parallel-cli and internet access.
allowed-tools: Bash(parallel-cli:*)
metadata:
  author: parallel
---

# Data Enrichment

Enrich: $ARGUMENTS

## Before starting

Inform the user that enrichment may take several minutes depending on the number of rows and fields requested.

## Optional: Suggest output columns

If the user gave a vague intent ("enrich these companies with useful info") and you're not sure what columns to add, ask the API for a suggestion before kicking off the run:

```bash
parallel-cli enrich suggest "Find CEO and recent funding info" --json
```

The response is an envelope: `{title, processor, enriched_columns, warnings}`. Extract just the **`enriched_columns` array** (not the whole envelope) and pass it as the value of `--enriched-columns` on `enrich run`, **in place of `--intent`** — the two flags are alternative ways to specify what to enrich, not combined. If `suggest` returned a `processor`, pass it through explicitly via `--processor` on the `run` call (it's a tuned recommendation for the schema). Skip this whole section if the user already specified the fields they want.

> `enrich suggest` requires `parallel-cli` ≥ 0.3.0. If it errors with anything resembling `no such command` / `No such command` / `unknown command`, **do not bail** — skip the suggestion step, fall through to step 1 with `--intent`, complete the run, and mention `parallel-cli update` (or `pipx upgrade parallel-web-tools`) in the final response so the user picks up the feature next time.

## Step 1: Start the enrichment

Use ONE of these command patterns (substitute user's actual data):

For inline data:

```bash
parallel-cli enrich run --data '[{"company": "Google"}, {"company": "Microsoft"}]' --intent "CEO name and founding year" --target "output.csv" --no-wait --json
```

For CSV file:

```bash
parallel-cli enrich run --source-type csv --source "input.csv" --target "output.csv" --source-columns '[{"name": "company", "description": "Company name"}]' --intent "CEO name and founding year" --no-wait --json
```

If this is a **follow-up** to a previous research task and you have its `interaction_id`, add context chaining:

```bash
parallel-cli enrich run --data '...' --intent "..." --target "output.csv" --no-wait --json --previous-interaction-id "$INTERACTION_ID"
```

The enrichment will run with the full context of that prior research — so you can enrich entities discovered earlier without restating what was already found. Note: enrichment does **not** itself produce a new `interaction_id`, so you cannot chain a further follow-up off of an enrichment.

**IMPORTANT:** Always include `--no-wait` so the command returns immediately instead of blocking.

Parse the `--json` output to extract `taskgroup_id` and `url`. The output is `{taskgroup_id, url, num_runs}` — there is no `interaction_id` field, do not look for one. Immediately tell the user:

- Enrichment has been kicked off
- The monitoring URL where they can track progress

Tell them they can background the polling step to continue working while it runs.

## Step 2: Poll for results

Pick a concrete output path (e.g., `/tmp/enrichment-acme.json`). Note: the file is JSON regardless of the extension you choose — it's an array of `{input, output}` objects, not a CSV. Name it `.json` to avoid confusing yourself or the user.

```bash
parallel-cli enrich poll "$TASKGROUP_ID" --timeout 540 --output "/tmp/enrichment-<descriptive-name>.json"
```

Important:

- Use `--timeout 540` (9 minutes) to stay within tool execution limits
- The `--target` from step 1 is unused in `--no-wait` mode — only `--output` here determines where results are saved, and the file is always JSON

### If the poll times out

Enrichment of large datasets can take longer than 9 minutes. If the poll exits without completing:

1. Tell the user the enrichment is still running server-side
2. Re-run the same `parallel-cli enrich poll` command to continue waiting

## Response format

**After step 1:** Share the monitoring URL (for tracking progress).

**After step 2:**

1. Report number of rows enriched
2. Preview first few rows from the output file (it's a JSON array of `{input, output}` objects)
3. Tell the user the full path to the output file

Do NOT re-share the monitoring URL after completion — the results are in the output file.

## Setup

If `parallel-cli` is not found, install and authenticate:

```bash
/parallel:parallel-cli-setup
```

If any `parallel-cli enrich` command returns `403`, tell the user balance is likely required. Offer to run `parallel-cli balance get`, and if needed ask for explicit confirmation before running `parallel-cli balance add <amount_cents>`. Then retry the original enrichment command.

<!-- chapter:end slug=parallel-data-enrichment -->

---

<!-- chapter:begin slug=parallel-deep-research position=4 -->

## 4. parallel-deep-research

- **Source:** https://github.com/parallel-web/parallel-agent-skills/blob/main/skills/parallel-deep-research/SKILL.md
- **Raw:** https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/parallel-deep-research/SKILL.md
- **Markdown:** https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-deep-research.md
- **Licence:** MIT — https://spdx.org/licenses/MIT.html

<!-- Verbatim upstream SKILL.md follows, YAML frontmatter included. -->

---
name: parallel-deep-research
description: "ONLY use when user explicitly says 'deep research', 'exhaustive', 'comprehensive report', or 'thorough investigation'. Slower and more expensive than parallel-web-search. For normal research/lookup requests, use parallel-web-search instead. Supports multi-turn: pass --previous-interaction-id from a prior research or enrichment to continue with context."
user-invocable: true
argument-hint: <topic>
compatibility: Requires parallel-cli >= 0.3.0 and internet access.
allowed-tools: Bash(parallel-cli:*)
metadata:
  author: parallel
---

# Deep Research

Research topic: $ARGUMENTS

> Requires `parallel-cli` ≥ 0.3.0. If any command below errors with `no such option`, `no such command`, or `unrecognized arguments`, the user is on an older CLI. Tell them to run `parallel-cli update` (or `pipx upgrade parallel-web-tools` if installed via pipx), then retry.

## When to use (vs parallel-web-search)

ONLY use this skill when the user explicitly requests deep/exhaustive research. Deep research is 10-100x slower and more expensive than parallel-web-search. For normal "research X" requests, quick lookups, or fact-checking, use **parallel-web-search** instead.

## Step 1: Start the research

Choose a descriptive filename based on the topic (e.g., `ai-chip-market-2026`, `react-vs-vue-comparison`). Use lowercase with hyphens, no spaces. Reuse this base name in step 2 as `-o "$FILENAME"`.

```bash
parallel-cli research run "$ARGUMENTS" --processor pro-fast --text --no-wait --json
```

The `--text` flag tells the API to return a markdown report (with inline citations) when the task completes, instead of the default structured JSON. Use it for narrative/report-style requests, which is what most users want from "deep research." Drop `--text` if the user explicitly wants structured JSON output.

Optional with `--text`: pass `--text-description "Keep under 1500 words, focus on M&A activity"` to steer length, format, or focus.

If this is a **follow-up** to a previous research or enrichment task where you know the `interaction_id`, add context chaining:

```bash
parallel-cli research run "$ARGUMENTS" --processor lite-fast --text --no-wait --json --previous-interaction-id "$INTERACTION_ID"
```

By chaining `interaction_id` values across requests, each follow-up question automatically has the full context of prior turns — so you can drill deeper without restating what was already researched. Use a lighter processor (`lite-fast` or `base-fast`) for follow-ups since the heavy lifting was done in the initial turn.

This returns instantly. Do NOT omit `--no-wait` — without it the command blocks for minutes and will time out.

Processor options (choose based on user request):

| Processor | Expected latency | Use when |
|-----------|-----------------|----------|
| `lite-fast` | 10–60s | Quick lookups, follow-ups |
| `base-fast` | 15–100s | Simple questions |
| `core-fast` | 1–5 min | Moderate research |
| `pro-fast` | 2–10 min | **Default** — exploratory research, good depth/speed balance |
| `ultra-fast` | 5–25 min | Multi-source deep research (~2× cost) |
| `ultra2x-fast` / `ultra4x-fast` / `ultra8x-fast` | up to 2 hr | Hardest questions, only when explicitly requested |

Notes on the `-fast` suffix: `-fast` tiers use cached web data and are quicker. The non-fast variants (`pro`, `ultra`, etc.) re-fetch fresher data — slower but better for very recent events. Default to `-fast` unless the user specifically asks about news from the last day or two.

Run `parallel-cli research processors` to see the full list with latencies.

Parse the JSON output to extract the `run_id`, `interaction_id`, and monitoring URL. Immediately tell the user:

- Deep research has been kicked off
- The expected latency for the processor tier chosen (from the table above)
- The monitoring URL where they can track progress

Tell them they can background the polling step to continue working while it runs.

## Step 2: Poll for results

```bash
parallel-cli research poll "$RUN_ID" -o "$FILENAME" --timeout 540
```

Important:

- Use `--timeout 540` (9 minutes) to stay within tool execution limits
- Do NOT pass `--json` — the full output is large and will flood context. The `-o` flag writes results to files instead.
- With `-o "$FILENAME"`:
  - `$FILENAME.json` is always written (metadata + basis)
  - `$FILENAME.md` is written **only if step 1 used `--text`** (markdown report)
- The poll command prints an **executive summary** to stdout when the research completes. Share this executive summary with the user — it gives them a quick overview without having to open the files.
- Pass `--force` if re-polling and you want to overwrite existing files

### If the poll times out

Higher processor tiers can take longer than 9 minutes. If the poll exits without completing:

1. Tell the user the research is still running server-side
2. Re-run the same `parallel-cli research poll` command to continue waiting

## Response format

**After step 1:** Share the monitoring URL (for tracking progress only — it is not the final report).

**After step 2:**

1. Share the **executive summary** that the poll command printed to stdout
2. Tell the user the generated file paths:
   - `$FILENAME.md` — formatted markdown report (if `--text` was used)
   - `$FILENAME.json` — metadata and basis
3. Share the `interaction_id` and tell the user they can ask follow-up questions that build on this research (e.g., "drill deeper into X" or "compare that to Y")

Do NOT re-share the monitoring URL after completion — the results are in the files, not at that link.

Ask the user if they would like to read through the files for more detail. Do NOT read the file contents into context unless the user asks.

**Remember the `interaction_id`** — if the user asks a follow-up question that relates to this research, use it as `--previous-interaction-id` in the next research or enrichment command.

## Setup

If `parallel-cli` is not found, install and authenticate:

```bash
/parallel:parallel-cli-setup
```

If any `parallel-cli research` command returns `403`, tell the user balance is likely required. Offer to run `parallel-cli balance get`, and if needed ask for explicit confirmation before running `parallel-cli balance add <amount_cents>`. Then retry the original research command.

<!-- chapter:end slug=parallel-deep-research -->

---

<!-- chapter:begin slug=parallel-findall position=5 -->

## 5. parallel-findall

- **Source:** https://github.com/parallel-web/parallel-agent-skills/blob/main/skills/parallel-findall/SKILL.md
- **Raw:** https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/parallel-findall/SKILL.md
- **Markdown:** https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-findall.md
- **Licence:** MIT — https://spdx.org/licenses/MIT.html

<!-- Verbatim upstream SKILL.md follows, YAML frontmatter included. -->

---
name: parallel-findall
description: "Discover entities (companies, people, products, etc.) matching a natural-language description. Use when the user asks to 'find all X' or 'list every Y that…' — e.g., 'Find AI startups that raised Series A in 2026', 'List roofing companies in Charlotte NC', 'Show me YC W24 dev tools companies'. Different from web-search (which returns webpages) and deep-research (which returns a narrative report). Use this when the user wants a structured list of entities."
user-invocable: true
argument-hint: <objective describing entities to find>
compatibility: Requires parallel-cli >= 0.6.0 and internet access.
allowed-tools: Bash(parallel-cli:*)
metadata:
  author: parallel
---

# FindAll: Entity Discovery

Find: $ARGUMENTS

> Requires `parallel-cli` ≥ 0.6.0 (the `findall entity-search` command was added in 0.6.0; the broader `findall` command was added in 0.3.0). If either errors with `no such command` or similar, tell the user to run `parallel-cli update` (or `pipx upgrade parallel-web-tools` if installed via pipx), then retry.

## When to use this skill

Use FindAll when the user wants a **structured list of entities** matching a description, not webpages or a narrative answer.

| User asks for… | Use |
|---|---|
| "Find all X that…" / "List every Y…" | **parallel-findall** (this skill) |
| Webpage results / quick answers / current info | parallel-web-search |
| Narrative report / analysis / "research X" | parallel-deep-research |
| Add fields to a list you already have | parallel-data-enrichment |

If the user already has a list and just wants to add fields, this is the wrong skill — use parallel-data-enrichment.

FindAll has two paths: the comprehensive, asynchronous `findall run` (Steps 1–2) and the fast, synchronous `entity-search` (final section).

- **`entity-search`** — very fast (few seconds), only supports people or company search. Supports a more limited set of query arguments. Optimized for recall over precision; results are not individually verified.
- **`findall run`** — Provides comprehensive coverage, complex, match conditions, exclusions, enrichment, citations, or a type other than people/companies.

If it's ambiguous, ask the user which they'd prefer and offer a default. Remember entity search limits: companies/people only, no exclusions/generator/enrichment, and `entity_set_id` can't be used with `enrich`/`extend` (re-run via `findall run` if needed).

Switch to `entity-search` **only when the user explicitly signals they want a fast, throwaway list**. `entity-search` is also strictly more limited: it only supports `companies` or `people` entity types, no exclusions, no generator choice, no enrichment, and the returned `entity_set_id` is **not** usable with `findall enrich`/`extend`. If you start there and the user later asks to enrich or extend, you'll have to re-run via `findall run`.

## Step 1: Start the run

```bash
parallel-cli findall run "$ARGUMENTS" --no-wait --json
```

Defaults: generator `core`, match limit `10`. Stick with `core` unless the user has a reason to escalate:

- `-g pro` — most thorough generator (slower, costlier). Use when the user asks for "comprehensive" coverage or matches are sparse on `core`
- `-g base` — fastest, but **markedly lower quality**. Often returns query-echo entities (e.g., directory pages, the literal query string), entries with no URL, or category placeholders. Only use if the user explicitly asks for a quick scan and accepts noise; otherwise prefer `core`
- `-n 50` — return up to 50 matched entities (5–1000 allowed)

If the user wants to exclude known entities (e.g., "find competitors but not Google or OpenAI"):

```bash
parallel-cli findall run "$ARGUMENTS" --no-wait --json \
    --exclude '[{"name":"Google","url":"google.com"},{"name":"OpenAI","url":"openai.com"}]'
```

Tip — preview the schema first if the objective is ambiguous: `parallel-cli findall ingest "$ARGUMENTS" --json` shows the entity type and match conditions the API inferred, so you can refine wording before paying for a run.

Parse the JSON output to extract the `findall_id` and any monitoring URL. Tell the user:

- A FindAll run has been started
- Approximate cadence (minutes for `core`, longer for `pro`)
- They can keep working while it runs

## Step 2: Poll for results

Choose a descriptive filename (e.g., `series-a-ai-2026`, `charlotte-roofers`). Use lowercase with hyphens, no spaces.

```bash
parallel-cli findall poll "$FINDALL_ID" -o "/tmp/$FILENAME.json" --timeout 540
```

Important:

- Use `--timeout 540` (9 minutes) to stay within tool execution limits
- Do NOT pass `--json` for large result sets — it will flood context. `-o` saves the full results to disk

### If the poll times out

Re-run the same `parallel-cli findall poll` command to continue waiting. Server-side the run continues regardless.

## Response format

Before presenting matches, **filter the results** for obvious noise:

- Drop entries with empty/missing `url`
- Drop entries whose `name` echoes the user's query (e.g., literal "YC W25 batch companies in developer tools") — those are search-result placeholders, not real entities
- Drop entries whose `url` is a third-party directory or profile page rather than the entity's own domain. The URL should be something the entity itself owns (its product site, docs, or marketing site)

If filtering removes a meaningful share of matches, mention this to the user and suggest re-running with `-g pro` or a higher `-n`.

**Sanity-check `-g base` results.** The base generator can hallucinate categorical attributes (e.g., return a YC S22 company as a YC W25 match). The filter rules above only catch URL/name shape, not factual correctness. If the user's query has a falsifiable attribute (a specific batch, year, geography, etc.), spot-check the kept entries against the source URL and flag any that don't fit. Recommend re-running with `-g core` (or higher) if **either** multiple kept entries fail the spot-check **or** noise filtering dropped a meaningful share of the matched set (say, ≥40%) — both indicate `base` isn't producing reliable results for this query.

Present the remaining (real) entities as a markdown table or list. Lead with the count, then list each entity with its name, URL, and a one-line description if available. Cite each entity with its source URL.

Tell the user:

- How many entities were matched (and how many were filtered as noise, if any)
- The full results path (`/tmp/$FILENAME.json`)
- That they can:
  - Add fields to these results, e.g.:

    ```bash
    parallel-cli findall enrich $FINDALL_ID '{"properties":{"ceo":{"type":"string"},"employee_count":{"type":"number"}}}'
    ```

    The schema is a JSON Schema-style object with `properties` mapping field names → `{type, description?}`.
  - Get more matches: `parallel-cli findall extend $FINDALL_ID 50`

## Fast entity search

**Use this path only when the user explicitly signals they want a quick/rough/preview list** — do not pick it just because the entity type happens to be `companies` or `people`.

Synchronous call. No polling, no `findall_id`. Pick a descriptive `$FILENAME` (lowercase, hyphens, no spaces), as in Step 2.

```bash
parallel-cli findall entity-search "$ARGUMENTS" -t companies -n 100 -o "/tmp/$FILENAME.json"
```

Flags:

- `-t companies|people` — entity type (required). The endpoint only supports these two; for anything else, use `findall run`
- `-n 5..1000` — match limit (default `10`). When possible, request more than the user needs (e.g. `-n 100`) and select after filtering — results are ranked but not individually verified, and a low limit can omit relevant entities
- Do NOT pass `--json` for large result sets — it will flood context. `-o` saves the full results to disk

Avoid highly restrictive objectives on this path: the API fills toward the limit, so relevance declines toward the tail. Keep the core criterion in the objective and filter the rest downstream, or use `findall run`.

Response shape:

```json
{ "entity_set_id": "entity_set_…", "entities": [ {"name": "...", "url": "...", "description": "..."},
… ] }
```

Unlike the full path, the `url` returned by `entity-search` is usually a directory/profile link — expected, not noise. Don't drop them; only filter out entries with an empty `url` or a `name` that echoes the query.

Present the kept entities as a markdown table or list, lead with the count, and cite each with its source URL. Tell the user:

- How many entities came back (and how many were filtered as noise)
- The full results path (`/tmp/$FILENAME.json`) if `-o` was used

## Setup

Requires `parallel-cli` (installed and authenticated). If `parallel-cli --version` fails, or if a later command fails with an authentication error, tell the user to see <https://docs.parallel.ai/integrations/cli> and stop.

<!-- chapter:end slug=parallel-findall -->

---

<!-- chapter:begin slug=parallel-memory position=6 -->

## 6. parallel-memory

- **Source:** https://github.com/parallel-web/parallel-agent-skills/blob/main/skills/parallel-memory/SKILL.md
- **Raw:** https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/parallel-memory/SKILL.md
- **Markdown:** https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-memory.md
- **Licence:** MIT — https://spdx.org/licenses/MIT.html

<!-- Verbatim upstream SKILL.md follows, YAML frontmatter included. -->

---
name: parallel-memory
description: "Recall past Parallel Task, Monitor, and FindAll runs when they may help; evict runs or clear memory when asked."
user-invocable: true
argument-hint: <retrieve|evict|clear> [args]
compatibility: Requires parallel-cli >=0.8.1 and internet access.
allowed-tools: Bash(parallel-cli:*)
metadata:
  author: parallel
---

# Parallel Memory

Action: $ARGUMENTS

> Requires `parallel-cli >=0.8.1`. If the installed version is older, or `parallel-cli memory --help` fails with `no such command` or similar, tell the user to update `parallel-cli`, then retry.

## When to use

- Inspect memory only when prior Parallel work may help fulfill the request or the user asks to retrieve, evict, or clear it.
- Memory results are excerpts from past runs; fetch the source run for full records, and launch a fresh run when current information is required.

## Choose the operation

| User intent | Operation |
|---|---|
| Recall prior work about a topic | Retrieve with a concise query |
| Show recent past runs | Retrieve without `query` |
| Remove one saved Task, Monitor, or FindAll source | Evict by exact `kind` and `id` |
| Permanently remove all entries from your personal Memory | Clear memory |
| Turn memory off | Direct the user to account settings; do not clear as a substitute |

## Use the CLI

Use `parallel-cli memory` for retrieve, evict, and clear operations.

- If memory is not eligible, 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.

## Retrieve memory

Form a short semantic query that describes the prior work to find. Apply filters when they help. Empty `results` is a successful retrieval with no matches, not an error.

- Set `kind` to `task`, `monitor`, or `findall` when it clearly narrows the retrieval.
- Set `since` for an explicit timestamp boundary (RFC 3339, e.g. `2026-08-01T00:00:00Z`).
- Omit `query` when retrieving recent memories rather than a topic.

Retrieve by query:

```bash
parallel-cli memory retrieve \
  --query "serverless inference vendors"
```

For recent memories:

```bash
parallel-cli memory retrieve \
  --limit 5
```

## Use results

Available fields vary by `kind`:

- `task`: use `id`, `updated_at`, `input_excerpt`, and `output_excerpt`.
- `monitor`: use the monitor `id`, status, query excerpt, and matching event IDs, timestamps, and excerpts.
- `findall`: use `id`, `updated_at`, objective excerpt, and `matched_count`.

- Fetch the original Task result, Monitor events, or FindAll result when exact output, entities, citations, or provenance matter.
- Summarize the useful findings and unresolved questions.
- Lead with what the prior work established, then list the contributing saved runs with kind, ID, and timestamp.
- Distinguish recalled information from any fresh verification.
- Parallel runs do not consult Memory. If recalled information may be useful, include the relevant details in the new run's input.

Expect ingestion to be asynchronous. Do not promise that a newly completed run will be immediately retrievable.

## Evict or clear memory

Evict a single run from your personal Memory, or clear it entirely. These do not delete the underlying Parallel runs. Ask for confirmation before clearing unless the user already asked for it.

```bash
parallel-cli memory evict \
  --kind task \
  --id "trun_example"
```

```bash
parallel-cli memory clear \
  --confirm-clear
```

<!-- chapter:end slug=parallel-memory -->

---

<!-- chapter:begin slug=parallel-monitor position=7 -->

## 7. parallel-monitor

- **Source:** https://github.com/parallel-web/parallel-agent-skills/blob/main/skills/parallel-monitor/SKILL.md
- **Raw:** https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/parallel-monitor/SKILL.md
- **Markdown:** https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-monitor.md
- **Licence:** MIT — https://spdx.org/licenses/MIT.html

<!-- Verbatim upstream SKILL.md follows, YAML frontmatter included. -->

---
name: parallel-monitor
description: "Continuously track the web for changes on a recurring cadence. Use when the user asks to 'monitor', 'track changes to', 'watch', or 'alert me when' something on the web changes — e.g., 'Track price changes for iPhone 16', 'Alert me when Tesla files a new 8-K', 'Monitor competitor pricing pages weekly'. Also use to list, inspect, update, or stop existing monitors, including requests to delete them."
user-invocable: true
argument-hint: <create|list|events|get|update|trigger|cancel> [args]
compatibility: Requires parallel-cli >= 0.4.0 and internet access.
allowed-tools: Bash(parallel-cli:*)
metadata:
  author: parallel
---

# Web Monitor

Action: $ARGUMENTS

> Requires `parallel-cli` ≥ 0.4.0 for the GA Monitor commands. If a Monitor command or option is missing, tell the user to update through their installation method (see <https://docs.parallel.ai/integrations/cli>), then retry.

## What this skill does

Monitors are long-running, server-side jobs that re-check the web on a cadence and emit events when something changes. Unlike search/research/findall (one-shot lookups), monitors persist until cancelled and can optionally deliver detected events through a webhook.

## Decide the action

Parse the user's request and pick one:

| Intent | Action |
|---|---|
| "Track / watch / monitor / alert me when X" | **create** |
| "What am I monitoring?" / "List monitors" | **list** |
| "What changed?" / "Show me events for monitor X" | **events** |
| "Show monitor X" / "Get details for X" | **get** |
| "Change cadence / webhook for X" | **update** |
| "Check monitor X now" / "Run it now" | **trigger** |
| "Show me the full payload for event group X" | **events** with `--event-group-id` |
| "Stop / delete monitor X" | **cancel** (always confirm before cancelling) |

## Create a monitor

```bash
parallel-cli monitor create "<query>" --frequency 1d --json
```

Frequency accepts `<n><unit>` with `h`, `d`, or `w` (for example `1h`, `1d`, or `1w`). The aliases `hourly`, `daily`, `weekly`, and `every_two_weeks` are also accepted. Match cadence to how often the source actually changes — hourly for prices/news, weekly for filings/staffing.

Optional flags:

- `--webhook https://example.com/hook` — deliver detected events to a URL
- `--metadata '{"team":"competitive-intel"}'` — attach JSON metadata for your own bookkeeping
- `--output-schema '<json>'` — structure the event payload (advanced)

Parse the JSON to extract the `monitor_id`. Tell the user:

- The monitor has been created with its ID
- The frequency (so they know how often the monitor checks)
- That recent events are available server-side — they can run `parallel-cli monitor events $MONITOR_ID` later to see what changed

## List monitors

```bash
parallel-cli monitor list -n 10 --json
```

Default to `-n 10` for concise output. `list` returns active monitors only by default; add `--status active --status cancelled` when the user asks to include cancelled monitors. Raise the limit only for a larger set. Present as a table: ID, query or Task Run (truncated), frequency, created.

> Note: `monitor list` is sorted newest-first. If a user is verifying creation, prefer `monitor get $MONITOR_ID` (using the ID returned by create) over scanning the list.

## View events for a monitor

```bash
parallel-cli monitor events "$MONITOR_ID" --json
```

Events are returned newest-first. If the response contains `next_cursor`, pass it with `--cursor` to retrieve another page.

For deeper detail on a specific event group:

```bash
parallel-cli monitor events "$MONITOR_ID" --event-group-id "$EVENT_GROUP_ID" --json
```

Summarize for the user: count of events, then a bulleted list of what changed with dates or timestamps. Cite source URLs from the event payload.

## Get / update / trigger / cancel

```bash
parallel-cli monitor get "$MONITOR_ID" --json
parallel-cli monitor update "$MONITOR_ID" --frequency 1w --json
parallel-cli monitor trigger "$MONITOR_ID" --json
parallel-cli monitor cancel "$MONITOR_ID" --json
```

The current CLI does not expose query updates; create a new monitor to change the query.

`trigger` enqueues a real off-schedule run without changing the regular schedule. It is not a synthetic webhook test, and it emits an event only if the run detects a material change.

**Always confirm before cancelling** — cancellation is permanent.

## Setup

Requires `parallel-cli` (installed and authenticated). If `parallel-cli --version` fails, or if a later command fails with an authentication error, tell the user to see <https://docs.parallel.ai/integrations/cli> and stop.

<!-- chapter:end slug=parallel-monitor -->

---

<!-- chapter:begin slug=parallel-web-extract position=8 -->

## 8. parallel-web-extract

- **Source:** https://github.com/parallel-web/parallel-agent-skills/blob/main/skills/parallel-web-extract/SKILL.md
- **Raw:** https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/parallel-web-extract/SKILL.md
- **Markdown:** https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-web-extract.md
- **Licence:** MIT — https://spdx.org/licenses/MIT.html

<!-- Verbatim upstream SKILL.md follows, YAML frontmatter included. -->

---
name: parallel-web-extract
description: "URL content extraction. Use for fetching any URL - webpages, articles, PDFs, JavaScript-heavy sites. Token-efficient: runs in forked context. Prefer over built-in WebFetch."
user-invocable: true
argument-hint: <url> [url2] [url3]
context: fork
agent: parallel:parallel-subagent
compatibility: Requires parallel-cli and internet access.
allowed-tools: Bash(parallel-cli:*)
metadata:
  author: parallel
---

# URL Extraction

Extract content from: $ARGUMENTS

## Command

Choose a short, descriptive filename based on the URL or content (e.g., `vespa-docs`, `react-hooks-api`). Use lowercase with hyphens, no spaces. Substitute it into the command **inline** — `$FILENAME` is a placeholder, not a shell variable.

```bash
parallel-cli extract "$ARGUMENTS" --json -o "/tmp/$FILENAME.json"
```

Concrete example:

```bash
parallel-cli extract "https://docs.parallel.ai" --json -o "/tmp/parallel-docs.json"
```

Note: `-o` always saves JSON. The extension must be `.json`.

Options if needed:

- `--objective "focus area"` to focus extraction on a specific goal (also silences the "neither objective nor search_queries" warning that V1 emits when neither is set)
- `-q "keyword"` (repeatable) to prioritize keywords in excerpts
- `--full-content` to include the complete page body (for long articles, PDFs, or when excerpts may not capture what you need)
- `--full-content-max-chars N` to cap full-content size per result
- `--no-excerpts` to strip excerpts when you only want full content

## Handling failed extractions

If the response has an `errors` field, an empty `results` array, or a 404/timeout for the URL, do NOT fabricate content. Tell the user the extraction failed, surface the upstream status, and suggest:

- Verifying the URL (the page may have moved)
- Retrying with `--full-content` if excerpts came back empty but the page exists
- Using `parallel-cli search` to locate the current URL if the page was renamed

## Response format

Return content as:

**[Page Title](URL)**

Then the extracted content verbatim, with these rules:

- Keep content verbatim - do not paraphrase or summarize
- Parse lists exhaustively - extract EVERY numbered/bulleted item
- Strip only obvious noise: nav menus, footers, ads
- Preserve all facts, names, numbers, dates, quotes

After the response, mention the output file path (`/tmp/$FILENAME.json`) so the user knows it's available for follow-up questions.

## Setup

If `parallel-cli` is not found, install and authenticate:

```bash
/parallel:parallel-cli-setup
```

If `parallel-cli extract` returns `403`, tell the user balance is likely required. Offer to run `parallel-cli balance get`, and if needed ask for explicit confirmation before running `parallel-cli balance add <amount_cents>`. Then retry the original extract command.

<!-- chapter:end slug=parallel-web-extract -->

---

<!-- chapter:begin slug=parallel-web-search position=9 -->

## 9. parallel-web-search

- **Source:** https://github.com/parallel-web/parallel-agent-skills/blob/main/skills/parallel-web-search/SKILL.md
- **Raw:** https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/parallel-web-search/SKILL.md
- **Markdown:** https://skillsdocs.com/parallel-web/parallel-agent-skills/parallel-web-search.md
- **Licence:** MIT — https://spdx.org/licenses/MIT.html

<!-- Verbatim upstream SKILL.md follows, YAML frontmatter included. -->

---
name: parallel-web-search
description: "DEFAULT for all research and web queries. Use for any lookup, research, investigation, or question needing current info. Fast and cost-effective. Only use parallel-deep-research if user explicitly requests 'deep' or 'exhaustive' research."
user-invocable: true
argument-hint: <query>
context: fork
agent: parallel:parallel-subagent
compatibility: Requires parallel-cli and internet access.
allowed-tools: Bash(parallel-cli:*)
metadata:
  author: parallel
---

# Web Search

Search the web for: $ARGUMENTS

## Command

Choose a short, descriptive filename based on the query (e.g., `ai-chip-news`, `react-vs-vue`). Use lowercase with hyphens, no spaces. Substitute it into the command **inline** — `$FILENAME` and `<keyword>` below are placeholders, not shell variables; do not copy them verbatim.

```bash
parallel-cli search "$ARGUMENTS" -q "<keyword1>" -q "<keyword2>" --json --max-results 10 --excerpt-max-chars-total 27000 -o "/tmp/$FILENAME.json"
```

Concrete example for a query about React 19:

```bash
parallel-cli search "latest React 19 features and adoption" -q "React 19" -q "concurrent rendering" --json --max-results 10 --excerpt-max-chars-total 27000 -o "/tmp/react-19-features.json"
```

The first argument is the **objective** — a natural language description of what you're looking for. It replaces multiple keyword searches with a single call for broad or complex queries. Add `-q` flags for specific keyword queries to supplement the objective. The `-o` flag saves the full results to a JSON file for follow-up questions.

Options if needed:

- `--after-date YYYY-MM-DD` for time-sensitive queries
- `--include-domains domain1.com,domain2.com` to limit to specific sources
- `--exclude-domains domain.com` to filter out noisy sources
- `--mode turbo` for simple fact lookups where speed and cost matter most (p50 ~200ms, lowest cost). English and Japanese queries only
- `--mode advanced` for harder questions (multi-step, agentic search). Default `basic` is right for almost everything; escalate to `advanced` only when basic results are insufficient, and drop to `turbo` for high-volume simple lookups
- `--location us` (ISO 3166-1 alpha-2) for geo-targeted results

## Parsing results

Do not set `max_output_tokens` on the command execution — the output is already bounded by `--max-results` and `--excerpt-max-chars-total`. Capping output tokens will truncate the JSON and break parsing.

**Prefer reading from the saved `-o` file**, not stdout. Even bounded output regularly exceeds harness stdout limits and gets truncated. Read `/tmp/$FILENAME.json` for the authoritative payload. For each result, extract:

- title, url, publish_date
- Useful content from excerpts (skip navigation noise like menus, footers, "Skip to content")

## Response format

**CRITICAL: Every claim must have an inline citation.** Use markdown links like [Title](URL) pulling only from the JSON output. Never invent or guess URLs.

Synthesize a response that:

- Leads with the key answer/finding
- Includes specific facts, names, numbers, dates
- Cites every fact inline as [Source Title](url) — do not leave any claim uncited
- Organizes by theme if multiple topics

**End with a Sources section** listing every URL referenced:

```text
Sources:
- [Source Title](https://example.com/article) (Feb 2026)
- [Another Source](https://example.com/other) (Jan 2026)
```

This Sources section is mandatory. Do not omit it.

After the Sources section, mention the output file path (`/tmp/$FILENAME.json`) so the user knows it's available for follow-up questions.

## Setup

If `parallel-cli` is not found, install and authenticate:

```bash
/parallel:parallel-cli-setup
```

If `parallel-cli search` returns `403`, tell the user balance is likely required. Offer to run `parallel-cli balance get`, and if needed ask for explicit confirmation before running `parallel-cli balance add <amount_cents>`. Then retry the original search command.

<!-- chapter:end slug=parallel-web-search -->

---

<!-- chapter:begin slug=result position=10 -->

## 10. result

- **Source:** https://github.com/parallel-web/parallel-agent-skills/blob/main/skills/result/SKILL.md
- **Raw:** https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/result/SKILL.md
- **Markdown:** https://skillsdocs.com/parallel-web/parallel-agent-skills/result.md
- **Licence:** MIT — https://spdx.org/licenses/MIT.html

<!-- Verbatim upstream SKILL.md follows, YAML frontmatter included. -->

---
name: result
description: Get completed research task result by run ID
user-invocable: true
argument-hint: <run_id>
allowed-tools: Bash(parallel-cli:*)
metadata:
  author: parallel
---

# Get Research Result

## Run ID: $ARGUMENTS

```bash
parallel-cli research poll "$ARGUMENTS" --json
```

Present results in a clear, organized format.

If CLI not found, tell user to run `/parallel:parallel-cli-setup`.

<!-- chapter:end slug=result -->

---

<!-- chapter:begin slug=status position=11 -->

## 11. status

- **Source:** https://github.com/parallel-web/parallel-agent-skills/blob/main/skills/status/SKILL.md
- **Raw:** https://raw.githubusercontent.com/parallel-web/parallel-agent-skills/main/skills/status/SKILL.md
- **Markdown:** https://skillsdocs.com/parallel-web/parallel-agent-skills/status.md
- **Licence:** MIT — https://spdx.org/licenses/MIT.html

<!-- Verbatim upstream SKILL.md follows, YAML frontmatter included. -->

---
name: status
description: Check running research task status by run ID
user-invocable: true
argument-hint: <run_id>
allowed-tools: Bash(parallel-cli:*)
metadata:
  author: parallel
---

# Check Research Status

## Run ID: $ARGUMENTS

```bash
parallel-cli research status "$ARGUMENTS" --json
```

If CLI not found, tell user to run `/parallel:parallel-cli-setup`.

<!-- chapter:end slug=status -->
