Zero-dependency Bun MCP server for Australian job search (Adzuna index)
Three well-named, read-only tools with complete input schemas and clear descriptions. All tools follow verb_noun naming (search_jobs, job_market_stats, count_jobs). Descriptions are 150 - 250 chars, hitting the production baseline (p10=34, p90=392). All parameters have type definitions and descriptions. However, output schemas are NOT documented, the code shows formatJob() and data transformation but no explicit schema declaration for what the LLM receives. Error handling is minimal (only credential check and HTTP status). No pagination metadata (total count, next_cursor) documented in search_jobs output despite returning paginated results. Parameter descriptions lack format constraints (e.g., distance_km has no min/max stated, sort_by enum is present but not all params have enums where appropriate).
Count how many Australian ads match a query — a fast demand signal without pulling listings. Best for: comparing demand between roles, suburbs, or over time.
Aggregate Australian labour-market data for a search: salary histogram, top hiring employers, and historical salary trend. Best for: 'what does X actually pay', 'who is hiring for X', pricing your own rate.
Search Australian job listings (Adzuna index — includes SEEK-sourced ads). Returns titles, employers, locations, salaries and direct apply links. Best for: finding open roles by keyword and location.
Output schemas not documented. Code shows formatJob() and data transformation, but no explicit schema declaration for what the LLM receives (e.g., structure of results array, field types, pagination metadata). LLMs cannot plan downstream calls without knowing return structure.
Numeric parameters lack min/max constraints. distance_km, salary_min, max_days_old, page, and limit have no stated bounds in descriptions. LLMs may pass absurd values (negative distance, page 999999) that break the Adzuna API.
Error handling is minimal. Only credential check and HTTP status errors are caught. No guidance for LLM on recovery (e.g., 'No matches found, try broader keywords or larger distance_km'). Error messages do not categorize as retryable vs user-fixable.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Pagination metadata not documented. search_jobs returns paginated results but no explicit documentation of total count, page number, or next_cursor in output schema. LLMs cannot reliably iterate through large result sets.
Parameter descriptions lack format guidance. 'where' accepts 'Perth', 'Joondalup WA', 'Wanneroo' but no pattern or constraint stated. 'what_phrase' and 'what_exclude' have minimal guidance on quoting, escaping, or multi-word handling.