Skip to main content
Glama
tw-jobs-mcp

tw-jobs-mcp

by HsuanC0921

tw-jobs-mcp

English · 繁體中文

test PyPI License: MIT Python 3.11+

Search Taiwan job postings from any AI assistant. tw-jobs-mcp is a read-only MCP server that covers 104 人力銀行, Yourator, and the Taiwan openings on foreign companies' own career sites (Greenhouse, Lever, and 38 employers on Workday). Ask in plain Chinese or English; the assistant turns the request into precise filters.

No account and no API key are needed.

claude mcp add tw-jobs -s user -- uvx tw-jobs-mcp

Unofficial. Not affiliated with or endorsed by 104 or any other site it reads. It calls the same public endpoints the sites' own pages use. Keep the request rate low and follow each site's terms. No job data ships with this project.

What you can ask

Find .NET backend jobs in Taipei paying at least 50,000 a month, and tell me what the market pays.

I have two years of experience. Show remote backend postings in New Taipei, read the top three, and compare the companies.

Is this posting worth applying to? How many people applied, and what are their backgrounds?

Which foreign chip companies are hiring hardware engineers in Hsinchu?

Does this company have any data roles, even ones whose title does not say so?

Behind the scenes the assistant chains the tools. The output below is illustrative; companies and ids are made up.

search_jobs(keyword="後端工程師", keyword_en="backend engineer", area=["台北市"], salary_min=50000)
共 812 筆,第 1/41 頁
id|company_id|職稱|公司|薪資|地點|學歷|技能|刊登
a1b2c|x9y8z7|後端工程師 Backend Engineer|甲科技股份有限公司|月55000~80000|台北市信義區|大學~碩士|C#/.NET/MS SQL|10-18
d3e4f|w6v5u4|資深後端工程師|乙數位股份有限公司|月70000~100000|台北市內湖區|大學|Go/PostgreSQL/Docker|10-17
…

get_job("a1b2c", applicants=true)
後端工程師 Backend Engineer|甲科技股份有限公司|電腦軟體服務業 50人
…
HR:2 天內處理過履歷
應徵分析(近兩週):至少 12 人(由比例推算)
學歷:大學 66.7%、碩士 33.3%
年資:1~3年 41.7%、3~5年 33.3%、無工作經驗 25%
技能:C# 58.3%、MS SQL 41.7%、Docker 25%

Related MCP server: recruiting-jobs-mcp

Why this server

  • Reaches roles 104 does not have. Foreign companies often post Taiwan openings only on their own career sites. One search with source="all" covers 104, Yourator, Greenhouse and Lever boards (Appier, Stripe, MongoDB, Pinkoi and more), and Workday sites of chip, hardware, pharma and finance employers (NVIDIA, Micron, Applied Materials, KLA, Cisco, Intel, NXP, GSK and more). Results from every source are merged and ranked together.

  • Finds the posting you half remember. Results are reordered by how many of your words the title and company cover. On 40 test searches built from real postings, the intended one ranked first 35 times, against 18 with 104's own order.

  • Shows the competition. For a 104 posting, get_job(applicants=true) reports how many people applied in the last two weeks and how they break down by education, experience, age, major, language, skills and certificates. Every posting shows how recently the employer handled résumés, a fair hint of whether anyone reads applications.

  • Filters that really filter. Keyword, area, job category, salary floor (monthly, yearly, daily or hourly), years of experience, education, job type, remote, and posted in the last 7 days. Every filter was checked against the live site, and a source that cannot apply one says so under the results.

  • Made for capable models. Every allowed value is in the schema. The server instructions state principles, not long case lists. The server handles only what the model cannot see: it widens an ambiguous place name, turns an unmatched category into a keyword, and loosens filters one at a time when nothing matches. Each of these assumptions is listed under the results.

  • Light on context. Replies are compact tables, not JSON: 20 postings take about 2,000 characters, under a fifth of the same data as JSON. All six tool definitions together are under 3,000 characters. Long texts are clipped unless you ask for full.

  • Read-only and polite. It never logs in, applies or saves anything. It paces requests to each site (one per second on 104), caches responses for five minutes, and drops the two paid postings 104 pins to every page.

