AI Applyd
Server Details
Auto-Apply That Ends on an Interview. Job matches, applications sent on the employer's own hiring system, employer-receipt tracking, per-role resumes, cover letters, interview prep.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- aiapplyd/aiapplyd-mcp
- GitHub Stars
- 2
- Server Listing
- AI Applyd
TDQS
Scored across 17 tools
Most tools target a distinct step of the job-application lifecycle (discover, score, optimize, apply, review, prep), and descriptions explicitly cross-reference each other to steer selection. The two deprecated aliases (aiapplyd_auto_apply, aiapplyd_search_jobs) duplicate aiapplyd_apply and aiapplyd_get_matches, and the score/optimize/analyze trio is only separated by carefully worded distinctions, so a little ambiguity remains.
Every tool follows the same aiapplyd_verb_noun convention (get_matches, set_resume, triage_matches, update_job_preferences), including the deprecated aliases. No mixing of camelCase or verb styles.
17 tools for a full apply-and-track workflow is reasonable, and each covers a real stage. Two of them are deprecated aliases that could be removed, making the set slightly heavier than necessary.
The surface covers the whole lifecycle: preferences, matching, resume ingestion/scoring/optimizing/building/translating, cover letters, applying, application review and tracking, and interview prep. Minor gaps exist around managing or deleting saved documents and resubmitting withdrawn applications, but these are workable.
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: intern, entry, junior, 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?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=true, idempotentHint=true) by explaining the actual destructive mechanism: 'Lists REPLACE what is saved, so pass the complete list, not an addition.' It also discloses cost ('Uses AI credits'), the scope limit of paused ('never changes auto-apply'), and a data-integrity rule for application_answers ('only values the user stated, never guesses').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and followed by the highest-risk behavior (list replacement) and prerequisites; every sentence carries an operational fact. It is dense and long (one sprawling paragraph) but not padded, which is acceptable for a 15-parameter mutation tool.
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 15 parameters, a nested object, an output schema, and full schema description coverage, the description supplies exactly the missing layer: replace-vs-append semantics, precedence between plain language and explicit fields, credit cost, and read-before-write ordering. Nothing an agent needs to invoke it safely is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine cross-field semantics the schema cannot express: the free-text `description` field is parsed and 'fields passed explicitly win over it,' and application_answers is scoped to employer-form data with a no-guessing rule. It does not, however, clarify the deprecated `remote_only` vs `include_remote` relationship beyond what the schema says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set what AI Applyd hunts for on the user's behalf') and enumerates the exact knobs it controls (roles, locations, remote, salary band/currency, seniority, work styles, job types, visa, excluded industries, pause). It explicitly distinguishes itself from siblings by naming aiapplyd_get_account for reads and aiapplyd_get_matches for searching, so an agent can place it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Only call this when the user asks'), a required prerequisite ('Read the current preferences first with aiapplyd_get_account'), and a named anti-pattern ('Do not use it to search; use aiapplyd_get_matches with query'). The alternative tool is identified by name along with the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
aiapplyd_update_job_preferences2 fields changed- changed
Input schema / properties / experience_levels / descriptionPrevious value: -"Seniority to match: entry, mid, senior, lead, executive. REPLACES the saved list."New value: +"Seniority to match: intern, entry, junior, mid, senior, lead, executive. REPLACES the saved list." - changed
Input schema / properties / experience_levels / items / enumPrevious value: -[ - "entry", - "mid", - "senior", - "lead", - "executive" -]New value: +[ + "intern", + "entry", + "junior", + "mid", + "senior", + "lead", + "executive" +]
17 tool updates
- Changed
aiapplyd_analyze_job_description1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
aiapplyd_apply20 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / job_match_id / maximumAdded value: +9007199254740991 - added
Output schema / properties / applicationId / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / applicationId / typeRemoved value: -[ - "number", - "null" -] - added
Output schema / properties / company / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / company / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / jobMatchId / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / jobMatchId / typeRemoved value: -[ - "number", - "null" -] - added
Output schema / properties / jobTitle / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / jobTitle / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / jobUrl / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / jobUrl / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / preparationStatus / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / preparationStatus / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / recordedMode / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / recordedMode / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / status / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / status / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / trackingUrl / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / trackingUrl / typeRemoved value: -[ - "string", - "null" -]
- Changed
aiapplyd_auto_apply19 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / applicationId / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / applicationId / typeRemoved value: -[ - "number", - "null" -] - added
Output schema / properties / company / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / company / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / jobMatchId / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / jobMatchId / typeRemoved value: -[ - "number", - "null" -] - added
Output schema / properties / jobTitle / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / jobTitle / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / jobUrl / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / jobUrl / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / preparationStatus / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / preparationStatus / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / recordedMode / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / recordedMode / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / status / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / status / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / trackingUrl / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / trackingUrl / typeRemoved value: -[ - "string", - "null" -]
- Changed
aiapplyd_build_pdf3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / publicUrl / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / publicUrl / typeRemoved value: -[ - "string", - "null" -]
- Changed
aiapplyd_generate_cover_letter6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / application_id / maximumAdded value: +9007199254740991 - added
Output schema / properties / applicationId / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / applicationId / typeRemoved value: -[ - "number", - "null" -] - added
Output schema / properties / resumeBuildId / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / resumeBuildId / typeRemoved value: -[ - "number", - "null" -]
- Changed
aiapplyd_generate_interview_questions2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / application_id / maximumAdded value: +9007199254740991
- Changed
aiapplyd_get_account9 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / plan / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "currentPeriodEnd": { - "type": "string" - }, - "endsAt": { - "type": [ - "string", - "null" - ] - }, - "interval": { - "type": [ - "string", - "null" - ] - }, - "name": { - "type": [ - "string", - "null" - ] - }, - "status": { - "type": "string" - }, - "tier": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "name", - "tier", - "status", - "interval", - "currentPeriodEnd", - "endsAt" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "currentPeriodEnd": { + "type": "string" + }, + "endsAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "interval": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "type": "string" + }, + "tier": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "name", + "tier", + "status", + "interval", + "currentPeriodEnd", + "endsAt" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / readiness / properties / onboardingComplete / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "null" + } +] - removed
Output schema / properties / readiness / properties / onboardingComplete / typeRemoved value: -[ - "boolean", - "null" -] - added
Output schema / properties / readiness / properties / resumeOnFile / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "null" + } +] - removed
Output schema / properties / readiness / properties / resumeOnFile / typeRemoved value: -[ - "boolean", - "null" -] - changed
Output schema / properties / resumes / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": false, - "properties": { - "id": { - "description": "Pass to aiapplyd_set_resume as document_id to make it the base resume.", - "type": "number" - }, - "isBase": { - "type": "boolean" - }, - "title": { - "type": "string" - }, - "updatedAt": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "id", - "title", - "isBase", - "updatedAt" - ], - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "description": "Pass to aiapplyd_set_resume as document_id to make it the base resume.", + "type": "number" + }, + "isBase": { + "type": "boolean" + }, + "title": { + "type": "string" + }, + "updatedAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "id", + "title", + "isBase", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Output schema / properties / tokenBalance / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / tokenBalance / typeRemoved value: -[ - "number", - "null" -]
- Changed
aiapplyd_get_applications16 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / application_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / page / maximumAdded value: +9007199254740991 - added
Output schema / properties / applications / items / properties / appliedAt / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / applications / items / properties / appliedAt / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / applications / items / properties / applyMode / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / applications / items / properties / applyMode / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / applications / items / properties / company / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / applications / items / properties / company / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / applications / items / properties / createdAt / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / applications / items / properties / createdAt / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / applications / items / properties / jobMatchId / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / applications / items / properties / jobMatchId / typeRemoved value: -[ - "number", - "null" -] - added
Output schema / properties / applications / items / properties / jobTitle / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / applications / items / properties / jobTitle / typeRemoved value: -[ - "string", - "null" -] - changed
Output schema / properties / detail / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "applicationId": { - "type": "number" - }, - "autoRetryStopped": { - "type": [ - "boolean", - "null" - ] - }, - "confirmationScreenshotAttached": { - "description": "True when the employer's verified confirmation page is attached as an image.", - "type": "boolean" - }, - "contentLocked": { - "description": "True when the resume and cover letter are a preview and the full text needs a plan.", - "type": "boolean" - }, - "coverLetter": { - "type": [ - "string", - "null" - ] - }, - "errorCode": { - "type": [ - "string", - "null" - ] - }, - "errorMessage": { - "type": [ - "string", - "null" - ] - }, - "jobListingId": { - "type": [ - "number", - "null" - ] - }, - "nextAutoRetryAt": { - "type": [ - "string", - "null" - ] - }, - "queueEtaMinutes": { - "type": [ - "number", - "null" - ] - }, - "queuePosition": { - "type": [ - "number", - "null" - ] - }, - "screeningAnswers": { - "items": { - "additionalProperties": false, - "properties": { - "answer": { - "type": "string" - }, - "question": { - "type": "string" - } - }, - "required": [ - "question", - "answer" - ], - "type": "object" - }, - "type": "array" - }, - "statusCode": { - "type": [ - "string", - "null" - ] - }, - "statusLabel": { - "type": [ - "string", - "null" - ] - }, - "tailoredResume": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "applicationId", - "jobListingId", - "tailoredResume", - "coverLetter", - "contentLocked", - "screeningAnswers", - "statusCode", - "statusLabel", - "errorCode", - "errorMessage", - "autoRetryStopped", - "nextAutoRetryAt", - "queuePosition", - "queueEtaMinutes", - "confirmationScreenshotAttached" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "applicationId": { + "type": "number" + }, + "autoRetryStopped": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "confirmationScreenshotAttached": { + "description": "True when the employer's verified confirmation page is attached as an image.", + "type": "boolean" + }, + "contentLocked": { + "description": "True when the resume and cover letter are a preview and the full text needs a plan.", + "type": "boolean" + }, + "coverLetter": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "errorCode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "errorMessage": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "jobListingId": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "nextAutoRetryAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "queueEtaMinutes": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "queuePosition": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "screeningAnswers": { + "items": { + "additionalProperties": false, + "properties": { + "answer": { + "type": "string" + }, + "question": { + "type": "string" + } + }, + "required": [ + "question", + "answer" + ], + "type": "object" + }, + "type": "array" + }, + "statusCode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "statusLabel": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "tailoredResume": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "applicationId", + "jobListingId", + "tailoredResume", + "coverLetter", + "contentLocked", + "screeningAnswers", + "statusCode", + "statusLabel", + "errorCode", + "errorMessage", + "autoRetryStopped", + "nextAutoRetryAt", + "queuePosition", + "queueEtaMinutes", + "confirmationScreenshotAttached" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
aiapplyd_get_matches27 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / after_job_match_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / job_match_ids / items / maximumAdded value: +9007199254740991 - added
Input schema / properties / page / maximumAdded value: +9007199254740991 - added
Output schema / properties / matches / items / properties / applicationStatus / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / applicationStatus / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / matches / items / properties / company / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / company / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / matches / items / properties / description / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / description / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / matches / items / properties / descriptionExcerpt / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / descriptionExcerpt / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / matches / items / properties / location / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / location / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / matches / items / properties / matchScore / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / matchScore / typeRemoved value: -[ - "number", - "null" -] - added
Output schema / properties / matches / items / properties / postedAt / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / postedAt / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / matches / items / properties / salary / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / salary / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / matches / items / properties / workArrangement / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / workArrangement / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / newestJobMatchId / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / newestJobMatchId / typeRemoved value: -[ - "number", - "null" -] - changed
Output schema / properties / posting / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "company": { - "type": [ - "string", - "null" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "location": { - "type": [ - "string", - "null" - ] - }, - "salary": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "url", - "title", - "company", - "location", - "salary", - "description" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "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" + } +] - added
Output schema / properties / totalMatches / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / totalMatches / typeRemoved value: -[ - "number", - "null" -]
- Changed
aiapplyd_optimize_resume3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / projectedAtsScore / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / projectedAtsScore / typeRemoved value: -[ - "number", - "null" -]
- Changed
aiapplyd_review_application10 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / application_ids / items / maximumAdded value: +9007199254740991 - added
Output schema / properties / results / items / properties / applicationStage / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / results / items / properties / applicationStage / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / results / items / properties / reason / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / results / items / properties / reason / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / results / items / properties / refinedContent / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / results / items / properties / refinedContent / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / results / items / properties / status / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / results / items / properties / status / typeRemoved value: -[ - "string", - "null" -]
- Changed
aiapplyd_score_resume1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
aiapplyd_search_jobs24 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / matches / items / properties / applicationStatus / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / applicationStatus / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / matches / items / properties / company / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / company / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / matches / items / properties / description / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / description / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / matches / items / properties / descriptionExcerpt / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / descriptionExcerpt / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / matches / items / properties / location / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / location / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / matches / items / properties / matchScore / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / matchScore / typeRemoved value: -[ - "number", - "null" -] - added
Output schema / properties / matches / items / properties / postedAt / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / postedAt / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / matches / items / properties / salary / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / salary / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / matches / items / properties / workArrangement / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / matches / items / properties / workArrangement / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / newestJobMatchId / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / newestJobMatchId / typeRemoved value: -[ - "number", - "null" -] - changed
Output schema / properties / posting / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "company": { - "type": [ - "string", - "null" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "location": { - "type": [ - "string", - "null" - ] - }, - "salary": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "url", - "title", - "company", - "location", - "salary", - "description" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "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" + } +] - added
Output schema / properties / totalMatches / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / totalMatches / typeRemoved value: -[ - "number", - "null" -]
- Changed
aiapplyd_set_resume6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / document_id / maximumAdded value: +9007199254740991 - added
Output schema / properties / currentJobTitle / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / currentJobTitle / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / fullName / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / fullName / typeRemoved value: -[ - "string", - "null" -]
- Changed
aiapplyd_translate_resume1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
aiapplyd_triage_matches2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / job_match_ids / items / maximumAdded value: +9007199254740991
- Changed
aiapplyd_update_job_preferences16 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / application_answers / additionalPropertiesRemoved value: -false - added
Output schema / properties / describedSummary / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / describedSummary / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / includeRemote / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "null" + } +] - removed
Output schema / properties / includeRemote / typeRemoved value: -[ - "boolean", - "null" -] - added
Output schema / properties / paused / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "null" + } +] - removed
Output schema / properties / paused / typeRemoved value: -[ - "boolean", - "null" -] - added
Output schema / properties / salaryCurrency / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / salaryCurrency / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / salaryMax / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / salaryMax / typeRemoved value: -[ - "number", - "null" -] - added
Output schema / properties / salaryMin / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - removed
Output schema / properties / salaryMin / typeRemoved value: -[ - "number", - "null" -] - added
Output schema / properties / visaSponsorship / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / visaSponsorship / typeRemoved value: -[ - "string", - "null" -]
12 tool updates
- Changed
aiapplyd_apply8 fields changed- added
Output schema / properties / alreadyExistedAdded value: +{ + "description": "True when this job already had an application, which is returned instead of a second one.", + "type": "boolean" +} - added
Output schema / properties / applicationId / descriptionAdded value: +"The application to follow with aiapplyd_get_applications. Null only when nothing was started." - changed
Output schema / properties / applicationId / typePrevious value: -"number"New value: +[ + "number", + "null" +] - changed
Output schema / properties / jobMatchId / typePrevious value: -"number"New value: +[ + "number", + "null" +] - added
Output schema / properties / outcomeAdded value: +{ + "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" +} - added
Output schema / properties / status / descriptionAdded value: +"Our own record. Never proof the employer received it." - changed
Output schema / properties / trackingUrl / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / requiredPrevious value: -[ - "applicationId", - "jobMatchId", - "jobTitle", - "company", - "jobUrl", - "requestedMode", - "recordedMode", - "status", - "preparationStatus", - "preparedUnderFreeWatch", - "trackingUrl" -]New value: +[ + "outcome", + "applicationId", + "jobMatchId", + "jobTitle", + "company", + "jobUrl", + "requestedMode", + "recordedMode", + "status", + "preparationStatus", + "preparedUnderFreeWatch", + "alreadyExisted", + "trackingUrl" +]
- Changed
aiapplyd_auto_apply8 fields changed- added
Output schema / properties / alreadyExistedAdded value: +{ + "description": "True when this job already had an application, which is returned instead of a second one.", + "type": "boolean" +} - added
Output schema / properties / applicationId / descriptionAdded value: +"The application to follow with aiapplyd_get_applications. Null only when nothing was started." - changed
Output schema / properties / applicationId / typePrevious value: -"number"New value: +[ + "number", + "null" +] - changed
Output schema / properties / jobMatchId / typePrevious value: -"number"New value: +[ + "number", + "null" +] - added
Output schema / properties / outcomeAdded value: +{ + "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" +} - added
Output schema / properties / status / descriptionAdded value: +"Our own record. Never proof the employer received it." - changed
Output schema / properties / trackingUrl / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / requiredPrevious value: -[ - "applicationId", - "jobMatchId", - "jobTitle", - "company", - "jobUrl", - "requestedMode", - "recordedMode", - "status", - "preparationStatus", - "preparedUnderFreeWatch", - "trackingUrl" -]New value: +[ + "outcome", + "applicationId", + "jobMatchId", + "jobTitle", + "company", + "jobUrl", + "requestedMode", + "recordedMode", + "status", + "preparationStatus", + "preparedUnderFreeWatch", + "alreadyExisted", + "trackingUrl" +]
- Changed
aiapplyd_generate_cover_letter8 fields changed- 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, + "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" -] - added
Output schema / properties / applicationIdAdded value: +{ + "type": [ + "number", + "null" + ] +} - changed
Output schema / properties / resumeBuildId / typePrevious value: -"number"New value: +[ + "number", + "null" +] - added
Output schema / properties / sourceAdded value: +{ + "description": "generated: newly written; application: the letter already prepared for application_id; refined: that letter, changed as asked.", + "enum": [ + "generated", + "application", + "refined" + ], + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "coverLetter", - "companyName", - "resumeBuildId", - "url" -]New value: +[ + "coverLetter", + "companyName", + "source", + "resumeBuildId", + "applicationId", + "url" +]
- Changed
aiapplyd_generate_interview_questions4 fields changed- 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, + "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
aiapplyd_get_account6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / properties / autopilotAdded value: +{ + "anyOf": [ + { + "enum": [ + "active", + "paused" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Whether AI Applyd applies on its own. Read only." +} - added
Output schema / properties / defaultApplyModeAdded value: +{ + "anyOf": [ + { + "enum": [ + "auto", + "review" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "What aiapplyd_apply does when mode is omitted. Read only." +} - added
Output schema / properties / readinessAdded value: +{ + "additionalProperties": false, + "properties": { + "missingRequiredForApply": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Profile fields employer forms require that are empty. Ask the user; never guess." + }, + "onboardingComplete": { + "type": [ + "boolean", + "null" + ] + }, + "resumeOnFile": { + "description": "False means apply will fail: call aiapplyd_set_resume first.", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "resumeOnFile", + "onboardingComplete", + "missingRequiredForApply" + ], + "type": "object" +} - added
Output schema / properties / resumesAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "description": "Pass to aiapplyd_set_resume as document_id to make it the base resume.", + "type": "number" + }, + "isBase": { + "type": "boolean" + }, + "title": { + "type": "string" + }, + "updatedAt": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "title", + "isBase", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - changed
Output schema / requiredPrevious value: -[ - "plan", - "tokenBalance", - "applications", - "freeApplications", - "preferences", - "billingUrl" -]New value: +[ + "plan", + "tokenBalance", + "applications", + "freeApplications", + "preferences", + "readiness", + "resumes", + "defaultApplyMode", + "autopilot", + "billingUrl" +]
- Changed
aiapplyd_get_applications7 fields changed- added
Output schema / properties / applications / items / properties / applicationId / descriptionAdded value: +"Pass to aiapplyd_review_application or back to aiapplyd_get_applications." - added
Output schema / properties / applications / items / properties / confirmationProofs / descriptionAdded value: +"What proves employerConfirmed: \"receipt\" and/or \"screenshot\"." - added
Output schema / properties / applications / items / properties / employerConfirmed / descriptionAdded value: +"True ONLY when the employer sent a receipt or showed its confirmation page." - added
Output schema / properties / applications / items / properties / status / descriptionAdded value: +"Our own record of the application. Never proof the employer received it; see employerConfirmed." - added
Output schema / properties / applications / items / properties / waitingForReview / descriptionAdded value: +"True when the application waits for the user's approval." - added
Output schema / properties / detailAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "applicationId": { + "type": "number" + }, + "autoRetryStopped": { + "type": [ + "boolean", + "null" + ] + }, + "confirmationScreenshotAttached": { + "description": "True when the employer's verified confirmation page is attached as an image.", + "type": "boolean" + }, + "contentLocked": { + "description": "True when the resume and cover letter are a preview and the full text needs a plan.", + "type": "boolean" + }, + "coverLetter": { + "type": [ + "string", + "null" + ] + }, + "errorCode": { + "type": [ + "string", + "null" + ] + }, + "errorMessage": { + "type": [ + "string", + "null" + ] + }, + "jobListingId": { + "type": [ + "number", + "null" + ] + }, + "nextAutoRetryAt": { + "type": [ + "string", + "null" + ] + }, + "queueEtaMinutes": { + "type": [ + "number", + "null" + ] + }, + "queuePosition": { + "type": [ + "number", + "null" + ] + }, + "screeningAnswers": { + "items": { + "additionalProperties": false, + "properties": { + "answer": { + "type": "string" + }, + "question": { + "type": "string" + } + }, + "required": [ + "question", + "answer" + ], + "type": "object" + }, + "type": "array" + }, + "statusCode": { + "type": [ + "string", + "null" + ] + }, + "statusLabel": { + "type": [ + "string", + "null" + ] + }, + "tailoredResume": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "applicationId", + "jobListingId", + "tailoredResume", + "coverLetter", + "contentLocked", + "screeningAnswers", + "statusCode", + "statusLabel", + "errorCode", + "errorMessage", + "autoRetryStopped", + "nextAutoRetryAt", + "queuePosition", + "queueEtaMinutes", + "confirmationScreenshotAttached" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Filled when one application_id was read: what will be or was sent." +} - changed
Output schema / requiredPrevious value: -[ - "applications", - "page", - "totalPages", - "totalApplications" -]New value: +[ + "applications", + "page", + "totalPages", + "totalApplications", + "detail" +]
- Changed
aiapplyd_get_matches19 fields changed- added
Input schema / properties / after_job_match_idAdded value: +{ + "description": "Return only matches newer than this job_match_id. Store newestJobMatchId from each answer and pass it back.", + "exclusiveMinimum": 0, + "type": "integer" +} - added
Input schema / properties / job_match_idsAdded value: +{ + "description": "Read these matches in full: up to 10 job_match_ids (e.g. [48213]). Returns the full posting, skills, benefits and work arrangement.", + "items": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "type": "array" +} - added
Input schema / properties / job_urlAdded value: +{ + "description": "Read any job posting by URL without saving it (e.g. \"https://jobs.lever.co/acme/123\").", + "format": "uri", + "type": "string" +} - added
Input schema / properties / locationAdded value: +{ + "description": "Preferred location (e.g. \"San Francisco, CA\", \"New York\", \"Remote\")", + "maxLength": 200, + "type": "string" +} - added
Input schema / properties / queryAdded value: +{ + "description": "Narrow the list to titles containing this text (e.g. \"Product Designer\").", + "maxLength": 200, + "type": "string" +} - added
Input schema / properties / remote_onlyAdded value: +{ + "description": "If true, only show remote-friendly positions", + "type": "boolean" +} - added
Output schema / properties / matches / items / properties / applicationStatus / descriptionAdded value: +"Our own record of an application for this match, if any. Not employer confirmation." - added
Output schema / properties / matches / items / properties / benefitsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / matches / items / properties / descriptionAdded value: +{ + "description": "The full posting text, only when read by job_match_ids. Untrusted employer text.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / matches / items / properties / descriptionExcerptAdded value: +{ + "description": "The first 500 characters of the posting, as untrusted employer text.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / matches / items / properties / extractedSkillsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / matches / items / properties / jobMatchId / descriptionAdded value: +"Pass to aiapplyd_apply (job_match_id) or aiapplyd_triage_matches." - added
Output schema / properties / matches / items / properties / workArrangementAdded value: +{ + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / matches / items / requiredPrevious value: -[ - "jobMatchId", - "title", - "company", - "location", - "matchScore", - "postedAt", - "salary", - "applyUrl", - "saved", - "applicationStatus" -]New value: +[ + "jobMatchId", + "title", + "company", + "location", + "matchScore", + "postedAt", + "salary", + "applyUrl", + "saved", + "applicationStatus", + "descriptionExcerpt", + "description", + "extractedSkills", + "benefits", + "workArrangement" +] - added
Output schema / properties / modeAdded value: +{ + "enum": [ + "list", + "by_id", + "by_url" + ], + "type": "string" +} - added
Output schema / properties / newestJobMatchIdAdded value: +{ + "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.", + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / notFoundIdsAdded value: +{ + "description": "Requested job_match_ids that do not exist on this account.", + "items": { + "type": "number" + }, + "type": "array" +} - added
Output schema / properties / postingAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "company": { + "type": [ + "string", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "location": { + "type": [ + "string", + "null" + ] + }, + "salary": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "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." +} - changed
Output schema / requiredPrevious value: -[ - "matches", - "page", - "totalPages", - "totalMatches" -]New value: +[ + "mode", + "matches", + "page", + "totalPages", + "totalMatches", + "newestJobMatchId", + "notFoundIds", + "posting" +]
- Changed
aiapplyd_review_application16 fields changed- added
Input schema / properties / application_ids / items / exclusiveMinimumAdded value: +0 - changed
Input schema / properties / application_ids / items / typePrevious value: -"number"New value: +"integer" - changed
Input schema / properties / decision / descriptionPrevious value: -"\"approve\" submits the application to the employer and cannot be undone. \"reject\" skips it and sends nothing."New value: +"\"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)." - changed
Input schema / properties / decision / enumPrevious value: -[ - "approve", - "reject" -]New value: +[ + "approve", + "reject", + "cancel", + "refine", + "re_prepare", + "set_stage" +] - added
Input schema / properties / document_typeAdded value: +{ + "description": "For refine: \"resume\" or \"cover_letter\".", + "enum": [ + "resume", + "cover_letter" + ], + "type": "string" +} - added
Input schema / properties / instructionsAdded value: +{ + "description": "For refine: what to change, in the user's own words (up to 2,000 characters).", + "maxLength": 2000, + "type": "string" +} - added
Input schema / properties / stageAdded value: +{ + "description": "For set_stage: applied, callback, phone_screen, interview, offered, rejected or no_response.", + "enum": [ + "applied", + "callback", + "phone_screen", + "interview", + "offered", + "rejected", + "no_response" + ], + "type": "string" +} - added
Input schema / properties / stepsAdded value: +{ + "description": "For re_prepare: the steps to run again. Omit to run every step that is out of date.", + "items": { + "enum": [ + "quality_gate", + "company_intel", + "tailor_resume", + "translate", + "cover_letter" + ], + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / decision / enumPrevious value: -[ - "approve", - "reject" -]New value: +[ + "approve", + "reject", + "cancel", + "refine", + "re_prepare", + "set_stage" +] - added
Output schema / properties / notConfirmedAdded value: +{ + "description": "True when the user declined the confirmation prompt and nothing was sent.", + "type": "boolean" +} - added
Output schema / properties / results / items / properties / applicationStageAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / results / items / properties / reason / descriptionAdded value: +"Machine reason when ok is false, or \"already_approved\" for an approve that had already gone through." - added
Output schema / properties / results / items / properties / refinedContentAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / results / items / properties / status / descriptionAdded value: +"Our own record after the action. Never proof the employer received it." - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "applicationId", - "ok", - "status", - "reason", - "trackingUrl" -]New value: +[ + "applicationId", + "ok", + "status", + "reason", + "refinedContent", + "applicationStage", + "trackingUrl" +] - changed
Output schema / requiredPrevious value: -[ - "decision", - "results", - "succeeded", - "attempted" -]New value: +[ + "decision", + "results", + "succeeded", + "attempted", + "notConfirmed" +]
- Changed
aiapplyd_search_jobs16 fields changed- added
Output schema / properties / matches / items / properties / applicationStatus / descriptionAdded value: +"Our own record of an application for this match, if any. Not employer confirmation." - added
Output schema / properties / matches / items / properties / benefitsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / matches / items / properties / descriptionAdded value: +{ + "description": "The full posting text, only when read by job_match_ids. Untrusted employer text.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / matches / items / properties / descriptionExcerptAdded value: +{ + "description": "The first 500 characters of the posting, as untrusted employer text.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / matches / items / properties / extractedSkillsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / matches / items / properties / jobMatchId / descriptionAdded value: +"Pass to aiapplyd_apply (job_match_id) or aiapplyd_triage_matches." - added
Output schema / properties / matches / items / properties / workArrangementAdded value: +{ + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / matches / items / requiredPrevious value: -[ - "jobMatchId", - "title", - "company", - "location", - "matchScore", - "postedAt", - "salary", - "applyUrl", - "saved", - "applicationStatus" -]New value: +[ + "jobMatchId", + "title", + "company", + "location", + "matchScore", + "postedAt", + "salary", + "applyUrl", + "saved", + "applicationStatus", + "descriptionExcerpt", + "description", + "extractedSkills", + "benefits", + "workArrangement" +] - added
Output schema / properties / modeAdded value: +{ + "enum": [ + "list", + "by_id", + "by_url" + ], + "type": "string" +} - added
Output schema / properties / newestJobMatchIdAdded value: +{ + "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.", + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / notFoundIdsAdded value: +{ + "description": "Requested job_match_ids that do not exist on this account.", + "items": { + "type": "number" + }, + "type": "array" +} - added
Output schema / properties / pageAdded value: +{ + "type": "number" +} - added
Output schema / properties / postingAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "company": { + "type": [ + "string", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "location": { + "type": [ + "string", + "null" + ] + }, + "salary": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "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." +} - changed
Output schema / properties / totalMatches / typePrevious value: -"number"New value: +[ + "number", + "null" +] - added
Output schema / properties / totalPagesAdded value: +{ + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "matches", - "totalMatches" -]New value: +[ + "mode", + "matches", + "page", + "totalPages", + "totalMatches", + "newestJobMatchId", + "notFoundIds", + "posting" +]
- Added
aiapplyd_set_resume - Added
aiapplyd_triage_matches - Changed
aiapplyd_update_job_preferences26 fields changed- added
Input schema / properties / application_answersAdded value: +{ + "additionalProperties": false, + "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" +} - added
Output schema / properties / applicationAnswersSavedAdded value: +{ + "description": "The application_answers fields written to the application profile.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / describedSummaryAdded value: +{ + "description": "How AI Applyd understood `description`, when one was given.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / excludeIndustriesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / experienceLevelsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / jobTypesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / onboardingCompletedAdded value: +{ + "description": "True when this call finished the account setup, so AI Applyd starts searching for these roles.", + "type": "boolean" +} - added
Output schema / properties / pausedAdded value: +{ + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / salaryCurrencyAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / salaryMaxAdded value: +{ + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / salaryMinAdded value: +{ + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / visaSponsorshipAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / workStylesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - changed
Output schema / requiredPrevious value: -[ - "targetRoles", - "locations", - "includeRemote", - "remoteWorldwide" -]New value: +[ + "targetRoles", + "locations", + "includeRemote", + "remoteWorldwide", + "salaryMin", + "salaryMax", + "salaryCurrency", + "experienceLevels", + "workStyles", + "jobTypes", + "visaSponsorship", + "excludeIndustries", + "paused", + "applicationAnswersSaved", + "describedSummary", + "onboardingCompleted" +]
15 tool updates
- Changed
aiapplyd_analyze_job_description1 field changed- 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_apply1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "applicationId": { + "type": "number" + }, + "company": { + "type": [ + "string", + "null" + ] + }, + "jobMatchId": { + "type": "number" + }, + "jobTitle": { + "type": [ + "string", + "null" + ] + }, + "jobUrl": { + "type": [ + "string", + "null" + ] + }, + "preparationStatus": { + "type": [ + "string", + "null" + ] + }, + "preparedUnderFreeWatch": { + "type": "boolean" + }, + "recordedMode": { + "type": [ + "string", + "null" + ] + }, + "requestedMode": { + "anyOf": [ + { + "enum": [ + "auto_approve", + "copilot" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "trackingUrl": { + "type": "string" + } + }, + "required": [ + "applicationId", + "jobMatchId", + "jobTitle", + "company", + "jobUrl", + "requestedMode", + "recordedMode", + "status", + "preparationStatus", + "preparedUnderFreeWatch", + "trackingUrl" + ], + "type": "object" +}
- Changed
aiapplyd_build_pdf1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "publicUrl": { + "type": [ + "string", + "null" + ] + }, + "resumeBuildId": { + "type": "number" + }, + "template": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "resumeBuildId", + "template", + "url", + "publicUrl" + ], + "type": "object" +}
- Changed
aiapplyd_generate_cover_letter1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "companyName": { + "type": "string" + }, + "coverLetter": { + "type": "string" + }, + "resumeBuildId": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "coverLetter", + "companyName", + "resumeBuildId", + "url" + ], + "type": "object" +}
- Changed
aiapplyd_generate_interview_questions1 field changed- 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_resume1 field changed- 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": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "optimizedResume", + "changes", + "projectedAtsScore" + ], + "type": "object" +}
- Added
aiapplyd_review_application - Changed
aiapplyd_score_resume1 field changed- 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_jobs1 field changed- 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": { + "type": [ + "string", + "null" + ] + }, + "applyUrl": { + "type": "string" + }, + "company": { + "type": [ + "string", + "null" + ] + }, + "jobMatchId": { + "type": "number" + }, + "location": { + "type": [ + "string", + "null" + ] + }, + "matchScore": { + "type": [ + "number", + "null" + ] + }, + "postedAt": { + "type": [ + "string", + "null" + ] + }, + "salary": { + "type": [ + "string", + "null" + ] + }, + "saved": { + "type": "boolean" + }, + "title": { + "type": "string" + } + }, + "required": [ + "jobMatchId", + "title", + "company", + "location", + "matchScore", + "postedAt", + "salary", + "applyUrl", + "saved", + "applicationStatus" + ], + "type": "object" + }, + "type": "array" + }, + "totalMatches": { + "type": "number" + } + }, + "required": [ + "matches", + "totalMatches" + ], + "type": "object" +}
- Changed
aiapplyd_translate_resume1 field changed- 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" +}
- Changed
aiapplyd_update_job_preferences1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "includeRemote": { + "type": [ + "boolean", + "null" + ] + }, + "locations": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "remoteWorldwide": { + "type": "boolean" + }, + "targetRoles": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "targetRoles", + "locations", + "includeRemote", + "remoteWorldwide" + ], + "type": "object" +}
10 tool updates
- 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
Publisher details
- Operator
- AI Applyd · Publisher source
- Operator website
- https://aiapplyd.com
- Vendor relationship
- First-party
- Documentation
- https://aiapplyd.com/mcps · Publisher source
- Trust center
- Not available
- Restrictions
- Tool calls need an AI Applyd account, connected over OAuth with Google sign-in. A free account needs no card and includes a 10,000-token starter grant and one application; more applications need a paid plan. · Publisher source
Related MCP Connectors
Auto-apply to jobs: matches your CV, tailors a fresh CV per posting, and applies for you.
Search jobs, tailor your resume, write cover letters, and file applications for you.
Tailored, graded job applications: a CV, cover letter and form answers built per vacancy.
Find jobs, tailor your resume to each one, and fill applications you review before they're sent.
Related MCP Servers
- AlicenseBqualityCmaintenanceProvides tools to search & auto-apply to jobs directly on company websites, generate custom resumes, get contacts of recruiters and referrals and track applications easily3579 npm24MIT
- FlicenseNot gradedqualityDmaintenanceAutomates job application tracking and resume/cover letter generation using AI, integrating with Google Drive, Notion, and Gmail.1-
- 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.-
- AlicenseAqualityBmaintenanceEnables AI agents to search job openings across free sources, prepare application materials using known experience, and handle authorized email sending and follow-ups.92MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.