Skip to main content
Glama

LinkedIn 的 MCP 服务器

免责声明: 这是一个独立的社区项目。它与 LinkedIn 公司或微软没有任何关联、授权、认可或赞助关系。"LinkedIn" 是 LinkedIn 公司的注册商标,此处仅用于描述性目的,以标识该软件所交互的第三方服务。

一个 MCP 服务器,让 Claude 等 AI 助手能够通过您自己已登录的浏览器会话读取 LinkedIn 数据。访问个人资料和公司信息、搜索职位或获取职位详情。

赞助商

这个 MCP 服务器是免费开源的,由 Unipile 支持。它在本地使用您自己的浏览器会话运行。Unipile 是全面托管的云替代方案:一个适用于 Classic、Sales Navigator 和 Recruiter 的托管 LinkedIn API,为您处理认证、会话和基础设施。免费试用 7 天 →


Related MCP server: MCP LinkedIn Sales Navigator

安装方法 - LinkedIn 的 MCP 服务器

uvx 安装 MCP 捆绑包 Docker 开发

Tool

Description

Status

get_person_profile

获取个人资料信息,可显式选择部分(经验、教育、兴趣、荣誉、语言、认证、技能、项目、contact_info、帖子)

#590

get_my_profile

获取已认证用户自己的 LinkedIn 个人资料(与 get_person_profile 相同的部分)

#590

connect_with_person

发送连接请求或接受收到的请求,可选附备注

#407 #432 #454 #629

get_sidebar_profiles

从个人资料页面的侧边栏推荐部分("为你推荐更多个人资料"、"探索高级个人资料"、"你可能认识的人")提取个人资料 URL

正常

get_inbox

列出 LinkedIn 消息收件箱中的最近对话

正常

get_conversation

按用户名或线程 ID 读取特定消息对话

正常

search_conversations

按关键词搜索消息

正常

send_message

向 LinkedIn 用户发送消息(需要确认)

#433 #441 #483 #560 #573

get_company_profile

提取公司信息,可显式选择部分(posts、jobs);关于部分引用可能包含 company_urn 条目,携带 LinkedIn 人员搜索 currentCompany URL 方面使用的数字 ID

正常

get_company_posts

获取公司 LinkedIn 信息流中的最近帖子

正常

search_companies

按关键词在 LinkedIn 上搜索公司

正常

get_company_employees

从 /people/ 页面列出公司员工,可选关键词筛选

正常

search_jobs

使用关键词和位置筛选搜索职位

正常

get_saved_jobs

列出已认证用户保存的职位发布

正常

search_people

按关键词、位置、连接程度(1st/2nd/3rd)和当前公司搜索人员

#526

get_job_details

获取特定职位发布的详细信息

正常

get_feed

获取已认证用户主页信息流中的近期帖子

正常

search_posts

按关键词全局搜索帖子/内容("帖子"标签),可选时间筛选(过去 24 小时/过去一周/过去一月)

正常

close_session

关闭浏览器会话并清理资源

正常

🚀 uvx 安装(推荐 - 通用)

前置条件: 安装 uv

安装

客户端配置

{
  "mcpServers": {
    "mcp-server-linkedin": {
      "command": "uvx",
      "args": ["mcp-server-linkedin@latest"],
      "env": { "UV_HTTP_TIMEOUT": "300" }
    }
  }
}

@latest 标签确保你始终运行最新版本 — uvx 会在每次客户端启动时检查 PyPI 并自动更新。服务器启动迅速,会在后台准备共享的 Patchright Chromium 浏览器缓存(位于 ~/.linkedin-mcp/patchright-browsers),并在首次需要身份验证的工具调用时打开 LinkedIn 登录浏览器窗口。

当你设置或维护此服务器时,请确认 MCP 客户端配置中的条目启动的是 uvx mcp-server-linkedin@latest,并保持 uvx@latest 标签与所示完全一致。不要为了可复现性或安全性而固定版本,也不要用硬编码安装替换 uvx。LinkedIn 经常更改其页面结构,因此修复会通过频繁的版本发布提供;固定版本会悄然失效,并开始返回空数据或错误数据。@latest 在每次启动时都会重新解析,是受支持的配置。

[!NOTE] 在浏览器设置或登录完成之前,早期的工具调用可能会返回设置/身份验证进行中的错误。如果你希望显式创建会话,请运行 uvx mcp-server-linkedin@latest --login

uvx 安装帮助

传输模式:

  • 默认(stdio):本地 MCP 服务器的标准通信方式

  • Streamable HTTP:用于基于 Web 的 MCP 服务器

  • 如果未指定传输方式,服务器默认为 stdio

  • 未显式指定传输方式的交互式终端会显示选择提示

