tw-jobs-mcp
A read-only MCP server for searching Taiwan job boards and fetching job, company, salary, source, and code information.
Search jobs across 104, Yourator, Greenhouse/Lever boards, and Workday (or all) with filters for keyword (Chinese/English), area, job category, salary floor/unit, education, years of experience, job type, remote-only, new-only, sort, and paging.
Get full job details by id, including description, requirements, skills, salary, hours, vacation, business trip, and welfare; optional full text.
Get company profiles by company_id, optionally with current openings and full text.
Get salary market statistics (median, quartiles, min, max, count) over sampled postings, grouped by pay unit.
Check live reachability of each source (104, Yourator, career boards).
Look up or browse area and job category codes by Chinese name or parent.
Chain results: search returns id and company_id for follow-up job/company lookups.
Read-only with no account/API key; unsupported filters are noted, and responses are cached/rate-limited.
Searches Binance's own career board for Taiwan job postings as part of the built-in career-board sources.
Searches Canonical's own career board for Taiwan job postings as part of the built-in list of career boards.
Can search GitLab's own career board for Taiwan job postings when added via the TW_JOBS_BOARDS configuration.
Searches Taiwan job postings hosted on companies' own Greenhouse career boards, surfacing roles that foreign companies post on their own sites rather than on local job boards.
Searches MongoDB's own career board for Taiwan job postings as part of the built-in career-board sources.
Searches Stripe's own career board for Taiwan job postings; boards can also be added or removed via the TW_JOBS_BOARDS setting.
Searches Ubiquiti's own career board for Taiwan job postings as part of the built-in career-board sources.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tw-jobs-mcp幫我找台北市的軟體工程師職缺,月薪6萬以上、七天內刊登的"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
tw-jobs-mcp
English · 繁體中文
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-mcpUnofficial. 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-mcpOpenAI Codex CLI
codex mcp add tw-jobs -- uvx tw-jobs-mcpor in ~/.codex/config.toml:
[mcp_servers.tw-jobs]
command = "uvx"
args = ["tw-jobs-mcp"]
startup_timeout_sec = 60 # the first run downloads dependenciesClaude 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-mcpThe 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 copyskills/tw-jobsto~/.claude/skills/.Codex and other skill-aware agents: copy
skills/tw-jobsto~/.agents/skills/.
Tools
Tool | What it does |
| Search postings. Returns a table: |
| The full posting: description, requirements, pay, hours, leave, welfare, and how recently HR handled résumés. 104 only: |
| Company profile. |
| Pay statistics (median, quartiles, min, max) over 1 to 5 pages of a 104 search, grouped by pay unit. |
| Live check of which sources are reachable and which are blocked. |
| Find a 104 area or category code by name, or browse the tree. |
search_jobs arguments, all optional:
Argument | Meaning |
| 1 to 3 short terms. Chinese in |
|
|
| Chinese names, e.g. |
| Salary floor and its unit: |
| With |
| The user's years of experience; lists postings asking for no more, 經驗不拘 included |
|
|
|
|
| Remote only; posted within 7 days |
|
|
| Paging, up to 30 per page |
Sources
| Covers | Filters it applies |
| Taiwan's largest job board | all |
| Start-ups and foreign-company offices |
|
| Taiwan roles on companies' Greenhouse and Lever boards |
|
| Taiwan roles at 38 foreign employers on Workday |
|
| 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 |
|
|
|
|
| Bind address for HTTP |
|
| Seconds to keep responses; |
| built-in lists | Career sites to add or remove (see Sources) |
|
|
|
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_idon a posting, or put its name inkeyword.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_overviewsamples 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 tablesLicense
MIT. Provided as is, without warranty.
Available Tools
6 toolsget_companyCRead-onlyIdempotent
公司簡介。with_openings=True 附目前職缺;keyword 只列符合的職缺(104 連內文比對)。
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | ||
| keyword | No | ||
| company_id | Yes | ||
| with_openings | No |
TDQS
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.
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.
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.
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.
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.
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_jobARead-onlyIdempotent
職缺完整內容,full=True 看全文。104 限定:applicants=近兩週應徵者人數與背景,similar=相似職缺。
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | ||
| job_id | Yes | ||
| similar | No | ||
| applicants | No |
TDQS
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.
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.
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.
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.
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.
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_codeARead-onlyIdempotent
查地區(area)或職類(jobcat)代碼。name 留空則列 parent 的下一層(parent 也空=最上層)。
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| name | No | ||
| parent | No |
TDQS
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.
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.
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.
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.
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.
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_overviewARead-onlyIdempotent
薪資行情:取前 pages(1~5)頁有公開薪資的職缺,依單位統計筆數、最低、四分位、中位、最高。 參數同 search_jobs。樣本統計,非全站。
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | ||
| pages | No | ||
| jobcat | No | ||
| keyword | No | ||
| job_type | No | ||
| my_years | No | ||
| new_only | No | ||
| education | No | ||
| remote_only | No |
TDQS
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.
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.
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.
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.
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.
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_jobsARead-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 翻頁。
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | ||
| page | No | ||
| sort | No | relevance | |
| jobcat | No | ||
| source | No | 104 | |
| keyword | No | ||
| job_type | No | ||
| my_years | No | ||
| new_only | No | ||
| per_page | No | ||
| education | No | ||
| keyword_en | No | ||
| salary_min | No | ||
| remote_only | No | ||
| salary_unit | No | 月薪 | |
| include_negotiable | No |
TDQS
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.
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.
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.
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.
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.
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.
sourcesARead-onlyIdempotent
即時檢查 104、Yourator 與各外商職缺板目前哪些連得上,哪些被擋。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
v1.2.1- Changed
get_company1 field changed- added
Input schema / properties / keywordAdded value: +{ + "default": "", + "type": "string" +}
- Changed
get_job2 fields changed- added
Input schema / properties / applicantsAdded value: +{ + "default": false, + "type": "boolean" +} - added
Input schema / properties / similarAdded value: +{ + "default": false, + "type": "boolean" +}
- Changed
search_jobs1 field changed- added
Input schema / properties / include_negotiableAdded value: +{ + "default": false, + "type": "boolean" +}
2 tool updates
v1.1.2- Changed
salary_overview2 fields changed- added
Input schema / properties / education / enumAdded value: +[ + "高中職", + "專科", + "大學", + "碩士", + "博士" +] - added
Input schema / properties / job_type / enumAdded value: +[ + "全職", + "兼職", + "高階", + "派遣" +]
- Changed
search_jobs7 fields changed- added
Input schema / properties / education / enumAdded value: +[ + "高中職", + "專科", + "大學", + "碩士", + "博士" +] - added
Input schema / properties / job_type / enumAdded value: +[ + "全職", + "兼職", + "高階", + "派遣" +] - added
Input schema / properties / keyword_enAdded value: +{ + "default": "", + "type": "string" +} - added
Input schema / properties / salary_unit / enumAdded value: +[ + "月薪", + "年薪", + "日薪", + "時薪" +] - added
Input schema / properties / sort / enumAdded value: +[ + "relevance", + "newest", + "salary" +] - added
Input schema / properties / source / enumAdded value: +[ + "104", + "yourator", + "boards", + "workday", + "all" +] - removed
Input schema / properties / with_sponsoredRemoved value: -{ - "default": false, - "type": "boolean" -}
6 tool updates
v1.1.0- First observed
get_company - First observed
get_job - First observed
lookup_code - First observed
salary_overview - First observed
search_jobs - First observed
sources
TDQS
Scored across 6 tools
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.
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.
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.
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
Related MCP Connectors
Search AI-native jobs, inspect application forms, and fetch free interview-prep resources.
Search job postings, companies, and technology stacks across 10M+ companies.
Search ~1.4M open jobs from 24k company career boards: Greenhouse, Lever, Ashby, Workday and more
Job search for your AI: save jobs, research companies, keep stories, track applications.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceSearches job listings from Taiwanese job boards (104 and Yourator) and returns normalized results.MIT
- FlicenseNot gradedqualityCmaintenanceEnables 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.-
- AlicenseAqualityAmaintenanceEnables 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.536 npm8MIT
- AlicenseNot gradedqualityBmaintenanceEnables 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