首页
/ Agent-Reach 职场招聘渠道详解:用 mcporter + mcp-server-linkedin 让 AI Agent 读取 LinkedIn

Agent-Reach 职场招聘渠道详解:用 mcporter + mcp-server-linkedin 让 AI Agent 读取 LinkedIn

2026-09-04 18:08:38作者:伍希望

本文围绕 Agent-Reach 技能体系中 career.md 这份「职场招聘」参考文档展开:先完整给出通过 mcporter 调用 mcp-server-linkedin 的 4 个核心只读命令(个人 Profile、人才搜索、公司资料、职位搜索),再结合 docs/install.md 的安装步骤、agent_reach/channels/linkedin.py 的渠道体检逻辑与 agent_reach/channels/mcporter.py 的配置解析源码,讲清 agent-reach doctor 是如何判断 LinkedIn 渠道当前处于「可用 / 告警 / 未配置」哪种状态,以及 MCP 不可用时 Jina Reader 降级方案如何兜底。读完后你可以独立完成 LinkedIn 渠道的注册、登录、调用与排障。

career 参考文档在技能路由体系中的位置

Agent-Reach 的 SKILL.md 定义了「互联网能力路由器」的路由表:当用户意图涉及招聘/职位/LinkedIn 时,Agent 被要求阅读 references/career.md 这份详细文档,而不是自行发明抓取方案。原文档的核心内容非常聚焦,包含三块要素:

  1. 通过 mcporter call linkedin.<方法名> 调用的 4 组 LinkedIn 只读命令;
  2. 一条「需要登录」的前置提示:首次使用前运行 uvx mcp-server-linkedin@latest --login 保存有效登录态;
  3. MCP 不可用时的 Fallback 方案——用 Jina Reader 直接读取公开页面。

从源码结构看,这份文档对应的实现是 agent_reach/channels/linkedin.py 中的 LinkedInChannel。它在 agent_reach/channels/init.py 中被注册进渠道列表,类属性声明了两个关键事实:

class LinkedInChannel(Channel):
    name = "linkedin"
    description = "LinkedIn 职业社交"
    backends = ["mcp-server-linkedin", "Jina Reader"]
    tier = 2

agent_reach/channels/base.py 的注释,backends有序候选列表mcp-server-linkedin 是首选后端,Jina Reader 是降级兜底——这正是原文档「MCP 不可用时用 Jina Reader」这句话在代码中的体现。tier = 2 表示该渠道「需要 setup」(0=零配置,1=需要免费 Key,2=需要安装配置),所以 README 与安装文档都把 LinkedIn 列为可选渠道,且明确「agent-reach install 不会自动安装 LinkedIn 相关组件,需要手动配置」。

can_handle 方法负责 URL 路由判断:只要链接的主机匹配 linkedin.com,该渠道就会被选中。

四个核心 mcporter 命令(career.md 原文命令全集)

career.md 文档给出的全部 4 个命令均通过 mcporter call linkedin.<方法> 参数名=参数值 的形式调用,下面完整保留并逐一说明参数:

# 获取个人资料
mcporter call linkedin.get_person_profile linkedin_username="username" sections="experience,education"

# 搜索人才
mcporter call linkedin.search_people keywords="AI engineer" location="Shanghai"

# 获取公司资料
mcporter call linkedin.get_company_profile company_name="openai" sections="posts,jobs"

# 搜索职位
mcporter call linkedin.search_jobs keywords="software engineer" location="Remote" max_pages=2

参数说明(按原文命令中的实际用法):

方法 参数 含义与示例
get_person_profile linkedin_username LinkedIn 个人主页的用户名(URL 中 /in/ 后面的部分)
sections 逗号分隔的板块选择,示例中请求 experience,education(工作经历、教育经历)
search_people keywords 人才搜索关键词,如 "AI engineer"
location 地理位置限定,如 "Shanghai"
get_company_profile company_name 公司名,如 "openai"
sections 板块选择,示例中请求 posts,jobs(公司动态、在招职位)
search_jobs keywords 职位关键词,如 "software engineer"
location 工作地点,支持 "Remote" 这类远程标识
max_pages 翻页上限,示例为 2 页,用于控制返回规模

这 4 个命令覆盖了招聘调研的常见场景:查候选人/目标人物的履历与教育背景(get_person_profile)、按关键词+城市搜人(search_people)、看某家公司的动态与在招岗位(get_company_profile)、按关键词+地点搜职位并限定翻页(search_jobs)。docs/install.md 的快速参考表也把 mcporter call linkedin.get_person_profile linkedin_username="..." 列为 LinkedIn 平台的标准示例命令,说明 mcporter 是该渠道安装后的唯一调用入口。