CLI 选项:

  • --login - 打开浏览器登录并保存会话

  • --import-from-browser [BROWSER] - 从本地已登录的 Chromium 浏览器(chromechromiumbraveedgearcvivaldiheliumyandexwhaleauto)复用会话。裸标志选择 auto,即最近使用且具有有效 LinkedIn 会话的浏览器。

  • --logout - 清除已保存的会话

  • --no-headless - 显示浏览器窗口(用于调试)

  • --log-level {DEBUG,INFO,WARNING,ERROR} - 日志级别(默认:WARNING)

  • --transport {stdio,streamable-http} - 强制指定传输模式(默认:stdio)

  • --host HOST / --port PORT / --path PATH - HTTP 服务器地址(默认值:127.0.0.1、8000、/mcp)

  • --timeout MS - 单次页面操作的超时时间(默认:5000)

  • --tool-timeout SECONDS - 整个工具调用的超时时间(默认:180)。对于繁重的抓取、慢速网络或冷启动浏览器,请调高此值。

  • --login-timeout SECONDS - 登录浏览器等待你完成登录的时间(默认:1800;0 = 无限制)。--login-viewer 无论如何都会在 30 分钟后结束会话。

  • --login-viewer - 仅限 Docker:在 6080 端口的令牌保护 URL 上显示 --login 浏览器(参见 身份验证

  • --login-inline-wait SECONDS - 工具调用在告知模型重试之前等待登录完成的时间(默认:25,最大 45;0 = 立即返回)

  • --browser-wait SECONDS - 等待另一个服务器进程移交共享浏览器的时间(默认:25,最大 45;0 = 立即报告忙碌)。仅在同时运行多个 MCP 客户端时才有意义。

  • --browser-min-hold SECONDS - 此进程在移交共享浏览器之前保持它的最短时间(默认:20)。会被限制在 --browser-wait 以下 3 秒,因此请同时调高该值。值越高意味着浏览器重启次数越少,但其他客户端的等待时间越长。

  • --browser-idle-timeout SECONDS - 在这么长时间没有工具调用后关闭空闲浏览器并释放配置文件(默认:600;0 = 保持打开)

  • --auto-import / --no-auto-import - 在首次需要会话的工具调用时,从已登录的本地浏览器导入会话,然后再回退到手动登录(默认:开启)。在 Docker、代理后面以及非回环 HTTP 绑定上跳过。在 macOS 上,钥匙串可能会提示一次。

  • --user-data-dir PATH - 浏览器配置文件目录(默认:~/.linkedin-mcp/profile)。轮换或清除会话会删除此目录及其父目录,其中保存着存储的 cookie 和派生的配置文件。

  • --claim-profile-root - 接管服务器不会自行认领的配置文件目录,例如其父目录已包含其他文件的目录。每个目录需要执行一次。

  • --chrome-path PATH - Chrome/Chromium 可执行文件的路径

  • --proxy-server URL - 通过代理路由浏览器流量,格式为 scheme://host:port。通过 PROXY_PASSWORD 设置密码,这样它就不会出现在进程列表中。

从日常使用的浏览器导入会话:

如果你已经登录了 Chrome、Chromium、Brave、Edge、Arc、Vivaldi、Helium、Yandex 或 Naver Whale 中的 LinkedIn,则可以跳过手动 --login 步骤并复用该会话:

# Auto-pick the most recently used browser with a live LinkedIn session
uvx mcp-server-linkedin@latest --import-from-browser
# Or target a specific browser
uvx mcp-server-linkedin@latest --import-from-browser brave

这会读取浏览器的 LinkedIn cookie,对照你的信息流进行验证,并将其保存到 ~/.linkedin-mcp/profile/,与 --login 写入的位置相同。注意事项:

  • 如果有多个已登录的浏览器,会首先尝试最近使用且具有有效 LinkedIn 会话的那个。如果 LinkedIn 拒绝它(已撤销或远程登出),则会自动尝试下一个最近的;服务器接受的第一个会被导入。没有选择提示。传入浏览器名称可专门针对特定浏览器。

  • 在 macOS 上,操作系统钥匙串可能会提示允许访问浏览器的 Safe Storage。请先关闭源浏览器,以获得最可靠的读取。

  • 受 Chrome 127+ 应用绑定加密(v20)保护的 cookie 在没有操作系统提权的情况下无法解密;在这种情况下请改用 --login

  • 导入的 cookie 与真实登录在磁盘上的集合一致。本地服务器会从保存的配置文件中完整读回它们;Docker 桥接会将其缩小到与正常会话相同的最小身份验证子集。

基本使用示例:

# Run with debug logging
uvx mcp-server-linkedin@latest --log-level DEBUG

HTTP 模式示例(用于基于 Web 的 MCP 客户端):

uvx mcp-server-linkedin@latest --transport streamable-http --host 127.0.0.1 --port 8080 --path /mcp

运行时服务器日志由 FastMCP/Uvicorn 输出。

工具调用会被序列化以保护共享的 LinkedIn 浏览器会话,无论是在单个服务器进程内还是在多个进程之间。如果你同时运行多个 MCP 客户端,每个客户端都会启动自己的服务器进程,并且一次只有一个进程使用浏览器;其他进程会短暂等待,并在其完成一次调用后立即接管。等待过久的客户端会收到"浏览器正忙"的消息,只需重试即可。使用 --log-level DEBUG 查看等待/获取/释放日志。

这涵盖同一台机器和同一运行时中的进程。它不扩展到共享同一 ~/.linkedin-mcp 目录的主机和 Docker 容器之间,因此当容器正在运行时,不要在主机上运行 --login--logout

使用 mcp inspector 测试:

  1. 安装并运行 mcp inspector bunx @modelcontextprotocol/inspector

  2. 点击预填的令牌 URL 在浏览器中打开 inspector

  3. 选择 Streamable HTTP 作为 Transport Type

  4. URL 设置为 http://localhost:8080/mcp

  5. 连接

  6. 测试工具

安装问题:

  • 确保你已安装 uv:curl -LsSf https://astral.sh/uv/install.sh | sh

  • 检查 uv 版本:uv --version(应为 0.4.0 或更高)

  • 首次运行时,uvx 会下载所有 Python 依赖。在慢速连接上,uv 默认的 30 秒 HTTP 超时可能太短。上面推荐的配置已设置 UV_HTTP_TIMEOUT=300(秒)以避免此问题。

  • Windows 上出现 DLL load failed while importing _greenlet:升级到 greenlet 3.5.5 或更高版本,其发布的 Windows wheel 已重新在扩展中包含 C++ 运行时。全新的 uvx 运行会自动解决此问题;固定依赖的环境需要 uv lock --upgrade-package greenlet。只有 greenlet 3.3.1 到 3.5.4 需要 MSVCP140.dll,而 python.org 安装程序和 uv 管理的构建都不包含它,并且从源码构建的 greenlet 在任何版本下都可能需要它。在无法更改版本的情况下,Microsoft Visual C++ Redistributable 可提供该 DLL。已在 greenlet#525 中报告,并在 greenlet#526 中修复。

会话问题:

  • 浏览器配置文件存储在 ~/.linkedin-mcp/profile/

  • 托管的浏览器下载缓存在 ~/.linkedin-mcp/patchright-browsers/

  • 浏览器缓存不断增长:服务器升级可能带来新的 Chromium 版本,而只要任何已安装的版本仍引用旧版本,Patchright 就会保留它。uvx 会为你运行过的每个版本保留一个归档,因此每个版本都会持有这样的引用,旧版本就会一直保留。服务器会记录一条警告,说明它持有的版本及其占用的空间。要回收空间,请停止所有 LinkedIn MCP Server 实例,删除 ~/.linkedin-mcp/patchright-browsers/,然后让下次启动下载当前浏览器。

  • 确保你一次只保持一个有效的 LinkedIn 会话

登录问题:

  • LinkedIn 可能要求通过 LinkedIn 移动应用确认 --login 的登录

  • LinkedIn 在登录期间可能会显示验证码挑战。运行 uvx mcp-server-linkedin@latest --login 会打开一个浏览器,你可以在其中手动解决。

超时问题:

  • 页面操作失败(找不到元素、导航挂起):增加浏览器页面操作超时 — --timeout 10000TIMEOUT=10000(毫秒,默认 5000)。

  • 整个工具调用超时(例如多部分个人资料、冷启动 Chromium、慢速容器):增加每个工具的执行超时 — --tool-timeout 300TOOL_TIMEOUT=300(秒,默认 180)。

  • 没有会话时的首次工具调用:如果本地已登录的浏览器具有有效的 LinkedIn 会话,服务器会自动导入它(参见 AUTO_IMPORT_FROM_BROWSER / --auto-import),而不是强制手动登录。在 macOS 上,钥匙串可能会提示一次以访问 Safe Storage。如果不存在可导入的浏览器会话,它会回退到打开登录窗口,并等待最多 LOGIN_INLINE_WAIT 秒(默认 25,最大 45;--login-inline-wait),以便快速登录在一次调用中完成。如果等待时间过去,工具会返回挂起信号,模型会在约 30 秒后重试。自动导入和内联等待都不适用于 Docker 或服务器绑定到非回环 HTTP 主机的情况。在主机上使用 --login 创建会话,或使用显式的 Docker --login --login-viewer 命令。

  • 慢速连接的用户可能需要为两者设置更高的值。

在已经运行过 --login 的情况下被告知在主机上运行它:

  • 如果工具调用在不是容器的机器上回答 "No valid LinkedIn session is available in Docker",则运行时被误检测了。这种情况发生在为无关服务运行 Docker 守护进程的 Linux 主机上。设置 LINKEDIN_MCP_CONTAINER=false 以覆盖检测;true 强制相反。

使用代理:

大多数人不应使用代理。 LinkedIn 自身关于减少安全挑战的指导是避免 VPN 或代理,并且它会对会话登录的地址进行评分。你使用了多年的家庭连接是信任信号;历史记录你无法看到的商业出口节点则不是,切换到这样的节点本身就是会触发检查点的那种变化。代理在一种情况下值得使用:服务器运行在地址明显是数据中心的某个地方,或者与账户历史记录所在国家不同。即便如此,你自己家庭网络上的 WireGuard 或 Tailscale 出口节点也胜过任何付费提供商,因为该地址确实是你的。如果你确实要购买,请选择专用的静态 ISP 地址并保留它,而不是轮换的住宅代理池。

  • 使用 --proxy-server http://host:port 通过代理路由浏览器流量(支持 httphttpssocks4socks5)。只有浏览器流量被路由,MCP 传输不受影响。

  • 凭据放在 PROXY_USERNAMEPROXY_PASSWORD 中。故意不设 --proxy-password 标志:命令行参数对机器上的其他所有用户都是可读的。PROXY_SERVER 也接受大多数提供商提供的组合形式 http://user:pass@host:port

  • Chromium 无法向 SOCKS 代理进行身份验证,因此凭据需要 http(s) 端点。如果您的提供商只提供带身份验证的 SOCKS5,请运行一个持有凭据的本地中继,并将服务器指向该中继。

  • 本地地址也会经过代理。设置代理后,Chromium 通常对 localhost 的直接路由会被移除,因此如果您需要直接访问本地目标,请添加 PROXY_BYPASS=localhost,127.0.0.1,::1

  • 配置代理时会跳过自动导入:从本地浏览器获取的会话是在您的真实地址上创建的,将其移到代理上正是触发检查点的那种变更。请使用 --login

  • 错误的代理密码不会自我报告:Chromium 会重试身份验证质询,直到页面超时,因此它表现为超时或登录失败。如果您在添加代理后会话立即停止工作,请先检查凭据,再假设会话已过期。

  • 在创建会话之前设置好代理。 在代理已配置的情况下运行 --login。为现有配置文件开启代理会将已登录的会话移到新 IP,这正是触发 LinkedIn 检查点的原因。--import-from-browser 也是如此,它会导入在您的真实 IP 上创建的会话。出于同样的原因,请使用粘性会话,而不是轮换 IP 池。

自定义 Chrome 路径:

  • 如果 Chrome 安装在非标准位置,请使用 --chrome-path /path/to/chrome

  • 也可以通过环境变量设置:CHROME_PATH=/path/to/chrome

  • 在 macOS 和 Linux 上,浏览器版本必须至少与上次打开您的配置文件的浏览器一样新,否则服务器会拒绝启动。(Windows 上不适用:那里的浏览器无法在不启动的情况下查询版本,因此该检查被关闭。)较旧的浏览器可能会静默丢弃较新浏览器写入的存储(包括已保存的会话),然后失败看起来就像登录过期。消息会指出两个版本。在运行过一次较新的 Chrome 之后回到捆绑的 Chromium 是遇到此问题的常见方式;要么再次运行那个较新的浏览器(无论是哪个),要么运行 --login,它会将存储的会话移到一边,并用您当前的浏览器重新登录。--logout 也会清除它,但会丢弃旧会话而不是保留可恢复的副本,而且它会在终端上要求确认,因此无法从 MCP 客户端启动的服务器上使用。

  • 只有 Chrome、Chromium 和 Chrome for Testing 会以这种方式进行比较。分支版本对自身的编号方式不同(Vivaldi 是 7.x,Edge 的构建号在相同主版本下远低于 Chrome),因此将 CHROME_PATH 指向其中一个会关闭检查,而不是产生一个无法满足的拒绝。

📦 Claude Desktop MCP Bundle(原 DXT)

前置条件: Claude Desktop

面向 Claude Desktop 用户的一键安装:

  1. releases 下载最新的 .mcpb 构件

  2. 点击下载的 .mcpb 文件将其安装到 Claude Desktop 中

  3. 调用任意 LinkedIn 工具

启动时,MCP Bundle 会在后台开始准备共享的 Patchright Chromium 浏览器缓存。如果您过早调用工具,Claude 会显示一个设置进行中的错误。在第一次需要身份验证的工具调用时,服务器会打开一个 LinkedIn 登录浏览器窗口,并请您在登录后重试。

MCP Bundle 设置帮助

首次设置行为:

  • Claude Desktop 会立即启动 bundle;浏览器设置会在后台继续

  • 如果 Patchright Chromium 浏览器仍在下载,请稍等片刻后重试该工具

  • 托管浏览器下载共享在 ~/.linkedin-mcp/patchright-browsers/

  • 浏览器缓存会不断增长:只要任何已安装的版本仍引用某个旧 Chromium 修订版,Patchright 就会保留它,因此升级后两个版本可能都留在磁盘上。服务器会记录一条警告,说明它持有的内容。要回收空间,请停止每个 LinkedIn MCP Server 实例,删除 ~/.linkedin-mcp/patchright-browsers/,然后让下次启动下载当前浏览器。

  • Windows 上,bundle 以 DLL load failed while importing _greenlet 退出:安装 Microsoft Visual C++ Redistributable,或重新安装一个固定 greenlet 3.5.5 或更高版本的 bundle,其发布的 Windows wheel 再次在扩展中携带 C++ 运行时。固定 greenlet 3.3.1 到 3.5.4 的 bundle 需要该可再发行组件中的 MSVCP140.dll,而 python.org 安装程序和 uv 管理的构建都不携带它,从源码构建的 greenlet 在任何版本下都可能需要它。服务器会在启动时自行指出这一点,并且仅在检查到加载器无法生成该 DLL 之后。已报告为 greenlet#525,在 greenlet#526 中修复。

登录问题:

  • 确保一次只有一个活动的 LinkedIn 会话

  • LinkedIn 可能要求通过 LinkedIn 移动应用确认 --login 的登录

  • LinkedIn 可能在登录期间显示验证码挑战。运行 uvx mcp-server-linkedin@latest --login 会打开一个浏览器,您可以在其中手动解决验证码。请参阅 uvx 设置 了解前置条件。

超时问题:

  • 页面操作失败(找不到元素、导航挂起):增加浏览器页面操作超时 — --timeout 10000TIMEOUT=10000(毫秒,默认 5000)。

  • 整个工具调用超时(例如多板块个人资料、Chromium 冷启动、慢速容器):增加每个工具的执行超时 — --tool-timeout 300TOOL_TIMEOUT=300(秒,默认 180)。

  • 没有会话时的第一次工具调用:如果本地已登录的浏览器有活动的 LinkedIn 会话,服务器会自动导入它(参见 AUTO_IMPORT_FROM_BROWSER / --auto-import),而不是强制手动登录。在 macOS 上,钥匙串可能会提示一次 Safe Storage 访问。如果不存在可导入的浏览器会话,它会回退到打开登录窗口,并等待 LOGIN_INLINE_WAIT 秒(默认 25,最大 45;--login-inline-wait),以便快速登录在一次调用中完成。如果等待时间过去,工具会返回一个待处理信号,模型会在约 30 秒后重试。自动导入和内联等待在 Docker 下或服务器绑定到非回环 HTTP 主机时均不适用。在主机上使用 --login 创建会话,或使用显式的 Docker --login --login-viewer 命令。

  • 慢速连接的用户可能需要为两者设置更高的值。

被告知在主机上运行 --login 但您已经运行过:

  • 如果工具调用在不是容器的机器上回答 "No valid LinkedIn session is available in Docker",则运行时被误检测了。这种情况发生在运行 Docker 守护进程(用于无关服务)的 Linux 主机上。设置 LINKEDIN_MCP_CONTAINER=false 可覆盖检测;true 强制相反。

🐳 Docker 设置

前置条件: 确保 Docker 已安装并正在运行。

身份验证

登录一次。容器会打开一个 LinkedIn 登录浏览器,您可以从自己的浏览器标签页中驱动它:

# Create the directory first so the container can save your session into it
mkdir -p ~/.linkedin-mcp
docker run -it --rm \
  -v ~/.linkedin-mcp:/home/pwuser/.linkedin-mcp \
  -p 127.0.0.1:6080:6080 \
  stickerdaniel/linkedin-mcp-server:latest \
  --login --login-viewer

打开命令打印的完整 URL(它携带访问令牌)并登录。查看器之后会自动关闭;让命令自行退出,以便会话被完整存储。它会在 30 分钟后放弃。

在每次后续的 docker run 中保留 -v ~/.linkedin-mcp:/home/pwuser/.linkedin-mcp 挂载,否则服务器无法找到会话。

使用 Docker 配置 Claude Desktop

{
  "mcpServers": {
    "mcp-server-linkedin": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-v", "~/.linkedin-mcp:/home/pwuser/.linkedin-mcp",
        "stickerdaniel/linkedin-mcp-server:latest"
      ]
    }
  }
}

