Skip to main content
Glama

AI Applyd MCP Server

Auto-Apply That Ends on an Interview

Stop applying. Start interviewing.

Score your resume the way the screening software scores it, rewrite it for the exact role, write the cover letter, prepare for the interview, and send the application in on the employer's own hiring system. All from inside the assistant you already work in.

And it keeps the employer's own confirmation. Most tools count applications sent, which is a number the tool awards itself off its own button click. This one reports what the employer's system actually returned, so a real rejection is distinguishable from a form that quietly dropped your application.

Glama quality score Smithery MCP Registry AI Applyd on LobeHub Listed on mcpservers.org Listed on cursor.directory License: MIT

Listing page · Website · Privacy · Terms


Most applicants are screened out by software before a person reads a word, and a good number are never screened at all, because the form silently dropped a required field or the upload never attached. From the candidate's side those look identical to rejection, which is why so many people rewrite a CV nobody ever read.

This server puts both halves of that process in your hands: the screening, and the proof that the application arrived.

From the first match to the interview invite. Every application carries the employer's own confirmation.

Every application goes in on the company's real careers page, under your name, with your own materials. It lands on all fifteen major ATS platforms: Workday, Greenhouse, Lever, Ashby, Workable, iCIMS, Personio, Recruitee, Teamtailor, Rippling, Breezy, SmartRecruiters, BambooHR, JazzHR and softgarden.

Nothing to install. Connect once and run it from Claude, ChatGPT, Codex, Cursor, Gemini CLI, VS Code or any MCP client, and from your phone over iMessage through Poke.

The whole job search in five calls: see your matches (aiapplyd_get_matches), apply to one (aiapplyd_apply, sent automatically or held for your yes), approve or reject what is waiting (aiapplyd_review_application), track every application to the employer's own receipt (aiapplyd_get_applications), and check your plan and what is left (aiapplyd_get_account). The full list is under Tools.

Quick start

One click, if your app supports it:

Add to Cursor Install in VS Code Add to Poke (iMessage)

AI Applyd is a hosted remote MCP server. Point your client at one URL:

https://mcp.aiapplyd.com/mcp

The first tool call opens an OAuth sign-in. Sign in with Google, and you are connected. A free account needs no card and arrives with a one-time 10,000-token starter grant.

Claude (web, Desktop, Code)

Settings → Connectors → Add custom connector

Field

Value

Name

AI Applyd

Remote MCP server URL

https://mcp.aiapplyd.com/mcp

In Claude Code, one line does it:

claude mcp add --transport http aiapplyd https://mcp.aiapplyd.com/mcp

Cursor

~/.cursor/mcp.json:

{
  "mcpServers": {
    "aiapplyd": {
      "url": "https://mcp.aiapplyd.com/mcp"
    }
  }
}

ChatGPT

Settings → Connectors → Create and paste https://mcp.aiapplyd.com/mcp. ChatGPT speaks MCP natively, so there is no Action schema to import and nothing to host.

VS Code

code --add-mcp '{"name":"aiapplyd","type":"http","url":"https://mcp.aiapplyd.com/mcp"}'

Plugin for Codex, ChatGPT, Claude Code and Cursor

This repository is a plugin marketplace. The aiapplyd plugin bundles the MCP server with five skills, in the portable plugin.json format that Codex, ChatGPT, Claude Code and Cursor read:

Skill

Use it when

find-matching-jobs

You want your job matches, want to save or skip one, or want to change what it looks for

apply-to-a-job

You want to apply, or you paste a job link and say "apply"

review-and-send

You want to see what is waiting for you, change it, and send it

tailor-for-a-job

You paste a job description and want the resume, cover letter or interview prep for it

track-applications

You ask "did it go through", or how many applications you have left

The same five skills are published for any agent at aiapplyd.com/.well-known/agent-skills/index.json, and the copies here are byte-identical to those (each file matches the sha256 digest in that index).

Codex:

codex plugin marketplace add aiapplyd/aiapplyd-mcp
codex plugin add aiapplyd@aiapplyd

Claude Code:

claude plugin marketplace add aiapplyd/aiapplyd-mcp
claude plugin install aiapplyd@aiapplyd

Codex (CLI, IDE extension and the ChatGPT desktop app)

codex mcp add aiapplyd --url https://mcp.aiapplyd.com/mcp
codex mcp login aiapplyd

The Codex CLI, the IDE extension and the ChatGPT desktop app share this configuration.

Gemini CLI

This repository is also a Gemini CLI extension (gemini-extension.json plus GEMINI.md):

gemini extensions install https://github.com/aiapplyd/aiapplyd-mcp

Or add the server by hand in ~/.gemini/settings.json:

{
  "mcpServers": {
    "aiapplyd": { "httpUrl": "https://mcp.aiapplyd.com/mcp" }
  }
}

Zed

Settings → AI → MCP Servers → Add Remote Server, then paste https://mcp.aiapplyd.com/mcp.

Windsurf

~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "aiapplyd": { "command": "npx", "args": ["-y", "mcp-remote", "https://mcp.aiapplyd.com/mcp"] }
  }
}

Perplexity, Mistral Le Chat and Raycast

Each has a custom connector screen that takes a remote MCP URL. Paste https://mcp.aiapplyd.com/mcp and choose OAuth.

From your phone: iMessage, Telegram and WhatsApp

  • iMessage / SMS: add AI Applyd to Poke in one tap (or npx poke@latest mcp add https://mcp.aiapplyd.com/mcp -n "AI Applyd"), sign in, then text Poke: "find me remote product designer jobs and apply to the best two".

  • Telegram, WhatsApp or iMessage on your own server: OpenClaw is a self-hosted gateway. Add the URL as an MCP server and enable the channel you use.

Any client that only speaks stdio

This repository ships a thin bridge. It relays the protocol to the hosted server and adds nothing of its own.

npx -y github:aiapplyd/aiapplyd-mcp

Or with Docker:

docker build -t aiapplyd-mcp .
docker run --rm -i aiapplyd-mcp
{
  "mcpServers": {
    "aiapplyd": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "aiapplyd-mcp"]
    }
  }
}

Environment variable

Default

Meaning

AIAPPLYD_MCP_URL

https://mcp.aiapplyd.com/mcp

Endpoint to relay to. Point it at https://mcp-preview.aiapplyd.com/mcp to test against preview.

AIAPPLYD_TOKEN

unset

Optional bearer token. Without it the server still answers introspection; tool calls return 401 until an account is connected.

Related MCP server: Application Tracker MCP

Command line and bots

The same package is a small CLI, so a script, a cron job or a chat bot (Telegram, WhatsApp, iMessage) can run the whole job search without an MCP client.

npx aiapplyd-mcp login                                    # sign in once in the browser
npx aiapplyd-mcp tools                                    # list the tools
npx aiapplyd-mcp call aiapplyd_get_matches '{"limit": 5}' # matched jobs as JSON
npx aiapplyd-mcp call aiapplyd_apply '{"job_match_id": 123, "mode": "review"}'
npx aiapplyd-mcp call aiapplyd_get_applications '{"status": "waiting_for_review"}'
npx aiapplyd-mcp call aiapplyd_review_application '{"decision": "approve", "application_ids": [456]}'

login runs the same OAuth sign-in a desktop client runs and stores the token in ~/.config/aiapplyd/credentials.json (mode 600). It refreshes on its own, so an unattended bot keeps working. call prints the tool's structured result as JSON. Exit code 0 means success, 1 means the tool reported an error, 2 means you are not signed in.

Run with no arguments and it is a stdio MCP server that relays to https://mcp.aiapplyd.com/mcp, signed in with the stored login. AIAPPLYD_TOKEN overrides the stored login and AIAPPLYD_MCP_URL overrides the endpoint.

Endpoints

Environment

Streamable HTTP (modern)

SSE (legacy bridges)

Production

https://mcp.aiapplyd.com/mcp

https://mcp.aiapplyd.com/sse

Preview

https://mcp-preview.aiapplyd.com/mcp

https://mcp-preview.aiapplyd.com/sse

Use /mcp. /sse remains only for clients that cannot speak Streamable HTTP.

Tools

The table below is generated from the live tools/list of https://mcp.aiapplyd.com/mcp. Every tool runs on the caller's own AI Applyd account and spends that account's own credits. The server holds no allowance of its own and there is no anonymous tool.

The main loop

Five tools run the whole job search from a chat, or from a bot where a match drops and you reply "yes":

aiapplyd_get_matches -> aiapplyd_apply -> aiapplyd_get_applications -> aiapplyd_review_application
                  aiapplyd_get_account (plan, what is left, readiness)

Tool

Title

Hints

What it does

aiapplyd_get_matches

Get Job Matches

read-only, idempotent

Your matched jobs, best first, each with the job_match_id that apply takes. Also reads full postings, or any posting from a link

aiapplyd_apply

Apply to Job

destructive, open-world

Apply to one job by job_match_id or job_url on the employer's own hiring system. mode: "auto" sends it, mode: "review" holds it for your yes

aiapplyd_get_applications

Get Applications

read-only, idempotent

Every application and where it stands, the review queue, and the employer's own confirmation when it exists

aiapplyd_review_application

Approve or Reject Applications

destructive, open-world

Approve (send) or reject waiting applications, up to 25 at once. Also cancel, refine a document, re-prepare, or record the interview stage

aiapplyd_get_account

Get Account

read-only, idempotent

Your plan, token balance, applications left, job preferences, and whether your profile is ready to apply

Setup and triage

Tool

Title

Hints

What it does

aiapplyd_set_resume

Set Resume

writes, open-world

