Skip to main content
Glama
freehire

freehire

by strelov1

freehire MCP server

LightNow capabilities

An MCP server over the freehire job API. It lets any MCP host — Claude Desktop, Claude Code, or a compatible agent — search, filter, and apply to IT jobs without a browser, authenticating with a personal API key. Postings are crawled straight from company career boards — 3.3M+ open roles across 294K companies, normalized into one schema and tagged with stack, seniority, region and work mode (live figures).

It mirrors the freehire CLI: same API, same credentials, exposed as MCP tools instead of shell commands.

Install

Hosted endpoint (no install, no key)

The read-only job search tools are also served remotely at https://freehire.me/api/v1/mcp (Streamable HTTP). In Claude Code, install it as a plugin:

/plugin install freehire --marketplace strelov1/freehire-mcp

In other hosts, add the URL as a custom remote connector.

Local server (npm)

No global install needed — the host runs it via npx. Add it to your host's MCP configuration (Claude Desktop → Settings → Developer → Edit config, or ~/.claude.json for Claude Code):

{
  "mcpServers": {
    "freehire": {
      "command": "npx",
      "args": ["-y", "freehire-mcp"],
      "env": { "FREEHIRE_TOKEN": "fhk_xxxxxxxx" }
    }
  }
}

Create the fhk_… key in the web app (freehire.me → account menu → API keys). If you already use the freehire CLI (freehire auth login), you can omit env — the server reads the same ~/.freehire/creds.json.

Related MCP server: jobfinder-mcp

Authentication

The token and API base URL resolve with precedence env → ~/.freehire/creds.json → default https://freehire.me:

What

Sources

Token

FREEHIRE_TOKEN → creds file

API base URL

FREEHIRE_API_URL → creds file → https://freehire.me

The server only reads the credentials file (it never writes it — logging in stays the CLI's job). If no token is configured, tools return a clear "not authenticated" error rather than the server failing to start.

Tools

Tool

Purpose

whoami

Authenticated user (verify the key).

profile

The candidate's saved job-search profile (skills, preferences, contact-free CV).

facets

The filter/skill vocabulary: every facet's live values with counts. Call first.

search

Keyword + facet job search; returns jobs with their full description as markdown and the total match count.

market_fit

Score a skill list against live market demand (coverage + gaps).

job

A single job's full content by slug.

check_jobs_open

Whether postings are still open (up to 50 slugs). Run it on a shortlist before presenting it.

similar_jobs

Postings most similar to one posting.

salary_stats

Salary percentiles by role family, seniority and country, with sample sizes.

job_market_stats

How many open postings match a set of filters, and what they ask for.

list_filter_values

The values one filter accepts, with counts (golang finds go).

company

A company and its open jobs by slug.

apply

Mark a job applied.

save / unsave

Bookmark / remove a bookmark.

stage

Set the application stage (server-validated).

note

Attach a free-text note.

my

The caller's tracked jobs (all/viewed/saved/applied) with stage + note.

subscribe

Create a job alert: a saved search delivered by email, Telegram, the app or a webhook.

list_subscriptions

The caller's job alerts with every setting.

update_subscription

Change an alert's name, search, channels, or pause it.

unsubscribe

Stop an alert on every channel or one.

subscription_updates

The new postings the caller's alerts have matched.

cv_tailor

Start (or reopen) tailoring for a vacancy; returns the CV id the other cv_* tools take.

cv_list

The caller's tailored CVs with the vacancy each was written for.

cv_context

The fit analysis a tailored CV should reframe toward (missing_have vs missing_gap).

cv_get

A tailored CV's full document.

cv_edit

Apply a batch of path-addressed edits to a tailored CV, atomically (server-validated; uncited claims are refused).

cv_render

Render a tailored CV to a PDF, returned as a base64 application/pdf resource.

experience_list

The candidate's experience bank, with each achievement's provenance. cv_edit's evidence_id comes from here.

experience_add_employment / experience_add_achievement

Record a place, or one piece of evidence.

experience_update_employment / experience_update_achievement

Correct one. Field-level: what you do not name is kept.

experience_remove_employment / experience_remove_achievement

Delete one. No undo; a place must be empty first.

submit

Submit a vacancy for moderation.

my_submissions

The caller's submissions with status.

contribute

Hand over a vacancy or company career board link to the catalogue intake.

my_contributions

The caller's contributed links and boards with ingestion status.

jobs_add / jobs_edit

Moderator: author / edit a job (403 without the role).

submissions_pending

Moderator: the review queue.

submission_approve / submission_reject

Moderator: decide on a submission.

Filters. search, market_fit, and facets share the same market-filter parameters: remote, region, country, city, company, category, role, seniority, employment_type, english_level, exclude_skill, salary_min, visa, plus a generic facets map ({"source": "greenhouse"}) for any other facet in the vocabulary. Discover valid values with the facets tool — do not invent them. In search, skills is a filter; in market_fit, skills is the measured set.

Geography widens. region, country and city are ONE OR-group: region: ["eu"] with country: ["IT"] means "in Europe or in Italy" and returns everything the region alone would. To search a single country, pass country and omit region. The three name a single concept — where — so picking two places reads as "either", which is what makes region: ["eu"] with country: ["BR"] ("Europe or Brazil") useful. There is no AND to switch on: _mode=and does not apply to geography.

Unknown values are named, not guessed. A filter value the API does not recognise (a misspelt skill such as golangg) is reported in ignored_values, e.g. {"skills": ["golangg"]}, beside total in search and in the {data, ignored_values} wrapper of facets and market_fit. Unlike an unread param it still narrows — to nothing — so a 0 beside it is a typo, not an empty market. Skill aliases resolve server-side (golang searches go); list_filter_values names the real value.

Unread params are ignored, not refused. A filter key the API does not recognize does not fail the request, it widens it. Such keys come back in the result's ignored list, with did_you_mean when only the grammatical number was wrong. search reports it alongside total; facets and market_fit answer a single object, so they wrap it as {data, ignored} — and only then, leaving a clean call's shape untouched. Any number from a result carrying ignored answers a broader question than the one asked — retry with the suggested name before reporting it.

Forwarded tools. check_jobs_open, similar_jobs, salary_stats, job_market_stats and list_filter_values have no REST route, so they are forwarded to freehire's anonymous hosted MCP server (/api/v1/mcp, no key sent). The five job-alert tools are forwarded to the signed-in one (/api/v1/mcp/account) with your API key, so an alert made here is exactly the website's — the same saved search, channel rule and match ledger, not a second implementation of them. Their answers arrive in the hosted server's own words. Automatic applications (auto_apply_*) stay on the OAuth-signed-in endpoint and are not offered to an API key.

Searching well. Join a role's two or three names with an uppercase OR (title:SRE OR title:"site reliability"), put location, work mode, seniority and skills in filters rather than the query, loosen one constraint at a time when few results come back, shortlist from the search results and run check_jobs_open before presenting.

Descriptions. search reads the API's agent endpoint, so every hit already carries the posting's full description rendered as markdown — a host can screen a result set without a job call per hit. Descriptions are long, so keep limit modest.

The evidence rule. Every achievement in the bank records who asserted it. cv_import, stated_in_chat and manual mean the candidate did, and may be cited on a CV; agent_inferred means a model read it into the record, and may not. cv_edit refuses any claim about the candidate without an evidence_id pointing at a citable one, which is why experience_list is the tool that makes cv_edit usable at all.

Correcting an achievement does not move that label: an agent_inferred one stays uncitable however it is reworded. The only way it becomes citable is to ask the candidate, then record what they say with experience_add_achievement.

Removing is final — the bank has no undo. A place must be emptied before it can go, because deleting one would take every achievement under it. Folding two achievements into one, keeping the numbers from both, is on the site.

Each tool returns the raw API data as JSON text; an API error becomes an isError result carrying the HTTP status (a 401 adds an auth hint).

Develop

npm install
npm test        # vitest: config, client (mock server), facets, tool dispatch
npm run build   # tsc → dist/

License

MIT — see LICENSE. The freehire backend and CLI are MIT too.

Available Tools

45 tools
applyB
Idempotent
Inspect

Mark a job as applied for the authenticated user. Idempotent.

NameRequiredDescriptionDefault
slugYesThe job's public slug (from search or facets results).

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description adds 'Idempotent' but this is already declared in annotations via idempotentHint=true. No additional behavioral context like authentication requirements, side effects, or error conditions. With annotations present, the description adds minimal value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no fluff. Every word earns its place. Exceptionally concise and to the point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description covers the essential purpose and idempotency. Could mention the return behavior (e.g., success/failure indicators) but not strictly necessary given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single parameter with full schema coverage (description in schema). Description adds no extra meaning beyond what the schema provides. Baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb 'Mark' and resource 'job', and mentions idempotency. Could be more specific about the effect (e.g., creating an application) but overall clear. No differentiation from siblings like 'submit' or 'save'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives. Does not explain prerequisites (e.g., must be authenticated) or when not to use (e.g., if already applied). The only behavioral note is idempotency, which is already annotated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_jobs_openA
Read-only
Inspect

Check whether postings are still open, by the public_slug search results carry — up to 50 per call. Use it before presenting a shortlist or acting on a saved one: each posting answers open, closed or not_found, with when it closed or was last seen live.

NameRequiredDescriptionDefault
slugsYesPosting slugs; up to 50 are checked per call.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds useful behavior beyond that: a 50-slug batch limit and the possible per-posting outcomes (open, closed, not_found) including closure timing or last-seen-live information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with no waste. The core action and batch limit are front-loaded, followed immediately by the workflow guidance and return semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only check with no output schema, the description provides enough: what it checks, the batch limit, when to use it, and what each posting response can contain. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value by clarifying that the slugs are the public_slug values returned by search results, which goes beyond the schema's generic 'Posting slugs' label.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: check whether postings are still open. It identifies the slug source (public_slug carried by search results) and distinguishes this from search or job-detail tools by focusing on open/closed/not_found status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: use before presenting a shortlist or acting on a saved one. It does not explicitly name an alternative tool or exclusion, but the timing guidance is strong enough for an agent to know when this belongs in a workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

companyA
Read-only
Inspect

Fetch a company and its open jobs by company slug.

NameRequiredDescriptionDefault
slugYesThe company slug (from a job's company_slug).

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true; the description adds that the tool also returns open jobs beyond the company info. It does not mention pagination or data limits, but for a simple fetch this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that earns its place with no filler. Every word adds meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple retrieval tool with one parameter and no output schema, the description provides sufficient high-level information. It does not detail the output structure, but that is acceptable given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the parameter 'slug' is described in both schema and description. The description reiterates the role of slug ('by company slug'), adding no new semantic detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Fetch'), the resource ('a company and its open jobs'), and the method ('by company slug'). It distinguishes from sibling tools like 'job' and 'search' by specifying the combined fetch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when a company slug is available and one wants company details plus open jobs, but it does not explicitly compare with siblings or state when not to use it. Absence of usage guidance is a gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

contributeAInspect

Hand freehire a link to a vacancy or an ATS company career board (the same intake the website and CLI use). If the posting already exists you get its slug back; if we can read the page it is imported into the catalogue; if the company's board is one we do not crawl yet, it is queued for onboarding. The answer's status is one of found, tracked, imported, review or queued. Check sent links later with my_contributions.

NameRequiredDescriptionDefault
urlYesThe job posting or company career board URL to contribute.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false, so the description carries most of the load and does so well: it explains duplicate handling (existing posting returns its slug), page-readability fallback (imported into catalogue), and uncrawled boards (queued for onboarding). It omits auth requirements and rate limits, which are the remaining behavioral gaps for a write-intake tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with the purpose, followed by outcomes, the status enumeration, and the follow-up sibling. Every sentence adds distinct information with no repetition of the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must explain returns, and it does: it enumerates the possible status values (found, tracked, imported, review, queued) and states that an existing posting yields a slug. For a one-parameter intake tool this is complete enough to call correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single url parameter, so the baseline is already met. The description adds real meaning beyond the schema by clarifying that the URL may be either an individual job posting or a whole company career board, which changes what the agent should supply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (hand over/contribute a link) and the exact resources accepted: a vacancy posting or an ATS company career board. It also distinguishes itself from the sibling my_contributions, which is named as the way to check previously sent links.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Makes clear this is the same intake used by the website and CLI, so the agent knows it is the canonical submission path, and it names my_contributions as the follow-up tool. It stops short of explicit when-not-to-use guidance (e.g. do not re-send links already tracked), but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cv_contextA
Read-only
Inspect

Show the cached fit-analysis context a tailored CV should reframe toward: verdict, recommendation, dimension comments, and the requirement split — missing_have (reframe existing evidence) vs missing_gap (ask the candidate before adding). Read this before editing.

NameRequiredDescriptionDefault
idYesThe CV id, from cv_tailor or cv_list (or the tailoring workspace URL /tailor/<job>?cv=<id>). Opaque — never construct or guess one.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuinely useful behavior: the data is cached analysis, and the missing_have vs missing_gap split prescribes what to do with each (reframe existing evidence vs ask the candidate) — actionable context an agent could not infer from 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence enumerating the returned content, followed by a short imperative. Front-loaded and free of filler, though the packed parenthetical makes it heavier to parse than necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by naming the key fields returned plus the interpretation each requires. The only gap is not stating the response shape or whether context may be absent when no tailoring exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage the single id parameter is fully documented in the schema, including its provenance and the warning never to construct one. The description adds nothing about the parameter, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: shows the cached fit-analysis context for a tailored CV, and enumerates its contents (verdict, recommendation, dimension comments, requirement split). This clearly separates it from cv_get (CV content) in spirit, though it never names the sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Read this before editing" gives a concrete usage trigger tied to the editing workflow. It stops short of naming alternatives (cv_get, cv_tailor) or stating when not to call it, so it's clear context rather than full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cv_editAInspect

Apply a batch of path-addressed edits to a tailored CV, atomically. Read cv_context and cv_get first — indices are counted over the document cv_get returned. THE HONEST WALL: editing with an API key edits as the tailoring agent, and the server enforces it — the candidate's own name, email, phone and links are refused, and anything stating what they DID needs evidence_id, the id of something they asserted themselves. One uncited op rejects the whole batch. For a missing_have requirement, reframe an existing bullet; for a missing_gap, ask the candidate before writing anything. A bad path is a 422 and the CV is untouched. Export with cv_render.

NameRequiredDescriptionDefault
idYesThe CV id, from cv_tailor or cv_list (or the tailoring workspace URL /tailor/<job>?cv=<id>). Opaque — never construct or guess one.
opsYesEvery edit that belongs together, in one call.
noteNoYour own one-line reason for the change; shown to the candidate as the agent's words.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false, so the description carries the load and does so richly: atomicity ('one uncited op rejects the whole batch'), server-enforced refusal of PII fields, the evidence_id requirement, and the 422-on-bad-path contract with the CV left untouched.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and prerequisite, then the constraint wall, then the escape hatch (cv_render). The 'THE HONEST WALL' framing is stylized but the content under it is dense and non-redundant; a slightly cleaner register would earn a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, it covers prerequisites, error semantics, and the evidence contract well. It does not say what a successful batch returns (result shape, counts, whether a new CV revision id comes back), which is the one gap given no output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so a baseline 3 applies, but the description adds genuine meaning beyond the schema: it explains that path indices are counted over the document cv_get returned and reinforces that evidence_id backs any claim of what the candidate did. The note parameter is not elaborated, which keeps it short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (apply a batch of edits), resource (tailored CV), and a distinguishing trait (path-addressed, atomic). An agent can differentiate it from cv_tailor, cv_get, and experience_* tools immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit prerequisites (read cv_context and cv_get first, because indices are counted over cv_get's output), a routing rule for missing_have vs missing_gap, and a pointer to cv_render for export. Alternatives and conditions are named rather than inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cv_getA
Read-only
Inspect

Fetch a tailored CV with its full document (header, summary, experience bullets, skill groups).

NameRequiredDescriptionDefault
idYesThe CV id, from cv_tailor or cv_list (or the tailoring workspace URL /tailor/<job>?cv=<id>). Opaque — never construct or guess one.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered; the description adds value beyond them by disclosing what the payload contains (header, summary, experience bullets, skill groups). It does not mention format, rendering, or failure behavior for a missing id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the parenthetical of returned sections earns its place by telling the agent what it gets back.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully sketches the response shape, and the readOnly annotation covers safety for a one-parameter read. Only the missing guidance relative to sibling CV tools keeps it from being complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already explains the id, its provenance, and that it is opaque. The description adds nothing about the parameter, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fetch a tailored CV') and enumerates the returned document sections, which distinguishes it from the list-oriented cv_list. It does not explicitly name any sibling to contrast with, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The word 'tailored' plus a single required id implies retrieving one already-generated CV, but the description never says when to use this instead of cv_list, cv_context, or cv_edit. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cv_listA
Read-only
Inspect

List the caller's tailored CVs, newest edit first, each with the vacancy it was written for. Use this to find the id the other cv_* tools take, or to check whether a vacancy already has a tailored copy.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered; the description adds non-obvious behavior — sort order (newest edit first) and that each item is paired with its target vacancy. It doesn't state whether results are scoped to the caller only or how large the list can get, which would have made it 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both front-loaded with the highest-value facts (what it returns, then how to use it). No filler or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing the return value, and it does: ordered list of CVs, each annotated with the vacancy it targets. Combined with the annotation for safety, 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4; there is no argument semantics left to explain and the description correctly presents the call as argument-free.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list the caller's tailored CVs) plus the ordering (newest edit first) and payload shape (each with the vacancy it was written for). This clearly separates it from cv_get, which retrieves one CV by id.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives two concrete use cases: discovering the id required by the other cv_* tools, and checking whether a vacancy already has a tailored copy. It implies rather than states the exclusion ('don't call this if you already have the id'), so the routing is clear but not fully enumerated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cv_renderA
Read-onlyIdempotent
Inspect