Install

Requires uv. These commands run the published package from PyPI. It is also listed in the official MCP Registry as io.github.HsuanC0921/tw-jobs-mcp.

Claude Code

claude mcp add tw-jobs -s user -- uvx tw-jobs-mcp

OpenAI Codex CLI

codex mcp add tw-jobs -- uvx tw-jobs-mcp

or in ~/.codex/config.toml:

[mcp_servers.tw-jobs]
command = "uvx"
args = ["tw-jobs-mcp"]
startup_timeout_sec = 60   # the first run downloads dependencies

Claude Desktop: download tw-jobs-mcp-<version>.mcpb from Releases and open it, or use the JSON below.

Gemini CLI, Cursor, Windsurf, Cline and other mcpServers clients: add to ~/.gemini/settings.json, ~/.cursor/mcp.json, Windsurf's mcp_config.json, or the client's equivalent:

{
  "mcpServers": {
    "tw-jobs": { "command": "uvx", "args": ["tw-jobs-mcp"] }
  }
}

VS Code (GitHub Copilot): .vscode/mcp.json uses servers and needs a type:

{
  "servers": {
    "tw-jobs": { "type": "stdio", "command": "uvx", "args": ["tw-jobs-mcp"] }
  }
}

Remote (HTTP) and Docker, for clients that connect by URL or a server shared by a team:

uvx tw-jobs-mcp --transport streamable-http --port 8000   # http://127.0.0.1:8000/mcp
docker build -t tw-jobs-mcp . && docker run --rm -p 8000:8000 tw-jobs-mcp

The HTTP server has no authentication. Keep it on localhost or a private network, or put an authenticating reverse proxy in front.

Unreleased code: uvx --from git+https://github.com/HsuanC0921/tw-jobs-mcp tw-jobs-mcp.

Agent skill

The server already tells a model how to use it. skills/tw-jobs gives agents that load skills more guidance: turning a request into arguments, picking a source, reading the notes, and reporting honestly. It follows the open Agent Skills format.

  • Claude Code: /plugin marketplace add HsuanC0921/tw-jobs-mcp, then /plugin install tw-jobs@tw-jobs-mcp (bundles the server and the skill). Or copy skills/tw-jobs to ~/.claude/skills/.

  • Codex and other skill-aware agents: copy skills/tw-jobs to ~/.agents/skills/.

Tools

Tool

What it does

search_jobs

Search postings. Returns a table: id, company_id, title, company, pay, location, education, skills, posted date.

get_job

The full posting: description, requirements, pay, hours, leave, welfare, and how recently HR handled résumés. 104 only: applicants=true adds the applicant count and background breakdown, similar=true adds similar postings.

get_company

Company profile. with_openings=true adds current openings; keyword lists only matching openings, and on 104 it also matches the job description.

salary_overview

Pay statistics (median, quartiles, min, max) over 1 to 5 pages of a 104 search, grouped by pay unit.

sources

Live check of which sources are reachable and which are blocked.

lookup_code

Find a 104 area or category code by name, or browse the tree.

search_jobs arguments, all optional:

Argument

Meaning

keyword, keyword_en

1 to 3 short terms. Chinese in keyword for 104, English in keyword_en for the foreign sites, each a translation of the other. The assistant fills both, so a Chinese request also finds foreign postings.

source

104 (default), yourator, boards, workday, or all

area, jobcat

Chinese names, e.g. ["台北市", "新北市"], ["軟體工程師"]

salary_min, salary_unit

Salary floor and its unit: 月薪 (default), 年薪, 日薪, 時薪

include_negotiable

With salary_min, also list postings that do not state a salary (104 leaves them out by default)

my_years

The user's years of experience; lists postings asking for no more, 經驗不拘 included

education

高中職, 專科, 大學, 碩士, 博士

job_type

全職, 兼職, 高階, 派遣

remote_only, new_only

Remote only; posted within 7 days

sort

relevance (default), newest, salary

page, per_page

Paging, up to 30 per page

Sources

source

Covers

Filters it applies

104

Taiwan's largest job board

all

yourator

Start-ups and foreign-company offices

keyword, area, sort=newest

boards

Taiwan roles on companies' Greenhouse and Lever boards