Put your resume on your account as the base every application is tailored from: pasted text, a file link, or a saved resume

aiapplyd_triage_matches

Save or Skip Matches

writes, idempotent

Save a match, or skip it with a reason, so a job you declined stops coming back

aiapplyd_update_job_preferences

Update Job Preferences

destructive, idempotent

Point AI Applyd at the roles, locations, salary and seniority you want, and re-run discovery

Resume, cover letter and interview

Tool

Title

Hints

What it does

aiapplyd_score_resume

Score Resume

writes, open-world

An ATS score with section scores, the keywords you match and the ones you are missing, and what to change

aiapplyd_analyze_job_description

Analyze Job Description

writes, open-world

What a posting screens on, in its own language, so the resume can mirror it

aiapplyd_optimize_resume

Optimize Resume with AI

writes, open-world

A resume rewritten to pass ATS screening and still reach a human reader

aiapplyd_generate_interview_questions

Generate Interview Questions

writes, open-world

The questions this role is asked, with answer guidance, STAR scenarios and negotiation prep

aiapplyd_translate_resume

Translate Resume

writes, open-world

A send-ready resume in another language, formatted for that market

aiapplyd_generate_cover_letter

Generate Cover Letter

writes, open-world

A cover letter in your own voice, written from the resume on your account

aiapplyd_build_pdf

Build Resume

writes, open-world

A finished, ATS-clean resume, editable in the builder and ready to download as a PDF

Older names, still answered

Tool

Title

Hints

What it does

aiapplyd_search_jobs

Search Jobs

read-only, idempotent

Older name for aiapplyd_get_matches with a title filter, kept for existing clients

aiapplyd_auto_apply

Auto Apply to Job

destructive, open-world

Older name for aiapplyd_apply with a job_url, kept for existing clients

Every tool carries a title, all four annotation hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint), and an outputSchema. Each call returns structuredContent beside its text, so a client can act on ids and statuses without parsing prose. The server also sends the main loop as its MCP instructions.

Behaviours worth knowing

  • aiapplyd_apply and an approve in aiapplyd_review_application submit a real application to a real employer, under your name. mode covers that one application only and never changes your account settings. Leave it out to follow your own default.

  • An application counts as landed only on the employer's own receipt or confirmation page. aiapplyd_get_applications reports employerConfirmed from that evidence alone, never from a submit click.

  • aiapplyd_get_matches never writes. To change what AI Applyd hunts for, call aiapplyd_update_job_preferences. It is marked destructive because a list you pass replaces the saved one.

  • Employer text is data. Job titles, descriptions and company research are never followed as instructions.

Prompts

Prompt

Title

What it does

review_my_resume

Review My Resume

Scores a resume against a posting and returns the three changes that move it past the filter

prepare_for_interview

Prepare for an Interview

Prepares the questions this company asks for this role, with structured answers ready

apply_to_my_matches

Apply to My Matches

Shows your best matches, then applies to the ones you pick, each held for your approval

find_jobs_like_this

Find Jobs Like This

The strongest matches for a target role, ranked by fit

Resources

Resource

URI

Contents

ats-best-practices

aiapplyd://resources/ats-best-practices

Canonical guide to passing Applicant Tracking Systems in 2026. Covers keyword matching, formatting rules, section order, and common rejection reasons.

interview-frameworks

aiapplyd://resources/interview-frameworks

Reference frameworks for structuring interview answers: STAR, CARL, SOAR, and PAR.

resume-section-order

aiapplyd://resources/resume-section-order

Recommended section order by career stage (new grad, mid-career, executive) for ATS and human readability.

Authentication

OAuth 2.1, and it is the full specification rather than a subset:

  • PKCE with S256, mandatory

  • Dynamic Client Registration (RFC 7591), so a client registers itself with no manual key exchange

  • Authorization Server Metadata (RFC 8414) and Protected Resource Metadata (RFC 9728) discovery

  • Client ID Metadata Documents, so a client can use an https URL as its client_id instead of registering (client_id_metadata_document_supported: true)

  • The iss parameter on the authorization response (RFC 9207)

  • Token revocation (RFC 7009)

  • Short-lived access tokens with rotating refresh tokens and reuse detection

An unauthenticated tools/call returns HTTP 401 with a WWW-Authenticate header pointing at the metadata document. Introspection (initialize, tools/list, prompts/list, resources/list) is open, so any directory or client can read the tool surface before a user signs in.

Verify it yourself

SID=$(curl -s -D- -o /dev/null -X POST https://mcp.aiapplyd.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}' \
  | grep -i '^mcp-session-id' | tr -d '\r' | awk '{print $2}')

curl -s -X POST https://mcp.aiapplyd.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H "Mcp-Session-Id: $SID" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

Privacy

Your resume and profile stay on your AI Applyd account. Tools read and write that account and nothing else. The privacy policy and terms are the binding statement.

Support

Follow AI Applyd

About this repository

The hosted server runs on Cloudflare Workers and its source is not public. This repository is the public home of the MCP server: the server.json manifest, the connection documentation, and the small stdio bridge above. The bridge is MIT licensed and forwards messages verbatim, so you can read every line of what runs on your machine.


More from AI Applyd

Built by AI Applyd. Questions: ava@aiapplyd.com

Available Tools

17 tools
aiapplyd_analyze_job_descriptionAnalyze Job DescriptionAInspect

Extract what a job posting actually screens on: the exact ATS keywords, must-have versus nice-to-have requirements, seniority signals, and red flags. Call this before tailoring a resume so the resume mirrors the posting's own language. Requires a connected AI Applyd account and uses the user's AI credits. Do not use it to read a posting from a link; use aiapplyd_get_matches with job_url. Next: aiapplyd_score_resume or aiapplyd_optimize_resume with the same job description.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_descriptionYesFull text of the job description

Output Schema

ParametersJSON Schema
NameRequiredDescription
keywordsYes

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the annotations, the description discloses meaningful operational context: it requires a connected AI Applyd account and consumes the user's AI credits. It does not contradict the annotations, and while it doesn't detail all side effects, the added auth and cost information is useful.

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 four sentences with no filler. The primary purpose is front-loaded, followed by usage timing, an exclusion with the correct alternative, and next-step recommendations—all in a compact, scannable structure.

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 analysis tool with an output schema and annotations, the description covers purpose, when to use, when not to use, alternatives, required account state, and cost implications. 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.

Parameters3/5

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

Schema description coverage is 100%, and the only parameter, job_description, is already documented as 'Full text of the job description' in the schema. The tool description doesn't add much parameter-specific meaning beyond that, which matches the baseline for high schema coverage.

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 opens with a specific verb and resource: 'Extract what a job posting actually screens on,' and enumerates concrete outputs (ATS keywords, must-have versus nice-to-have requirements, seniority signals, red flags). This clearly distinguishes it from sibling tools like aiapplyd_get_matches and aiapplyd_score_resume.

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 says when to call it ('Call this before tailoring a resume'), what not to use it for ('Do not use it to read a posting from a link'), and names the alternative (aiapplyd_get_matches with job_url). It also chains the next steps by recommending aiapplyd_score_resume or aiapplyd_optimize_resume afterward.

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

aiapplyd_applyApply to JobA
Destructive
Inspect

Apply to one job on the user's behalf. Pass job_match_id from aiapplyd_get_matches, or job_url for any posting. AI Applyd rewrites the resume and cover letter for that role, then completes and submits the application on the employer's own hiring system (Workday, Greenhouse, Lever, Ashby, iCIMS and the other major ATS platforms). mode "auto" submits with no review step; mode "review" prepares everything and holds it for the user's approval; omit mode to follow the review setting on the user's account. The mode applies to this one application and never changes the user's settings. Spends one of the user's applications and AI credits, and a submitted application cannot be withdrawn, so apply only to jobs the user chose. Returns the application id and a tracking link; when the job already has an application, that one comes back with alreadyExisted true instead of a second. On a timeout or an error, call aiapplyd_get_applications before retrying, and never re-apply by job_url to a job already applied to by job_match_id. Do not use it to save or skip a match; use aiapplyd_triage_matches. Next: aiapplyd_get_applications to follow it, and aiapplyd_review_application if it waits for approval.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo"auto" submits with no review step. "review" holds the prepared application for the user's approval. Omit to follow the user's account setting. Applies to this application only.
job_urlNoURL of any job posting to apply to (e.g. "https://boards.greenhouse.io/acme/jobs/123"). Pass this OR job_match_id.
job_match_idNoThe job_match_id of a match from aiapplyd_get_matches (e.g. 48213). Pass this OR job_url.

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobUrlYes
statusYesOur own record. Never proof the employer received it.
companyYes
outcomeYesstarted: a new application; already_in_progress: this job already had one (alreadyExisted); not_confirmed: the user declined, nothing was sent.
jobTitleYes
jobMatchIdYes
trackingUrlYes
recordedModeYes
applicationIdYesThe application to follow with aiapplyd_get_applications. Null only when nothing was started.
requestedModeYes
alreadyExistedYesTrue when this job already had an application, which is returned instead of a second one.
preparationStatusYes
preparedUnderFreeWatchYes

TDQS

A4.8/5.0
Behavior5/5

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