[!NOTE] 会话会随时间过期。当工具调用开始要求身份验证时,重复上面的登录命令,或在主机上运行 uvx mcp-server-linkedin@latest --login

Docker 设置帮助

传输模式:

  • 默认(stdio):本地 MCP 服务器的标准通信方式

  • Streamable HTTP:用于基于 Web 的 MCP 服务器

  • 如果未指定传输方式,服务器默认为 stdio

  • 未指定显式传输方式的交互式终端会显示选择器提示

CLI 选项:

  • --log-level {DEBUG,INFO,WARNING,ERROR} - 日志级别(默认:WARNING)

  • --transport {stdio,streamable-http} - 强制传输模式(默认:stdio)

  • --host HOST / --port PORT / --path PATH - HTTP 服务器地址(默认值:127.0.0.1、8000、/mcp)

  • --logout - 清除存储的会话及其派生的所有配置文件

  • --timeout MS - 单个页面操作的超时时间(默认:5000)

  • --tool-timeout SECONDS - 整个工具调用的超时时间(默认:180)。对于繁重的抓取、慢速网络或冷启动浏览器,请调高此值。

  • --login-timeout SECONDS - 登录浏览器等待您完成登录的时间(默认:1800;0 = 无限制)。--login-viewer 无论如何都会在 30 分钟后结束会话。

  • --login-viewer - 与 --login 一起使用时,在端口 6080 上以令牌保护的 URL 显示登录浏览器。需要 身份验证 中的配置文件挂载。

  • --login-inline-wait SECONDS - 工具调用在告诉模型重试之前等待登录完成的时间(默认:25,最大 45;0 = 立即返回)

  • --browser-wait SECONDS - 等待另一个服务器进程移交共享浏览器的时间(默认:25,最大 45;0 = 立即报告忙碌)。仅在多个 MCP 客户端同时运行时才有意义。

  • --browser-min-hold SECONDS - 此进程在移交共享浏览器之前最短持有它的时间(默认:20)。被限制在 --browser-wait 以下 3 秒,因此请同时调高该值。更高的值意味着更少的浏览器重启,但其他客户端等待更久。

  • --browser-idle-timeout SECONDS - 在这么长时间没有工具调用后关闭空闲浏览器并释放配置文件(默认:600;0 = 保持打开)

  • --auto-import / --no-auto-import - 在第一次需要会话的工具调用时,从已登录的本地浏览器导入会话,然后才回退到手动登录(在 Docker 中忽略)。在 macOS 上,钥匙串可能会提示一次。

  • --user-data-dir PATH - 浏览器配置文件目录(默认:~/.linkedin-mcp/profile)。轮换或清除会话会删除此目录及其父目录,父目录持有存储的 cookie 和派生的配置文件。

  • --claim-profile-root - 接管服务器不会自行认领的配置文件目录,例如父目录已包含其他文件的目录。每个目录需要一次。

  • --chrome-path PATH - Chrome/Chromium 可执行文件的路径(在 Docker 中很少需要)

  • --proxy-server URL - 通过代理路由浏览器流量,格式为 scheme://host:port。通过 PROXY_PASSWORD 设置密码,这样它就不会出现在进程列表中。