Render a tailored CV to an ATS PDF, returned as a base64 resource (application/pdf). The bytes are large and not human-readable to the model — call it to produce the deliverable, not to inspect content.

NameRequiredDescriptionDefault
idYesThe CV id, from cv_tailor or cv_list (or the tailoring workspace URL /tailor/<job>?cv=<id>). Opaque — never construct or guess one.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only readOnlyHint/idempotentHint annotated, the description carries the important behavioral payload: the return is a base64 resource of type application/pdf, the bytes are large, and they are not model-readable. That last point is exactly the kind of operational warning an agent cannot get from 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with purpose and output format front-loaded before the anti-use caveat. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter render tool with no output schema, the description supplies the missing return-value story (base64 PDF resource, large payload) and warns against introspection — nothing an agent needs before calling is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter, and the schema description already covers it fully (source via cv_tailor/cv_list, URL form, 'never construct or guess'). The description adds nothing about the id, so this sits at the 100%-coverage baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Render a tailored CV to an ATS PDF,' which unambiguously differs from cv_tailor (produce the CV) and cv_get (fetch the CV). It never names those siblings explicitly, so an agent must infer the boundary rather than being routed to it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'call it to produce the deliverable, not to inspect content' gives an explicit when-to-use and a clear when-not-to-use, with the inverse (inspection) implied toward cv_get/cv_context. It stops short of naming the alternative tool for the inspection case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cv_tailorAInspect

Start tailoring a CV to a vacancy, returning the tailored CV's id (plus the base it was copied from and the bound session). Idempotent per vacancy — calling it again for the same slug reopens the copy that already exists, so it is safe when you do not know whether one exists. It spends one of the candidate's AI credits the first time it creates the copy (402 when the balance will not cover it) and 409s when they have no résumé on the site to seed a base CV from — tell them to upload one; you cannot. It does not call a model: the reframing is your work, through cv_context and cv_edit.