keyword, area, remote_only

workday

Taiwan roles at 38 foreign employers on Workday

keyword, area

all

All of the above, merged and ranked

per source; a failing source is noted, not fatal

Ids tell where a posting lives: a bare id is 104, y: Yourator, g: / l: Greenhouse / Lever, w: Workday. Pass them back as listed.

Add or remove career sites with TW_JOBS_BOARDS (g:gitlab,l:kraken,-g:stripe) and TW_JOBS_WORKDAY (acme.wd1/External,-micron); a leading - removes one. Each Workday search reads the first 60 rows per company, so narrow deep searches with a keyword.

Left out on purpose: 1111 (the same kind of board as 104, smaller), Cake (a Cloudflare challenge on every request) and LinkedIn (its terms forbid automated access).

Configuration

Variable

Default

Meaning

TW_JOBS_TRANSPORT

stdio

stdio or streamable-http (same as --transport)

TW_JOBS_HOST, TW_JOBS_PORT

127.0.0.1, 8000

Bind address for HTTP

TW_JOBS_CACHE_TTL

300

Seconds to keep responses; 0 turns the cache off

TW_JOBS_BOARDS, TW_JOBS_WORKDAY

built-in lists

Career sites to add or remove (see Sources)

TW_JOBS_FORMAT

text

json returns every field as compact JSON

How it works and its limits

104 sits behind Cloudflare, which answers ordinary HTTP clients with a 403. curl_cffi presents a real Chrome TLS fingerprint and gets through. Area and category names are resolved locally against 104's public code tables.

  • Read-only. No login, applying or bookmarking. Giving an AI your job-board password is not worth the risk.

  • No company-name search. 104 blocks that endpoint to scripts. Reach a company through the company_id on a posting, or put its name in keyword.

  • The applicant count is inferred. 104 publishes only percentages, so the count is the smallest number that fits them, a floor rather than an exact figure.

  • salary_overview samples the most relevant postings rather than the whole site, and many postings do not publish pay.

Development

uv sync
uv run pytest                  # offline unit and protocol tests
uv run pytest -m live          # against the real sites
uv run python scripts/update_codes.py   # refresh 104's area and category tables

License

MIT. Provided as is, without warranty.

Available Tools

6 tools
get_companyC
Read-onlyIdempotent

公司簡介。with_openings=True 附目前職缺;keyword 只列符合的職缺(104 連內文比對)。

NameRequiredDescriptionDefault
fullNo
keywordNo
company_idYes
with_openingsNo

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds real behavioral context the annotations don't: that keyword does full-text matching including job body text (104 連內文比對), which affects result volume. It says nothing about the `full` flag's behavioral effect.

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

Conciseness4/5

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

A single compact line that front-loads the resource and then attaches parameter semantics with semicolons. No filler; the only cost is that the terse phrasing borders on cryptic.

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

Completeness2/5

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

For a 4-parameter tool with no output schema and no parameter descriptions in the schema, the description leaves the `full` flag completely undefined and gives no indication of what the company profile response contains. An agent would have to guess at one parameter and cannot predict the return shape.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry the full parameter burden. It explains with_openings and keyword reasonably well, but `full` — one of four parameters — is never mentioned in either the schema or the description, leaving its effect entirely unknown.

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

Purpose3/5

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

"公司簡介" identifies the resource (company profile) but is a bare noun phrase with no verb, and it never states how this differs from get_job or search_jobs. The secondary clauses about openings hint at the capability but the core purpose statement is vague.

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?

It gives conditional guidance for two optional parameters (when to set with_openings, when to use keyword), which is more than nothing. But there is no statement of when to call this tool instead of the sibling job-search tools, and no explicit "don't use for X" guidance.

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

get_jobA
Read-onlyIdempotent

職缺完整內容,full=True 看全文。104 限定:applicants=近兩週應徵者人數與背景,similar=相似職缺。

NameRequiredDescriptionDefault
fullNo
job_idYes
similarNo
applicantsNo

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the description's job is to add semantics — and it does: it discloses that applicants data is scoped to the last two weeks and includes applicant background, and that both extra flags are restricted to 104-sourced data. It still omits what happens if a flag is requested on a non-104 job (error vs empty).

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