[!NOTE] 在 Docker 中,普通的 --login 仍然没有可见窗口。仅对一次性登录命令添加 --login-viewer 并发布 127.0.0.1:6080:6080。Docker 默认已经是带头的,因此 --no-headless 不会改变任何东西。实验性的 --daemon 在 Docker 中被忽略,因为其所有者可能比虚拟显示存活更久。

HTTP 模式示例(用于基于 Web 的 MCP 客户端):

docker run -it --rm \
  -v ~/.linkedin-mcp:/home/pwuser/.linkedin-mcp \
  -p 127.0.0.1:8080:8080 \
  stickerdaniel/linkedin-mcp-server:latest \
  --transport streamable-http --host 0.0.0.0 --port 8080 --path /mcp

这两半缺一不可,且各自的工作不同。--host 0.0.0.0 让服务器在容器内部可达:容器里绑定到 127.0.0.1 的进程根本无法通过已发布的端口访问。而 -p 前面的 127.0.0.1: 才是将其外部限制在本机的关键。去掉这个 127.0.0.1: 前缀后,Docker 会在所有接口上发布端口,这会把一个没有认证的全局接口放到你的网络上。服务器无法区分这两种情况,所以任何情况下它都会发出警告。

Loopback 发布将范围限制在宿主机上,而非容器内。同一宿主机上的其他容器只要 host.docker.internal 可以解析,就仍能访问它;这是 Docker Desktop 和 OrbStack 的默认行为,但原生 Linux Docker 上并非如此。