NameRequiredDescriptionDefault
job_slugYesThe job's public slug (from search or facets results).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnlyHint=false; the description adds substantially more: idempotent-per-slug semantics, a one-AI-credit cost on first creation, a 402 on insufficient balance, and a 409 when the candidate has no seed résumé. It also clarifies the tool performs no model call, setting the agent's expectation about what work remains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences with zero filler: purpose+return first, then idempotency, then cost/error behavior, then the boundary against cv_context/cv_edit. The most decision-relevant facts (idempotency, credit spend) are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by enumerating the returned fields (id, base, session). Combined with the cost, error-code, and prerequisite coverage, an agent has everything needed to call it correctly and to handle failures.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single job_slug parameter is fully documented in the schema (public slug from search or facets results). The description reinforces the per-vacancy/slug scoping but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("Start tailoring a CV to a vacancy") and immediately states what is returned (tailored CV id, base copy, bound session). It also differentiates itself from cv_context and cv_edit by declaring it does not call a model, so an agent can distinguish it from the reframing siblings 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit safe-call rule ("calling it again for the same slug reopens the copy that already exists, so it is safe when you do not know whether one exists") and routes follow-up work to cv_context and cv_edit. It also names the prerequisite failure path (409 when no résumé exists, tell them to upload one; you cannot), which is genuine when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

experience_add_achievementAInspect

Record one piece of evidence — the sentence a CV bullet would carry. Only record what the CANDIDATE told you; the server stamps anything created here manual, which means they asserted it, and that stamp is what lets it be cited on a CV. A claim already in the bank, under any spelling, is refused as 409 rather than duplicated — so correct the existing one with experience_update_achievement instead of re-adding it.

NameRequiredDescriptionDefault
claimYesThe achievement as one CV-bullet-grade sentence.
skillsNoCanonical skill slugs, e.g. ["go", "kubernetes"].
contextNoHow it was done, in a sentence or two.
metricsNoNumbers as stated, e.g. ["20s->1s"].
employment_idNoThe place this belongs to; omit to leave it unplaced.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the lone readOnlyHint=false annotation: it discloses the server-side `manual` provenance stamp and why it matters (CV citability), and documents the 409 duplicate-refusal behavior keyed on spelling. That is exactly the kind of side effect and failure mode an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core action before the provenance rule and the dedup/409 escape hatch. Slightly dense in the second sentence but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given full schema coverage and no output schema, the description covers purpose, provenance, and the duplicate case well. The only gap is that it doesn't say what a successful call returns (e.g., the created record id), which leaves a small amount for the agent to discover.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already 100%, so the schema documents all five parameters. The description reinforces the `claim` semantics but adds nothing about skills, metrics, context, or employment_id beyond what the schema states; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb and resource ('Record one piece of evidence'), with the payload shape made concrete as 'the sentence a CV bullet would carry'. It is clearly distinguishable from the neighboring experience_update_achievement and experience_add_employment tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'only record what the CANDIDATE told you' constraint plus an explicit alternative: if the claim already exists, use experience_update_achievement instead of re-adding. Both the when and the when-not are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

experience_add_employmentAInspect

Record a place where evidence was produced — a job or a side project. At least company or role is required. Use the returned id to attach achievements with experience_add_achievement.

NameRequiredDescriptionDefault
endNoSame format as start; omit while ongoing.
kindNo"job" or "project"; defaults to job on create.
roleNoThe candidate's title or role there.
startNoA free-form date as it would be printed, e.g. "Mar 2021".
companyNoCompany name, or the project's name.
currentNoTrue while the candidate is still there.
summaryNoOne line about the place, for context.
locationNoFree-text location.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations only declare readOnlyHint=false, so the description usefully adds the key validation rule (at least company or role, despite required=0 in the schema) and the fact that the call returns an id consumed downstream. It does not disclose whether duplicate employers are merged or rejected, which matters for a mutation tool, so it stops short of 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler: the first defines the resource, the second states the requirement and the follow-up workflow. The critical constraint is front-loaded after the identity sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 8 optional parameters, no output schema and minimal annotations, the description does the important work: it explains the create semantics and tells the agent the response yields an id for chaining. It could go further on update/duplicate handling, but nothing essential for a correct first call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including the enum for kind and date formatting for start/end, so the schema already carries parameter meaning. The description adds one cross-field constraint (company-or-role) that the schema cannot express, but otherwise leaves semantics to the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description pairs a specific verb ("Record") with a concrete resource (a job or side project where evidence was produced) and names the two kinds via the schema's enum. It is clearly distinct from experience_add_achievement, which it references, though it never contrasts itself with experience_update_employment, leaving the create-vs-update boundary implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear next-step chain: call this, then use the returned id with experience_add_achievement to attach achievements. It also states the minimum requirement (at least company or role). What's missing is guidance on when to prefer experience_update_employment over this tool, or how to handle duplicates.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

experience_listA
Read-only
Inspect

Read the candidate's whole experience bank: every employment and the achievements attached to it, plus the ones attached to no place under unplaced. Each achievement carries a PROVENANCE — cv_import, stated_in_chat and manual mean the candidate asserted it and it may be cited on a CV; agent_inferred means a model read it into the record and it may NOT. Take evidence_id for cv_edit from here.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true; the description adds the substantive behavioral rule that PROVENANCE determines citability, and names which values (cv_import, stated_in_chat, manual) may be cited versus agent_inferred, which may not. That is real safety-relevant context beyond the annotation. It does not mention volume/size of the bank or any pagination behavior, so it stops short of 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with what is read, then the provenance rule that governs downstream use, then the cv_edit hand-off. It is dense but every clause carries information. Minor deduction for the shouty "PROVENANCE" and backticked identifiers, which slightly impede scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the work of describing the return structure: employments, their nested achievements, the `unplaced` bucket, per-achievement provenance, and the evidence_id field. That covers what an agent needs to consume the result. A note on whether achievements are ordered or how large the payload typically is would close the remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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; baseline 4 applies. The description instead spends its words on output semantics, which is the right allocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Read the candidate's whole experience bank: every employment and the achievements attached to it, plus the ones attached to no place under `unplaced`" pairs a specific verb with a specific resource and the exact shape of what's returned. It is clearly distinguishable from the experience_add_*/update/remove siblings, which mutate, and from cv_get, which reads a rendered CV rather than the underlying bank.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Take evidence_id for cv_edit from here" explicitly routes the agent to the downstream sibling and states the precondition for using it. It does not, however, state when NOT to call this (e.g. when cv_context would be preferred, or whether a fuller profile read exists), so the exclusion side is only implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

experience_remove_achievementA
Destructive
Inspect

Delete one achievement from the bank. There is no undo, so confirm with the candidate first — read it back to them and remove it only on a clear yes. It takes nothing else with it. This is how a duplicate goes: keep the richer entry, remove the other.

NameRequiredDescriptionDefault
idYesThe achievement id, from experience_list. This is also cv_edit's evidence_id.

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, but the description adds genuinely new behavioral facts: the operation is irreversible ('no undo'), it is scoped so it 'takes nothing else with it', and there is a confirmation protocol before execution. That is exactly the context an agent needs before invoking a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the destructive action in the first clause, then layers on irreversibility, confirmation, and duplicate resolution in a logical order. Four short sentences with no filler, though the duplicate example is slightly more anecdotal than the rest.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool with no output schema and strong annotations, the description covers irreversibility, scope, and the pre-call confirmation step. Minor gaps remain: no statement of what the response looks like or whether the id is validated before deletion.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single `id` parameter is documented in the schema, including its provenance from experience_list and its equivalence to cv_edit's evidence_id. The description adds nothing about the parameter, which is acceptable at full coverage but is baseline rather than value-adding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Delete one achievement from the bank', with the 'one' making single-item scope explicit. The resource name distinguishes it in practice from experience_remove_employment, but the description never names that sibling or any other, so differentiation is left to the reader comparing names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear precondition (confirm with the candidate, read it back, act only on a clear yes) and a concrete use case (resolving duplicates by keeping the richer entry). It does not cover the obvious alternative of correcting an entry via experience_update_achievement rather than deleting it, so the when-not is only partially addressed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

experience_remove_employmentA
Destructive
Inspect

Delete a place from the bank. It must hold no achievements — removing a place would delete everything recorded under it, and the server refuses that here (409). To retire a duplicate place, move its achievements to the one being kept with experience_update_achievement, then remove the empty shell. There is no undo; confirm with the candidate first.

NameRequiredDescriptionDefault
idYesThe employment id, from experience_list. Opaque — read it, never construct one.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructiveHint annotation: discloses the cascading consequence (everything recorded under it would be deleted), the 409 refusal behavior, and irreversibility ('There is no undo'), plus a confirmation step with the candidate. This is exactly the context an agent needs before an irreversible mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the constraint and the consequence, then the remediation workflow. Slightly undercut by the inconsistent 'place/bank' wording, but every sentence carries real content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 no output schema, the description covers precondition, failure mode, remediation path, and irreversibility. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the id parameter already documents origin (experience_list) and opacity. The description adds no additional format or lookup guidance beyond that, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: deleting an experience entry that must be empty. The mechanics are clear, though the vocabulary mismatch ('place from the bank') against the tool name and schema field ('employment id') adds avoidable ambiguity that the later sentences only partly resolve.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the precondition (must hold no achievements), what happens if violated (server refuses with 409), and the alternative workflow: move achievements with experience_update_achievement, then remove the empty shell. It names the sibling tool directly, so there is no guesswork.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

experience_update_achievementAInspect

Correct an achievement already in the bank — most often a typo in the claim, which cannot be fixed by re-adding it. Only the fields you pass change; metrics and skills REPLACE the whole list when given. Correcting does NOT change who is held to have said it: an agent_inferred achievement stays agent_inferred and stays uncitable on a CV. Confirming it with the candidate then recording what THEY said is the only way it becomes citable.

