Skip to main content
Glama
a7512cs

mcp-server-104

by a7512cs

mcp-server-104

台湾104人力銀行のMCPサーバー。Claude(または任意のMCPクライアント)が104のリアルタイム求人を直接検索できるようにします。

このツールはあなたに適していますか?

あなたの状況

最適なツール

たまに自分で仕事を探す

直接104のサイトを開く

使い捨てのクローラーを書いてデータを取得したい

Playwright / cycletls スクリプトで十分。MCPは不要

Claudeに求人の分析・比較・集約・自動化をさせたい

このMCP

Related MCP server: job-source-mcp

⚠️ 免責事項(先にお読みください)

  • 104には公開された公式APIはありません。本プロジェクトはWebフロントエンドの非公式内部エンドポイントを使用しており、104の仕様変更によりいつでも使えなくなる可能性があります。

  • 自動化アクセスは104の利用規約に違反する可能性があります。本プロジェクトは個人・低頻度・学習目的にのみ使用してください。

  • 高頻度の取得、大量クロール、公開サービスとしての提供はしないでください —— ブロックされやすく、法的リスクもあります。

  • 本プロジェクトには礼儀としてのスロットリング(各リクエスト間隔をランダムに1.5〜3.5秒)が組み込まれています。削除したり短縮したりしないでください。

  • 本プロジェクトの使用によって生じたいかなる結果も、利用者の自己責任です。

データ取得の方法

104の検索APIはCloudflareのbot対策の背後に隠されています。curlやNodeのfetch(Referer / User-Agentを付けても)ではブロックされます —— 403またはCloudflareの"Just a moment..."チャレンジページが返されます。

重要なのはヘッダーではなく、TLSフィンガープリントです。 CloudflareはTLSハンドシェイクのフィンガープリント(JA3)を検査します。一般的なプログラムのフィンガープリントはブラウザと明らかに異なるため、即座にブロックされます。

本プロジェクトは**cycletlsを使用してChromeのTLSフィンガープリントを偽装し、Cloudflareにリクエストが本物のブラウザからのものだと思わせて通過させます。これによりブラウザを起動する必要がなく**(Playwright / Seleniumより一桁軽量・高速・デプロイが容易)、純粋なHTTPで実際のJSONを取得できます。

cycletlsの内部はGoで書かれたTLSクライアントのサブプロセスで、サーバー起動時に一度起動し、全体で共有します。

現在の機能

Tool

状態

説明

search_jobs

✅ 実データ

キーワード+複数のフィルターで求人を検索、ページング対応

get_job_detail

✅ 実データ

単一求人の完全な詳細を取得:完全なJD、給与、場所、学歴・経験要件、スキル、言語能力、福利厚生、業種

get_company_jobs

✅ 実データ

特定企業の募集中の求人をすべて一覧表示(ページング対応)

search_jobs パラメータ

パラメータ

必須

説明

keyword

職務キーワード、例:Rust エンジニア

area

勤務地域名、例:台北市新竹(104公式の地域コードに自動変換して検索)

salaryMin

月給の下限(台湾ドル)、例:60000。給与が明らかにこれを下回るものは除外。面談はデフォルトで保持

excludeNegotiable

trueにすると「面談」の求人を除外。デフォルトはfalse

excludeFeatured

trueにすると104の有料広告求人(featured=trueのもの)を除外。デフォルトはfalse

jobCategory

職務カテゴリ名、例:ソフトウェアエンジニア(104公式の職種コードに自動変換して検索)

remote

リモート:full 完全リモート / partial 部分リモート / any すべて

jobType

雇用形態:fulltime フルタイム / parttime パートタイム

experience

必要経験年数:under-1y / 1-3y / 3-5y / 5-10y / over-10y

page

ページ番号(1ページ20件)、デフォルトは1。もっと見たい場合は次へ

limit

このページの返却件数の上限、最大20、デフォルトは5