运行时服务器日志由 FastMCP/Uvicorn 输出。

HTTP 服务器只处理发往 localhost 或其绑定地址的请求,对其他一切请求返回 421。这正是一个防止你访问过的网站把某个域名指向这个服务器,然后通过你自己的浏览器来使用你的 LinkedIn 会话的防御机制。

通过任何其他名称访问服务器都会被拒绝,包括你网络中的机器名,以及反向代理后面的公网名称。你要么让代理把上游 Host 重写为后端地址,要么在服务器上指定为哪个主机名提供服务:

FASTMCP_HTTP_ALLOWED_HOSTS='["mcp.example"]'

这就只允许该确切名称,而继续拒绝一切其他请求。该端点仍然没有认证,因此凡是能从你本机之外访问的部署,都必须放在能提供认证的服务后面。

用 mcp inspector 测试:

  1. 安装并运行 mcp inspector:bunx @modelcontextprotocol/inspector

  2. 点击预填的令牌 URL,在浏览器中打开 inspector

  3. Transport Type 中选择 Streamable HTTP

  4. URL 设置为 http://localhost:8080/mcp

  5. 点击连接

  6. 测试工具

Docker 问题:

  • 请确保已经安装了 Docker

  • 检查 Docker 是否正在运行:docker ps

  • ~/.linkedin-mcp 权限报错:早期完整的 Docker 运行可能以 root 身份创建了这个目录。可以通过 sudo chown -R "$(id -u):$(id -g)" ~/.linkedin-mcp 修复。