NameRequiredDescriptionDefault
idYesThe achievement id, from experience_list. This is also cv_edit's evidence_id.
claimNoThe corrected sentence.
skillsNoReplaces the whole skills list.
contextNoHow it was done.
metricsNoReplaces the whole metrics list.
employment_idNoMove it to this place.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnlyHint=false, so the description carries the weight and does well: it discloses partial-update semantics ("Only the fields you pass change"), destructive list replacement for metrics/skills, and the immutable-provenance rule (agent_inferred stays agent_inferred and uncitable). It stops short of stating error behavior or whether a correction is reversible/logged.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then the partial-update rule, then the provenance caveat that prevents a common misuse. Four sentences, each carrying a distinct decision-relevant fact, with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter mutation tool with only readOnlyHint=false for annotations and no output schema, the description covers the remaining gaps: what changes, what is destroyed, and what stays fixed. Nothing an agent needs 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds real signal by stressing that metrics and skills REPLACE wholesale rather than merge, which is the riskiest parameter behavior. It does not clarify employment_id as a move operation beyond what the schema already says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: "Correct an achievement already in the bank," with an immediate distinction from the add path ("cannot be fixed by re-adding it"). An agent can tell this apart from experience_add_achievement and experience_update_employment without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the primary trigger (a typo in the claim), rules out the tempting alternative (re-adding), and spells out the only valid path to change citation status (confirm with the candidate, then record what they said). This is explicit when/when-not/alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

experience_update_employmentAInspect

Correct a place already in the bank. Only the fields you pass change — everything else is carried over from what is banked, because the API replaces the whole row. Use this to fix a name, a role, or dates.

NameRequiredDescriptionDefault
idYesThe employment id, from experience_list. Opaque — read it, never construct one.
endNoSame format as start; omit while ongoing.
kindNo"job" or "project"; defaults to job on create.
roleNoThe candidate's title or role there.
startNoA free-form date as it would be printed, e.g. "Mar 2021".
companyNoCompany name, or the project's name.
currentNoTrue while the candidate is still there.
summaryNoOne line about the place, for context.
locationNoFree-text location.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false; the description earns its keep by disclosing the non-obvious PATCH semantics — omitted fields are preserved from the banked row despite the API replacing the whole row. That is exactly the trap an agent would fall into. It does not mention permission 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, zero filler. The core identity ('correct a place') comes first, the critical partial-update behavior second, and the concrete use case last. Every sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a nine-parameter mutation with full schema documentation and no output schema, the description supplies the one thing structured fields omit — merge-vs-replace semantics. A brief note on the response or on the failure mode when the id is unknown would make it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline would be 3, but the description adds meaning the schema does not: that this is a merge-style update where unspecified fields carry over. Without that, an agent could wrongly assume omitted fields are cleared, which matters for all nine parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Correct a place already in the bank') and the tool name confirms it is an employment record. It distinguishes itself from the add/remove siblings by framing this as correction, but 'place' and 'the bank' are soft wording that doesn't literally name the employment record.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this to fix a name, a role, or dates' gives a clear when-to-use condition with concrete examples. It does not explicitly point at experience_add_employment or experience_remove_employment as alternatives for non-correction cases, which is the remaining gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

facetsA
Read-only
Inspect

List the market's filter vocabulary: every facet's live values with a vacancy count each, plus the skills list and numeric ranges. Call this FIRST to discover real values for search and market_fit — do not invent facet values. A filter key the API does not recognise is ignored rather than refused, so a result wrapped as {data, ignored} counted a broader market than the one asked for — retry with the suggested name before quoting any number from it. A VALUE it does not recognise comes back in ignored_values (e.g. {"skills": ["golangg"]}): it matched nothing, so fix the spelling from this list rather than reporting an empty market.

NameRequiredDescriptionDefault
cityNoCity slugs. ORs with region and country.
roleNoRole facet values, e.g. senior_backend.
visaNoOnly jobs offering visa sponsorship.
facetsNoAny other facet param as key→value(s), e.g. {"source": "greenhouse"}. Discover valid keys and values with the `facets` tool.
regionNoRegion codes: global|ru|cis|central_asia|eu|us. WIDENS with country/city — region+country means 'in the region OR the country', not 'the country inside the region'. To search one country, pass country and OMIT region.
remoteNoOnly remote jobs (sets work_mode=remote).
companyNoCompany slugs.
countryNoISO-3166 country codes, e.g. BR, US. Omit `region` when narrowing to a country — the two OR together, so region+country returns everything the region alone would.
categoryNoRole categories: backend|frontend|fullstack|devops|ml_ai|qa|...
seniorityNoSeniority: intern|junior|middle|senior|staff|principal|lead|c_level.
salary_minNoMinimum salary (enrichment.salary_min).
english_levelNoEnglish level, e.g. a2, b1, b2, c1.
exclude_skillNoSkills to filter OUT, e.g. python — drops jobs TAGGED with any of them. Tags come from a curated dictionary read off the description, so this is a discovery filter, not a fit test: a mention the dictionary does not recognise leaves the job untagged and in the results, and a job whose real core is a stack the candidate lacks is not removed by excluding a different one. Any other facet excludes the same way through `facets`, e.g. {"company_type_exclude": "outstaff"}.
employment_typeNoEmployment type, e.g. full_time, contract.

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond readOnlyHint=true by disclosing the API's silent-failure semantics: unknown filter keys are ignored rather than refused, results come wrapped as {data, ignored}, and unknown values return in `ignored_values` (with a worked example). It also gives the corrective action for each case, which is exactly the operational 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each load-bearing: purpose first, then call-order guidance, then the two silent-failure modes with their remedies. No restatement of the name or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the work of describing the return payload (facet values with counts, skills list, numeric ranges, and the {data, ignored} / ignored_values wrappers). The one gap is the unexplained 14-parameter signature on what is nominally a read-only vocabulary listing, which an agent may find puzzling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the 14 filter parameters are already fully documented in the schema and the baseline is 3. The description adds only indirect value by pointing at where valid facet keys and values come from; it says nothing about the individual parameters or why a discovery tool accepts search filters at all.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'List the market's filter vocabulary' with concrete contents (live facet values, vacancy counts, skills list, numeric ranges). It is clear what the tool returns, but it never distinguishes itself from the sibling `list_filter_values`, which reads as a near-duplicate — an agent has no textual basis for choosing between them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit sequencing guidance: 'Call this FIRST to discover real values for `search` and `market_fit` — do not invent facet values', naming both downstream consumers and the anti-pattern. No exclusion against the similar `list_filter_values` sibling, so the routing is strong but not complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jobA
Read-only
Inspect

Fetch a single job's full content by slug (title, company, location, posting URL, description).

NameRequiredDescriptionDefault
slugYesThe job's public slug (from search or facets results).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already show readOnlyHint=true, so the agent knows this is a safe read. The description adds value by listing the fields returned (title, company, location, posting URL, description), providing behavioral specifics beyond annotations without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, 14 words, with the verb and key action front-loaded. Every word serves a purpose, and there is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only one parameter and no output schema, the description adequately covers what the tool does and what it returns. It does not mention error handling or slug existence, but for a simple fetch-by-id tool, this is sufficient and not a significant gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and already describes the slug parameter as 'The job's public slug (from search or facets results).' The description merely repeats 'by slug' without adding any new semantic detail, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly uses 'Fetch' as the verb, specifies the resource as 'a single job', and identifies the key identifier 'slug'. It also enumerates the returned content fields, distinguishing this from sibling tools like 'search' which return lists, and 'apply', 'save', etc. which perform other actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when a slug is available (e.g., from search or facets results) and provides clear context for retrieving full job details. However, it does not explicitly state when not to use this tool or name alternatives, leaving some room for inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

job_market_statsA
Read-only
Inspect

How many open postings match a set of filters, and their most common role families, seniorities, skills, work modes, countries and regions. Values a filter does not recognise are dropped and named in the answer — fix them before quoting a figure.

NameRequiredDescriptionDefault
queryNoFree text, with the same operators as `search` (quotes, -word, uppercase OR, title:).
citiesNo
skillsNoTechnologies, e.g. go, kubernetes, react.
regionsNoAny of global, north_america, latam, eu, uk, mena, africa, apac, cis.
sourcesNoJob boards to restrict to.
categoryNoRole family, e.g. backend, frontend, devops, data.
countriesNoISO 3166-1 alpha-2 codes, e.g. DE, BR.
seniorityNoAny of intern, junior, middle, senior, lead, staff, principal, c_level.
work_modeNoAny of remote, hybrid, onsite.
relocationNoAny of supported, required, not_supported.
salary_minNo
company_slugsNoEmployer identifiers, as carried by a result's company_slug.
english_levelNoCEFR levels, e.g. B2, C1.
exclude_skillsNoTechnologies the posting must not ask for, e.g. php.
employment_typeNoAny of full_time, part_time, contract, internship.
salary_currencyNoISO 4217 code, e.g. USD.
visa_sponsorshipNo
posted_within_daysNo
require_all_skillsNotrue: every listed skill must be present, not just one.
exclude_company_slugsNoEmployers to leave out.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already covers the safety profile, and the description adds genuinely non-obvious behaviour: unrecognised filter values are silently dropped but echoed back in the answer, with an instruction to correct them before reporting numbers. It stops short of disclosing aggregation limits, default scope with zero filters, or cost/latency for a 20-parameter query.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler. The returned-facet list is front-loaded so an agent immediately knows the shape of the answer, and the second sentence carries a single actionable caveat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 20 optional parameters, no output schema, and only readOnlyHint for annotations, the description does well to enumerate what the response contains, which is the biggest gap it could have filled. Missing are the no-filter default (count everything?), any cap on returned facet values or result size, and ordering of the distributions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80% and most filters carry their own examples and enumerations (skills, regions, seniority, work_mode, relocation, employment_type, CEFR levels), so the schema does the heavy lifting. The description adds only the cross-cutting rule that invalid values are dropped rather than erroring, and says nothing about the four undescribed parameters (salary_min, salary_currency, visa_sponsorship, posted_within_days).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb (count) plus a resource (open postings matching filters) and enumerates the facets returned (role families, seniorities, skills, work modes, countries, regions). It is clearly an aggregation tool rather than a listing tool, but it never names siblings like `search`, `salary_stats`, or `facets`, so the 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the mention of quoting a figure suggests analytics/reporting use, and the warning to fix unrecognised values implies an iterative filter-refinement workflow. There is no explicit when-to-use versus `search` (posting-level results) or `salary_stats` (compensation distributions), and no stated prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jobs_addA
Idempotent
Inspect