The description goes beyond the annotations by detailing that it rewrites the resume and cover letter, submits on the employer's system, spends applications and AI credits, and that a submitted application cannot be withdrawn. It also flags idempotency behavior (alreadyExisted) and error handling guidance, all of which are not in the annotations. This fully discloses the destructive, non-idempotent nature in concrete terms.

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 long but each sentence earns its place; it is front-loaded with the core purpose and then methodically covers identifiers, behavior, side effects, error handling, and alternatives. While it could be tightened, the density is justified for a destructive, high-stakes operation.

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 complexity of the operation (external submission, side effects, error handling), the description covers all necessary aspects: how to identify the job, what the tool does, side effects, retry guidance, and follow-up tools. The existence of an output schema means return values don't need to be spelled out, and the description is complete for an agent to invoke 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?

Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining that job_match_id must come from aiapplyd_get_matches and that job_url works for any posting, plus clarifying that mode applies only to this application and never changes user settings. These semantics go beyond the schema's field-level descriptions without being redundant.

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 opens with 'Apply to one job on the user's behalf,' which states a specific verb and resource. It further distinguishes itself by explaining how to identify the job (via job_match_id from aiapplyd_get_matches or job_url) and explicitly says not to use it for saving or skipping matches, directing to aiapplyd_triage_matches. This makes it clear among the 16 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 provides explicit when-to-use guidance: 'apply only to jobs the user chose' and gives exact alternatives for other actions: 'Do not use it to save or skip a match; use aiapplyd_triage_matches.' It also maps next steps (aiapplyd_get_applications, aiapplyd_review_application) and clarifies the mode semantics, leaving no ambiguity about when to invoke this tool versus other tools.

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

aiapplyd_auto_applyAuto Apply to JobA
Destructive
Inspect

Deprecated alias of aiapplyd_apply, use aiapplyd_apply. Applies to ONE job posting by job_url, end to end, on the employer's own hiring system (Workday, Greenhouse, Lever, Ashby, Workable, iCIMS, Personio, Recruitee, Teamtailor, Rippling, Breezy, SmartRecruiters, BambooHR, JazzHR, softgarden), following the account's review setting. Spends one of the user's applications.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_urlYesURL of the job posting to apply to

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobUrlYes
statusYesOur own record. Never proof the employer received it.
companyYes
outcomeYesstarted: a new application; already_in_progress: this job already had one (alreadyExisted); not_confirmed: the user declined, nothing was sent.
jobTitleYes
jobMatchIdYes
trackingUrlYes
recordedModeYes
applicationIdYesThe application to follow with aiapplyd_get_applications. Null only when nothing was started.
requestedModeYes
alreadyExistedYesTrue when this job already had an application, which is returned instead of a second one.
preparationStatusYes
preparedUnderFreeWatchYes

TDQS

A4.5/5.0
Behavior4/5

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

