ResumeQuick
Server Details
Your job search in one place: resumes, the jobs you track, daily matches, interviews, next step.
- Status
- Healthy
- Uptime
- 22.4% over 75 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- resumequick/resumequick-mcp
- GitHub Stars
- 0
TDQS
Scored across 75 tools
Most tools target distinct resources, and the very detailed descriptions explicitly disambiguate close pairs such as analyze_vacancy vs analyze_tracked_vacancy vs analyze_radar_match. However, the sheer number of similar-sounding tools—multiple radar match actions, several resume suggestion/version/link tools, and overlapping vacancy listing tools—creates real selection risk.
The set overwhelmingly follows a snake_case verb_noun convention (create_reminder, archive_vacancy, get_resume_history). There are minor irregularities such as create_reminders vs create_reminder, upsert_career_memory, and set_vacancy_suggestion_declined, but nothing chaotic.
75 tools is far beyond a manageable surface for this domain, even a broad job-search assistant. The feature areas are legitimate, but the count suggests many actions could be consolidated into fewer resource-oriented tools.
Coverage is broad across resumes, vacancy tracking, radar, offers, reminders, career memory, coaching, and account usage. There are some gaps, notably mock interviews appear only as read/archive/delete rather than start/answer flows, and offer archiving is implied but not exposed.
Available Tools
75 toolsadd_career_factRemember a career factAInspect
Remember a single durable career fact about the user (e.g. 'Led a 5-person backend team', 'Wants to move into management'). Append-only. Vacancy analysis reads the 15 newest facts for where the user lives or can work, the work model they accept and their work authorization; the same preferences as structured fields are locations, remote_preference and work_authorization in upsert_career_memory. Returns the new fact_id. Returns 'invalid_payload' if the fact is empty or over 500 characters.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | Yes | The stored fact, verbatim. |
| fact_id | Yes | Id of the newly stored fact. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), and the description adds real value: append-only behavior, the 15-fact read window used by vacancy analysis, the return value (fact_id), and the 'invalid_payload' error condition with its 500-char limit. It doesn't cover auth requirements or explicit rate limits, but the behavioral disclosure is strong.
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?
Front-loads purpose, then scope, then error semantics in a compact few sentences. The long enumeration of sibling field names is slightly dense but earns its place by clarifying the boundary with upsert_career_memory.
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?
An output schema exists, so the description needn't restate return structure, yet it still names the returned fact_id and the error case. Combined with the append-only semantics and the downstream read window, the description is complete for an agent to call this correctly.
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% for the single nested fact parameter, so the description must compensate and largely does, explaining the 1..500 character constraint and giving example facts. It doesn't fully specify the nested 'input' object shape, but the single meaningful field is well covered.
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 ('Remember a single durable career fact about the user') and immediately grounds it with concrete examples. The append-only scope and contrast with the sibling upsert_career_memory makes the boundary clear.
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?
Explains the append-only semantics and that vacancy analysis reads the 15 newest facts, and it points to upsert_career_memory for structured-field equivalents. It does not spell out when to prefer this over upsert_career_memory beyond the structured-vs-durable distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_offerAnalyze a job offerAInspect
Analyse a job offer the user received and draft the negotiation scripts. Takes the offer text exactly as they got it — the recruiter's email, message or their own notes; the numbers are extracted from that wording, so a retold or summarised version loses them. Runs asynchronously: this returns an offer_id immediately, and get_offer(offer_id) shows the verdict, the market comparison and the counter-offer email once done. vacancy_id links the offer to a tracked vacancy. The market is read for where the user lives and how they are hired: pass candidate_country, employer_country and employment_type when the user said them; a left-out country is taken from their profile. Counts as one offer analysis against the user's plan — the free plan allows one a month. Returns 'limit_exceeded' when the quota is spent, 'no_resume' when the user has no resume to compare against, 'draft_limit_reached' when too many offers are waiting to be finished, 'not_found' for a foreign vacancy_id, and 'invalid_payload' for empty or oversized text.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | Always 'processing' — the analysis runs asynchronously. |
| task_id | Yes | Background task id (informational; get_offer shows progress). |
| offer_id | Yes | Id of the created offer; pass to get_offer once ready. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, destructive=false, idempotent=false; the description goes well beyond that with async semantics, the offer_id/get_offer handoff, per-plan quota accounting, the profile fallback for missing country, and five named error outcomes. This is exactly the behavioral context annotations cannot carry.
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?
Front-loads purpose, then the verbatim-input constraint, then async behavior and the get_offer follow-up, then parameters, then quota and error codes. It is dense but every sentence carries new information; nothing is padding.
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 an async, quota-metered write tool with a referenced schema and an output schema, the description covers invocation, retrieval of results, fallback behavior and failure modes. An agent has everything needed to call it and interpret the response.
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 nested schema already describes all five fields well, but the description still adds meaning: vacancy_id links the offer to the tracker, countries default to the profile when omitted, and source_text loses extracted numbers if paraphrased. The only gap is that it doesn't surface the employment_type enum values, which the schema does.
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 ('Analyse a job offer ... draft the negotiation scripts') and immediately distinguishes it from the vacancy/radar siblings by scoping to a received offer. An agent can tell this apart from analyze_vacancy and analyze_tracked_vacancy without opening a schema.
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?
Clearly says the source text must be verbatim wording from the recruiter and that summarised text loses the numbers, and it routes the agent to get_offer(offer_id) for the result. It also says when to pass optional fields ('when the user said them'). It lacks an explicit 'use X instead' for the vacancy-analysis siblings, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_radar_matchAnalyze a job matchAInspect
Analyze one radar match (by match id) against the user's resume, using the posting text the radar already stored; it does not fetch the job page. Some boards hand over only a teaser (under 400 characters): such a match is not analyzed and spends nothing; it is put in the tracker unanalyzed and comes back with status='needs_full_posting'; analyze_tracked_vacancy with the full posting text as 'description' analyzes it. Otherwise consumes one vacancy analysis from the user's quota per match. Runs asynchronously: get_vacancy_detail(analysis_id) shows the result in a few seconds. If this match was already analyzed the existing analysis is returned with reused=true and nothing is spent. Returns 'limit_exceeded' when the quota is gone, 'posting_closed' when the job board says the posting is gone (closed_at is set; the match is put away and nothing is spent), and 'not_found' if the match does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| reused | No | |
| status | Yes | 'processing' — a new analysis was enqueued and a credit spent; 'reused' — this match was already analyzed; 'needs_full_posting' — the board gave only a teaser, so nothing was analyzed or spent and the match sits in the tracker unanalyzed under analysis_id until the full text is added. |
| task_id | No | Background job id; null when an existing analysis was reused. |
| match_id | Yes | |
| analysis_id | Yes | Pass to get_vacancy_detail to read the result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only give the generic destructive/readOnly/idempotent flags), the description discloses quota cost per match, asynchronous execution with get_vacancy_detail(analysis_id) to retrieve the result, and precise side-effect semantics for each failure path (posting_closed sets closed_at and puts the match away; teaser spends nothing). There is a mild tension with idempotentHint=false given the reused=true caching path, but the description's disclosure level is far richer than the annotations and is not a genuine contradiction.
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 is front-loaded and every sentence carries real information (teaser handling, quota, async retrieval, error codes). It is dense as a single block, which slightly hurts scanability, but there is essentially 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 one-parameter, output-schema-backed, asynchronous tool, the description covers the operation, its alternatives, its cost model, how to fetch results, and the full set of terminal error states with their side effects. Nothing material needed to invoke it correctly is missing.
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?
Only one parameter (match_id), and the description references it only as 'by match id' without adding format, prefix, or lookup guidance. The schema carries the bulk of the meaning (its own description points to get_radar_matches), so a baseline 3 is appropriate rather than compensating heavily.
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 specific verb and resource (analyze one radar match by id against the user's resume) and immediately bounds the operation ('using the posting text the radar already stored; it does not fetch the job page'). It also distinguishes itself from a near-sibling by naming analyze_tracked_vacancy for the full-posting case, so an agent can route correctly.
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 explicit when-to-use and when-not rules: teaser postings under 400 characters are not analyzed and instead should go to analyze_tracked_vacancy with the full text as 'description'. It also states the idempotent path (already-analyzed matches return reused=true) and quota conditions, so no routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_tracked_vacancyAnalyze a tracked jobAInspect
Analyze a vacancy already in the user's tracker (by vacancy_id) against their active resume, in place — no duplicate is created. It covers a vacancy never analyzed (analysis_status 'none'), one whose analysis failed, and a re-run (e.g. the first read a truncated posting). Consumes one vacancy analysis from the user's quota. Runs asynchronously: get_vacancy_detail(vacancy_id) shows the result once done, usually within 10 seconds. Returns 'description_required' when the vacancy has no posting text (pass the user's pasted text as 'description'), 'posting_too_short' when a never-analyzed vacancy holds only a job board's teaser of under 400 characters (nothing analyzed or spent; the full posting text passed as 'description' lifts it), 'already_processing' when an analysis of it is already running (nothing spent), 'limit_exceeded' when the quota is gone, and 'not_found' if the vacancy does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| task_id | Yes | Background task id (informational; get_vacancy_detail shows progress). |
| analysis_id | Yes | The same vacancy id — the analysis runs on this row, not a new one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: states one quota unit is consumed, that it runs asynchronously with results visible via get_vacancy_detail 'usually within 10 seconds,' that a passed description replaces any teaser before analysis, and enumerates every error code (description_required, posting_too_short, already_processing, limit_exceeded, not_found) with what each implies for spend.
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?
Front-loads purpose and scope, then usage conditions, quota, async behavior, and error codes in one dense block. It's long but every clause carries operational information; minimal waste, though the error enumeration makes it heavy.
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 an output schema present, return-shape detail is unnecessary, and the description covers everything else an agent needs: quota cost, async result retrieval, teaser-replacement behavior, and the full set of failure modes. Complete for a write tool of this complexity.
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?
Explains the meaning and triggering conditions for 'description' (needed when has_description is false or analyze_radar_match returned needs_full_posting; pasted word-for-word; saved over the teaser) and clarifies vacancy_id refers to a tracked vacancy. Adds real value even though the schema also carries field descriptions.
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 ('Analyze a vacancy already in the user's tracker (by vacancy_id) against their active resume') and pins down the scope with 'in place — no duplicate is created.' This clearly separates it from a new-vacancy analysis path without needing to name the sibling.
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 applicability: a never-analyzed vacancy ('none'), one whose analysis failed, or a re-run. It also flags quota consumption and async behavior. It stops short of naming the alternative tool (e.g. analyze_vacancy) for the not-tracked case, so it's strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_vacancyAnalyze a job postingAInspect
Analyze the text of a job posting that is not in ResumeQuick yet against a resume. Creates a NEW vacancy in the tracker; a vacancy already in the tracker is analyzed in place by analyze_tracked_vacancy, a radar match by analyze_radar_match. The same posting text analyzed before returns that analysis with status 'completed' and spends nothing, unless the resume or what the user told about themselves changed since; force=true re-runs it. Runs asynchronously — this returns an analysis_id immediately; get_vacancy_detail(analysis_id) shows the match, verdict and gaps once done, usually within 10 seconds. company, location and url are stored on the vacancy, shown on the tracker card, and make the analysis findable by search_vacancies(location=...). Counts as one vacancy analysis against the user's plan. Returns 'not_found' if resume_id is given but does not belong to the current user, and 'limit_exceeded' if the plan quota is reached.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| reused | No | True: the same text was analyzed before against the same resume and nothing was spent; company, location and url passed with the call are written onto that analysis. |
| status | No | 'processing' — the analysis runs asynchronously; 'completed' — this posting text was analyzed before and that analysis is returned as is. |
| task_id | Yes | Background task id (informational; get_vacancy_detail shows progress). |
| analysis_id | Yes | Id of the created analysis; pass to get_vacancy_detail once ready. |
| vacancy_title | No | Title stored on the vacancy. A new analysis keeps a passed title; without one it is the posting's first line until the analysis names the role. A returned earlier analysis keeps its own title. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations only carrying generic CRUD hints, the description discloses the full behavioral profile: it creates a NEW vacancy, runs asynchronously and returns an analysis_id immediately, is polled via get_vacancy_detail (~10s), returns cached 'completed' results without spending quota unless resume/self-description changed, and emits 'not_found'/'limit_exceeded' errors. It also states it consumes one vacancy analysis against the plan — a cost/rate detail annotations do not capture.
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?
Front-loaded with the core action and its routing constraint in the first sentence, then layers dedup, async, storage, and error semantics. Dense but every clause carries a distinct, actionable fact with 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 an async mutating tool with a nested schema and an output schema, this covers the lifecycle (trigger → poll → result), cost, dedup/force, persistence of inputs, and failure codes. An agent has everything needed to invoke, poll, and handle errors correctly.
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 nested input schema documents each field, but the description adds meaning beyond it: company/location/url are persisted on the vacancy and make it findable via search_vacancies(location=...), resume_id defaults to the active resume, and force controls re-execution. This is genuine semantic value on top of the schema's field-level docs, though the individual param mechanics are largely already covered.
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 ('Analyze the text of a job posting... against a resume') and immediately scopes it to postings 'not in ResumeQuick yet'. It explicitly names the two sibling tools that handle the adjacent cases (analyze_tracked_vacancy, analyze_radar_match), so an agent can route correctly without opening any schema.
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 when-to-use (posting text not yet tracked), when-not (already tracked → analyze_tracked_vacancy; radar match → analyze_radar_match), and the dedup rule with the force=true escape hatch. Nothing about selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_vacancy_resume_suggestionsApply resume suggestions for a jobAInspect
Apply resume-improvement suggestions from a vacancy analysis. indices (into the vacancy's resume_suggestions list from get_vacancy_detail) pick which to apply; omitted applies all except the questions without a fact and the suggestions whose last apply changed nothing (unchanged_suggestion_indices). target='copy' rewrites an inactive tailored copy linked to this vacancy (reused when it exists, otherwise duplicated from the active resume — consumes one resume generation, 'limit_exceeded' on quota); target='current' rewrites the active resume. Without target it goes where the Tailoring tab defaults: the copy when one exists or a resume generation is left, otherwise the active resume; copy_created and resume_id in the output say which. Runs asynchronously — returns a task_id and the target resume_id; each applied suggestion saves a new resume version; get_task_status(task_id) reports progress and the outcome, with unchanged_count for suggestions that changed nothing because the resume states nothing they build on. A suggestion whose kind is 'needs_fact' is a question to the user: it applies only with their own answer in facts. Returns 'not_found' if the vacancy does not belong to the current user, 'invalid_payload' if there are no suggestions, an index is out of range, a fact is too long or nothing is left to apply, 'fact_required' if a 'needs_fact' index has no fact.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | Always 'processing' — the job runs asynchronously. |
| task_id | Yes | Background task id (informational; get_vacancy_detail shows progress). |
| resume_id | No | Id of the resume the suggestions are being applied to. |
| vacancy_id | Yes | Id of the vacancy analysis the task operates on. |
| copy_created | No | True when a new tailored copy was created for this call (target='copy'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds extensive behavior beyond annotations: runs asynchronously returning a task_id, each applied suggestion creates a resume version, quota consumption with 'limit_exceeded', and explicit error codes ('not_found', 'invalid_payload', 'fact_required'). Notifications of what gets skipped and unchanged_count enrich this further.
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?
Front-loaded with purpose and indices/target semantics, but dense — a nearly continuous paragraph with nested parentheticals. Every sentence is relevant, though the density slightly harms scanability.
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?
Even though an output schema exists, the description explains the async task model, task_id/resume_id/copy_created returns, and how to poll via get_task_status. Nothing an agent needs to call or follow up correctly is missing.
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?
Description adds real meaning beyond schema: indices selection logic, what omitted indices skip, where target defaults (Tailoring tab default), and the conditions for fact_required vs skip. The default-target resolution rule is a genuinely valuable clarification not present in the schema.
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: 'Apply resume-improvement suggestions from a vacancy analysis,' with the indices indexed from the vacancy's resume_suggestions list. Clearly distinguishable from siblings like get_resume_suggestions and request_vacancy_resume_suggestions.
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?
Explains when to omit indices (applies all except fact-less questions and no-op suggestions), what target='copy' vs 'current' mean, what the default target does, and that 'needs_fact' suggestions require the user's own answer. Rival siblings and selection conditions are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_interviewArchive or restore a mock interviewAIdempotentInspect
Archive a mock interview (hide it from the user's main list) or restore it. This is the 'remove it from my list' action: reversible, the results are kept, and the archive never expires. archived=false restores. Returns 'not_found' if the interview does not exist or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| is_archived | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false and idempotentHint=true, but the description adds real behavioral context beyond them: the operation is reversible, results are preserved, the archive never expires, and it returns 'not_found' for a missing or non-owned interview. It stops short of describing permissions or any side effects on related data.
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 tight sentences, front-loaded with the primary action and immediately followed by the disambiguating intent and behavioral guarantees. No filler or repetition of the title.
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?
An output schema exists, so return-value detail is not needed, and the one notable return case ('not_found') is called out anyway. Combined with annotations covering safety/idempotency, the definition gives an agent everything needed to invoke a reversible two-state archive correctly.
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 reported as 0% at the wrapper level, so the description must carry the semantics, and it does: 'archived=false restores' pins down the boolean's two states, and interview_id ownership rules are explained via the 'not_found' clause. It adds meaning beyond a bare field list.
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 specific verb and resource ('Archive a mock interview ... or restore it') and clarifies the user-facing intent ('the remove it from my list action'). It implicitly contrasts with delete_interview by stressing reversibility and retained results, but never names that sibling, so an agent must infer the distinction.
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?
Usage is implied rather than stated: the phrase 'this is the remove it from my list action' tells the agent the intent, and 'reversible, the results are kept' hints at when it is preferred over deletion. However, no alternative tool (e.g., delete_interview) is named and no explicit when-not condition is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_radar_matchArchive or restore a job matchAIdempotentInspect
Put a saved radar match away in the radar archive, or restore it to the saved pile with archived=false. Reversible, applies instantly, no quota. The archive keeps matches until the user deletes them; read it with get_radar_matches(status="archived"). Returns 'not_found' if the match does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| status | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: operations apply instantly, consume no quota, the archive persists until the user deletes, and the call returns 'not_found' when the match belongs to another user (an ownership/auth condition). These side-effect and error behaviors are exactly what the readOnlyHint/idempotentHint/destructiveHint flags cannot convey.
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 sentences, each carrying distinct load: action + restore semantics, then behavioral guarantees, then the read path and error case. Front-loaded with the primary operation and free of 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 single-parameter reversible mutation with an output schema and full annotation coverage, the description supplies everything an agent needs: both directions, reversibility, quota impact, the companion read tool, and the ownership error. No material gap remains.
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 description compensates for the reported 0% schema coverage by stating the effect of archived=false versus the default archiving behavior, tying the boolean to a concrete outcome. The nested schema happens to describe the same two fields, so the description adds emphasis rather than new syntax or edge cases.
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 reversible action on a named resource ('Put a saved radar match away in the radar archive, or restore it to the saved pile') and covers both directions of the operation. An agent can distinguish this from delete_radar_match, skip_radar_match and undo_radar_match because the description explicitly frames it as reversible, non-destructive archiving.
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 clear usage context: archive by default, pass archived=false to restore, and read the archive back with get_radar_matches(status="archived"), naming that tool explicitly. It stops short of an explicit exclusion ('to permanently remove, use delete_radar_match'), so the boundary with the delete sibling is only implied by 'reversible'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_vacancyArchive or restore a tracked jobAIdempotentInspect
Archive a tracked vacancy (hide it from the user's main list) or restore it. This is the 'remove it from my list' action: reversible, history and quota accounting stay intact, and the archive never expires. archived=false restores. Returns 'not_found' if the vacancy does not exist or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| is_archived | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, idempotent and non-destructive, and the description adds real value on top: reversibility, that history and quota accounting stay intact, that the archive never expires, and the 'not_found' failure condition. That is exactly the context an agent needs before invoking a state change.
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 tight sentences with the action and its semantics front-loaded and the error case last where it belongs. Denseness is an asset here rather than padding, though the parenthetical gloss and the trailing failure clause could be trimmed slightly.
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 one-parameter mutation with an output schema already describing returns, the description covers scope, reversibility, side effects and the failure mode. Nothing an agent needs to call it correctly is missing.
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 reported at 0%, so the description must carry the load, and it does: 'archived=false restores' pins the boolean's polarity, which is the one way to misuse this tool. The vacancy_id parameter itself gets no added meaning beyond the title.
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 ('archive a tracked vacancy... or restore it') plus a lay gloss ('hide it from the user's main list'), which lets an agent separate it from the many sibling archive_/delete_ tools. The reversible/reversible-pair scope is explicit.
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?
Frames the tool as 'the remove it from my list action', which gives clear context for when to reach for it. It never explicitly contrasts with the close-by delete_vacancy sibling, so an agent must infer that permanent removal is elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_all_remindersCancel all remindersAIdempotentInspect
Cancel every active reminder of the user at once and return how many went (0 when there were none). Nothing brings a cancelled reminder back, so this belongs behind an explicit request. Applies instantly, no quota.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| cancelled | Yes | How many active reminders were cancelled; 0 when there were none. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: irreversibility ('nothing brings a cancelled reminder back'), instant application, no quota consumption, and the returned count. There is mild tension with destructiveHint=false given the stated irreversibility, but cancelling is a state flip rather than data destruction, so this is not a hard contradiction.
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 short sentences, front-loaded with the action and scope, then the return value, then the risk/when constraint. No sentence is 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?
With an output schema present and annotations covering idempotency and safety profile, the description fills every remaining gap an agent needs: scope, irreversibility, return shape, and that no quota is consumed.
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?
Zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The absence of arguments is consistent with an all-at-once bulk action.
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 with explicit scope: 'Cancel every active reminder of the user at once.' The word 'every ... at once' implicitly distinguishes this bulk operation from the singular cancel_reminder sibling, though it never names the sibling outright.
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?
'Nothing brings a cancelled reminder back, so this belongs behind an explicit request' gives a genuine when-to-use condition (explicit user request only). It stops short of naming cancel_reminder or list_reminders as the alternative for narrower cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_reminderCancel a reminderAIdempotentInspect
Cancel one of the user's active reminders by id (see list_reminders). Applies instantly, no quota. Returns 'not_found' when the reminder does not belong to the current user, has already fired, or does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| cancelled | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, but the description adds genuinely new behavior: instant application, no quota consumption, and the precise conditions under which 'not_found' is returned. That error semantics detail goes beyond what annotations provide.
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 tight sentences, with the core action and its id source front-loaded, followed by the operational and error-side notes. 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?
An output schema exists so return values need not be documented, and the description still covers the key non-obvious outcome ('not_found' cases) plus the instant/no-quota behavior. Nothing an agent needs to call this correctly is missing.
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 reported as 0%, so the description must carry the reminder_id semantics. It does say 'by id (see list_reminders)', which tells the agent where the id comes from, but adds no format or validation detail beyond that.
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 ('Cancel one of the user's active reminders by id'), and the phrase 'one of' implicitly distinguishes it from the sibling cancel_all_reminders. An agent can tell exactly what this does without opening the schema.
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?
Points to list_reminders as the source of the required id, giving clear context for when to reach for this tool. It stops short of explicitly contrasting itself with cancel_all_reminders, the obvious alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_resume_linkClose resume share linkADestructiveInspect
Close the open public link to a resume's PDF on ResumeQuick.app. The address stops working at once: anyone who opens it sees that the link was closed. The resume and its file stay; a link created later with share_resume_link gets a new address. Returns 'no_link' when the resume has no open link, and 'not_found' if the resume does not exist or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| resume_id | Yes | |
| closed_url | Yes | The address that stopped working; whoever opens it sees that it was closed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations marking this as destructive and non-idempotent, the description adds substantial context: the public address stops working immediately, visitors see the link was closed, the resume and file remain intact, and a later link gets a new address. It also returns 'no_link' and 'not_found' states, covering both side effects and error conditions.
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?
The description is four tightly written sentences with the primary action front-loaded. Every sentence earns its place by covering effect, reversibility, alternative behavior, and return statuses.
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 destructive one-parameter tool with rich annotations and an output schema, the description is complete enough. It explains the immediate effect, what is preserved, how to create a replacement link, and the two error/empty states an agent might encounter.
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?
There is one parameter, resume_id, and the embedded schema documents it as returned by list_resumes. The description itself does not add further parameter semantics, such as format or acquisition details, so it relies on the schema for invocation guidance.
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 and resource: close the open public link to a resume's PDF. It distinguishes the action from sibling tools such as share_resume_link, which creates a new link, and makes clear this is about revoking public access rather than deleting the resume.
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 names the alternative share_resume_link for creating a later link and explains the no_link condition for when there is nothing to close. It does not explicitly contrast with get_resume_link or get_resume_pdf_url, but the intended use is clear from the purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_profileCreate the first resume profileAInspect
Create the first resume of an account that has no profile yet, either from the text of the user's resume (resume_text) or from five answers about their work (guided: role, years of experience, education, skills, last job). Exactly one of the two is passed. It works before setup is finished and completes setup once the resume is saved. Runs asynchronously — returns a task_id immediately; get_task_status(task_id) reports progress and, when done, the new resume_id. Consumes one resume generation from the user's plan; on the free plan this is the month's only resume generation. Once the resume is saved, the job radar's automatic search is turned on and its first scan runs, built from the resume and the account's country; the account's first scan is not counted against the radar quota. get_radar_status shows the search, and set_radar_auto_search turns it off. The profile's name is the account's name. Guided answers without last_job leave the experience section empty. language defaults to the account's language and is one of: en_EN, ru_RU, es_ES, pt_BR, de_DE, fr_FR, it_IT, tr_TR, hi_IN, uk_UA, id_ID, ja_JP. Returns 'already_set_up' if the account already has a profile, 'limit_exceeded' if the plan quota is reached, and 'invalid_payload' when both or neither input is given or the language code is unknown.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | 'processing' — the generation has started; 'already_processing' — one was already running and this is its task. |
| task_id | Yes | Background task id; get_task_status reports the new resume_id when it is done. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond annotations: discloses asynchronous behavior (returns task_id immediately), quota consumption ('one resume generation from the user's plan', free-plan limit), side effects (turns on radar auto-search and runs first scan), return tokens ('already_set_up', 'limit_exceeded', 'invalid_payload'), and edge cases like guided answers without last_job. This is exactly what behavioral transparency should look like.
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?
The description is a single dense paragraph packed with semicolons and run-on clauses. While most information earns its place, the lack of structure (no bullets, no clear separation of concerns) makes it harder to parse than necessary for an agent.
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?
Given the tool's complexity (async, quota, side effects, error states) and the presence of an output schema, the description is remarkably complete. It covers inputs, defaults, side effects, error semantics, and async follow-up, leaving no critical gap for correct invocation.
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 reported as 0%, so the description carries the burden and does so well: it clarifies that exactly one of resume_text or guided is passed, lists the guided fields, notes the effect of missing last_job, and enumerates allowed language codes. It omits field_of_study from the guided list, but otherwise adds substantial semantic value beyond the schema.
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: 'Create the first resume of an account that has no profile yet', clearly distinguishing it from siblings like create_resume_version or update_resume_section. The scope condition ('no profile yet') is front-loaded and unambiguous.
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?
Explicitly states the precondition (account with no profile), the two mutually exclusive input modes (resume_text vs guided), and that exactly one must be passed. It also notes it works before setup is finished. It does not name alternative tools for related tasks, but the context is clear enough for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_reminderCreate a reminderAInspect
Schedule a reminder for the user. fire_at_local is their local wall clock time as ISO 8601 with no zone; the server converts it. text is delivered as written, on its own, when the reminder fires. Applies instantly, no quota. Returns 'limit_exceeded' at 20 active reminders and 'invalid_payload' for a time in the past, more than 180 days ahead, or empty text.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| text | Yes | |
| fire_at_local | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only mark it non-read-only, non-idempotent, non-destructive), the description discloses concrete behavioral traits: immediate effect, no quota, a hard cap of 20 active reminders surfacing as 'limit_exceeded', and the exact 'invalid_payload' triggers (past time, >180 days ahead, empty text). That is precisely the kind of failure-mode context annotations cannot carry.
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?
Extremely dense with zero filler: purpose first, then the two key parameters, then the behavioral/limits clause. Every sentence carries operational information an agent needs before calling.
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?
The tool has an output schema, so return values need not be explained, and the description still flags the two error strings. Combined with annotations and the nested schema descriptions, an agent has everything required to invoke this correctly; the only soft gap is silence on the optional domain-linkage fields.
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 top-level `input` parameter has 0% schema coverage, but the nested properties do carry descriptions. The description reinforces the critical `fire_at_local` semantics (local wall clock, no zone, server converts) and adds delivery semantics for `text` ('delivered as written, on its own') that the schema states less directly. It says nothing about the optional `resume_id`/`vacancy_id`/`interview_id` linkage fields, leaving those entirely to the schema.
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: 'Schedule a reminder for the user', which an agent can act on immediately. It does not distinguish itself from the sibling `create_reminders` (plural), `list_reminders`, or `cancel_reminder`, so the agent must infer whether this is the single-item or batch variant.
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 says the operation 'applies instantly, no quota', which hints that rationing isn't needed, but it gives no when-to-use context and never routes the agent between this tool and the clearly related `create_reminders` sibling. There are no prerequisites or exclusions stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_remindersCreate several remindersAInspect
Schedule several reminders at once — one thing spread over several dates, up to 20 per call. Each entry takes fire_at_local (the user's wall clock, ISO 8601, no zone) and text, delivered as written when it fires. All or nothing: 'limit_exceeded' says how many of the user's 20 reminder slots are free, so ask for at most that many or free some with cancel_reminder; 'invalid_payload' names the entry (reminders[i]) whose time is past, more than 180 days ahead, or whose text is empty. Applies instantly, no quota.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| reminders | Yes | |
| free_slots | Yes | How many of the 20 reminder slots are still free after this call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing atomicity ('all or nothing'), specific error codes (limit_exceeded, invalid_payload) and what each means, the 20-slot account limit, the 180-day ceiling, and instant application. Annotations only mark it non-read-only, so this carries real operational detail.
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?
Front-loads purpose, then parameters, then error behavior in three dense sentences with no filler. Every clause (limits, error names, atomicity) earns its place.
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 nested-object batch mutation with an output schema, the description covers everything an agent needs: batching rules, per-entry fields, failure semantics, and limits. Failure modes are the key gap an output schema wouldn't convey, and they are fully addressed.
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 schema documents fire_at_local and text, but the description adds value by explaining the user's wall-clock convention, that text is delivered verbatim, and the validation rules (past time, >180 days ahead, empty text) that live nowhere in the schema. Some overlap with schema text keeps 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?
States a specific verb and resource ('Schedule several reminders'), gives scope ('up to 20 per call'), and characterizes the intended use ('one thing spread over several dates'), which cleanly distinguishes it from the singular sibling create_reminder. An agent can pick between the two without opening a schema.
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 explains the batch context for using this over the single-reminder tool and explicitly routes the agent to cancel_reminder when reminder slots need freeing. It stops short of an explicit 'use create_reminder instead when scheduling one' statement, so it's clear context but not a full when/when-not rule set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_resume_versionCopy a resumeAInspect
Create a new draft resume as a copy of an existing one — the original is left untouched. Optionally pass a vacancy_id to tailor against; it names the draft and links the copy to that vacancy (shown on the vacancy card and as a badge in the resume manager). Counts as one resume generation against the user's plan. Returns 'not_found' if the source resume (or vacancy) does not exist or does not belong to the current user, and 'limit_exceeded' if the plan quota is reached.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Id of the newly created draft resume. |
| name | Yes | |
| vacancy_id | No | |
| content_version | No | Content version of the new copy: a hash of the content, so it equals the source's until either changes. update_resume_section takes it as expected_content_version. The copy's entry ids differ from the source's. |
| source_resume_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, non-destructive, non-idempotent, closed-world, so the bar is lower, yet the description adds real substance: the source is unmodified, the call consumes one plan generation, and it enumerates 'not_found' and 'limit_exceeded' failure modes including ownership scoping. It doesn't restate idempotency or reversal behavior, but the quota and error disclosures are valuable.
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?
Front-loaded with the core action and the non-destructive guarantee, then layers optional tailoring, cost, and error semantics in a logical order. It is a touch dense across three sentences but every clause carries information an agent would otherwise have to guess.
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 an output schema present, return-value detail is largely covered, and the description still adds quota, ownership, and error-name context plus the vacancy linkage. An agent has what it needs to invoke correctly, though explicit idempotency/retry expectations are left to the annotations.
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 reported top-level coverage is 0% (the visible parameter is a $ref), but the nested input properties do carry their own descriptions. The description largely restates the vacancy_id linkage already in the schema (default name from vacancy title, badge/vacancy-card display) and adds only marginal detail, so it neither compensates strongly nor falls below the documented-schema baseline.
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 ('Create a new draft resume as a copy of an existing one') and immediately clarifies scope with 'the original is left untouched'. This cleanly separates it from siblings like rename_resume, delete_resume, and request_resume_update without the agent needing to open any schema.
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 clear context for the optional tailoring path via vacancy_id and notes the plan-cost implication, plus it points to where ids come from (get_recent_vacancies, list_resumes). It stops short of explicit when-not guidance or naming an alternative copy mechanism, so it is context-rich but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_interviewDelete an archived mock interviewADestructiveInspect
Permanently delete an ARCHIVED mock interview — its questions, answers, feedback and public share link are gone. Irreversible. A retry of it survives with its link cleared (the response counts them). Returns 'not_archived' if the interview is still active: archive it first with archive_interview, which is what the user usually means by 'remove it'. Find archived ids with get_interview_results(archived=true). Returns 'not_found' if it does not exist or does not belong to the current user. Consumes no quota and refunds none.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | No | |
| retries_unlinked | No | Retries of this interview that survive but lose their link, so their attempt count restarts. |
| reminders_cancelled | No | Pending reminders cancelled with the interview. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, readOnlyHint=false, but the description adds substantial beyond them: what exactly is destroyed (questions, answers, feedback, public share link), that a retry survives with its link cleared, the 'not_found'/ownership-scoping behavior, and that it consumes no quota and refunds none.
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?
Front-loaded with the irreversible-delete fact, then error semantics, alternative routing, and quota behavior in tight clauses. Every sentence earns its place; density is high but nothing is redundant or padded.
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?
An output schema exists (so return values need not be re-explained), yet the description still pins the two failure codes and ownership scope. Combined with destinations, alternatives, and quota effects, an agent has everything needed to call this safely.
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?
With a single required parameter and (per the reported) 0% schema description coverage, the description carries the burden but only partially: it reinforces the ARCHIVED constraint and tells the agent where to find a valid id via get_interview_results(archived=true). It adds no format/syntax detail, which is acceptable for a plain id but leaves the compensation partial.
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 (permanently delete) and resource (an ARCHIVED mock interview) with explicit scope, and immediately contrasts with the sibling archive_interview. An agent can tell exactly what this does versus 'archive' or 'remove' without opening any schema.
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?
Explicitly covers the when-not case (returns 'not_archived' if still active; archive it first, 'which is what the user usually means by remove it') and names the alternative tool. It also routes the agent to get_interview_results(archived=true) to obtain a valid id. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_radar_matchDelete a skipped job matchADestructiveInspect
Permanently delete a radar match from the Skipped pile — status skipped or archived, as get_radar_matches(status="archived") lists them. Irreversible, no quota. The vacancy will not come back in future radar scans; a vacancy analysis made from this match is NOT deleted and stays in the job analysis list. Returns 'not_archived' if the match is new, saved or deferred, and 'not_found' if it does not belong to the current user. Clearing the whole radar archive at once is deliberately web-only.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: irreversible, no quota consumed, the vacancy will not reappear in future scans, and a derived vacancy analysis is deliberately NOT deleted. It also documents the 'not_archived' and 'not_found' failure modes, which annotations cannot express.
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?
Front-loads the core action, then layers scope, irreversibility, side effects, and error codes with no filler. It is dense and slightly long, but essentially every clause carries decision-relevant 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?
Despite an output schema existing, the description still covers return/error semantics, side effects on related analyses, and the web-only alternative — all the context an agent needs for a destructive, non-idempotent operation. Nothing material is missing.
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?
With a single parameter and 0% reported coverage, the description compensates by specifying the ID must reference an archived/skipped match and showing where to obtain it (get_radar_matches). The inline schema description reinforces but does not exceed this, so a 4 rather than 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?
States a specific verb (permanently delete) plus resource (radar match) and scope (Skipped pile — status skipped or archived). This cleanly separates it from archive_radar_match, skip_radar_match, and undo_radar_match without needing to open any schema.
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?
Explains exactly which matches qualify (skipped/archived), points to get_radar_matches(status="archived") as the way to locate them, and explicitly excludes the bulk-clear case as web-only. The when-to-use and when-not-to-use boundaries are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_resumeDelete a resumeADestructiveInspect
Permanently delete a resume; its PDF files are deleted too, and links to them stop working. Irreversible; the resume generation spent on it is not returned. Returns 'not_found' if the resume does not exist or does not belong to the current user, 'cannot_delete_active' if it is the currently active resume, and 'cannot_delete_only' if it is the user's only resume.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Id of the deleted resume. |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring destructiveHint=true and idempotentHint=false, the description goes beyond them by detailing the cascade (PDF deletion, broken links), irreversibility of spent generation, and specific error codes ('not_found', 'cannot_delete_active', 'cannot_delete_only'). This is exactly the kind of behavioral context that annotations cannot convey.
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?
The description is a single, tightly packed sentence with zero waste, front-loading the permanent deletion and cascade effects, then the irreversibility, then the error codes. Every clause adds distinct value.
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?
Given the tool is a destructive mutation with annotations covering safety, an output schema exists (so return format need not be explained), and one required parameter, the description is nearly complete. The only minor gap is that it does not mention any alternative recovery path (e.g., undo), but that may be covered by sibling tools like restore_resume_revision.
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% and the description does not explicitly explain the 'resume_id' parameter, but it does contextualize the input by referencing how to obtain it ('as returned by list_resumes' is in the schema anyway). The description's focus on error conditions and cascade effects implies the parameter's role without adding format or origin details beyond the schema.
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 (Permanently delete) and resource (a resume), and immediately differentiates cascade behavior (PDF files deleted, links stop working) from siblings like archive_vacancy or close_resume_link. This is far more specific than the title alone and leaves no ambiguity about what the tool does.
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 clearly establishes the destructive, irreversible nature and the constraints (cannot delete active resume, cannot delete only resume), which implicitly tells the agent when NOT to use it. However, it does not explicitly name an alternative (e.g., archive_vacancy, restore_resume_revision, or rename_resume) for users who want to preserve data, leaving full when-to-use guidance partially inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_vacancyDelete an archived jobADestructiveInspect
Permanently delete an ARCHIVED vacancy. Irreversible — the vacancy and its history are gone, and a linked tailored resume, interview or offer survives with its link cleared, and the radar match it came from is deleted too and not offered again (the response counts them). Returns 'not_archived' if the vacancy is still active: archive it first with archive_vacancy, which is what the user usually means by 'remove it'. Returns 'not_found' if it does not exist or does not belong to the current user. Consumes no quota and refunds none.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| deleted | No | |
| offers_unlinked | No | Offer negotiations that lose their link. |
| interviews_unlinked | No | Mock interviews that lose their link. |
| reminders_cancelled | No | Pending reminders cancelled with the vacancy. |
| radar_matches_deleted | No | Radar matches that pointed at this analysis; deleted with it, a later scan does not bring them back. |
| tailored_resumes_unlinked | No | Tailored resumes that survive but lose their link to this vacancy. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, but the description goes further: it discloses irreversibility, the cascade semantics (linked resume/interview/offer survives with link cleared, radar match deleted and never re-offered), and quota behavior. That is behavioral context an agent cannot get from the annotations.
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?
Front-loaded with the destructive action and precondition, then cascades, then error codes. Dense and every sentence carries information, though the cascade clause is a long compound sentence that could be split for readability.
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?
An output schema exists, yet the description still names the meaningful return codes and side-effect counts, so nothing an agent needs to call this correctly or interpret the result is missing.
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?
Only one parameter and the schema's own description is thin, but the tool description reinforces the key constraint (it must be an ARCHIVED vacancy) and explains what 'not_found' implies about ownership. Good compensation for the low schema coverage, though it doesn't discuss id formats.
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 ('Permanently delete') plus resource ('ARCHIVED vacancy') and its precondition, and immediately distinguishes itself from archive_vacancy and the other delete_* siblings. The uppercase ARCHIVED makes the scope unmistakable.
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?
Explicit when-to-use (only archived vacancies), when-not, and the alternative ('archive it first with archive_vacancy, which is what the user usually means by "remove it"'). Error routing ('not_archived', 'not_found') tells the agent exactly what to do next on failure.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_resume_pdfExport resume as PDFAInspect
Generate the PDF of a resume — the exact file the user downloads, never watermarked. An unchanged resume is handed back without a new render: the reply then has status 'completed' and the file itself (file_name, pages, and pdf_url that saves it for 60 minutes). Otherwise it renders asynchronously: a task_id comes back at once, the PDF is usually ready in a few seconds, get_task_status(task_id) reports progress and the outcome, and get_resume_pdf_url then gives the file. No quota on any plan. Returns 'not_found' if the resume does not exist or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| reused | Yes | True when this exact resume already had a file: it is handed back without a new render, and the fields below describe it. |
| status | No | 'completed' when the file is ready in this reply (reused); 'processing' while it renders. |
| made_at | No | ISO 8601 UTC moment the file was made. |
| pdf_url | No | Address on ResumeQuick.app that downloads the file without signing in, until expires_at. The user's own copy, not a link for other people. Null while the file renders. |
| task_id | Yes | |
| file_name | No | The name the file saves under; null while the file renders. |
| resume_id | Yes | |
| watermark | Yes | Always false: the downloaded PDF carries no watermark on any plan. |
| expires_at | No | ISO 8601 UTC moment pdf_url stops working. |
| is_current | No | Whether the file matches the resume as it is now; null while it renders. |
| page_count | No | Pages in the file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=false; the description adds far more — no watermarking, a cached no-render fast path, async rendering with typical latency of a few seconds, a 60-minute pdf_url lifetime, and no plan quota. The only missing piece is whether failed renders are retryable or billed.
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?
Front-loaded with the outcome ('the exact file the user downloads'), and every clause carries information — caching, async path, quota, error. The async sentence is a long multi-clause run-on (task_id, latency, get_task_status, get_resume_pdf_url) that costs some scannability.
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?
Covers both execution paths, latency expectations, the URL's expiry, quota absence, and the error case; output shape is documented by the output schema, yet the description adds the status/file fields anyway. Nothing an agent needs to call this correctly and handle the response is missing.
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 reported at 0%, and the description never discusses resume_id directly; it only implies ownership scoping through the 'does not belong to the current user' error note and indirectly through 'as returned by list_resumes' in the schema. The parameter's meaning is largely carried by the inline schema text, not the description.
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 ('Generate the PDF of a resume') plus a distinguishing property ('the exact file the user downloads, never watermarked'). It also implicitly separates itself from the lookalike siblings get_task_status and get_resume_pdf_url by casting them as follow-up steps rather than substitutes.
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 conditional routing: if the resume is unchanged, the call returns the file directly; otherwise it returns a task_id and the agent must poll get_task_status then call get_resume_pdf_url. It also names the failure condition ('not_found' when the resume is missing or owned by another user), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forget_career_factForget a career factADestructiveInspect
Forget a single career fact by its id (as returned by get_career_memory). A forgotten fact no longer reaches vacancy analysis or the agent. Returns 'not_found' if the fact does not exist, was already forgotten, or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | No | |
| fact_id | Yes | Id of the forgotten fact. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so safety is covered. The description adds genuine behavioral context beyond them: the consequence ('no longer reaches vacancy analysis or the agent') and the precise semantics of the 'not_found' outcome including the ownership-scoped case. It does not contradict any annotation.
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 tightly written sentences, front-loaded with the action and identifier, then the effect, then the error case. No filler and every sentence carries new 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 single-parameter destructive tool with an output schema present, the description covers identifier source, deletion effect, and the not_found cases. Nothing critical is missing for correct invocation, though it could note whether the deletion is recoverable.
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?
Only one parameter and the description supplies its provenance ('as returned by get_career_memory'), which is the operationally important detail for producing a valid value. This largely compensates for the reported 0% schema description coverage, though it adds little else about id format.
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?
Specific verb ('forget') plus the exact resource ('a single career fact by its id') and it names the sibling that produces the id (get_career_memory). An agent can distinguish this from add_career_fact / upsert_career_memory without opening any schema.
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 tells you the fact is identified by an id from get_career_memory, which implies the get-then-forget workflow, but it never states when to prefer this over add_career_fact or upsert_career_memory, nor any preconditions beyond id provenance. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_cover_letterWrite a cover letter for a jobAInspect
Write the cover letter for a vacancy in the user's tracker, from their resume and the analysis, with an optional tone, length, up to three of the vacancy's key_strengths to lead with, and a personal note. The letter is written in the user's profile language and states only facts from the resume; a resume with no work history still gets a letter, built from its summary and skills. The letter is saved on the vacancy's Cover Letter tab in the web app, the same letter the web and the browser extension write. When the vacancy already has a letter, this replaces it: the new one is written with the previous version in view and the change in options, and an option not given keeps the value the previous letter used. Runs asynchronously — returns a task_id; get_task_status reports when it is written, and get_vacancy_detail then shows has_cover_letter: true. The letter text itself is not returned. Spends one cover letter from the plan (the free plan has one a month); replacing an existing letter spends another one. Returns 'not_found' if the vacancy does not belong to the current user, 'no_resume' if the user has no resume, 'limit_exceeded' if the plan allowance is used up.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| task_id | Yes | Background task id; get_task_status reports when the letter is written. |
| vacancy_id | Yes | Id of the vacancy analysis the letter is for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations: it discloses that an existing letter is replaced (previous version in view, unset options inherit prior values), that generation runs asynchronously and returns only a task_id, that the letter text is never returned, that one plan credit is spent per call (and another on replacement), and enumerates error codes (not_found, no_resume, limit_exceeded). This is exactly the kind of mutation and cost/limit context annotations can't convey.
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?
Front-loads what the tool does and is dense with no filler, though the seven-sentence block mixes purpose, replacement semantics, async flow, cost, and errors into one paragraph. Slightly long, but nearly every sentence carries distinct operational 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 an async, credit-consuming, non-idempotent write tool, the description covers the full lifecycle: invocation inputs, replacement behavior, task_id polling path, success signal (has_cover_letter), credit cost, and failure modes. With an output schema present, nothing material is omitted.
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 auto-reported 0% coverage is misleading because the nested $defs properties carry rich descriptions, but the description still adds value by restating the option set (tone, length, up to three emphasis strengths, personal note) and, importantly, the inheritance rule that omitted options keep the previous letter's values. It largely mirrors rather than extends the schema, which caps it below 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?
States a specific verb and resource ('Write the cover letter for a vacancy in the user's tracker') plus its inputs (resume, analysis), which cleanly separates it from sibling analysis/read tools like analyze_vacancy and get_vacancy_detail.
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?
Clearly frames usage context: it writes to the vacancy's Cover Letter tab, replaces an existing letter when one exists, and routes the agent to get_task_status and get_vacancy_detail for the result. It does not state an explicit 'do not use this when X' alternative, but the surrounding flow is well-scoped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_career_memoryRead career memoryARead-onlyInspect
Get what is remembered about the user's career — target roles, locations, remote preference, seniority goal, industries, salary expectation, work authorization, search stage, blockers, motivation, plus free-form facts (each with an id you can pass to forget_career_fact). Empty if nothing is stored yet. Args: {}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| facts | No | Free-form remembered facts. |
| blockers | No | Things blocking the user's search. |
| locations | No | Preferred work locations. |
| industries | No | Industries of interest. |
| motivation | No | What drives the user's next move. |
| search_stage | No | Where the user is in their job search. |
| target_roles | No | Roles the user is targeting. |
| seniority_goal | No | Target seniority/grade. |
| remote_preference | No | Free text, e.g. 'remote', 'remote only', 'hybrid', 'onsite', 'open to remote / any country'. The radar reads it: a remote word narrows to remote jobs, hybrid / onsite / office words to non-remote ones, 'open to' or 'anywhere' (without 'only') leaves both. |
| salary_expectation | No | Salary expectation, free text. |
| work_authorization | No | Visa / right-to-work situation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the explicit empty-state disclosure ('Empty if nothing is stored yet') tells the agent how to interpret a no-data result. It does not, however, describe scope restrictions or freshness of the memory.
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?
The content is front-loaded and delivered in essentially one dense sentence, with the higher-value empty-state note kept short. The trailing 'Args: {}' is redundant given the empty schema and the enumeration is long, but nothing is buried or circular.
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 an output schema present, the description need not restate return values, yet it helpfully summarizes the memory contents and the empty case. For a zero-parameter read tool it is nearly complete; the only gap is the absence of explicit when-to-use framing relative to upsert_career_memory.
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 and the schema is an empty object at 100% coverage, so the baseline is 4. The description confirms 'Args: {}' but adds no further parameter meaning, which is appropriate since there is nothing to document.
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?
Uses a specific verb ('Get') plus the resource ('career memory') and enumerates exactly what is returned: target roles, locations, remote preference, seniority goal, industries, salary, work authorization, search stage, blockers, motivation, and free-form facts. This clearly distinguishes a read of career memory from siblings like upsert_career_memory or get_career_tips, though it never names the write counterpart as the alternative.
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 only routing guidance is a parenthetical noting that each free-form fact carries an id usable with forget_career_fact, which points at one downstream sibling but does not say when to call this tool versus alternatives. No explicit when-to-use or when-not-to-use condition is stated, leaving usage implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_career_tipsSearch career tipsARead-onlyInspect
Get short, fact-checked career cards to ground advice in — recruiter behaviour, ATS, resumes, cover letters, interviews, salary, networking. Filter by set_id, by free-text query, or to only_owned (cards the user has already collected). A query is matched word by word: a card qualifies when its title or body holds at least half of the query's words (words under 3 letters are ignored), cards matching more words first. Args: {set_id?, query?, only_owned?, limit? (default 10, max 30)}.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| sets | Yes | |
| tips | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior: the word-by-word matching rule, the 'at least half the query words' threshold, ignoring words under 3 letters, and relevance ordering — all beyond what annotations provide.
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?
Front-loaded with purpose, then filtering modes, then a compact args summary. Dense but every sentence carries information; the trailing args recap slightly duplicates the schema.
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?
An output schema exists, so return values need not be explained, and the description covers purpose, filters, and matching behavior. The only gap is the absence of guidance relative to siblings like get_career_memory.
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 schema $defs already document each parameter, including defaults and limits, so the description largely echoes it (limit default 10/max 30). It does add matching semantics not spelled out in the schema — the sub-3-letter word exclusion and the 'more words matched first' ordering — which justifies being above the baseline.
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 ('get short, fact-checked career cards') and enumerates the topical coverage (recruiter behaviour, ATS, resumes, etc.), which is far more than a restatement of the name. It does not, however, distinguish itself from nearby siblings like get_career_memory or add_career_fact.
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 ('ground advice in') and lays out three filtering modes, so an agent can infer when to reach for it. But it never states when to prefer it over get_career_memory or other retrieval siblings, and gives no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_coach_planRead the weekly planARead-onlyInspect
Get the weekly job-search plan the user agreed — goal, target roles, applications a week, review day, active or paused — and this week's progress in the user's timezone: applications marked sent (with the vacancies behind the number), analyses, vacancies that got a cover letter, mock interviews and employer replies. Progress counts only what was done. plan is null when no plan was agreed. Args: {}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | Yes | null when the user has not agreed a plan. |
| week | Yes | What was done this week; counts only, nothing about what is left. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds real behavioral context beyond them: the null-when-unagreed case, the user's timezone framing, and the counting rule ('Progress counts only what was done'), which prevents misreading the metrics.
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?
Front-loaded with the return contents and only two sentences long, but the second sentence is a dense list of progress metrics that borders on enumeration for enumeration's sake. It remains readable and 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?
With an output schema present, return shape is already documented, and the description still adds the semantics an agent needs: the null case, timezone basis, and the rule that only completed work is counted. Nothing required to interpret or invoke this zero-arg tool is missing.
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 there is nothing for the description to disambiguate; the baseline for a no-param tool is 4. The trailing 'Args: {}' is redundant but harmless.
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 specific verb+resource ('Get the weekly job-search plan') and enumerates exactly what it returns: goal, target roles, applications a week, review day, state, plus this week's progress. It is clearly distinguishable from the sibling mutators set_coach_plan and pause_coach_plan, which write rather than read.
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 clear context for reading the plan ('the plan the user agreed') and the null case ('plan is null when no plan was agreed'), which lets an agent decide whether it has anything to show. It does not explicitly route to alternatives like set_coach_plan or pause_coach_plan, so there is no exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_collectionRead collected career cardsARead-onlyInspect
Get the career cards this user has collected: what, when it was earned and how (deck | loader | agent | milestone | import). Milestones record work the user actually did — a first analysis, an offer, an interview scored 80+. There is no total to collect and no progress counter: the list holds only what has been earned. Args: {}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| counts | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds genuine context beyond that: the enumeration of how a card was earned, the meaning of milestones, and the explicit note that the list holds only earned items with no total or progress counter.
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?
Front-loaded with the core action, then supporting detail on card contents and milestone semantics. The milestone sentence is slightly discursive but earns its place by clarifying what counts as a card. No filler or repetition.
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?
An output schema exists, so return-value shape need not be described, and the tool is zero-parameter and read-only. The description covers purpose, entry contents, and the absence of a progress counter; only sibling disambiguation is missing, which keeps it short of a 5.
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 (schema coverage 100%, empty properties object), so the baseline is 4. The 'Args: {}' note simply confirms the no-argument contract, and there is no parameter meaning left to add.
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 ('Get the career cards this user has collected') and details what each entry contains: what, when earned, and how (deck | loader | agent | milestone | import). It does not explicitly name or rule out the nearest siblings such as get_user_stats or get_career_memory, so an agent must infer the boundary, but the resource itself is unambiguous.
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?
Usage is implied by the resource but no when-to-use or when-not-to-use guidance is given and no alternative sibling is named. The line 'There is no total to collect and no progress counter' weakly steers the agent away from a stats-style tool, which is the only routing signal present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_guild_newsRead the guild newsARead-onlyInspect
Get what is new for the user in the guilds — six guilds by what people love in their work, a shared feed of job-search steps with cheers — and the games about the world of work: their nickname and guild, how many people cheered their one latest cheered step or day of steps in the last 7 days, and whether they finished today's Two truths and a lie, today's Closest guess and this week's Connections. Never other people's identities, member counts or rankings. available is false when the guilds are not open to the user. Args: {}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| path | No | |
| games | Yes | The sets out now and whether the person finished each. |
| cheers | Yes | The latest cheers on their steps in the last 7 days, or null. |
| member | Yes | null until the person first opens /guilds. |
| available | Yes | false when the guilds and games are not open to the user; the other fields are then empty. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotations, the description discloses privacy boundaries ('Never other people's identities, member counts or rankings'), the meaning of the 'available' flag when guilds are closed, and the relevant time windows for cheers and game completion. This gives the agent concrete behavioral expectations for a read tool whose data is socially sensitive.
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?
The purpose is front-loaded, but the description is a single run-on sentence that enumerates return fields already covered by the output schema. The trailing 'Args: {}' is redundant filler for a zero-parameter tool. It remains informative, but structure and economy are weak.
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?
The description covers availability state, privacy exclusions, time windows, and what kinds of news/game data appear. Because an output schema exists, it does not need to enumerate return fields in detail, but doing so makes the definition complete rather than deficient. Minor gaps around error behavior are acceptable for this read-only 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?
The tool takes zero parameters, so the schema baseline is 4. The description confirms there are no arguments ('Args: {}'), though it adds no further parameter semantics because none are needed.
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 uses a specific verb ('Get') and clearly names the resource ('what is new for the user in the guilds'). It then scopes that resource precisely: six work-style guilds, a shared job-search step feed, games, cheers, and completion statuses. No sibling tool covers guild news, so it is clearly distinguishable.
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?
Usage is implied by the content description ('get what is new for the user in the guilds'), but the description never states when an agent should choose this tool or when another tool is more appropriate. There are no explicit exclusions or alternatives. The 'available is false' note is a state condition, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_interview_resultsList mock interview resultsARead-onlyInspect
List the user's completed mock interviews, newest first. Each item includes overall score, role, key feedback aggregated from the lowest-scoring questions, and weak study topics. Default limit 5, max 20. Archived interviews are excluded; pass archived=true to list the archive instead. Empty list is a normal result.
| Name | Required | Description | Default |
|---|---|---|---|
| input | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| interviews | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so safety is covered. The description adds genuine behavior beyond that: newest-first ordering, exclusion of archived records, the default/max limits, and the reassuring 'Empty list is a normal result' — a real anti-misinterpretation cue.
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 tight sentences, front-loaded with the core action, then defaults, then the archived mode and the empty-list caveat. No filler or restatement of the title.
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?
An output schema exists so return values need not be enumerated, yet the description still summarizes item contents (score, role, feedback, weak topics) for scanability. Ordering, filtering, limits and empty-result semantics are all present — nothing an agent needs to call it correctly is missing.
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 reported as 0%, so the description must carry the load, and it does: it restates the limit default (5) and cap (20) and explains what archived=true actually selects. The added note that archived mode is required to obtain a deletable id is meaning the schema does not provide.
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 ('List the user's completed mock interviews') plus ordering scope ('newest first'), which separates it from archive_interview and delete_interview at a glance. No ambiguity about what is returned.
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?
Explicitly gives the condition that switches modes ('pass archived=true to list the archive instead') and cross-references the sibling that consumes the result ('the only way to find the id delete_interview needs'). The agent knows both when to call it and why.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_snapshotJob market snapshot from the radarARead-onlyInspect
What the job postings ResumeQuick's radars found in the last four weeks say about a role, in one country or everywhere: how many distinct postings, last week against the week before, the remote share, salary quartiles as the postings stated them, the skills they name most and three fresh links. It covers what the radars found, not the whole market. Under 30 postings enough_data is false and only the count is given. Errors: invalid_payload (no role words, unknown country).
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| role | Yes | |
| weeks | Yes | The window: postings the radars found in the last this many weeks. |
| salary | No | Quartiles of the salaries postings stated, in their most common currency; null under 10 such postings or when they disagree too much to summarise. |
| country | No | ISO country code the snapshot covers; null = every country. |
| examples | No | The three freshest postings. |
| postings | Yes | Distinct postings in the window whose title holds every word of the role. |
| last_week | No | |
| top_skills | No | The skills these postings name most often. |
| enough_data | Yes | False below 30 postings: then only `postings` is filled and nothing else should be read into it. |
| remote_share | No | Percent of the postings marked remote. |
| previous_week | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotations, the description discloses the four-week radar scope, the important under-30-postings threshold where enough_data is false and only the count is given, and the invalid_payload error cases. This gives an agent substantial behavioral context for correct invocation and interpretation.
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?
The description is front-loaded with the main purpose and is not padded with irrelevant material. It is dense and run-on in places, especially the long list of returned metrics, but each clause generally adds useful scope or caveat 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?
Given the output schema, annotations, and one nested input object, the description is complete enough for an agent to know what the tool returns, its radar-only scope, the minimum-data threshold, and the error conditions. Nothing essential to a correct call appears to be missing.
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 schema signal reports 0% description coverage, and the description adds only limited parameter guidance: role words are implied by the invalid_payload note, and country/everywhere is mentioned. The nested schema itself documents role and country, so the description does not substantially compensate for the coverage gap beyond what the schema already says.
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 clearly states a specific resource: a four-week job-market snapshot for a role, optionally scoped to one country or everywhere. It distinguishes the aggregate radar view from the whole market, but does not explicitly differentiate it from sibling tools such as get_radar_matches or search_vacancies.
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 clear usage context: what the radars found in the last four weeks, one country or everywhere, and the caveat that it does not cover the whole market. It also warns that under 30 postings only the count is returned, though it does not name alternative tools for different needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_next_stepGet the next stepARead-onlyInspect
Get the user's one next step in the job search — the same step the ResumeQuick home screen shows — with the reason from their data and, when the step is about a vacancy, that vacancy and the step inside it (tailor, cover_letter, apply, interview), and app_url — the screen in ResumeQuick where the step is done. After an application the vacancy has no step until the employer answers; the step moves to new radar matches or another analysed vacancy. Args: {}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| step | Yes | The user's one next step, the same one the home screen shows: paused (the user paused the search until a date; there is no step until it ends or they resume it), resume (the active resume lists no work experience and the user has never edited it; adding a job or any edit by the user clears it), radar (the job radar is off, nothing is analysed yet, or it has new matches), interview_prep (a vacancy moved to Interview within 14 days), vacancy (an analysis from the last 72 hours, not applied to), saved (saved radar matches not analysed), revisit (the best-scored analysis of the last 14 days not applied to), cycle (none of these). |
| match | No | The radar match the step is about. On the saved step: the strongest one saved, not analysed and not known to be closed — the same one the end of the radar deck offers. On the radar step with new matches: the strongest one the user has not judged yet, which save_radar_match keeps. Null otherwise. |
| radar | Yes | off (the automatic daily search is off — get_radar_status.auto_search_enabled is false; matches already found stay), searching (on, with no new or saved match in the working list), matches (on, with at least one). |
| reason | Yes | Why this step, from the user's data. |
| app_url | No | Full link to step_path on the ResumeQuick site, opened after signing in to this account; null when paused. |
| vacancy | No | The vacancy the step is about (vacancy, revisit, interview_prep); null otherwise. |
| step_path | No | Path on the ResumeQuick site where the step is done, the same screen the home card opens; null when paused. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: the vacancy-step state machine (no step after applying until the employer answers, then it moves to new radar matches or another analysed vacancy) and the app_url deep link for where the step is performed.
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?
Front-loads the core purpose in the opening clause, then layers on the payload detail and lifecycle rule. The single dense sentence is a bit run-on and "Args: {}" is filler for an empty schema, but there is no padding or repetition.
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?
An output schema exists, so return values need not be explained, yet the description still characterizes the key fields (reason from their data, the vacancy and its inner step, app_url). With zero parameters and a declared read-only profile, an agent has everything needed to call this correctly.
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?
There are zero parameters and schema description coverage is 100%, so the baseline is 4; nothing about parameter meaning needs compensating. The trailing "Args: {}" adds nothing but also does no harm.
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 — "Get the user's one next step in the job search" — and pins it to the ResumeQuick home screen, so the agent knows exactly what this returns. It also enumerates the returned shape (step, reason, vacancy, step type, app_url). It never contrasts itself with adjacent readers like get_coach_plan or get_recent_activity, so sibling differentiation is implicit rather than stated.
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?
Usage is implied — this is the canonical 'what should I do next' call — but the description never says when to prefer it over get_coach_plan, get_recent_activity, or get_radar_matches, nor does it give any exclusion. The lifecycle note (after an application the vacancy has no step until the employer answers) clarifies the data, not the when-to-call decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_offerRead an offer analysisARead-onlyInspect
Full analysis of one offer: health score 0-10, verdict (negotiate / accept / decline) with its reasoning, each pay component against an estimated market range, red and green flags, leverage points with a current -> ask delta and the chance each lands, and four ready-to-send scripts (counter-offer email, reply when the budget is fixed, call talking points, polite decline). Status is 'processing' while the analysis runs and 'completed' once it is done. Market ranges are estimates, not the company's pay bands: each line carries a confidence (a low one claims no position), and market_assumptions names the country and hire type they were read for — say that once with the result. Returns 'not_found' for a missing or foreign offer id.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| role | No | |
| tone | No | |
| bonus | No | |
| error | No | Why the analysis failed, when status is 'failed'. |
| equity | No | |
| status | Yes | draft | extracting | processing | completed | failed |
| company | No | |
| scripts | No | |
| verdict | No | negotiate | accept | decline |
| benefits | No | |
| currency | No | |
| location | No | |
| is_pinned | No | |
| red_flags | No | |
| step_path | No | Path on the ResumeQuick site that opens on that reply; null without one. |
| tradeoffs | No | |
| created_at | No | |
| priorities | No | |
| reply_step | No | The reply this offer's verdict calls for, written and ready: counter_offer (negotiate), acceptance_note (accept), decline (decline). Its page opens on that reply. Null while the analysis runs or when the reply is not written. |
| vacancy_id | No | |
| analyzed_at | No | |
| base_salary | No | |
| green_flags | No | |
| is_archived | No | |
| weak_pushes | No | |
| health_score | No | |
| extra_context | No | |
| sign_on_bonus | No | |
| vacation_days | No | |
| comp_breakdown | No | |
| employment_type | No | employee | contractor | eor | freelance |
| has_source_text | No | Whether the user's original paste is stored. The text itself is never returned. |
| leverage_points | No | |
| verdict_summary | No | |
| employer_country | No | |
| candidate_country | No | ISO-2 country the market was read for. |
| market_assumptions | No | The market frame the estimates assume. Name it once when you share the result; ranges are estimates. |
| total_comp_current | No | 4-year total of the offer as it stands, added up from its pay lines; null when a pay line has no amount. |
| total_comp_negotiated | No | The same 4-year total if every ask with an amount lands; null when it cannot be added up. |
| candidate_country_source | No | Where that country came from: user | resume | radar | signup. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare a safe read; the description adds substantial context beyond that: the two status states the caller can observe, the 'not_found' result for missing or foreign offer ids, the caveat that market ranges are estimates rather than company pay bands, and the confidence field that can claim no position. That is exactly the kind of behavioral disclosure annotations cannot carry.
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?
Front-loaded with what the tool returns, then status behavior, then the estimate caveat and error case — a sensible priority order with no filler. The opening is a long, dense enumeration, but every listed artifact (scripts, deltas, confidence) tells the agent something actionable, so the length is largely earned.
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?
Given an output schema exists, the description could have stopped at purpose; instead it covers return contents, async status transitions, error behavior, and an important interpretive caveat about market estimates. An agent has everything needed to call this correctly and to interpret the response honestly.
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?
Only one parameter, and the description gives no syntax detail beyond the schema, but the schema's own property description ('Id of the offer to fetch, from list_offers or analyze_offer') covers the parameter meaning and provenance. With a single, schema-documented parameter there is little left for the description to add.
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?
Opens with a specific verb+resource ('Full analysis of one offer') and then enumerates exactly what the analysis contains (health score, verdict, pay components, flags, leverage points, scripts). This clearly distinguishes it from list_offers (which enumerates) and analyze_offer (which produces the analysis), so an agent can route correctly without opening the schema.
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 status semantics ('processing' while the analysis runs, 'completed' once done) implicitly tell the agent this is a poll/read tool that follows an analyze_offer call, and the schema's offer_id description names list_offers and analyze_offer as sources. However, the description never states explicitly 'call this after analyze_offer' or gives guidance about polling cadence, so the when-to-use context is strong but not fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pricingRead plans and pricesARead-onlyInspect
Get the current pricing catalog — subscription tiers and action packs with their USD prices, how many days one payment buys and whether it renews, the per-plan limits for free / sprint / career, and the user's current tier. Prices are the same for all users. This is the live source of ResumeQuick prices and limits.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| skus | No | All purchasable subscriptions and action packs. |
| plans | No | Per-tier plan limits (free, sprint, career). |
| currency | No | Currency of all prices. |
| current_plan | Yes | The user's current tier: 'free' | 'sprint' | 'career'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations: it identifies the tool as the live pricing source, specifies that prices are uniform across users, and lists the exact catalog dimensions returned.
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?
The description is front-loaded with 'Get the current pricing catalog' and then adds only relevant detail. Every clause earns its place by specifying what the catalog contains or how the data should be interpreted.
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 an output schema present and annotations covering safety, the description supplies enough context to call the tool correctly: it identifies the live source, the scope of pricing and limits, and the invariant that prices are the same for all users. Nothing material is missing for a zero-parameter read-only catalog 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?
The tool has zero parameters, so there is no parameter semantics for the description to clarify. The baseline for a parameterless tool is 4, and the description appropriately avoids discussing non-existent inputs.
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 and resource: 'Get the current pricing catalog.' It also enumerates the catalog contents (tiers, action packs, USD prices, duration, renewal, limits, current tier), so an agent can distinguish this from usage or plan-management siblings without opening the schema.
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 makes clear this is the live source of ResumeQuick prices and limits and notes that prices are the same for all users, which gives strong context for when to call it. However, it does not explicitly name alternatives such as get_usage or get_coach_plan or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profile_snapshotRead profile summaryARead-onlyInspect
Get a compact summary of the current user's primary resume — name, headline, location, top skills, last 2 experiences, and languages. Returns 'not_found' if the user has no resumes; an account that has not finished setting up its profile gets an empty summary with that fact instead.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| summary | No | |
| headline | No | |
| location | No | |
| languages | No | |
| top_skills | No | Up to 10, in the resume's own order (by category, then years of experience). |
| recent_experience | No | Up to 2 most recent experiences. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), and the description adds genuinely useful behavioral context beyond them: exactly which fields are returned and the two edge cases ('not_found' when no resumes exist; empty summary for an unfinished profile). It stops short of rate limits or auth requirements.
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 tightly written sentences with no waste. The core purpose and field list are front-loaded, and the edge-case behavior follows immediately after.
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?
An output schema exists, so return-shape explanation is not required, yet the description adds a field enumeration and covers the failure/empty-state paths. For a zero-parameter read tool, nothing an agent needs to call it correctly is absent.
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 there is nothing for the description to disambiguate and the baseline is 4. No parameter-level detail is needed or missing.
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?
Specific verb (Get) plus resource (compact summary of the current user's primary resume) with an enumerated field list. It is clearly distinguishable from heavier siblings like get_resume and list_resumes because it self-describes as a compact snapshot.
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 word 'compact' implies a lightweight overview use case versus a full-resume fetch, but it never names an alternative tool or states the condition for choosing this over get_resume/list_resumes. Usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_radar_matchesList job matchesARead-onlyInspect
List vacancies the user's job radar has found (automatic job search based on their resume), best match first. Each item carries title, company, location, match_grade (strong/possible/weak — the radar's rough fit; match_percentage is the same guess as a number and does not predict an analysis), the keywords behind it, the published salary when the board gave one, the applicant-tracking system behind the link, the level and employment type its title states (null when it states none), an opening snippet of the posting text and on_screen (whether the user has seen it in the app yet), analysis_id when this vacancy was already analyzed, with analysis_match_percentage once that analysis finished (get_vacancy_detail reads it at no cost; analyze_radar_match analyzes one that has none). The stored snippet is all the posting text we hold. Optional status: 'new' (not yet reviewed) or 'saved' (liked) pick one half of the active list; 'deferred' reads the put-off-for-later pile and 'archived' the Skipped pile — everything the user skipped or put away, latest first, and where delete_radar_match takes its ids from. Omit for new plus saved. Narrow with min_match, is_remote, source, posted_after (ISO date), has_analysis, seniority and employment_type — the last two come from the title, so a posting whose title says nothing is dropped by them: a small result means most titles were silent, not that such jobs are rare. Order with sort='fresh' (newest posting first) instead of the default best-match. total says how many matched the filters; offset pages past the 30-item cap. Empty list is a normal result, and the usual one before the first start_radar_scan.
| Name | Required | Description | Default |
|---|---|---|---|
| input | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | How many matches passed the filters in total — not how many this page returned. Without filters it equals get_radar_status.active (the active list is read up to its first 300). |
| matches | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly annotations, it discloses non-obvious behavior: the 30-item cap with offset paging, the total count, that match_percentage is a rough guess and not predictive of analysis, that the stored snippet is the full posting text held, and that title-derived filters (seniority, employment_type, posted_after) silently drop postings with no title/date signal.
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 ordering come first, and virtually every clause carries information (field meanings, filter pitfalls, paging). It is dense and reads as two long run-on paragraphs, which makes it harder to scan than a bulleted field list would be, but there is 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?
Covers what the list contains, the shape of each item, all filter semantics and their biases, paging, ordering, and the expected empty result. Even though an output schema exists, the extra notes about analysis_id/analysis_match_percentage and null-valued levels make the tool callable without further lookup.
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 description explains the practical meaning of status, the filter set, sort='fresh' vs the best-match default, and total/offset paging, adding semantic caveats (e.g. small results mean silent titles, not rare jobs) beyond the schema's own field descriptions. It does not mention the limit parameter's 1..30 range, which stays with the schema.
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?
Opens with a specific verb+resource ('List vacancies the user's job radar has found'), defines the radar as an automatic resume-based search, and states default ordering. It also names adjacent tools (get_vacancy_detail, analyze_radar_match, delete_radar_match) so an agent can separate this list tool from detail/analysis/mutation siblings.
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 conditions for each status value, says 'Omit for new plus saved', explains that the archived pile is where delete_radar_match takes its ids, and warns that an empty list is normal before start_radar_scan. What is missing is an explicit contrast with search_vacancies/get_recent_vacancies for non-radar browsing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_radar_statusRead job search statusARead-onlyInspect
State of the user's job radar: how many matches are in the working list, still waiting in the pool, saved, deferred or in the Skipped pile ('archived' counts what was skipped and what was put away); when a scan last brought something in; whether the daily automatic search is switched on; and the explicit search filters, if the user set any — the progress picture without paging through every match. last_scan_at moves when new vacancies arrive, so a scan that found nothing new leaves it unchanged. search_query is what the last scan actually searched for (role, place, country) — the role there came from the filters, career memory or the resume, so an empty filters.role does not mean the radar searched for no role; search_query.role is the title the boards were searched with and search_query.role_display the same role in the user's own words, as typed in the filters; search_role is what the next scan searches for (null: nothing names a role yet). next_scan_at is set only on the free plan while its one scan a week is spent. All zeros with auto_search_enabled=false is the normal answer for someone who has never used the radar.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| saved | No | |
| active | Yes | Matches in the working list right now (new plus saved). |
| filters | No | Explicit search filters, when the user set any. They outrank the resume. |
| archived | No | |
| deferred | No | |
| search_role | No | The title the next scan searches for: the role from the filters, career memory or the resume, spelled the way job boards spell it once a scan has derived the search profile for this resume and role; before that, the role as set. Null means nothing names a role — a scan would fail with role_unknown until the user gives one. |
| last_scan_at | No | ISO timestamp of the most recent match found by a scan; null if the radar never ran. |
| next_scan_at | No | Free plan only, while its one scan a week is spent: ISO timestamp of when the next scan becomes available. Null when a scan is available now or the plan is paid (a paid plan's scans come back the next day). |
| search_query | No | What the last scan actually searched for — the role, place and country the radar settled on from filters, career memory, the resume and, when nothing else named one, the country the user signed up from. Null before the first scan. It stays after the filters or the resume change until the next scan, so it can differ from filters and search_role, which is what the next scan will run. The role here is what the scan searched for even when filters.role is empty. |
| pool_remaining | Yes | Found but not yet shown to the user — what a fresh look would reveal. |
| auto_search_enabled | Yes | Whether the daily automatic scan and its digest are on for this user. |
| search_paused_until | No | ISO timestamp the user's search pause ends, null when there is none. While paused, nothing the product starts on its own reaches them and the daily scan does not run. set_search_pause with months=null lifts it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe read-only operation, and the description adds substantial behavioral context beyond them: last_scan_at only moves when new vacancies arrive, next_scan_at is set only on the free plan when the weekly scan is spent, and all zeros with auto_search_enabled=false is normal for a never-used radar. These are important interpretive traits that an agent would not get from the annotations alone.
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?
The description is front-loaded with the core status categories and then adds only field-specific interpretation. It is dense and longer than many definitions, but nearly every sentence clarifies a real ambiguity such as search_query versus search_role or why filters.role may be empty.
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?
Given the output schema and read-only annotations, the description is complete enough for correct invocation and interpretation. It covers the status categories, edge cases, plan-specific behavior, and the distinction between filters, last scan query, and next scan role.
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 has zero parameters, so the schema cannot provide parameter-level semantics and the description does not need to compensate. The baseline for a zero-parameter tool is 4, and the description appropriately focuses on returned state rather than inventing parameter guidance.
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 read operation and enumerates exactly what the status contains: working-list matches, pool, saved, deferred, skipped, last scan, auto-search, filters. It clearly distinguishes this summary view from paging through individual matches, making it easy to separate from siblings like get_radar_matches.
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 provides clear context for when to use this tool by framing it as 'the progress picture without paging through every match,' which implicitly points to get_radar_matches as the detailed alternative. However, it does not explicitly name that sibling or state any when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_activityRead recent activityARead-onlyInspect
List the user's recent profile-affecting events — resumes created or updated, vacancies analyzed (archived analyses included), mock interviews completed — within the last days (default 30, max 180), newest first, at most limit of them (default 20, max 50). Empty list is a normal result.
| Name | Required | Description | Default |
|---|---|---|---|
| input | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| range | Yes | |
| events | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/destructive/openWorld, so the bar is lower; the description still adds real behavior: newest-first ordering, archived analyses included, and that an empty list is a normal result rather than an error. It is silent on whether results are ever truncated beyond `limit`, but the added context is substantive.
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?
Front-loaded with verb and resource, then the event enumeration, then the window/limit constraints, closing with the empty-result note. Dense but every clause carries information; the single long first sentence is the only mild readability cost.
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?
An output schema exists, so return field details needn't be described. The description supplies scope, ordering, defaults, caps, and the empty-result behavior, which is enough for a zero-required-parameter read tool; only truncation/pagination behavior beyond `limit` is left implicit.
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?
With schema description coverage reported at 0%, the description must carry the parameter burden and largely does: it restates the look-back window default and cap, the result-count default and cap, and the ordering. It doesn't clarify invalid-value handling (e.g., days > 180), which is the only remaining gap.
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?
Specific verb (list) plus a clearly scoped resource (recent profile-affecting events), with the included event types enumerated: resumes created/updated, vacancies analyzed, mock interviews completed. An agent can distinguish this from get_recent_vacancies or get_resume_history without opening a schema.
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?
Usage is implied by 'profile-affecting events' and the recency window, which hints at a dashboard-style summary rather than a per-entity lookup. However, no sibling is named and no when-not-to-use guidance is given, despite close neighbors like get_recent_vacancies and get_resume_history where routing matters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_vacanciesList tracked jobsARead-onlyInspect
List the user's tracked vacancies, pinned first (is_pinned), then newest by analyzed_at: finished fit analyses (match percentage, verdict, key strengths and gaps) and vacancies tracked without an analysis (analysis_status 'none', match fields null). Vacancies with an analysis still running or failed are not listed. Filters: tracker status, analysis_status. total says how many match in all. Default limit 10, max 50. Empty list is a normal result.
| Name | Required | Description | Default |
|---|---|---|---|
| input | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | How many vacancies match in all; vacancies holds at most limit of them. |
| vacancies | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real behavioral context beyond that: ordering semantics, exclusion of in-flight/failed analyses, the meaning of 'total' across all matches, and the default/max limit. It stops short of describing pagination or response shape in depth, but the additions are meaningful.
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?
Front-loads the core purpose and ordering rule, then failure-mode and filter details. Sentences are dense but each carries information; nothing is wasteful, though the run-on second sentence could be split.
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 an output schema present, the description needn't enumerate return fields, yet it still names what analyzed vacancies include (match percentage, verdict, strengths/gaps) and explains total and empty-list semantics. An agent has everything needed to call and interpret this correctly.
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 reported as 0%, so the description must carry parameter meaning. It covers the analysis_status and status filters plus limit defaults/caps, but omits the 'archived' parameter entirely, leaving one of the filters unexplained in prose. Partial compensation, so a 3.
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 ('List the user's tracked vacancies') and immediately pins down the scope: pinned first, then newest by analyzed_at, with which analysis states are included vs excluded. This clearly distinguishes it from siblings like search_vacancies or get_vacancy_detail.
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 concrete selection context: vacancies with running/failed analyses are not listed, filters are tracker status and analysis_status, and an empty list is normal. It does not explicitly name an alternative sibling (e.g., search_vacancies for un-tracked results), so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resumeRead a resumeARead-onlyInspect
Get a specific resume by id, including all 12 editable sections (full_name, title, contacts, summary, experience, education, skills, projects, languages, interests, publications, references) plus the current visual style. Sections use the exact shapes and field names update_resume_section accepts, and every list entry carries an 'id' to echo back in edits. Returns 'not_found' if the resume does not exist or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| undo | No | Set only by an edit that changed something: the versions around it. |
| style | No | Current visual style. Read-only here; change via set_resume_style. |
| title | No | Professional title/headline (section: title). |
| skills | No | |
| summary | No | |
| contacts | No | |
| language | No | Locale code the resume content is written in, e.g. en_EN. Not the spoken languages list. |
| projects | No | |
| education | No | |
| full_name | No | Person's full name (section: full_name). |
| interests | No | |
| languages | No | |
| experience | No | |
| references | No | |
| updated_at | No | |
| resume_name | Yes | Document name shown in list_resumes; change it via rename_resume, not update_resume_section. |
| publications | No | |
| content_version | No | Content version of this read: a hash of the content, so equal content gives an equal version, also across copies. Entry ids belong to it; update_resume_section takes it as expected_content_version and answers 'resume_changed' once the resume has changed since. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral detail: the exact structure returned, the presence of 'id' fields for edits, the not_found condition, and the ownership constraint ('does not belong to the current user'). This goes beyond what annotations alone provide.
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?
The description is front-loaded with the core action and return structure, then adds useful context about edit compatibility and error handling. It is a bit dense but every sentence adds value. Could be slightly more concise, but no wasted words.
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?
Given that an output schema exists, the description needn't detail return values, but it helpfully summarizes them. It covers the ownership constraint and not_found behavior. However, it does not mention any potential pagination or size limits, and the parameter semantics are thin. Overall, it is complete enough for a read tool with annotations and output schema.
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 must compensate. It does mention that the resume is identified by id and that sections use field names accepted by update_resume_section, but it doesn't explain the format or constraints of the resume_id parameter itself beyond what the schema title implies. The schema provides the field name 'resume_id' with a description, but coverage is low. Baseline 3 is appropriate given the description partially compensates by linking to other tools.
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 clearly states it retrieves a specific resume by id and enumerates exactly what is returned (12 sections plus style). It distinguishes itself from siblings like list_resumes and get_resume_revision through the scope and detail of the return payload. However, it doesn't explicitly contrast with get_resume_history or get_resume_pdf_url, leaving minor ambiguity.
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?
Usage is implied (call this when you need the full resume by id), but there is no explicit when-to-use versus alternatives like list_resumes or get_resume_revision. The description mentions the not_found return condition, which gives some context, but no exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resume_historyList resume versionsARead-onlyInspect
List the saved versions of a resume, newest first; each version is the resume content as saved at that moment. Per version: when it was saved, what produced it (the user's editor, an agent edit, an AI rewrite, an import, a restore…), entry counts per section and which sections changed against the version before, so the version where missing content was last present can be found by its counts. Returns 'not_found' if the resume does not exist or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| resume_id | Yes | |
| revisions | No | Newest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and closed-world scope, so the safety profile is covered. The description adds real behavioral context beyond that: newest-first ordering, what each entry contains (timestamp, producer/origin, per-section counts, diff flags), and the 'not_found' outcome for a missing or non-owned resume.
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?
Front-loaded with the core action and ordering, then the per-version payload, then the error case. The dense semicolon-chained sentence is information-rich rather than padded, though it borders on overstuffed for a single sentence.
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?
Covers ordering, content semantics, producer/origin enumeration and error behavior, which is more than enough for an agent to call it correctly; the output schema already handles return shape. Missing only pagination/truncation behavior for the limit parameter and any auth note.
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 description contributes no parameter-level detail; it never mentions resume_id or limit. The schema itself does document both fields (range 1..50, default 20, resume id from list_resumes), so the structured data carries the load, but the description neither compensates nor adds syntax, ownership, or pagination semantics of its own.
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 with scope ('List the saved versions of a resume, newest first') and clarifies what a version is ('the resume content as saved at that moment'), which cleanly separates it from get_resume (current content) and list_resumes (the resume list itself). An agent can pick this over its nearest siblings without opening a schema.
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 a concrete use case — locating the version where missing content was last present via entry counts — which tells the agent when this tool is the right one. It stops short of naming an alternative for restoring that version (restore_resume_revision) or excluding cases where get_resume_revision would suffice, so it is clear context without explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resume_linkGet resume share linkARead-onlyInspect
Read whether a resume has an open public link on ResumeQuick.app (ResumeQuick.app/r/…), its address and which version of the file it shows. Creates nothing and spends nothing; share_resume_link creates or updates the link and close_resume_link closes it. Returns 'not_found' if the resume does not exist or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The open link on ResumeQuick.app; null without one. |
| has_link | Yes | True when the resume has an open public link. |
| file_name | Yes | The name the file downloads under, e.g. Jane_Doe_Resume.pdf. |
| resume_id | Yes | |
| is_current | Yes | False when the resume changed after the file the link shows was made. |
| page_count | Yes | Pages in the file the link shows; null without a link. |
| follows_latest | Yes | True on a paid plan: the link shows the newest file. False on the free plan: it shows one version. |
| version_made_at | Yes | ISO 8601 UTC moment the file the link shows was made — its version, as in 'version of Oct 2'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds genuine behavioral context on top: the 'not_found' error condition for a missing or non-owned resume, and the fact that it 'creates nothing and spends nothing.' It stops short of describing pagination or the full return shape.
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 tight sentences: the first front-loads the action and what is returned, the second handles the alternatives and the error case. 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?
An output schema exists, yet the description still flags the meaningful error return ('not_found'). Combined with the sibling routing and the read-only framing, an agent has everything needed to call this correctly.
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 description does not itself discuss resume_id, but the parameter is documented in the schema as 'Resume id, as returned by list_resumes.' With a single well-described parameter, the schema carries the semantic load, which lands at the baseline 3.
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 (read) plus resource (a resume's public share link) and enumerates the returned scope: whether a link is open, its address, and which file version it shows. It distinguishes itself from the sibling mutation tools share_resume_link and close_resume_link by name.
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?
Explicitly routes the agent: this tool only reads, share_resume_link creates/updates, and close_resume_link closes. The when-to-use and the when-to-use-something-else conditions are both spelled out, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resume_pdf_urlGet resume PDF linkARead-onlyInspect
Get the latest downloaded PDF of a resume — what the user actually gets when they download it: its file name, pages, when it was made, and an address on ResumeQuick.app that saves it for 60 minutes (expires_at). The address is the user's own copy and creates no public link; share_resume_link makes the link for other people. Returns 'not_generated' when no download has been made yet (export_resume_pdf makes one in a few seconds), and 'not_found' if the resume does not exist or does not belong to the current user. is_current says whether the file still matches the resume as it is now.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| made_at | Yes | ISO 8601 UTC moment this file was made. |
| pdf_url | Yes | Address on ResumeQuick.app that downloads the file without signing in, until expires_at. It is the user's own copy, not a link for other people (that one is share_resume_link). |
| file_name | Yes | The name the file saves under, e.g. Jane_Doe_Resume.pdf. |
| resume_id | Yes | |
| expires_at | Yes | ISO 8601 UTC moment the address stops working; a new call gives a fresh one. |
| is_current | Yes | False when the resume, its style or the ResumeQuick template changed after this file was made; export_resume_pdf then makes a current one (free when only the template changed). |
| page_count | Yes | Pages in the file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnlyHint=true, destructiveHint=false, openWorldHint=false), but the description adds real behavior beyond them: the URL lives for 60 minutes (expires_at), it is the user's private copy that creates no public link, and it enumerates the two failure statuses plus the meaning of is_current.
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?
Front-loaded with the core definition before branching into alternatives and status codes. Dense but each clause carries distinct information; the parenthetical status explanations are tightly integrated rather than padded.
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?
An output schema exists, so return structure needn't be documented, yet the description still explains the key status values and the is_current flag. Combined with the private-vs-public distinction and expiry, an agent has everything needed to call and interpret this correctly.
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?
There is a single parameter (resume_id) whose meaning is already carried by the schema field description ('Resume id, as returned by list_resumes'). The tool description adds no additional semantics for it, so with only one param this lands at the baseline.
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 ('Get the latest downloaded PDF of a resume') and immediately defines what the artifact contains (file name, pages, made date, URL). It distinguishes itself from siblings by naming share_resume_link and export_resume_pdf, so an agent can tell them apart without opening any schema.
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?
Explicitly routes the agent: use share_resume_link to make a link for other people, and export_resume_pdf when no download exists yet. It also defines the exact conditions producing 'not_generated' and 'not_found', which is the when-not guidance most tools lack.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resume_revisionRead a resume versionARead-onlyInspect
Get one saved version of a resume (revision_id from get_resume_history) with all 12 sections in the shape get_resume returns. Entry ids here belong to that old version: to bring one entry back, send it to update_resume_section as a new entry without its id; to bring the whole version back, use restore_resume_revision. Returns 'not_found' if the resume or the version does not exist or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| undo | No | Set only by an edit that changed something: the versions around it. |
| style | No | Always null: a version keeps content only; the resume's current style is in get_resume. |
| title | No | Professional title/headline (section: title). |
| skills | No | |
| summary | No | |
| contacts | No | |
| language | No | Locale code the resume content is written in, e.g. en_EN. Not the spoken languages list. |
| projects | No | |
| revision | Yes | |
| education | No | |
| full_name | No | Person's full name (section: full_name). |
| interests | No | |
| languages | No | |
| experience | No | |
| references | No | |
| updated_at | No | |
| resume_name | Yes | Document name shown in list_resumes; change it via rename_resume, not update_resume_section. |
| publications | No | |
| content_version | No | Content version of this read: a hash of the content, so equal content gives an equal version, also across copies. Entry ids belong to it; update_resume_section takes it as expected_content_version and answers 'resume_changed' once the resume has changed since. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is known; the description goes further by disclosing the critical gotcha that entry ids belong to the old version and must be stripped before reuse, and by stating the 'not_found' failure condition including the ownership check. It stops short of describing pagination or output volume, but adds real behavioral value beyond the annotations.
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 sentences, front-loaded with purpose, then the cross-version id caveat, then the error contract. Every sentence earns its place, though the restore-path sentence is dense enough that it could be split for readability.
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 an output schema present, return shape need not be explained; the description nonetheless covers id provenance, the version-vs-entry restore semantics, and the not-found/ownership failure mode. An agent has everything needed to call this correctly.
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?
Only one nested input parameter, and the description explains where revision_id originates (get_resume_history), reinforcing the schema's own field note. resume_id's provenance is left to the schema, which is a minor gap but not a material one for a single required parameter.
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 ('Get one saved version of a resume') and scopes it against siblings by tying revision_id to get_resume_history and describing the shape as identical to get_resume. An agent can distinguish this from get_resume, get_resume_history, and restore_resume_revision without opening any schema.
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?
Explicitly routes the agent: use update_resume_section (resending the entry without its id) to restore a single entry, and restore_resume_revision to bring back the whole version. The creation path for revision_id is named (get_resume_history), so prerequisites are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resume_suggestionsRead resume improvement suggestionsARead-onlyInspect
Get a prioritized list of concrete improvements for a resume by id, each tagged with the section it applies to (formatting, content, completeness, length) and a priority. Highest-impact issues first. The suggestion text is in English, whatever the resume's language. score_resume gives the numeric assessment. No quota — the resume_suggestions action in get_usage belongs to request_vacancy_resume_suggestions. Returns 'not_found' if the resume does not exist or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| resume_id | Yes | |
| suggestions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive, closed-world), and the description adds substantial context beyond them: English-only output regardless of resume language, no quota, and a 'not_found' error for missing or non-owned resumes. Ownership and error semantics are exactly the kind of thing annotations can't express.
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 output shape are front-loaded, followed by disambiguation and error behavior. Every clause earns its place, though the quota/get_usage aside is a slight tangent that adds density.
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?
Despite an output schema, the description still conveys ordering ('highest-impact first'), tagging (section + priority), language behavior, quota status, and the not_found case. Nothing an agent needs to call it correctly is missing.
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?
Only one parameter (resume_id) and the description adds little beyond 'by id'; the schema itself already documents it as 'Resume id, as returned by list_resumes'. With 0% description coverage but a self-evident single param, this is the minimum-viable baseline.
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+scope: 'Get a prioritized list of concrete improvements for a resume by id'. It also distinguishes itself from score_resume (numeric assessment) and request_vacancy_resume_suggestions, so an agent can route without opening schemas.
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?
Explicitly names alternatives and the condition selecting them: 'score_resume gives the numeric assessment' and 'the resume_suggestions action in get_usage belongs to request_vacancy_resume_suggestions'. This tells the agent both when to use this tool and when a sibling is the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_task_statusCheck a background taskARead-onlyInspect
Report a background task by the task_id a tool returned (create_profile, translate_resume, request_resume_update, export_resume_pdf, start_radar_scan, apply_vacancy_resume_suggestions, generate_cover_letter and the analyze_* tools): status processing | completed | failed | cancelled, progress, on failure the reason, and on success what it produced — the new resume's resume_id, the translated copy's resume_id, the resume_id a rewrite changed (get_resume reads it) and the sections it kept as they were (guarded_sections), whether the PDF is ready, how many postings a scan found, the app_url of a written cover letter. Returns 'not_found' if the task does not exist or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| type | Yes | What the task does, e.g. 'resume_translation', 'resume_update', 'pdf_generation', 'radar_scan', 'apply_suggestions', 'vacancy_analysis', 'resume_suggestions', 'cover_letter_generation', 'offer_analysis'. |
| error | No | Set when status is 'failed'. |
| result | No | Set when status is 'completed'. |
| status | Yes | 'processing' covers a task waiting in the queue and one running. |
| task_id | Yes | |
| progress | No | 0–100 while it runs, when the task reports it. |
| created_at | Yes | When the task was started, ISO 8601. |
| completed_at | No | When it finished or failed, ISO 8601. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, non-destructive, closed-world behavior. The description adds substantial behavioral detail: statuses, progress, failure reasons, success artifacts mapped to task types, and a not_found result for missing or unauthorized tasks.
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?
The purpose is front-loaded and the definition is information-dense with little waste. However, it is a single very long sentence with a large parenthetical list and many semicolon-like clauses, making it harder to scan than it could be.
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?
Given the simple one-parameter input, existing output schema, and read-only annotations, the description provides all the context an agent needs. It covers valid sources of task_id, lifecycle states, failure behavior, success outputs by task type, and missing/unauthorized behavior.
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 low, so the description has to compensate for the single task_id parameter. It does so by explaining that task_id is the value returned by specific background tools and by tying that parameter to the not_found ownership behavior.
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 and resource: report a background task by task_id. It distinguishes this tool from siblings by naming the producer tools whose task_ids it tracks and by explaining the status/progress/result information returned.
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 clearly says to use the task_id returned by a tool that runs in the background and lists many such tools. It does not explicitly state when not to use it or name alternative status-checking tools, but the surrounding context makes its role clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usageRead my usage and limitsARead-onlyInspect
Get the user's own use of their plan: for each limited action, how many uses the current period counted, the allowance, and how many are available now; when a calendar period (day, month) resets, and for rolling windows (week, 30 days) when the oldest use drops out; bonus and pack credits, which buy uses beyond an allowance; and when a paid plan or trial ends. A resume generated in the background from text or answers (create_profile, the web onboarding) counts against resume_generation. Radar scans are not bought with bonus or pack credits. The actions listed are the same ones get_pricing gives limits for. Plan prices and the limits of other plans are in get_pricing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | Yes | The user's current tier: 'free' | 'sprint' | 'career'. |
| items | Yes | One row per action the plan limits. |
| credits | Yes | Bonus and pack credits, which buy uses beyond an action's allowance on any plan; null when there are none. |
| plan_ends_at | Yes | ISO 8601 UTC moment the paid plan or trial ends and the account returns to free; null on free. Whether a plan renews is the auto_renews of its SKU in get_pricing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered, and the description still contributes substantive behavior: reset semantics for calendar vs rolling windows (oldest use drops out), that bonus/pack credits buy uses beyond an allowance, that background-generated resumes count against resume_generation, and that Radar scans are excluded from credit spending.
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?
The payload is front-loaded in the first clause (own use of the plan, per limited action) and each following clause carries distinct semantic content about resets, credits, and plan expiry. It is dense and somewhat long, but nearly every clause earns its place; the return-value detail overlaps with the output schema.
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 an output schema present, the description need not restate return shape, yet it still supplies the domain semantics an agent needs: what a limited action is, how periods and rolling windows reset, which activities consume allowances, and where to go for pricing. Nothing required to call or interpret the tool is missing.
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?
Zero parameters, so there is no schema surface for the description to compensate for; baseline 4 applies. The description also scopes the result set implicitly by talking only about the caller's own plan rather than arbitrary users.
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 (the user's own usage of their plan) and enumerates exactly what is returned: per-action counts, allowances, availability, reset timing, bonus/pack credits, and plan/trial end dates. It is clearly differentiated from the sibling get_pricing, which covers prices and other plans' limits.
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?
Names the alternative explicitly: prices and other plans' limits live in get_pricing, while this tool covers the caller's own usage and the same limited actions get_pricing enumerates. The condition that selects one tool over the other is stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_statsRead job search statsARead-onlyInspect
Get a compact numeric summary of the user's activity over the last period_days (default 30, max 180): applications_count (vacancies the user marked as sent in the tracker), analyses_count (vacancies analyzed, archived analyses included) and avg_match_score, interviews_count and avg_interview_score, plus resumes_count (the user's total resumes, not windowed). Zero counts and zero averages are a normal result for a new user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| period_days | Yes | The window (in days) actually applied to the activity counts. |
| resumes_count | Yes | Total resumes the user currently has (not limited to the window). |
| analyses_count | Yes | Vacancy analyses completed within the window, archived ones included. |
| avg_match_score | Yes | Average match percentage across those analyses (0-100); 0 if none. |
| interviews_count | Yes | Mock interviews completed within the window. |
| applications_count | Yes | Vacancies the user marked as sent within the window (moved from new to applied, interview, offer or accepted in the tracker); each vacancy counts once. |
| avg_interview_score | Yes | Average interview score across those interviews (0-100); 0 if none. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false, and openWorldHint=false, so safety is covered. The description still adds real value beyond that: window semantics (default 30, max 180), the fact that resumes_count is never windowed, and the reassurance that zero counts/averages are normal for new users.
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 dense paragraph that front-loads the purpose and window semantics before listing returned metrics. The long enumeration of fields is somewhat run-on but every clause is informative.
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?
Although an output schema exists so return values need not be re-explained, the description's coverage of window semantics, the non-windowed resumes_count, and the zero-result caveat makes it self-sufficient for correct invocation. Nothing an agent needs to call it is missing.
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?
Reported schema coverage is 0%, so the description must carry the parameter meaning, and it does: period_days defaults to 30, is capped at 180, scopes the activity counts, and explicitly excludes resumes_count from windowing. It does not cover validation/error behavior for out-of-range values, keeping it short of 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 gives a specific verb+resource ('compact numeric summary of the user's activity') and enumerates exactly what is summarized, which implicitly separates it from event-listing siblings like get_recent_activity or get_usage. It never names an alternative sibling explicitly, so differentiation is inferred rather than stated.
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?
Usage context is implied (read aggregate activity over a look-back window) and the default/cap are given, but there is no explicit when-to-use versus when-not guidance and no pointer to alternatives such as get_recent_activity for event-level detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vacancy_detailRead a job analysisARead-onlyInspect
Get one vacancy fit analysis by id, with match percentage, verdict, key strengths, gaps, recommendations, and a skill-by-skill requirements comparison, and app_url — the vacancy's page in ResumeQuick. Returns 'not_found' if the analysis does not exist or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| url | No | Link to the original job posting, when known. |
| notes | No | The user's notes on this vacancy. |
| title | Yes | Vacancy title (often includes company, e.g. 'Backend Engineer at Acme'). |
| status | No | Job-tracker status: 'new' | 'applied' | 'interview' | 'offer' | 'rejected' | 'accepted'. |
| app_url | Yes | Link to this vacancy's page in ResumeQuick, opened after signing in to this account; with a cover letter written it opens on the Cover Letter tab that keeps the letter. |
| company | No | Company name, when known. |
| key_gaps | No | Gaps in the CANDIDATE relative to the posting. Never carries remarks about the posting text itself — those live in input_quality. |
| location | No | Job location, when known. |
| is_pinned | No | The user pinned it to the top of their tracker; lists put pinned vacancies first. |
| step_path | No | Path on the ResumeQuick site where vacancy_step is done; null without one. |
| analyzed_at | Yes | ISO 8601 timestamp of when the vacancy was analyzed or, if never analyzed, added. |
| is_archived | No | Archived vacancies are hidden from the user's main list. Only an archived one can be deleted. |
| vacancy_step | No | The step inside this vacancy, the same one its page shows: tailor, cover_letter, apply, interview (it is at Interview), another (the analysis advises against it — the user's own next step from get_next_step is the one to take), or null (the analysis is not ready, or the case waits for the employer after an application). |
| input_quality | No | Quality of the posting text this analysis was based on. When truncated is true the score came from a fragment; analyze_tracked_vacancy re-runs it on the full text. |
| key_strengths | No | Strong points matching the vacancy. |
| status_history | No | Job-tracker status changes, oldest first; the history keeps the newest 100 events. |
| analysis_status | No | 'completed' — analyzed; 'none' — tracked, never analyzed (match fields are null); 'processing' — an analysis is running right now; 'failed' — the last analysis failed. Lists only return 'completed' and 'none'; get_vacancy_detail returns every state. |
| chances_summary | No | Short prose verdict on chances (e.g. 'Strong fit, apply soon'). |
| has_description | No | Whether the posting text is stored on this vacancy (the text itself is never returned). False means it cannot be analyzed until the text is added — analyze_tracked_vacancy takes it as 'description'. |
| recommendations | No | Actionable steps to improve fit for this vacancy. |
| tailored_resume | No | The tailored resume copy linked to this vacancy, if one exists (created by apply_vacancy_resume_suggestions with target='copy' or create_resume_version with vacancy_id). |
| verdict_summary | No | Final verdict — 1–3 sentences explaining the recommendation. |
| has_cover_letter | No | Whether a cover letter for this vacancy is already written and kept on its Cover Letter tab (the text itself is never returned). cover_letter_stale true means it predates the latest re-analysis. |
| match_percentage | No | 0–100, computed by the analysis; null for never-analyzed manual entries. |
| verdict_category | No | One of 'apply' | 'consider' | 'skip' | 'not_eligible' | 'invalid', or null if not categorized. 'not_eligible' means a hard eligibility blocker applies — the user cannot take this role as posted no matter how high match_percentage is; eligibility_blockers carries the reason. |
| skills_comparison | No | Skill-by-skill comparison of resume vs. vacancy requirements (the structured requirements view). |
| cover_letter_stale | No | The stored cover letter was written before the vacancy was analyzed again. |
| resume_suggestions | No | Structured resume-improvement suggestions for this vacancy, if generated. Empty until request_vacancy_resume_suggestions has run and completed. Their list order is the index space for apply_vacancy_resume_suggestions. |
| cover_letter_options | No | The options the stored cover letter was written with; null when there is no letter or it predates kept options. generate_cover_letter reuses each one it is not given. |
| eligibility_blockers | No | Why the user may not be able to take this role at all — work model, location, timezone, work authorization, relocation. Separate from skill fit and never reflected in match_percentage. Any 'hard' blocker means verdict_category is 'not_eligible', whatever the match score. Empty when nothing is known about the user or nothing conflicts. |
| applied_suggestion_indices | No | Indices (into resume_suggestions) that have already been applied to the resume. |
| declined_suggestion_indices | No | Indices (into resume_suggestions) of questions the person answered no to — the experience they ask about is not theirs. |
| unchanged_suggestion_indices | No | Indices (into resume_suggestions) whose last apply changed nothing: the resume states nothing they build on yet. Applying them again changes nothing until the resume gains what they need. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/non-destructive/closed-world, but the description adds real value beyond them: it discloses the per-user scoping ('does not belong to the current user') and the exact 'not_found' failure signal, which the agent can't infer from annotations. No rate limits or pagination concerns apply to a single-record fetch.
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 front-loaded sentence: resource and identifier first, payload second, failure mode last. The return-field enumeration is somewhat redundant given an output schema exists, but it's compact and aids tool selection.
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 an output schema present, the description needn't explain return shape, and it correctly focuses on the not_found/ownership semantics instead. The one gap is the missing link to the sibling that produces the analysis in the first place, which would remove the remaining ambiguity.
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 carries the burden, yet it only says 'by id' and never explains what a vacancy_id is, where to obtain it (analyze_vacancy output? get_recent_vacancies?), or whether it accepts the tracked-vacancy id. The one parameter's origin is the most likely source of a failed call and is left undocumented.
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 ('Get one vacancy fit analysis by id') and enumerates the payload (match percentage, verdict, strengths, gaps, recommendations, skill comparison, app_url). It's clearly a read of an existing analysis, but it never names the sibling that creates one (analyze_vacancy / analyze_tracked_vacancy), which is the main ambiguity given how many 'analyze_*' tools exist.
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?
Usage is only implied: fetching a single analysis by id. There is no statement of when to prefer this over analyze_vacancy, get_recent_vacancies, or search_vacancies, and no prerequisite mentioned (e.g. that the analysis must already exist). The id-origin hint ('as returned by other vacancy tools') lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_offersList job offersARead-onlyInspect
List the job offers the user has had analysed, newest first: company, role, base salary, offer health 0-10 and the verdict (negotiate / accept / decline). An offer still being worked on shows status 'processing' with a null score. archived: true reads the archive instead. get_offer(offer_id) holds the full verdict, the market comparison and the negotiation scripts.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| offers | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description still adds real behavioral context beyond them: newest-first ordering, the 'processing' status with a null score for in-flight offers, and that `archived` switches the read to a different collection entirely.
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 dense sentences, no filler. Output fields come first because they drive tool selection, then the ordering/status edge case, then the archive flag, with the escalation path (get_offer) last – a well front-loaded structure.
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?
An output schema exists, so return values need not be documented, yet the brief field summary is exactly what an agent needs to pick this list tool over its siblings. Combined with the archive switch and the processing/null-score edge case, nothing needed to call it correctly is missing.
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?
Reported schema description coverage is 0%, so the description has to carry the load, and it does: `archived: true reads the archive instead` explains the flag's effect in plain terms and 'newest first' explains the ordering that `limit` paginates. It does not restate the 1-50 bound on `limit`, a minor omission.
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?
Specific verb + resource ('List the job offers') with an explicit scope ('the user has had analysed'), plus an enumeration of the returned fields (company, role, base salary, health 0-10, verdict). It clearly separates itself from siblings get_offer (full verdict detail) and analyze_offer (which produces the analysis), so an agent can choose it without reading schemas.
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 concrete usage context: newest-first ordering, the `archived: true` variant, and an explicit pointer to get_offer(offer_id) when the full verdict, market comparison and negotiation scripts are needed. It stops short of stating when NOT to call it (e.g. when no analysis exists yet), so it is clear context rather than full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_remindersList remindersARead-onlyInspect
List the user's active reminders, soonest first. Times are on the user's local wall clock. Each carries the id cancel_reminder takes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| reminders | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe read (readOnlyHint=true, destructiveHint=false, openWorldHint=false). The description adds genuine behavioral context beyond that: results are restricted to active reminders, sorted soonest-first, and timestamped on the user's local wall clock — the timezone detail in particular is non-obvious and not in the structured fields.
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 short sentences, front-loaded with what is listed and the ordering, followed by the two details an agent actually needs (timezone basis, id usability). No filler or repetition of the title.
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 an output schema present, return-value shape need not be described, and the three behavioral facts the schema cannot convey — active-only filtering, sort order, and local-clock times — are all covered. Nothing needed to call this correctly is missing.
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 there is nothing for the description to disambiguate; the baseline for a 0-param tool is 4. The note about what the returned id is used for is a useful touch but does not concern input parameters.
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 ('List the user's active reminders'), plus scope ('active') and ordering ('soonest first'), so the agent knows exactly what comes back. It also links to the sibling cancel_reminder by noting the returned id is what that tool takes, which disambiguates it from cancel_all_reminders and create_reminders.
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?
Usage is implied through the 'active reminders' scope and the pointer to cancel_reminder's id, which sketches a list-then-cancel workflow. However, there is no explicit when-to-use or when-not statement against the many sibling tools, so the guidance remains inferential rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_resumesList resumesARead-onlyInspect
List all resumes belonging to the current user. Returns id, title (the document name, same as resume_name), last-updated timestamp and whether it is the active resume — the ids get_resume takes. Empty list is a normal result.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| resumes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds real value beyond that: it enumerates the returned fields, identifies get_resume as the consumer of the ids, and clarifies that an empty list is a normal (non-error) result.
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 tight sentences, front-loaded with the core action, then the return fields and the empty-list caveat. Every clause carries information, though the field enumeration is somewhat list-like.
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?
An output schema exists, so return values need not be restated, yet the description still summarizes them usefully. For a zero-parameter read tool with full annotation and output-schema coverage, the description is complete; only explicit sibling routing is missing.
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, which is the baseline-4 case. Nothing is required of the description here, and it correctly avoids inventing parameter semantics.
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: 'List all resumes belonging to the current user'. It also links its output to the get_resume sibling, clarifying the relationship. It does not explicitly differentiate from other list-style siblings, but the purpose is unambiguous.
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?
Usage is implied rather than stated: the note that the returned ids are 'the ids get_resume takes' hints at the discover-then-fetch flow. There is no explicit when-to-use/when-not guidance or named alternative, so it lands at the implied-usage baseline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_coach_planPause the weekly planAIdempotentInspect
Put the user's weekly plan on hold: it is kept as it is and marked paused until set_coach_plan resumes it. No quota. Errors: not_found when no plan was agreed. Args: {}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | Yes | null when the user has not agreed a plan. |
| week | Yes | What was done this week; counts only, nothing about what is left. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false and readOnlyHint=false; the description usefully adds that the plan is preserved unchanged, that the operation consumes no quota, and that not_found is returned when no plan was agreed. That is meaningful behavioral context beyond the structured hints, though nothing is said about permissions or what the response contains (output schema covers the latter).
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 tight sentences that front-load the action and its effect, followed by quota and error notes. The trailing 'Args: {}' is redundant given the empty schema and slightly dilutes an otherwise waste-free description.
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 state-toggle with annotations covering idempotency/safety and an output schema covering the return shape, the description supplies the needed extras: the preservation guarantee, the resuming tool, the no-quota note, and the not_found error. Nothing essential is missing, though permissions/authorization context is absent.
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 and there is no parameter meaning to add. 'Args: {}' merely restates the empty schema rather than adding semantics, which keeps it at baseline rather than above it.
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 ('Put the user's weekly plan on hold') plus the exact resulting state ('kept as it is and marked paused'), and names the sibling tool that reverses it (set_coach_plan). An agent can distinguish this from get_coach_plan or set_coach_plan without opening any schema.
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 makes the usage context explicit: pause the plan, it stays intact, and set_coach_plan resumes it, which effectively routes the agent to the correct counterpart tool. It does not state explicit exclusions (e.g. what to do if no plan exists beyond the error), so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_job_linkRead a job posting linkARead-onlyInspect
Read a link to a job posting into its title, company, location and full text. Spends no analysis. Postings on Greenhouse, Lever, Ashby, SmartRecruiters, Workday, Workable and Recruitee are read through the board's public API; other pages through the job posting they declare or their main text. The text goes to analyze_vacancy as description, with title, company, location and url; existing_analysis_id means this user already analyzed the link and get_vacancy_detail shows that analysis. LinkedIn and Glassdoor pages are not read (login_required). Errors: login_required, blocked, unreadable, posting_closed, rate_limited (20 links an hour, 10 a day on the free plan, 60 on a paid one), invalid_payload.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The link, cleaned of tracking parameters. |
| title | Yes | The posting's title as the page or the job board names it. |
| source | Yes | Where the text came from: pool = a posting the user's or another radar already found, ats = the job board's public API, page = the page itself. |
| company | No | The employer, when the posting names one. |
| location | No | Where the job is, as the posting says it. |
| description | Yes | The posting's full text, up to 20 000 characters. |
| existing_analysis_id | No | This user's analysis of the same link, when there is one; get_vacancy_detail shows it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint=false, and the description adds substantial context beyond that: per-board retrieval strategies (public API vs. declared posting vs. main text), a concrete rate limit (20/hr, 10/day free, 60 paid), and an enumerated error taxonomy. It doesn't say whether fetches are cached or how long they take, but the disclosure is well above the annotation baseline.
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?
Dense but front-loaded: purpose first, then mechanics, then handoff, then errors and limits. The error/rate-limit tail is a run-on list that could be broken out, but every clause carries information an agent needs.
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 one-parameter read tool with an output schema and safety annotations already present, this covers the supported domains, the downstream handoff, the already-exists case, the exclusions, the failure modes and the quotas. Nothing an agent needs to decide whether and how to call it is missing.
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 weight; it does constrain 'url' implicitly by naming the supported boards and the LinkedIn/Glassdoor exclusion, which is genuinely useful. However, it never states the url format requirements or what the 2048-char limit entails, so the single parameter remains partly underspecified.
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 first sentence states a specific verb (read) and resource (a job posting link) plus exactly what is extracted: title, company, location, full text. It also distinguishes itself from the analysis sibling by stating 'Spends no analysis', which no other sibling does.
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?
Explicit routing both downstream ('The text goes to analyze_vacancy as description') and for the already-analyzed case ('existing_analysis_id means this user already analyzed the link and get_vacancy_detail shows that analysis'). It also names an explicit exclusion: LinkedIn and Glassdoor are not read because of login_required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_resumeRename a resumeAIdempotentInspect
Rename a resume DOCUMENT — the display name shown in the resume list. Not the job headline inside the resume content (that is update_resume_section with section 'title'). Returns 'not_found' if the resume does not exist or does not belong to the current user, and 'invalid_payload' if the name is empty.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Id of the renamed resume. |
| name | Yes | The new display name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey idempotency, non-destructiveness, and closed-world scope. The description adds genuine unannotated behavior: the specific error codes returned ('not_found' for missing/foreign resumes, 'invalid_payload' for empty names), which is real operational value beyond the safety profile.
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 tight sentences: the disambiguation is front-loaded, and the error contract follows. No filler, every clause earns its place.
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?
An output schema exists, so return values need not be described, yet the definition still surfaces the failure modes an agent must handle. Combined with the annotations covering safety and idempotency, nothing needed to invoke this correctly is missing.
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 reported as 0%, so the description carries extra burden, and it does clarify the semantic of 'name' as the display name rather than any content field. It adds meaning over the schema but does not elaborate resume_id format beyond what the schema already states.
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 ('Rename a resume DOCUMENT') and immediately narrows what is being renamed ('the display name shown in the resume list'). This lets an agent distinguish it from the similarly-named update_resume_section without opening schemas.
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?
Explicitly names the case this tool does NOT cover ('Not the job headline inside the resume content') and routes that case to the correct alternative, update_resume_section with section 'title'. This is a textbook when-not/alternative statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_resume_updateRewrite a resumeADestructiveInspect
Rewrite a resume from a natural-language instruction using the tuned LLM resume pipeline (ATS-aware, keeps the resume's own language). Runs asynchronously — returns a task_id immediately; the rewrite typically takes a few minutes, and a completion (or failure) message is posted into the user's chat when it finishes; get_task_status(task_id) reports progress and the outcome. It is for substantive rewrites ('rewrite my summary for a senior role', 'tighten all bullets', 'shorten the resume'); small structural edits are update_resume_section. NOT supported: translating the whole resume (that is translate_resume) and adding a photo (only the resume editor uploads one) — such requests fail. Consumes one resume update from the user's plan. source_text carries the user's own resume or full account of their experience, verbatim: the resume is then rebuilt from that text instead of being edited from the instruction. Returns 'not_found' if the resume does not belong to the current user, 'limit_exceeded' if the plan quota is reached, and 'invalid_payload' if source_text is longer than 20000 characters.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | Always 'processing' — the rewrite runs asynchronously. |
| task_id | Yes | Background task id (informational; the rewrite runs asynchronously). |
| resume_id | Yes | Id of the resume being rewritten. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply the safety profile (destructive=true, non-idempotent); the description goes well beyond by disclosing the async contract (returns task_id immediately, completion/failure posted to chat, get_task_status for progress), the plan-quota cost, the source_text rebuild behavior, and specific error codes ('not_found', 'limit_exceeded', 'invalid_payload').
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?
Dense but front-loaded: purpose first, then async contract, then when/when-not, then source_text semantics, then error codes. Every sentence carries information, though the single long paragraph could be broken into shorter clauses for faster scanning.
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 an output schema present, return values need not be explained, and the description nonetheless covers the async lifecycle, quota consumption, failure modes, and unsupported operations. An agent has everything needed to invoke and interpret the call.
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 describes all three fields, but the description adds real meaning beyond it: it clarifies that source_text is used verbatim and switches the tool from edit-mode to rebuild-mode ('the resume is then rebuilt from that text instead of being edited from the instruction'), plus restates the 20000-char cap and the consequence of paraphrasing.
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?
Opens with a specific verb+resource ('Rewrite a resume from a natural-language instruction') and immediately scopes it against siblings: small structural edits are update_resume_section, translation is translate_resume. An agent can distinguish it from every other resume tool without opening a schema.
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?
Explicit when-to-use with concrete examples ('rewrite my summary for a senior role', 'tighten all bullets'), explicit when-not (small structural edits -> update_resume_section), and named alternatives for unsupported cases (translate_resume). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_vacancy_resume_suggestionsSuggest resume changes for a jobAInspect
Generate structured resume-improvement suggestions tailored to a vacancy analysis. Runs asynchronously — this returns a task_id immediately; poll get_vacancy_detail(vacancy_id) and read 'resume_suggestions' for the completed list. The suggestions also appear in the web UI's vacancy analysis page. Counts as one resume-suggestions action against the user's plan. At a match of 90% or more no suggestions are generated and nothing is spent; the finished task then says skipped: 'high_match' in get_task_status. Returns 'not_found' if the vacancy does not belong to the current user, 'limit_exceeded' if the plan quota is reached.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | Always 'processing' — the job runs asynchronously. |
| task_id | Yes | Background task id (informational; get_vacancy_detail shows progress). |
| vacancy_id | Yes | Id of the vacancy analysis the task operates on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only cover readOnly/idempotent/destructive/openWorld hints). It discloses async behavior, that the call counts as one action against the user's plan quota, that no cost is incurred when match >=90% (task then says skipped:'high_match'), and specific error returns ('not_found', 'limit_exceeded'). This is exactly the kind of side-effect/cost context an agent needs.
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?
Front-loaded with the core purpose, then flows into async/retrieval behavior, cost, and error handling. Dense but every sentence earns its place; minor length given the amount of behavior disclosed.
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 an async request tool with side effects and an output schema present, the description covers initiation, retrieval path, cost model, skip condition, and failure modes comprehensively. Nothing essential to correct invocation is missing.
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?
Context signals report 0% schema description coverage, so the description carries the burden. It references vacancy_id in the polling instruction and ties the operation to 'a vacancy analysis', adding partial meaning, but does not explain format, required validity, or ownership constraints for the parameter itself beyond the error case.
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 (Generate) and resource (structured resume-improvement suggestions) scoped to a vacancy analysis. It is clearly distinguishable from siblings like score_resume, get_resume_suggestions, and apply_vacancy_resume_suggestions, which are read or apply operations rather than generation requests.
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 clear context for use: it runs asynchronously, returns a task_id, and instructs the agent to poll get_vacancy_detail(vacancy_id) and read 'resume_suggestions'. It also notes the web UI path and the skip condition at >=90% match. It lacks an explicit when-not-this-instead-vs-alternative statement, but the operational guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_resume_revisionRestore a resume versionADestructiveInspect
Bring an earlier saved version of a resume back as its current content (revision_id from get_resume_history) — for content that went missing or an earlier version the user wants back. Restoring is itself undoable: the current content is kept as a version first, and the result's new_revision_id can be restored in turn. Style and PDF are not touched. No quota. Returns 'not_found' if the resume or the version does not exist or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| changed | Yes | False when the resume already matched that version. |
| resume_id | Yes | |
| new_revision_id | No | The version this restore created; restore it to undo. Null when nothing changed. |
| undo_revision_id | No | The version the resume had before this restore. Null when nothing changed. |
| restored_revision_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, readOnlyHint=false) by disclosing that the overwrite is itself undoable because the current content is snapshotted as a version first, that the returned new_revision_id can be restored in turn, that style and PDF are untouched, that there is no quota, and that a 'not_found' result covers missing or non-owned resumes/versions. This is exactly the extra context a mutation tool needs.
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?
Front-loaded with the core action, then constraints and side effects in descending priority, with no filler sentences. It is a single dense block rather than broken into scannable clauses, which costs a little readability but not 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 destructive-but-undoable mutation with two nested parameters, the description covers the trigger condition, the reversal path, untouched surfaces, quota, and the failure mode — and an output schema exists to carry return structure, so nothing essential is missing.
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 reported at 0%, though the description does name the revision_id origin ('from get_resume_history') and its meaning ('version to bring back'). It adds nothing about resume_id sourcing and no format/syntax detail, so it only partially compensates for the documented coverage gap.
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 — bringing an earlier saved resume version back as current content — which cleanly separates it from view-only siblings like get_resume_revision and get_resume_history, and from create_resume_version. An agent can identify the operation without opening the schema.
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 a concrete trigger condition: 'for content that went missing or an earlier version the user wants back', and points at get_resume_history as the source of the revision_id. It stops short of an explicit when-not-to-use statement (e.g. 'to only inspect a version, use get_resume_revision'), so routing against the read siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_radar_matchSave a job matchAIdempotentInspect
Save a radar match the user likes: keeps it in their list and teaches the radar to rank similar vacancies higher. Instant, free, no quota, no limit on how many. It does NOT analyze the vacancy: that is analyze_radar_match, which spends one vacancy analysis. Returns 'not_found' if the match does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-destructive, idempotent write. The description goes beyond them with cost/quota behavior ('Instant, free, no quota, no limit') and the 'not_found' failure mode for matches not owned by the current user. It stops short of stating the reverse operation (undo_radar_match) or any auth/permission detail beyond the owner check.
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 tight sentences: effect, cost contrast, and exclusion/alternative. The most decision-relevant facts (what it does, that it costs nothing, what it is not) are front-loaded with zero 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?
An output schema exists, so return values need no explanation, and the description still supplies the noteworthy error case plus side effects. The only gap is reversibility — it does not point at undo_radar_match, which an agent may want after a mis-save.
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 description never mentions match_id, so it adds no parameter meaning. The nested schema does document match_id as 'as returned by get_radar_matches', which keeps this at a baseline 3 rather than lower, but the prose contributes nothing on parameters.
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 ('Save a radar match') plus the two concrete effects — keeps it in the user's list and teaches the radar ranking. It explicitly names the sibling it is not (analyze_radar_match), so an agent can route without opening either schema.
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 the exact selection condition: use this when the user likes a match; use analyze_radar_match when the vacancy itself needs analysis. The cost framing ('no quota, no limit' vs 'spends one vacancy analysis') makes the trade-off unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_resumeScore a resumeARead-onlyInspect
Score a resume's ATS quality (0-100) by id, with a per-area breakdown (formatting, content, completeness, length), a verdict and the checks that failed, each with its tip. Matches the resume editor's ATS badge — no AI guesswork. Use get_resume_suggestions for the actionable fix list. Returns 'not_found' if the resume does not exist or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| verdict | Yes | excellent | good | needs_work | poor. |
| resume_id | Yes | |
| area_scores | No | |
| checks_total | Yes | Total quality checks applied. |
| checks_passed | Yes | Number of quality checks that passed. |
| failed_checks | No | Every check that did not pass, highest-impact first. |
| overall_score | Yes | 0-100 ATS quality score (same scale as the resume editor's ATS badge). |
| critical_issues | Yes | Number of failed high-impact checks (10-point checks). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, yet the description still adds meaningful behavioral context: the breakdown areas, the verdict output, the failed-check-with-tip structure, the guarantee of parity with the editor's ATS badge ('no AI guesswork'), and the 'not_found' failure mode. Auth relevance is covered by stating the resume must belong to the current user.
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 dense sentences, front-loaded with the core purpose and score range, then output shape, then usage routing and the failure case. No filler sentences and nothing repeated from the title.
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?
The tool has an output schema, so return-format detail is optional, yet the description still summarizes the return surface (breakdown, verdict, failed checks). Combined with the documented not_found behavior and sibling routing, an agent has everything needed to select and call it correctly.
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?
With reported schema coverage at 0%, the description has to carry parameter meaning; it clarifies the input is an id (not a full resume object) and adds that the target must belong to the current user, which the schema does not express. It stops short of stating the id format or how to obtain it beyond the 'by id' phrasing.
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 (score) and resource (resume) with the exact output scope (ATS quality 0-100 plus per-area breakdown). It explicitly contrasts itself with get_resume_suggestions, so an agent can separate it from the many get_resume* siblings without opening a schema.
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?
Names the alternative (get_resume_suggestions) and its purpose ('the actionable fix list'), which signals when to route elsewhere. However it never states the positive trigger condition for choosing this tool (e.g. 'use when you want a diagnostic score rather than fixes'), leaving that inference implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_vacanciesSearch tracked jobsARead-onlyInspect
Search the user's tracked vacancies: finished fit analyses and vacancies tracked without an analysis (analysis_status 'none'); ones with an analysis running or failed are not listed. Filter by free-text query (title, company, location, notes, description), minimum match percentage (drops unanalyzed ones), location (best-effort substring, falling back to the job description), tracker status and analysis_status. Newest first; total says how many match in all. Default limit 10, max 50. Empty list is a normal result.
| Name | Required | Description | Default |
|---|---|---|---|
| input | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | How many vacancies match in all; vacancies holds at most limit of them. |
| vacancies | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description still adds real behavior beyond that: ordering ('newest first'), the meaning of the total count, the default/max limit, the substring-with-fallback location matching, and the normalization that an empty list is a normal result. Pagination and auth requirements are not addressed, leaving a modest gap.
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?
Front-loaded with the scope rule, then dense but information-carrying sentences on filters, ordering, and limits; there is essentially no filler. It is slightly long for a single paragraph, but every clause specifies a distinct behavior an agent needs.
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 an eight-parameter filter tool with an output schema (so return values needn't be explained, though the 'total' semantics are a nice addition), the description covers scope, filters, ordering, and limits well. The only real omission is the archived-vs-active distinction, which the agent must pick up from the schema.
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?
Although schema coverage is reported as 0%, the description explains the semantics of the key filters: what fields 'query' spans (title, company, location, notes, description), how 'min_match' interacts with unanalyzed vacancies, and how 'location' falls back to the job description. It omits the 'archived' filter, which is only documented in the schema, so it does not fully compensate for the coverage gap.
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 ('search the user's tracked vacancies') and immediately pins down scope that distinguishes it from siblings like get_recent_vacancies or get_vacancy_detail: only finished analyses and never-analyzed tracked vacancies are returned, while running/failed analyses are excluded. An agent can tell what belongs in the result set without opening a schema.
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 inclusion/exclusion rule ('analysis running or failed are not listed') and the note that min_match 'drops unanalyzed ones' give clear context for when this search is appropriate. It stops short of naming an alternative tool (e.g. get_recent_vacancies) or an explicit when-not-to-use condition, so it is strong context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_active_resumeSet the active resumeAIdempotentInspect
Make a resume the user's active one, deactivating all others. Returns 'not_found' if the resume does not exist or does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Id of the resume that is now active. |
| is_active | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, idempotent=true, destructive=false, openWorld=false), the description discloses the cascading side effect that all other resumes are deactivated and the 'not_found' failure for a missing or non-owned resume. That ownership check is meaningful auth-scope context an agent cannot get from the annotations.
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 tight sentences: the mutation and its side effect are front-loaded, and the error behavior follows. 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?
An output schema exists, so return-value detail is not required, and the description still flags the notable failure mode. For a one-parameter mutation with clear annotations, this is nearly complete; only the parameter's own semantics are left entirely to the schema.
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?
With reported schema description coverage at 0%, the description is expected to compensate for the single parameter, and it says nothing about resume_id format or provenance. The nested schema itself does document resume_id ('as returned by list_resumes'), but the description adds no parameter meaning of its own.
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 precise verb and resource ('Make a resume the user's active one') and immediately scopes the effect ('deactivating all others'), which cleanly separates it from siblings like rename_resume, set_resume_style, or delete_resume.
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 intended use is implied by the action itself, but the description names no alternatives or selection criteria (e.g., when to call this versus set_resume_style or create_resume_version). The only conditional given is an error case, not guidance on when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_coach_planSet the weekly planAIdempotentInspect
Save the weekly job-search plan the user chose: goal in their words, target roles, applications a week, the day for the weekly review. Creates the plan or overwrites only the fields provided (omitted fields are kept; "" or [] clears one) and makes a paused plan active again. No quota. Returns the plan with this week's progress. Errors: invalid_payload: : .
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | Yes | null when the user has not agreed a plan. |
| week | Yes | What was done this week; counts only, nothing about what is left. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly=false, idempotent=true, destructive=false, openWorld=false); the description adds the genuinely useful traits: partial-update semantics (omitted fields kept, "" or [] clears), automatic reactivation of a paused plan, no quota, the returned payload including this week's progress, and the error contract (invalid_payload: <field>: <problem>).
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?
Front-loaded with the purpose, then update semantics, then return/error behavior — each clause does work. It is dense with parenthetical detail, which makes it slightly harder to scan, but nothing is redundant padding.
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 single-input mutation tool with an output schema, the description covers everything an agent needs: what it writes, how partial updates and clearing behave, the paused-plan side effect, quota absence, and the error shape. Return values need not be explained since an output schema exists.
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?
Reported schema description coverage is 0% at the top level (only the wrapping 'input' object), and the schema is nested, so the description has to carry weight. It does: it names each meaningful input (goal in their own words, target roles, applications a week, review day) and explains the clear-value convention. It stops short of restating the per-field constraints (max 5 roles, 1–50 range) that the nested schema does define.
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 ('Save the weekly job-search plan the user chose') and enumerates the fields it covers (goal, target roles, applications per week, review day). Combined with the create-or-overwrite semantics, an agent can separate it cleanly from get_coach_plan and pause_coach_plan without opening the schema.
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 clear operating context: use it when the user has chosen a plan, it creates or overwrites only the supplied fields, and it reactivates a paused plan. It does not explicitly name the read counterpart (get_coach_plan) or pause_coach_plan as alternatives, so there are no stated exclusions — clear context but no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_radar_auto_searchTurn daily job search on or offAIdempotentInspect
Turn the user's automatic job search on or off. When on, the radar scans job boards for them every day and sends a digest of what it found; when off it does nothing on its own, though start_radar_scan still works on demand. This is the switch behind 'find me jobs automatically'. Instant and reversible, no quota. Returns the resulting state.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| auto_search_enabled | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent, non-destructive, non-read-only, so the safety profile is covered. The description adds genuine context beyond that: the daily scan/digest effect, that it is instant, reversible, and quota-free, and that it returns the resulting state.
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?
Front-loaded with the core action and effect, and every sentence adds usable information (state behavior, alternative, reversibility, return). Slightly verbose with the quoted phrase, but nothing is wasted.
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?
An output schema exists, so return values need not be spelled out; the description still notes that the resulting state is returned. Combined with annotations and the single boolean param, an agent has everything needed to call it correctly.
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?
Only one parameter, and the description conveys the on/off semantics that map directly to `enabled`. The nested schema property also carries a description, so the field meaning is well covered; no additional syntax is needed for a boolean switch.
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 (turn automatic job search on/off) and clearly distinguishes itself from the sibling start_radar_scan by contrasting the always-on daily scan with on-demand scanning. An agent can identify the tool without opening the schema.
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?
Explicitly describes both states and their consequences (daily scan + digest vs. doing nothing), names the alternative (start_radar_scan works on demand), and ties the tool to the user intent 'find me jobs automatically'. When-to-use and the alternative path are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_radar_filtersSet job search filtersADestructiveInspect
Set what the user's job radar searches for — the search zone: role, locations (up to five cities of one country), country, radius_km around each city, work_modes (any of office, hybrid, remote) and employment_types (any of full_time, part_time, contract, internship — read off job titles, so a title that does not say it is kept), and resume_id — the resume jobs are matched against (omitted = the active one). An omitted city, country or list means any. These outrank the resume and apply to the daily automatic scan too, so this — not the scan tool — is how a search gets narrowed. It REPLACES the whole set: an omitted field is cleared, so the call carries the filters being kept along with the ones being changed. Changing the filters also hides matches found for the old search that they never saw — results ranked for a different query would otherwise crowd out the new ones for days. Hidden matches come back when the filters return to that search — including ones a scan under other filters found again in between — or a later scan finds the same posting again; saved and already-seen matches stay, and last_scan_at does not move. The place is one of: nothing (any country), a country, or a country and up to five of its cities, one radius around each (a job near any of them is in the zone). location alone still means one city. country_code is optional: with cities alone the server fills in the country when the name settles it, refuses when it does not, and stores the city as the settings list spells it. Only cities in that list are searchable. City errors: 'invalid_payload: ambiguous_city' — the name exists in several countries; 'city_not_supported' — not searchable, the error names the nearest listed city; 'unknown_city' — no such city in the list; 'city_country_mismatch' — the city is not in that country. Remote is a work mode, never a location. The role is typed, or omitted to search the resume's own (title, else latest position — never skills or remembered roles); the result's search_role says which, and null means nothing names one. Returns the radar's state, filters included. No quota.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| saved | No | |
| active | Yes | Matches in the working list right now (new plus saved). |
| filters | No | Explicit search filters, when the user set any. They outrank the resume. |
| archived | No | |
| deferred | No | |
| search_role | No | The title the next scan searches for: the role from the filters, career memory or the resume, spelled the way job boards spell it once a scan has derived the search profile for this resume and role; before that, the role as set. Null means nothing names a role — a scan would fail with role_unknown until the user gives one. |
| last_scan_at | No | ISO timestamp of the most recent match found by a scan; null if the radar never ran. |
| next_scan_at | No | Free plan only, while its one scan a week is spent: ISO timestamp of when the next scan becomes available. Null when a scan is available now or the plan is paid (a paid plan's scans come back the next day). |
| search_query | No | What the last scan actually searched for — the role, place and country the radar settled on from filters, career memory, the resume and, when nothing else named one, the country the user signed up from. Null before the first scan. It stays after the filters or the resume change until the next scan, so it can differ from filters and search_role, which is what the next scan will run. The role here is what the scan searched for even when filters.role is empty. |
| pool_remaining | Yes | Found but not yet shown to the user — what a fresh look would reveal. |
| auto_search_enabled | Yes | Whether the daily automatic scan and its digest are on for this user. |
| search_paused_until | No | ISO timestamp the user's search pause ends, null when there is none. While paused, nothing the product starts on its own reaches them and the daily scan does not run. set_search_pause with months=null lifts it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint and non-idempotence, but the description adds substantial context those annotations cannot express: omitted fields are cleared, matches for the old search get hidden, hidden matches return when filters revert, saved/seen matches persist, and last_scan_at does not move. It does not mention permissions or concurrency, but the mutation consequences are unusually well disclosed.
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?
The replace-semantics constraint and role/location rules are front-loaded, but the paragraph is dense and rambles through nested parentheticals (error codes, city-list quirks) that could be broken into structure. Several clauses overlap, costing readability.
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?
Given an output schema exists, the description still covers return behavior ('Returns the radar's state, filters included', search_role null semantics) and quota ('No quota'). For a destructive replace operation with nested input, nothing an agent needs to call it correctly is missing.
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?
With reported schema coverage at 0%, the description carries the load and does: employment_types are 'read off job titles, so a title that does not say it is kept'; 'location' alone means one city; remote is a work mode, never a location; country_code is derived when the name settles it; resume_id omitted means the active one. It also documents city error codes that the schema never surfaces.
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?
Opens with a specific verb+resource ('Set what the user's job radar searches for') and enumerates exactly which fields define the search zone. It explicitly distinguishes itself from the sibling scan tool: 'this — not the scan tool — is how a search gets narrowed.'
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?
States when to use it versus the alternative (the scan tool), and that these filters outrank the resume and apply to the daily automatic scan. It also spells out the crucial invocation rule: a full replace means the caller must resend every filter being kept.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_resume_styleSet resume styleAIdempotentInspect
Change a resume's visual style: accent colour, layout, and/or font. Fields left out are preserved. accent_color: navy, emerald, burgundy, charcoal, violet (there is no pure red or blue). layout: classic, sidebar, header_banner, editorial, timeline, compact. font: default (Inter, sans-serif), classic (Lora, serif), modern (Jost, sans-serif). Applies instantly and returns the resulting style. Style is not part of resume versions: history and restore leave it as is. Returns 'not_found' if the resume does not exist or does not belong to the current user, and 'invalid_payload' if no field is provided or a value is not one of the allowed options.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| font | Yes | Resulting font pair. |
| layout | Yes | Resulting layout. |
| resume_id | Yes | Id of the restyled resume. |
| accent_color | Yes | Resulting accent colour. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses that changes apply instantly, that the call returns the resulting style, that style survives version restore, and enumerates error outcomes ('not_found', 'invalid_payload') including the invalid case of providing no field. This is rich behavioral context consistent with readOnlyHint=false and idempotentHint=true.
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?
Front-loaded with the core action, then enumerations, then side-effect and error notes. Dense but every clause carries information; the enumeration of values makes it longer than strictly necessary given the schema already lists them.
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 an output schema present it need not describe return shape, yet it still mentions the return value and pins down error codes, idempotent patch behavior, and versioning interaction. Nothing material for correct invocation is missing.
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 description restates the allowed values and adds genuinely useful meaning: the font-to-typeface mapping, the colour set, and the guidance that free-text colour requests must be mapped to the nearest of the five since no pure red/blue exists. That mapping rule is not derivable from the schema alone, though some content duplicates schema descriptions.
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?
Names a specific verb ('Change') and resource ('a resume's visual style') and enumerates the exact facets it controls (accent colour, layout, font). This clearly separates it from content-editing siblings like update_resume_section and from versions tools like create_resume_version.
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?
States the patch semantics ('Fields left out are preserved') and the scope boundary that style is not versioned ('history and restore leave it as is'), which tells an agent when styling is reusable across versions. It does not explicitly name an alternative tool, but the context for use is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_search_pausePause or resume the job searchAIdempotentInspect
Pause everything the product does on its own for 1, 3 or 6 months, or lift a pause (months=null). While paused there are no radar scans, digests, follow-ups or agent messages, and the user's own reminders wait; the resume, vacancies and history stay untouched. When the date passes, the radar runs one search and the user gets one message. It fits 'I found a job', 'not looking right now' or 'stop writing to me' without deleting the account. Instant and reversible, no quota. Returns when the pause ends (null when lifted).
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| paused_until | No | ISO timestamp the pause ends; null when no pause is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it enumerates what is suspended (radar scans, digests, follow-ups, agent messages), what waits (user reminders), what is untouched (resume, vacancies, history), what happens at expiry (one search, one message), and that it is instant, reversible, and quota-free. This is exactly the behavioral context the readOnly/destructive/idempotent hints cannot convey.
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?
Front-loaded with the core action and durations, then layered with effects and edge cases. Every sentence carries substantive information, though the closing 'Returns when the pause ends (null when lifted)' slightly duplicates the output schema.
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 one-parameter, reversible toggle this is complete: it covers when to use it, what changes, what does not, expiry behavior, and reversibility. With an output schema present, it doesn't need to detail return structure, and its brief return mention only reinforces it.
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 description interprets the single parameter's meaning: '1, 3 or 6 months, or lift a pause (months=null)', clarifying both the allowed durations and the null-lift semantics. The schema also carries a description for months, so this is additive framing rather than the only source, but it reinforces intent cleanly.
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 (pause everything the product does autonomously, or lift a pause) with the exact durations 1/3/6 months. It distinguishes itself from sibling mutators like set_radar_auto_search and pause_coach_plan by defining the blast radius (radar scans, digests, follow-ups, agent messages) rather than one feature.
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 triggering utterances ('I found a job', 'not looking right now', 'stop writing to me') and a scope exclusion ('without deleting the account'). It stops short of naming counterpart tools (e.g., set_radar_auto_search) as alternatives, so an agent must infer which sibling handles narrower filters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_vacancy_suggestion_declinedAnswer no to a tailoring questionAIdempotentInspect
Record that the person answered no to a question suggestion (kind 'needs_fact') of a vacancy: the experience it asks about is not theirs, so it is not applied and the vacancy's Tailoring tab shows it as answered no. declined=false takes that answer back. Applying the suggestion later with a fact also clears it. The result lists every declined index, the same as declined_suggestion_indices in get_vacancy_detail. No quota. Errors: not_found (vacancy not theirs), invalid_payload (index out of range, not a question, or already applied).
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| declined | Yes | Whether this suggestion is now marked as answered no. |
| vacancy_id | Yes | |
| suggestion_index | Yes | |
| declined_suggestion_indices | Yes | Every index of this vacancy's resume_suggestions now marked as answered no. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-destructive, idempotent write, but the description adds substantial context beyond them: the visible side effect on the Tailoring tab, reversibility via declined=false, that applying later clears it, 'No quota', and named error conditions (not_found, invalid_payload with its causes). This is rich disclosure for a mutation tool.
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 dense paragraph, front-loaded with the core action and then side effects, reversal, result format, quota, and errors. Every sentence carries content, though the run-on phrasing makes it slightly heavier than ideal.
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?
An output schema exists, so return values need not be spelled out, yet the description still helpfully cross-references 'declined_suggestion_indices in get_vacancy_detail'. Combined with annotations covering safety and the description covering side effects, quota, and errors, an agent has everything needed to invoke it correctly.
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 top-level schema exposes only an opaque 'input' ref (0% coverage per the signal), so the description must carry meaning. It explains the declined=true/false semantics and constrains suggestion_index ('index out of range, not a question, or already applied') and its needs_fact scope, though the nested schema already repeats much of the field-level meaning.
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 ('Record that the person answered no to a question suggestion (kind needs_fact) of a vacancy') and scopes it to the needs_fact kind. It also distinguishes the operation from the sibling path by noting that applying the suggestion later with a fact clears it, so an agent can tell it apart from apply_vacancy_resume_suggestions.
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 clear context for when the tool applies (recording a 'no' answer) and explains the reverse path ('declined=false takes that answer back') plus the alternative that also clears it (applying with a fact). It stops short of an explicit when-to-use/when-not statement naming the sibling tool, so it lands just below the top.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skip_radar_matchSkip a job matchAIdempotentInspect
Skip a radar match the user is not interested in (removes it from the list and teaches the radar to rank similar vacancies lower). Applies instantly, no quota, and is reversible with undo_radar_match — which also removes the ranking signal. A match the user looked at and scrolled past in the radar feed carries the same ranking signal with status 'seen'. Returns 'not_found' if the match does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| status | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, idempotent, non-destructive, closed-world. The description adds substantial value beyond them: instant application, no quota consumption, reversible via undo_radar_match (which also clears the ranking signal), the ranking-signal equivalence to a 'seen' match, and the 'not_found' outcome for a match not owned by the user.
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?
Front-loads the action, then adds reversibility and the ranking-signal nuance. The 'seen' sentence is slightly tangential but earns its place by clarifying the ranking model; overall tight with little waste.
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?
Output schema exists so return values needn't be detailed, and the description still notes the 'not_found' case. With annotations covering safety/idempotency and the description covering effects, reversibility, and quota behavior, an agent has everything needed to call it correctly.
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 single match_id parameter is documented in the schema itself ('as returned by get_radar_matches'), so the description adds nothing about parameter syntax or format beyond that. With one parameter and schema-level coverage, a baseline 3 is appropriate.
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 ('Skip a radar match') and explains the effect precisely (removes from list, teaches ranking lower). It names undo_radar_match as the inverse, but does not explicitly distinguish skip from the sibling delete_radar_match or archive_radar_match, so an agent must still infer which of the three status-changing tools to pick.
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 a clear condition ('a match the user is not interested in') and frames the reversible undo path plus the 'seen' scrolled-past scenario. What's missing is an explicit when-not / alternative rule versus delete and archive siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_radar_scanSearch job boards nowAIdempotentInspect
Start a job radar scan: search job boards for vacancies matching the user's active resume. Runs asynchronously — returns a task_id immediately; the scan takes up to a minute, then get_radar_matches shows the results and get_radar_status.last_scan_at says whether it brought anything in (a scan that found nothing new leaves it as it was); get_task_status(task_id) reports progress and the outcome. Calling it while a scan is already running returns the same task_id (no double scan). Consumes one radar scan from the user's plan quota — several a day on a paid plan, one a week on the free plan, where the morning's automatic scan counts too; the account's first scan ever is not counted, and neither is a scan with changed filters after one that found nothing, while the account has never had a match. Returns 'not_found' if the user has no resume yet, 'role_unknown' when nothing names the role to search for (no role in the radar filters or career memory, no title, position or skills on the resume; set_radar_filters stores a role), and 'limit_exceeded' when the quota is spent; get_radar_status.next_scan_at then says when a free user's weekly scan comes back. The same search as the last scan (same role, place and filters on the same resume) within an hour of it starts nothing and spends nothing: it returns 'recent_scan' with the minutes since that scan and when the same search can run again; a search with other filters (set_radar_filters) starts at once.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare mutation/idempotency/open-world traits; the description adds the substantive behavior: asynchronous task_id return, up-to-a-minute duration, quota consumption rules per plan, the free-scan exceptions, and the 'not_found' / 'role_unknown' / 'limit_exceeded' outcomes with their remediation paths.
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 async behavior are front-loaded and nothing is redundant, but the rest is compressed into one dense semicolon-chained paragraph covering quota, errors, and cooldown. It would scan better split into short labeled clauses, though no sentence is 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 zero-parameter mutation with an output schema, the description covers the async lifecycle, every error code with its cause and fix, quota accounting, and dedup semantics. An agent has everything needed to invoke it and interpret the outcome.
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 there is nothing for the description to disambiguate; the baseline for a parameterless tool is 4. It does correctly imply that the roles, location and filters come from previously stored state (radar filters, career memory, resume), which helps an agent understand where the search inputs come from.
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 first clause gives a specific verb and resource ('Start a job radar scan: search job boards for vacancies matching the user's active resume'), and it explicitly distinguishes itself from get_radar_matches, get_radar_status, get_task_status and set_radar_filters by naming each.
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 states when to call, what happens if a scan is already running, when a repeat search is suppressed ('recent_scan' with cooldown minutes), and how a changed-filter search bypasses that. Alternatives for retrieving results are named explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
translate_resumeTranslate a resumeAInspect
Translate a resume into another language as a NEW inactive copy named after the language; the original resume is not changed. Skill level and category and language name and proficiency stay fixed English keys, which the rendered resume shows in its language. Runs asynchronously — returns a task_id immediately and a message is posted into the user's chat when the copy is ready or the translation fails; get_task_status(task_id) reports progress and the outcome. Consumes one resume translation from the user's plan. If this resume was already translated into that language, returns the existing copy with status 'reused' and spends nothing. target_language is one of: en_EN, ru_RU, es_ES, pt_BR, de_DE, fr_FR, it_IT, tr_TR, hi_IN, uk_UA, id_ID, ja_JP. When the user asked for more than the translation, pass the rest as follow_up_instruction: the ready message offers it on the new copy with one tap. Returns 'not_found' if the resume does not belong to the current user, 'already_in_language' if the resume is already written in that language, 'limit_exceeded' if the plan quota is reached, and 'invalid_payload' for an unknown language code.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | 'processing' — the translation runs asynchronously; 'reused' — the copy exists. |
| task_id | No | Background task id, or null when an existing copy was reused. |
| resume_id | No | Id of the translated copy: set now when reused, otherwise it arrives with the chat message. |
| source_resume_id | Yes | Id of the resume being translated; it is not changed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the basic safety profile (readOnlyHint=false, destructiveHint=false), so the description carries real weight here and delivers: async execution with an immediate task_id, a chat message on completion/failure, plan-quota consumption, and a reuse-without-spend path. The only nit is that the duplicate-call reuse behavior reads as idempotent while idempotentHint=false, though the first invocation does still spawn a task, so it is not a true contradiction.
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?
Front-loaded with the outcome (new inactive copy) and then layered by importance: async behavior, cost, reuse, language list, follow-up, error codes. Dense and information-rich, but on the long side; the language enumeration and error list could be trimmed or deferred to the schema.
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 an output schema present, the description need not describe return values, and it still covers everything an agent needs: side effects (new copy, quota spend), async contract, dedupe behavior, the follow-up parameter's downstream effect, and the full failure surface. Nothing material is missing.
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 description enumerates the twelve accepted target_language codes, which is useful guidance, and explains follow_up_instruction's purpose and one-tap delivery ('the ready message offers it on the new copy'). It slightly tightens the schema's looser claim that bare language codes or English names like 'German' are accepted, but the semantics added are net positive.
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 opening sentence states a specific verb (translate), resource (resume), and the exact resulting artifact ('a NEW inactive copy named after the language'), and explicitly distinguishes the operation from in-place edits ('the original resume is not changed'). This separates it cleanly from siblings like create_resume_version or rename_resume without opening their schemas.
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 states when to use it, routes progress checks to the named sibling get_task_status(task_id), defines the dedupe path ('if this resume was already translated into that language, returns the existing copy... spends nothing'), and covers the follow-up case where the user asked for more than translation. Explicit error semantics (already_in_language, limit_exceeded) further define when the call is valid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_radar_matchUndo a job match decisionAIdempotentInspect
Undo a verdict on a radar match: put it back in the active list after a skip, a save or a defer, and drop the ranking signal that verdict taught. A skip keeps pushing similar vacancies down until it is undone. A vacancy analysis that a save already started is NOT cancelled and its credit is not refunded. The id is the one the previous call returned. Instant, reversible, no quota. Returns 'not_found' if the match does not belong to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (idempotent, non-destructive, non-read-only) by disclosing the ranking-signal side effect, the persistence of a skip's down-ranking until undone, the non-cancellation of an in-flight vacancy analysis, the reversible/instant/no-quota nature, and the 'not_found' error condition. Rich behavioral context that the structured fields cannot convey.
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?
Front-loaded with the core action ('Undo a verdict on a radar match'), then layered with edge cases and constraints. Every sentence adds operational value, though the density is near the upper limit and could be trimmed slightly.
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 an output schema present, return values need no explanation, yet the description still surfaces the key 'not_found' case. It covers behavior, side effects, edge cases, parameter source and reversibility, leaving no meaningful gap for a mutation tool of this complexity.
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?
With stated schema coverage at 0%, the description carries the burden and does add meaning: 'The id is the one the previous call returned.' This clarifies the id's provenance beyond the schema's bare 'as returned by get_radar_matches', though there is only one parameter so the surface for added detail is small.
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 (undo) and resource (radar match verdict), and spells out exactly what is reversed: a skip, save or defer. This clearly separates it from siblings like skip_radar_match, save_radar_match, archive_radar_match and delete_radar_match without needing to open any schema.
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?
Explains the triggering context (after a skip, save or defer) and explicitly notes that a save-started vacancy analysis is NOT undone, which is a crucial when-to-use boundary. It does not, however, name the alternative tools by name, so it falls just short of explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_resume_sectionEdit a resume sectionADestructiveInspect
Apply an edit to one section of a resume. Editable sections: full_name, title, contacts, summary, experience, education, skills, projects, languages, interests, publications, references. Two modes, exactly one per call. ops (list sections) makes targeted add/update/remove changes addressed by the entry 'id' from get_resume; entries an op does not name stay untouched. payload replaces the whole section: an entry missing from it is removed; an entry carrying its 'id' from get_resume is matched to the stored one, and within it a key left out keeps its current value. Entry ids belong to the content_version they were read with: a call that names entries by id carries it as expected_content_version, and gets 'resume_changed' when the resume changed since. Returns the edited section with its entry ids and the new content_version; get_resume reads the whole resume. Experience dates are checked on the entries an edit adds or changes: no start in the future, no end before the start, no end date on a current role. Returns 'not_found' if the resume does not exist or does not belong to the current user, and 'invalid_payload' if the edit does not match the section shape.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| undo | No | Set only by an edit that changed something: the versions around it. |
| style | No | Current visual style. Read-only here; change via set_resume_style. |
| title | No | Professional title/headline (section: title). |
| skills | No | |
| section | Yes | The section this edit changed — the only section included; get_resume reads the rest. |
| summary | No | |
| contacts | No | |
| language | No | Locale code the resume content is written in, e.g. en_EN. Not the spoken languages list. |
| projects | No | |
| education | No | |
| full_name | No | Person's full name (section: full_name). |
| interests | No | |
| languages | No | |
| experience | No | |
| references | No | |
| updated_at | No | |
| resume_name | Yes | Document name shown in list_resumes; change it via rename_resume, not update_resume_section. |
| publications | No | |
| content_version | No | Content version of this read: a hash of the content, so equal content gives an equal version, also across copies. Entry ids belong to it; update_resume_section takes it as expected_content_version and answers 'resume_changed' once the resume has changed since. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/not-idempotent/not-read-only, yet the description adds substantial non-annotated behavior: un-named entries stay untouched in ops mode, entries missing from payload are removed, omitted keys retain stored values while ""/[]/null clears, experience date validation rules, and the not_found/invalid_payload error contract. This is the concurrency, data-loss, and validation context an agent needs for a destructive mutation.
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?
Front-loads purpose, then the mode-exclusivity rule, then semantics, then errors — a logical structure with no filler sentences. It is on the long side because it re-lists every section shape that the schema already contains, which is redundant rather than wasteful, so only a small deduction applies.
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?
Covers everything needed for a destructive, versioned edit tool: mode exclusivity, id provenance, concurrency guard, per-field merge vs clear semantics, validation rules, and error strings. An output schema exists, so the brief return note ('edited section with entry ids and the new content_version') is appropriate rather than required.
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 top-level schema is an opaque single 'input' wrapper (0% description coverage reported), so the description carries the burden of explaining ops vs payload semantics, expected_content_version, and id-based matching — and it does so thoroughly. It loses a point because the long section-shape enumeration largely duplicates what the nested payload schema already documents rather than adding new semantics.
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?
Opens with a specific verb+resource ('Apply an edit to one section of a resume') and enumerates the twelve editable sections, so an agent immediately knows the scope. It also implicitly separates itself from get_resume ('get_resume reads the whole resume') and from list_resumes/rename_resume siblings, which is exactly what a sibling-differentiating definition should do.
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?
Explicitly states the two modes and the selection rule ('Two modes, exactly one per call'), explains when each applies (targeted ops vs whole-section payload), and covers prerequisites including where entry ids come from (get_resume) and what happens on conflict (expected_content_version → 'resume_changed'). Alternatives for reading content are named rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_vacancy_statusUpdate a tracked job statusAIdempotentInspect
Update the job-tracker status and/or notes of a tracked vacancy — e.g. mark it 'applied' after the user says they sent an application, or 'rejected' when they got a no. Statuses: new | applied | interview | offer | rejected | accepted. Status changes are recorded in the vacancy's history with a timestamp; setting the status it already has records nothing. Returns the status before and after the call. At least one of status/notes is required. Returns 'not_found' for a missing or foreign id, 'invalid_payload' for an unknown status or an empty update.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| notes | No | |
| title | No | The vacancy's title as the tracker shows it. |
| status | Yes | |
| changed | Yes | Whether this call moved the status; false when it already had that status or only notes were sent. |
| previous_status | Yes | The tracker status the vacancy had before this call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), so the bar is lower, and the description still adds real value: history/timestamp recording, the no-op behavior when setting the same status, and explicit error semantics ('not_found' for missing/foreign id, 'invalid_payload' for unknown status or empty update). The only mild redundancy is stating return values when an output schema exists, which keeps this from a 5.
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?
Front-loads the purpose, then layers in status vocabulary, side effects, return shape, and error codes in dense but non-redundant sentences. No filler; every clause carries information an agent needs to call correctly.
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 mutation tool with annotations, nested input, and an output schema, this covers the remaining gaps: valid status domain, side effects on history, idempotent no-op, required-field constraint, and both failure modes. Nothing material for correct invocation is missing.
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?
Reported schema description coverage is 0%, so the description must compensate: it restates the valid status list, explains that vacancy_id identifies a tracked vacancy (foreign ids yield 'not_found'), and enforces the at-least-one-of-status/notes rule. It does not mention the notes replacement/clear semantics or the 5000-char limit documented in the schema, so the compensation is not complete.
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 ('Update the job-tracker status and/or notes of a tracked vacancy') and enumerates the exact status vocabulary (new | applied | interview | offer | rejected | accepted), which distinguishes it from siblings like update_resume_section or archive_vacancy. Concrete examples ('mark it applied...', 'rejected when they got a no') make the intent unambiguous.
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?
Provides clear triggering context via examples of when an agent should call it (user reports sending an application, or a rejection). It also states the precondition that at least one of status/notes is required. It does not name alternative tools for adjacent needs (e.g. archive_vacancy), so it stops short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_career_memoryUpdate career memoryAIdempotentInspect
Remember or update the user's structured career preferences — target_roles, locations, remote_preference, seniority_goal, industries, salary_expectation, work_authorization, search_stage, blockers, motivation. Provided fields overwrite; omitted or null fields are kept; "" (or [] for a list) clears one. Returns the full career memory.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| facts | No | Free-form remembered facts. |
| blockers | No | Things blocking the user's search. |
| locations | No | Preferred work locations. |
| industries | No | Industries of interest. |
| motivation | No | What drives the user's next move. |
| search_stage | No | Where the user is in their job search. |
| target_roles | No | Roles the user is targeting. |
| seniority_goal | No | Target seniority/grade. |
| remote_preference | No | Free text, e.g. 'remote', 'remote only', 'hybrid', 'onsite', 'open to remote / any country'. The radar reads it: a remote word narrows to remote jobs, hybrid / onsite / office words to non-remote ones, 'open to' or 'anywhere' (without 'only') leaves both. |
| salary_expectation | No | Salary expectation, free text. |
| work_authorization | No | Visa / right-to-work situation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety and idempotency (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description adds the critical behavior the annotations cannot express: provided fields overwrite, omitted/null fields are preserved, and empty string or empty list clears a field. That tri-state merge contract is exactly what an agent needs to avoid accidentally wiping data.
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 sentences, front-loaded with purpose followed by the merge contract and return statement. The long field enumeration is justified by the near-zero schema coverage, though it reads as a dense run-on rather than a scannable structure.
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 nested-object mutation tool, the description covers the write semantics, field inventory, and return behavior, with annotations carrying the safety profile and an output schema existing for the return value. Remaining gaps are the absence of sibling routing (vs add_career_fact / get_career_memory) and any note on permissions or limits.
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 effectively near zero (only remote_preference is annotated), so the description must carry the burden and only partially does: it lists every field name and the update semantics, but never explains what fields like blockers, search_stage, or seniority_goal actually mean. The schema itself documents the free-text example only for remote_preference, so the description adds the field inventory but not per-field meaning.
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 pair (remember/update) and the exact resource: the user's structured career preferences, enumerated field by field. An agent immediately knows this is the write path for profile-level preferences. It does not, however, name or distinguish itself from siblings like add_career_fact or get_career_memory.
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?
Usage is implied through the update semantics (overwrite/keep/clear) rather than stated. There is no explicit 'use this instead of add_career_fact when...' routing, and no mention of when to prefer this over the per-fact tools, so the agent must infer the boundary itself.
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.
7 tool updates
- Changed
export_resume_pdf8 fields changed- added
Output schema / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "ISO 8601 UTC moment pdf_url stops working.", + "title": "Expires At" +} - added
Output schema / properties / file_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The name the file saves under; null while the file renders.", + "title": "File Name" +} - added
Output schema / properties / is_currentAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Whether the file matches the resume as it is now; null while it renders.", + "title": "Is Current" +} - added
Output schema / properties / made_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "ISO 8601 UTC moment the file was made.", + "title": "Made At" +} - added
Output schema / properties / page_countAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Pages in the file.", + "title": "Page Count" +} - added
Output schema / properties / pdf_urlAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Address on ResumeQuick.app that downloads the file without signing in, until expires_at. The user's own copy, not a link for other people. Null while the file renders.", + "title": "Pdf Url" +} - changed
Output schema / properties / reused / descriptionPrevious value: -"True when this exact resume already had a file: it is handed back without a new render."New value: +"True when this exact resume already had a file: it is handed back without a new render, and the fields below describe it." - added
Output schema / properties / status / descriptionAdded value: +"'completed' when the file is ready in this reply (reused); 'processing' while it renders."
- Changed
get_offer2 fields changed- changed
Output schema / properties / total_comp_current / descriptionPrevious value: -"4-year projection of the offer as it stands."New value: +"4-year total of the offer as it stands, added up from its pay lines; null when a pay line has no amount." - changed
Output schema / properties / total_comp_negotiated / descriptionPrevious value: -"4-year projection if every ask lands."New value: +"The same 4-year total if every ask with an amount lands; null when it cannot be added up."
- Changed
get_pricing2 fields changed- changed
Output schema / $defs / PricingSku / properties / billing_cycle / descriptionPrevious value: -"Term label: 'monthly' | 'yearly' | 'one_time'. Names the length, not a charge schedule — see auto_renews."New value: +"Term label: 'monthly' | 'quarterly' | 'one_time'. Names the length, not a charge schedule — see auto_renews." - changed
Output schema / $defs / PricingSku / properties / code / descriptionPrevious value: -"SKU code, e.g. 'SPRINT_MONTH' | 'CAREER_YEAR' | 'PACK_INTERVIEW_10'."New value: +"SKU code, e.g. 'SPRINT_MONTH' | 'CAREER_QUARTER' | 'PACK_INTERVIEW_10'."
- Changed
get_radar_status3 fields changed- added
Output schema / $defs / RadarSearchQueryItem / properties / role / descriptionAdded value: +"The title the boards were searched with. Once a scan has derived the search profile it is the English spelling job boards use, so it can differ from the words the user typed." - added
Output schema / $defs / RadarSearchQueryItem / properties / role_displayAdded value: +{ + "description": "The same role in the user's own words: filters.role as typed when the last scan ran those filters, otherwise the searched title. This is the name the user knows the role by.", + "title": "Role Display", + "type": "string" +} - changed
Output schema / $defs / RadarSearchQueryItem / requiredPrevious value: -[ - "role" -]New value: +[ + "role", + "role_display" +]
- Changed
get_task_status1 field changed- added
Output schema / $defs / TaskResult / properties / guarded_sectionsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "For a rewrite: sections (by section name, e.g. 'summary', 'experience') the rewrite came back with empty or with fewer entries although the request was not read as a removal, so their previous content was kept. update_resume_section clears or trims a section directly.", + "title": "Guarded Sections" +}
- Changed
set_radar_filters3 fields changed- added
Output schema / $defs / RadarSearchQueryItem / properties / role / descriptionAdded value: +"The title the boards were searched with. Once a scan has derived the search profile it is the English spelling job boards use, so it can differ from the words the user typed." - added
Output schema / $defs / RadarSearchQueryItem / properties / role_displayAdded value: +{ + "description": "The same role in the user's own words: filters.role as typed when the last scan ran those filters, otherwise the searched title. This is the name the user knows the role by.", + "title": "Role Display", + "type": "string" +} - changed
Output schema / $defs / RadarSearchQueryItem / requiredPrevious value: -[ - "role" -]New value: +[ + "role", + "role_display" +]
- Changed
share_resume_link1 field changed- changed
Output schema / properties / url / descriptionPrevious value: -"The public link on ResumeQuick.app. Anyone with it can open and download the resume until the user closes it on their resume page; it has no expiry date and counts no opens. Null while the first file is still being made."New value: +"The public link on ResumeQuick.app. Anyone with it can open and download the resume until it is closed, with close_resume_link or on the resume page; it has no expiry date and counts no opens. Null while the first file is still being made."
1 tool update
- Changed
get_guild_news1 field changed- changed
Output schema / $defs / GuildCheersItem / properties / people / descriptionPrevious value: -"How many people cheered the person's latest cheered step or batch of steps."New value: +"How many people cheered the person's latest cheered step or day of steps."
8 tool updates
- Changed
get_guild_news1 field changed- changed
Output schema / $defs / GuildCheersItem / properties / step_kind / descriptionPrevious value: -"What the step was: applied, fit_check, cover_letter, rehearsal, …"New value: +"What was cheered: a step (applied, fit_check, cover_letter, rehearsal, …) or post, the person's post of the day"
- Added
get_market_snapshot - Changed
get_pricing1 field changed- changed
Output schema / $defs / PricingLimit / properties / credit_cost / descriptionPrevious value: -"Credits one action of this type is worth on plans with a monthly credit pool. chat_message, interview_session and radar_scan never draw on the pool."New value: +"Bonus or pack credits one action of this type costs once its allowance is spent. radar_scan is not bought with credits."
- Changed
get_radar_matches2 fields changed- changed
Output schema / $defs / RadarMatchItem / properties / on_screen / descriptionPrevious value: -"True when the user has seen this match in the app: dealt into their radar deck, saved, put off or skipped, or analyzed (it is then in their vacancies). False while the user has not opened the radar since the scan found it; the next visit deals it on every plan."New value: +"True when the user has seen this match in the app: dealt into their radar deck, looked at in the radar feed, saved, put off or skipped, or analyzed (it is then in their vacancies). False while the user has not opened the radar since the scan found it; the next visit deals it on every plan." - changed
Output schema / $defs / RadarMatchItem / properties / status / enumPrevious value: -[ - "new", - "saved", - "deferred", - "archived", - "skipped" -]New value: +[ + "new", + "saved", + "deferred", + "archived", + "skipped", + "seen" +]
- Changed
get_task_status1 field changed- added
Output schema / $defs / TaskResult / properties / unchanged_countAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Suggestions that changed nothing: the resume states nothing they build on.", + "title": "Unchanged Count" +}
- Changed
get_usage7 fields changed- removed
Output schema / $defs / UsageCredits / properties / remainingRemoved value: -{ - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "Credits left in this month's pool; null on plans without a pool.", - "title": "Remaining" -} - removed
Output schema / $defs / UsageCredits / properties / resets_atRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "ISO 8601 UTC moment the pool refills to total; null on plans without a pool.", - "title": "Resets At" -} - removed
Output schema / $defs / UsageCredits / properties / totalRemoved value: -{ - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "The pool's monthly size on the current plan; null on plans without a pool.", - "title": "Total" -} - changed
Output schema / $defs / UsageCredits / requiredPrevious value: -[ - "remaining", - "total", - "resets_at", - "bonus", - "pack_credits" -]New value: +[ + "bonus", + "pack_credits" +] - changed
Output schema / $defs / UsageItem / properties / credit_cost / descriptionPrevious value: -"Credits one use of this action is worth. chat_message, interview_session and radar_scan never draw on the monthly credit pool, and radar_scan is not bought with bonus or pack credits either."New value: +"Bonus or pack credits one use of this action costs once its allowance is spent. radar_scan is not bought with credits." - changed
Output schema / $defs / UsageItem / properties / remaining / descriptionPrevious value: -"Uses available right now: what the allowance has left, plus what the bonus and pack credits in `credits` can buy of this action beyond it, capped by the monthly credit pool on plans that have one. So remaining can be larger than limit. Null means unlimited."New value: +"Uses available right now: what the allowance has left, plus what the bonus and pack credits in `credits` can buy of this action beyond it. So remaining can be larger than limit. Null means unlimited." - changed
Output schema / properties / credits / descriptionPrevious value: -"The monthly credit pool on plans that meter one (free, sprint), and bonus and pack credits on any plan; null when there is neither."New value: +"Bonus and pack credits, which buy uses beyond an action's allowance on any plan; null when there are none."
- Changed
get_vacancy_detail1 field changed- added
Output schema / properties / unchanged_suggestion_indicesAdded value: +{ + "description": "Indices (into resume_suggestions) whose last apply changed nothing: the resume states nothing they build on yet. Applying them again changes nothing until the resume gains what they need.", + "items": { + "type": "integer" + }, + "title": "Unchanged Suggestion Indices", + "type": "array" +}
- Added
read_job_link
2 tool updates
- Changed
get_radar_status3 fields changed- added
Output schema / $defs / RadarLocalBoardItemAdded value: +{ + "properties": { + "name": { + "title": "Name", + "type": "string" + }, + "url": { + "title": "Url", + "type": "string" + } + }, + "required": [ + "name", + "url" + ], + "title": "RadarLocalBoardItem", + "type": "object" +} - added
Output schema / $defs / RadarSearchQueryItem / properties / foundAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Matches the last scan kept under the filters; null while it runs and on scans before 2026-09-27.", + "title": "Found" +} - added
Output schema / $defs / RadarSearchQueryItem / properties / local_boardAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/RadarLocalBoardItem" + }, + { + "type": "null" + } + ], + "default": null, + "description": "In countries whose postings live mostly on a local job site the radar does not search (Kazakhstan, Ukraine, Turkey, Korea, Georgia, the Gulf and others): that site's name and its search for the role. The radar never reads it; null for every other country." +}
- Changed
set_radar_filters3 fields changed- added
Output schema / $defs / RadarLocalBoardItemAdded value: +{ + "properties": { + "name": { + "title": "Name", + "type": "string" + }, + "url": { + "title": "Url", + "type": "string" + } + }, + "required": [ + "name", + "url" + ], + "title": "RadarLocalBoardItem", + "type": "object" +} - added
Output schema / $defs / RadarSearchQueryItem / properties / foundAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Matches the last scan kept under the filters; null while it runs and on scans before 2026-09-27.", + "title": "Found" +} - added
Output schema / $defs / RadarSearchQueryItem / properties / local_boardAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/RadarLocalBoardItem" + }, + { + "type": "null" + } + ], + "default": null, + "description": "In countries whose postings live mostly on a local job site the radar does not search (Kazakhstan, Ukraine, Turkey, Korea, Georgia, the Gulf and others): that site's name and its search for the role. The radar never reads it; null for every other country." +}
3 tool updates
- Changed
delete_vacancy2 fields changed- removed
Output schema / properties / radar_matches_archivedRemoved value: -{ - "default": 0, - "description": "Radar matches that pointed at this analysis and were moved to the radar archive, not deleted.", - "title": "Radar Matches Archived", - "type": "integer" -} - added
Output schema / properties / radar_matches_deletedAdded value: +{ + "default": 0, + "description": "Radar matches that pointed at this analysis; deleted with it, a later scan does not bring them back.", + "title": "Radar Matches Deleted", + "type": "integer" +}
- Added
get_guild_news - Changed
get_next_step5 fields changed- added
Output schema / properties / app_urlAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Full link to step_path on the ResumeQuick site, opened after signing in to this account; null when paused.", + "title": "App Url" +} - changed
Output schema / properties / radar / descriptionPrevious value: -"off (the automatic daily search is off — get_radar_status.auto_search_enabled is false; matches already found stay), searching (on, radar_matches is 0), matches (on, radar_matches above 0)."New value: +"off (the automatic daily search is off — get_radar_status.auto_search_enabled is false; matches already found stay), searching (on, with no new or saved match in the working list), matches (on, with at least one)." - removed
Output schema / properties / radar_matchesRemoved value: -{ - "description": "Radar matches still in the working list: new ones, whether already shown or still waiting in the pool, and saved ones; skipped, deferred and archived ones are not counted. An input to the step: the job the step is about is in match and reason, which state no count.", - "title": "Radar Matches", - "type": "integer" -} - removed
Output schema / properties / saved_to_analyzeRemoved value: -{ - "description": "Saved radar matches with no analysis. An input to the step: the one saved job the step names is in match and reason, which state no count.", - "title": "Saved To Analyze", - "type": "integer" -} - changed
Output schema / requiredPrevious value: -[ - "step", - "reason", - "radar", - "radar_matches", - "saved_to_analyze" -]New value: +[ + "step", + "reason", + "radar" +]
2 tool updates
- Changed
get_pricing1 field changed- changed
Output schema / $defs / PricingSku / properties / price_usd / descriptionPrevious value: -"Price in USD, e.g. 9.99."New value: +"Price in USD, e.g. 10."
- Changed
get_task_status3 fields changed- added
Output schema / $defs / TaskResult / properties / best_companyAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Company of that strongest new posting.", + "title": "Best Company" +} - added
Output schema / $defs / TaskResult / properties / best_match_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The strongest of the postings this scan found new: its radar match id.", + "title": "Best Match Id" +} - added
Output schema / $defs / TaskResult / properties / best_titleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Job title of that strongest new posting.", + "title": "Best Title" +}
11 tool updates
- Changed
create_profile2 fields changed- changed
Input schema / $defs / CreateProfileInput / properties / language / descriptionPrevious value: -"Locale code of the language the profile is written in, e.g. 'en_EN', 'de_DE'. Defaults to the user's language."New value: +"The language the profile is written in: a locale code ('de_DE'), a language code ('de', 'en_US') or its English name ('German'). Defaults to the user's language." - changed
Input schema / $defs / GuidedProfileInput / properties / role / descriptionPrevious value: -"The job the user does or is looking for, in their own words."New value: +"The job the user does now or did last, in their own words — not the one they are looking for."
- Changed
export_resume_pdf1 field changed- changed
Output schema / properties / reused / descriptionPrevious value: -"True when this exact resume already had a file: it is handed back, nothing is spent."New value: +"True when this exact resume already had a file: it is handed back without a new render."
- Changed
get_interview_results1 field changed- changed
Output schema / $defs / InterviewItem / properties / analysis_outcome / descriptionPrevious value: -"Why the attempt carries no score. 'unusable_audio': speech recognition returned nothing usable, so the attempt was not scored and cost the user no session."New value: +"Why the attempt carries no score. 'unusable_audio': speech recognition returned nothing usable; 'no_answers': the attempt ended before any answer got a score. Either way the attempt was not scored and cost the user no session."
- Changed
get_next_step2 fields changed- changed
Output schema / properties / radar_matches / descriptionPrevious value: -"Radar matches still in the working list: new ones, whether already shown or still waiting in the pool, and saved ones; skipped, deferred and archived ones are not counted."New value: +"Radar matches still in the working list: new ones, whether already shown or still waiting in the pool, and saved ones; skipped, deferred and archived ones are not counted. An input to the step: the job the step is about is in match and reason, which state no count." - changed
Output schema / properties / saved_to_analyze / descriptionPrevious value: -"Saved radar matches with no analysis."New value: +"Saved radar matches with no analysis. An input to the step: the one saved job the step names is in match and reason, which state no count."
- Changed
get_radar_matches3 fields changed- removed
Output schema / $defs / RadarDeckItemRemoved value: -{ - "properties": { - "daily_left": { - "description": "How many more the deck deals today, the next time the user opens the radar (0: today's are dealt).", - "title": "Daily Left", - "type": "integer" - }, - "daily_limit": { - "description": "How many new matches the free plan deals into the deck a UTC day.", - "title": "Daily Limit", - "type": "integer" - }, - "next_deal_at": { - "description": "When the next day's deal starts (UTC midnight), ISO 8601.", - "title": "Next Deal At", - "type": "string" - }, - "pool_remaining": { - "description": "Matches waiting in the pool behind the deck, not seen by the user yet.", - "title": "Pool Remaining", - "type": "integer" - } - }, - "required": [ - "daily_limit", - "daily_left", - "pool_remaining", - "next_deal_at" - ], - "title": "RadarDeckItem", - "type": "object" -} - changed
Output schema / $defs / RadarMatchItem / properties / on_screen / descriptionPrevious value: -"True when the user can see this match in the app: dealt into their radar deck, saved, put off or skipped, or analyzed (it is then in their vacancies). False while it waits in the pool behind the deck — the user has not seen it and will not find it on the radar screen yet."New value: +"True when the user has seen this match in the app: dealt into their radar deck, saved, put off or skipped, or analyzed (it is then in their vacancies). False while the user has not opened the radar since the scan found it; the next visit deals it on every plan." - removed
Output schema / properties / deckRemoved value: -{ - "anyOf": [ - { - "$ref": "#/$defs/RadarDeckItem" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The free plan's daily deck: the radar screen deals a few new matches a day out of the pool. Null on a paid plan, whose deck is not limited by day, and on the deferred and archived piles." -}
- Changed
get_recent_vacancies2 fields changed- changed
Output schema / $defs / VacancyItem / properties / analyzed_at / descriptionPrevious value: -"ISO 8601 timestamp."New value: +"ISO 8601 timestamp of when the vacancy was analyzed or, if never analyzed, added." - added
Output schema / $defs / VacancyItem / properties / is_pinnedAdded value: +{ + "default": false, + "description": "The user pinned it to the top of their tracker; lists put pinned vacancies first.", + "title": "Is Pinned", + "type": "boolean" +}
- Changed
get_usage1 field changed- changed
Output schema / $defs / UsageItem / properties / action / descriptionPrevious value: -"Action type, e.g. 'vacancy_analysis' | 'resume_generation' | 'chat_message'. 'pdf_download' counts new PDF files; downloading the file already made for an unchanged resume is not counted."New value: +"Action type, e.g. 'vacancy_analysis' | 'resume_generation' | 'chat_message'."
- Changed
get_vacancy_detail2 fields changed- changed
Output schema / properties / analyzed_at / descriptionPrevious value: -"ISO 8601 timestamp."New value: +"ISO 8601 timestamp of when the vacancy was analyzed or, if never analyzed, added." - added
Output schema / properties / is_pinnedAdded value: +{ + "default": false, + "description": "The user pinned it to the top of their tracker; lists put pinned vacancies first.", + "title": "Is Pinned", + "type": "boolean" +}
- Changed
search_vacancies2 fields changed- changed
Output schema / $defs / VacancyItem / properties / analyzed_at / descriptionPrevious value: -"ISO 8601 timestamp."New value: +"ISO 8601 timestamp of when the vacancy was analyzed or, if never analyzed, added." - added
Output schema / $defs / VacancyItem / properties / is_pinnedAdded value: +{ + "default": false, + "description": "The user pinned it to the top of their tracker; lists put pinned vacancies first.", + "title": "Is Pinned", + "type": "boolean" +}
- Changed
share_resume_link5 fields changed- changed
Input schema / $defs / ShareResumeLinkInput / properties / existing_file / descriptionPrevious value: -"True shares the file already made, as it is, without making a new one — free on every plan. False (default) shares the resume as it is now, making a new file when it changed."New value: +"True shares the file already made, as it is, without making a new one. False (default) shares the resume as it is now, making a new file when it changed." - changed
Output schema / properties / follows_latest / descriptionPrevious value: -"True on a paid plan: the link shows the newest file the user makes. False on the free plan: it shows this version until the user updates the link."New value: +"True when the link shows the newest file the user makes, which is the case on every plan. False only for a link made before that, pinned to one version until it is shared again." - removed
Output schema / properties / new_file_uses_free_pdfRemoved value: -{ - "description": "True when bringing the link up to date makes a new file, which spends the free plan's PDF.", - "title": "New File Uses Free Pdf", - "type": "boolean" -} - removed
Output schema / properties / next_free_atRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "ISO 8601 UTC moment the free plan's next new PDF is free, when this one is spent.", - "title": "Next Free At" -} - changed
Output schema / requiredPrevious value: -[ - "resume_id", - "url", - "task_id", - "version_made_at", - "follows_latest", - "is_current", - "file_name", - "page_count", - "new_file_uses_free_pdf", - "next_free_at" -]New value: +[ + "resume_id", + "url", + "task_id", + "version_made_at", + "follows_latest", + "is_current", + "file_name", + "page_count" +]
- Changed
translate_resume1 field changed- changed
Input schema / $defs / TranslateResumeInput / properties / target_language / descriptionPrevious value: -"Locale code of the language to translate into, e.g. 'en_EN', 'de_DE', 'es_ES'."New value: +"The language to translate into: a locale code ('de_DE'), a language code ('de', 'de-AT', 'en_US') or its English name ('German')."
72 tool updates
- First observed
add_career_fact - First observed
analyze_offer - First observed
analyze_radar_match - First observed
analyze_tracked_vacancy - First observed
analyze_vacancy - First observed
apply_vacancy_resume_suggestions - First observed
archive_interview - First observed
archive_radar_match - First observed
archive_vacancy - First observed
cancel_all_reminders - First observed
cancel_reminder - First observed
close_resume_link - First observed
create_profile - First observed
create_reminder - First observed
create_reminders - First observed
create_resume_version - First observed
delete_interview - First observed
delete_radar_match - First observed
delete_resume - First observed
delete_vacancy - First observed
export_resume_pdf - First observed
forget_career_fact - First observed
generate_cover_letter - First observed
get_career_memory - First observed
get_career_tips - First observed
get_coach_plan - First observed
get_collection - First observed
get_interview_results - First observed
get_next_step - First observed
get_offer - First observed
get_pricing - First observed
get_profile_snapshot - First observed
get_radar_matches - First observed
get_radar_status - First observed
get_recent_activity - First observed
get_recent_vacancies - First observed
get_resume - First observed
get_resume_history - First observed
get_resume_link - First observed
get_resume_pdf_url - First observed
get_resume_revision - First observed
get_resume_suggestions - First observed
get_task_status - First observed
get_usage - First observed
get_user_stats - First observed
get_vacancy_detail - First observed
list_offers - First observed
list_reminders - First observed
list_resumes - First observed
pause_coach_plan - First observed
rename_resume - First observed
request_resume_update - First observed
request_vacancy_resume_suggestions - First observed
restore_resume_revision - First observed
save_radar_match - First observed
score_resume - First observed
search_vacancies - First observed
set_active_resume - First observed
set_coach_plan - First observed
set_radar_auto_search - First observed
set_radar_filters - First observed
set_resume_style - First observed
set_search_pause - First observed
set_vacancy_suggestion_declined - First observed
share_resume_link - First observed
skip_radar_match - First observed
start_radar_scan - First observed
translate_resume - First observed
undo_radar_match - First observed
update_resume_section - First observed
update_vacancy_status - First observed
upsert_career_memory
Related MCP Connectors
Find jobs, then get a tailored résumé and cover letter for each one. Tracks your applications too.
- ResuMaxOAuthai.resumax
Find jobs, improve resumes, prepare for interviews, and manage your application pipeline.
Search jobs, prepare resumes and cover letters, retrieve PDFs, and track your applications.
Live jobs from ~5,000 employer ATS boards, hiring profiles, your job profile and tracker.
Related MCP Servers
- AlicenseAqualityAmaintenanceWatches company job boards (Greenhouse, Lever, Ashby, Workable, Workday and more) for new roles that match your filters, ranks them in a digest optionally fit-scored against your resume, and tracks every application with interview prep sheets. It never applies for you.230131 PyPIMIT
- AlicenseNot gradedqualityCmaintenanceProcesses and manages applicant resumes, facilitates job searches, generates job-specific resumes, and creates tailored cover letters.1MIT
- AlicenseAqualityDmaintenanceProvides job search, local resume parsing, and resume-to-job matching via official APIs and local file processing.5MIT
- FlicenseAqualityDmaintenanceEnables tracking job applications through a pipeline, scheduling follow-ups, and summarizing job search progress via natural language.7-
Glama MCP Gateway
Add one secure layer between your agents and this server.