104 Job Hunter MCP

104 Job Hunter MCP

This MCP server lets AI assistants search job listings on Taiwan's 104 Job Bank, read full job details, and prepare applications with human-in-the-loop confirmation before final submission.

Category
访问服务器

README

104 Job Hunter MCP

透過 MCP(Model Context Protocol)讓 AI 助理直接操作 104 人力銀行,實現「搜尋 → 閱讀職缺 → 輔助投遞」的完整求職工作流。

TypeScript Playwright MCP SDK


✨ 功能特色

特色 說明
🔍 API 攔截式搜尋 不解析 DOM,直接攔截 104 後端 JSON API 回應,完全繞過前端防爬蟲機制
📄 職缺詳情讀取 以真實 Chrome 瀏覽器存取職缺頁面,提取職位描述、條件要求與公司福利
🛡️ Human-in-the-loop 安全邊界 投遞工具只會點擊「我要應徵」並填入求職信,絕不自動按下最終送出,需人類親自確認
🍪 持久化登入 Session 使用專屬 Chrome Profile 儲存 Cookie,登入一次即可長期使用
🚫 Dry-run 友善設計 所有操作皆可在 AI 端預覽後再由人工執行,適合開發測試流程

📋 系統需求

  • Node.js 18 以上(建議 20 LTS)
  • Google Chrome 已安裝(Playwright 使用系統 Chrome 以存取真實 Cookie)
  • npm 9 以上

🚀 安裝步驟

# 1. Clone 專案
git clone https://github.com/YuJunWang/104-job-hunter-mcp.git
cd 104-job-hunter-mcp

# 2. 安裝相依套件
npm install

# 3. 建置 TypeScript
npm run build

🔐 首次使用:登入 104

這個工具需要你的 104 登入狀態來搜尋職缺與進行應徵。首次使用請執行以下指令:

npx tsx src/login.ts

執行後會自動開啟一個 Chrome 瀏覽器視窗,請手動登入你的 104 帳號。登入完成後關閉視窗,Cookie 會自動儲存到專案內的 .chrome-profile/ 資料夾,後續使用不需再次登入。

[!IMPORTANT] .chrome-profile/ 資料夾已加入 .gitignore,你的帳號 Session 不會被推送到 GitHub。


⚙️ Antigravity 2.0 MCP 設定

在你的 Antigravity MCP 設定檔(mcp_config.json)中,加入以下設定:

{
  "mcpServers": {
    "104-job-hunter": {
      "command": "node",
      "args": ["/絕對路徑/104-job-hunter-mcp/build/index.js"]
    }
  }
}

[!TIP] Windows 使用者請將路徑改為 C:\\Users\\你的帳號\\Projects\\104-job-hunter-mcp\\build\\index.js(注意雙反斜線)。

設定完成後重啟 Antigravity,即可在對話中直接呼叫以下三個工具。


🛠️ 工具說明

1. job104_search — 搜尋職缺

根據關鍵字搜尋 104 職缺列表。內部採用網路 API 攔截技術,直接解析 104 後端 JSON,不受前端 DOM 結構異動影響。

輸入參數:

參數 型別 必填 說明
keyword string ✅ 職缺關鍵字,例如 前端工程師、Node.js
location string ❌ 工作地點,例如 台北市
page number ❌ 頁數,預設為 1

範例輸入:

{
  "keyword": "TypeScript",
  "location": "台北市",
  "page": 1
}

範例輸出:

{
  "keyword": "TypeScript",
  "page": 1,
  "total": 342,
  "results": [
    {
      "title": "前端工程師 (TypeScript / React)",
      "company": "某科技股份有限公司",
      "salary": "月薪 6~10 萬",
      "location": "台北市信義區",
      "description": "負責前端產品開發與維護...",
      "link": "https://www.104.com.tw/job/xxxxxx",
      "skills": ["TypeScript", "React", "Node.js"]
    }
  ]
}

2. job104_get_details — 取得職缺詳情

輸入職缺頁面 URL,取得完整的職位描述、條件要求與公司福利。