Conciseness4/5

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

Two dense clauses, zero filler, with the primary purpose and the full-text flag front-loaded. The telegraphic style (=, abbreviations) is efficient but slightly terse for non-Chinese-reading agents.

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

Completeness3/5

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

With no output schema, the description must frame the return payload; '職缺完整內容' gives a rough idea, but there is no indication of structure or size difference between full=True and default. The required job_id and the failure mode for restricted flags are the notable gaps for a four-parameter read tool.

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?

Schema description coverage is 0%, so the description must carry parameter meaning. It defines three of the four booleans (full, applicants, similar) with concrete semantics, including a time window for applicants, but says nothing about job_id — the one required parameter — such as its format or that it comes from search_jobs.

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?

States a specific verb+resource: retrieving the complete content of a job posting (職缺完整內容), and immediately clarifies the 'full' variant. It is implicitly distinguishable from search_jobs, but never names or contrasts any sibling, so it stops short of a 5.

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?

Says when to flip 'full' (full=True 看全文) and flags a hard constraint that applicants/similar only work on 104 data. However there is no guidance on when to use the applicants or similar flags versus calling search_jobs or get_company instead, leaving routing to inference.

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

lookup_codeA
Read-onlyIdempotent

查地區(area)或職類(jobcat)代碼。name 留空則列 parent 的下一層(parent 也空=最上層)。

NameRequiredDescriptionDefault
kindYes
nameNo
parentNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds the traversal behavior (empty name returns children of parent), which is genuine context beyond the annotations, but says nothing about output shape or result limits.

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 short, front-loaded sentences with zero filler; the primary purpose is stated first and the parameter behavior second. Nothing is redundant.

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

Completeness3/5

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

For a 3-parameter lookup with no output schema and 0% schema coverage, the description covers the parameter interplay but does not document the full set of valid kind values or what a returned code list looks like. Adequate but with visible gaps given the complete absence of structured parameter documentation.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must carry the load, and it does reasonably well: it implies kind takes 'area' or 'jobcat', and it explains the interaction between name and parent (empty name = list next level; empty parent = top level). It omits the default values and exact accepted kind strings, keeping it from a 5.

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 pairs a specific verb (查/look up) with a specific resource (地區 area codes, 職類 jobcat codes), so an agent understands this is a reference-code lookup tool. It does not, however, differentiate itself from siblings like search_jobs or get_job, so it stops short of a 5.

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 second sentence gives implied usage: empty name lists the next level under parent, and empty parent means top level. That tells the agent how to invoke it for hierarchy traversal, but there is no explicit when-to-use guidance or comparison against the sibling lookup/search tools.

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

salary_overviewA
Read-onlyIdempotent

薪資行情:取前 pages(1~5)頁有公開薪資的職缺,依單位統計筆數、最低、四分位、中位、最高。 參數同 search_jobs。樣本統計,非全站。

NameRequiredDescriptionDefault
areaNo
pagesNo
jobcatNo
keywordNo
job_typeNo
my_yearsNo
new_onlyNo
educationNo
remote_onlyNo

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), so the bar is lower. The description adds two genuinely useful behavioral facts beyond annotations: the pages 1~5 window and the caveat that these are sample statistics, not the whole site (非全站), which materially affects how results should be interpreted.

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?

Three compact clauses: what it returns, where to find parameter docs, and the sampling caveat. Front-loaded with the resource and scope, no filler.

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

Completeness3/5

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

For a read-only aggregate tool with no output schema, the description does state the returned statistics (count/min/quartile/median/max) and the sample-vs-full-site limitation, which is solid. But with 9 undocumented parameters and only a pointer to a sibling tool, an agent cannot confidently supply filter arguments.

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

Parameters2/5

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

