Unofficial MCP server for 104.com.tw (Taiwan job board): search jobs, job details, company openings, applicant analysis
Server has 5 well-named tools with detailed descriptions (194 - 400+ chars, well above baseline 194 avg). All tools have input schemas with type definitions and parameter descriptions. Tool names follow verb_noun pattern (search_jobs, get_job_detail, find_company, get_company_jobs, get_apply_analysis). Descriptions are comprehensive and include usage guidance, constraints, and warnings. However, output schemas are not explicitly documented in code, responses are JSON-stringified without formal schema declarations. Error handling is present but generic ('104 可能改版或被 Cloudflare 阻擋'). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools being read-only. Parameter descriptions are detailed and include examples, enums, and constraints (e.g., remote: [full|partial|any], experience levels, sort options). Pagination is well-designed with limit/page parameters and clear guidance on window sizes.
用公司名稱找 104 上的公司,回傳公司名片:companyId(公司代碼,可直接餵給 get_company_jobs)、全名、公司頁網址、產業、地區、員工數、資本額、在徵職缺數。比對是模糊的:英文別名(如 MediaTek)也找得到中文本尊,但 total 含「簡介提及」的公司會偏大。唯一命中或名稱完全相符 → 回單一 company;多家符合 → 回 candidates 候選清單,此時請向使用者確認是哪一家(用產業/地區/在徵職缺數分辨),不要自行猜選。「某公司有沒有某類職缺」的標準流程:find_company 拿 companyId → get_company_jobs 帶 keyword。
取得單筆 104 職缺的應徵者分析:兩週內不重複應徵人數(total,真實數字 —— 職缺頁與 search_jobs 的 applyRange 只有區間)與應徵者組成:性別、學歷、年齡、年資、語言(含程度)、科系、技能、證照。⚠️ 只在使用者明確要求「這個職缺的應徵者/應徵人數/競爭狀況」時才呼叫;搜尋職缺、看職缺詳情、列公司職缺時不要主動呼叫,也不要為了順便比較競爭度而對多筆職缺批次呼叫。科系/技能/證照只回前 10 名,count 加總不等於 total。資料由 104 每日更新一次(updateTime)。傳入 search_jobs / get_company_jobs 回傳的 url 或 jobId。
列出「某一家指定公司」在 104 上在徵的職缺(職稱、地區、薪資、學經歷要求、網址),可分頁。公司用 find_company 回傳的 companyId,或 search_jobs / get_job_detail 回傳的 companyUrl。帶 keyword 可在這家公司內搜職缺(比對職稱與 JD 內文,含「其他條件」欄 —— 「某公司有沒有 C++」這種問題用它,別自己翻頁過濾職稱)。⚠️ keyword 多字詞是 OR 不是 AND,要同時符合請分次搜再交集。要完整翻頁,limit 請直接用檔位值本身(20、50 或 100)且全程不變 —— 非檔位值的 limit 會截掉每個窗口的尾端且下一頁不補回。置頂職缺(pinned=true)只在第 1 頁回、不佔 limit 名額;total 不含置頂。
取得單筆 104 職缺的完整詳情:完整職務說明、薪資、地點、學經歷要求、需求技能、語言能力、福利、產業別。傳入 search_jobs 結果中的職缺網址(url 欄位)。
依關鍵字 + 篩選條件搜尋 104 職缺。回傳職缺清單(職稱、公司、地區、薪資、學經歷要求、網址),可分頁。地區同名多處(如「信義區」= 台北+基隆)時回確認訊息;關鍵字被 104 判定為公司名時回提示(不硬搜,避免混入代理商)。
Output schemas not formally documented. Tools return JSON.stringify(result) without declaring response structure. LLMs cannot plan downstream calls or extract fields reliably.
No tool annotations despite all tools being read-only. Missing readOnlyHint declarations would help agents understand safety and retry semantics.
Error messages are generic and do not guide recovery. 'get_apply_analysis' returns '104 可能改版或被 Cloudflare 阻擋,稍後再試' without suggesting alternative actions or retry strategies.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Parameter descriptions include example values (e.g., 'Rust 工程師', '台北市') which LLMs may reuse literally. Use enums and format constraints instead.
get_apply_analysis includes explicit guidance not to call it in loops, but this is a usage pattern constraint that should be enforced via tool design (e.g., rate limiting or per-request cost metadata) rather than relying on LLM compliance.