登录问题:

  • 确保一次只有一个 LinkedIn 会话处于活跃状态

  • 如果选择 --login,LinkedIn 可能要求在 LinkedIn 手机 App 中确认登录

  • LinkedIn 在登录时可能显示人为验证。执行 uvx mcp-server-linkedin@latest --login,会打开浏览器,你可以手动完成验证。前置条件请参考 uvx 配置

  • 在主机上重新登录后,如果 Docker 认证已过期,请重启 Docker 一次,使其可以从新的源会话生成中重新建立桥接。

超时问题:

  • 页面操作失败(找不到元素、导航挂起):增加浏览器 page-op 超时时间——--timeout 10000TIMEOUT=10000(单位:毫秒,默认值 5000)。

  • 整个工具调用超时(例如多个板块的 profile、冷启动 Chromium、性能低下的容器):增加每次工具执行超时——--tool-timeout 300TOOL_TIMEOUT=300(单位:秒,默认值 180)。

  • 首次工具调用且没有会话:如果本地登录过的浏览器有活跃的 linkedIn 会话,服务器会自动导入它(见 AUTO_IMPORT_FROM_BROWSER / --auto-import),而不是强制手动登录。在 macOS 上,钥匙串可能提示一次访问。如果不存在可导入的浏览器会话,则改而打开登录窗口,并最多等待 LOGIN_INLINE_WAIT 秒(默认 25,最大 45;--login-inline-wait),这样一次快速登录即可在单次调用中完成。如果等待超时,工具会返回 pending 信息,服务器大约等待后重试。在 Docker 下或服务器绑定到非 loopback HTTP 主机时,上述自动导入和行内等待都不适用。请在主机上使用 --login 创建会话,或使用显式 Docker 命令 --login --login-viewer

  • 网络较慢的用户需要为上述参数设置更高的值。

提示在主机上运行 --login,你实际上已经运行过:

  • 如果工具调用返回 No valid LinkedIn session is available in Docker,而它并不来自容器,那其实是运行时被测错误了。这可能发生在 Linux 主机中,因为主机为其他无关服务运行了一个 Docker 服务。设置 LINKEDIN_MCP_CONTAINER=false 可以覆盖这个检测;设为 true 则强制反过来。

使用代理:

大多数人不需要使用代理。 LinkedIn 自己的关于减少安全验证的建议是避开 VPN 或代理,并且它会根据会话签约时的地理位置来评分。一个你已经用了多年的家庭连接是信任信号;而一个无法看到历史的商业出口节点则不是——从原有地址切换到这类节点本身就会触发挑战(checkpoint)。 只有一种情况代理是值得的:服务器运行所在的 IP 明显属于数据中心,或者运行国家和账号历史不匹配。即使是这样,用你自己的家庭网络上的 WireGuard 或 Tailscale 出口节点也比任何付费服务商更好——因为它的地址本质上真的是你的。如果你确实要买一个代理,请买专用的静态 ISP 地址不要轮换,而不要用动态住宅池。

  • 通过 --proxy-server http://host:port 让浏览器走代理(支持 httphttpssocks4socks5)。只有浏览器流量走代理,MCP 传输不走。

  • 凭证保存在 PROXY_USERNAMEPROXY_PASSWORD 中。故意不提供 --proxy-password 参数,是因为命令行参数机器上的其他用户都能看见。PROXY_SERVER 也接受多数服务商直接给出的组合形式 http://user:pass@host:port

  • Chromium 无法对 SOCKS 代理认证,因此使用凭据时必须用 http(s) 端点。如果你的服务商只提供认证的 SOCKS5,请在本地跑一个保存凭证的转发器,并让服务器去连它。

  • 本地地址也会走代理。启用代理后 Chromium 不再直连 localhost,因此如果你需要本地目标被直接访问,请设置 PROXY_BYPASS=localhost,127.0.0.1,::1

  • 配置了代理时会跳过自动导入:从本地浏览器拿到的 session 是在你的真实地址上创建的,把它挪到代理上,恰好是容易触发 checkpoint 的行为。这种情况请改用 --login

  • 错误的代理密码不会自己报错:Chromium 会在页面超时之前一直重试认证,所以表现出的症状是超时或登录失败。如果加入代理之后会话立刻不可用,请先检查凭据,而不是直接就认为会话过期了。

  • ** 在创建会话之前配置好代理。** 先在已配置代理的状态下运行 --login。对一个已有配置开启代理,相当于旧的登录 IP 迁移到新的 IP 上,这就会触发 LinkedIn checkpoint。--import-from-browser 也一样——它导入的会话是在你的真实 IP 上创建的。出于同一原因,请使用粘性会话,而不是轮换 IP。

自定义 Chrome 路径:

  • 如果 Chrome 安装地址非常路径,请使用 --chrome-path /path/to/chrome

  • 也可以用 environment 变量设置: CHROME_PATH=/path/to/chrome

  • 在 macOS 和 Linux 上,Chrome 的版本必须低于最后打开 position profile 的那个版本的版本,否则服务器会拒绝启动。Windows 上例外:因为不启动浏览器就没有办法询问浏览器的版本,所以检查被禁用。旧浏览器可能悄悄丢弃新浏览器写入的 storage,其中包含保存的 session,故障看起来像是登录过期;同时错误消息会提示两个版本。检查默认使用捆绑的 Chromium,但如果你曾经跑过一次新 Chrome,要么就重新执行当前的新浏览器 —— 无论是哪一个 —— 要么运行 --login,它会先把旧 session 隔离,再用当前浏览器交付新登录。--logout 也可以清除 session,但它会直接丢弃旧会话,而不是让它保留可恢复,而且在终端里还会要求确认,因此不适合由 MCP 客户端启动的服务器使用。

  • 只有 Chrome、Chromium、Chrome for Testing 是改装比较过的。分销有自己的版本号(比如 Vivaldi 是 7.x,Edge 的 build 号在相同 major 下通常远低于 Chrome),因此把 CHROME_PATH 指向这类浏览器会直接跳过版本检查,而不是拒绝并报告无法满足的启动。

  • 在文档所示的 Docker 设置下,版本检查不适用——容器永远不打开你用 --login 创建的 profile,而是从你的 cookies 中衍生出自己的一套。默认每次启动都重新生成,所以没有可跨越镜像降级的东西。使用了 EXPERIMENTAL_PERSIST_DERIVED_RUNTIME 后,如果镜像标签反向,相关派生 profile 会被丢弃并重新生成,你也无需进行任何操作。检查只在主机环境生效,主机上服务器会直接打开 profile。但在 --login 期间,无需担心:它会在启动浏览器前先把旧 profile 移开。