Schema description coverage is 0% across 9 parameters, so the description must carry the burden. It clarifies only the pages range (1~5) and otherwise defers with '參數同 search_jobs', leaving area, jobcat, keyword, job_type, my_years, new_only, education and remote_only entirely undocumented in either schema or description, and requiring cross-tool inference.

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 states a specific verb+resource: it fetches the first pages of job listings that publish salary and computes per-unit statistics (count, min, quartile, median, max). This clearly distinguishes it from search_jobs (raw listings) and get_job (single posting). It is not quite a 5 because the '依單位' grouping key is left implicit.

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 use case (aggregate salary stats rather than raw job results) and notes '參數同 search_jobs', routing the agent to that sibling for parameter knowledge. However it never states explicitly when to prefer this over search_jobs or any when-not condition.

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

search_jobsA
Read-onlyIdempotent

搜尋職缺,回傳表格(id 給 get_job,company_id 給 get_company)。 keyword 中文(給 104)、keyword_en 英文(給其他來源),互為翻譯;只填一個時兩邊共用。 非 104 來源只支援 keyword、area(yourator 另有 sort=newest,boards 另有 remote_only),其餘條件會在註記說明未套用。 area/jobcat 填中文名稱(台北市、軟體工程師)。salary_min 的單位是 salary_unit,104 預設不含面議,include_negotiable=True 才納入。 my_years=使用者的年資,列出要求不超過它的(含經驗不拘)。per_page≤30,用 page 翻頁。

NameRequiredDescriptionDefault
areaNo
pageNo
sortNorelevance
jobcatNo
sourceNo104
keywordNo
job_typeNo
my_yearsNo
new_onlyNo
per_pageNo
educationNo
keyword_enNo
salary_minNo
remote_onlyNo
salary_unitNo月薪
include_negotiableNo

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent/open-world, and the description adds critical non-obvious behavior: filters other than keyword/area are silently dropped for non-104 sources, 104 excludes 面議 postings unless include_negotiable=True, and per_page is capped at 30 with page-based pagination. These are traps an agent would otherwise fall into.

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

Conciseness4/5

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

Purpose and return shape are front-loaded in the first line, and every subsequent line adds concrete constraint information with no filler. The one drawback is density: parameter rules are packed into a continuous stream without line-level labels, which slows scanning for a 16-parameter tool.

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 16-param tool with no output schema and zero schema descriptions, the description covers the highest-risk areas (source-specific filter support, salary unit, experience matching, pagination) and states the return is a table. It falls short by leaving job_type, new_only, education, and sort partially or wholly unexplained.

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

Parameters4/5

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

Schema coverage is 0%, so the description carries the full burden; it explains keyword/keyword_en interplay, Chinese-name conventions for area/jobcat, the salary_min↔salary_unit coupling, include_negotiable, my_years, and pagination limits. However job_type, new_only, education, and the full semantics of the sort enum are never mentioned, leaving four parameters undocumented anywhere.

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?

States a specific verb and resource ('搜尋職缺,回傳表格') and immediately clarifies the return shape plus downstream routing (id → get_job, company_id → get_company). It distinguishes itself from the detail-fetching siblings but never clarifies its relationship to salary_overview or sources, so sibling differentiation is incomplete.

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

Usage Guidelines5/5

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

Gives explicit routing rules: keyword is Chinese for 104, keyword_en is English for other sources, and when only one is supplied both are shared. It also documents which filters are honored per source (yourator → sort=newest, boards → remote_only) and that unsupported conditions are not silently applied, which is exactly the when-to-use/when-not-to-use guidance an agent needs.

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

sourcesA
Read-onlyIdempotent

即時檢查 104、Yourator 與各外商職缺板目前哪些連得上,哪些被擋。

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety and network-dependence profile is covered. The description adds value by naming the specific external boards probed and implying a reachable/blocked result shape, but it says nothing about timing, rate limits, or caching behavior.

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?

