protogrid

Search / com.reachmcp/linkedin

Reach MCP — LinkedIn for AI agents

R2· OAuth, once

LinkedIn for AI agents: inbox, invitations, Sales Navigator search, posts, jobs, quotas, webhooks.

v1.1.0 · active · website · descriptor JSON · versions

An agent can connect after a one-time OAuth consent by a human.Remote endpoint behind OAuth 2. Tokens stay with the agent; the registry only exposes the authorization metadata.
Quality92strong
Trust82of 100
Uptime, 30 days96%
Latency p50442 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "linkedin": {
      "type": "http",
      "url": "https://app.reachmcp.com/mcp",
      "headers": {
        "X-API-Key": "${X_API_KEY}"
      }
    }
  }
}
claude mcp add --transport http linkedin https://app.reachmcp.com/mcp --header "X-API-Key: ${X_API_KEY}"
[mcp_servers.linkedin]
url = "https://app.reachmcp.com/mcp"
env_http_headers = { "X-API-Key" = "X_API_KEY" }
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "linkedin": {
      "type": "remote",
      "url": "https://app.reachmcp.com/mcp",
      "enabled": true,
      "headers": {
        "X-API-Key": "{env:X_API_KEY}"
      }
    }
  }
}
{
  "mcpServers": {
    "linkedin": {
      "type": "http",
      "url": "https://app.reachmcp.com/mcp",
      "headers": {
        "X-API-Key": "${X_API_KEY}"
      }
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=linkedin&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vYXBwLnJlYWNobWNwLmNvbS9tY3AiLCJoZWFkZXJzIjp7IlgtQVBJLUtleSI6IiR7WF9BUElfS0VZfSJ9fQ%3D%3D"
}
{
  "servers": {
    "linkedin": {
      "type": "http",
      "url": "https://app.reachmcp.com/mcp",
      "headers": {
        "X-API-Key": "${X_API_KEY}"
      }
    }
  }
}
{
  "mcpServers": {
    "linkedin": {
      "httpUrl": "https://app.reachmcp.com/mcp",
      "headers": {
        "X-API-Key": "${X_API_KEY}"
      }
    }
  }
}
extensions:
  "linkedin":
    enabled: true
    name: "linkedin"
    type: streamable_http
    uri: "https://app.reachmcp.com/mcp"
    headers:
      "X-API-Key": "${X_API_KEY}"
    timeout: 300

Placeholders to fill from your own secret store: ${X_API_KEY}. The registry never accepts secret values.

Quality 92 / 100strong

protocoln/a · weight 25
  • n/a
    protocol.modern, protocol.stateless, protocol.transport, protocol.list_ttlno remote answered a protocol handshake (not probed yet, unreachable, or local-only)
authorization83 · weight 15
  • pass
    auth.prmProtected Resource Metadata (RFC 9728) published
  • pass
    auth.as_metadataauthorization server metadata reachable
  • warn
    auth.cimdonly Dynamic Client Registration, deprecated in 2026-07-28 in favour of CIMD
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene93 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations52 of 52 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • warn
    tools.token_costabout 12,831 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability100 · weight 15
  • pass
    stability.changesno tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

52 tools, about 12,831 tokens to load them all · tool set 4c1cbb682851 · checked 2026-10-20 10:03 UTC

Tool changes

No tool definition changes recorded. A server's first observation is its baseline; later probes record what changes.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 82 / 100

no-repository
provenance55
liveness98
freshness100
hygiene80

+dns-namespace +website +reachable +uptime-96% +updated-23d-ago -no-repository

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://app.reachmcp.com/mcp streamable-httpoauth2 AS: https://mcp-reach-backend-3icgkfijmq-ew.a.run.appyes96%442 ms–2026-10-20

Tools (52)

accept_invitationAccept a pending received connection request.
archive_conversationArchive or unarchive a LinkedIn conversation. Set archive=false to unarchive. conversation_linkedin_id is the conversation_id returned by list_conversations.
comment_postPost a comment on a LinkedIn post on behalf of the connected account.
connectSend a connection request to a LinkedIn member. Optional message capped at 300 chars (premium) or 200 chars.
create_multi_photoCreate 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).
create_postCreate 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.
create_webhook_endpointRegister 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.
decline_invitationdestructiveDecline/ignore a pending received connection request.
delete_accountdestructiveDelete a LinkedIn account by account_id. Also clears invitation references before deletion.
delete_conversationdestructivePermanently delete a LinkedIn conversation. conversation_linkedin_id is the conversation_id returned by list_conversations.
delete_scheduled_postdestructiveDelete a scheduled LinkedIn post. post_urn is the URN returned by list_scheduled_posts (e.g. urn:li:ugcPost:…).
delete_webhook_endpointdestructiveDelete a webhook endpoint and its delivery history.
followFollow or unfollow a LinkedIn member without connecting. Set follow=false to unfollow.
get_account_quotasread-onlyGet the quotas configuration and usage counters for a LinkedIn account.
get_account_request_logsread-onlyGet request logs for a LinkedIn account with optional filtering by request_type and pagination using limit/offset.
get_account_request_logs_statsread-onlyGet aggregated request-log statistics for a LinkedIn account, grouped by day, week, or month, with optional action and date-range filters.
get_meread-onlyCall LinkedIn Voyager /me for an account through the stored proxy/cookies and return the normalized profile (same fields as Kanbox uses from /me).
invitation_statusread-onlyGet the connection and invitation status between the connected account and a LinkedIn member. Returns is_connection, invitation_type (SENT/PENDING/WITHDRAWN/REFUSED).
like_postLike a LinkedIn post on behalf of the connected account. Pass the post URL, slug, or URN.
list_accountsread-onlyReturn LinkedIn accounts accessible with the provided API key. If the key is restricted, only allowed account IDs are returned.
list_connectionsread-onlyList LinkedIn 1st-degree connections for an account (Voyager dash connections), paged with start/count — same payload as GET /api/linkedin/{account_id}/connections.
list_conversation_messagesread-onlyList 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.
list_conversationsread-onlyList 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).
list_received_invitationsread-onlyList pending connection invitations received by the account (with invitation_secret to accept them).
list_scheduled_postsread-onlyList scheduled LinkedIn posts for an account, paged. Returns post URNs, text content, and scheduled publish times.
list_sent_invitationsread-onlyList pending connection invitations sent by the account that have not yet been accepted.
list_webhook_endpointsread-onlyList 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.
profile_viewersread-onlyGet the list of members who recently viewed the account's profile (requires LinkedIn Premium).
reach_playbooksread-onlySTART 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.
react_messageAdd 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.
remove_connectiondestructiveRemove an existing 1st-degree connection.
reply_commentPost 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.
salesnav_build_search_urlread-onlyBuild 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.
salesnav_list_messaging_threadsread-onlyList 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.
salesnav_list_thread_messagesread-onlyFetch 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.
salesnav_resolve_industryread-onlyResolve 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.
salesnav_send_messageSend 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.
salesnav_typeaheadread-onlyLive 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.
scrape_my_postsread-onlyFetch likers and/or commenters for the account's own recent posts. since_hours limits to posts published in the last N hours (default 24).
scrape_postread-onlyFetch likers and/or commenters for a LinkedIn post. Pass the full post URL or slug. Set liked=true and/or comments=true.
scrape_profileread-onlyFetch 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.
scrape_searchread-onlyRun 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).
send_messageSend a LinkedIn DM via Voyager createMessage: use conversation_linkedin_id for an existing thread or recipient_linkedin_id for a new DM.
star_conversationStar or unstar a LinkedIn conversation. Set star=false to remove the star. conversation_linkedin_id is the conversation_id returned by list_conversations.
test_webhook_endpointread-onlySend a signed 'ping' event to a webhook endpoint right now and report the HTTP status it answered.
update_account_quotasUpdate one or more quota configuration fields for a LinkedIn account. Only provided fields are updated.
update_scheduled_postUpdate 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.
update_webhook_endpointChange a webhook's url, events, account_ids, description or is_active. Only provided fields change. Re-enabling clears the failure counter.
upload_media_from_urlUpload 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.
user_postsread-onlyGet recent posts published by a LinkedIn member (via profileUpdatesV2). Paginate with start/count.
visit_profileSimulate a profile view, triggering a 'viewed your profile' notification for the target member.
withdraw_invitationdestructiveWithdraw a pending sent connection request.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "com.reachmcp/linkedin",
  "_meta": {
    "io.modelcontextprotocol.registry/publisher-provided": {
      "docs": "https://www.reachmcp.com/llms.txt",
      "icon": "https://www.reachmcp.com/icon-512.png",
      "terms": "https://www.reachmcp.com/terms-of-service",
      "openapi": "https://app.reachmcp.com/openapi.json",
      "privacy": "https://www.reachmcp.com/privacy-policy",
      "support": "https://www.reachmcp.com/#faq",
      "tools_reference": "https://www.reachmcp.com/docs/mcp-tools.md"
    }
  },
  "title": "Reach MCP — LinkedIn for AI agents",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://app.reachmcp.com/mcp",
      "type": "streamable-http",
      "headers": [
        {
          "name": "X-API-Key",
          "isSecret": true,
          "description": "Optional. Clients that support OAuth need nothing here (a Reach sign-in page opens). Clients without OAuth send an API key created in the Reach app (API & MCP page)."
        }
      ]
    }
  ],
  "version": "1.1.0",
  "websiteUrl": "https://www.reachmcp.com",
  "description": "LinkedIn for AI agents: inbox, invitations, Sales Navigator search, posts, jobs, quotas, webhooks."
}