フィルターパラメータの実装の細かい点(すべて104公式サイトUIの実際のリクエスト+metadata.totalの実測から得たもの):

  1. salaryMinscminsctp=Mscstrict=1を同時に送る必要があります。scstrictがないと給与フィルターは完全に無視されます。

  2. 「面談」の給与値は0で、104はデフォルトで保持します(面談は高額の可能性があるため)。excludeNegotiableで除外できます。

  3. 給与上限9,999,999は104の「上限なし」センチネル値で、サーバー側で「N元以上」に正規化されています。

  4. remoteWork=1完全/2部分、ro=1フルタイム/2パートタイム、jobexp=1/3/5/10/99(排他的な年功区分)。

  5. 地域・職種はツリー状コード表+枝刈りを使用:親ノード(例:「新竹県市」)にヒットしたら親コードを使用し、子コードに展開しない —— 展開しすぎると104が400を返します。

  6. 広告検出:104は結果の先頭に広告を挿入します(元のフィールドjobType=1)。これはキーワードを無視します(例:看護師の検索で「COACH 精品銷售」が出る)。各レコードにfeaturedフラグを付けてマークし、excludeFeatured=trueで一括除外できます。jobType=2(有料優先枠)はキーワードに一致するため、有効な結果としてマークしません。検索リストには意図的に完全なJDを含めていません(簡潔にし、モデルがリストを整理する際にURLを別のレコードに誤って対応付けるのを防ぐため)。完全な内容はget_job_detailを使用します。

フィールド命名は3つのツール間で一貫(すべて104の元のフィールドの意味に対応し、同名異物を避ける):

概念

search_jobs

get_job_detail

get_company_jobs

求人コード(slug、get_job_detailに渡せる)

jobId

jobId

jobId

求人URL

url

url

url

地域(区レベル)

area

area

area

完全な住所(区+通り)

location

必要経験年数

experience

experience

得意なツール・言語(C++、Linux)

skills

skills

職務スキル(職種レベル、例:「ソフトウェアシステム開発」)

jobSkills

会社ページURL(get_company_jobsに渡す)

companyUrl

companyUrl

