关于 ApplyWise
ApplyWise 是面向求职者的 MCP 服务,可搜索职位、规划申请并填写表单。默认仅试运行,实际提交需审批或明确授权,并通过本地优先处理和安全检查控制副作用。
主要功能
- 01并行搜索多个招聘平台
- 02按条件筛选并去重职位
- 03规划申请并试运行
- 04填写并验证申请表
- 05提交前审批与安全拦截
- 06记录生成文本来源
适用场景
- 01跨招聘平台查找职位
- 02检查申请内容后再提交
- 03将验证码或 CAPTCHA 步骤交由人工
- 04避免重复申请并查看运行报告
MCP 相关
作为 MCP 服务向兼容客户端提供职位搜索、申请规划和表单处理工具。支持 stdio 与带 bearer token 的 streamable HTTP;默认试运行,真实提交受审批与授权机制约束。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
33收录的工具列表 · 更新于 1 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| limit | integer | 否 | |
| query | string | 否 | |
| boards | any | 否 | |
| cursor | string | 否 | |
| location | string | 否 | |
| platforms | any | 否 | |
| since_days | integer | 否 | |
| apply_policy | boolean | 否 |
详细介绍
job-apply-mcp (ApplyWise)
一个能帮你查找职位并填写申请的 MCP 服务,会在执行任何不可逆操作之前停下。它是模块化的(可插拔的平台、大模型提供商和浏览器驱动)、并行的、节省令牌的(紧凑的分页输出),并且本地优先(常规表单字段交由你设备上的 Ollama、LM Studio 或 MLX 处理;只有难写的文本才会升级处理)。可与 macOS、Linux 和 Windows 上的任意 MCP 客户端搭配使用。
警告
Alpha 版。 首次实际试用的结果(1 位用户,1 个晚上,发现约 330 个职位):搜索、排序、去重和规划已端到端跑通,浏览器驱动现在也能填写并验证完整的 Greenhouse 和 Lever 表单,但尚未有任何申请在无人值守的情况下提交。大多数 Greenhouse 招聘页面都启用了 reCAPTCHA 保护,因此工具会填写表单,并将最后的点击操作交给你(
handoff),这正是预期行为。要让自由文本问题在无需你介入的情况下提交,需要设置writing.reviewer = "router"(本地严格审查)。请预期仍有不完善之处;每个不可逆步骤都会受到保护并记录日志,且当结果不确定时绝不会重试。
安装为 Claude Code 插件
此仓库也是 Claude Code 插件市场。applywise 插件会为你启动 MCP 服务(固定使用经过审核的版本),并添加一个技能,告诉 Claude 如何安全地使用这些工具:
claude plugin marketplace add tanmayagrawal21/job-apply-mcp
claude plugin install applywise@applywise
然后在你自己的终端中,按照下面的快速入门运行 init 和 doctor,并在 /mcp 中检查 plugin:applywise:applywise。同样适用此安全模型:默认执行试运行,每次实际提交都须经人工批准,可见的 CAPTCHA 始终交由你处理;除非你自行开启许可窗口(安全模型第 7 和第 8 项),否则登录、验证码和账号创建都由你操作。要更新,请运行
claude plugin update applywise@applywise。有关版本发布和版本固定的工作方式,请参阅:docs/release.md。
5 分钟快速入门
你需要安装 uv(或 pipx)。无需克隆仓库。
# 1. Create config.toml, profile.toml, controls.toml (asks a few questions; --yes to skip them)
uvx --from git+https://github.com/tanmayagrawal21/job-apply-mcp job-apply-mcp init
# 2. Put your real details in the profile it printed the path of, then check everything
uvx --from git+https://github.com/tanmayagrawal21/job-apply-mcp job-apply-mcp doctor
# 3. Add the printed snippet to your MCP client (guides for ten clients: docs/clients/)
claude mcp add --transport stdio job-apply -- uvx --from git+https://github.com/tanmayagrawal21/job-apply-mcp job-apply-mcp
然后向你的助手提问:“搜索 greenhouse:examplecorp 上的数据相关职位,规划最合适的一份,并进行试运行。”
在设置 dry_run = false 之前,所有操作都会以试运行方式执行。
其他安装方式:pipx install git+https://github.com/tanmayagrawal21/job-apply-mcp(之后命令只需运行
job-apply-mcp),或将其通过 pip install 安装到虚拟环境中。首次发布到 PyPI 后,可以使用 uvx applywise(PyPI 发行包名为
applywise;job-apply-mcp 命令仍作为别名保留)。
可选扩展:[browser](Playwright)、[agent]、[jobspy]、[mlx]、[hf]、[litellm]、[keyring]。
功能
| 领域 | 你将获得什么 |
|---|---|
| 发现 | 并行搜索 Greenhouse、Lever、Ashby、SmartRecruiters、Workday 和 JobSpy 看板,并支持分页 |
| 政策门槛 | 根据签证赞助、公民身份、安全许可、工作经验、毕业时间范围、薪资下限和雇主模式跳过职位 |
| 运行 | run_applications / job-apply-mcp run:在一次运行中处理你传入的链接、你发邮件给自己的职位链接(只读邮件)和搜索结果,生成运行报告,并将反馈应用于下一次运行 |
| 申请 | 尽可能使用平台 API,否则使用浏览器驱动程序,并为其他网站提供通用的 LLM 辅助适配器 |
| 本地 LLM 路由 | 按复杂度评分分为多个层级(small/medium/large/narrative),支持回退、可选云端服务,并将你的 MCP 客户端作为最后手段 |
| 个人资料构建器 | 收集个人资料无法回答的问题,对其排序,然后向你提问(profile_questions、answer_profile_question、job-apply-mcp profile ask);模型绝不会提供答案 |
| 授权 | 按国家记录事实(home_country 对应 [authorization],其他国家对应 [authorization.<CC>]);不设默认国家,未知国家保持未确定状态 |
| 文案撰写 | 按照风格规则撰写求职信和回答,并检查禁用短语和避免提及空档期 |
| 来源记录 | 记录每段生成的文本,你可以验证或编辑 |
| 去重 | 保存申请记录,并可选导入确认邮件,确保你不会重复申请 |
| 控制层 | 配额、模式切换、证明和收件人保护、文案检查、提示词注入筛查 |
| 传输方式 | stdio(默认)和带 bearer token 的可流式 HTTP |
| 运维 | init、doctor、Dockerfile,以及在 Linux/macOS/Windows 上运行的 CI |
运行状态
run_applications / run_report 结果中的每个职位都恰好有一个状态,并在适用时包含 why
(ADR-0049):
| 状态 | 含义 |
|---|---|
submitted | 已发送实时提交;之后可能会收到确认 |
confirmed | 对账已确认提交 |
dry_run_ok | 干运行已完成:实时运行会提交该申请(配额请参见 live_preview;该行的 captcha 模式会说明验证码是否会阻止操作:docs/tools.md) |
needs_human | 你必须采取行动;why 会说明原因(未解决的字段、审核门槛、等待批准、验证码) |
quota_blocked | 每日、每平台或每次运行的配额阻止了实时提交;未发送任何内容 |
skipped | 未尝试;why 会说明原因(政策、重复、文案尚未获批、已达到 max_applications) |
unsupported_site | 没有已启用的适配器可以处理该主机 |
unknown | 结果不明确(例如点击后遇到阻碍);请手动核实 |
failed | 发生错误 |
max_applications(大于等于 1 的整数)限制一次运行处理的符合条件的职位数量(已准备好提交,或需要你采取行动),
干运行和实时模式均遵循相同限制;跳过和不支持的职位不计入。干运行还会返回
live_preview,显示当前实时配额允许的操作。实时提交还会计入每日(滚动 24 小时内 25 次)、
每平台(10 次)和每次运行(10 次)限制;用户配置可以调低或调高这些限制。
安全模型
- 默认试运行。 除非你修改设置,否则
dry_run = true;init总是会写入该设置。 - 审批令牌。
plan_application会返回一个与确切答案哈希绑定的令牌。实际提交需要该令牌,因此你审核的内容就是发送的内容(apply.auto_approve会关闭此功能;请勿关闭)。 - 控制层。 每次产生副作用前都会运行独立检查:每日和单次运行配额、单次提交防护、收件人拒绝名单、文本校验、页面文本注入筛查、
apply_enabled紧急停止开关。可在controls.toml中添加自己的规则。 - 强制停止。 出现可见的 CAPTCHA 挑战,以及匹配
policy.stop_phrases的声明复选框(例如 “未使用 AI”),始终会返回needs_human。这些设置无法通过配置绕过。只有在用户输入验证码、确认已授予预填权限(ADR-0026/0027),或同意从终端执行无人值守运行(第 8 条)时,才会输入验证码。默认关闭账户创建;只有在你自己的用户配置文件中设置accounts.auto_create = true,并且处于开放的凭据同意窗口内(ADR-0046),才能启用。 - 不编造事实。 答案来自你的个人资料,或会被标记;未解决的必填字段会停止运行。
自主程度(ADR-0052)。 你自己的用户配置中
[answers] autonomy决定你不在时 Agent 可以作出哪些假设:strict(默认:每个未解决的字段都会等待你回复);safe_default(拒绝提供联系或营销许可、使用配置的“你是如何得知我们的”默认答案、选择“拒绝自我认定”);或infer(还会根据你的简历回答关于工具或技术的技能/经验问题:只有简历明确表明具备时才答“是”,否则答“否”;绝不推断意愿、空闲情况、地点和条款相关问题)。 绝不作出有关授权/签证/身份、背景及其他筛查、便利措施、录音、声明、法律协议和雇佣条款、无政策依据的薪资、入职日期及地点事实的假设。每个假设答案都会标记(assumed、计划、证据、运行报告);对同一问题作出promote_after(3)次假设后,会询问你一次,并复用你的答案。项目文件或环境变量只能将自主程度设得更严格。init会询问要使用哪个级别;control_status会显示该级别。 - 隐私。 个人资料和密钥保留在你的设备上,不会提交到代码仓库;API 密钥只从环境变量读取。请参阅 SECURITY.md。
- 凭据绝不会传给模型。 ATS 登录信息存放在操作系统钥匙串中(
job-apply-mcp vault add <host> --username U;密码输入时不会回显)。浏览器会直接将凭据填入页面;MCP 仅公开vault_status(主机名,不含机密)。每次运行中,每个主机最多尝试登录 2 次;遇到锁定或密码错误时,会停止处理该主机(ADR-0046)。 - 同意窗口(可选,ADR-0048)。 每个所选时段内,只需在终端输入一次
job-apply-mcp consent --for 24h(或--per-run、--max N、--scopes ...)。在窗口期间,提交会自动获批(并记录同意 ID);若页面只有一个不可见的机器人检查组件,则会单击一次提交;系统会从预期发件人的最新邮件中读取验证码,并输入一次。 只有当verification.trusted_authserv_ids列出你自己的邮件服务器 Authentication-Results ID(仅限用户配置)时,才会启用无人值守验证码,以防伪造发件人提供验证码。 你之后可以审核结果(list_applications)。consent --revoke会结束同意;consent_status(MCP)为只读,任何工具都无法创建同意。 - 仅限所有者回答的问题(ADR-0050)。 联系、消息和营销许可(短信、WhatsApp、电话、电子邮件、职位提醒、人才社区)绝不会回答“是”;只有你自己的
optin:<channel>答案才适用,而且仅限单个、明确的许可问题。否则,这些问题会留给你回答;或者在answers.autonomy = "safe_default"或"infer"时予以拒绝(标记为assumed)(第 5 条)。授权和担保仅依据按国家/地区划分的结构化事实。 - 最终点击由你完成(可选,ADR-0058)。 将
[browser] final_click = "human"与headless = false一起设置。Agent 会填写并核验每份表单,将标签页置于前台,但绝不会点击 Submit。由你点击。监视器每 3 秒读取一次页面,最长持续human_click_timeout_s(默认 900 秒);网站显示成功页面后,监视器便会记录提交。随后,run_applications会一次交给你一个已填好的标签页。该设置只能收紧:任何配置层都可设为human,只有你自己的用户配置才能将其改回agent。 已知限制:Ashby 与 reCAPTCHA Enterprise。 受 reCAPTCHA Enterprise 保护的 Ashby 表单会悄无声息地拒绝自动提交点击,或要求完成验证,即使验证组件不可见也是如此。对于这类职位,请使用final_click = "human"。
传输方式
job-apply-mcp # stdio (what clients launch)
job-apply-mcp --transport http --host 127.0.0.1 --port 8765 # http://127.0.0.1:8765/mcp
JOB_APPLY_MCP_TOKEN=... job-apply-mcp --transport http --host 0.0.0.0 # non-local: token required
HTTP 默认绑定到环回地址;如果绑定到其他地址,则必须提供 JOB_APPLY_MCP_TOKEN(Authorization: Bearer ...),否则服务会拒绝启动。要通过网络访问,请使用 TLS 反向代理。项目包含一个 Dockerfile(默认不包含浏览器;--build-arg BROWSER=1 会添加 Playwright 和 Chromium)。
文档
- 客户端配置指南:Claude Desktop、Claude Code、Cursor、VS Code、Windsurf、Zed、Codex CLI、Gemini CLI、Continue、通用 JSON
- 工具参考和配置参考(自动生成)
- 常见问题、更新日志、设计决策、贡献指南
开发
git clone https://github.com/tanmayagrawal21/job-apply-mcp && cd job-apply-mcp
uv sync --extra dev
uv run ruff check . && uv run pytest -q # offline; live tests need JAM_LIVE=1
uv run python scripts/gen_config_docs.py # after changing config.py
隐私扫描:python scripts/privacy_scan.py --terms ~/.config/job-apply-mcp/privacy_terms.txt。所有者认可的发现项应写入 ~/.config/job-apply-mcp/privacy_allow.txt(位于仓库之外,通过 --allow FILE 指定);详见 ADR-0051。已提交的 .privacy-allow 仅包含用于虚构测试数据和清单中公开项目身份信息的完全锚定正则表达式(ADR-0042);切勿向其中添加私人术语或指纹。
采用 MIT 许可证。欢迎按照行为准则参与贡献。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。