Moderator: create a hand-curated job. URL is the dedup key — re-adding the same URL updates the posting. description is stored and rendered as HTML. Requires the moderator role (403 otherwise).

NameRequiredDescriptionDefault
urlYesThe posting URL — the dedup key. Required.
titleYesJob title. Required.
remoteNo
sourceNoThe posting's real origin (defaults to 'manual' server-side).
companyYesCompany name. Required.
locationNo
posted_atNoRFC3339 timestamp.
descriptionNoStored and rendered as HTML.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses key behaviors: URL as dedup key (idempotent update), description stored as HTML, and auth requirement. Annotations already indicate idempotentHint, but description adds how idempotency is achieved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with front-loaded purpose. No redundancy, every sentence provides unique value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Lacks return value information despite no output schema. Otherwise covers purpose, behavior, and auth. Moderate complexity with 3 required params.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 75% schema coverage, description adds meaning for critical params: 'url' dedup key and 'description' HTML storage. Other params are sufficiently described in schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'create a hand-curated job' with specific verb and resource. Distinguishes from sibling 'jobs_edit' and others via dedup key behavior and moderator role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'Requires the moderator role (403 otherwise)' indicating when to use. No explicit alternatives mentioned, but the context of hand-curated and sibling list provides implicit guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jobs_editA
Idempotent
Inspect

Moderator: partially update a manual job by slug. Only the provided fields change; the URL identity is not editable. Requires the moderator role (403 otherwise).

NameRequiredDescriptionDefault
slugYesThe job's public slug (from search or facets results).
titleNo
remoteNo
companyNo
locationNo
posted_atNoRFC3339 timestamp.
descriptionNoStored and rendered as HTML.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations show readOnlyHint=false and idempotentHint=true. The description adds critical context: partial update semantics and 403 error for non-moderators. This exceeds 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, each adding unique value: purpose + constraint, then role requirement. No redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 7 parameters and no output schema, the description is minimal. It explains partial updates and role requirement but omits side effects, success response, or distinction between manual and other jobs. Could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 43%, so the description should compensate. It adds context for the slug parameter (not editable) and general partial update behavior, but does not elaborate on other parameters beyond schema descriptions. Adequate but not rich.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Moderator: partially update a manual job by slug', specifying the action (update), resource (manual job), and identifier (slug), clearly distinguishing it from sibling tools like 'jobs_add'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clarifies partial update behavior and role requirement ('Requires the moderator role'), but does not explicitly compare with alternatives (e.g., 'jobs_add' for creation). The implication is present but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_filter_valuesA
Read-only
Inspect

The values one job-search filter accepts — skills, categories, seniorities, sources, countries and the rest — each with how many open postings carry it, most common first. A value not listed matches no posting. Use it before filtering on a value you are not sure of, and to fix one a search reported in ignored_values.

NameRequiredDescriptionDefault
limitNoHow many values to return, up to 200.
filterYesOne of category, seniority, skills, work_mode, regions, countries, cities, sources, employment_type, english_level, relocation.
containsNoKeep only values containing this text, e.g. kube; for skills a known alias also finds its value (golang finds go).

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuinely non-obvious behavior: results are sorted most common first, each value carries a count of open postings, and 'a value not listed matches no posting' — a crucial negative guarantee an agent cannot get from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with what is returned and how it is ordered, then usage. Every clause earns its place — the value set, the counts, the sort order, the no-match guarantee, and the two usage triggers.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates fully by describing the shape of each returned value (value + open-posting count) and its ordering. Combined with the coverage-complete input schema and the readOnly annotation, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (filter, limit, contains) are already documented, including the enum-like list of filter names and the alias behavior of contains. The description's enumeration of filter kinds restates the schema rather than adding new meaning. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource and scope: the accepted values for one job-search filter, each with posting counts, ordered by frequency. An agent can tell this is a lookup tool rather than a search tool. It stops short of naming the closest sibling (facets), so the boundary with facet-style counting tools is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use is given: 'Use it before filtering on a value you are not sure of, and to fix one a search reported in ignored_values.' This ties the tool to a concrete workflow hook (ignored_values) rather than leaving usage implied. No when-not guidance or named alternative is offered, keeping it below a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_subscriptionsA
Read-only
Inspect

List the person's job alerts with every setting: id, name, a readable filter summary AND the search as the structured object the alert tools take (query, filters, salary_min/max; other holds website-only filters an update keeps), whether it is paused, and each delivery channel with its active flag, pending matches and last delivery. delivery_schedule is the account-wide digest timing every alert shares.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint already establishes that this is a safe read operation, and the description adds useful behavioral detail about the returned fields, delivery channels, pending matches, last delivery, and the account-wide delivery_schedule. It still omits details such as ordering or whether all alerts are returned in one response, but it meaningfully exceeds 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the main action and then enumerates return fields, so every part is relevant. It is a dense single sentence with parentheticals, which slightly harms readability, but it avoids unnecessary filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must explain the return shape, and it does so in detail: ids, names, filter summaries, structured search objects, paused state, channel status, pending matches, last delivery, and delivery_schedule. For a zero-parameter read-only list tool, this is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The empty input schema is consistent with a parameterless list operation, and there are no parameter semantics that the description needs to compensate for.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: it lists the person's job alerts and enumerates the settings returned. However, it does not explicitly distinguish this from sibling tools such as subscription_updates, update_subscription, or unsubscribe, so sibling differentiation is only implied.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance, no exclusions, and no routing to alternatives like update_subscription or unsubscribe. The listing purpose is clear, but the description does not tell an agent when this tool should be chosen over related subscription tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

market_fitA
Read-only
Inspect

Score a skill list against the live open-vacancy market for a filtered role: headline coverage (% of vacancies listing ≥1 skill), must-have skills held, and the missing skills that unlock the most vacancies. Here skills is the MEASURED set, not a filter — use facet params to define the role. One skill probes that skill's demand. A result wrapped as {data, ignored, ignored_values} measured something other than what was asked: fix the named param or value and retry before quoting it.

NameRequiredDescriptionDefault
cityNoCity slugs. ORs with region and country.
roleNoRole facet values, e.g. senior_backend.
visaNoOnly jobs offering visa sponsorship.
facetsNoAny other facet param as key→value(s), e.g. {"source": "greenhouse"}. Discover valid keys and values with the `facets` tool.
regionNoRegion codes: global|ru|cis|central_asia|eu|us. WIDENS with country/city — region+country means 'in the region OR the country', not 'the country inside the region'. To search one country, pass country and OMIT region.
remoteNoOnly remote jobs (sets work_mode=remote).
skillsYesThe candidate's skills to measure (canonical slugs). One value probes a single skill.
companyNoCompany slugs.
countryNoISO-3166 country codes, e.g. BR, US. Omit `region` when narrowing to a country — the two OR together, so region+country returns everything the region alone would.
categoryNoRole categories: backend|frontend|fullstack|devops|ml_ai|qa|...
seniorityNoSeniority: intern|junior|middle|senior|staff|principal|lead|c_level.
salary_minNoMinimum salary (enrichment.salary_min).
english_levelNoEnglish level, e.g. a2, b1, b2, c1.
exclude_skillNoSkills to filter OUT, e.g. python — drops jobs TAGGED with any of them. Tags come from a curated dictionary read off the description, so this is a discovery filter, not a fit test: a mention the dictionary does not recognise leaves the job untagged and in the results, and a job whose real core is a stack the candidate lacks is not removed by excluding a different one. Any other facet excludes the same way through `facets`, e.g. {"company_type_exclude": "outstaff"}.
employment_typeNoEmployment type, e.g. full_time, contract.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint already covering the safety profile, the description adds genuinely non-obvious behavior: the {data, ignored, ignored_values} wrapper signals a mismatch between what was asked and what was measured, and the agent is told to fix the param and retry before quoting results. That is exactly the kind of silent-failure disclosure annotations cannot provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and outputs, then the measurement-vs-filter rule, then the result-wrapper caveat — every sentence earns its place. The final sentence is terse and slightly cryptic ('measured something other than what was asked'), which costs a point on structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter tool with a nested facets object and no output schema, the description compensates well by naming the three return components and the measurement semantics. It stops short of covering result limits, skill-list size expectations, or how coverage is computed, leaving minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description still adds real meaning by clarifying that `skills` is measured rather than filtered and that a single skill value probes that skill's demand, plus a one-skill probe use case. It doesn't add anything for the 14 facet params beyond what the schema says, so it doesn't reach 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Score a skill list against the live open-vacancy market') plus the exact outputs produced (headline coverage, must-have skills held, missing skills unlocked). It also draws the crucial line between measuring and filtering, which is what separates it from search-style siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent that `skills` is the MEASURED set and that facet params define the role, and routes to the `facets` tool for discovering valid keys. It lacks an explicit 'use X instead when' against adjacent siblings like job_market_stats or salary_stats, so it gets a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

myA
Read-only
Inspect

List the caller's tracked jobs (viewed/saved/applied) with their stage and note. Filter narrows the set.

