Orchestrates a complete job search pipeline: extracts skills from CV using Lightcast API, searches jobs via Adzuna API, geocodes locations, and renders results on a map
This STDIO-only Job Search Agent presents three tools for CV skill extraction and job searching. All tools have descriptions and input schemas present in the source code. However, several patterns are either poorly implemented or missing. Tool naming follows verb-noun convention (extract_skills_from_cv, search_jobs_by_skills, search_jobs_complete), which is appropriate. Descriptions are verbose (200-400+ characters each) and contain actionable context about when/how to call tools, aligning with pattern:tool-description guidance. Input schemas are declared with types (string, number) and individual parameter descriptions are provided. However, output schemas are not documented, no description of what extract_skills_from_cv, search_jobs_by_skills, or search_jobs_complete actually return. Error handling guidance is minimal; no recovery hints or categorization (retryable vs fatal). Parameter validation rules are not explicit (e.g., confidence_threshold is 0.0-1.0, but no min/max constraints in the schema). The server lacks tool annotations (readOnlyHint, destructiveHint, idempotentHint), structured output documentation, and pagination for results. Tool composition is reasonable (each tool has one responsibility), but idempotency is not declared. Secrets (LIGHTCAST_CLIENT_ID, LIGHTCAST_CLIENT_SECRET) are properly injected via environment variables, not exposed as parameters, good security practice. Overall, the server shows moderate effort in descriptions but falls short on output schemas, error guidance, and protocol features.
Extract professional skills from a CV using the Lightcast Skills API. IMPORTANT — always call this tool when the user shares a CV, even if you can already read the CV content in the conversation. Never extract skills manually from the text: always delegate to this tool so that Lightcast performs the semantic analysis. Use this as the FIRST step in any CV analysis workflow. If the user also asked to search for a job, immediately call "search_jobs_by_skills" right after receiving the skills from this tool. How to provide the CV content (choose ONE): - cv_text : pass the full CV text directly (preferred when the user has shared the file or pasted the text in the chat). - cv_filename : name of a .txt file already saved in the /info folder (e.g. "cv.txt"). Use this only when no text is available in the conversation.
PRIMARY job search tool. Always call this FIRST when asked to search for a job. Searches Adzuna using the candidate's most distinctive skills as keywords. How to build the query from a CV skill list: - `what` -> pick the SINGLE most important/distinctive skill (e.g. "Python", "React", "Machine Learning", "Kubernetes"). ONE keyword only. Adzuna requires this in every result. Do NOT use generic terms like "programming" or "development". - `what_or` -> pick 2-4 complementary skills, space-separated (e.g. "SQL PostgreSQL MongoDB"). At least one of these must appear in the result. Do NOT paste the full CV skill list here. When to use this tool: - Always use saerch_jobs_by_skills as the first job search step after extracting CV skills.
Complete job search pipeline orchestrating multiple servers and APIs
Output schemas not documented for any tool. LLMs cannot plan downstream calls or extract chaining IDs without knowing what extract_skills_from_cv, search_jobs_by_skills, or search_jobs_complete return. Forces agent to guess field names.
search_jobs_complete tool description is generic ('Complete job search pipeline orchestrating multiple servers and APIs') and does not explain what it does, when to use it instead of calling extract_skills_from_cv + search_jobs_by_skills sequentially, or what parameters it requires. Violates pattern:tool-description.
Input schemas lack min/max constraints. confidence_threshold is described as 0.0-1.0 but no minimum/maximum in schema definition. Without constraints, LLM may pass invalid values (e.g., 1.5, -0.1). Allows invalid input.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 48 | <=2025-11-25 | v2 |
| 2026-03-09 | D | 50 | - | v1 |
No error handling or recovery guidance in tool descriptions. If Lightcast API returns 401 (auth failure), what should agent do? If no skills extracted, should agent retry with lower confidence_threshold? No hints provided.
Tool annotations missing. No readOnlyHint, destructiveHint, or idempotentHint declared. All three tools are read-only (no state modification), but this is not signaled to the agent via annotations.
No pagination parameters or result limits documented. If Lightcast returns 500+ skills or Adzuna returns 1000+ jobs, response may exceed context window. No limit parameter or pagination guidance in descriptions.
search_jobs_by_skills tool description includes complex multi-line instructions (how to format 'what' and 'what_or' parameters). These should be parameter descriptions, not tool description. Tool description is bloated; parameter descriptions should guide LLM input formatting.