# Reach MCP — quickstart

## 1. Connect a LinkedIn account

Sign up at https://app.reachmcp.com/signup (7-day trial, no card). Install the Reach MCP Chrome extension and click **Connect** while logged into LinkedIn in that browser. The extension hands Reach the current session; no LinkedIn password is ever typed into Reach. Removing the extension revokes that path. Each account gets its own residential proxy.

For a client's account: generate a branded invitation link from the app and send it; the account owner connects their own session.

## 2. Plug an MCP client

Add `https://app.reachmcp.com/mcp` as a remote MCP server. Claude, ChatGPT and Cursor authenticate with OAuth (a Reach login page opens; nothing to paste). Clients without OAuth can append an API key: `https://app.reachmcp.com/mcp?api_key=mcp_…` or send it as the `X-API-Key` header.

```json
{ "mcpServers": { "reach": { "url": "https://app.reachmcp.com/mcp" } } }
```

Then ask the assistant what it can do: the `reach_playbooks` tool returns the catalogue of ready-made workflows, and `list_accounts` returns the connected accounts with their ids.

## 3. Or call the REST API

Create an API key in the app (**API & MCP**). Every request carries `X-API-Key`. Reference: https://app.reachmcp.com/scalar.

```bash
curl -H "X-API-Key: $KEY" https://app.reachmcp.com/api/linkedin-accounts
curl -H "X-API-Key: $KEY" "https://app.reachmcp.com/api/linkedin/$ACCOUNT_ID/conversations?count=10"
curl -X POST -H "X-API-Key: $KEY" -H "Idempotency-Key: $(uuidgen)" \
     -H "Content-Type: application/json" \
     -d '{"recipient_linkedin_id":"ACoAA…","text":"Thanks for connecting, Ana."}' \
     https://app.reachmcp.com/api/linkedin/$ACCOUNT_ID/messages
```

## 4. React to events instead of polling

Register a webhook (app → **Webhooks**, or `POST https://app.reachmcp.com/api/webhooks/endpoints`) for `message.received` and `connection.new`. Reach posts a signed JSON body to your URL within a few minutes of the event. See [Webhooks](/docs/webhooks.md).

## Things an agent should know

- Every write is subject to the account's daily quotas. A refused call returns `daily_quota_reached` with `retry_at`; act on the code, not the wording.
- Pass an `idempotency_key` (MCP) or `Idempotency-Key` header (REST) on writes you might retry.
- Playbooks always preview before writing and wait for the user to name what to send. Direct tool calls do not; the API key holder is responsible.
- Reads are free of quota; writes to comments, reactions and posts count too.