NameRequiredDescriptionDefault
limitNo
filterNoWhich tracked jobs to list.all
offsetNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the description adds limited behavioral context beyond that. It mentions that the tool returns stage and note, and that filter narrows results, but does not disclose pagination behavior (offset/limit) or authentication details. For a read-only operation, this is adequate but not extensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that conveys the main purpose. It is appropriately front-loaded but could benefit from mentioning pagination or parameter details to improve completeness without sacrificing brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with readOnly annotations and no output schema, the description covers the key aspects: what is listed (caller's tracked jobs), what fields are included (stage, note), and how to filter. However, it lacks guidance on pagination (offset/limit) which is part of the input schema, slightly reducing completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% (filter has a description), and the main description does not add meaning for limit or offset beyond what the schema provides. It mentions that filter narrows the set but does not elaborate, leaving two parameters undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists the caller's tracked jobs (viewed/saved/applied) with stage and note, using a specific verb and resource. It is easily distinguished from sibling tools like 'my_submissions' which lists submissions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing tracked jobs but does not provide explicit guidance on when to use this tool versus alternatives like 'my_submissions' or 'search'. No exclusions or when-not-to-use information is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

my_contributionsA
Read-only
Inspect

List the vacancy and company career board links the caller has contributed, with their status: pending (queued for onboarding), review (manual triage), onboarded (now crawled) or rejected.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a read-only operation. The description adds useful domain context by defining each status value ('pending', 'review', 'onboarded', 'rejected') and clarifying that results are scoped to the caller's own contributions, though it does not discuss pagination or result ordering.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no redundant material. The status definitions are compact and directly relevant to interpreting the result.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool, the description covers the essential behavior: what is listed, whose contributions are included, and what the status values mean. It does not describe the exact response shape, but no output schema exists and the core return semantics are still clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline score is 4. There are no parameter semantics for the description to compensate for.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and a precise resource ('vacancy and company career board links the caller has contributed'). The caller-scoped wording and the named link types distinguish it from sibling tools like contribute and my_submissions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used to inspect the status of contributions the caller has already submitted, especially by defining the status meanings. However, it does not explicitly say when to use this tool instead of alternatives such as contribute or other listing tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

my_submissionsA
Read-only
Inspect

List the caller's own vacancy submissions with their moderation status.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description aligns with the 'readOnlyHint' annotation by stating 'List'. However, it adds no further behavioral details (e.g., pagination, sorting) beyond what the annotation already conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with no extraneous words. It delivers maximum information in minimal space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the zero parameters, the readOnly annotation, and no output schema, the description sufficiently covers what the tool does and what it returns (moderation status). No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the description has no parameter details to add. The description does not need to compensate for missing schema documentation. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List'), the resource ('the caller's own vacancy submissions'), and the specific information returned ('moderation status'). It distinguishes from siblings like 'submissions_pending' or 'submission_approve'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing the caller's own submissions, but it does not explicitly state when not to use it or mention alternative tools for different scopes (e.g., 'submissions_pending' for pending ones).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

noteA
Idempotent
Inspect

Attach a free-text note to a tracked job (overwrites the existing note).

NameRequiredDescriptionDefault
noteYesFree-text note to store on the job.
slugYesThe job's public slug (from search or facets results).

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate idempotentHint=true and readOnlyHint=false, so the description does not need to reiterate safety. It adds value by explicitly stating the overwrite behavior, which is not in annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with verb, no filler. Every word earns its place, making it efficient and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (2 parameters, no output schema), the description covers the core action and overwrite behavior well. Could mention note length limits, but overall sufficient for a small tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, providing clear parameter descriptions for 'slug' and 'note'. The description reinforces these but does not add new constraints or format details beyond the schema, maintaining a baseline score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool attaches a free-text note to a tracked job, specifying the verb 'attach', the resource 'free-text note to a tracked job', and the distinguishing behavior 'overwrites the existing note'. This differentiates it from sibling tools like jobs_edit which modify broader job details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for adding or updating notes on tracked jobs, but provides no guidance on when to use this tool versus alternatives (e.g., jobs_edit) or when not to use it. It lacks explicit context on exclusions or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

profileA
Read-only
Inspect

Return the caller's saved job-search profile: their specializations, target skills, excluded skills, location preferences, and contact-free CV. Call this before searching or tailoring to ground your work in what the candidate already told freehire.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered; the description adds the meaningful detail that the CV returned is 'contact-free' and that the data reflects what the candidate 'already told freehire'. It does not say what happens if no profile exists yet or whether authentication is required, which is a minor remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste: the return contents come first, the usage directive second. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing return values, and it does so by enumerating the profile fields. It stops short of describing the empty/no-profile case or the shape of nested fields, but an agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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; baseline 4 applies. The description correctly avoids inventing parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('Return') plus specific resource ('the caller's saved job-search profile'), followed by an enumeration of exactly what comes back: specializations, target skills, excluded skills, location preferences, and CV. This distinguishes it clearly from identity tools like whoami and document tools like cv_get.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs the agent to call this 'before searching or tailoring', naming the downstream activities (search, cv_tailor) that should be grounded in its output. The sequencing rule is stated rather than implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

salary_statsA
Read-only
Inspect

Salary percentiles (25th, median, 75th) from open postings that state pay, scoped by role family, seniority and country, with the sample size behind each figure. Currencies and pay periods are reported separately, never converted.

NameRequiredDescriptionDefault
countryNoISO 3166-1 alpha-2 code, e.g. DE.
categoryNoRole family, e.g. backend, frontend, devops, data.
seniorityNoOne of intern, junior, middle, senior, lead, staff, principal, c_level.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuinely useful behavioral caveats beyond that: figures are computed only from postings that state pay, a sample size accompanies each figure, and currencies/pay periods are reported separately and never converted — real constraints an agent needs to interpret results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences, no filler, and the primary output (percentiles), the source constraint, and the currency caveat are all front-loaded before any detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the heavy lifting by naming the returned measures, the sample-size field, and the per-currency/per-period reporting. It is nearly complete, but omits how results are grouped when parameters are omitted and whether multiple currencies produce multiple rows.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so country/category/seniority are already documented with examples and allowed values. The description restates that these scope the result (and hints at role-family/seniority semantics) but adds no syntax, defaults, or behavior for omitted parameters, so it sits at the baseline for high-coverage schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete resource (salary percentiles at 25th/median/75th) and the exact dimensions it is scoped by (role family, seniority, country), plus a non-obvious data source constraint (only postings that state pay). It does not, however, distinguish itself from nearby siblings like job_market_stats or market_fit, leaving the agent to infer which stats tool to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the scoping sentence — call it when you want pay distribution for a role/seniority/country slice — but there is no explicit 'use this when… / use X instead' guidance and no mention that the three parameters are all optional, so the agent cannot tell how to get an unfiltered aggregate or when job_market_stats is the better call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saveA
Idempotent
Inspect

Bookmark a job for later. Idempotent.

NameRequiredDescriptionDefault
slugYesThe job's public slug (from search or facets results).

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description mentions 'Idempotent', which is already declared via annotations. Other behavioral traits (e.g., side effects, auth needs) are not disclosed, but annotations cover the safety profile minimally.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no wasted words. The key action and idempotency are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple idempotent bookmark tool with one parameter and no output schema, the description is adequately complete. It could optionally mention reversal via 'unsave', but not essential.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and describes the slug parameter well. The description adds no extra meaning about the parameter, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Bookmark a job for later' uses a specific verb (bookmark) and resource (job), clearly distinguishing it from sibling tools like 'apply' or 'unsave'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., 'apply' or 'unsave') is provided. The description only states the action without contextual usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

similar_jobsA
Read-only
Inspect

Postings most similar to one posting, by its slug, nearest first — for "show me more like this". Empty for the newest postings, whose neighbours are not computed yet.

NameRequiredDescriptionDefault
slugYesThe job's public slug (from search or facets results).
limitNoHow many to return, up to 20.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered; the description adds real value by disclosing result ordering ('nearest first') and an edge case ('Empty for the newest postings, whose neighbours are not computed yet') that an agent could not infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the core purpose front-loaded and the edge-case caveat appended after a dash; nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only lookup with no output schema, the description covers the purpose, ordering, and the main failure mode (empty for new postings). Only the meaning of the returned fields is left implicit, which is low-risk for a 'similar items' list.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so slug and limit are already documented in the schema. The description only restates that the lookup is by slug and adds no format or constraint detail beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: postings most similar to a given posting identified by slug, with ordering (nearest first). This clearly separates it from generic siblings like search or job, though it doesn't name an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for "show me more like this"' implies the use case, but there is no explicit when-not guidance or named alternative (e.g., search for keyword-based discovery). The empty-result caveat is behavioral, not a usage rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stageA
Idempotent
Inspect

Set a job's application stage. The server validates the value; valid stages are applied/screening/responded/interview/offer/accepted/rejected/withdrawn.

NameRequiredDescriptionDefault
slugYesThe job's public slug (from search or facets results).
stageYesApplication stage, e.g. interview, offer, rejected.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false (modifies) and idempotentHint=true (safe retry). The description adds the list of valid stages and mentions server validation, providing useful behavioral context beyond annotations. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, 17 words, with no redundant information. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for a simple tool with two parameters and annotations, but lacks information about return values or prerequisites (e.g., application must exist). Could be more complete to guide the agent fully.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds a list of valid stages not present in the schema (which has no enums). This adds significant value by enumerating allowed values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Set' and resource 'job's application stage', and lists all valid stages, making it clear what the tool does and distinguishing it from siblings like 'apply' or 'submit'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for updating an existing application's stage by listing valid values, but does not explicitly state when to use this tool versus siblings like 'apply' (new application) or 'submission_approve' (approve submission).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submission_approveAInspect

Moderator: approve a pending submission, minting a live job. Requires the moderator role (403 otherwise).

NameRequiredDescriptionDefault
idYesThe submission id.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds role requirement and error code beyond annotations (readOnlyHint=false). Describes write action and outcome.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with essential info. No filler. Front-loaded with role and action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for simple action. Lacks output info or side effects, but role requirement and outcome are clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameter description. Description adds context by linking id to approval action, though no extra detail on format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'approve' and specific resource 'pending submission' with outcome 'minting a live job'. Distinguishes from siblings like submission_reject.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States required moderator role and 403 error otherwise. Implicitly indicates when to use based on pending status and role.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submission_rejectAInspect

Moderator: reject a pending submission with an optional reason. Requires the moderator role (403 otherwise).

NameRequiredDescriptionDefault
idYesThe submission id.
reasonNoOptional rejection reason.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description indicates a mutation action ('reject') consistent with annotations (readOnlyHint=false), but does not disclose side effects (e.g., status change, notifications) beyond the role requirement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that efficiently conveys purpose and usage without unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only two parameters and no output schema, the description covers purpose and role requirement adequately, but lacks details on return value or explicit state change.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description merely restates the schema's parameter details (id, optional reason) without adding new semantic information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'reject' and the resource 'pending submission', distinguishing it from sibling tools like 'submission_approve'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It specifies the required moderator role and the error response (403) for unauthorized use, but does not explicitly mention when not to use or alternatives like 'submission_approve'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submissions_pendingA
Read-only
Inspect