首次登录与 MCP 注册:两条必跑命令

career.md 原文有一条加粗提示:需要登录——首次使用前运行 uvx mcp-server-linkedin@latest --login,保存有效登录态。结合 docs/install.mdagent_reach/channels/linkedin.py 中的常量定义,完整的初始化流程是两条命令:

# 1. 首次登录(需要浏览器界面)
uvx mcp-server-linkedin@latest --login

# 2. 将 LinkedIn MCP 注册到 mcporter
mcporter config add linkedin --command uvx --arg mcp-server-linkedin@latest --env UV_HTTP_TIMEOUT=300 --scope home

其中 linkedin.py 把这两条命令固化为模块级常量:

_LOGIN_COMMAND = "uvx mcp-server-linkedin@latest --login"
_CONFIG_COMMAND = (
    "mcporter config add linkedin --command uvx "
    "--arg mcp-server-linkedin@latest --env UV_HTTP_TIMEOUT=300 --scope home"
)

各参数的实际作用:

  • uvx mcp-server-linkedin@latest:通过 uvx 按需获取并启动最新版 mcp-server-linkedin 服务,无需另装 Python 包或维护常驻 HTTP 服务。前提是已按官方说明安装 uv(会同时提供 uvx)。
  • --login:首次登录入口。按 docs/install.md 的说明,浏览器弹出后需手动登录 LinkedIn,登录态会保存到 ~/.linkedin-mcp/profile/;无桌面的服务器需要在 VNC 等可见桌面环境中运行同一条登录命令。
  • --env UV_HTTP_TIMEOUT=300:为服务进程设置 300 秒的 HTTP 超时,缓解浏览器自动化场景下的请求超时问题。
  • --scope home:把该 MCP 写入 home 级 mcporter 配置,使所有项目目录都能路由到 linkedin 这个 server 名。

值得注意:mcporter config add 注册时使用的 server 名是 linkedin。而 linkedin.py 中定义的合法 server 名集合有 4 个变体,体检时会做交集匹配:

_LINKEDIN_SERVER_NAMES = {
    "linkedin",
    "linkedin-scraper",
    "linkedin-scraper-mcp",
    "mcp-server-linkedin",
}

这意味着用户即使用旧命名(如 linkedin-scraper-mcp)注册过 MCP,agent-reach doctor 也能识别出来,不会误报「未配置」。

doctor 体检逻辑:agent-reach 如何判断 LinkedIn 渠道状态

agent-reach doctor(可加 --json 查看每个平台的激活后端)是 Agent 动手前的标准体检动作。对 LinkedIn 渠道,agent_reach/channels/linkedin.pycheck() 方法实现了一条完整的状态机,返回值是 (status, message) 二元组,状态取值 off / warn / error。完整分支如下:

  1. mcporter 未安装 → 返回 off。提示文案明确「基本内容可通过 Jina Reader 读取」,并给出安装 uv--login 登录、mcporter config add 注册的完整三步指引。
  2. mcporter 配置检查抛出 McporterConfigError → 返回 error,附具体解析失败原因。
  3. 配置中发现了 LinkedIn 系 server 名,但 uvx 未安装 → 返回 warn:「LinkedIn MCP 已写入 mcporter 配置,但 uvx 未安装,当前无法启动服务」。
  4. 配置中有 LinkedIn 且 uvx 已安装 → 返回 warn:「Doctor 未启动本地服务做连通验证,不能仅凭配置宣称完整可用」。也就是说,仅凭配置文件存在就宣称「完整可用」在 Agent-Reach 的设计里是不成立的
  5. 本地配置未发现 LinkedIn,但配置启用了 editor imports → 返回 warn:Doctor 为避免扩大凭据读取范围,没有展开 imports,当前未验证。
  6. mcporter 已装但 LinkedIn MCP 完全未配置 → 返回 off,给出两条初始化命令。

这套状态机依赖 agent_reach/channels/mcporter.pyinspect_mcporter_config() 提供的只读配置解析。它的关键设计可以从源码直接确认:

  • 配置层选择_select_config_layers):若设置了环境变量 MCPORTER_CONFIG,则只读该单一文件;否则按 mcporter 0.7.3 的加载顺序读取 home 配置(~/.mcporter/mcporter.jsonmcporter.jsonc,取先出现者),再叠加项目级 <cwd>/config/mcporter.json,项目条目可覆盖 home 中的同名 server。
  • 只提取精确的 mcpServers key:解析时只收集 server 名(做 casefold 小写化),忽略路径、描述、端点等元数据——只有每个 server 对象的名字是路由信号。
  • imports 语义:若配置省略 imports 键,mcporter 默认会导入受支持的编辑器配置;Doctor 有意不打开这些文件,因此把结果标记为 imports_unchecked=True,对应上面的第 5 个分支。这也解释了为什么「配置里有 imports 时不能下结论」。
  • 安全边界:读取走 read_small_text_no_follow(不跟随符号链接、限制 1MB 上限),JSON 解析失败、顶层不是对象、server 定义不是对象等情况都会抛 McporterConfigError,而不是静默放过。