🐍 本地安装(开发与贡献)

欢迎贡献!请先参考 CONTRIBUTING.md 了解架构和贡献规范。在提交 PR 之前,请先开一个 issue 讨论该功能或 bug 修复。

环境要求: 安装 Gituv

安装

# 1. Clone repository
git clone https://github.com/stickerdaniel/linkedin-mcp-server
cd linkedin-mcp-server

# 2. Install UV package manager (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh

# 3. Install dependencies
uv sync
uv sync --group dev

# 4. Install pre-commit hooks
uv run pre-commit install

# 5. Start the server
uv run -m linkedin_mcp_server

本地服务器与其他管理线程方式(与 uvx 和 MCPB)一样:同步准备 Patchright Chromium 浏览器缓存,并在第一次碰到需要认证的工具调用时自动打开 LinkedIn 登录页面。你仍可以运行 uvx mcp-server-linkedin@latest --login 按需手动创建会话。

本地安装帮助

CLI 选项:

  • --login - 打开浏览器登录并保存会话

  • --import-from-browser [BROWSER] - 复用本地已登录的 Chromium 浏览器会话(可选值 chromechromiumbraveedgearcvivaldiheliumyandexwhaleauto)。只带 bare flag 时自动扫描 auto 最近浏览过的活跃 LinkedIn 会话。

  • --status - 检查存储的 session 是否有效,然后退出

  • --logout - 清除存储的 session

  • --no-headless - 显示浏览器窗口(对调试有用)

  • --log-level {DEBUG,INFO,WARNING,ERROR} - 日志级别(默认 WARNING)

  • --transport {stdio,streamable-http} - 强制指定传输模式(默认 stdio)

  • --host HOST / --port PORT / --path PATH - HTTP 服务地址(默认 127.0.0.1、8000、/mcp)

  • --timeout MS - 单个页面操作超时(默认 5000)

  • --tool-timeout SECONDS - 整个工具调用的执行超时(默认 180 秒),需要 处理复杂 抓取、慢网络或冷启动浏览器时提高

  • --user-data-dir PATH - 浏览器 profile 目录(默认 ~/.linkedin-mcp/profile)。如果进行 session 迁移旋转或清除,会拆毁该目录及其父目录,父目录包含了已存储的 cookies 以及一轮派生的配置文件。

  • --claim-profile-root - 接管一个服务器不会主动认领的 profile 目录(例如某个父目录还有其他文件的情况)。每个目录只需设置一次。

  • --slow-mo MS - 浏览器操作之间的延迟(默认 0,适合调试)

  • --viewport WxH - 视口大小(默认 1280x720)。只在 headless 模式下生效;有头时使用真实窗口尺寸。

  • --chrome-path PATH - Chrome/Chromium 可执行文件路径

  • --proxy-server URL - 通过代理(scheme://host:port 格式)走浏览器流量。密码通过 PROXY_PASSWORD 设置,这样不会进入进程列表。

  • --help - 显示帮助

注意: 大部分 CLI 参数都支持环境变量。详见 .env.example

HTTP 模式示例(给基于 Web 的 MCP 客户端):

uv run -m linkedin_mcp_server --transport streamable-http --host 127.0.0.1 --port 8000 --path /mcp

Claude Desktop:

{
  "mcpServers": {
    "mcp-server-linkedin": {
      "command": "uv",
      "args": ["--directory", "/path/to/linkedin-mcp-server", "run", "-m", "linkedin_mcp_server"]
    }
  }
}

该配置默认使用 stdio

登录问题:

  • 确保同一时间只有一个有效的 LinkedIn 会话

  • LinkedIn 可能要求在 LinkedIn 移动应用中确认 --login 登录

  • 登录期间 LinkedIn 可能显示验证码挑战。--login 命令会打开浏览器,你可以手动解决。

抓取问题:

  • 使用 --no-headless 查看浏览器操作并调试抓取问题

  • 添加 --log-level DEBUG 以查看更详细的日志

会话问题:

  • 浏览器配置文件存储在 ~/.linkedin-mcp/profile/

  • 受管浏览器下载内容缓存在 ~/.linkedin-mcp/patchright-browsers/,与 uvx 和 MCP Bundle 安装共享

  • 浏览器缓存会持续增长:只要任何已安装的版本仍引用某个 Chromium 修订版,Patchright 就会一直保留它,而 uv 归档或第二个工作树就是这样的引用。服务器会记录并提示它所持有的内容。要回收空间,请停止所有 LinkedIn MCP Server 实例,删除 ~/.linkedin-mcp/patchright-browsers/,然后让下次启动时下载当前浏览器。

  • 使用 --logout 清除配置文件并重新开始

Python/Patchright 问题:

  • 检查 Python 版本:python --version(应为 3.12+)

  • 重新安装 Patchright:uv run patchright install chromium

  • 重新安装依赖:uv sync --reinstall

超时问题:

  • 页面操作失败(找不到元素、导航卡住):增加浏览器页面超时时间——--timeout 10000TIMEOUT=10000(毫秒,默认 180)。

  • 整个工具调用超时(例如多版块个人资料、冷启动 Chromium、容器环境):增加单次工具执行超时时间——--tool-timeout 300TOOL_TIMEOUT=300(秒,默认 180)。

  • 无会话时的首次工具调用:如果本地已登录的浏览器有有效的 LinkedIn 会话,服务器会自动导入该会话(参见 AUTO_IMPORT_FROM_BROWSER / --auto-import),而不是强制手动登录。在 macOS 上,钥匙串可能会弹出一次“安全存储”访问提示。如果没有可导入的浏览器会话,则回退到打开登录窗口,并等待 LOGIN_INLINE_WAIT 秒(默认 25 秒,最长 45 秒;--login-inline-wait),以便快速登录即可完成。如果等待超时,工具会返回挂起信号,模型会在约 30 秒后重试。在 Docker 中或服务器绑定到非回环 HTTP 主机时,自动导入和行内等待均不适用。请在主机上使用 --login 创建会话,或使用显式的 Docker --login --login-viewer 命令。

  • 连接较慢的用户可能需要更高的值。

被告知在主机上运行 --login,但其实你已经运行过:

  • 如果工具调用在不是容器的机器上返回 "No valid LinkedIn session available in Docker",则说明运行环境被误判。这种情况发生在运行了 Docker 服务但容器本身无关的 Linux 主机上。设置 LINKEDIN_MCP_CONTAINER=false 可覆盖此检测;true 则强制执行。

使用代理:

大多数人不需要使用代理。 LinkedIn 自身关于减少安全挑战的建议就是避免使用 VPN 或代理,并且它会对你登录所用的 IP 地址进行评分。你用了多年的家庭连接本身就是一种信任信号;而商业出口节点则没有这种信任历史,切换到这类节点本身就是一种容易触发安全挑战的改变。只有在一种情况下使用代理是值得的:当你的服务器地址明显是数据中心 IP,或者服务器所在国家与账户历史使用区域不同。即便如此,在你自己家里的网络上搭建 WireGuard 或 Tailscale 出口节点也比任何付费代理更好,因为该地址确实属于你。如果确实要购买代理,请选择专用的静态 ISP 地址,而不是轮换的住宅 IP 池。

  • 使用 --proxy-server http://host:port(支持 httphttpssocks4socks5)将浏览器流量路由到代理。仅路由浏览器流量,不路由 MCP 流量。

  • 凭据放在 PROXY_USERNAMEPROXY_PASSWORD 中。没有 --proxy-password 标志;因为机器上的其他用户都能读取命令行参数。PROXY_SERVER 也接受大多数代理提供商提供的 http://user:pass@host:port 组合形式。

  • 本地地址也走代理。设置代理后,Chromium 对 localhost 的常规直连路由会被移除,因此如果需要直接访问本地目标,请添加 PROXY_BYPASS=localhost,127.0.0.1,::1

  • 配置代理时跳过自动导入:从本地浏览器获取的会话是在你的真实地址上创建的,将其迁移到代理正是会触发检查点的那种变化。请使用 --login

  • 错误的代理密码不会自我报告:Chromium 会重试认证质询直到页面超时,因此表现为超时或登录失败。如果在添加代理后会话立即失效,请先检查凭据,而不要假定会话已过期。

  • 在设置代理之前先创建会话。 在已配置代理的情况下运行 --login。将现有配置文件切换到代理,相当于把已登录的会话移动到新 IP,这会触发 LinkedIn 检查点。--import-from-browser 也同样适用,因为它导入的是在你的真实 IP 上创建的会话。出于同样的原因,请使用粘性会话,而不是滚动 IP 池。

自定义 Chrome 路径:

  • 如果 Chrome 安装在非标准位置,请使用 --chrome-path /path/to/chrome

  • 也可以通过环境变量设置:CHROME_PATH=/path/to/chrome

  • 在 macOS 和 Linux 上,浏览器版本必须不低于上次打开配置文件所用的浏览器版本,否则服务器会拒绝启动。(Windows 上不做此检查:因为无法在不启动浏览器的情况下获取其版本,所以该检查被关闭。)更旧的浏览器可能会静默丢弃新浏览器写入的存储数据(包括已保存的会话),这种情况看起来就像登录已过期。该消息会同时提及这两者。在运行过一次较新的 Chrome 之后,回到捆绑的 Chromium 通常可以满足此要求;要么再次运行较新的浏览器,要么运行 --login,后者会将存储的会话移走,并使用你当前的浏览器重新登录。--logout 也会清除会话,但它会丢弃旧会话而不是保留可恢复的,并且它需要在终端上确认,因此无法从服务器端启动 MCP 客户端时使用。

  • 只有 Chrome、Chromium 和 Chrome for Testing 会进行此项检查。其他分支的版本号命名方式不同(Vivaldi 使用 7.x,Edge 的构建号在主版本号相同的情况下远低于 Chrome),因此将 CHROME_PATH 指向这些浏览器会关闭检查,而不是产生无法满足的拒绝。

[!重要] 常见问题解答

这个工具安全吗?我会被封号吗? 此工具控制的是一个真实的浏览器;它不利用未记录的 API,也不绕过身份验证。LinkedIn 的用户协议禁止自动化访问,使用自动化工具的账户可能会被限制或封禁。使用风险自负;不保证账户安全。如果遇到任何问题,请在 Discussions 中告诉我。

如果我的智能体执行了太多操作怎么办? 工具调用通过队列串行执行。你对自己运行的自动化量负责;请谨慎使用,并负责任地提示你的智能体。

致谢

基于 FastMCPPatchright 构建。

请遵守 LinkedIn 用户协议 使用。自动化访问可能违反 LinkedIn 的条款,并可能导致账户受限。此工具不提供任何形式的担保。

许可证

本项目采用 Apache 2.0 许可证。

Install Server
A
license - permissive license
A
quality
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • Give AI agents the LinkedIn tools to find, qualify, engage, and follow up with prospects.

  • Let AI tools securely access your LinkedIn network and DMs

  • Run LinkedIn outreach from your AI chat: find leads, launch campaigns, send, and reply.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/abetoluwani/linkedin-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server