Moderator: list the pending submission review queue. Requires the moderator role (403 otherwise).

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds critical behavioral context beyond the 'readOnlyHint' annotation by specifying the authentication requirement ('Requires the moderator role (403 otherwise)'). This informs the agent about authorization constraints and error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that conveys both the purpose and the prerequisite role requirement. No extraneous information is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (0 parameters, readOnlyHint annotation, no output schema), the description adequately covers purpose and auth. However, it could be enhanced by hinting at the format or content of the returned list, but this is not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0 parameters and 100% schema description coverage, the description does not need to add parameter details. Based on the scoring rule, a baseline of 4 is appropriate since the schema already fully covers the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'list the pending submission review queue' using a specific verb ('list') and resource ('pending submission review queue'). This purpose is distinct from sibling tools like 'submission_approve' and 'submission_reject', which perform actions, and 'my_submissions', which likely lists user's own submissions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states the requirement for the moderator role and notes that 403 is returned otherwise, providing clear guidance on who should use this tool. However, it does not explicitly mention when not to use it or contrast it with alternatives like 'my_submissions' for non-moderators.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submitBInspect

Submit a vacancy for moderation. The server stores it as pending and returns it. URL (the dedup key), title, and company are required.

NameRequiredDescriptionDefault
urlYesThe posting URL — the dedup key. Required.
titleYesJob title. Required.
remoteNo
sourceNoThe posting's real origin (defaults to 'manual' server-side).
companyYesCompany name. Required.
locationNo
posted_atNoRFC3339 timestamp.
descriptionNoStored and rendered as HTML.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds context beyond annotations by stating the server stores the submission as pending and returns it. Annotations already indicate write operation (readOnlyHint=false), so the description provides marginal additional behavioral insight.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action, no filler. Every sentence is essential.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 8 parameters and no output schema, the description lacks details on return values, error handling, or formatting requirements, making it incomplete for a submission tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high (75%), so the description adds only minor value by noting 'dedup key' for URL. It does not significantly enhance understanding of parameters beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool submits a vacancy for moderation, with a specific verb and resource. However, it does not explicitly differentiate from sibling tools like 'jobs_add' or 'jobs_edit', so it's slightly below a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions required fields but provides no guidance on when to use this tool over alternatives, nor any when-not-to-use scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

subscribeAInspect

Create a job alert: a saved search over ANY of the job search's filters whose new postings are delivered to the person on the channels their account has connected (email, Telegram, the mobile app, a webhook) — this conversation is not notified. e.g. remote senior Go roles in the EU paying at least 80k EUR is {"filters":{"work_mode":["remote"],"seniority":["senior"],"skills":["go"],"regions":["eu"],"salary_currency":["EUR"]},"salary_min":80000}. Run the same search with search first so the person sees what they will get. The search must narrow the catalogue. Values not in a filter's vocabulary are dropped and named in ignored_params. Leave channels empty for the default (email when alert mail is on, otherwise the first connected channel). The answer's alert.id addresses the alert from then on. Saves the search on the account (or reuses the one already selecting the same postings); nothing existing is changed.

NameRequiredDescriptionDefault
nameNoA name for the alert (1-100 characters). Omit to name it from its filters.
queryNoFree-text query, with the job search's operators.
filtersNoFacet filters by param name (skills, seniority, category, work_mode, regions, countries, cities, metros, company_slug, employment_type, salary_currency, source, …), each a list of values. An unknown filter name is refused.
channelsNoWhere to deliver. Only a channel the account has connected is accepted.
salary_maxNoOnly postings whose stated salary ceiling is at most this. 0 clears it on update.
salary_minNoOnly postings whose stated salary floor is at least this, in the posting's currency — pair it with filters.salary_currency. 0 clears it on update.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only readOnlyHint=false available, the description carries the behavioral load and does it well: delivery goes to the account's connected channels and "this conversation is not notified", invalid vocabulary values are silently dropped and surfaced in `ignored_params`, empty channels fall back to a defined default, and existing alerts are never mutated. These are non-obvious side effects an agent could not infer from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the definition before the workflow and the example, and nearly every sentence adds a distinct fact. Some clauses are dense and clause-stacked ("delivered to the person on the channels their account has connected..."), which costs a bit of readability without adding padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-param mutation tool with a nested object and no output schema, the description still covers return handling ("The answer's alert.id addresses the alert from then on"), validation feedback, defaults, and idempotency. An agent has everything needed to call it correctly on the first try.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real meaning: a worked JSON example of the nested `filters` object, the default-resolution rule for empty `channels`, the currency pairing for `salary_min`, and the derivation rule for `name`. Only `salary_max` and `query` are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ("Create a job alert: a saved search over ANY of the job search's filters") and immediately defines the resource in terms of the sibling concept `search`. An agent can distinguish this from `update_subscription`, `list_subscriptions`, and `unsubscribe` 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete pre-call workflow ("Run the same search with `search` first so the person sees what they will get") and a validity constraint ("The search must narrow the catalogue"). It also implies create-only semantics ("reuses the one already selecting the same postings; nothing existing is changed"), though it never explicitly names `update_subscription` as the path for modifying an existing alert.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

subscription_updatesA
Read-only
Inspect

List the new postings the person's job alerts have matched — the same matches their alerts are built from, newest first, still-open postings only. Narrow to one alert by id, and to a window by since (RFC 3339) or days (default 7, max 30). An alert only matches postings that appeared after it was created, and matching runs every few minutes, so a new one starts empty. delivered says whether an alert already carried the posting.

NameRequiredDescriptionDefault
idNoOne alert's id; omit for all.
daysNoLook back this many days (default 7, max 30). Ignored when since is given.
limitNoHow many postings (default 20, max 50).
sinceNoOnly matches recorded at or after this RFC 3339 time.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint annotation: it discloses ordering, the still-open-only filter, that matching runs every few minutes, that an alert only matches postings created after it and therefore starts empty, and the meaning of the `delivered` field. These are exactly the non-obvious behaviors an agent could otherwise misreport to a user.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core definition, then filtering, then the timing caveat, in three dense sentences with no filler. The 'matching runs every few minutes' clause earns its place by preventing a wrong interpretation of an empty result.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully explains the `delivered` field and the empty-until-matched behavior, which are the key unknowns. It stops short of describing the rest of the response shape or how `limit` interacts with paging, leaving a small gap for a four-parameter list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and documents id, days (default 7, max 30), limit, and since with RFC 3339 format. The description largely restates id/window semantics already present in the schema, and omits `limit` entirely; it adds little semantic depth beyond what the structured fields provide, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — listing postings matched by the person's job alerts — and immediately scopes it with 'the same matches their alerts are built from', which separates it from generic search or the alert-listing siblings. The ordering ('newest first') and filter ('still-open postings only') further pin down exactly what set is returned.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear context for when this is the right tool (seeing what alerts surfaced) and how to narrow with id/since/days. It does not explicitly name alternatives such as `search` for general browsing or `list_subscriptions` for the alert definitions themselves, so the agent must infer the boundary from wording rather than an explicit 'use X instead'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unsaveA
Idempotent
Inspect

Remove a job's bookmark. A no-op if it was not saved.

NameRequiredDescriptionDefault
slugYesThe job's public slug (from search or facets results).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate idempotentHint=true; description reinforces this by stating it's a no-op if not saved. Adds value beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with action verb, no wasted words. Efficiently conveys purpose and behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description covers purpose and idempotency. Lacks details on error handling (e.g., invalid slug), but overall adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description does not add any additional parameter information beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'remove' and the resource 'job's bookmark', and distinguishes from the sibling tool 'save'. The no-op note adds clarity for edge case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Context is clear: use to unsave a job. The no-op note implicitly advises it's safe to call even if not saved. However, it lacks explicit when-not-to-use or alternatives beyond the sibling context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unsubscribeA
Destructive
Inspect

Stop one job alert by its id, on every channel or on the one named. Deletes the alert's delivery on those channels and their record of matches; the saved search itself stays on the account as a bookmarked search. To hold an alert for a while, pause it with update_subscription instead.

