这次我们来看一个很实际的玩法:让 Claude Code 和 Codex 这类 AI 编码代理,通过约 30 个 MCP 工具,把 LinkedIn 外联(LinkedIn outreach)从“手动逐条复制粘贴”变成“批量、可追踪、可复核”的任务流水线,目标量级是 1000 条以上。
先梳理概念。MCP(Model Context Protocol)解决的是“AI 代理怎么安全、结构化地调用外部工具”的问题。Claude Code 和 Codex CLI 都支持 MCP,注册好 MCP server 后,它们会获得一组可调用的工具,比如“搜索联系人资料”“读取 CSV 联系人表”“生成个性化消息草稿”“写入跟进记录”“调用外部 CRM 接口”等。标题里说的“约 30 个 MCP 工具”,就是把外联场景涉及的能力拆成一组可组合的工具集,而不是让 AI 自由发挥、盲目群发。
如果你在做 B2B 销售、商务拓展、开发者关系、招聘或活动邀约,这篇文章值得看到最后。下面按“核心能力 -> 环境准备 -> 安装配置 -> 小规模验证 -> 批量任务与接口 -> 性能观察 -> 排错 -> 最佳实践”的顺序展开。整个过程不需要 GPU,也不涉及本地大模型推理,门槛集中在环境配置、账号权限和合规设计上。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 项目类型 | AI Agent 自动化外联工具链 |
| 核心调度方 | Claude Code / Codex CLI |
| 工具协议 | MCP(Model Context Protocol) |
| 工具规模 | 约 30 个 MCP 工具,按能力可分为资料搜索、消息生成、联系人管理、任务调度、数据记录、报告输出 |
| 任务规模 | 1000 条级别批量外联,具体上限取决于账号权限、平台速率限制与消息质量 |
| 是否支持批量 | 支持,批量任务的可控性是这个方案的重点 |
| 是否支持 API | MCP server 通常以 stdio 或 HTTP 暴露工具接口,可被 CLI、自研程序或第三方任务框架调用 |
| 硬件要求 | 无 GPU 需求,Claude 与 Codex 均为云端模型 API 调用 |
| 主要风险 | 平台规则限制、账号风控、隐私合规、消息质量失控 |
从能力表能看出来,这个方案的核心不是“替你把消息全发了”,而是把外联中耗时最多的环节——资料整理、背景调研、消息个性化、跟进记录、排期提醒——交给工具链做结构化处理。真正点击“发送”的动作,仍然要由人来确认和触发,或者至少保留人工审核队列。
2. 适用场景与使用边界
这个方案适合以下场景:
- B2B 销售团队做线索触达,先通过 AI 生成候选名单和个性化开场白,再由销售确认发送。
- 开发者关系或开源社区运营,批量联系潜在贡献者、维护者、合作方。
- 招聘人员筛选候选人,自动准备职位沟通文案和背景差异点。
- 活动运营做参会邀约,对不同嘉宾生成不同主题的邀请信息。
- 内容运营做文章分发和互推联系,管理一组长期跟进名单。
不适合的场景也很明确:
- 完全无人监管的“海量群发”,这类操作既容易触发平台风控,也容易造成品牌伤害。
- 为了绕开平台限制而使用黑产工具、伪造身份或批量注册账号,这类行为不应进入技术讨论范围。
- 对已有明确拒绝意向的联系人继续重复触达。
合规边界必须放在前面说。LinkedIn 对自动化批量添加好友、高频群发消息有明确限制,使用非官方手段批量操作可能导致账号受限甚至封停。如果要大规模外联,优先确认是否走官方 API 或平台认可的合作伙伴方案。外联过程中涉及收件人姓名、公司、职位、邮箱等个人信息,必须遵守所在地适用的个人信息保护法规,给收件人提供退订和申诉渠道。外联消息要使用真实身份、真实公司信息,不能用 AI 编造共同背景、冒充他人或生成误导性内容。
3. 环境准备与前置条件
先看一眼硬性要求。这个方案对电脑性能要求很低,不需要独立显卡,重点在软件环境和账号状态。
3.1 软件依赖
建议按以下清单检查本机环境:
- Node.js 18 或更高版本,npm 可用。Claude Code、Codex CLI 以及部分 MCP server 都依赖 Node 生态。
- Python 3.10 或更高版本,pip 可用。部分 MCP server 以 Python 实现,比如文档解析、数据处理类工具。
- Git 命令行工具,用来拉取 MCP server 源码或仓库模板。
- 文本编辑器或 IDE,推荐 VS Code。
- 终端工具,Windows 用户建议使用 PowerShell 7 或 Windows Terminal。
3.2 账号与 API 权限
这一步容易被忽略,但往往决定整个方案能不能跑通:
- Claude Code 需要可用的 Anthropic 账号,并确认账号具备使用 Claude API 或订阅服务的权限。
- Codex CLI 需要 OpenAI 账号登录。运行时会校验登录状态。
- 外联目标数据如果来自 LinkedIn,要提前核实你的账号当前是否有足够的搜索和连接权限。
- 如果走 LinkedIn 官方 API,需要创建开发者应用并申请对应权限,这一步通常有审核周期,不会立刻开通。
从网络反馈看,常见的坑有两类:一类是安装不完整导致 CLI 无法启动,另一类是账号权限不足导致 API 请求直接报错。所以在跑批量任务之前,先把账号状态确认清楚,比反复调代码更节省时间。
3.3 网络与端口检查
外联任务需要访问模型 API 和 LinkedIn 服务。启动前先检查:
- 模型 API 域名是否可正常访问,比如 api.anthropic.com 或 OpenAI 对应域名。
- 如果本机配置了代理或内网网关,确认相关服务的端口和证书设置正确。
- 本地 MCP server 如果是 HTTP 模式,确认端口没被占用。常见端口如 8000、8080、3000,冲突时换一个端口即可。
如果使用第三方工具切换 API 端点时出现cc switch local proxy failed while handling codex endpoint /responses这类报错,优先检查本地代理地址、端口和模型名是否匹配,不要直接用默认配置硬跑。
4. 安装部署与启动方式
4.1 安装 Claude Code 与 Codex CLI
这里给的是通用安装方式,实际以官方文档为准。安装前先确认 npm 源可用,再执行全局安装。
# 安装 Claude Code(示例命令,以官方文档为准) npm install -g @anthropic-ai/claude-code # 安装 Codex CLI(示例命令,以官方文档为准) npm install -g @openai/codex # 检查版本 claude --version codex --version如果终端提示claude : 无法将“claude”项识别为 cmdlet、函数、脚本文件或可运行程序的名称,说明 npm 全局 bin 目录不在 PATH 里,或者安装没有成功。解决方式:确认 npm 全局安装路径,重启终端,或直接用 npx 方式临时启动。
# 使用 npx 方式临时启动 Claude Code npx @anthropic-ai/claude-code如果安装后提示error: claude native binary not installed. either postinstall did not run,大概率是 npm postinstall 脚本没有执行,常见原因是缓存或权限问题。可以清缓存、重新安装,或者升级 Node 版本后再试。
4.2 配置 MCP server
MCP server 的注册方式是写 JSON 配置文件。Claude Code 项目级配置通常放在项目根目录的.mcp.json里,用户级配置则在~/.claude.json或类似路径。Codex CLI 也有对应的注册方式,字段结构类似。
下面是一个通用配置模板:
{ "mcpServers": { "linkedin-search": { "command": "npx", "args": ["-y", "some-linkedin-search-server"], "env": {} }, "csv-contacts": { "command": "python", "args": ["-m", "mcp_server_for_csv"], "env": { "CONTACTS_FILE": "./data/contacts.csv" } }, "crm-log": { "command": "npx", "args": ["-y", "some-crm-mcp-server"], "env": { "CRM_BASE_URL": "http://127.0.0.1:8080" } } } }注意几个细节:
command和args要按你实际使用的 MCP server 文档填写,上面只是结构示例。env里的环境变量用来传 API Key、文件路径、数据库连接串等,建议用系统环境变量引用,不要硬编码密钥。- 每个 MCP server 有独立的工具命名空间,不同工具之间不会互相污染。
配置完成后,进入 Claude Code 会话,执行/mcp命令,可以看到当前已连接的工具列表。Codex CLI 里也有类似的codex mcp子命令。如果工具列表为空,优先检查启动日志。
4.3 启动与访问验证
以 Claude Code 为例,在项目目录启动:
claude进入交互会话后,可以直接提问,让模型调用已注册的 MCP 工具。比如:
- “读取
contacts.csv,列出前 5 位联系人。” - “调用联系人搜索工具,找出公司为某公司、职位含‘技术负责人’的人,输出前 3 条。”
验证成功的标准是:模型能够主动调用 MCP 工具,返回结构化结果,并且在对话中给出它使用的工具名。如果模型一直说自己“没有权限”或“无法访问文件”,通常是 MCP server 没注册成功,或者环境变量没有传进去。
5. 功能测试与效果验证
在正式跑 1000 条之前,先用 10 条数据做全链路验证。这个步骤可以复用到任何 AI 外联工具链里。
5.1 准备测试数据
建一个 CSV 文件,字段建议包含:name、company、title、linkedin_url、note。note是可自定义字段,用来放 AI 写个性化消息时的背景信息。
name,company,title,linkedin_url,note 张三,某某科技,技术负责人,https://www.linkedin.com/in/zhangsan,你们团队的博客写过 MCP 实践 李四,某某云,开发者关系,https://www.linkedin.com/in/lisi,刚看完某篇文章,聊到 MCP 协议 王五,某某金融,架构师,https://www.linkedin.com/in/wangwu,他在分享中提到过 AI Agent5.2 消息生成测试
让 Claude Code 或 Codex 读取测试 CSV,生成 10 条个性化消息。要求模型输出以下格式:
{ "name": "张三", "company": "某某科技", "title": "技术负责人", "message": "张三你好,看到你在 MCP 实践上的分享……", "reason": "因为你们团队对 MCP 有实际落地经验" }这个测试的目的不是看消息写得好不好,而是验证三件事:
- 模型能否读取 CSV 并按记录逐条生成。
- 字段替换是否准确,不会把“张三”的消息发成“李四”。
- 消息长度是否可控,不会超出平台限制。
如果模型生成的消息出现串行、字段错乱、人名不正确,优先检查 CSV 编码(建议 UTF-8)、字段名是否统一、提示词里是否明确指定了输出格式。
5.3 去重与黑名单测试
批量外联必须处理重复数据。测试数据里加入两条相同linkedin_url,让模型跳过第二条,同时在消息生成时忽略黑名单名单文件。
# 目录结构参考 data/ contacts.csv # 待外联联系人 blacklist.csv # 黑名单 output/ messages.json # 生成的消息结果 failed.json # 生成失败的记录判断成功标准:重复记录只保留一条,黑名单条目没有生成消息,失败记录被单独导出,并且failed.json里写明了失败原因。
5.4 人工审核队列
外联场景里,AI 生成的消息建议先进人工审核队列。一个简单做法是:AI 生成消息后不直接发送,而是写入pending_review目录。人工审核确认后再执行发送。这一步可以显著降低账号风控风险和消息质量风险。
data/output/ pending_review/ # 待人工审核 approved/ # 已审核通过 sent/ # 已发送记录 blacklist/ # 对方退订或拒绝后自动归档6. 接口 API 与批量任务
6.1 MCP 工具调用流程
MCP server 的本质是给 AI 代理暴露一组函数。Claude Code 或 Codex CLI 是宿主,它们负责把用户需求拆成工具调用。自研程序同样可以通过 MCP 客户端 SDK 调用同一个 server,不依赖 Claude Code。
一个简化后的调用流程是:
- 读取任务输入(CSV 或 JSON)。
- 对每条记录调用“联系人搜索工具”验证信息。
- 调用“消息生成工具”生成个性化文案。
- 调用“任务队列工具”写入待发送任务。
- 调用“发送工具”时,必须经过人工审核标志位。
- 调用“日志工具”记录成功、失败、拒绝原因。
6.2 批量任务队列设计
1000 条外联不要一次性并发,而是拆成批次。推荐按“10 条一批”或“50 条一批”执行,批次之间插入延时。
{ "task_name": "linkedin_outreach_q3", "input_file": "./data/contacts.csv", "batch_size": 10, "delay_seconds": 30, "retry_times": 3, "retry_interval_seconds": 60, "approval_required": true, "output_dir": "./data/output" }解释一下关键字段:
batch_size控制单批处理条数。delay_seconds控制批次间延时,用来降低触发平台风控的概率。retry_times和retry_interval_seconds控制失败重试。approval_required强制人工审核,建议保持true。
6.3 Python 调用示例
如果要用自研脚本调度 MCP 工具,可以走通用流程。下面是一个结构示例,具体工具名和参数要以你实际注册的 MCP server 为准。
import csv import json import time from typing import Any def load_contacts(path: str) -> list[dict[str, Any]]: with open(path, "r", encoding="utf-8") as f: return list(csv.DictReader(f)) def call_mcp_tool(tool_name: str, arguments: dict[str, Any]) -> dict[str, Any]: # 这里是伪代码,实际项目请替换为 MCP 客户端 SDK 调用 # response = mcp_client.call_tool(tool_name, arguments) response = {"status": "ok", "tool": tool_name, "data": arguments} return response def build_message(row: dict[str, Any]) -> str: # 实际场景可以调用 Claude / Codex 生成,这里只做占位 return f"{row['name']},看到你们在{row['company']}的实践……" def process_batch(rows: list[dict[str, Any]]) -> None: for row in rows: if row.get("skip") == "true": continue message = build_message(row) result = call_mcp_tool("log_message", { "name": row["name"], "company": row["company"], "message": message }) print(row["name"], result["status"]) time.sleep(2) if __name__ == "__main__": contacts = load_contacts("./data/contacts.csv")[:10] process_batch(contacts)这个脚本只是把链路串起来,真实项目里,消息生成应该调用模型 API,发送动作必须走人工审核后的发送队列,并且每次调用都要记录时间戳和状态。
6.4 失败重试与断点续跑
批量任务跑到中途失败很正常。设计上要做到:每一条记录有独立状态,失败后重新读取任务文件时,已经成功的记录不会重复执行。
状态机可以这样设计:
pending -> processing -> approved -> sent | v failed -> retry -> pending每个状态写入日志文件。断点续跑时,只读取pending和failed状态的记录,不重新处理sent记录。
7. 资源占用与性能观察
这个方案不涉及显存,但相关的资源观察点更集中在 API 配额、token 消耗、任务时长和账号风控阈值上。
7.1 API 配额与 token 消耗
每次模型调用都会消耗 token。1000 条外联如果每条生成一次个性化消息,token 消耗取决于消息长度和输入上下文长度。建议在任务开始前做成本估算:
预计消耗 = 联系人数量 × 单条消息平均 token比如每条消息平均 500 token,1000 条大约 50 万 token。实际消耗会因为上下文、工具返回结果、重试次数而增加。跑完一批后,要在模型服务后台查看实际用量,确认没有异常放大。
7.2 任务时长评估
1000 条不是“瞬间完成”。一条外联完整流程可能包括:查询联系人、生成消息、写入日志、控制延时。如果每条平均耗时 5 到 10 秒,1000 条可能需要 1 到 3 小时,实际取决于 API 响应速度和延时设置。
建议这样观察:
- 每批次开始和结束打时间戳。
- 记录每批次处理条数、成功条数、失败条数。
- 观察 API 返回时间是否逐步变慢,如果变慢,往往是对应限流触发。
- 批量跑的时候不要关终端,使用
nohup或任务后台运行,日志写到文件。
7.3 内存与进程
MCP server 以本地子进程方式运行时,会占用少量内存。如果你的工具集有 30 个 MCP server 同时常驻,内存占用会线性增加。建议在正式跑 1000 条前,先看一遍所有 MCP server 的进程列表:
# 查看 MCP 相关进程资源占用(以实际进程名为准) ps aux | grep -E "mcp|claude|codex" | grep -v grep如果内存吃紧,可以按需启动部分 MCP server,而不是全部配置常驻。
8. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
终端提示claude : 无法将“claude”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 | npm 全局 bin 目录不在 PATH,或安装未完成 | 查看 npm bin 路径,重启终端 | 重新安装,或将 bin 目录加入 PATH,或使用 npx 启动 |
安装后报error: claude native binary not installed. either postinstall did not run | npm postinstall 脚本未执行 | 检查安装日志,确认 Node 版本 | 清理 npm 缓存,重装 CLI |
| 调用模型 API 报账号不可用类错误 | 账号权限、区域或登录状态异常 | 检查账号后台状态 | 确认账号权限和 API 额度,使用组织账号 |
| Codex 请求时提示某个模型型号不受支持 | 模型配置名写错,或服务商不支持该型号 | 检查配置里的模型名 | 改成当前 API 可用的模型名 |
使用第三方工具切换端点时报cc switch local proxy failed while handling codex endpoint | 本地代理地址、端口或证书配置不正确 | 检查代理配置和请求日志 | 校准代理参数,恢复默认配置再测试 |
/mcp工具列表为空 | MCP server 注册失败,或启动子进程失败 | 查看 CLI 启动日志,单独执行 command 验证 | 修正.mcp.json中的 command、args 和 env |
| 批量任务跑到一半卡住 | 超时设置太短、API 限流、子进程假死 | 查看日志末行,检查进程状态 | 增加超时时间,批次间延时,失败自动重试 |
| API 返回 429 或限流错误 | 请求频率超过平台限制 | 查看 API 后台配额 | 降低并发,增大延时,削减 batch_size |
| 生成的消息出现串行、字段替换错误 | CSV 字段名不匹配,或提示词约束不足 | 打印单条输入输出对比 | 统一字段名,强制 JSON 结构化输出,人工抽查 |
遇到问题先不要反复重跑全集。把范围缩小到单条记录、单个工具,用最小复现排查。
9. 最佳实践与使用建议
9.1 先小批量,再大规模
第一次尝试只跑 10 条,并全程人工审核。10 条链路没问题后再跑 50 条,确认没有触发限流,再考虑 200、500、1000。不要第一天就在生产账号上跑 1000 条。
9.2 保留一套最小可运行配置
把下面这份配置固化下来,作为新环境的标准起点:
project_root/ .mcp.json # MCP server 配置 data/ # 输入数据与输出结果 scripts/ # 调度脚本 logs/ # 任务日志 prompts/ # 消息生成提示词模板基础提示词模板单独保存,方便对比不同版本效果。
9.3 消息质量是所有环节的上限
工具链再顺畅,如果消息本身是“一眼群发”的废话,回复率依然会很低。建议在消息生成提示词中明确要求:
- 引用对方真实公开信息,且不能编造。
- 保持短句,控制在平台合理长度内。
- 明确说明来意和真实身份。
- 不诱导点击、不夸张承诺。
9.4 日志、审计与人审缺一不可
每条外联记录至少包含:发送时间、消息内容、对方状态、失败原因、操作人。这样在账号异常、被投诉或需要复盘时,可以快速定位。
9.5 账号风控意识
高频批量操作会明显增加账号风险。控制单日外联总量,预留退订和拒绝处理流程,不要对已拒绝用户反复触达。如果账号本身是企业主账号或绑定销售团队核心资源,建议先评估风险再决定是否上自动化方案。
9.6 隐私授权
AI 生成消息时,模型会读取联系人数据生成个性化文案,这可能涉及个人信息传输。要在符合公司隐私政策和法律要求的前提下处理这些数据,不在提示词中堆积不必要的敏感字段。
10. 总结与下一步
这个方案最值得尝试的地方,是把 LinkedIn 外联从“手工作坊”变成“半自动流水线”。Claude Code 和 Codex 负责消息生成与工具调度,MCP 负责工具接入,批量任务框架负责状态控制和失败重试。整条链路不需要 GPU,也不需要本地大模型,真正的工作量在环境配置、数据清洗和人工审核机制上。
最先要验证的功能不是“发出去”,而是“生成结果是否准确”。用 10 条 CSV 数据跑通“读取联系人 -> 生成个性化消息 -> 写入审核队列”这条链路,成功后再逐步扩大规模。
最容易踩的坑有三个:CLI 安装不完整导致启动失败、MCP server 注册后工具列表为空、批量任务缺少断点续跑导致重复发送。先把这三个问题的主语解决掉,后面的批量执行就会顺畅很多。
后续可以考虑扩展的方向:接入 CRM 同步跟进状态,增加效果统计看板,把审核流程做成 Web 界面,或者在消息触达后自动记录对方回复并生成下一步建议。这个方向的价值不在“发得多”,而在“每次触达都有记录、有依据、可优化”。