AI Applyd
AI Applyd is an MCP server that automates the whole job search: it finds matching roles, tailors and submits applications on employer ATS platforms, tracks them to the employer's own confirmation, and prepares you for interviews — all from a chat or bot.
Get job matches (
aiapplyd_get_matches): list matched roles with scores, filter/save/skip, read full postings or any job URL.Apply to jobs (
aiapplyd_apply): auto-submit or hold for review on 15+ ATS platforms (Workday, Greenhouse, Lever, etc.), with tailored resume, cover letter, and screening answers.Track applications (
aiapplyd_get_applications): see status, review queue, and employer confirmation (receipt/screenshot) — not just submit clicks.Approve/reject/cancel (
aiapplyd_review_application): approve up to 25 waiting applications, reject, cancel queued, refine documents, re-prepare, or record interview stage.Manage account and preferences (
aiapplyd_get_account,aiapplyd_update_job_preferences): check plan/tokens/applications left, set target roles, locations, salary, remote, visa needs, and saved application form answers.Set resume (
aiapplyd_set_resume): upload or select base resume to power all tailoring.Resume & document tools: score for ATS (
aiapplyd_score_resume), analyze job descriptions (aiapplyd_analyze_job_description), optimize resume (aiapplyd_optimize_resume), generate cover letters (aiapplyd_generate_cover_letter), translate resume (aiapplyd_translate_resume), and build PDF (aiapplyd_build_pdf).Interview prep (
aiapplyd_generate_interview_questions): questions, STAR scenarios, talking points, negotiation prep.Legacy aliases:
aiapplyd_search_jobsandaiapplyd_auto_applyfor older clients.Read-only and safe: introspection (tools/list, prompts, resources) is open; all actual operations require OAuth login and spend the user's own credits/applications.
Enables automated job applications to Greenhouse, including resume optimization and direct submission to job postings.
Enables automated job applications to Personio, including resume optimization and direct submission to job postings.
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.
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:
AI Applyd is a hosted remote MCP server. Point your client at one URL:
https://mcp.aiapplyd.com/mcpThe 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 |
|
Remote MCP server URL |
|
In Claude Code, one line does it:
claude mcp add --transport http aiapplyd https://mcp.aiapplyd.com/mcpCursor
~/.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 |
You want your job matches, want to save or skip one, or want to change what it looks for | |
You want to apply, or you paste a job link and say "apply" | |
You want to see what is waiting for you, change it, and send it | |
You paste a job description and want the resume, cover letter or interview prep for it | |
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@aiapplydClaude Code:
claude plugin marketplace add aiapplyd/aiapplyd-mcp
claude plugin install aiapplyd@aiapplydCodex (CLI, IDE extension and the ChatGPT desktop app)
codex mcp add aiapplyd --url https://mcp.aiapplyd.com/mcp
codex mcp login aiapplydThe 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-mcpOr 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-mcpOr 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 |
|
| Endpoint to relay to. Point it at |
| 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 |
|
|
Preview |
|
|
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 |
| Get Job Matches | read-only, idempotent | Your matched jobs, best first, each with the |
| Apply to Job | destructive, open-world | Apply to one job by |
| Get Applications | read-only, idempotent | Every application and where it stands, the review queue, and the employer's own confirmation when it exists |
| 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 |
| 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 |
| 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 |
| Save or Skip Matches | writes, idempotent | Save a match, or skip it with a reason, so a job you declined stops coming back |
| 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 |
| 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 |
| Analyze Job Description | writes, open-world | What a posting screens on, in its own language, so the resume can mirror it |
| Optimize Resume with AI | writes, open-world | A resume rewritten to pass ATS screening and still reach a human reader |
| Generate Interview Questions | writes, open-world | The questions this role is asked, with answer guidance, STAR scenarios and negotiation prep |
| Translate Resume | writes, open-world | A send-ready resume in another language, formatted for that market |
| Generate Cover Letter | writes, open-world | A cover letter in your own voice, written from the resume on your account |
| 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 |
| Search Jobs | read-only, idempotent | Older name for |
| Auto Apply to Job | destructive, open-world | Older name for |
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_applyand an approve inaiapplyd_review_applicationsubmit a real application to a real employer, under your name.modecovers 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_applicationsreportsemployerConfirmedfrom that evidence alone, never from a submit click.aiapplyd_get_matchesnever writes. To change what AI Applyd hunts for, callaiapplyd_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 | Scores a resume against a posting and returns the three changes that move it past the filter |
| Prepare for an Interview | Prepares the questions this company asks for this role, with structured answers ready |
| Apply to My Matches | Shows your best matches, then applies to the ones you pick, each held for your approval |
| Find Jobs Like This | The strongest matches for a target role, ranked by fit |
Resources
Resource | URI | Contents |
|
| Canonical guide to passing Applicant Tracking Systems in 2026. Covers keyword matching, formatting rules, section order, and common rejection reasons. |
|
| Reference frameworks for structuring interview answers: STAR, CARL, SOAR, and PAR. |
|
| 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_idinstead of registering (client_id_metadata_document_supported: true)The
issparameter 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
Email: admin@aiapplyd.com
Follow AI Applyd
Website: aiapplyd.com
Pricing: aiapplyd.com/pricing
Blog: aiapplyd.com/blog
X: @aiapplydHQ
LinkedIn: AI Applyd
YouTube: @aiapplyd
TikTok: @aiapplydhq
Instagram: @aiapplyd
Discord: join the community
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
AI Applyd - auto-apply that ends on an interview
How the MCP server works - setup for Claude, ChatGPT and Cursor
Pricing - free to start, no card
Blog - how hiring systems actually screen you
FAQ - resume parsing, ATS behaviour, what "application received" means
Compare - AI Applyd against the other job-application tools
Four things that cost us money while automating job applications - engineering write-up
Built by AI Applyd. Questions: ava@aiapplyd.com
Available Tools
17 toolsaiapplyd_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.
| Name | Required | Description | Default |
|---|---|---|---|
| job_description | Yes | Full text of the job description |
Output Schema
| Name | Required | Description |
|---|---|---|
| keywords | Yes |
TDQS
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.
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.
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.
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.
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.
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 JobADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | "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_url | No | URL of any job posting to apply to (e.g. "https://boards.greenhouse.io/acme/jobs/123"). Pass this OR job_match_id. | |
| job_match_id | No | The job_match_id of a match from aiapplyd_get_matches (e.g. 48213). Pass this OR job_url. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobUrl | Yes | |
| status | Yes | Our own record. Never proof the employer received it. |
| company | Yes | |
| outcome | Yes | started: a new application; already_in_progress: this job already had one (alreadyExisted); not_confirmed: the user declined, nothing was sent. |
| jobTitle | Yes | |
| jobMatchId | Yes | |
| trackingUrl | Yes | |
| recordedMode | Yes | |
| applicationId | Yes | The application to follow with aiapplyd_get_applications. Null only when nothing was started. |
| requestedMode | Yes | |
| alreadyExisted | Yes | True when this job already had an application, which is returned instead of a second one. |
| preparationStatus | Yes | |
| preparedUnderFreeWatch | Yes |
TDQS
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.
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.
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.
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.
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.
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 JobADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| job_url | Yes | URL of the job posting to apply to |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobUrl | Yes | |
| status | Yes | Our own record. Never proof the employer received it. |
| company | Yes | |
| outcome | Yes | started: a new application; already_in_progress: this job already had one (alreadyExisted); not_confirmed: the user declined, nothing was sent. |
| jobTitle | Yes | |
| jobMatchId | Yes | |
| trackingUrl | Yes | |
| recordedMode | Yes | |
| applicationId | Yes | The application to follow with aiapplyd_get_applications. Null only when nothing was started. |
| requestedMode | Yes | |
| alreadyExisted | Yes | True when this job already had an application, which is returned instead of a second one. |
| preparationStatus | Yes | |
| preparedUnderFreeWatch | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| template | No | Resume template style (default: classic) | |
| make_public | No | Publish 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_text | Yes | Full text of the resume |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| template | Yes | |
| publicUrl | Yes | |
| resumeBuildId | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| company_name | No | Name of the company you are applying to | |
| instructions | No | With application_id: what to change in that letter, in the user's own words. | |
| application_id | No | Return the cover letter already written for this application (an id from aiapplyd_get_applications) instead of writing a new one. | |
| job_description | No | Full text of the target job description. Pass with company_name, or pass application_id instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| source | Yes | generated: newly written; application: the letter already prepared for application_id; refined: that letter, changed as asked. |
| companyName | Yes | |
| coverLetter | Yes | |
| applicationId | Yes | |
| resumeBuildId | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| job_title | No | Title of the position (e.g. "Senior Software Engineer"). Pass with company_name, or pass application_id instead. | |
| company_name | No | Name of the company. Pass with job_title, or pass application_id instead. | |
| application_id | No | Prep for the job of this application (an id from aiapplyd_get_applications). Replaces job_title and company_name. | |
| job_description | No | Full text of the job description (optional but recommended for better results) |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | Yes | |
| prepUrl | Yes | |
| jobTitle | Yes | |
| companyName | Yes | |
| questionsToAsk | Yes |
TDQS
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.
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.
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.
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.
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.
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 AccountARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | Yes | |
| resumes | Yes | |
| autopilot | Yes | Whether AI Applyd applies on its own. Read only. |
| readiness | Yes | |
| billingUrl | Yes | |
| preferences | Yes | |
| applications | Yes | |
| tokenBalance | Yes | |
| defaultApplyMode | Yes | What aiapplyd_apply does when mode is omitted. Read only. |
| freeApplications | Yes |
TDQS
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.
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.
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.
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.
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.
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 ApplicationsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, starting at 1 (e.g. 2 for the next page) | |
| status | No | Filter the list: waiting_for_review (the review queue), queued_to_apply, submitted, verified, not_landed or taken_down. Omit for all. | |
| application_id | No | Read one application by its id (e.g. 1550). Omit to list applications. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| detail | Yes | Filled when one application_id was read: what will be or was sent. |
| totalPages | Yes | |
| applications | Yes | |
| totalApplications | Yes |
TDQS
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.
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.
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.
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.
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.
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 MatchesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, starting at 1 (e.g. 2 for the next page) | |
| limit | No | Matches per page, 1 to 50 (default 10) | |
| query | No | Narrow the list to titles containing this text (e.g. "Product Designer"). | |
| job_url | No | Read any job posting by URL without saving it (e.g. "https://jobs.lever.co/acme/123"). | |
| location | No | Preferred location (e.g. "San Francisco, CA", "New York", "Remote") | |
| saved_only | No | If true, only return the matches the user saved | |
| remote_only | No | If true, only show remote-friendly positions | |
| job_match_ids | No | Read 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_id | No | Return only matches newer than this job_match_id. Store newestJobMatchId from each answer and pass it back. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| page | Yes | |
| matches | Yes | |
| posting | Yes | A posting read from job_url. Nothing was saved. |
| totalPages | Yes | |
| notFoundIds | Yes | Requested job_match_ids that do not exist on this account. |
| totalMatches | Yes | |
| newestJobMatchId | Yes | The highest job_match_id on this page. Store it and pass it back as after_job_match_id to see only newer matches. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| resume_text | Yes | Full text of the resume to optimize | |
| job_description | No | Full text of the target job description (optional, omit for general ATS optimization) |
Output Schema
| Name | Required | Description |
|---|---|---|
| changes | Yes | |
| optimizedResume | Yes | |
| projectedAtsScore | Yes |
TDQS
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.
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.
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.
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.
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.
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 ApplicationsADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| stage | No | For set_stage: applied, callback, phone_screen, interview, offered, rejected or no_response. | |
| steps | No | For re_prepare: the steps to run again. Omit to run every step that is out of date. | |
| decision | Yes | "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). | |
| instructions | No | For refine: what to change, in the user's own words (up to 2,000 characters). | |
| document_type | No | For refine: "resume" or "cover_letter". | |
| application_ids | Yes | Application ids to act on, 1 to 25 (e.g. [1550, 1551]), from aiapplyd_get_applications |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | |
| decision | Yes | |
| attempted | Yes | |
| succeeded | Yes | |
| notConfirmed | Yes | True when the user declined the confirmation prompt and nothing was sent. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| resume_text | Yes | Full text of the resume | |
| job_description | No | Full text of the job description (optional, omit for a general ATS readiness score) |
Output Schema
| Name | Required | Description |
|---|---|---|
| suggestions | Yes | |
| overallScore | Yes | |
| sectionScores | Yes | |
| keywordMatches | Yes | |
| missingKeywords | Yes |
TDQS
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.
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.
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.
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.
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.
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 JobsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| location | No | Preferred location (e.g. "San Francisco, CA", "New York", "Remote") | |
| job_title | Yes | Job title to search for (e.g. "Software Engineer", "Product Manager") | |
| remote_only | No | If true, only show remote-friendly positions |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| page | Yes | |
| matches | Yes | |
| posting | Yes | A posting read from job_url. Nothing was saved. |
| totalPages | Yes | |
| notFoundIds | Yes | Requested job_match_ids that do not exist on this account. |
| totalMatches | Yes | |
| newestJobMatchId | Yes | The highest job_match_id on this page. Store it and pass it back as after_job_match_id to see only newer matches. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| resume_url | No | An https link to the resume file: PDF, DOCX or plain text, up to 10 MB. Pass this OR resume_text OR document_id. | |
| document_id | No | One 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_text | No | The full text of the resume. Pass this OR resume_url OR document_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| parsed | Yes | False when the resume is still being read; call aiapplyd_get_account in a minute. |
| source | Yes | |
| fullName | Yes | |
| documentId | Yes | The resume now used as the base for every application. |
| skillsCount | Yes | |
| currentJobTitle | Yes | |
| preferencesSeeded | Yes | True when empty job preferences were filled from this resume. |
| suggestedJobTitles | Yes | |
| onboardingCompleted | Yes | True when the account setup is finished, so AI Applyd searches for this user. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| target_language | Yes | Target language (e.g. "Spanish", "French", "German", "Japanese") |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| sourceResumeId | Yes | |
| targetLanguage | Yes | |
| translatedTitle | Yes | |
| translatedResumeId | Yes |
TDQS
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.
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.
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.
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.
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.
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 MatchesAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | "save" keeps the matches in the saved list. "skip" dismisses them. | |
| reason | No | For skip: why, so the matcher learns (e.g. "too_senior"). | |
| job_match_ids | Yes | Job match ids from aiapplyd_get_matches, 1 to 25 (e.g. [48213, 48214]). |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes | |
| results | Yes | |
| attempted | Yes | |
| succeeded | Yes |
TDQS
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.
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.
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.
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.
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.
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 PreferencesADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| paused | No | True pauses new matches for the user; false resumes them. It never changes auto-apply. | |
| job_types | No | Job types to match: full_time, part_time, contract, internship, freelance, temporary. REPLACES the saved list. | |
| locations | No | Full list of preferred locations. REPLACES the saved list. | |
| salary_max | No | Highest yearly salary to target, in salary_currency. | |
| salary_min | No | Lowest yearly salary the user accepts, in salary_currency (e.g. 120000). | |
| description | No | 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. | |
| remote_only | No | Deprecated name of include_remote. Use include_remote. | |
| work_styles | No | Work styles to match: onsite, hybrid, remote. REPLACES the saved list. | |
| target_roles | No | Full list of job titles to hunt for. REPLACES the saved list. | |
| include_remote | No | Include remote jobs in the user's region alongside their locations. | |
| salary_currency | No | Currency of the salary band (default usd). | |
| experience_levels | No | Seniority to match: entry, mid, senior, lead, executive. REPLACES the saved list. | |
| exclude_industries | No | Industries to never match (e.g. ["Crypto"]). REPLACES the saved list. | |
| application_answers | No | 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. | |
| needs_visa_sponsorship | No | True when the user needs visa sponsorship to take the job. |
Output Schema
| Name | Required | Description |
|---|---|---|
| paused | Yes | |
| jobTypes | Yes | |
| locations | Yes | |
| salaryMax | Yes | |
| salaryMin | Yes | |
| workStyles | Yes | |
| targetRoles | Yes | |
| includeRemote | Yes | |
| salaryCurrency | Yes | |
| remoteWorldwide | Yes | |
| visaSponsorship | Yes | |
| describedSummary | Yes | How AI Applyd understood `description`, when one was given. |
| experienceLevels | Yes | |
| excludeIndustries | Yes | |
| onboardingCompleted | Yes | True when this call finished the account setup, so AI Applyd starts searching for these roles. |
| applicationAnswersSaved | Yes | The application_answers fields written to the application profile. |
TDQS
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.
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.
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.
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.
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.
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.
17 tool updates
v1.8.0- Changed
aiapplyd_analyze_job_description2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output 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" +}
- Added
aiapplyd_apply - Changed
aiapplyd_auto_apply2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output 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" +}
- Changed
aiapplyd_build_pdf2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output 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" +}
- Changed
aiapplyd_generate_cover_letter6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / application_idAdded 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" +} - added
Input schema / properties / instructionsAdded value: +{ + "description": "With application_id: what to change in that letter, in the user's own words.", + "maxLength": 2000, + "type": "string" +} - changed
Input schema / properties / job_description / descriptionPrevious 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." - removed
Input schema / requiredRemoved value: -[ - "job_description", - "company_name" -] - changed
Output 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" +}
- Changed
aiapplyd_generate_interview_questions6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / application_idAdded 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" +} - changed
Input schema / properties / company_name / descriptionPrevious value: -"Name of the company"New value: +"Name of the company. Pass with job_title, or pass application_id instead." - changed
Input schema / properties / job_title / descriptionPrevious 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." - removed
Input schema / requiredRemoved value: -[ - "job_title", - "company_name" -] - changed
Output 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" +}
- Added
aiapplyd_get_account - Added
aiapplyd_get_applications - Added
aiapplyd_get_matches - Changed
aiapplyd_optimize_resume2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output 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" +}
- Added
aiapplyd_review_application - Changed
aiapplyd_score_resume2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output 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" +}
- Changed
aiapplyd_search_jobs2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output 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" +}
- Added
aiapplyd_set_resume - Changed
aiapplyd_translate_resume2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output 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" +}
- Added
aiapplyd_triage_matches - Changed
aiapplyd_update_job_preferences15 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / application_answersAdded 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" +} - added
Input schema / properties / descriptionAdded 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" +} - added
Input schema / properties / exclude_industriesAdded value: +{ + "description": "Industries to never match (e.g. [\"Crypto\"]). REPLACES the saved list.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / experience_levelsAdded 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" +} - added
Input schema / properties / include_remoteAdded value: +{ + "description": "Include remote jobs in the user's region alongside their locations.", + "type": "boolean" +} - added
Input schema / properties / job_typesAdded 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" +} - added
Input schema / properties / needs_visa_sponsorshipAdded value: +{ + "description": "True when the user needs visa sponsorship to take the job.", + "type": "boolean" +} - added
Input schema / properties / pausedAdded value: +{ + "description": "True pauses new matches for the user; false resumes them. It never changes auto-apply.", + "type": "boolean" +} - changed
Input schema / properties / remote_only / descriptionPrevious value: -"Whether to include remote-friendly positions"New value: +"Deprecated name of include_remote. Use include_remote." - added
Input schema / properties / salary_currencyAdded value: +{ + "description": "Currency of the salary band (default usd).", + "enum": [ + "usd", + "eur", + "gbp", + "cad", + "aud", + "inr" + ], + "type": "string" +} - added
Input schema / properties / salary_maxAdded value: +{ + "description": "Highest yearly salary to target, in salary_currency.", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / salary_minAdded value: +{ + "description": "Lowest yearly salary the user accepts, in salary_currency (e.g. 120000).", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / work_stylesAdded value: +{ + "description": "Work styles to match: onsite, hybrid, remote. REPLACES the saved list.", + "items": { + "enum": [ + "onsite", + "hybrid", + "remote" + ], + "type": "string" + }, + "type": "array" +} - changed
Output 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" +}
10 tool updates
v1.3.0- First observed
aiapplyd_analyze_job_description - First observed
aiapplyd_auto_apply - First observed
aiapplyd_build_pdf - First observed
aiapplyd_generate_cover_letter - First observed
aiapplyd_generate_interview_questions - First observed
aiapplyd_optimize_resume - First observed
aiapplyd_score_resume - First observed
aiapplyd_search_jobs - First observed
aiapplyd_translate_resume - First observed
aiapplyd_update_job_preferences
TDQS
Scored across 17 tools
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.
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.
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.
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
Related MCP Connectors
Honest resume/cover tailor for agents. Free generate; Stripe unlock for downloads. Streamable HTTP.
Auto-apply to jobs: matches your CV, tailors a fresh CV per posting, and applies for you.
Tailored, graded job applications: a CV, cover letter and form answers built per vacancy.
Analyze job listings against your resume, track applications, and generate cover letters.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn intelligent, zero-cost MCP server that securely parses local resumes and compares them against live job postings for ATS scoring, skill gap analysis, and interview prep.MIT
- AlicenseAqualityCmaintenanceA 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.81MIT
- FlicenseNot gradedqualityCmaintenanceThis 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.-
- FlicenseNot gradedqualityCmaintenanceAutomates 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.-