輸入參數:

參數 型別 必填 說明
job_url string (URL) ✅ 104 職缺頁面完整網址

範例輸入:

{
  "job_url": "https://www.104.com.tw/job/xxxxxx"
}

範例輸出:

{
  "title": "前端工程師 (TypeScript / React)",
  "company": "某科技股份有限公司",
  "description": "【工作內容】\n• 使用 React + TypeScript 開發 SPA 應用\n• 維護既有前端系統並進行效能優化...",
  "requirements": "【應徵條件】\n• 學歷:大學以上\n• 經歷:3年以上\n• 熟悉 TypeScript、React...",
  "benefits": "【福利制度】\n• 年薪14個月\n• 員工旅遊\n• 彈性上下班..."
}

3. job104_prepare_application — 準備投遞應徵

開啟指定職缺的應徵視窗、填入求職信內容,並在需要人類最終確認的安全邊界下停止。

⚠️ 安全邊界: 此工具具備 Human-in-the-loop 安全機制。工具執行完畢後,瀏覽器畫面會停留在投遞確認頁,AI 不會也不能代替你按下最終送出按鈕。你必須親自確認畫面內容後,手動完成最後的投遞動作。

輸入參數:

參數 型別 必填 說明
job_url string (URL) ✅ 104 職缺頁面完整網址
cover_letter_text string ❌ 求職信 / 自傳內容,會自動填入應徵表單

範例輸入:

{
  "job_url": "https://www.104.com.tw/job/xxxxxx",
  "cover_letter_text": "您好,我對貴公司的前端職位非常感興趣,我有 5 年的 TypeScript 開發經驗..."
}

成功時的範例輸出:

{
  "status": "success",
  "message": "【Hit-in-the-loop】已成功點擊應徵按鈕並開啟投遞視窗。基於安全邊界,Agent 不會自動送出,請人類確認畫面後親自點擊最終送出按鈕!",
  "provided_cover_letter": "您好,我對貴公司的前端職位非常感興趣..."
}

失敗時的範例輸出(例如已應徵過):

{
  "status": "error",
  "error": "無法點擊我要應徵按鈕。請確認是否已經應徵過,或者網頁結構有變動。"
}

📁 專案結構

104-job-hunter-mcp/
├── src/
│   ├── index.ts          # MCP Server 主程式,註冊三個工具
│   ├── browser.ts        # Playwright 瀏覽器管理(單例模式)
│   ├── login.ts          # 首次登入輔助腳本
│   ├── test-client.ts    # 本地測試用客戶端
│   └── tools/
│       ├── search.ts     # job104_search 實作
│       ├── details.ts    # job104_get_details 實作
│       └── apply.ts      # job104_prepare_application 實作
├── build/                # TypeScript 編譯輸出(執行 npm run build 產生)
├── .chrome-profile/      # 登入後的 Chrome Profile(.gitignore 中)
├── package.json
└── tsconfig.json

⚠️ 重要注意事項

  1. prepare_application 絕不自動投遞:這是設計上的硬性安全邊界。工具執行後瀏覽器會停在投遞確認頁,需要真人確認所有資訊後手動送出。

  2. Chrome 必須已安裝:本工具使用系統 Chrome(非 Playwright 內建 Chromium),確保能使用完整的 Cookie 與登入 Session。

  3. 104 網頁結構可能異動:get_details 中的 DOM Selector 與 prepare_application 的按鈕定位,可能隨 104 改版而失效。若遇到問題,請至 src/tools/ 調整對應 Selector。

  4. API 攔截技術的限制:search 工具使用 Playwright 的 response 事件監聽。若 104 更換 API 路徑,請更新 search.ts 中的 /jobs/search/api/jobs 過濾條件。

  5. Session 到期:若 Cookie 失效(通常 30 天以上未使用),請重新執行 npx tsx src/login.ts 更新登入狀態。


📄 授權

ISC License


Built with ❤️ using TypeScript + Playwright + MCP SDK

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选