仓库自带的 config/mcporter.json 展示了配置文件的实际形态:

{
  "mcpServers": {
    "exa": { "baseUrl": "https://mcp.exa.ai/mcp" },
    "xiaohongshu": { "baseUrl": "http://localhost:18060/mcp" }
  },
  "imports": []
}

按本文场景,配置 LinkedIn 后该文件(或 home 层配置)中会多出一个 linkedin 条目,其 commanduvx、参数指向 mcp-server-linkedin@latest。注意上例中 imports: [] 是空列表——一旦写成非空列表,inspect_mcporter_config 会把 imports_unchecked 置真,doctor 对 LinkedIn 的结论就会带上「未展开验证」的告警。

Fallback 方案:MCP 不可用时走 Jina Reader

career.md 原文最后一节给出了降级路径:

curl -s "https://r.jina.ai/https://linkedin.com/in/username"

username 替换为 LinkedIn 个人主页 URL 中的用户名即可,Jina Reader 返回该公开页面的可读文本。从 README 的渠道对照表看,LinkedIn 的双后端定位正是「Jina Reader 读公开页面(基础)+ mcp-server-linkedin(Profile 详情、公司页面、职位搜索等完整功能)」。两者的能力边界差异在于:

  • Jina Reader:零配置,只能拿到公开页面的渲染文本,无法调用人才/职位搜索这类需要登录态的结构化接口;
  • mcp-server-linkedin:基于浏览器自动化与保存的登录态(~/.linkedin-mcp/profile/),支持 career.md 中全部 4 个方法。

因此实操建议是:先用 curl r.jina.ai 验证目标页面可公开访问、拿到基础信息;当任务需要人才搜索、职位分页或公司 jobs 板块时,再按上文流程配置 MCP。

测试如何锁定这些行为

tests/test_channels.py 中对 LinkedInChannel 有一组针对性用例,直接印证了前文的状态机结论:

  • 未安装 mcporter 时,提示文案必须包含 uvx mcp-server-linkedin@latest --login 与完整的 mcporter config add linkedin --command uvx --arg mcp-server-linkedin@latest --env UV_HTTP_TIMEOUT=300 注册命令,且不得再提示旧的安装方式(如 pip install linkedin-scraper-mcp);
  • 配置中已写入 linkedin 但环境缺少 uvx 时,状态必须是 warn 而非 ok
  • 配置中的 server 名匹配(包括 linkedinlinkedin-scraperlinkedin-scraper-mcpmcp-server-linkedin 四种变体)被覆盖验证;
  • 「配置名包含 linkedin 字样但只是 baseUrl 等元数据」的场景被显式排除,防止假阳性——只有精确的 mcpServers key 才算配置存在;
  • 完全未配置 LinkedIn 时返回 off

这些用例说明:LinkedIn 渠道的「可用性」在 Agent-Reach 中是一个被测试锁定的保守判断——配置存在只是必要条件,doctor 不会仅凭它宣称完整可用。

小结

事项 结论与命令
文档定位 career.md 是 SKILL.md 路由表中「招聘/职位/LinkedIn」意图对应的参考文档
4 个核心命令 get_person_profile / search_people / get_company_profile / search_jobs,均经 mcporter call linkedin.<方法> 调用
首次登录 uvx mcp-server-linkedin@latest --login,登录态存于 ~/.linkedin-mcp/profile/,无桌面环境需 VNC
MCP 注册 mcporter config add linkedin --command uvx --arg mcp-server-linkedin@latest --env UV_HTTP_TIMEOUT=300 --scope home
体检 agent-reach doctor --json;LinkedIn 为 tier 2(需 setup),active_backend 以 doctor 输出为准
降级 curl -s "https://r.jina.ai/https://linkedin.com/in/username" 读取公开页面

按这套流程完成配置后,Agent 即可在招聘调研任务中直接调用 4 个 LinkedIn 只读命令;任何一步体检告警,都可以对照 off / warn / error 的具体提示文案与上文状态机逐条排障。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
528
590
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
904
1.82 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
889
5.78 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.52 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.33 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
983
503
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384