关于 linkedin-mcp
linkedin-mcp 是本地 MCP 服务,通过持久化 Chrome 会话提供结构化 LinkedIn 研究。它支持读取个人资料、职位、公司和收件箱,并提供带明确安全限制的可选 Alpha 写入;当前实时兼容性尚未验证。
主要功能
- 01结构化个人资料和公司数据
- 02职位与收件箱研究
- 03持久化本地 Chrome 会话
- 04离线设置诊断
- 05带安全限制的可选写入
适用场景
- 01研究 LinkedIn 个人资料
- 02查看职位和公司信息
- 03整理收件箱数据
- 04依据提供的证据准备申请材料
MCP 相关
通过持久化本地浏览器会话,向 MCP 客户端提供 LinkedIn 研究和准备工具。默认使用 stdio;可选 HTTP 传输仅限 loopback。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
22收录的工具列表 · 更新于 1 天前
此工具无需参数。
详细介绍
🔗 LinkedIn MCP
面向 AI 助手的 LinkedIn——通过真实的隐身浏览器会话获取结构化数据
面向 MCP 客户端的 LinkedIn 结构化读取——涵盖个人资料、职位、公司和收件箱数据,并提供引导式离线设置和明确的安全限制。
24 个工具 · 4.2.0 应用程序准备阶段 · 本地浏览器读取 · 五项需明确确认的写入操作 · 持久化安全限制和操作日志。
这是非官方的 LinkedIn 集成,账号可能会受到限制。 使用前请阅读账号安全和 SECURITY.md。
首次使用指南
4.2.0 为本地求职申请工作表新增了可选的可复用证据、带来源链接的简历要点,以及可供审核的求职信草稿。它保留了 24 个工具、4.1.2 的依赖修复和 SDK 输入防护。请参阅发行说明 和就绪记录。 以下命令针对 4.2.0;安装前请检查其发行可用性 和目标位置验证情况。这些说明并不能证明该版本已发布、可原生使用或具有更广泛的实时兼容性。
不可变的 4.1.1 存档和标签近日被报告存在 10 月 26 日的依赖项公告。经验证的文件字节和历史收据并不能证明当前已通过安全审查。源代码贡献者可以使用经过审核的检出版本进行离线设置和验证。4.1.0 引入了本地求职申请工作表和 CSV 导出;两者都不会填写或提交申请。
4.0.0 新增了离线退役预览和原生 Windows 隐私检查。 更改现有安装前,请阅读其 Windows 重大升级说明。 这是一个本地 stdio 工具;Glama 的通用“Deploy Server”或浏览器托管控件并非受支持的安装说明。无需托管服务。 4.0.0 发行说明介绍了这些更改及其限制。 上一版本的已验证 3.1.0 发布收据 仍可查阅。
请从快速入门和设置指南开始。 设置过程会报告本地问题、客户端配置和确切的后续步骤,不会联系 LinkedIn。将生成的条目合并到现有客户端文件中。 请参阅合成设置演示:真实的已发布软件包、一次性夹具,不登录,也不向 LinkedIn 发出请求。
research_jobs 不包含在内;其求职研究简报仍在
草稿 PR #5 中。执行计划跟踪首次使用、隐私、未来功能和有衡量依据的分发成果。
当前完成状态将已发布功能与尚待完成的原生、实时和分发关卡区分开来。
10 月 21 日全面审计将所有原始要求及后续求职者新增需求与待完成工作对应起来。
由所有者维护的私有 GitHub 流量台账跟踪星标和滚动流量,不使用用户遥测。
对于本地准备,prepare_job_application 可以复用用户提供的证据库,并可选择返回简历要点草稿和求职信。
仅包含明确选定的主张,并附上用户提供的来源脉络;缺失的证据仍会保持缺失。服务不会存储证据库或草稿。请参阅材料工作流。
此版本不会填写或提交求职申请,包括 Easy Apply。请参阅求职者与 Claude 分发计划,了解申请交接工作流、拟议的后续功能,以及将连接器列入 Claude 的单独要求。
桌面套件的可用性和哈希值在套件指南和发行资源中单独跟踪。
历史 4.1.1 套件的身份信息不能排除近期报告的依赖项问题;构建器仍保留零审计关卡。对于离线源代码检查,npm run build:claude-mcpb -- --from-source 会从明确标记为未发布的检出版本构建套件。这些检查不能证明其可原生安装或被目录接受。
功能说明
服务使用 Patchright 打开持久化的 Google Chrome 配置文件,并从经过身份验证的页面发起 Voyager 请求。结果会整理为 JSON,供 MCP 客户端使用。部分发现类工具会回退到页面数据。未公开的端点、查询 ID、浏览器行为和响应格式都可能发生变化。
适合作为起点的工作流包括个人资料研究、职位/公司研究和收件箱分类。Alpha 写入操作默认禁用。启用后,这些操作需要经过审核的、由服务签发的预览令牌以及 confirm:true,会采用保守的尝试次数预算,并在无法确认是否完成时返回包含 unknown 的状态。
验证状态
3.0.0 引入了破坏性安全变更和客户端要求;请阅读 迁移指南。 托管源代码/软件包/浏览器检查 涵盖 Linux、macOS 和 Windows 上的 Node20/22。仅核心部分的候选版本/当前版本精确结果记录在发布就绪情况中。一项经明确同意的 macOS 维护者健康状况/本人资料读取也已通过,但元数据不完整; 范围和证据 并不能证明新用户或更广泛的实时兼容性。 独立验证了公开发布的 4.1.1 版本的精确文件和目标位置;这项历史身份验证并不能消除当前安全公告中的风险。有关该版本目标位置的状态,请参阅 4.1.2 版本发布证据。 尚未验证原生客户端首次使用群体的情况及与广泛实时服务提供方的兼容性。 请参阅执行进展及其中链接的证据。
| 领域 | 当前证据 |
|---|---|
| HTTP 边界、检查点、写入记账 | 离线回归测试和 MCP 协议测试样例 |
| 账号身份、个人资料所有权、共享预算 | 生产工具测试样例,以及独立 Node 进程的争用/崩溃测试 |
| 设置诊断和冷启动已保存会话 | 离线平台/路径测试样例和生产运行时测试样例 |
| 打包产物 | 隔离安装、版本/诊断检查和编译后的 MCP 冒烟测试;未发送 LinkedIn 请求 |
| 个人资料、动态、职位、公司和收件箱 | 已注册的工具;仓库说明中包含历史实时运行声明。当前实时可用性未知。 |
| 五种写入工具 | 保守的分类器和事务测试样例。本次实现未发送任何实时写入操作。新建会话消息仍处于实验阶段。 |
| 官方 OAuth 提供方 | 未连接到当前 MCP 运行时 |
本地检查和 CI 配置只能证明其实际测试的情况, 不能保证当前与服务提供方的兼容性或账号安全。
🚀 快速开始
使用 Node.js 20 或更高版本以及 Google Chrome。以下命令适用于 4.2.0;
安装前请检查其发布可用性
和验证状态。
设置过程离线进行;登录和之后的读取
都是有意执行的账户操作。如需稳定的安装方式和 Windows
命令,请参阅设置指南。在 Windows 上,4.1.1 仍要求状态路径位于实际的 %USERPROFILE% 目录树下。即使旧版本接受了自定义的外部路径,
该路径也会被拒绝。请参阅
迁移说明。
1. 离线诊断:
npm install --prefix "$HOME/.local/share/linkedin-mcp" [email protected]
node "$HOME/.local/share/linkedin-mcp/node_modules/linkedin-mcp-tools/dist/index.js" --setup cursor
也接受 claude-desktop 或 vscode。解决报告中指出的本地问题,然后
将生成的条目合并到现有客户端文件中。设置过程不会登录
或请求账户信息。请使用稳定的本地安装,并在升级后重新生成条目;
报告会固定到已安装的构建版本,而非临时路径。
2. 登录一次(会打开真实的 Chrome 窗口 — 登录并完成任何验证码/双重验证):
node "$HOME/.local/share/linkedin-mcp/node_modules/linkedin-mcp-tools/dist/index.js" --login
需要安装 Google Chrome(或者运行一次 npx patchright install chrome)。您的
会话(包括 Cloudflare 通行状态)会保存在 ~/.linkedin-mcp/profile/ 中。
3. 配置客户端。 优先使用上面生成的条目。对于接受
mcpServers 的客户端,也可以使用此固定版本示例:
{
"mcpServers": {
"linkedin": {
"command": "npx",
"args": ["-y", "[email protected]"]
}
}
}
从 whoami 开始查看本地状态。明确授权读取账户信息后,可以尝试 "读取一次我自己的个人资料,并报告返回的状态和任何部分元数据,然后关闭会话。不要重试或写入。" 在检查点处停止。
目前服务提供商的可用性尚不确定;请保留空、部分和错误状态。尚未测量 Claude Desktop、Cursor 和 VS Code 的首次使用结果。
从源代码开始 / 参与贡献
git clone https://github.com/devag7/linkedin-mcp.git
cd linkedin-mcp
npm ci
npm run setup:browser # installs the Chrome patchright drives
npm run login # manual account login; only with your deliberate consent
npm run spike # live own-profile request; requires separate authorization
npm run build # produces dist/
node dist/index.js --doctor # local setup checks; no browser or network
npm run verify:package # install/test the packed artifact offline against LinkedIn
MCP 配置:"command": "node", "args": ["/absolute/path/to/dist/index.js"]。
诊断此源代码检出版本
npm run build
node dist/index.js --doctor
报告会显示软件包/Chrome 的可用性、配置文件的可访问性和所有权、 安全状态的有效性、所选传输方式及后续步骤。报告不会包含 Cookie、令牌、 配置文件内容或私有路径。它不会打开 Chrome,也不会联系 LinkedIn。
登录后,并停止其他使用该配置文件的进程,再通过 node dist/index.js --doctor --live 明确选择实时身份读取。探测有 30 秒时限,之后会清理浏览器;超时并不能证明已启动的读取操作已取消。诊断过程不会执行写入。
在冷启动运行时,whoami 会报告 sessionState: "not_checked" 和
loggedIn: null。health_check 会有意打开已保存的会话并执行实时 API 检查。仅有已保存的配置文件或 Cookie 并不会被报告为健康的 API。
有头登录需要本地显示器。常规服务默认使用无头 Chrome。 此处未验证远程浏览器/配置文件部署以及配置文件复制。
本地 HTTP 客户端
Stdio 仍是默认选项。对于能够发送 Authorization 标头的本地 MCP 客户端,HTTP 是一种明确限定为仅限回环地址的选项。不支持远程主机、反向代理、浏览器 CORS 客户端和无服务器部署。
生成本地密钥,并从此代码库启动服务:
npm run build
export LINKEDIN_HTTP_TOKEN="$(node -e 'console.log(require("node:crypto").randomBytes(32).toString("hex"))')"
node dist/index.js --transport http --port 3000
将客户端配置为使用 URL http://127.0.0.1:3000/mcp 和标头
Authorization: Bearer <the same LINKEDIN_HTTP_TOKEN value>。将密钥保存在客户端的受保护配置中;不要将其放入 URL 或提交到代码库中。
令牌必须包含 32–256 个字母、数字、下划线或连字符。请随机生成令牌;长度验证无法证明令牌不可预测。
- 所有端点(包括
GET /health)都需要令牌。缺少凭据或凭据无效时会返回401。健康状态报告的是监听器状态,而非 LinkedIn 登录状态。 - HTTP 绑定到
127.0.0.1。Host 必须为127.0.0.1:<port>或localhost:<port>;如果存在 Origin,则必须与http://<Host>完全匹配。 Host 或 Origin 无效时会返回403。不授予 CORS 访问权限。 POST /mcp接受不超过 1 MiB 的未压缩 JSON。请求正文上传的期限为 10 秒;响应期限为 180 秒。最多允许 16 个 HTTP 请求处于活动状态,最多允许 32 个 TCP 连接。超出限制的请求会返回503。- 协议连接在此进程中共用一个浏览器、队列、节流器、预算跟踪器和断路器。关闭客户端不会关闭浏览器;关闭监听器时会关闭共享运行时。
- 超时或断开连接并不能证明操作已取消。长时间的节流等待可能超过响应期限。重试写入操作前,请先检查 LinkedIn;HTTP 不会自动重试该操作。对于长时间运行的工作流,优先使用 stdio。
浏览器配置文件的所有权和账户预算事务由本地各进程共享。第二个所有者会在 Chrome 启动前被拒绝。这些控制措施无法确保账户安全。请参阅 SECURITY.md。
🛡️ 账户安全
请阅读此内容。 自动化操作 LinkedIn 违反其《用户协议》,而且可能导致你的账户受限或被封禁——任何工具都无法避免这一点,包括本工具。内置安全功能(每日上限、仿真人类操作的节奏、预热、断路器)只能降低风险,无法消除风险。
默认设置较为保守:
- 建立人脉 20 次/天,发送消息 50 次/天,点赞+评论合计 50 次/天,关注 30 次/天——写入操作每日上限合计为 150 次/本地日。
- 浏览个人资料 80 次/天,搜索 30 次/天。
- 保守的预热上限、待处理邀请上限和接受率暂停机制。首次验证使用时会启动并持久化预热计时。第 1 周会阻止发送消息;第 2 周和第 3 周逐步允许发送消息。该计时衡量的是本地工具的使用情况,而非 LinkedIn 账户年龄。
- 读取操作之间间隔 4–12 秒,写入操作之间间隔 45–150 秒,并设有较长的休息时间和工作时段门控。
- 出现已观察到的检查点 URL、HTTP 999、来自 JSON 端点的质询 HTML,或受支持的质询页面信号后,持久断路器会阻止后续自动调用。它绝不会尝试解决检查点问题。已经在进行中的请求无法撤销。
请查看平台规则,并自行判断此集成是否适合你的账户。上限和节奏控制无法防止账户受限。请手动处理质询;绝不要将安全层视为合规或规避检测的保证。
从检查点恢复
CHECKPOINT_REQUIRED 表示检测到了验证挑战;CIRCUIT_OPEN 表示存储的停止状态仍然生效。停止期间,health_check 不会探测 LinkedIn,而会报告 blocked。whoami 和 close_session 仍可使用。
- 停止所有使用该配置文件的服务/探测。
- 运行
linkedin-mcp --login,在 Chrome 中手动完成验证挑战,然后打开 LinkedIn 信息流。 - 只有在登录报告会话和 API 均已验证后,才能重启服务。仅有 Cookie、重启或
--logout都无法解除停止状态。
断路器状态存储在配置文件旁边:<LINKEDIN_PROFILE_DIR>.circuit.json(默认路径为 ~/.linkedin-mcp/profile.circuit.json)。成功完成交互式恢复后,会清除硬停止状态并保留操作冷却时间。状态无效或无法读取时将默认拒绝;请恢复状态或修复存储,而不要删除状态以恢复自动化。
正常的登录过期会返回 AUTH_REQUIRED,不会触发硬停止。由于不透明重定向会隐藏目标地址,因此会将其报告为需要身份验证,而不会猜测为验证挑战。检测依据范围受限的响应/页面信号;这并不能证明与 LinkedIn 的每一种验证挑战形式都实时兼容。
写入结果和操作 ID
所有五个 Alpha 写入工具都需要 LINKEDIN_ENABLE_WRITES=true 和 confirm:true。如果未提供确认或确认值为 false,这些工具会返回本地预览,而不会打开 Chrome。请检查预览中的目标、内容、受众和路由;获得明确的人类批准后,将返回的操作 ID 用作 operation_id,并将令牌用作 preview_token。令牌会在五分钟后过期,并绑定到确切的操作、目标和内容;提交后即会失效。缺少凭据或凭据已更改时,请求会在派发前被拒绝。令牌只能证明服务已生成预览,不能证明已获得人类同意。开始新的消息对话还需要 LINKEDIN_ENABLE_EXPERIMENTAL_MESSAGES=true,目前也没有实时成功证据。请在获批的调用前提供唯一的 operation_id(8–128 个字母、数字、_ 或 -)。例如:
{
"text": "The draft you reviewed",
"visibility": "PUBLIC",
"confirm": true,
"operation_id": "<operationId returned by the reviewed preview>",
"preview_token": "<token returned by that same preview>"
}
上述占位内容必须替换为实际的预览值;请勿直接照抄示例并提交。
结果包含 operationId、replayed、status、ok 和 httpStatus。使用相同的工具、ID 和输入重复调用时,会检索已存储的结果而不会再次提交,包括服务重启后也是如此。使用相同 ID 但输入已更改时,请求会被拒绝。未提供 ID 时,预览可以生成一个 ID;每次新提交都必须包含该预览 ID 及其令牌。对于之前已记入日志的结果,即使令牌已过期或服务已重启,也可使用完全相同的工具/ID/输入进行查询,无需新令牌。切勿为了重试不确定的提交而生成替代 ID。
unknown 表示请求可能已到达 LinkedIn:断开连接、超时、服务端错误、无法读取响应正文或无法识别成功响应,都无法确定操作是否已完成。请手动检查目标。服务绝不会自动重试;相同 ID 仍可用于查询。单独的 HTTP 409 状态码会被视为 failed,除非响应正文明确表明内容重复或已经建立连接。配额和账号限制结果会触发相应的操作冷却时间。
安全限制会统计每次已预留的尝试,包括已知失败和结果不确定的尝试。只有已确认的连接才会计入已发送/待处理邀请分析数据。不确定的邀请也会在跨日的邀请安全门槛中按保守方式计数。health_check 会包含日志记录的 attempted、successful 和 uncertain 总数;较旧版本的历史计数仍保留在 actions.used 中,不会被推断为成功。
日志是 ~/.linkedin-mcp/budgets.json 的一部分,与现有计数器并存。
它会保留 ID、输入哈希、操作类别、日期和状态码;不会存储消息/帖子文本或原始响应详情。重放时会返回已存储的状态/代码以及通用说明。状态损坏或无法读取会阻止启动;保存失败会暂停后续数据/操作工作,直到修复存储。文件会以原子方式替换,并仅授予所有者权限。日志达到 10,000 条记录或状态文件达到 8 MiB 后会停止写入新内容;ID 永远不会自动丢弃。
删除状态会同时清除安全计数和重放保护。
运行时会从经过身份验证的 /me 身份生成哈希账户密钥;
不会使用 Cookie、配置文件路径或公开用户名作为账户密钥。同一成员的不同配置文件会共用全局预算/日志文件。浏览器启动时以及写入前都会重新验证身份。如果成员发生变化,运行时会以 ACCOUNT_CHANGED 停止;只有在检查账户后才能重启。身份缺失或有歧义时,会在提交前返回 ACCOUNT_UNRESOLVED。
预算预留/提交会在共享的本地文件系统锁下重新加载并保存。读取失败的尝试也会计入限额读取。现有的 default 计数仍作为无法归属的保守额度扣减;不会将其分配给新成员,也不会将其虚构为成功写入。无法归属的旧操作 ID 会返回 unknown,而不会断言它们属于已验证成员。在全新运行时,硬性检查点会阻止用于日志查询的身份读取。
配置文件所有权使用 <canonical-profile>.owner.lock;共享预算事务使用 <canonical-budget-file>.lock。close_session 和空闲关闭会在进程仍可重新启动 Chrome 时保留配置文件所有权。停止服务器即可释放锁。绝不会通过超时或猜测 PID 来窃取锁。发生崩溃后,请停止所有用户和关联的 Chrome 进程,保留安全文件,然后仅手动修复孤立的锁目录。切勿删除预算或日志以恢复自动化。本地文件系统是支持的状态共享边界;网络文件系统和断电后的持久性未经认证。
⚙️ 配置
| 变量 | 默认值 | 描述 |
|---|---|---|
LINKEDIN_PROVIDER | browser | 官方模式不可用,会在创建浏览器前拒绝。 |
LINKEDIN_HEADLESS | true | 服务器以无头模式运行。无论此项设置如何,--login 始终会打开真实窗口。设为 false 可查看浏览器。 |
LINKEDIN_CHROME_PATH | — | 显式指定 Chrome 二进制文件路径(否则使用 patchright 的路径)。 |
LINKEDIN_PROFILE_DIR | ~/.linkedin-mcp/profile | 持久化浏览器配置文件。 |
LINKEDIN_IDLE_TIMEOUT_MS | 300000 | 空闲达到此时长后关闭浏览器(设为 0 可禁用)。 |
LINKEDIN_CONCURRENCY | 1 | 仅支持串行执行。 |
LINKEDIN_ENABLE_WRITES | false | 明确选择启用 Alpha 阶段的浏览器写入;每次调用仍需审批。 |
LINKEDIN_ENABLE_EXPERIMENTAL_MESSAGES | false | 单独选择启用未经验证的新会话消息功能。 |
TRANSPORT | stdio | stdio(主要方式)或仅限本地的 http。 |
LINKEDIN_HTTP_TOKEN | — | HTTP 必需的随机 Bearer 密钥;stdio 不使用。 |
工具契约与验证
已注册 24 个工具。原生契约版本 1 会返回 structuredContent 和内容相同的 JSON 文本,并附带 fetchedAt、source、partial 和 status 元数据。完整路由与验证清单。
| 分组 | 工具 |
|---|---|
| 会话 | whoami、health_check、close_session |
| 读取 | get_my_profile、get_profile、get_feed、get_notifications、search_people、search_jobs、get_inbox、get_job_details、prepare_job_application、export_application_tracker、search_companies、get_company、get_company_posts、get_company_employees、get_pending_invitations、get_conversation |
| 自愿启用的 Alpha 写入操作 | connect_with_person、send_message、create_post、react_to_post、comment_on_post |
离线演练
构建此检出版本,然后运行 npm run demo:offline。它会使用合成输入执行真实的本地 MCP
调用,并持久化停止记录:冷启动状态、能力、可供审核的草稿预览、受阻的读取操作,以及正常关闭。它不会打开浏览器,
也不会发送 LinkedIn 请求。带日期的示例输出已标注为合成内容;首次真实读取记录仍需经过用户同意后才能进行验证。
有界工作流与设置
职位/公司调研、个人资料比较和收件箱分类 明确规定了调用次数上限和来源链接规则。客户端设置 区分了已在本地测试的 MCP 传输与未经测试的客户端应用。 隐私与删除说明了保留的安全历史记录。 选定个人资料的退役设计 记录了选定个人资料的退役命令、其确认与中断行为、用于预览中断尝试恢复操作的只读预览,以及刻意保留的共享状态。这两条命令均已纳入发布的 4.1.0。 路线图覆盖情况跟踪了每项验收要求。 3.1.0 版本新增了只读配置合并预览, 可检查明确选定的 JSON/JSONC 文件中的缺失、匹配或冲突条目,不会更改文件,也不会暴露其他服务的凭据。该功能已在发布的 3.1.0 中提供;与原生客户端的兼容性及实时兼容性仍未经验证。 官方提供方试点介绍了仍需提供的应用/权限范围和集成证据。实验性的 Docker 构建阶段已在本地通过 Node 22 测试;容器显示/登录及运行时仍未经验证。
🛠 开发
npm run dev # run from source (stdio)
npm run typecheck
npm test # vitest (safety layer + smoke)
npm run build
📄 许可证
MIT — 详见 LICENSE。经维护者授权,已从已提交的版本中恢复因云同步而缺失的文件。3.0.0 核心范围及目标位置回执均已纳入发布准备跟踪。与 LinkedIn 无关联。
由 Dev Agarwalla 制作
3.1.0 版本本地数据清单
3.1.0 命令 node dist/index.js --data-inventory 会报告
哪些固定的本地存储类别存在:选定的个人资料、其熔断器和所有者锁、共享预算/写入日志和事务锁,以及
旧版凭据。该命令仅读取文件系统元数据,不会打印私人路径
或内容,也不会进行任何更改。它不会读取或验证 JSON、遍历
个人资料内容、证明所有者已停止运行、验证 Windows ACL,或授权
删除。发现任何别名、意外类型、无法访问或身份已更改的情况,
或发现锁存在时,都会返回 needs_attention,退出代码为 1。否则,observed
仅表示有界的存在状态快照已成功完成。
此命令已在发布的 3.1.0 中提供,而非 3.0.0。请参阅 清单契约;协调擦除仍未完成。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。