zangia.mn-ийн амьд ажлын байр хайлт, ATS CV тааруулалт, цалингийн жишиг — MCP сервер
Server has 4 tools with complete input schemas and descriptions. Naming follows verb_noun convention (search_jobs, get_job_details, match_candidate_cv, get_salary_benchmarks). Descriptions are detailed (100-250 chars) and explain context well. However, output schemas are not documented, responses are inferred from code inspection. Parameters lack enum constraints where applicable (category, district, experienceLevel). Error handling is minimal; no recovery guidance or actionable error messages visible. Tool composition is reasonable but match_candidate_cv lacks clarity on what 'match score' means operationally.
Retrieve job details by ID. Accepts local IDs (zangia-101) or live IDs/codes (zangia-live-<code> or bare code). Live details still come from list crawl metadata + job.url.
Retrieve salary benchmark statistics by job category, district, and experience level. Returns min/max/average salary ranges for market intelligence.
Evaluate candidate resume text against job listings to compute ATS percentage match scores and skill gap radar analytics.
Search live zangia.mn vacancies (+ local MCP DB). District is inferred from title keywords only; Unknown means not in title. Live list crawl has no real salary — use job.url for full posting. Downtown UB ≈ Sukhbaatar landmarks (Нарны зам, Зүүн дөрвөн зам, Сүхбаатар бизнес), not Сүхбаатар аймаг.
Output schemas not documented. Code shows responses are compact JSON objects, but LLMs cannot plan downstream calls without knowing return field names and types. E.g., search_jobs returns {id, title, company, district, ...} but this is inferred from code, not declared.
Category and district parameters accept free-form strings instead of enums. Code shows hardcoded categories (IT_TELECOM, BANKING_FINANCE, MINING_HEAVY_INDUSTRY) and districts (Sukhbaatar, Chingeltei, Khan-Uul) but these are not declared as enum constraints. LLMs will hallucinate invalid values.
match_candidate_cv description lacks clarity on what 'ATS percentage match' and 'skill gap radar' mean operationally. Does it return a single score or per-skill breakdowns? What does 40 (minMatchScore default) represent? LLMs cannot reason about the output without this.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
No error handling guidance visible. If a job ID is invalid, if CV text is empty, or if salary benchmarks have no data, what does the tool return? No recovery hints for LLMs.
search_jobs description mentions 'Live list crawl has no real salary' but minSalary parameter still accepts numbers. Behavior is confusing: does minSalary filter live jobs (which have salary=0) or only local mock jobs? Documentation should clarify the filtering logic.