# Reach MCP — LinkedIn for AI agents (remote · app.reachmcp.com)

LinkedIn for AI agents: inbox, invitations, Sales Navigator search, posts. Quotas and webhooks.

- Trust score: 67/100 (medium)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- remote · `app.reachmcp.com`: 67/100 (this document), [markdown](https://verifymcp.io/servers/com-reachmcp-linkedin/app.md), [page](https://verifymcp.io/servers/com-reachmcp-linkedin/app)

## Channel facts

- Endpoint: `https://app.reachmcp.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Endpoint Security**: 57/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: this server exposes a tool marked destructive (delete_account) and its handshake is open, but we could not confirm whether a tool call is gated, so we do not assert it is callable unauthenticated.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 80/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 8304 tokens (~159/item across 52 items; 52 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 33/100
  - Stability observed for 10 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 98/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 9 of 10 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "test_webhook_endpoint" implies "send" and declares readOnlyHint instead, contradicting what its own name says it does.
  - An AI judge read all 52 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 20/100
  - Spec-recency check failed: implements MCP spec 2024-11-05; the latest is 2026-07-28.

## Install

### How do I install the Reach MCP — LinkedIn for AI agents server?

Reach MCP — LinkedIn for AI agents is a hosted endpoint at https://app.reachmcp.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http com-reachmcp-linkedin 'https://app.reachmcp.com/mcp'
```

### Cursor

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

### VS Code

```json
{
  "servers": {
    "com-reachmcp-linkedin": {
      "type": "http",
      "url": "https://app.reachmcp.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-reachmcp-linkedin]
url = "https://app.reachmcp.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-reachmcp-linkedin": {
      "type": "remote",
      "url": "https://app.reachmcp.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-reachmcp-linkedin --url 'https://app.reachmcp.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-reachmcp-linkedin:
    url: "https://app.reachmcp.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "com-reachmcp-linkedin": {
      "Transport": "http",
      "Url": "https://app.reachmcp.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-reachmcp-linkedin -t streamable-http -u 'https://app.reachmcp.com/mcp'
```

### Other

```json
{
  "mcpServers": {
    "com-reachmcp-linkedin": {
      "type": "http",
      "url": "https://app.reachmcp.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-20 (score 67, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-18 (score 66, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-16 (score 65, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-14 (score 64, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-12 (score 63, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-11 (score 62, 0)

- [functional improvement] Stability: unverified → 0.03

### 2026-09-10 (score 62)

First indexed and scored.

## MCP tools (52)

### `reach_playbooks` (~142 tokens)

START HERE. Return the catalogue of ready-made LinkedIn playbooks — what this server can actually accomplish, as named workflows rather than raw endpoints. Each entry carries its tool sequence, its prerequisites, and the full instructions to run it. Call this first when the user asks what you can do with their LinkedIn account, or when a request is vague. Pass playbook_id to get one playbook's instructions and then follow them.

Input parameters:

- `include_instructions` (boolean): Also return the full instruction text of every playbook (longer output).
- `playbook_id` (string): Id of one playbook from the catalogue, to get its full instructions.

Output parameters:

- `how_to_use` (string)
- `playbook` (object)
- `playbooks` (array)

### `list_accounts` (~32 tokens)

Return LinkedIn accounts accessible with the provided API key. If the key is restricted, only allowed account IDs are returned.

Output parameters:

- `result` (array): Connected LinkedIn accounts visible to this key.

### `delete_account` (~118 tokens)

Delete a LinkedIn account by account_id. Also clears invitation references before deletion.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…

Output parameters:

- `account_id` (integer)
- `deleted` (boolean)

### `get_account_quotas` (~46 tokens)

Get the quotas configuration and usage counters for a LinkedIn account.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.

Output parameters:

- `daily_comments_conf` (integer)
- `daily_comments_used` (integer)
- `daily_imports_recruiter_conf` (integer)
- `daily_imports_recruiter_used` (integer)
- `daily_imports_salesnav_conf` (integer)
- `daily_imports_salesnav_used` (integer)
- `daily_imports_standard_conf` (integer)
- `daily_imports_standard_used` (integer)
- `daily_invitations_conf` (integer)
- `daily_invitations_used` (integer)
- `daily_messages_conf` (integer)
- `daily_messages_used` (integer)
- `daily_posts_conf` (integer)
- `daily_posts_used` (integer)
- `daily_reactions_conf` (integer)
- `daily_reactions_used` (integer)
- `daily_visits_conf` (integer)
- `daily_visits_used` (integer)
- `id` (integer)

### `update_account_quotas` (~354 tokens)

Update one or more quota configuration fields for a LinkedIn account. Only provided fields are updated.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `daily_comments_conf` (integer): Daily limit for 'comments' on this account; 0 means unlimited.
- `daily_imports_recruiter_conf` (integer): Daily limit for 'imports_recruiter' on this account; 0 means unlimited.
- `daily_imports_salesnav_conf` (integer): Daily limit for 'imports_salesnav' on this account; 0 means unlimited.
- `daily_imports_standard_conf` (integer): Daily limit for 'imports_standard' on this account; 0 means unlimited.
- `daily_invitations_conf` (integer): Daily limit for 'invitations' on this account; 0 means unlimited.
- `daily_messages_conf` (integer): Daily limit for 'messages' on this account; 0 means unlimited.
- `daily_posts_conf` (integer): Daily limit for 'posts' on this account; 0 means unlimited.
- `daily_reactions_conf` (integer): Daily limit for 'reactions' on this account; 0 means unlimited.
- `daily_visits_conf` (integer): Daily limit for 'visits' on this account; 0 means unlimited.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…

Output parameters:

- `account_id` (integer)
- `quotas` (object)
- `updated` (boolean)

### `get_account_request_logs` (~103 tokens)

Get request logs for a LinkedIn account with optional filtering by request_type and pagination using limit/offset.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `limit` (integer): Maximum number of rows to return.
- `offset` (integer): Number of rows to skip.
- `request_type` (string): Only rows of this request type (for example send_message, list_conversations, connect).

Output parameters:

- `result` (array): Request log rows, newest first.

### `get_account_request_logs_stats` (~150 tokens)

Get aggregated request-log statistics for a LinkedIn account, grouped by day, week, or month, with optional action and date-range filters.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `end_date` (string): End of the period, ISO 8601 (default: now).
- `group_by` (string): Bucket size for the statistics: day, week or month.
- `request_type` (string): Only rows of this request type (for example send_message, list_conversations, connect).
- `start_date` (string): Start of the period, ISO 8601 (default: 30 days ago).

Output parameters:

- `available_actions` (array)
- `buckets` (array)
- `end_date` (string)
- `group_by` (string)
- `request_type`
- `start_date` (string)

### `get_me` (~61 tokens)

Call LinkedIn Voyager /me for an account through the stored proxy/cookies and return the normalized profile (same fields as Kanbox uses from /me).

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.

Output parameters:

- `firstname` (string)
- `headline` (string)
- `is_premium` (boolean)
- `lastname` (string)
- `linkedin_id`: MiniProfile id (entityUrn suffix after fs_miniProfile:).
- `linkedin_plain_id`: Numeric member id from objectUrn.
- `linkedin_public_id`: Public / vanity identifier.
- `picture`: Profile picture URL derived from VectorImage artifacts.

### `list_connections` (~89 tokens)

List LinkedIn 1st-degree connections for an account (Voyager dash connections), paged with start/count — same payload as GET /api/linkedin/{account_id}/connections.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `count` (integer): Page size.
- `start` (integer): Pagination offset, 0-based.

Output parameters:

- `count` (integer): Requested page size.
- `items` (array)
- `next_start`: If set, use as the ``start`` query param for the next page (Kanbox-style paging).
- `start` (integer): Offset used for this request.
- `total`: Total connections reported by LinkedIn ``paging.total``.

### `list_conversations` (~181 tokens)

List LinkedIn messenger conversations (Voyager Messaging GraphQL), with optional archived, unread, starred filters and next_cursor paging — same as GET /api/linkedin/{account_id}/conversations. Each item returns conversation_id (the thread id — use this as conversation_linkedin_id when fetching messages or replying) and recipient_linkedin_id (the peer's fsd_profile id — use this as recipient_linkedin_id when sending a new message).

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `archived` (boolean): Only archived conversations.
- `count` (integer): Page size.
- `next_cursor` (string): Cursor returned by the previous page; omit for the first page.
- `starred` (boolean): Only starred conversations.
- `unread` (boolean): Only conversations with unread messages.

Output parameters:

- `archived` (boolean): Matches query: archived folder (``category:ARCHIVE``) when not unread.
- `count` (integer): Requested page size (LinkedIn typically caps at 25).
- `items` (array)
- `next_cursor`: Pass as ``next_cursor`` for the following page when present.
- `starred` (boolean): Matches query: starred folder or client filter when combined.
- `unread` (boolean): Matches query: unread filter (search query with ``read:false``).

### `list_conversation_messages` (~134 tokens)

List messages in a LinkedIn conversation via Voyager ``/messaging/conversations/{id}/events`` (Kanbox ``get_conversation_messages``), with optional created_before paging — same as GET /api/linkedin/{account_id}/conversations/{conversation_linkedin_id}/messages.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `conversation_linkedin_id` (string, required): Conversation (thread) id, as returned by list_conversations.
- `created_before` (string): Only messages created before this Unix timestamp in milliseconds, to page back in time.

Output parameters:

- `conversation_linkedin_id` (string): Kanbox ``Conversation.linkedin_id`` / conversation key.
- `has_more` (boolean): True when LinkedIn likely has older events (page size 20).
- `messages` (array)
- `next_created_before`: Pass as ``created_before`` to fetch the next (older) page.
- `total_count` (integer): Number of messages in this response.

### `list_scheduled_posts` (~79 tokens)

List scheduled LinkedIn posts for an account, paged. Returns post URNs, text content, and scheduled publish times.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `count` (integer): Page size.
- `start` (integer): Pagination offset, 0-based.

Output parameters:

- `count` (integer)
- `posts` (array)
- `start` (integer)
- `total`: Total number of scheduled posts.

### `update_scheduled_post` (~207 tokens)

Update the text and/or scheduled time of an existing scheduled LinkedIn post. post_urn is the URN returned by list_scheduled_posts (e.g. urn:li:ugcPost:…). At least one of text or scheduled_at must be provided.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `post_urn` (string, required): URN of the scheduled post (urn:li:…), from list_scheduled_posts.
- `scheduled_at` (integer): Unix timestamp in milliseconds.
- `text` (string): Plain text to send or post.

Output parameters:

- `post_urn` (string)
- `updated` (boolean)

### `delete_scheduled_post` (~163 tokens)

Delete a scheduled LinkedIn post. post_urn is the URN returned by list_scheduled_posts (e.g. urn:li:ugcPost:…).

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `post_urn` (string, required): URN of the scheduled post (urn:li:…), from list_scheduled_posts.

Output parameters:

- `deleted` (boolean)
- `post_urn` (string)

### `upload_media_from_url` (~209 tokens)

Upload an image to LinkedIn by fetching it from a public URL. Returns a digitalmediaAsset URN (urn:li:digitalmediaAsset:…) that can be passed to create_post (single image) or create_multi_photo (multi-photo). Use this instead of upload-media when working as an agent — no binary file upload needed.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `image_url` (string, required): Publicly accessible URL of the image to upload.
- `media_upload_type` (string): LinkedIn media upload type (default: IMAGE_SHARING).

Output parameters:

- `urn` (string): urn:li:digitalmediaAsset:… to pass as media_urn

### `create_multi_photo` (~228 tokens)

Create a LinkedIn multi-photo object from a list of digitalmediaAsset URNs. Returns an identifierUrn (urn:li:fsd_multiPhoto:…) to pass to create_post. author_urn is the urn:li:fsd_profile:… of the connected account (get it from get_me).

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `alt_texts` (array): Optional alt text per image (same order as media_urns).
- `author_urn` (string, required): Only messages from this author URN.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `media_urns` (array, required): List of urn:li:digitalmediaAsset:… URNs.

Output parameters:

- `identifier_urn` (string): URN to pass as media_urn of create_post

### `create_post` (~256 tokens)

Create or schedule a LinkedIn post, optionally with a media attachment. For a single image pass a urn:li:digitalmediaAsset:… URN; for multiple images pass a urn:li:fsd_multiPhoto:… URN from create_multi_photo. Set scheduled_at (Unix ms) to schedule; omit it to publish immediately.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `allowed_commenters_scope` (string): 'ALL' or 'CONNECTIONS_ONLY'.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `media_urn` (string): Optional media URN to attach.
- `scheduled_at` (integer): Scheduled publish time in Unix milliseconds. Omit to publish now.
- `text` (string, required): Plain text to send or post.
- `visibility` (string): 'ANYONE' or 'CONNECTIONS_ONLY'.

Output parameters:

- `resource_key` (string): Identifier of the created or scheduled post

### `send_message` (~235 tokens)

Send a LinkedIn DM via Voyager createMessage: use conversation_linkedin_id for an existing thread or recipient_linkedin_id for a new DM.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `conversation_linkedin_id` (string): Conversation (thread) id, as returned by list_conversations.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `in_mail_premium` (boolean): Send as InMail to someone outside the network (premium accounts); requires recipient_linkedin_id.
- `recipient_linkedin_id` (string): Recipient profile id (fsd_profile id) to start a new conversation; from list_conversations or scrape_profile. Omit when replying in an existing conversation.
- `text` (string): Plain text to send or post.

Output parameters:

- `status_code` (integer): HTTP status from LinkedIn (e.g. 201 on success).
- `success` (boolean)

### `scrape_profile` (~102 tokens)

Fetch a complete LinkedIn profile (name, headline, company, experience, skills…). Pass a LinkedIn URL, vanity name, internal member ID, or Sales Navigator lead URL. Uses SalesNav API when available for richer data.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `linkedin_id_or_url` (string, required): LinkedIn profile URL, vanity name, Sales Navigator URL, or internal member ID.

Output parameters:

- `company`: Current company name.
- `company_description`
- `company_employee_count`
- `company_employee_range`
- `company_id`: LinkedIn company ID.
- `company_industry`
- `company_linkedin`: LinkedIn company page URL.
- `company_location`
- `company_logo`
- `company_specialties`
- `company_type`
- `company_website`
- `company_year_founded`
- `connections`
- `degree`: Network degree: 1, 2, or 3.
- `firstname`
- `full_name`: Full name as returned by LinkedIn (standard search only).
- `headline`
- `industry`
- `is_open_profile`
- `is_opentowork`
- `is_premium`
- `job`: Current job title.
- `job_description`
- `languages`
- `lastname`
- `linkedin_id` (string): Profile ID (fsd_profile or ts_profile suffix).
- `linkedin_plain_id`: Numeric member ID (objectUrn suffix).
- `linkedin_public_id`: Vanity URL slug (/in/<slug>).
- `location`
- `month_company`: Tenure at current company (months).
- `month_position`: Tenure at current position (months).
- `picture`: Profile picture URL.
- `profile_url`: Public LinkedIn profile URL.
- `salesnavigator_url`: Sales Navigator profile URL (SalesNav searches only).
- `skills`
- `startmonth_position`
- `startyear_position`
- `summary`
- `year_company`: Tenure at current company (years).
- `year_position`: Tenure at current position (years).

### `scrape_search` (~123 tokens)

Run one page of a LinkedIn, Sales Navigator, or Recruiter search and return normalized profile rows. Pass the full search URL. Use start+count to paginate (count ignored for standard LinkedIn, fixed ~10/page).

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `count` (integer): Page size (max 25). Ignored for standard LinkedIn.
- `start` (integer): Pagination offset.
- `url` (string, required): Full LinkedIn / SalesNav / Recruiter search URL.

Output parameters:

- `count` (integer): Requested page size.
- `items` (array)
- `next_start`: Pass as ``start`` for the next page when present.
- `start` (integer): Offset used for this request.
- `total`: Total results reported by LinkedIn.

### `visit_profile` (~143 tokens)

Simulate a profile view, triggering a 'viewed your profile' notification for the target member.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `linkedin_id_or_url` (string, required): LinkedIn member ID, vanity name, or profile URL.

Output parameters:

- `visited` (boolean)

### `profile_viewers` (~49 tokens)

Get the list of members who recently viewed the account's profile (requires LinkedIn Premium).

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.

Output parameters:

- `total` (integer)
- `viewers` (array)

### `user_posts` (~96 tokens)

Get recent posts published by a LinkedIn member (via profileUpdatesV2). Paginate with start/count.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `count` (integer): Number of posts (max 50).
- `linkedin_id_or_url` (string, required): LinkedIn member ID, vanity name, or profile URL.
- `start` (integer): Pagination offset.

Output parameters:

- `posts` (array)
- `total_posts` (integer)

### `scrape_post` (~93 tokens)

Fetch likers and/or commenters for a LinkedIn post. Pass the full post URL or slug. Set liked=true and/or comments=true.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `comments` (boolean): Include commenters.
- `liked` (boolean): Include likers.
- `post_id_or_url` (string, required): LinkedIn post URL or slug.

Output parameters:

- `items` (array)
- `post_id` (string)
- `total_comments` (integer)
- `total_likes` (integer)

### `scrape_my_posts` (~125 tokens)

Fetch likers and/or commenters for the account's own recent posts. since_hours limits to posts published in the last N hours (default 24).

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `comments` (boolean): Include the people who commented, with their comment text.
- `liked` (boolean): Include the people who liked.
- `max_posts` (integer): Max posts to process (max 20).
- `since_hours` (integer): Only posts from the last N hours (max 720).

Output parameters:

- `posts` (array)
- `total_posts` (integer)

### `like_post` (~150 tokens)

Like a LinkedIn post on behalf of the connected account. Pass the post URL, slug, or URN.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `post_url_or_urn` (string, required): LinkedIn post URL, slug, or urn:li:activity:….

Output parameters:

- `liked` (boolean)

### `comment_post` (~147 tokens)

Post a comment on a LinkedIn post on behalf of the connected account.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `post_url_or_urn` (string, required): LinkedIn post URL, slug, or URN.
- `text` (string, required): Comment text.

Output parameters:

- `commented` (boolean)

### `reply_comment` (~169 tokens)

Post a reply to an existing LinkedIn comment. Pass the comment_id (URN) returned by scrape_post as comment_urn — it is used directly as threadUrn.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `comment_urn` (string, required): URN of the comment to reply to (comment_id from scrape-post).
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `text` (string, required): Reply text.

Output parameters:

- `replied` (boolean)

### `star_conversation` (~171 tokens)

Star or unstar a LinkedIn conversation. Set star=false to remove the star. conversation_linkedin_id is the conversation_id returned by list_conversations.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `conversation_linkedin_id` (string, required): Conversation (thread) id, as returned by list_conversations.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `star` (boolean): True to star, False to unstar.

Output parameters:

- `starred` (boolean): Current starred state

### `archive_conversation` (~170 tokens)

Archive or unarchive a LinkedIn conversation. Set archive=false to unarchive. conversation_linkedin_id is the conversation_id returned by list_conversations.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `archive` (boolean): True to archive, False to unarchive.
- `conversation_linkedin_id` (string, required): Conversation (thread) id, as returned by list_conversations.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…

Output parameters:

- `archived` (boolean): Current archived state

### `delete_conversation` (~147 tokens)

Permanently delete a LinkedIn conversation. conversation_linkedin_id is the conversation_id returned by list_conversations.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `conversation_linkedin_id` (string, required): Conversation (thread) id, as returned by list_conversations.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…

Output parameters:

- `deleted` (boolean)

### `react_message` (~258 tokens)

Add or remove an emoji reaction on a LinkedIn message. Set react=false to remove the reaction. message_urn is the message_urn returned by list_conversation_messages (e.g. urn:li:msg_message:(urn:li:fsd_profile:…,123456789)). emoji is a Unicode emoji character (e.g. 👍, ❤️). Pass conversation_linkedin_id to also mark the conversation as read.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `conversation_linkedin_id` (string): Conversation ID — when provided the conversation is marked as read.
- `emoji` (string, required): Unicode emoji character (e.g. 👍, ❤️).
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `message_urn` (string, required): Full message URN to react to.
- `react` (boolean): True to add the reaction, False to remove it.

Output parameters:

- `emoji` (string)
- `reacted` (boolean)

### `connect` (~158 tokens)

Send a connection request to a LinkedIn member. Optional message capped at 300 chars (premium) or 200 chars.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `linkedin_id_or_url` (string, required): LinkedIn member ID, vanity name, or profile URL.
- `message` (string): Optional personalised invitation note.

Output parameters:

- `connected` (boolean): Invitation sent

### `invitation_status` (~101 tokens)

Get the connection and invitation status between the connected account and a LinkedIn member. Returns is_connection, invitation_type (SENT/PENDING/WITHDRAWN/REFUSED).

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `linkedin_id_or_url` (string, required): The LinkedIn member: profile URL, vanity name (the part after /in/), Sales Navigator URL, or internal member id.

Output parameters:

- `degree`: Connection distance (1, 2 or 3).
- `invitation_id`: Invitation URN, if any.
- `invitation_secret`: Shared secret, required to accept a received invitation.
- `invitation_type`: 'SENT' (pending sent), 'PENDING' (received, awaiting acceptance), 'WITHDRAWN', or 'REFUSED'.
- `is_connection` (boolean): True if the member is a 1st-degree connection.

### `withdraw_invitation` (~146 tokens)

Withdraw a pending sent connection request.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `linkedin_id_or_url` (string, required): The LinkedIn member: profile URL, vanity name (the part after /in/), Sales Navigator URL, or internal member id.

Output parameters:

- `withdrawn` (boolean)

### `accept_invitation` (~146 tokens)

Accept a pending received connection request.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `linkedin_id_or_url` (string, required): The LinkedIn member: profile URL, vanity name (the part after /in/), Sales Navigator URL, or internal member id.

Output parameters:

- `accepted` (boolean)

### `decline_invitation` (~149 tokens)

Decline/ignore a pending received connection request.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `linkedin_id_or_url` (string, required): The LinkedIn member: profile URL, vanity name (the part after /in/), Sales Navigator URL, or internal member id.

Output parameters:

- `declined` (boolean)

### `remove_connection` (~147 tokens)

Remove an existing 1st-degree connection.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `linkedin_id_or_url` (string, required): The LinkedIn member: profile URL, vanity name (the part after /in/), Sales Navigator URL, or internal member id.

Output parameters:

- `removed` (boolean)

### `follow` (~170 tokens)

Follow or unfollow a LinkedIn member without connecting. Set follow=false to unfollow.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `follow` (boolean): True to follow, False to unfollow.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `linkedin_id_or_url` (string, required): The LinkedIn member: profile URL, vanity name (the part after /in/), Sales Navigator URL, or internal member id.

Output parameters:

- `following` (boolean): Current follow state

### `list_received_invitations` (~75 tokens)

List pending connection invitations received by the account (with invitation_secret to accept them).

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `count` (integer): Page size (max 100).
- `start` (integer): Pagination offset, 0-based.

Output parameters:

- `count` (integer)
- `invitations` (array)
- `start` (integer)
- `total` (integer)

### `list_sent_invitations` (~74 tokens)

List pending connection invitations sent by the account that have not yet been accepted.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `count` (integer): Page size (max 100).
- `start` (integer): Pagination offset, 0-based.

Output parameters:

- `count` (integer)
- `invitations` (array)
- `start` (integer)
- `total` (integer)

### `salesnav_list_thread_messages` (~127 tokens)

Fetch a Sales Navigator thread with all its messages and participant profiles (salesApiMessagingThreads/{id}). Requires a Sales Navigator subscription. Use the thread id returned by salesnav_list_messaging_threads. message_count controls how many (most recent) messages are returned; compare with total_message_count in the response to know if more exist.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `message_count` (integer): Number of most-recent messages to return.
- `thread_id` (string, required): Sales Navigator thread ID.

Output parameters:

- `archived` (boolean)
- `id` (string): Sales Navigator thread ID.
- `messages` (array)
- `next_page_starts_at`: Unix ms timestamp — value from the oldest thread, used as page_starts_at cursor.
- `participants` (array)
- `restrictions` (array)
- `total_message_count` (integer)
- `unread_count` (integer)

### `salesnav_send_message` (~180 tokens)

Send a message in an existing Sales Navigator thread (salesApiMessageActions). Requires the account to have a Sales Navigator subscription. Use the thread id returned by salesnav_list_messaging_threads.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `copy_to_crm` (boolean): Copy message to CRM.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `text` (string, required): Message body (plain text).
- `thread_id` (string, required): Sales Navigator thread ID.

Output parameters:

- `message_id`
- `status_code` (integer)
- `success` (boolean)
- `thread_id`

### `salesnav_list_messaging_threads` (~127 tokens)

List Sales Navigator messaging threads (salesApiMessagingThreads). Requires the account to have a Sales Navigator subscription (has_sales_nav). Returns threads with messages and participant profiles. Paginate by passing next_page_starts_at from the previous response as page_starts_at.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `count` (integer): Threads per page.
- `filter` (string): Conversation folder.
- `page_starts_at` (integer): Pagination cursor — next_page_starts_at from the previous response.

Output parameters:

- `count` (integer)
- `filter` (string): Filter used: INBOX or ARCHIVE.
- `items` (array)
- `next_page_starts_at`: Pass as page_starts_at to fetch the next (older) page. None when there are no more results.
- `page_starts_at`: Cursor passed in the request (None for first page).
- `total`: Total number of threads matching the filter.

### `salesnav_resolve_industry` (~130 tokens)

Resolve an industry name (any language) to its LinkedIn Industry Code(s) using the bundled Industry Codes V2 taxonomy (offline, no LinkedIn call). Returns ranked candidates with id, label and hierarchy path. Use the returned id(s) in salesnav_build_search_url's `industry` filter. Call once per industry term; if several candidates look plausible, pick by the hierarchy path.

Input parameters:

- `limit` (integer): Maximum number of rows to return.
- `query` (string, required): Industry name to look up, e.g. 'software', 'banque', 'real estate'.

Output parameters:

- `candidates` (array)
- `query` (string)

### `salesnav_typeahead` (~174 tokens)

Live Sales Navigator autocomplete for facets whose ids are dynamic. Use type='geo' to resolve a location to its REGION id (the only reliable way — LinkedIn region ids are not enumerable), and type='company' / 'school' / 'title' for those entity facets. Returns [{id, displayValue, headline}]. Feed the chosen id into salesnav_build_search_url (region / current_company / school / current_title). Requires a connected account.

Input parameters:

- `account_id` (integer, required): Reach id of the LinkedIn account to act on, from list_accounts.
- `count` (integer): Page size.
- `query` (string, required): Text to autocomplete, e.g. 'Paris', 'Google', 'HEC'.
- `type` (string): Facet to autocomplete. 'geo' -> region ids.

Output parameters:

- `query` (string)
- `results` (array)
- `type` (string)

### `salesnav_build_search_url` (~935 tokens)

Build a Sales Navigator people-search URL from structured lead-search filters, using as many filters as the request implies. RESOLUTION: `industry` accepts numeric ids OR names (auto-resolved via the taxonomy); `region` accepts numeric REGION ids OR location names (auto-resolved via geo typeahead — needs account_id). If a name is ambiguous, the tool returns {needs_disambiguation:[...]} with candidates instead of a URL — re-call with the chosen id. BOOLEAN: `keywords` and `current_title` accept LinkedIn boolean syntax (AND/OR/NOT, quotes, parentheses). EXCLUSION: any list value may be an object {id|name, exclude:true}. Set execute=true to also run the first page of results (reuses the live search) and return leads.

Input parameters:

- `account_id` (integer): Required when passing location/industry NAMES or execute=true.
- `company_headcount` (array): COMPANY_HEADCOUNT codes: A=Self-employed B=1-10 C=11-50 D=51-200 E=201-500 F=501-1000 G=1001-5000 H=5001-10000 I=10001+.
- `company_type` (array): COMPANY_TYPE: C=Public P=Privately Held N=Non Profit D=Educational S=Partnership E=Self-Employed O=Self Owned G=Government.
- `count` (integer): Page size.
- `current_company` (array): Resolved COMPANY ids (salesnav_typeahead type=company).
- `current_title` (string): Current job title; free text + boolean (e.g. '(CTO OR "VP Engineering") NOT interim').
- `execute` (boolean): Also run the first results page and return leads.
- `first_name` (string): First name filter.
- `follows_your_company` (boolean): Only people who follow your company page.
- `function` (array): FUNCTION 1-26: 1 Accounting 4 Business Dev 8 Engineering 10 Finance 12 HR 13 IT 15 Marketing 18 Operations 19 Product 25 Sales 26 Support (etc.).
- `group` (array): LinkedIn groups: names or ids.
- `industry` (array): Industry ids (use salesnav_resolve_industry) or names to auto-resolve. Items may be {id|name, exclude}.
- `keywords` (string): Global keyword search; supports boolean operators.
- `last_name` (string): Last name filter.
- `past_colleague` (boolean): Only past colleagues.
- `past_company` (array): Past companies: names or ids; add exclude:true to exclude one.
- `past_title` (string): Boolean search on past job titles.
- `posted_on_linkedin` (boolean): Only people who posted on LinkedIn in the last 30 days.
- `profile_language` (array): ISO 639-1 codes: en fr es de it pt nl ...
- `recently_changed_jobs` (boolean): Only people who changed jobs in the last 90 days.
- `region` (array): REGION ids (use salesnav_typeahead type=geo) or location names to auto-resolve. Items may be {id|name, exclude}.
- `relationship` (array): RELATIONSHIP: F=1st S=2nd A=Group members O=3rd+.
- `school` (array): Resolved SCHOOL ids.
- `seniority_level` (array): SENIORITY: 320 Owner/Partner 310 CXO 300 VP 220 Director 210 Exp. Manager 200 Entry Manager 130 Strategic 120 Senior 110 Entry 100 Trainee.
- `start` (integer): Pagination offset, 0-based.
- `viewed_your_profile` (boolean): Only people who viewed your profile recently.
- `with_shared_experiences` (boolean): Only people with shared experiences (school, company, group).
- `years_at_current_company` (array): 1=<1y 2=1-2y 3=3-5y 4=6-10y 5=>10y.
- `years_in_current_position` (array): 1=<1y 2=1-2y 3=3-5y 4=6-10y 5=>10y.
- `years_of_experience` (array): 1=<1y 2=1-2y 3=3-5y 4=6-10y 5=>10y.

Output parameters:

- `applied_filters` (array)
- `items` (array): First page of results when execute=true
- `needs_disambiguation` (array): Present instead of url when a name matched several ids
- `query` (string)
- `start` (integer)
- `total` (integer)
- `url` (string): Sales Navigator people-search URL

### `list_webhook_endpoints` (~83 tokens)

List the webhooks registered for this user: the URLs Reach calls when a conversation gets a new message (message.received), the account gains a 1st-degree connection (connection.new), an account changes connection state (account.status_changed) or a daily quota is close to or at its limit (quota.threshold_reached, quota.reached). Read-only.

Output parameters:

- `endpoints` (array)
- `event_types` (object)

### `create_webhook_endpoint` (~250 tokens)

Register a URL to be called when something happens on LinkedIn, so an agent or an n8n/Make workflow can react instead of polling. Returns the signing secret ONCE; deliveries carry 'Reach-Signature: t=<unix>,v1=<hex HMAC-SHA256(secret, t + '.' + body)>'. Events: message.received, connection.new, account.status_changed, quota.threshold_reached, quota.reached, or '*' for all. Omit account_ids to subscribe for every account of the user. https only.

Input parameters:

- `account_ids` (array): Optional: only these LinkedIn account ids.
- `description` (string): Free-text label for your own reference.
- `events` (array, required): Event types, or ['*'].
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `url` (string, required): https URL that accepts a JSON POST.

Output parameters:

- `account_ids` (array|null)
- `consecutive_failures` (integer)
- `created_at` (string)
- `description` (string)
- `disabled_reason` (string)
- `events` (array)
- `id` (integer)
- `is_active` (boolean)
- `last_delivery_at` (string)
- `note` (string)
- `secret` (string): Signing secret, returned once
- `url` (string)

### `update_webhook_endpoint` (~242 tokens)

Change a webhook's url, events, account_ids, description or is_active. Only provided fields change. Re-enabling clears the failure counter.

Input parameters:

- `account_ids` (array): Only these LinkedIn account ids; omit for every account of the user.
- `description` (string): Free-text label for your own reference.
- `endpoint_id` (integer, required): Webhook endpoint id, from list_webhook_endpoints.
- `events` (array): Event types to subscribe to (message.received, connection.new, account.status_changed, quota.threshold_reached, quota.reached) or ['*'].
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…
- `is_active` (boolean): Pause (false) or resume (true) deliveries.
- `url` (string): https URL that receives the signed JSON POST (http accepted for localhost only).

Output parameters:

- `account_ids` (array|null)
- `consecutive_failures` (integer)
- `created_at` (string)
- `description` (string)
- `disabled_reason` (string)
- `events` (array)
- `id` (integer)
- `is_active` (boolean)
- `last_delivery_at` (string)
- `url` (string)

### `delete_webhook_endpoint` (~110 tokens)

Delete a webhook endpoint and its delivery history.

Input parameters:

- `endpoint_id` (integer, required): Webhook endpoint id, from list_webhook_endpoints.
- `idempotency_key` (string): Optional. A key you choose (a UUID is fine) that names this exact call. If you retry with the same key and the same arguments, the first call's result is returned and nothing is done twice on LinkedI…

Output parameters:

- `deleted` (boolean)
- `endpoint_id` (integer)

### `test_webhook_endpoint` (~50 tokens)

Send a signed 'ping' event to a webhook endpoint right now and report the HTTP status it answered.

Input parameters:

- `endpoint_id` (integer, required): Webhook endpoint id, from list_webhook_endpoints.

Output parameters:

- `ok` (boolean)
- `response_excerpt` (string)
- `response_status` (integer|null)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-reachmcp-linkedin/app#diagnostics

## Score history

- 2026-09-20: 67
- 2026-09-19: 66
- 2026-09-18: 66
- 2026-09-17: 65
- 2026-09-16: 65
- 2026-09-15: 64
- 2026-09-14: 64
- 2026-09-13: 63
- 2026-09-12: 63
- 2026-09-11: 62
- 2026-09-10: 62

## Common questions

### What is the Reach MCP — LinkedIn for AI agents server?

Reach MCP — LinkedIn for AI agents is listed in the public MCP registry as com.reachmcp/linkedin. LinkedIn for AI agents: inbox, invitations, Sales Navigator search, posts. Quotas and webhooks. This page covers its hosted endpoint (https://app.reachmcp.com/mcp).

### Is the Reach MCP — LinkedIn for AI agents server safe to use?

Reach MCP — LinkedIn for AI agents scores 67 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Reach MCP — LinkedIn for AI agents server expose?

Reach MCP — LinkedIn for AI agents exposes 52 tools: reach_playbooks, list_accounts, delete_account, get_account_quotas, update_account_quotas, and 47 more. Their descriptions and schemas cost roughly 8,304 tokens of context every time the server is loaded.

### Does the Reach MCP — LinkedIn for AI agents server require authentication?

No. We connected to Reach MCP — LinkedIn for AI agents without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Reach MCP — LinkedIn for AI agents server still maintained?

Reach MCP — LinkedIn for AI agents is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://app.reachmcp.com/mcp
- Website: https://www.reachmcp.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-reachmcp-linkedin/app.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-reachmcp-linkedin/app.json
- HTML version of this page: https://verifymcp.io/servers/com-reachmcp-linkedin/app