The annotations already establish that this is destructive and not read-only; the description adds meaningful context by stating it 'spends one of the user's applications' and by scoping the action to one job posting across listed ATS systems. It does not cover auth or rate limits, but the key consequence is disclosed.

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 deprecation warning is front-loaded, and every subsequent clause carries operational meaning: one job, end-to-end, supported systems, review setting, and cost. The ATS list is long but directly tells an agent where the tool works, so no sentence is wasted.

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 one-parameter tool with an output schema and rich annotations, this description covers the essential operational facts: what is acted on, the supported contexts, the review behavior, and the irreversible cost. Nothing needed to decide whether to invoke it 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 coverage is 100% and the single job_url parameter is already documented as 'URL of the job posting to apply to.' The description reinforces that the URL selects a single job, but it adds no format, normalization, or other parameter-level 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 states a concrete action ('applies to ONE job posting by job_url, end to end') and identifies the target resource, and it explicitly distinguishes itself from aiapplyd_apply by declaring itself a deprecated alias. This leaves no ambiguity about what the tool does or which sibling should be used.

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 opens with an explicit directive: 'Deprecated alias of aiapplyd_apply, use aiapplyd_apply.' It also specifies when the underlying behavior applies (one job URL, on the employer's own ATS, following the review setting), so an agent knows both the alternative and the conditions around use.

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

aiapplyd_build_pdfBuild ResumeAInspect

Build a formatted, ATS-clean resume from raw text in the user's AI Applyd resume builder, where it stays editable and downloads as a PDF. Templates: modern, classic, or minimal. Private to the account by default; set make_public to true only if the user explicitly asks for a shareable public link. Requires a paid plan (Hired in 30+). Uses the user's AI credits. Do not use it to rewrite a resume; use aiapplyd_optimize_resume.

ParametersJSON Schema
NameRequiredDescriptionDefault
templateNoResume template style (default: classic)
make_publicNoPublish a public share link. Anyone with the link sees the resume INCLUDING its contact details. Defaults to false (private). Only set true when the user explicitly asks to share it.
resume_textYesFull text of the resume

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
templateYes
publicUrlYes
resumeBuildIdYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already state readOnlyHint=false, destructiveHint=false, and openWorldHint=true. The description adds valuable behavioral details: the result stays editable and downloads as a PDF, defaults to private, requires a paid plan, and consumes AI credits. It doesn't contradict annotations. Could perhaps mention side effects more deeply, but the description adds solid context.

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 sentences, each earning its place: what it does, templates, privacy default, paid plan/credits, and forked routing to sibling. Front-loaded with the main verb and artifact. No fluff.

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 output schema exists (so return values are documented), the parameters are fully covered in the schema, and the description covers usage, privacy, and exclusions, nothing an agent needs to invoke correctly is missing. It even flags account requirements and alternative tool routing.

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 schema already thoroughly documents all 3 parameters, including the make_public privacy warning. The description adds the privacy default context but doesn't add much beyond the schema for parameters. Baseline 3 is appropriate since the schema carries the load.

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 specific verb (build), resource (resume in AI Applyd), and key output (ATS-clean PDF, editable). It also distinguishes from siblings by explicitly saying 'Do not use it to rewrite a resume; use aiapplyd_optimize_resume.' The scope is unambiguous.

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?

The description explicitly says when to use (build a formatted resume from raw text) and when not to (not for rewriting; use aiapplyd_optimize_resume instead). It also gives context on privacy and paid plan requirements, which helps an agent decide if it's the right tool.

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

aiapplyd_generate_cover_letterGenerate Cover LetterAInspect

Write a cover letter for a specific job from the base resume saved on the user's AI Applyd account, in their own voice and free of recruiter cliches. Returns the finished letter as text and saves it to the account. Pass application_id instead to get the letter already written for that application (no new letter), with instructions to change it. Needs a resume on file (see aiapplyd_set_resume) and a paid plan (Hired in 30+); without either it says so and links the fix. Uses the user's AI credits. Do not use it for applications: aiapplyd_apply already writes a cover letter for every one.

ParametersJSON Schema
NameRequiredDescriptionDefault
company_nameNoName of the company you are applying to
instructionsNoWith application_id: what to change in that letter, in the user's own words.
application_idNoReturn the cover letter already written for this application (an id from aiapplyd_get_applications) instead of writing a new one.
job_descriptionNoFull text of the target job description. Pass with company_name, or pass application_id instead.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
sourceYesgenerated: newly written; application: the letter already prepared for application_id; refined: that letter, changed as asked.
companyNameYes
coverLetterYes
applicationIdYes
resumeBuildIdYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the minimal annotations (readOnlyHint false, etc.), the description discloses that the tool saves the letter to the account, uses AI credits, requires a resume and paid plan, and gracefully handles missing prerequisites by informing the user. It also reveals the two operational modes and the stylistic behavior of avoiding recruiter cliches. No contradictions with 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?

The description is information-dense yet efficient, front-loading the core purpose and then covering prerequisites, alternative usage, and exclusions. Every sentence contributes necessary detail without redundancy. The structure flows logically from action to caveats to alternative.

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 tool's complexity (two modes, prerequisites, credit usage) and the presence of an output schema, the description covers all essential aspects: the two modes, what happens when prerequisites are missing, the credit usage, and the alternative tool. Nothing critical is omitted for an agent 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?

Schema coverage is 100% so baseline is 3. The description adds value by explaining the relationship between parameters: company_name and job_description are used together, while application_id is an alternative, and instructions only apply when application_id is provided. This relational context is not in the schema and helps correct usage.

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 writes a cover letter from the user's base resume for a specific job, and explicitly distinguishes it from aiapplyd_apply by warning not to use it for applications. The verb 'write' and resource 'cover letter' are specific, and the alternative mode via application_id is clearly explained.

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?

The description gives explicit when-to-use guidance: use for writing a new cover letter, or pass application_id to retrieve an existing one. It also states exclusions (aiapplyd_apply already writes cover letters for applications) and prerequisites (resume on file and paid plan), including what happens if they're missing. This leaves no ambiguity about when to choose this tool.

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

aiapplyd_generate_interview_questionsGenerate Interview QuestionsAInspect

Produce interview preparation for a specific role and company: company insights, the questions this role is asked with approach guidance, STAR scenarios drawn from the posting, talking points, questions to ask the interviewer, and salary negotiation prep. Pass application_id to prep for a job the user applied to (no new saved job), or job_title and company_name for any other job. Requires a connected AI Applyd account. Uses the user's AI credits, and saves the job to their account if it is not saved yet. Do not use it for a cover letter; use aiapplyd_generate_cover_letter.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_titleNoTitle of the position (e.g. "Senior Software Engineer"). Pass with company_name, or pass application_id instead.
company_nameNoName of the company. Pass with job_title, or pass application_id instead.
application_idNoPrep for the job of this application (an id from aiapplyd_get_applications). Replaces job_title and company_name.
job_descriptionNoFull text of the job description (optional but recommended for better results)

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobIdYes
prepUrlYes
jobTitleYes
companyNameYes
questionsToAskYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, the description discloses that a connected AI Applyd account is required, that the operation uses the user's AI credits, and that it saves the job to the account if not already saved. These are meaningful side effects and prerequisites that annotations alone do not convey.

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 compact and front-loaded with the deliverable, then covers usage, prerequisites, side effects, and exclusions. Every sentence earns its place, and the structure makes it easy for an agent to scan.

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 a complete input schema and an output schema present, the description covers the remaining operational essentials: account requirement, credit consumption, job-saving side effect, and the routing rule. An agent has enough to select and invoke the tool 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?

Schema coverage is 100%, so the schema already documents each parameter. The description adds useful semantic context by explaining the mutually exclusive routing between application_id and the job_title/company_name pair, and clarifies that using application_id means no new saved job. This exceeds the baseline without adding much 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 starts with an explicit verb and resource: 'Produce interview preparation for a specific role and company' and lists the concrete components it generates. It also distinguishes itself from aiapplyd_generate_cover_letter, making its purpose unmistakable.

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 gives clear routing guidance: pass application_id for jobs the user applied to, or job_title and company_name otherwise. It also explicitly warns not to use it for cover letters and points to the correct sibling tool, which is strong when-to-use/alternative guidance.

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

aiapplyd_get_accountGet AccountA
Read-onlyIdempotent
Inspect

Show the user's AI Applyd account: plan, token balance, applications left in the current 30-day window, the job preferences their matches are found against, and readiness: whether a resume is on file, whether setup is finished, and which profile fields employer forms require that are still empty. Also lists their resumes and the default apply mode. Call it first, and before applying to several jobs. Read-only: it spends no credits and changes nothing. Do not use it to change anything; use aiapplyd_update_job_preferences or aiapplyd_set_resume. Next: aiapplyd_set_resume when no resume is on file, otherwise aiapplyd_get_matches.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
planYes
resumesYes
autopilotYesWhether AI Applyd applies on its own. Read only.
readinessYes
billingUrlYes
preferencesYes
applicationsYes
tokenBalanceYes
defaultApplyModeYesWhat aiapplyd_apply does when mode is omitted. Read only.
freeApplicationsYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark readOnlyHint and destructiveHint false, but the description adds valuable detail not in annotations: 'it spends no credits and changes nothing.' This clarifies the credit cost, a side effect an agent must know. No contradiction with the annotations.

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

Conciseness5/5

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

The description is information-dense but tightly organized: it opens with the tool's primary output, then gives usage timing, then read-only behavior, exclusions, and follow-up steps. Every sentence adds necessary guidance without padding or repetition.

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 tool takes no inputs and has an output schema, the description fully covers the operation: what it shows, when to call it, what not to use it for, and what to do next. 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?

The tool has zero parameters and the schema is fully documented (vacuously, 100% coverage). With 0 params, the baseline is 4; the description does not need to discuss parameters since there are none.

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 explicitly states the tool shows the user's AI Applyd account with a detailed breakdown across plan, tokens, applications, preferences, readiness, resumes, and apply mode. It also distinguishes itself from sibling tools by explicitly naming the change tools it is not: 'Do not use it to change anything; use aiapplyd_update_job_preferences or aiapplyd_set_resume.'

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?

Provides explicit when-to-use guidance: 'Call it first, and before applying to several jobs.' It also gives explicit alternatives and when-not: 'Do not use it to change anything; use aiapplyd_update_job_preferences or aiapplyd_set_resume.' Next-step logic is even provided based on resume status.

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

aiapplyd_get_applicationsGet ApplicationsA
Read-onlyIdempotent
Inspect

List the user's applications and where each one stands, or read one by application_id to see what will be or was sent: the tailored resume, the cover letter, the screening answers, why it stopped, and its place in the queue, plus the employer's confirmation page as an image when that page is the proof. Use this to check progress, to find applications waiting for the user's approval (status "waiting_for_review"), or to see whether an employer confirmed a submission. An application is reported as employer-confirmed only when the employer sent a receipt or showed its confirmation page. Other status filters: queued_to_apply, submitted, verified, not_landed, taken_down. Returns 20 per page. Read-only: it spends no credits. Do not use it to act on an application; use aiapplyd_review_application. Next: aiapplyd_review_application to approve, reject or change what is waiting.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1 (e.g. 2 for the next page)
statusNoFilter the list: waiting_for_review (the review queue), queued_to_apply, submitted, verified, not_landed or taken_down. Omit for all.
application_idNoRead one application by its id (e.g. 1550). Omit to list applications.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
detailYesFilled when one application_id was read: what will be or was sent.
totalPagesYes
applicationsYes
totalApplicationsYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description reinforces this by stating 'Read-only: it spends no credits.' It adds valuable behavioral context beyond the annotations: pagination details ('Returns 20 per page'), the strict definition of 'employer-confirmed', and what content is included for a single application. This fully discloses the tool's behavior and side effects.

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 information-dense but well organized: it leads with the core purpose, then use cases, confirmations, statuses, pagination, and a clear pointer to the sibling tool. There is slight redundancy where the 'Do not use it... use aiapplyd_review_application' instruction is repeated in the closing sentence, but overall 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 tool with three parameters, rich annotations, and an output schema, the description is complete: it explains read behavior, credit implications, pagination, status meanings, and the exact distinction from aiapplyd_review_application. Nothing essential is missing for an agent to select and invoke this tool 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?

Input schema coverage is 100%, with all three parameters already described. The description adds meaningful context by explaining the status filter semantics, the pagination behavior tied to the page parameter, and that application_id reads one application in detail. It does not fully define every status value, but it compensates well beyond the baseline for schema-covered 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 opens with a precise verb and resource: 'List the user's applications and where each one stands, or read one by application_id.' It also specifies what is returned for a single application, including the tailored resume, cover letter, screening answers, queue status, and employer confirmation image. It clearly distinguishes itself from the sibling action tool by stating it is not for acting on applications.

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?

The description explicitly tells the agent when to use this tool: 'Use this to check progress, to find applications waiting for the user's approval... or to see whether an employer confirmed a submission.' It also provides an explicit exclusion: 'Do not use it to act on an application; use aiapplyd_review_application.' This is exemplary when-to-use versus when-not-to-use guidance.

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

aiapplyd_get_matchesGet Job MatchesA
Read-onlyIdempotent
Inspect

List the user's matched jobs: the roles AI Applyd found for them against their saved job preferences, best matches first, each with a job_match_id, title, company, location, match score, a 500-character excerpt of the posting and the apply URL. Pass job_match_ids (up to 10) to read the full posting, skills and benefits of specific matches; job_url to read any posting without saving it; query, location or remote_only to narrow the list; after_job_match_id with the newestJobMatchId you stored to see only matches newer than your last check. Read-only: it spends no credits and changes nothing. Do not use it to change what the user is matched against; use aiapplyd_update_job_preferences for that. Next: pass a job_match_id to aiapplyd_apply, or save or skip a match with aiapplyd_triage_matches.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1 (e.g. 2 for the next page)
limitNoMatches per page, 1 to 50 (default 10)
queryNoNarrow the list to titles containing this text (e.g. "Product Designer").
job_urlNoRead any job posting by URL without saving it (e.g. "https://jobs.lever.co/acme/123").
locationNoPreferred location (e.g. "San Francisco, CA", "New York", "Remote")
saved_onlyNoIf true, only return the matches the user saved
remote_onlyNoIf true, only show remote-friendly positions
job_match_idsNoRead these matches in full: up to 10 job_match_ids (e.g. [48213]). Returns the full posting, skills, benefits and work arrangement.
after_job_match_idNoReturn only matches newer than this job_match_id. Store newestJobMatchId from each answer and pass it back.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYes
pageYes
matchesYes
postingYesA posting read from job_url. Nothing was saved.
totalPagesYes
notFoundIdsYesRequested job_match_ids that do not exist on this account.
totalMatchesYes
newestJobMatchIdYesThe highest job_match_id on this page. Store it and pass it back as after_job_match_id to see only newer matches.

TDQS

A4.9/5.0
Behavior5/5

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

Even with annotations declaring readOnlyHint, idempotentHint, and destructiveHint, the description adds valuable behavior details: 'Read-only: it spends no credits and changes nothing'. It also clarifies semantics like reading a posting via job_url 'without saving it' and using after_job_match_id with stored newestJobMatchId for incremental checks.

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 dense but well-structured: core purpose first, then filtering/reading modes, then read-only guarantee, then guardrail and next-step suggestions. Every sentence contributes behavioral or routing information, and the key constraints 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?

Given the 9 optional parameters, rich input schema descriptions, output schema, and annotations, the description covers all essential usage modes, read-only behavior, credit implications, and next-step routing. Nothing an agent needs to select and invoke this tool 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?

The input schema already fully describes all 9 parameters, so the baseline is 3. The description adds useful context beyond the schema, such as job_match_ids being limited to 10 and returning 'the full posting, skills and benefits', and explaining the after_job_match_id pattern with newestJobMatchId. This justifies above baseline, though much of the added value repeats or summarizes schema descriptions.

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 opens with a specific verb and resource: 'List the user's matched jobs'. It further specifies that these are roles found against saved preferences, sorted best-first, and mentions key fields returned. This clearly distinguishes it from sibling tools like aiapplyd_search_jobs or aiapplyd_get_applications.

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?

The description explicitly states 'Do not use it to change what the user is matched against; use aiapplyd_update_job_preferences for that', giving a direct exclusion and alternative. It also routes the next step: pass a job_match_id to aiapplyd_apply or save/skip with aiapplyd_triage_matches. No ambiguity remains about when to use this tool.

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

aiapplyd_optimize_resumeOptimize Resume with AIAInspect

Rewrite a resume so it passes ATS screening. Returns the rewritten resume, a projected ATS score, and an itemised summary of every change made. Pass job_description to tailor the rewrite to one specific posting, or omit it for general ATS optimization. Requires a connected AI Applyd account. Uses the user's AI credits. Do not use it to apply: aiapplyd_apply tailors the resume for every application on its own.

ParametersJSON Schema
NameRequiredDescriptionDefault
resume_textYesFull text of the resume to optimize
job_descriptionNoFull text of the target job description (optional, omit for general ATS optimization)

Output Schema

ParametersJSON Schema
NameRequiredDescription
changesYes
optimizedResumeYes
projectedAtsScoreYes

TDQS

A4.7/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond annotations: it discloses that the tool uses the user's AI credits and requires a connected account. It also states that it returns a rewritten resume and a summary, implying it does not modify the stored resume directly. The annotations already indicate it is not read-only and not idempotent, so the description complements them with concrete side effects (credit usage) and prerequisites. It could go further by clarifying whether the rewrite is saved or only returned, but the current level is strong.

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

Conciseness5/5

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

The description is compact and front-loaded: it opens with the primary purpose and outputs, then covers optional usage, prerequisites, and an explicit sibling differentiation. Every sentence serves a purpose with no redundancy. It is well-structured and easy to parse.

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 tool's complexity (mutation, credit consumption, optional tailoring), the description covers all essential aspects: what it does, what it returns, when to use the optional parameter, prerequisites, and when not to use it. The output schema exists, so return values are partially documented, but the description still summarizes them clearly. No critical information is missing for an agent to invoke the tool 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 input schema already describes both parameters fully (100% coverage), so the baseline is 3. The description adds value by explaining the purpose of job_description ('to tailor the rewrite to one specific posting') and the omit condition ('general ATS optimization'), which is not explicit in the schema. It also implies that resume_text is the full text to be optimized, aligning with the schema. This goes beyond a simple restatement of parameter names.

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 a clear verb+resource: 'rewrite a resume so it passes ATS screening.' It also lists the exact outputs (rewritten resume, ATS score, itemised summary) and distinguishes itself from the sibling aiapplyd_apply by explicitly warning not to use it for applying. This makes the tool's purpose unambiguous and sets it apart from other resume-related 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 gives explicit usage guidance: pass job_description to tailor to one posting, or omit for general optimization. It also names aiapplyd_apply as the alternative for applying and states 'Do not use it to apply', leaving no ambiguity about when to choose this tool over a sibling. Additionally, it mentions prerequisites (connected AI Applyd account) and credit consumption, which are relevant usage constraints.

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

aiapplyd_review_applicationApprove or Reject ApplicationsA
Destructive
Inspect

Act on the user's applications. decision "approve" submits each waiting application on the employer's hiring system under the user's name: it spends one of their applications per job and cannot be undone. "reject" skips it: nothing is sent and nothing is spent. "cancel" stops one that is still queued or preparing. "refine" rewrites its resume or cover letter from instructions (document_type and instructions; uses AI credits). "re_prepare" builds its documents again (optional steps). "set_stage" records how it is going (stage). Pass up to 25 application_ids from aiapplyd_get_applications. Only approve on the user's explicit go-ahead, such as a "yes" to a specific application. On a timeout or an error, call aiapplyd_get_applications before retrying; an approve that already went through is reported as already approved. Do not use it for matches with no application yet; use aiapplyd_apply or aiapplyd_triage_matches. Next: aiapplyd_get_applications to follow the submissions.

ParametersJSON Schema
NameRequiredDescriptionDefault
stageNoFor set_stage: applied, callback, phone_screen, interview, offered, rejected or no_response.
stepsNoFor re_prepare: the steps to run again. Omit to run every step that is out of date.
decisionYes"approve" submits the application to the employer and cannot be undone. "reject" skips it and sends nothing. "cancel" stops a queued one. "refine" rewrites a document (needs document_type and instructions). "re_prepare" builds its documents again. "set_stage" records the stage (needs stage).
instructionsNoFor refine: what to change, in the user's own words (up to 2,000 characters).
document_typeNoFor refine: "resume" or "cover_letter".
application_idsYesApplication ids to act on, 1 to 25 (e.g. [1550, 1551]), from aiapplyd_get_applications

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
decisionYes
attemptedYes
succeededYes
notConfirmedYesTrue when the user declined the confirmation prompt and nothing was sent.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations provide destructiveHint=true and idempotentHint=false, and the description richly elaborates on those: 'approve' 'spends one of their applications per job and cannot be undone', 'reject' sends and spends nothing, 'refine' 'uses AI credits', and a retried approve that already went through 'is reported as already approved'. This adds meaningful behavioral context beyond the annotations without contradicting them.

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 long but every sentence earns its place. It front-loads the core action and decision inventory, then layers constraints (id source and cap, consent rule, timeout recovery), exclusions, and the follow-up call. For a six-mode tool with error handling and sibling routing, this density is appropriate with zero fluff.

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?

An output schema exists, so return values need no prose explanation. The description covers everything needed for safe invocation: all six behaviors, the decision-to-parameter coupling, id sourcing and limits, the explicit-go-ahead consent rule, timeout/error handling, when-not-to-use with named alternatives, and the next step ('aiapplyd_get_applications to follow the submissions'). Nothing an agent needs 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 baseline is 3, but the description adds real meaning beyond the schema: it couples decisions to their required parameters ('refine' needs document_type and instructions, 'set_stage' needs stage, 're_prepare' takes optional steps), caps application_ids at 25, and specifies that ids come from aiapplyd_get_applications. This explains the interplay between parameters that the schema's per-field descriptions do not.

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 opens with a clear verb and resource ('Act on the user's applications') and then enumerates each decision mode ('approve', 'reject', 'cancel', 'refine', 're_prepare', 'set_stage') with its specific effect. It also distinguishes itself from siblings by naming aiapplyd_apply and aiapplyd_triage_matches as the tools for matches with no application yet.

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?

Provides explicit when-to-use guidance: pass up to 25 ids 'from aiapplyd_get_applications' and only approve 'on the user's explicit go-ahead'. Explicitly states when not to use it ('Do not use it for matches with no application yet; use aiapplyd_apply or aiapplyd_triage_matches') and gives recovery guidance for timeouts and errors. This is full when/when-not/alternatives coverage.

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

aiapplyd_score_resumeScore ResumeAInspect

Score a resume for ATS compatibility. Returns an overall score, section scores, the keywords the resume matches and the ones it is missing, and specific rewrite suggestions. Pass job_description to score against a posting, or omit it for a general ATS readiness score. Requires a connected AI Applyd account and uses the user's credits. Do not use it to rewrite the resume; use aiapplyd_optimize_resume. Next: aiapplyd_optimize_resume rewrites the resume against the same posting.

ParametersJSON Schema
NameRequiredDescriptionDefault
resume_textYesFull text of the resume
job_descriptionNoFull text of the job description (optional, omit for a general ATS readiness score)

Output Schema

ParametersJSON Schema
NameRequiredDescription
suggestionsYes
overallScoreYes
sectionScoresYes
keywordMatchesYes
missingKeywordsYes

TDQS

A4.7/5.0
Behavior5/5

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

With annotations indicating readOnlyHint=false, destructiveHint=false, and idempotentHint=false, the description adds critical context: it requires a connected AI Applyd account and uses the user's credits, implying a cost. It also discloses the action is non-idempotent (credits spent) and not destructive. This goes beyond the annotations by explaining the account requirement and credit consumption.

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 efficient, with each sentence serving a purpose: defining outputs, explaining usage options, noting prerequisites, and routing to the sibling. It front-loads the core purpose and then the usage, and the sibling routing is placed at the end, helpful for flow.

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 tool's moderate complexity, the output schema exists to document return values, and parameters are fully covered in schema, the description is complete: it states the inputs, the optionality, the account requirement, credit usage, and the boundary with the optimization tool. Nothing essential is missing for an agent to call it correctly.

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 both parameters (resume_text and job_description) are documented in the schema. The description adds the distinction between omitting job_description for a general score, which aligns with the schema's optional note. However, it doesn't add syntax or format details 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.

Purpose5/5

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

The description clearly states the tool scores a resume for ATS compatibility, lists the specific outputs (overall score, section scores, keywords, suggestions), and differentiates it from the sibling aiapplyd_optimize_resume by explicitly stating it does not rewrite. The verb 'Score' and resource 'resume' are specific, and the mention of optional job_description clarifies variants.

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?

The description provides clear guidance on when to use it: pass job_description to score against a posting, or omit for general ATS readiness. It explicitly states 'Do not use it to rewrite the resume; use aiapplyd_optimize_resume' and names the alternative. This directly addresses selection among siblings and gives a next-step recommendation.

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

aiapplyd_search_jobsSearch JobsA
Read-onlyIdempotent
Inspect

Deprecated alias of aiapplyd_get_matches, use aiapplyd_get_matches. Returns the user's matched jobs filtered by title, location and remote, exactly as aiapplyd_get_matches with query, location and remote_only. Read-only: it never changes which roles AI Applyd hunts for.

ParametersJSON Schema
NameRequiredDescriptionDefault
locationNoPreferred location (e.g. "San Francisco, CA", "New York", "Remote")
job_titleYesJob title to search for (e.g. "Software Engineer", "Product Manager")
remote_onlyNoIf true, only show remote-friendly positions

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYes
pageYes
matchesYes
postingYesA posting read from job_url. Nothing was saved.
totalPagesYes
notFoundIdsYesRequested job_match_ids that do not exist on this account.
totalMatchesYes
newestJobMatchIdYesThe highest job_match_id on this page. Store it and pass it back as after_job_match_id to see only newer matches.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which covers safety. The description adds the explicit read-only guarantee ('it never changes which roles AI Applyd hunts for') and deprecation status, which goes beyond the annotations by explaining the operational impact of the alias.

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 two sentences long, with the deprecation warning and redirection front-loaded, and no filler. Every clause adds relevant information about the alias, behavior, and read-only safety.

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 output schema exists, annotations cover safety and idempotency, and the description covers alias behavior and parameter mapping, nothing essential is missing. The agent has full information to decide whether to call this tool or its replacement.

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 parameters are fully documented. The description adds value by mapping each filter to the original tool's parameters (query, location, remote_only), clarifying the alias relationship for the agent, which is especially helpful given the deprecated status.

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 it returns matched jobs filtered by title, location, and remote, and immediately identifies itself as a deprecated alias of aiapplyd_get_matches, distinguishing it from siblings. The verb 'returns' combined with the filter criteria makes the purpose specific and unambiguous.

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 instructs the agent to use aiapplyd_get_matches instead ('use aiapplyd_get_matches'), and clarifies the exact parameter mapping (query, location, remote_only), providing both a when-not-to-use directive and a direct alternative.

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

aiapplyd_set_resumeSet ResumeAInspect

Put the user's resume on their AI Applyd account as the base every application is tailored from. Pass exactly one: resume_text (the full text), resume_url (an https link to a PDF, DOCX or plain text file, up to 10 MB), or document_id (one of their saved resumes, from aiapplyd_get_account). A new upload is read by AI and uses the user's AI credits; switching to a saved resume with document_id is free. It also finishes account setup, so AI Applyd starts finding jobs for them. Use it when aiapplyd_get_account shows no resume on file, or when the user gives a new one. Do not use it to rewrite or score a resume; use aiapplyd_optimize_resume or aiapplyd_score_resume. Next: aiapplyd_get_matches.

ParametersJSON Schema
NameRequiredDescriptionDefault
resume_urlNoAn https link to the resume file: PDF, DOCX or plain text, up to 10 MB. Pass this OR resume_text OR document_id.
document_idNoOne of the user's saved resumes to make the base (an id from aiapplyd_get_account). Free. Pass this OR resume_text OR resume_url.
resume_textNoThe full text of the resume. Pass this OR resume_url OR document_id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
parsedYesFalse when the resume is still being read; call aiapplyd_get_account in a minute.
sourceYes
fullNameYes
documentIdYesThe resume now used as the base for every application.
skillsCountYes
currentJobTitleYes
preferencesSeededYesTrue when empty job preferences were filled from this resume.
suggestedJobTitlesYes
onboardingCompletedYesTrue when the account setup is finished, so AI Applyd searches for this user.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only indicate non-read-only, non-idempotent, and non-destructive behavior. The description adds meaningful behavioral context: a new upload consumes the user's AI credits, switching to a saved resume with document_id is free, and setting the resume also completes account setup and triggers job finding. This is valuable side-effect information beyond what the 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.

Conciseness5/5

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

The description is relatively long, but every sentence earns its place: purpose, parameter selection, side effects, use conditions, exclusions, and next step. It is front-loaded with the core purpose and structured logically, so an agent can quickly extract the essential behavior without wading through 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?

Given the tool's complexity and the presence of annotations and an output schema, the description covers everything an agent needs: what the tool does, how to choose a parameter, credit cost, account setup implications, when to use it, when not to use it, and the recommended next tool. There are no meaningful 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%, but the description still adds semantic value by clarifying that exactly one of the three parameters must be passed and by explaining the cost implication: uploading a new resume uses AI credits, while using document_id is free. This is genuinely useful guidance beyond the schema's field descriptions.

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 and resource: it puts the user's resume on their AI Applyd account as the base for tailoring applications. It also distinguishes itself from sibling tools by explicitly saying it should not be used to rewrite or score a resume, naming aiapplyd_optimize_resume and aiapplyd_score_resume as the correct alternatives.

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?

The description gives explicit conditions for use: when aiapplyd_get_account shows no resume on file, or when the user provides a new resume. It also states what not to use it for and directs the agent to specific sibling tools, making the selection decision unambiguous.

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

aiapplyd_translate_resumeTranslate ResumeAInspect

Translate the user's base resume, the one saved on their AI Applyd account, into another language (for example Spanish, French, German, Portuguese or Japanese), ready to send to employers in that market. Returns the new resume's title and a link; the translation is saved as a separate resume and the original stays unchanged. Needs a resume on file (see aiapplyd_set_resume) and uses the user's AI credits. Do not use it to tailor a resume to a job; use aiapplyd_optimize_resume, or aiapplyd_apply, which tailors every application.

ParametersJSON Schema
NameRequiredDescriptionDefault
target_languageYesTarget language (e.g. "Spanish", "French", "German", "Japanese")

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
sourceResumeIdYes
targetLanguageYes
translatedTitleYes
translatedResumeIdYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description explains important side effects and safety-related behavior: the translation is saved as a separate resume, the original stays unchanged, and the operation uses AI credits. It also states what the return value contains (new resume title and link), adding meaningful behavioral context beyond the raw 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?

The description is informative yet compact, front-loading the core purpose before adding return information, prerequisites, and exclusions. Every sentence earns its place, with no redundant or filler 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 tool with an output schema and annotations, the description covers the key operational context: prerequisite resume, credit usage, side effects, return value, and when to use a different tool. Nothing essential is missing for an agent to decide whether and how to invoke this tool correctly.

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 parameter target_language is already documented in the schema, so the baseline is 3. The description reinforces the parameter by giving example languages, but does not add substantial new semantics 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?

The description names the specific operation (translate the user's saved base resume) and the resource, and clearly distinguishes it from related tools like aiapplyd_optimize_resume and aiapplyd_apply. The purpose is unambiguous, and even the context of where the translation can be sent is included.

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?

The description explicitly states when to use this tool (translating an existing resume for another market) and when not to use it (tailoring a resume to a job), naming the alternatives aiapplyd_optimize_resume and aiapplyd_apply. It also notes the prerequisite of having a resume on file and that the operation consumes AI credits, giving an agent clear selection criteria.

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

aiapplyd_triage_matchesSave or Skip MatchesA
Idempotent
Inspect

Save or skip job matches: the answer to "want this one?". action "save" keeps matches in the user's saved list; action "skip" dismisses them so they stop showing, with an optional reason (not_interested, wrong_location, too_senior, too_junior, salary_too_low, wrong_role, company_mismatch, already_applied, other) that teaches the matcher. Pass up to 25 job_match_ids from aiapplyd_get_matches. Nothing is sent to any employer and nothing is spent. Do not use it to apply; use aiapplyd_apply. Next: aiapplyd_get_matches for the next matches.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes"save" keeps the matches in the saved list. "skip" dismisses them.
reasonNoFor skip: why, so the matcher learns (e.g. "too_senior").
job_match_idsYesJob match ids from aiapplyd_get_matches, 1 to 25 (e.g. [48213, 48214]).

Output Schema

ParametersJSON Schema
NameRequiredDescription
actionYes
resultsYes
attemptedYes
succeededYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, the description adds important behavioral details: skipping makes matches stop showing, saving adds them to the user's saved list, the reason teaches the matcher, and nothing is sent to any employer or costs anything. This gives the agent a clear model of real-world side effects beyond the structured hints.

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 compact and front-loaded: it leads with the core action, explains the parameters inline, and then covers safety, exclusions, and next steps. Every sentence earns its place with no filler or repetition.

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 tool with three parameters, two enums, and an output schema, the description is complete enough to guide correct invocation. It covers what the tool does, what inputs to pass, the optional reason, the no-external-effect guarantee, the explicit non-application use case, and the natural next step.

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 schema already covers all parameters with 100% coverage, but the description adds meaningful context by explaining that 'skip' dismisses matches so they stop showing, the reason 'teaches the matcher,' and that job_match_ids come from aiapplyd_get_matches with a max of 25. This is more than a restatement of 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 states a specific verb and resource: 'Save or skip job matches' and explains the two actions 'save' and 'skip' in concrete terms. It also explicitly distinguishes itself from aiapplyd_apply, so an agent can tell this tool apart from the most similar sibling.

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?

The description gives clear usage context: use this to save or skip matches, pass up to 25 IDs from aiapplyd_get_matches, and optionally provide a skip reason to teach the matcher. It explicitly says 'Do not use it to apply; use aiapplyd_apply' and points to aiapplyd_get_matches as the next step.

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

aiapplyd_update_job_preferencesUpdate Job PreferencesA
DestructiveIdempotent
Inspect

Set what AI Applyd hunts for on the user's behalf, and re-run discovery immediately: target roles, locations, remote, salary band and currency, seniority (experience_levels), work styles, job types, visa sponsorship need, industries to exclude, or pause matching. Pass description to say it in plain words ("remote only, 120k+, senior, no crypto"); fields passed explicitly win over it. Lists REPLACE what is saved, so pass the complete list, not an addition. application_answers saves the answers employer forms ask for (phone, city, state, zip, country, LinkedIn, work authorization, relocation, start date, notice period): fill only values the user stated, never guesses. Only call this when the user asks. Read the current preferences first with aiapplyd_get_account. Do not use it to search; use aiapplyd_get_matches with query.

ParametersJSON Schema
NameRequiredDescriptionDefault
pausedNoTrue pauses new matches for the user; false resumes them. It never changes auto-apply.
job_typesNoJob types to match: full_time, part_time, contract, internship, freelance, temporary. REPLACES the saved list.
locationsNoFull list of preferred locations. REPLACES the saved list.
salary_maxNoHighest yearly salary to target, in salary_currency.
salary_minNoLowest yearly salary the user accepts, in salary_currency (e.g. 120000).
descriptionNoWhat the user wants, in their own words (e.g. "remote only, 120k+, senior, no crypto"). Fields passed explicitly win over it. Uses AI credits.
remote_onlyNoDeprecated name of include_remote. Use include_remote.
work_stylesNoWork styles to match: onsite, hybrid, remote. REPLACES the saved list.
target_rolesNoFull list of job titles to hunt for. REPLACES the saved list.
include_remoteNoInclude remote jobs in the user's region alongside their locations.
salary_currencyNoCurrency of the salary band (default usd).
experience_levelsNoSeniority to match: entry, mid, senior, lead, executive. REPLACES the saved list.
exclude_industriesNoIndustries to never match (e.g. ["Crypto"]). REPLACES the saved list.
application_answersNoAnswers employer forms ask for, saved to the user's application profile: phone, city, state, zip_code, country, linkedin_url, work_authorization, willing_to_relocate, available_start_date, notice_period. Only values the user stated, never guesses.
needs_visa_sponsorshipNoTrue when the user needs visa sponsorship to take the job.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pausedYes
jobTypesYes
locationsYes
salaryMaxYes
salaryMinYes
workStylesYes
targetRolesYes
includeRemoteYes
salaryCurrencyYes
remoteWorldwideYes
visaSponsorshipYes
describedSummaryYesHow AI Applyd understood `description`, when one was given.
experienceLevelsYes
excludeIndustriesYes
onboardingCompletedYesTrue when this call finished the account setup, so AI Applyd starts searching for these roles.
applicationAnswersSavedYesThe application_answers fields written to the application profile.

TDQS

A4.9/5.0
Behavior5/5

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

Adds valuable side-effect context beyond annotations: 'Lists REPLACE what is saved, so pass the complete list, not an addition,' 're-run discovery immediately,' and 'fill only values the user stated, never guesses.' These details enrich the destructiveHint and idempotentHint annotations without contradicting them.

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?

Every sentence earns its place: purpose, immediate side effects, replacement semantics, application_answers caution, call condition, prerequisite, and sibling routing. The most critical behavioral caveats are front-loaded before secondary details.

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 15-parameter, nested-object mutation tool with full schema coverage and an output schema, the description covers call conditions, destructive replacement behavior, natural-language precedence, the application_answers safety rule, and exclusion of search usage. 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% and parameter descriptions already include key rules like 'REPLACES the saved list' and 'Fields passed explicitly win over it.' The main description adds useful aggregate guidance ('pass the complete list, not an addition') and the read-before-update prerequisite, but only modestly exceeds 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?

Description opens with a specific verb and resource ('Set what AI Applyd hunts for on the user's behalf') and enumerates the preference dimensions it updates. It also explicitly differentiates from siblings by saying 'Do not use it to search; use aiapplyd_get_matches with query.'

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 explicit invocation conditions: 'Only call this when the user asks,' a prerequisite ('Read the current preferences first with aiapplyd_get_account'), and a clear exclusion for search usage with the alternative tool named. This is strong when-to-use and when-not-to-use guidance.

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. 17 tool updatesv1.8.0
    • Changedaiapplyd_analyze_job_description2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "keywords": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "category": {
        +            "type": "string"
        +          },
        +          "importance": {
        +            "type": "number"
        +          },
        +          "mustHave": {
        +            "type": "boolean"
        +          },
        +          "term": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "term",
        +          "category",
        +          "importance",
        +          "mustHave"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "keywords"
        +  ],
        +  "type": "object"
        +}
    • Addedaiapplyd_apply
    • Changedaiapplyd_auto_apply2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "alreadyExisted": {
        +      "description": "True when this job already had an application, which is returned instead of a second one.",
        +      "type": "boolean"
        +    },
        +    "applicationId": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The application to follow with aiapplyd_get_applications. Null only when nothing was started."
        +    },
        +    "company": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "jobMatchId": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "jobTitle": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "jobUrl": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "outcome": {
        +      "description": "started: a new application; already_in_progress: this job already had one (alreadyExisted); not_confirmed: the user declined, nothing was sent.",
        +      "enum": [
        +        "started",
        +        "already_in_progress",
        +        "not_confirmed"
        +      ],
        +      "type": "string"
        +    },
        +    "preparationStatus": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "preparedUnderFreeWatch": {
        +      "type": "boolean"
        +    },
        +    "recordedMode": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "requestedMode": {
        +      "anyOf": [
        +        {
        +          "enum": [
        +            "auto_approve",
        +            "copilot"
        +          ],
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "status": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Our own record. Never proof the employer received it."
        +    },
        +    "trackingUrl": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "required": [
        +    "outcome",
        +    "applicationId",
        +    "jobMatchId",
        +    "jobTitle",
        +    "company",
        +    "jobUrl",
        +    "requestedMode",
        +    "recordedMode",
        +    "status",
        +    "preparationStatus",
        +    "preparedUnderFreeWatch",
        +    "alreadyExisted",
        +    "trackingUrl"
        +  ],
        +  "type": "object"
        +}
    • Changedaiapplyd_build_pdf2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "publicUrl": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "resumeBuildId": {
        +      "type": "number"
        +    },
        +    "template": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "resumeBuildId",
        +    "template",
        +    "url",
        +    "publicUrl"
        +  ],
        +  "type": "object"
        +}
    • Changedaiapplyd_generate_cover_letter6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / application_id
        Added value: +{
        +  "description": "Return the cover letter already written for this application (an id from aiapplyd_get_applications) instead of writing a new one.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedInput schema / properties / instructions
        Added value: +{
        +  "description": "With application_id: what to change in that letter, in the user's own words.",
        +  "maxLength": 2000,
        +  "type": "string"
        +}
      • changedInput schema / properties / job_description / description
        Previous value: -"Full text of the target job description"New value: +"Full text of the target job description. Pass with company_name, or pass application_id instead."
      • removedInput schema / required
        Removed value: -[
        -  "job_description",
        -  "company_name"
        -]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "applicationId": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "companyName": {
        +      "type": "string"
        +    },
        +    "coverLetter": {
        +      "type": "string"
        +    },
        +    "resumeBuildId": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "source": {
        +      "description": "generated: newly written; application: the letter already prepared for application_id; refined: that letter, changed as asked.",
        +      "enum": [
        +        "generated",
        +        "application",
        +        "refined"
        +      ],
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "coverLetter",
        +    "companyName",
        +    "source",
        +    "resumeBuildId",
        +    "applicationId",
        +    "url"
        +  ],
        +  "type": "object"
        +}
    • Changedaiapplyd_generate_interview_questions6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / application_id
        Added value: +{
        +  "description": "Prep for the job of this application (an id from aiapplyd_get_applications). Replaces job_title and company_name.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedInput schema / properties / company_name / description
        Previous value: -"Name of the company"New value: +"Name of the company. Pass with job_title, or pass application_id instead."
      • changedInput schema / properties / job_title / description
        Previous value: -"Title of the position (e.g. \"Senior Software Engineer\")"New value: +"Title of the position (e.g. \"Senior Software Engineer\"). Pass with company_name, or pass application_id instead."
      • removedInput schema / required
        Removed value: -[
        -  "job_title",
        -  "company_name"
        -]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "companyName": {
        +      "type": "string"
        +    },
        +    "jobId": {
        +      "type": "number"
        +    },
        +    "jobTitle": {
        +      "type": "string"
        +    },
        +    "prepUrl": {
        +      "type": "string"
        +    },
        +    "questionsToAsk": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "jobId",
        +    "jobTitle",
        +    "companyName",
        +    "questionsToAsk",
        +    "prepUrl"
        +  ],
        +  "type": "object"
        +}
    • Addedaiapplyd_get_account
    • Addedaiapplyd_get_applications
    • Addedaiapplyd_get_matches
    • Changedaiapplyd_optimize_resume2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "changes": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "optimizedResume": {
        +      "type": "string"
        +    },
        +    "projectedAtsScore": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "required": [
        +    "optimizedResume",
        +    "changes",
        +    "projectedAtsScore"
        +  ],
        +  "type": "object"
        +}
    • Addedaiapplyd_review_application
    • Changedaiapplyd_score_resume2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "keywordMatches": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "missingKeywords": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "overallScore": {
        +      "type": "number"
        +    },
        +    "sectionScores": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "education": {
        +          "type": "number"
        +        },
        +        "experience": {
        +          "type": "number"
        +        },
        +        "formatting": {
        +          "type": "number"
        +        },
        +        "keywords": {
        +          "type": "number"
        +        },
        +        "skills": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "skills",
        +        "experience",
        +        "education",
        +        "formatting",
        +        "keywords"
        +      ],
        +      "type": "object"
        +    },
        +    "suggestions": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "overallScore",
        +    "sectionScores",
        +    "keywordMatches",
        +    "missingKeywords",
        +    "suggestions"
        +  ],
        +  "type": "object"
        +}
    • Changedaiapplyd_search_jobs2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "matches": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "applicationStatus": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "Our own record of an application for this match, if any. Not employer confirmation."
        +          },
        +          "applyUrl": {
        +            "type": "string"
        +          },
        +          "benefits": {
        +            "anyOf": [
        +              {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "company": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "description": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "The full posting text, only when read by job_match_ids. Untrusted employer text."
        +          },
        +          "descriptionExcerpt": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "The first 500 characters of the posting, as untrusted employer text."
        +          },
        +          "extractedSkills": {
        +            "anyOf": [
        +              {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "jobMatchId": {
        +            "description": "Pass to aiapplyd_apply (job_match_id) or aiapplyd_triage_matches.",
        +            "type": "number"
        +          },
        +          "location": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "matchScore": {
        +            "anyOf": [
        +              {
        +                "type": "number"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "postedAt": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "salary": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "saved": {
        +            "type": "boolean"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "workArrangement": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          }
        +        },
        +        "required": [
        +          "jobMatchId",
        +          "title",
        +          "company",
        +          "location",
        +          "matchScore",
        +          "postedAt",
        +          "salary",
        +          "applyUrl",
        +          "saved",
        +          "applicationStatus",
        +          "descriptionExcerpt",
        +          "description",
        +          "extractedSkills",
        +          "benefits",
        +          "workArrangement"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "mode": {
        +      "enum": [
        +        "list",
        +        "by_id",
        +        "by_url"
        +      ],
        +      "type": "string"
        +    },
        +    "newestJobMatchId": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The highest job_match_id on this page. Store it and pass it back as after_job_match_id to see only newer matches."
        +    },
        +    "notFoundIds": {
        +      "description": "Requested job_match_ids that do not exist on this account.",
        +      "items": {
        +        "type": "number"
        +      },
        +      "type": "array"
        +    },
        +    "page": {
        +      "type": "number"
        +    },
        +    "posting": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "company": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "description": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "location": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "salary": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "title": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "url": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "url",
        +            "title",
        +            "company",
        +            "location",
        +            "salary",
        +            "description"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "A posting read from job_url. Nothing was saved."
        +    },
        +    "totalMatches": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "totalPages": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "mode",
        +    "matches",
        +    "page",
        +    "totalPages",
        +    "totalMatches",
        +    "newestJobMatchId",
        +    "notFoundIds",
        +    "posting"
        +  ],
        +  "type": "object"
        +}
    • Addedaiapplyd_set_resume
    • Changedaiapplyd_translate_resume2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "sourceResumeId": {
        +      "type": "number"
        +    },
        +    "targetLanguage": {
        +      "type": "string"
        +    },
        +    "translatedResumeId": {
        +      "type": "number"
        +    },
        +    "translatedTitle": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "targetLanguage",
        +    "sourceResumeId",
        +    "translatedResumeId",
        +    "translatedTitle",
        +    "url"
        +  ],
        +  "type": "object"
        +}
    • Addedaiapplyd_triage_matches
    • Changedaiapplyd_update_job_preferences15 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / application_answers
        Added value: +{
        +  "description": "Answers employer forms ask for, saved to the user's application profile: phone, city, state, zip_code, country, linkedin_url, work_authorization, willing_to_relocate, available_start_date, notice_period. Only values the user stated, never guesses.",
        +  "properties": {
        +    "available_start_date": {
        +      "type": "string"
        +    },
        +    "city": {
        +      "type": "string"
        +    },
        +    "country": {
        +      "type": "string"
        +    },
        +    "linkedin_url": {
        +      "type": "string"
        +    },
        +    "notice_period": {
        +      "enum": [
        +        "immediately",
        +        "two_weeks",
        +        "one_month",
        +        "two_months",
        +        "three_months",
        +        "flexible"
        +      ],
        +      "type": "string"
        +    },
        +    "phone": {
        +      "type": "string"
        +    },
        +    "state": {
        +      "type": "string"
        +    },
        +    "willing_to_relocate": {
        +      "type": "boolean"
        +    },
        +    "work_authorization": {
        +      "enum": [
        +        "us_citizen",
        +        "permanent_resident",
        +        "visa_holder",
        +        "require_sponsorship",
        +        "other"
        +      ],
        +      "type": "string"
        +    },
        +    "zip_code": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / description
        Added value: +{
        +  "description": "What the user wants, in their own words (e.g. \"remote only, 120k+, senior, no crypto\"). Fields passed explicitly win over it. Uses AI credits.",
        +  "maxLength": 2000,
        +  "type": "string"
        +}
      • addedInput schema / properties / exclude_industries
        Added value: +{
        +  "description": "Industries to never match (e.g. [\"Crypto\"]). REPLACES the saved list.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / experience_levels
        Added value: +{
        +  "description": "Seniority to match: entry, mid, senior, lead, executive. REPLACES the saved list.",
        +  "items": {
        +    "enum": [
        +      "entry",
        +      "mid",
        +      "senior",
        +      "lead",
        +      "executive"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / include_remote
        Added value: +{
        +  "description": "Include remote jobs in the user's region alongside their locations.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / job_types
        Added value: +{
        +  "description": "Job types to match: full_time, part_time, contract, internship, freelance, temporary. REPLACES the saved list.",
        +  "items": {
        +    "enum": [
        +      "full_time",
        +      "part_time",
        +      "contract",
        +      "internship",
        +      "freelance",
        +      "temporary"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / needs_visa_sponsorship
        Added value: +{
        +  "description": "True when the user needs visa sponsorship to take the job.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / paused
        Added value: +{
        +  "description": "True pauses new matches for the user; false resumes them. It never changes auto-apply.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / remote_only / description
        Previous value: -"Whether to include remote-friendly positions"New value: +"Deprecated name of include_remote. Use include_remote."
      • addedInput schema / properties / salary_currency
        Added value: +{
        +  "description": "Currency of the salary band (default usd).",
        +  "enum": [
        +    "usd",
        +    "eur",
        +    "gbp",
        +    "cad",
        +    "aud",
        +    "inr"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / salary_max
        Added value: +{
        +  "description": "Highest yearly salary to target, in salary_currency.",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / salary_min
        Added value: +{
        +  "description": "Lowest yearly salary the user accepts, in salary_currency (e.g. 120000).",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / work_styles
        Added value: +{
        +  "description": "Work styles to match: onsite, hybrid, remote. REPLACES the saved list.",
        +  "items": {
        +    "enum": [
        +      "onsite",
        +      "hybrid",
        +      "remote"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "applicationAnswersSaved": {
        +      "description": "The application_answers fields written to the application profile.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "describedSummary": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "How AI Applyd understood `description`, when one was given."
        +    },
        +    "excludeIndustries": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "experienceLevels": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "includeRemote": {
        +      "anyOf": [
        +        {
        +          "type": "boolean"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "jobTypes": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "locations": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "onboardingCompleted": {
        +      "description": "True when this call finished the account setup, so AI Applyd starts searching for these roles.",
        +      "type": "boolean"
        +    },
        +    "paused": {
        +      "anyOf": [
        +        {
        +          "type": "boolean"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "remoteWorldwide": {
        +      "type": "boolean"
        +    },
        +    "salaryCurrency": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "salaryMax": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "salaryMin": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "targetRoles": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "visaSponsorship": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "workStyles": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "required": [
        +    "targetRoles",
        +    "locations",
        +    "includeRemote",
        +    "remoteWorldwide",
        +    "salaryMin",
        +    "salaryMax",
        +    "salaryCurrency",
        +    "experienceLevels",
        +    "workStyles",
        +    "jobTypes",
        +    "visaSponsorship",
        +    "excludeIndustries",
        +    "paused",
        +    "applicationAnswersSaved",
        +    "describedSummary",
        +    "onboardingCompleted"
        +  ],
        +  "type": "object"
        +}
  2. 10 tool updatesv1.3.0
    • First observedaiapplyd_analyze_job_description
    • First observedaiapplyd_auto_apply
    • First observedaiapplyd_build_pdf
    • First observedaiapplyd_generate_cover_letter
    • First observedaiapplyd_generate_interview_questions
    • First observedaiapplyd_optimize_resume
    • First observedaiapplyd_score_resume
    • First observedaiapplyd_search_jobs
    • First observedaiapplyd_translate_resume
    • First observedaiapplyd_update_job_preferences

TDQS

A4.6/5.0

Scored across 17 tools

Disambiguation4/5

All tools have clearly distinct roles (matching, applying, tracking, reviewing, resume management, etc.), and any potential overlap is mitigated by explicit descriptions. The two deprecated aliases (search_jobs, auto_apply) are marked as such, so they do not introduce real ambiguity.

Naming Consistency5/5

Every tool follows the aiapplyd_ prefix with a verb_noun pattern (e.g., get_matches, set_resume, generate_cover_letter). The deprecated aliases deviate slightly but are explicitly labeled, so the overall pattern remains consistent.

Tool Count4/5

17 tools is slightly above the ideal 3-15 range but appropriate for a comprehensive job application assistant covering discovery, application, tracking, and AI-driven resume tools. The count is inflated by deprecated aliases, which are clearly marked and do not add new capabilities.

Completeness5/5

The tool surface covers the full job application lifecycle: matching, triage, application, tracking, review, resume management (set, score, optimize, translate, build PDF), job description analysis, interview prep, and preference updates. No critical gaps exist; even deprecated aliases are unnecessary but harmless.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    A privacy-first MCP server for locally managing job, fellowship, and graduate-school applications. It offers tools for tracking application status, analyzing role fit, generating LaTeX CV/cover letters, interview prep, and discovering public jobs from ATS APIs.
    8
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    This server enables remote job discovery, tailored CV creation, and approval-gated application lifecycle management. It prioritizes safe, factual job applications without authenticated LinkedIn scraping or silent submissions.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Automates cover letter generation and application question answering from job postings via local AI agents. Manages candidate profile and AI humanization rules to produce tailored, humanized application materials.
    -