NameRequiredDescriptionDefault
idYesThe alert id, from list_subscriptions or subscribe.
channelNoStop only this channel. Omit for all.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past destructiveHint=true by saying exactly what is destroyed (the alert's delivery on those channels and their record of matches) and what survives (the saved search remains as a bookmarked search). That distinction between deleting delivery and deleting the search is the single most important behavioral fact here and is stated plainly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences: action and scope first, consequence and retention second, alternative third. No filler and nothing important is buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter destructive tool with no output schema, the description plus annotations cover nearly everything: scope, destruction, retention, and the alternative. Minor gap: nothing about error behavior or whether repeating the call is idempotent when the alert is already gone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3, but the description adds meaning: it frames id as identifying "one" alert and channel as the choice between all channels and a single one, reinforcing the omit-for-all semantics in prose. Enum values themselves are left to the schema, which is fine.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses a specific verb and resource ("Stop one job alert by its id") and scopes it precisely ("on every channel or on the one named"). It is clearly distinguishable from subscribe, list_subscriptions and update_subscription, whose names appear in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative and the condition that selects it: to hold an alert temporarily, use update_subscription instead of unsubscribing. That is a genuine when-not-to-use directive with a named sibling, not an implied one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_subscriptionA
Idempotent
Inspect

Change one of the person's job alerts by its id. Read its current search from list_subscriptions and pass only what changes — every field is optional: name; the search (query, filters, salary_min, salary_max — each replaces that part, an empty filters object clears the facet filters, a salary bound of 0 clears it; website-only filters in other are kept); channels (the full set to deliver on — added ones must be connected, missing ones stop); paused (true stops every channel, false resumes them — prefer it to unsubscribe for holding an alert). The new search must still narrow the catalogue, and unknown values are dropped and named in ignored_params. e.g. remote senior Go roles in the EU paying at least 80k EUR is {"filters":{"work_mode":["remote"],"seniority":["senior"],"skills":["go"],"regions":["eu"],"salary_currency":["EUR"]},"salary_min":80000}. Digest timing is account-wide and not changed here. A removed channel's record of matches is deleted with it.

NameRequiredDescriptionDefault
idYesThe alert id, from list_subscriptions or subscribe.
nameNoA new name (1-100 characters).
queryNoFree-text query, with the job search's operators.
pausedNotrue pauses every channel, false resumes them.
filtersNoFacet filters by param name (skills, seniority, category, work_mode, regions, countries, cities, metros, company_slug, employment_type, salary_currency, source, …), each a list of values. An unknown filter name is refused.
channelsNoThe complete set of channels to deliver on.
salary_maxNoOnly postings whose stated salary ceiling is at most this. 0 clears it on update.
salary_minNoOnly postings whose stated salary floor is at least this, in the posting's currency — pair it with filters.salary_currency. 0 clears it on update.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, idempotentHint=true), the description discloses rich behavioral details: empty filters clear facet filters, salary 0 clears a bound, website-only filters are kept, removed channels delete their match records, and unknown values are dropped and named in ignored_params. It also clarifies that digest timing is account-wide and unchanged, which an agent could not infer otherwise.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and then layers parameter semantics logically. It is dense but every sentence carries useful information; the example earns its place. It is slightly long, but appropriate for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a complex mutation tool with nested filters and no output schema, the description covers clearing behavior, error handling via ignored_params, channel side effects, and account-wide constraints. Nothing an agent needs to call it correctly appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline would be 3, but the description adds substantial meaning beyond the schema: it explains replacement versus clearing semantics, distinguishes 'full set' channel behavior, and provides a concrete JSON example for a complex filter payload. This materially improves correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Change one of the person's job alerts by its id') and references list_subscriptions for reading the current state. It distinguishes this from subscribe and unsubscribe implicitly, though it does not explicitly differentiate from subscription_updates, leaving a minor ambiguity among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent to read the current search from list_subscriptions and pass only what changes, and it names a concrete alternative ('prefer it to unsubscribe for holding an alert'). The optional-field guidance and replacement semantics make when-to-use and how-to-invoke unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

whoamiA
Read-only
Inspect

Return the authenticated freehire user (verifies the API key). Call this to confirm auth before other tools.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the description's role is to add context. It adds value by specifying it returns user info and verifies the API key, with no contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose, no wasted words. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with no parameters and no output schema, the description is complete: it states functionality and usage context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with 0 parameters, so baseline is 4. No parameter information needed in description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'return' and resource 'authenticated freehire user', and explicitly calls out it verifies the API key. It distinguishes itself from sibling tools by focusing on auth confirmation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Call this to confirm auth before other tools', providing clear usage context. While it doesn't mention when not to use it, the simplicity of the tool makes this sufficient.

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.

  1. 29 tool updatesv0.8.0
    • Addedcheck_jobs_open
    • Addedcontribute
    • Addedcv_context
    • Addedcv_edit
    • Addedcv_get
    • Addedcv_list
    • Addedcv_render
    • Addedcv_tailor
    • Addedexperience_add_achievement
    • Addedexperience_add_employment
    • Addedexperience_list
    • Addedexperience_remove_achievement
    • Addedexperience_remove_employment
    • Addedexperience_update_achievement
    • Addedexperience_update_employment
    • Changedfacets4 fields changed
      • changedInput schema / properties / city / description
        Previous value: -"City slugs."New value: +"City slugs. ORs with region and country."
      • changedInput schema / properties / country / description
        Previous value: -"ISO-3166 country codes, e.g. BR, US."New value: +"ISO-3166 country codes, e.g. BR, US. Omit `region` when narrowing to a country — the two OR together, so region+country returns everything the region alone would."
      • addedInput schema / properties / exclude_skill
        Added value: +{
        +  "description": "Skills to filter OUT, e.g. python — drops jobs TAGGED with any of them. Tags come from a curated dictionary read off the description, so this is a discovery filter, not a fit test: a mention the dictionary does not recognise leaves the job untagged and in the results, and a job whose real core is a stack the candidate lacks is not removed by excluding a different one. Any other facet excludes the same way through `facets`, e.g. {\"company_type_exclude\": \"outstaff\"}.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / region / description
        Previous value: -"Region codes (OR within): global|ru|cis|central_asia|eu|us."New value: +"Region codes: global|ru|cis|central_asia|eu|us. WIDENS with country/city — region+country means 'in the region OR the country', not 'the country inside the region'. To search one country, pass country and OMIT region."
    • Addedjob_market_stats
    • Addedlist_filter_values
    • Addedlist_subscriptions
    • Changedmarket_fit4 fields changed
      • changedInput schema / properties / city / description
        Previous value: -"City slugs."New value: +"City slugs. ORs with region and country."
      • changedInput schema / properties / country / description
        Previous value: -"ISO-3166 country codes, e.g. BR, US."New value: +"ISO-3166 country codes, e.g. BR, US. Omit `region` when narrowing to a country — the two OR together, so region+country returns everything the region alone would."
      • addedInput schema / properties / exclude_skill
        Added value: +{
        +  "description": "Skills to filter OUT, e.g. python — drops jobs TAGGED with any of them. Tags come from a curated dictionary read off the description, so this is a discovery filter, not a fit test: a mention the dictionary does not recognise leaves the job untagged and in the results, and a job whose real core is a stack the candidate lacks is not removed by excluding a different one. Any other facet excludes the same way through `facets`, e.g. {\"company_type_exclude\": \"outstaff\"}.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / region / description
        Previous value: -"Region codes (OR within): global|ru|cis|central_asia|eu|us."New value: +"Region codes: global|ru|cis|central_asia|eu|us. WIDENS with country/city — region+country means 'in the region OR the country', not 'the country inside the region'. To search one country, pass country and OMIT region."
    • Addedmy_contributions
    • Addedprofile
    • Addedsalary_stats
    • Changedsearch6 fields changed
      • changedInput schema / properties / city / description
        Previous value: -"City slugs."New value: +"City slugs. ORs with region and country."
      • changedInput schema / properties / country / description
        Previous value: -"ISO-3166 country codes, e.g. BR, US."New value: +"ISO-3166 country codes, e.g. BR, US. Omit `region` when narrowing to a country — the two OR together, so region+country returns everything the region alone would."
      • addedInput schema / properties / exclude_skill
        Added value: +{
        +  "description": "Skills to filter OUT, e.g. python — drops jobs TAGGED with any of them. Tags come from a curated dictionary read off the description, so this is a discovery filter, not a fit test: a mention the dictionary does not recognise leaves the job untagged and in the results, and a job whose real core is a stack the candidate lacks is not removed by excluding a different one. Any other facet excludes the same way through `facets`, e.g. {\"company_type_exclude\": \"outstaff\"}.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Max results to return."New value: +"Max results to return. Each result includes a full job description, so prefer a modest value."
      • changedInput schema / properties / query / description
        Previous value: -"Keyword query, e.g. 'golang backend'. Empty string matches all."New value: +"Free text over title, company, description and location. Empty string matches all. Operators: double quotes require every quoted word; -word excludes; uppercase OR between terms matches any alternative (at most 5), e.g. golang OR rust; title: at the start of an alternative matches the title only, e.g. title:\"product owner\" OR title:produktchef."
      • changedInput schema / properties / region / description
        Previous value: -"Region codes (OR within): global|ru|cis|central_asia|eu|us."New value: +"Region codes: global|ru|cis|central_asia|eu|us. WIDENS with country/city — region+country means 'in the region OR the country', not 'the country inside the region'. To search one country, pass country and OMIT region."
    • Addedsimilar_jobs
    • Addedsubscribe
    • Addedsubscription_updates
    • Addedunsubscribe
    • Addedupdate_subscription
  2. 19 tool updatesv0.1.0
    • First observedapply
    • First observedcompany
    • First observedfacets
    • First observedjob
    • First observedjobs_add
    • First observedjobs_edit
    • First observedmarket_fit
    • First observedmy
    • First observedmy_submissions
    • First observednote
    • First observedsave
    • First observedsearch
    • First observedstage
    • First observedsubmission_approve
    • First observedsubmission_reject
    • First observedsubmissions_pending
    • First observedsubmit
    • First observedunsave
    • First observedwhoami

TDQS

A3.6/5.0

Scored across 45 tools

Disambiguation4/5

Most tools target distinct resources or actions, but `facets` and `list_filter_values` both discover filter vocabulary and could easily be confused. Generic names like `my`, `job`, `company`, and `stage` add minor ambiguity, though descriptions generally clarify intent.

Naming Consistency3/5

All names use lowercase snake_case, but the conventions are mixed: many tools are bare nouns or verbs (`job`, `company`, `stage`, `note`, `my`) while others use prefixes (`cv_*`, `experience_*`, `list_*`, `update_*`). Plurals and prefixes are inconsistent (`submission_approve` vs `submissions_pending`, `list_subscriptions` vs `subscription_updates`), though names remain readable.

Tool Count2/5

45 tools is heavy for a job-search and CV-tailoring server, spanning search, tracking, CV editing, experience-bank CRUD, alerts, contributions, and moderator actions. The breadth explains the count, but the surface feels bloated and exceeds the recommended range.

Completeness4/5

The server covers core lifecycles well: job search, tracking, CV tailoring, experience-bank CRUD, alerts, contributions, and moderation. Minor gaps remain, such as no clear way to update the profile, delete a tailored CV, or fully untrack a job beyond unsaving.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Searches LinkedIn, Indeed, USAJobs, and Google Jobs from the command line, deduplicates across sources, and optionally finds hiring manager emails; also runs as an MCP server for AI agents.
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Enables searching job listings, tracking applications, managing resumes, and tailoring resumes to job posts, all locally via MCP.
    20
    -
  • A
    license
    A
    quality
    B
    maintenance
    Enables searching and retrieving job listings from multiple platforms through MCP.
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables searching and retrieving tech job listings in the US and Canada from MCP-compatible apps, with tools for job search, full job details, and category browsing.
    MIT