Skip to main content
Glama
YuJunWang

104 Job Hunter MCP

by YuJunWang

104 Job Hunter MCP

透過 MCP (Model Context Protocol) 讓 AI 直接操作 104 人力銀行。實現搜尋、比對、投遞自動化。 🤖 進階應用:利用 AGENTS.md 啟動詢答,從現有履歷直接建立「求職者虛擬分身」(MY_PROFILE.md),精準鎖定職缺。

TypeScript Playwright MCP SDK


IMPORTANT

🤖 給 AI Agent 的最高指導原則 (System Prompt for AI)

如果你是接手這個專案的 AI,你的下一步是立刻讀取專案根目錄的 AGENTS.md。 裡面有建立「虛擬分身」、過濾職缺與投遞的標準劇本。讀完前,禁止執行任何搜尋工具。


✨ 核心功能 (Features)

  • 🔍 API 攔截式搜尋:直接攔截 104 後端 JSON API,繞過前端防爬蟲機制。

  • 📄 職缺詳情讀取:用真實 Chrome 提取職位描述、條件要求與福利。

  • 🛡️ Hit-in-the-loop 安全機制:投遞工具只會填好求職信,絕對不會幫你按送出

  • 🍪 持久化登入:Cookie 存入專屬 Chrome Profile,免重複登入。

  • 🤖 Agent 行為規範:內建 AGENTS.md 提供自動化求職劇本。

Related MCP server: jobjourney-claude-plugin

🔒 隱私與安全 (Privacy & Security)

這個工具採用本地優先 (Local-First) 架構,確保帳號安全:

  1. 100% 本地執行:MCP 伺服器只在你的電腦上跑,不回傳帳號密碼。

  2. 不經手密碼:登入時會跳出本地 Chrome,你自己在 104 官方頁面登入。

  3. Cookie 安全隔離:加密存在本機的 .chrome-profile/。該資料夾已列入 .gitignore,不會上傳 GitHub。


🚀 安裝與執行 (Setup)

1. Clone 專案與建置

git clone https://github.com/YuJunWang/104-job-hunter-mcp.git
cd 104-job-hunter-mcp
npm install
npm run build

(系統需求:Node.js 18+、Google Chrome)

2. 登入 104 帳號(只需一次)

npx tsx src/login.ts

執行後會跳出 Chrome 視窗,請手動登入 104,完成後關閉視窗。

3. 掛載 MCP 伺服器

把以下設定貼進 MCP 客戶端設定檔(如 Antigravity 的 mcp_config.json 或 Claude Desktop config.json):

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

(Windows 使用者請注意路徑反斜線跳脫:C:\\Users\\你的帳號\\...\\build\\index.js)

重啟 AI 客戶端,工具就準備好了。

4. 設定 AI 腦袋 (Agent 規範)

  1. 複製根目錄的 MY_PROFILE.example.md,重新命名為 MY_PROFILE.md

  2. 填入你的求職偏好與地雷。

  3. 讓 AI 讀取 AGENTS.md

    • Antigravity:將 AGENTS.md 放進 .agents/rules/,或存成全域 Skill (~/.gemini/config/skills/104-hunter/SKILL.md)。

    • Cursor:把 AGENTS.md 內容貼進 .cursorrules

    • Claude Desktop:貼進 System Prompt。

    • 直接講:「請閱讀專案內的 MY_PROFILE.md 與 AGENTS.md 並按照流程幫我找工作」。


🤖 AI Agent 開發與操作手冊

給 AI 的環境建置交接指令

如果你是負責幫人類安裝 MCP 的 AI,請執行以下步驟:

  1. git clonenpm installnpm run build

  2. 請人類跑 npx tsx src/login.ts 並手動登入。

  3. 幫人類把 MCP 絕對路徑寫進設定檔。

  4. 讀取 AGENTS.md 了解操作劇本。

  5. 依據 AGENTS.md 引導人類建立 MY_PROFILE.md

工具列表 (MCP Tools)

job104_check_session

  • 功能:檢查登入狀態。

  • 時機:求職流程的最開頭,確保 Cookie 未過期。

  • 必填參數keyword (如:AI 全端工程師 Python)

  • 選填參數location (如:台北市)、page (預設 1)

  • 注意:AI 應在背景比對結果,只向人類展示 Top 3~5 筆。

job104_get_details

  • 必填參數job_url

  • 功能:獲取職位描述、條件要求與福利。草擬推薦信前必備。

job104_get_cover_letters

  • 選填參數job_url

  • 功能:讀取 104 帳號中儲存的所有自我推薦信(Cover Letter)範本,包含範本標題與完整內容。可作為 AI 客製化潤飾的基底。

job104_prepare_application (Hit-in-the-loop)

  • 必填參數job_url

  • 選填參數template_title (指定使用之範本名稱)、cover_letter_text (自訂推薦信內容)、dry_run (預設 false)

  • 注意:只會開啟投遞確認頁與代填推薦信。AI 執行後必須提醒人類:「請手動點擊確認送出」。

job104_search_companies

  • 必填參數keyword (公司名稱)

  • 選填參數pagepageSize

job104_get_company_detail

  • 必填參數companyInput (代碼或網址)

  • 功能:獲取公司福利、產品與開放職缺列表。

job104_save_job

  • 必填參數jobInput (代碼或網址)

  • 功能:將職缺加入 104 收藏。

job104_save_company

  • 必填參數companyInput (代碼或網址)

  • 功能:追蹤公司。

job104_reload_server

  • 功能:優雅重啟 MCP 伺服器以載入新編譯的代碼,避免進程鎖死或 stdio 管道中斷。