A single sentence with no filler that front-loads the action (即時檢查) and then the resources inspected. Every clause carries information.

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 parameterless probe with no output schema, the description conveys what is examined and the binary outcome (reachable vs. blocked). It leaves the exact result format unspecified, but that is a minor gap for a tool this simple.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. There are no parameters whose meaning the description would need to clarify.

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 names a concrete verb (即時檢查 / check in real time) and a concrete resource (reachability of 104, Yourator, and foreign job boards). It is unambiguous what the tool does despite the vague tool name 'sources'. It does not, however, explicitly distinguish itself from siblings like search_jobs, which is why it falls short of a 5.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance, no prerequisites, and no mention of alternatives. An agent can infer this is a health/probe check to run before searching, but nothing in the text states that or excludes any scenario.

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.2.1
    • Changedget_company1 field changed
      • addedInput schema / properties / keyword
        Added value: +{
        +  "default": "",
        +  "type": "string"
        +}
    • Changedget_job2 fields changed
      • addedInput schema / properties / applicants
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / similar
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Changedsearch_jobs1 field changed
      • addedInput schema / properties / include_negotiable
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
  2. 2 tool updatesv1.1.2
    • Changedsalary_overview2 fields changed
      • addedInput schema / properties / education / enum
        Added value: +[
        +  "高中職",
        +  "專科",
        +  "大學",
        +  "碩士",
        +  "博士"
        +]
      • addedInput schema / properties / job_type / enum
        Added value: +[
        +  "全職",
        +  "兼職",
        +  "高階",
        +  "派遣"
        +]
    • Changedsearch_jobs7 fields changed
      • addedInput schema / properties / education / enum
        Added value: +[
        +  "高中職",
        +  "專科",
        +  "大學",
        +  "碩士",
        +  "博士"
        +]
      • addedInput schema / properties / job_type / enum
        Added value: +[
        +  "全職",
        +  "兼職",
        +  "高階",
        +  "派遣"
        +]
      • addedInput schema / properties / keyword_en
        Added value: +{
        +  "default": "",
        +  "type": "string"
        +}
      • addedInput schema / properties / salary_unit / enum
        Added value: +[
        +  "月薪",
        +  "年薪",
        +  "日薪",
        +  "時薪"
        +]
      • addedInput schema / properties / sort / enum
        Added value: +[
        +  "relevance",
        +  "newest",
        +  "salary"
        +]
      • addedInput schema / properties / source / enum
        Added value: +[
        +  "104",
        +  "yourator",
        +  "boards",
        +  "workday",
        +  "all"
        +]
      • removedInput schema / properties / with_sponsored
        Removed value: -{
        -  "default": false,
        -  "type": "boolean"
        -}
  3. 6 tool updatesv1.1.0
    • First observedget_company
    • First observedget_job
    • First observedlookup_code
    • First observedsalary_overview
    • First observedsearch_jobs
    • First observedsources

TDQS

A3.7/5.0

Scored across 6 tools

Disambiguation5/5

Each of the six tools has a clearly distinct purpose: job search, job detail, company profile, code lookup, salary aggregation, and source availability. Although salary_overview shares some parameters with search_jobs, its statistical/aggregate role is clearly differentiated. An agent can select tools without meaningful ambiguity.

Naming Consistency4/5

The tools consistently use snake_case and mostly follow a verb_noun or noun_phrase pattern such as get_company, lookup_code, and search_jobs. Minor deviations are the bare noun 'sources' and noun_phrase 'salary_overview', but the set remains predictable.

Tool Count5/5

Six tools is well scoped for a job-search aggregation server. Each tool covers a distinct part of the workflow: searching, inspecting jobs and companies, decoding filters, summarizing salaries, and checking source availability.

Completeness4/5

The surface covers the core read-only job-search lifecycle: discovery, detail retrieval, company context, filter code lookup, salary insight, and source health. It lacks application/save/favorite operations and explicit company-level search, but those are reasonable omissions for an aggregation MCP.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to pull live job listings from major ATS platforms (Greenhouse, Lever, Ashby, Workable), Hacker News hiring threads, and detect hiring signals on company career pages.
    -
  • A
    license
    A
    quality
    A
    maintenance
    Enables natural-language search and retrieval of Taiwan 104 job bank listings, including job details and company-specific openings, with filters for location, salary, experience, and remote work through an MCP interface.
    5
    36 npm
    8
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables searching live job postings pulled directly from 10 applicant-tracking-system APIs — including Greenhouse, Lever, Ashby, Workday, Personio, Recruitee, Teamtailor, Workable, SmartRecruiters and Breezy HR — using just a company website, domain or ATS handle, with filters for keywords, location, remote work and posting date. Also supports multi-company lookups, ATS detection, and stateless "only new since last call" monitoring for scheduled agents.
    MIT