広告枠かどうか(jobType=1

featured

jobIdは常にslug(例:7uqyj)で、104の内部番号ではありません —— slugのみget_job_detailに渡せます。skillsはどこでも「具体的な技術」を指します。

get_job_detail パラメータ

パラメータ

必須

説明

jobUrlOrId

求人URLまたはコード、例:https://www.104.com.tw/job/7uqyj または 7uqyjsearch_jobsが返すurlを使用)

get_company_jobs パラメータ

パラメータ

必須

説明

companyUrlOrId

会社URLまたはコード、例:https://www.104.com.tw/company/1a2x6blghh または 1a2x6blghh

page

ページ番号(1ページ20件)、デフォルトは1

limit

このページの返却件数の上限、最大20、デフォルトは10

3つのツールの連携方法

  • search_jobs / get_job_detailは各レコードでurl(求人)とcompanyUrl(会社)の2つのURLを返します。

  • 特定の求人の完全な内容を見たい場合 → そのurlget_job_detailに渡します。

  • 「この会社には他にどんな求人があるか」を見たい場合 → companyUrlget_company_jobsに渡します(これは指定した会社の求人リストであり、キーワード検索ではありません)。

search_jobs ─ url ──────→ get_job_detail
      │                        │
      └─ companyUrl ───────────┴──→ get_company_jobs

104内部APIリファレンス

主要エンドポイント:

GET https://www.104.com.tw/jobs/search/api/jobs

必要なヘッダー:Referer: https://www.104.com.tw/jobs/search/Accept-Language: zh-TW

よく使うクエリパラメータ(本プロジェクトでは現在一部のみ使用、残りは将来の拡張用):

パラメータ

意味

サンプル値

keyword

キーワード

自由テキスト

kwop

キーワード演算

7(すべて一致)

order

並び順

15 関連性(デフォルト) · 16 最新 · 13 給与

page / pagesize

ページング

pagesize は20を推奨

area

地域コード(カンマ区切り)

Area.jsonを参照(下記)

jobcat

職種コード(カンマ区切り)

JobCat.jsonを参照

scmin + scstrict=1

最低給与

整数

remoteWork

リモート

1 完全リモート · 2 部分 · 1,2 すべて(実測)

ro

フル/パート

1 フルタイム · 2 パートタイム(実測;wtの一部の値は400になるため不使用)

jobexp

経験年数

1/3/5/10/99 = 1年未満/1-3/3-5/5-10/10年以上(排他的区分、実測)

edu

学歴

4,5,6 大学以上 など

地域・職種コード表(static.104.com.twに配置、Cloudflareのブロックなし、通常のfetchで取得可能):

https://static.104.com.tw/category-tool/json/Area.json
https://static.104.com.tw/category-tool/json/JobCat.json

その他のエンドポイント:

  • 求人詳細:GET https://www.104.com.tw/job/ajax/content/{slug}(Refererは/job/{slug}を指す)

  • 会社の求人:GET https://www.104.com.tw/api/companies/{code}/jobs?page=1&pageSize=20list.topJobslist.normalJobsを返す)

ファイル構成

src/
  index.ts            進入點:建 server、掛 tool、接 stdio、處理關閉
  config.ts           所有設定 / 魔術數字(JA3 指紋、endpoint、節流區間…)
  types.ts            乾淨型別 + normalizeJob / JobDetail / CompanyJob(防腐層)
  query.ts            純函式:組查詢網址、解析 slug/公司碼、client 端過濾、enum 對照
  codes.ts            地區/職類「名稱→官方代碼」解析(樹狀比對+剪枝,快取代碼表)
  api/
    httpClient.ts     cycletls 單例(TLS 指紋偽裝)
    throttle.ts       禮貌性隨機節流 1.5~3.5s
    job104.ts         104 抓取層:組 URL → 打 API → 重試 → 正規化
  tools/
    searchJobs.ts     search_jobs
    getJobDetail.ts   get_job_detail
    getCompanyJobs.ts get_company_jobs
scripts/
  smoke-test.mjs      手動發 JSON-RPC 驗證,不用開 Claude 也能測
test/
  types.test.mjs      normalize 邏輯(薪資格式、面議、哨兵值…)
  query.test.mjs      組網址 / slug / 公司碼 / 過濾 / enum 對照
  codes.test.mjs      代碼表樹狀比對 + 剪枝

開発

npm run build                 # 編譯 src → dist
npm test                      # 跑單元測試(先 build 再 node --test,零額外依賴)
node scripts/smoke-test.mjs   # 煙霧測試(連真實 104)
npm run inspect               # 開 MCP Inspector GUI 除錯

テスト戦略:純粋なロジック(正規化、URL組み立て、フィルタリング)はすべてtypes.ts / query.tsに抽出し、Node組み込みのnode --testでテスト。高速でネットワーク不要 —— 壊したらすぐにわかります。ネットワークに触れる部分(job104.ts / httpClient.ts)はスモークテストで実際の104に対して検証します。

Claude Codeへの接続

claude mcp add job104 -- node /Users/marshall.wang/tomtom/my/app/104-mcp-server/dist/index.js

コードを変更したらnpm run buildを実行し、その後Claude Codeを再起動(または/mcpでreconnect)して反映させます。

必ず覚えておくべき2つの落とし穴

  1. stdoutはプロトコル専用パイプラインです。 stdioモードでconsole.logを使うとJSON-RPCメッセージを汚染し、即座に切断されます。ログは常にstderrに出力してください。

  2. descriptionはモデルが判断する唯一の根拠です。 モデルはこれを見てツールを呼ぶかどうかを決定します。きれいに書くことより、明確に書くことが重要です。

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables users to search LinkedIn's public job listings with advanced filters like location, salary, and experience level. It allows MCP-compatible clients to retrieve real-time job opportunities without requiring LinkedIn authentication or API keys.
    1
    2
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Searches 104 job listings with natural-language filters and retrieves full postings via MCP tools.
    3
    22
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables job search on LinkedIn through MCP tools, including keyword and location search, filtering by remote, easy apply, experience level, job type, and date, and retrieving job details.

View all related MCP servers

Related MCP Connectors

  • Search live startup jobs from Claude, Cursor, or ChatGPT via MCP. Free, no account needed.

  • Job search and interview prep MCP. 11 tools, OAuth 2.1, cross-LLM. four-leaf.ai.

  • Search remote and onsite jobs through the public Corvi Careers MCP server.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/a7512cs/104-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server