📁 專案結構

104-job-hunter-mcp/
├── src/
│   ├── index.ts          # MCP 主程式,工具註冊入口
│   ├── browser.ts        # Playwright 瀏覽器單例管理 (含 Stealth Plugin)
│   ├── login.ts          # 登入輔助腳本
│   ├── utils/
│   │   └── url.ts        # 職缺/公司 URL 與代碼解析模組
│   ├── __tests__/
│   │   └── url.test.ts   # URL 單元測試
│   └── tools/
│       ├── search.ts     # job104_search
│       ├── details.ts    # job104_get_details
│       ├── letters.ts    # job104_get_cover_letters
│       ├── apply.ts      # job104_prepare_application
│       ├── company.ts    # job104_search_companies, job104_get_company_detail
│       ├── save.ts       # job104_save_job, job104_save_company
│       └── session.ts    # job104_check_session
├── examples/
│   └── client.ts         # 本地測試客戶端範例
├── build/                # npm run build 輸出 (不進 git)
├── .chrome-profile/      # Cookie 儲存目錄 (不進 git)
├── AGENTS.md             # AI 操作劇本
├── MY_PROFILE.example.md # 虛擬分身範本
├── package.json
└── tsconfig.json

Available Tools

3 tools
job104_get_detailsA

取得單一職缺的詳細內容與條件要求

ParametersJSON Schema
NameRequiredDescriptionDefault
job_urlYes104 職缺頁面網址,格式如 https://www.104.com.tw/job/xxxxx

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must shoulder the burden of disclosing behavioral traits. It only states the tool's function and does not mention whether it is read-only, how errors are handled, any authentication needs, rate limits, or what the response contains beyond 'details and requirements'. The name 'get_details' implies a read operation, but the description does not confirm this or add behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that is front-loaded with the core purpose. It contains no fluff or redundant information, earning a top score for conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter retrieval tool with no output schema, the description adequately covers the essence: it retrieves detailed content and condition requirements for one job. It is complete enough for an agent to understand the tool's scope, though it could be enhanced by explicitly noting that the job_url must be valid or that the tool is read-only, but given its simplicity, a slight deduction is made.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully documents the one parameter (job_url) with a description and format example, achieving 100% schema description coverage. The tool description adds no additional parameter-level meaning. Per the baseline rule, with high schema coverage, a score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description '取得單一職缺的詳細內容與條件要求' clearly specifies the action (get) and resource (detailed content and conditions of a single job posting). It distinguishes this tool from siblings (job104_search for searching, job104_prepare_application for applying) by focusing on retrieving details for an already-known specific job, making the purpose unequivocal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used when you have a job URL and need detailed information for that single job. However, it does not explicitly state when to use this vs. the siblings, nor does it mention any exclusions or prerequisites beyond having a URL. Usage context is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

job104_prepare_applicationA

開啟應徵視窗並填入資訊。此工具僅作輔助,需人類最後確認送出。

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoDry run 模式:走完所有步驟但不點送出,並截圖回傳。預設為 false。
job_urlYes104 職缺頁面網址
cover_letter_textNo自傳或給公司的求職信內容

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses a critical behavioral trait: it does not submit automatically and requires human confirmation. However, with no annotations, it does not cover other safety aspects like authentication, reversibility, or side effects, and the description is relatively thin.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, one specifying the action and one specifying the human-in-the-loop caveat. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has a simple purpose and complete schema coverage. The description covers the core behavior and human confirmation requirement, but could mention return values or prerequisites. Overall, adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters have descriptions in the schema with 100% coverage, so the baseline applies. The description itself does not add any parameter semantics, but none are needed given the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool opens the application window and fills in information, specifying the action and resource. It does not explicitly differentiate from sibling tools, but siblings are search and get_details, so the purpose is distinct by name and context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description notes it is a helper that requires human final confirmation, implying it should be used as a step before manual submission. It does not explicitly state when to use it versus search or get_details, so guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv1.0.0
    • First observedjob104_get_details
    • First observedjob104_prepare_application
    • First observedjob104_search

TDQS

A4/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a distinct purpose: searching for jobs, retrieving details for a specific job, and preparing an application. There is no overlap in functionality, making it easy for an agent to select the correct tool.

Naming Consistency5/5

All tool names follow the same pattern: the 'job104_' prefix followed by an action verb ('search', 'get_details', 'prepare_application'). This consistent verb_noun style makes the toolset predictable and easy to navigate.

Tool Count5/5

With 3 tools, the server is well-scoped for its purpose. The tools map to the core job hunting workflow (search, view, apply) without unnecessary extras, fitting comfortably within the ideal 3-15 range.

Completeness5/5

The toolset covers the entire lifecycle from job discovery to application preparation, including a handoff to human confirmation. There are no obvious gaps that would prevent an agent from completing the core job hunting flow.

Maintenance

ActivityActive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for job search and application tracking, enabling AI agents to search jobs, get details, manage applications, and find contacts across 128K+ jobs and 1,900+ companies.
    537
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that enables AI-assisted job search workflows including job discovery, application tracking, resume evaluation, and cover letter generation, with support for multiple job sources and scheduled scraping.
    18
    1
    AGPL 3.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that exposes job-search and application-management capabilities to compatible AI clients, enabling discovery of vacancies, drafting of tailored application materials, and coordinated human-approved submissions.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    An MCP server that automates job applications by discovering postings from ATS boards, applying eligibility gates, scoring candidates, and drafting answers, while requiring human approval before submission. It respects anti-bot controls and only submits with explicit consent.
    22
    1
    MIT