Skip to content
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ You can use the first without ever setting up the second.

Nothing, for web search and fetch. The bundled MCP server is anonymous.

The execution skills require `parallel-cli` (installed, authenticated, and funded). The [`parallel-cli-setup`](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.
The execution skills require `parallel-cli` (installed, authenticated, and funded). The [`parallel-cli-setup`](skills/parallel-cli-setup/SKILL.md) skill installs or upgrades the CLI, checks balance after sign-in, and installs skills without reading or handling credentials. Authentication remains a user-controlled step in a trusted terminal — 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.
`migrate-to-parallel` updates an application's own web-data integration. It uses the appropriate Parallel API or SDK and accepts a target-application credential only for an explicitly authorized live smoke test; it never reads the plugin installer's credentials.

## Installation

Expand All @@ -42,13 +42,17 @@ Web search and fetch work immediately after the restart — run `/mcp` to confir
`parallel-search` is connected. No account or API key is required.

For the CLI-backed skills (deep research, enrichment, FindAll, Monitor), install
and authenticate the CLI:
or update the CLI:

```bash
# this will install/update CLI and authenticate if not done already
# this installs or updates the CLI without reading credentials
/parallel:parallel-cli-setup
```

If a CLI command reports that authentication is required, complete the
[documented CLI sign-in flow](https://docs.parallel.ai/integrations/cli) in a
trusted terminal, then return to Claude Code. Do not paste a key into chat.

### OpenAI Codex

Install skills using the built-in skill installer (run inside Codex):
Expand All @@ -57,7 +61,8 @@ Install skills using the built-in skill installer (run inside Codex):
$skill-installer parallel-web/parallel-agent-skills
```

Then run the setup skill to install/auth the CLI:
Then run the setup skill to install or update the CLI. Authentication remains a
user-controlled step in a trusted terminal:

```text
/parallel:parallel-cli-setup
Expand Down
4 changes: 0 additions & 4 deletions skills/choose-your-parallel-api/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,6 @@ Most disappointing results come from choosing the wrong API or configuration, no
from the underlying quality: the right API at the wrong tier, or the right tier
with the wrong knobs. Choose the API first, tier second, knobs third — in that order.

## Setup

`PARALLEL_API_KEY` is the connection secret, server side.

## Step 1 — Know the available surface

```text
Expand Down
10 changes: 6 additions & 4 deletions skills/migrate-to-parallel/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ Resolve `<skill-root>` to the directory containing this `SKILL.md`. Resolve ever

- 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.
- Never inspect, print, or copy live API keys or secret values. Treat the target
application's secret-injection boundary as opaque; verify configuration wiring
and missing-secret behavior without resolving the value.
- 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.
Expand Down Expand Up @@ -88,7 +90,7 @@ 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 `https://api.parallel.ai/v1/search` and an `x-api-key` supplied by the target application's secret-management boundary for direct REST calls. Never read the plugin installer's environment or credential store.
- 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:
Expand Down Expand Up @@ -128,7 +130,7 @@ Do not fill missing fields with plausible-looking constants. Remove obsolete con
- 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.
- Add the target application's chosen Parallel credential setting to checked-in environment templates, validation schemas, setup scripts, deployment manifests, examples, and docs. Bind Parallel clients and headers through that application's existing settings, dependency-injection, or secret-access boundary; do not leave generic reference identifiers such as `parallel_api_key` or `parallel_key` undefined. Recommend the canonical variable name in generated application documentation, but do not read or reuse any credential from the plugin installer's environment. 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.

Expand Down Expand Up @@ -159,7 +161,7 @@ Then run, in order:
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.
7. a live smoke test only when provider calls are explicitly authorized for this task and the target application supplies its Parallel credential through its normal secret boundary, 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.

Expand Down
9 changes: 7 additions & 2 deletions skills/migrate-to-parallel/references/parallel-products.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Verified against the official Parallel OpenAPI and product docs on 2026-07-14. U
Use Extract for known URLs when the application needs focused excerpts or page bodies.

- Endpoint: `POST https://api.parallel.ai/v1/extract`
- Auth: `x-api-key: $PARALLEL_API_KEY`
- Auth: `x-api-key` supplied by the target application's secret-management boundary. Do not read the installer's environment or credential store.
- SDK: `parallel-web` exposes `client.extract(...)` in Python and TypeScript.
- Input: `urls` is required and accepts up to 20 URLs. `objective`, `search_queries`, `max_chars_total`, `session_id`, `client_model`, and `advanced_settings` are optional.
- Full page body: set `advanced_settings.full_content` to `true` or to `{max_chars_per_result: ...}`. Full content is off by default.
Expand All @@ -42,11 +42,16 @@ Treat an HTTP 200 as a possibly partial success. A requested URL can appear in `
Use Chat for an interactive grounded completion when the old path returned an answer rather than only sources.

- Endpoint: `POST https://api.parallel.ai/chat/completions`
- Auth: `Authorization: Bearer $PARALLEL_API_KEY`
- Auth: bearer credential supplied by the target application's secret-management boundary. Do not read the installer's environment or credential store.
- SDK: use the `openai` package with `base_url`/`baseURL` set to `https://api.parallel.ai`. This is not a `parallel-web` client method.
- Models: `speed` is the low-latency option; `lite`, `base`, and `core` are research models with research-basis support.
- Streaming and `response_format` are supported. Several OpenAI-compatible controls, including token limits, `top_p`, and `stop`, are documented as ignored.

In the example below, `parallel_key` stands for the target application's existing
settings, dependency-injection, or secret-access value. Replace it with that
application-owned binding during migration; do not leave it undefined and do not
resolve it from the plugin installer's environment.

Example:

```python
Expand Down
20 changes: 11 additions & 9 deletions skills/migrate-to-parallel/references/parallel-search.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,21 +51,23 @@ Inspect omitted provider values too. For example, a legacy provider's default re

## Auth and SDKs

REST:
REST callers send requests to `POST https://api.parallel.ai/v1/search` with
`Content-Type: application/json` and an `x-api-key` header. The migration skill
must not read the installer's environment or credential store. Wire that header
from the target application's existing secret-management boundary, using a value
the application owner explicitly configured for Parallel.

```bash
curl https://api.parallel.ai/v1/search \
-H "Content-Type: application/json" \
-H "x-api-key: $PARALLEL_API_KEY" \
-d '{"objective":"...","search_queries":["..."]}'
```
The `parallel_api_key` identifiers below stand for the target application's
existing settings, dependency-injection, or secret-access value. Replace them with
that application-owned binding during migration; do not leave them undefined and
do not resolve them from the plugin installer's environment.

Python:

```python
from parallel import Parallel

client = Parallel() # reads PARALLEL_API_KEY
client = Parallel(api_key=parallel_api_key)
response = client.search(
objective="Find the latest official release information.",
search_queries=["official release notes", "latest product release"],
Expand All @@ -82,7 +84,7 @@ TypeScript:
```typescript
import Parallel from "parallel-web";

const client = new Parallel(); // reads PARALLEL_API_KEY
const client = new Parallel({ apiKey: parallelApiKey });
const response = await client.search({
objective: "Find the latest official release information.",
search_queries: ["official release notes", "latest product release"],
Expand Down
68 changes: 18 additions & 50 deletions skills/parallel-cli-setup/SKILL.md
Comment thread
georgeatparallel marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
---
name: parallel-cli-setup
description: Set up and maintain the Parallel CLI (install, auth, balance, skills install)
description: Install or upgrade the Parallel CLI and install its skills without reading, requesting, or handling credentials. Authentication stays in the user's trusted terminal.
Comment thread
georgeatparallel marked this conversation as resolved.
Outdated
user-invocable: true
allowed-tools: Bash(command:*), Bash(brew:*), Bash(uv:*), Bash(npm:*), Bash(pipx:*), Bash(curl:*), Bash(rm:*), Bash(parallel-cli:*)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why remove this?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude’s directory flags this because it pre-approves any command under curl, npm, uv, etc. Removing it keeps the commands available, but they follow the user’s normal approval settings

Also - removed all the other changes to keep this minimal

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.
Install or maintain `parallel-cli` without handling the user's credentials. This
skill may install or upgrade the CLI and install its skills. Authentication is a
separate user-controlled step in a trusted terminal.

## Step 1: Install or upgrade the CLI

Expand Down Expand Up @@ -37,57 +38,21 @@ Upgrade commands (choose based on how it was installed):
- npm: `npm update -g parallel-web-cli`
- homebrew: `brew update && brew upgrade parallel-web/tap/parallel-cli`

## Step 2: Authenticate
## Step 2: Keep authentication user-controlled

Check auth status:
Do not inspect environment variables, credential files, operating-system keychains,
or CLI authentication status. Do not ask the user to paste a key into chat, and do
not start an authentication flow from this skill.

```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 a Parallel command reports that authentication is required, stop and ask the
user to complete the CLI's documented sign-in flow in a trusted terminal. Link to
<https://docs.parallel.ai/integrations/cli>. Resume only after the user confirms
that sign-in completed. Report the original error without printing or probing any
credential metadata.

If this is a headless session, append `--no-browser`.
## Step 3: Check balance after sign-in

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:
Only after the user confirms sign-in, check the current balance:

```bash
parallel-cli balance get
Expand All @@ -101,6 +66,9 @@ 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.

If this command reports an authentication error, return to the user-controlled
flow above. Do not inspect stored credentials to diagnose it.

## Step 4: Install the Parallel skills

Install the skills for the user:
Expand Down
4 changes: 2 additions & 2 deletions skills/parallel-data-enrichment/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,12 +104,12 @@ After completion, link the saved output rather than repeating the monitoring URL

## Setup

If `parallel-cli` is not found, install and authenticate:
If `parallel-cli` is not found, run the credential-free install and upgrade skill:

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

If a documented option or command is missing, identify the install method and upgrade through that method: standalone `parallel-cli update`; pipx `pipx upgrade parallel-web-tools`; uv `uv tool upgrade parallel-web-tools`; Homebrew `brew upgrade parallel-web/tap/parallel-cli`; npm `npm update -g parallel-web-cli`. Recheck version and help in the agent's terminal before retrying.

For authentication or API errors, inspect the returned message. A `403` can indicate permissions, account policy or billing; it does not prove low balance. Check `parallel-cli auth --json` and its `authenticated` boolean when relevant without exposing credentials. Only a billing-specific error warrants a balance check, and adding funds needs explicit confirmation. Reuse saved group IDs; do not automatically retry an ambiguous creation.
For authentication or API errors, inspect the returned message. A `403` can indicate permissions, account policy or billing; it does not prove low balance. Do not inspect environment variables, credential files, keychains, or authentication metadata. On an authentication error, stop and ask the user to complete the documented Parallel CLI sign-in flow in a trusted terminal, then resume only after they confirm it succeeded. Only a billing-specific error warrants a balance check, and adding funds needs explicit confirmation. Reuse saved group IDs; do not automatically retry an ambiguous creation.
4 changes: 2 additions & 2 deletions skills/parallel-deep-research/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,12 @@ Avoid loading the whole report into context. Read only the relevant sections whe

## Setup

If `parallel-cli` is not found, install and authenticate:
If `parallel-cli` is not found, run the credential-free install and upgrade skill:
Comment thread
georgeatparallel marked this conversation as resolved.
Outdated

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

If a documented option or command is missing, identify the install method and upgrade through that method: standalone `parallel-cli update`; pipx `pipx upgrade parallel-web-tools`; uv `uv tool upgrade parallel-web-tools`; Homebrew `brew upgrade parallel-web/tap/parallel-cli`; npm `npm update -g parallel-web-cli`. Recheck version and help in the agent's terminal before retrying.

For authentication or API errors, inspect the returned message. A `403` can indicate permissions, account policy or billing; it does not prove low balance. Check `parallel-cli auth --json` and its `authenticated` boolean when relevant without exposing credentials. Only a billing-specific error warrants a balance check, and adding funds needs explicit confirmation. Reuse saved task IDs; do not automatically retry an ambiguous creation.
For authentication or API errors, inspect the returned message. A `403` can indicate permissions, account policy or billing; it does not prove low balance. Do not inspect environment variables, credential files, keychains, or authentication metadata. On an authentication error, stop and ask the user to complete the documented Parallel CLI sign-in flow in a trusted terminal, then resume only after they confirm it succeeded. Only a billing-specific error warrants a balance check, and adding funds needs explicit confirmation. Reuse saved task IDs; do not automatically retry an ambiguous creation.
Loading