Skip to content

Tool reference

Generated from the running tool registry, so this page always matches what the server actually accepts.

Every rule below exists because an agent got it wrong in the field. The per-tool examples further down are validated against the live schemas in CI — copy their shapes.

  • Arrays are real JSON arrays, never a quoted string: "bank": ["entry one", "entry two"] — not "bank": "[\"entry one\"]".
  • One accomplishment per array element. Commas are punctuation INSIDE an entry — “Negotiated $4.8M savings, 20% on $24M of spend” is ONE entry. Never pre-split text on commas.
  • confirm is the boolean true, not the string "true". Tools that spend quota or change state refuse without it and tell you so.
  • Numbers may arrive as strings ("cadenceHours": "24" coerces to 24), but garbage errors loudly rather than being replaced with a default — prefer real numbers.
  • Ids come from prior calls — jobId from list_matches, searchId from list_searches, operationId from the tool that queued the work. Never invent one.
  • update_search merges: send only what changes; every filter you do not mention is preserved.
Tool Cost Confirm?
search_jobs metered: one source query per pool —
count_jobs free — costs NO job credits —
list_matches free —
get_job free —
set_job_status free, state-changing — requires confirm: true yes
rate_job free —
tailor_resume metered: tailor quota — requires confirm: true yes
revise_tailored metered: tailor quota — requires confirm: true yes
list_tailoring_sessions free —
open_tailoring_session free —
get_tailoring_session free —
review_tailoring_session metered: tailor quota — requires confirm: true yes
decide_tailoring free —
build_tailored_resume metered: tailor quota — requires confirm: true yes
discard_tailoring_session free, state-changing — requires confirm: true yes
get_prep_packet metered: prep quota — requires confirm: true yes
get_board free —
move_card free, state-changing — requires confirm: true yes
list_searches free —
create_search metered: recurring scans every cadence — requires confirm: true yes
pause_search free, state-changing — requires confirm: true yes
get_operation free —
list_accomplishments free —
add_accomplishments free —
update_search free, state-changing — requires confirm: true yes
run_search_now metered: one source query per pool — requires confirm: true yes
get_search_health free —
rescore_job metered: score quota — requires confirm: true yes
add_job_note free —
declare_applied free, state-changing — requires confirm: true yes
get_exclusions free —
set_exclusions free, state-changing — requires confirm: true yes
list_resumes free —
list_operations free —
get_tailored_document free —
get_master_resume free —
mark_exemplar free, state-changing — requires confirm: true yes
delete_tailored_document free, state-changing — requires confirm: true yes
get_usage free —

Run a ONE-OFF job search. Results are raw postings and are NEVER scored against the owner’s profile. The owner’s exclusion lists and stated country are applied to the results unless forSomeoneElse is true. Set forSomeoneElse: true when searching on behalf of somebody else — it turns the owner’s standing filters off. Nothing is saved. Prefer create_search when the user wants this run repeatedly. The response reports truncated and (when it can) totalAvailable — never present a truncated list as the whole market. A one-off is capped at 100 per pool and has no memory, so on a high-volume query it is a SAMPLE; create_search is what keeps up with one over time. count_jobs sizes a query for free.

Argument Type Notes
query string Boolean title search, e.g. “VP Engineering” OR “Head of Platform”. A comma separates alternatives (reads as OR).
location string e.g. “United States”, “Charlotte, NC”. Omit to search worldwide, which costs more and returns roles the candidate cannot take — set it unless they truly want worldwide results.
seniority array of string LinkedIn vocabulary: Internship, Entry level, Associate, Mid-Senior level, Director, Executive. Applies to the boards pool only — the ATS pool ignores it, so use experienceLevel there. · one of: Internship, Entry level, Associate, Mid-Senior level, Director, Executive
experienceLevel string Years of experience: ‘0-2’, ‘2-5’, ‘5-10’, ‘10+’ — one, or several as an array or comma string (‘5-10,10+’). This is the ONLY level filter the ATS pool honours; without it an ATS search returns junior roles alongside senior ones. An unrecognised value is not applied and is reported in warnings. · one of: 0-2, 2-5, 5-10, 10+, 5-10,10+, 2-5,5-10, 0-2,2-5
employmentType array of string FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, OTHER. Defaults to FULL_TIME — set it explicitly to reach contract roles. · one of: FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, OTHER
minEmployees number Minimum organisation headcount. · range 1–
maxEmployees number Maximum organisation headcount. · range 1–
industry array of string Organisation industries to include.
companies array of string Only these organisations, by name. The inverse of excludeCompanies — filtered at the supplier, so it costs less rather than more.
excludeCompanies array of string Drop these organisations from the results. Stacks ON TOP of the owner’s standing exclusion lists; it never replaces them.
excludeTitles array of string Drop postings whose title contains any of these (case-insensitive substrings). Near-miss titles are the most common source of noise — e.g. excluding “direct procurement” on a strategic-sourcing search. Stacks on top of the standing list, never replacing it.
removeAgency boolean Exclude staffing agencies. Defaults to true; pass false to include. · default true
excludeAtsDuplicates boolean Boards pool only: drop board rows the supplier already matched to an ATS posting. Defaults to true: the duplicate is filtered before it is paid for. · default true
description string Boolean matched against the job description. ANDed with query — it NARROWS the title search rather than widening it. You can OMIT query entirely and sweep on description alone, which catches roles whose title matches nothing you would think to search for. Broader, so it returns more rows.
pool string Which supply to ask: ‘ats’ (default — company career sites), ‘boards’ (job boards), or ‘both’. These are different inventories, not two views of one, so ‘both’ searches twice and costs twice. · one of: ats, boards, both · default ats
forSomeoneElse boolean Turn OFF the owner’s exclusion lists and country guard; never scored
withinDays number How far back to look. Searching is capped at 7 days — the supplier offers no fetch window between a week and six months. Counting reaches 30. The window used is always reported back as window. · default 7 · range 1–30
remoteOnly boolean Only roles that can be done remotely
limit number Max postings per pool. The caller pays per row returned, so this is the spend dial for a one-off. Values above 100 are clamped to 100; truncated in the response says whether the ceiling cut the results. · default 10 · range 1–100

Example

{ "name": "search_jobs", "arguments": {
"query": "\"VP of Engineering\" OR \"Head of Platform\"",
"location": "Charlotte, NC",
"seniority": [
"Director",
"Executive"
],
"experienceLevel": "5-10,10+",
"excludeTitles": [
"recruiter",
"talent acquisition"
],
"remoteOnly": true,
"limit": 10
} }

How many postings match, without fetching any of them. Use this to size or debug a query before spending on it: it returns the same compiled expression, the same filter warnings and a total, but buys no rows. Iterate here first, then run search_jobs or create_search once the query looks right.

Argument Type Notes
query string Same syntax as search_jobs.
location string e.g. “United States”. Omit for worldwide, which counts far more.
seniority array of string Job-board levels; career sites ignore them. · one of: Internship, Entry level, Associate, Mid-Senior level, Director, Executive
experienceLevel string ‘0-2’, ‘2-5’, ‘5-10’, ‘10+’ — one, or several as a comma string. · one of: 0-2, 2-5, 5-10, 10+, 5-10,10+, 2-5,5-10, 0-2,2-5
employmentType array of string Work types. Defaults to FULL_TIME. · one of: FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, OTHER
minEmployees number Minimum organisation headcount. · range 1–
maxEmployees number Maximum organisation headcount. · range 1–
industry array of string Only these organisation industries.
companies array of string Only these organisations, by name.
removeAgency boolean Exclude staffing agencies. Defaults to true. · default true
description string ANDed with query — it narrows.
remoteOnly boolean Only roles that can be done remotely.
withinDays number How far back to look. Searching is capped at 7 days — the supplier offers no fetch window between a week and six months. Counting reaches 30. The window used is always reported back as window. · default 7 · range 1–30
pool string ‘ats’ (default), ‘boards’, or ‘both’.

Example

{ "name": "count_jobs", "arguments": {
"query": "\"Director Strategic Sourcing\"",
"location": "United States",
"withinDays": 30
} }

Scored postings from the owner’s pipeline with score + written rationale. Filters: status, minScore, source. By default, matched postings scoring below their search’s score threshold are omitted and COUNTED in hiddenBelowThreshold — when that count is non-zero, the list is not the whole pipeline. Pass includeBelowThreshold: true to see them, each marked belowThreshold. view: “pursuing” returns instead the Pursuing screen: every job between Pursue and Applied with its stage (queued → drafted → reviewed → final → applied, derived from the studio session and the documents), its one primary action, and its artifacts.

Argument Type Notes
view string The Pursuing screen (stage + one action per job in flight). · one of: pursuing
status string Pipeline column to filter to.
minScore number Only matches scoring at least this. · range 0–10
source string ingest = saved with the browser extension. · one of: ingest, fantastic, fantastic-ats
includeBelowThreshold boolean Also return matched postings scoring below their search’s score threshold, marked belowThreshold: true.

Example

{ "name": "list_matches", "arguments": {
"status": "matched",
"minScore": 7
} }

Full posting detail: JD, score+rationale (with flags.lean — leader/doer/analyst shares of what the posting is buying, read from the responsibilities; it never moves the score), history, notes, artifacts.

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.

Example

{ "name": "get_job", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b"
} }

Move a posting through the pipeline (matched→pursuing→tailored→applied→screening→interviewing→offer→closed_*, dismissed↔matched). screening = a recruiter screen or phone call; it is optional (applied→interviewing is legal). Two axes, one column: closed_lost = rejected, closed_withdrawn = withdrawn, closed_won = accepted, and the stage reached before closing is read from the history (get_board returns it as reached). Illegal transitions are rejected by the server; closed stays closed.

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.
status (required) string matched | pursuing | tailored | applied | screening | interviewing | offer | closed_won | closed_lost | closed_withdrawn | dismissed
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "set_job_status", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b",
"status": "pursuing",
"confirm": true
} }

Rate a posting with a reason code AND a free-text note — the note tunes future scoring. Reasons: wrong_location, wrong_level, wrong_industry, comp_too_low, reputation, not_interested, good_fit, other.

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.
reasonCode (required) string Why this rating. Feeds future scoring. · one of: wrong_location, wrong_level, wrong_industry, comp_too_low, reputation, not_interested, good_fit, other
note string Free text. The note itself tunes future scoring — worth writing.

Example

{ "name": "rate_job", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b",
"reasonCode": "good_fit",
"note": "Strong platform scope; comp in range."
} }

Queue a ONE-SHOT provenance-guarded tailored resume for a posting: the whole document is rewritten in the background and the artifact lands in the app. Returns an operation id; poll get_operation. When the user wants to see and decide each change, use the STUDIO instead: open_tailoring_session → review_tailoring_session → get_tailoring_session (read the proposals) → decide_tailoring → build_tailored_resume. The studio and this tool produce the same artifacts under the same guards; the studio applies nothing the user did not accept.

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "tailor_resume", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b",
"confirm": true
} }

Apply the author’s review decisions to the latest tailored draft (approve-and-decline). A finished tailor’s get_operation result carries triage: posting phrases the draft does not use, each verdict-sorted (supported / judgement / unsupported) with evidence from the record, a suggestion, and — when there is a real limit — a caution naming what must NOT be claimed (show it beside the item; it binds the revision too). Pass one decision per item id — approve or decline, optionally with the author’s own wording. Only supported/judgement items can be approved; unsupported items are the honest gap list and cannot be worked in. Returns an operation id; poll get_operation. The result lists declined (changes refused as untruthful — a correct outcome), unauthorizedChanges (model edits outside the approved scope, reverted), and changedLines (what actually changed). Every unchanged line ships byte-identical.

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.
decisions (required) array of object One per triage item the author reviewed: {id, action: approve|decline, wording?}.
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "revise_tailored", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b",
"decisions": [
{
"id": "t1",
"action": "approve",
"wording": "Led supplier consolidation across 14 vendors."
},
{
"id": "t2",
"action": "decline"
}
],
"confirm": true
} }

Every tailoring-studio session on the account, newest first: job, status (new | reviewing | reviewed | built), master version, decided/proposal counts, and the built artifact id when there is one.

Argument Type Notes

Open (or return) the tailoring-studio session for a job. Starts from the master version marked exemplar, else the latest; pass resumeId (from list_resumes) to start from another version — that REPLACES an existing session on a different version, discarding its proposals and decisions. Returns the session: sections as numbered lines (index, text, role), proposals (empty until reviewed), decisions, the job, and the master. Refuses (409) a job with no stored description or an account with no master. Next: review_tailoring_session.

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.
resumeId string Optional master version id to start from (list_resumes → versions).

Example

{ "name": "open_tailoring_session", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b"
} }

The full studio session for a job: session.sections[] each with lines[] ({index, text, role}) and suggestions[] ({id, kind: reword|add, lineIndex, original, proposed, reason, postingTerms, source, guard: {ok, reason}, styleNotes}) — a suggestion with guard.ok false was HELD BACK by the no-fabrication guards and cannot be accepted; show it with its reason. Also session.analysis (posting signal, verified terminology aliases, headline.proposed, layout[] recommendations — only a section-order one can be applied for the user), session.decisions, session.lineOverrides, session.build after a build, progress, activeOperation while a review or build runs, and latestOperation. Read this after review_tailoring_session finishes, then walk the proposals WITH the user before calling decide_tailoring.

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.

Example

{ "name": "get_tailoring_session", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b"
} }

Queue the studio review: one posting analysis (key terms, requirements, verified terminology aliases; on the user’s own model also layout recommendations and a headline), then every section reviewed line by line and role by role, each proposal checked against the record before it is shown. Returns an operation id; poll get_operation until done, then get_tailoring_session. Optional sections (indexes) re-reviews only those; force re-runs the posting analysis too. Refuses (409) while a review or build is already running.

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.
sections array of integer Section indexes to (re-)review. Omit for all.
force boolean Re-run the posting analysis and layout advice as well.
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "review_tailoring_session", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b",
"confirm": true
} }

Save the user’s decisions on a reviewed session. decisions: one per proposal id — accept, decline, or edit with the user’s own text. lineOverrides: the user’s own wording (text) for ANY line, or omit: true to leave a line out of this draft (the master is never changed). headline: original | proposed | custom (+ text). sectionOrder: every section title exactly once, or null to restore the master’s order. layoutDecisions: accept/decline a recommendation id (accepting a section-order one applies it). Every piece of user wording is checked against the record as it lands — dates, figures, every number on the line, traceability — and anything refused comes back in rejected with the reason and is NOT saved; tell the user why. A proposal the user does not decide is not applied. Refuses (409) while a review is running. Returns the updated session and progress.

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.
decisions array of object Proposal decisions: {id, action: accept|decline|edit, text?}.
lineOverrides array of object Per-line overrides: {sectionIndex, lineIndex, text?, omit?}.
headline object
sectionOrder array,null Every section title exactly once, or null for the master’s order.
layoutDecisions array of object Layout recommendation decisions: {id, action: accept|decline}.

Example

{ "name": "decide_tailoring", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b",
"decisions": [
{
"id": "s1",
"action": "accept"
},
{
"id": "s2",
"action": "edit",
"text": "- Led supplier consolidation across 14 vendors, saving $4.8M."
},
{
"id": "s3",
"action": "decline"
}
],
"lineOverrides": [
{
"sectionIndex": 1,
"lineIndex": 7,
"omit": true
}
],
"headline": {
"action": "proposed"
},
"layoutDecisions": [
{
"id": "l1",
"action": "accept"
}
]
} }

Build the document from the session’s decisions: composed by code (undecided proposals are NOT applied), every changed line re-verified, rendered into the user’s own Word file when the master is a .docx, stored as the same artifacts a one-shot tailor produces (tailored resume + optional cover letter), scored, and the job moved to Tailored. Refuses (422) with problems naming any line that cannot be traced to the record — fix those with decide_tailoring first. Returns an operation id; poll get_operation (kind tailor_build); the artifact ids are in its result and get_tailored_document reads them back as text.

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.
coverLetter boolean Also write a matching cover letter (default true).
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "build_tailored_resume", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b",
"coverLetter": true,
"confirm": true
} }

Start over: delete a job’s studio session (its proposals and decisions). Documents already built stay on the job.

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "discard_tailoring_session", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b",
"confirm": true
} }

Queue an interview prep packet (research brief, themes, STAR stories, draft-only outreach).

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "get_prep_packet", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b",
"confirm": true
} }

Kanban board snapshot: cards per live status; applied cards carry days-since-applied aging (followUp.due at 5+ days with nothing back). Closed applications are NOT in the columns — closed lists them with outcome (rejected | withdrawn | accepted) and reached (the stage before closing: applied | screening | interviewing | offer), and outcomes is the tally (stillOpen, rejected, withdrawn, accepted, daysToHearBack, answeredShare, appliedEver).

Argument Type Notes

Move a board card to another column. Identical to set_job_status; provided so board-centric agents find it.

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.
toStatus (required) string Destination column.
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "move_card", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b",
"toStatus": "applied",
"confirm": true
} }

Saved searches with stored query translation and warnings.

Argument Type Notes

Create a saved search that scans automatically from now on, scores every result against the owner’s rubric, and applies their exclusion lists. This — not search_jobs — is the tool that carries the full filter set. Set location and a level filter unless the user genuinely wants worldwide, all-levels results — an unfiltered saved search spends money on every run for roles the candidate cannot take. COVERAGE: each run fetches up to 100 postings per source (career sites and job boards separately), and only those added since the previous run — so a saved search keeps up with a busy query over time rather than sampling it, which a single one-off search cannot do. Use count_jobs to size a query first: if it matches far more per run than the cap, narrow it or shorten the cadence.

Argument Type Notes
name (required) string What to call this search in the app.
query string Boolean title search. A comma separates alternatives (reads as OR).
location string e.g. “United States”, “Charlotte, NC”. Omitted means worldwide, which costs more.
seniority array of string LinkedIn vocabulary: Internship, Entry level, Associate, Mid-Senior level, Director, Executive. Boards pool only; the ATS pool ignores it, so pair it with experienceLevel. · one of: Internship, Entry level, Associate, Mid-Senior level, Director, Executive
experienceLevel string Years of experience: ‘0-2’, ‘2-5’, ‘5-10’, ‘10+’ — one, or several as an array or comma string (‘5-10,10+’). The ONLY level filter the ATS pool honours; a saved search without it collects junior roles from career sites on every run. · one of: 0-2, 2-5, 5-10, 10+, 5-10,10+, 2-5,5-10, 0-2,2-5
employmentType array of string FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, OTHER. Defaults to FULL_TIME. · one of: FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, OTHER
minEmployees number Minimum organisation headcount. · range 1–
maxEmployees number Maximum organisation headcount. · range 1–
industry array of string Organisation industries to include
companies array of string Only these organisations, by name (filtered at the supplier).
excludeCompanies array of string Drop these organisations. Stacks on top of the owner’s standing lists.
excludeTitles array of string Drop postings whose title contains any of these. Stacks on top of the owner’s list. Direct-sourcing titles are the classic case.
removeAgency boolean Exclude staffing agencies. Defaults to true. · default true
excludeAtsDuplicates boolean Job-board pool only: drop board rows the supplier already matched to an ATS posting. Defaults to true: the duplicate is filtered before it is paid for, which matters on a search that runs on a schedule. · default true
description string Boolean matched against the job description. ANDed with query — it NARROWS the search. Do not repeat the title terms here; that intersection is usually empty. Omit query entirely for a description-only sweep. One of query or description is required — a search with neither would fetch the whole market.
remoteOnly boolean Only roles that can be done remotely.
scoreThreshold number Only surface matches scoring at least this. · default 7 · range 0–10
cadenceHours number Hours between scans (default 6; 24 = daily). The response echoes the STORED value — verify it there.
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "create_search", "arguments": {
"name": "VP Engineering — remote, US",
"query": "\"VP Engineering\" OR \"VP of Engineering\"",
"location": "United States",
"experienceLevel": "5-10,10+",
"excludeTitles": [
"recruiter"
],
"remoteOnly": true,
"scoreThreshold": 7,
"cadenceHours": 24,
"confirm": true
} }

Pause or resume a saved search. Pausing preserves the scan watermark; searches are never deleted.

Argument Type Notes
searchId (required) string Saved-search id, from list_searches.
active (required) boolean true resumes, false pauses. The scan watermark survives either way.
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "pause_search", "arguments": {
"searchId": "a1f4d8e2-6b3c-4d97-9e05-7f8a9b0c1d2e",
"active": false,
"confirm": true
} }

The outcome of something you queued — tailor_resume, get_prep_packet or a score. Those tools return an operation id and nothing else, so without this an agent can START work it can never observe: no way to tell finished from failed, and no way to read the result. Poll this until status is done or error. A finished TAILOR returns unevidenced — what the posting asks for that the record does not evidence. Show that list to the user: the draft never claims those things, and they are the fastest guide to what is worth adding to the accomplishment bank. A finished tailor also names its renderer: into-master means the .docx was rendered into the user’s own Word file (their fonts, margins, numbering); mirrored means the generic layout, with rendererFallbackReason saying why — tell the user when masterIsDocx is true, because their formatting was not applied. A finished tailor also carries triage (feed revise_tailored), verbatimSections with verbatimReasons (which sections kept the user’s own words and WHY — a deliberate skip, the time budget, or the failure; tell the user the reason, not just the name), the tally tailoredSections / skippedSections / failedSections with degraded: true whenever any section failed (a partly-tailored draft must never be presented as fully tailored; a run where nothing could be tailored is an error, retryable, not a done), styleNotes (advisory style observations, never blocking), orientation (what the posting is buying — leader / doer / analyst — vs what the draft reads as; order and emphasis only, a mismatch is a flag not a defect), and strategy (single-pass = one whole-resume call on the user’s own model; chunked = per-section, with strategyFallbackReason when a single pass fell back). A finished REVISE carries declined, unauthorizedChanges, and changedLines — show declined to the user: those are changes refused as untruthful, which is the guard working. A finished STUDIO REVIEW (kind tailor_review) carries the tally reviewed / suggestions / heldBack / layout and layoutSkipped when layout advice did not run; the proposals themselves are read with get_tailoring_session. A finished STUDIO BUILD (kind tailor_build) carries artifactId, coverLetterArtifactId, changedLines (the receipt of what the author accepted), unevidenced, triage, scorecard, renderer, and studio: true.

Argument Type Notes
operationId (required) string The id returned when the work was queued.

Example

{ "name": "get_operation", "arguments": {
"operationId": "c3d5e7f9-1a2b-4c6d-8e0f-2a3b4c5d6e7f"
} }

The accomplishment bank: the record tailoring draws on ALONGSIDE the master resume. A tailored resume may only use figures that appear here or in the master, verbatim — so this is also the list of figures that can legally appear in a draft.

Argument Type Notes

Add accomplishments to the bank. APPENDS — existing entries are never replaced, and duplicates are skipped, so this is safe to call repeatedly. Widening the bank is the single most effective way to improve tailored resumes: tailoring can only rearrange what it has been given, and a master resume is one compressed snapshot of a career. Keep figures EXACTLY as the user states them ($4.8M stays $4.8M) — a reworded number is unusable, because the provenance guard matches verbatim. One accomplishment per entry. The response reports what was added, skipped and dropped. For a whole LinkedIn history, the app takes the export zip directly under Profile.

Argument Type Notes
bank (required) array of string Accomplishments to add, ONE PER ARRAY ELEMENT, figures verbatim — e.g. [“Negotiated $4.8M savings, 20% on $24M of capital equipment spend.”, “Cut sourcing cycle time 38% across a $40M program.”]. Pass a real JSON array, not a quoted string. A newline-separated string is also accepted (one accomplishment per line). Commas NEVER separate entries — a comma is punctuation inside an accomplishment, so never pre-split on it.

Example

{ "name": "add_accomplishments", "arguments": {
"bank": [
"Negotiated $4.8M savings, 20% on $24M of capital equipment spend.",
"Cut sourcing cycle time 38% across a $40M program."
]
} }

Edit a saved search: its query, cadence, threshold, or any filter. Send ONLY what you want to change — every filter you do not mention is preserved. (The underlying API replaces the filter object wholesale, so this tool reads the stored search and merges; a client that rebuilt that object from its own inputs would silently DELETE every filter it did not know about.) Use pause_search to stop or resume one; this is for changing what it seeks.

Argument Type Notes
searchId (required) string Saved-search id, from list_searches.
name string Rename the search.
query string Boolean title search. Replaces the existing query.
location string e.g. ‘United States’. Empty string means worldwide.
description string Boolean matched against the description. NARROWS.
experienceLevel string ‘0-2’, ‘2-5’, ‘5-10’, ‘10+’, or a comma list.
seniority array of string Job-board levels.
employmentType array of string Work types.
industry array of string Organisation industries.
companies array of string Only these organisations.
excludeCompanies array of string Drop these organisations.
excludeTitles array of string Drop these title substrings.
minEmployees number Minimum headcount. · range 1–
maxEmployees number Maximum headcount. · range 1–
remoteOnly boolean Only roles that can be done remotely.
removeAgency boolean Exclude staffing agencies.
scoreThreshold number Surface floor. · range 0–10
cadenceHours number Hours between scans.
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "update_search", "arguments": {
"searchId": "a1f4d8e2-6b3c-4d97-9e05-7f8a9b0c1d2e",
"location": "United States",
"excludeTitles": [
"recruiter",
"staffing"
],
"confirm": true
} }

Run a saved search immediately instead of waiting for its cadence. Optionally reach further back than the watermark with backfillHours (max 168 = 7 days) to pick up postings from before the search existed. A paused search is refused — resume it first.

Argument Type Notes
searchId (required) string Saved-search id, from list_searches.
backfillHours number Look back this many hours instead of since the last run. Max 168. · range 1–168
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "run_search_now", "arguments": {
"searchId": "a1f4d8e2-6b3c-4d97-9e05-7f8a9b0c1d2e",
"backfillHours": 48,
"confirm": true
} }

Why is a search returning nothing? Per search and per source: the last run, how many postings came back, how many were new, whether the run failed and why, and the COMPILED query the supplier actually received. This is the tool for diagnosing a quiet search — an empty result and an impossible query look identical from outside, and the compiled expression is what tells them apart.

Argument Type Notes

Re-score ONE posting against the current rubric. Use after the questionnaire or exclusion lists change, or when a score looks wrong. Returns an operation id — poll get_operation.

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "rescore_job", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b",
"confirm": true
} }

Attach a note to a posting — a recruiter conversation, a referral, why it was interesting. Notes are first-class: they are what the owner reads later, when the score has stopped being the interesting part.

Argument Type Notes
jobId (required) string Job id, from list_matches or get_board.
note (required) string The note text.

Example

{ "name": "add_job_note", "arguments": {
"jobId": "b7e2c4d1-9f3a-4e58-8a06-1c2d3e4f5a6b",
"note": "Recruiter called — onsite loop scheduled for Tuesday."
} }

Record an application made OUTSIDE Jobably — through a recruiter, a referral, or a company site. Creates the board card if the posting is not already tracked. Idempotent: declaring the same role twice does not duplicate it.

Argument Type Notes
company (required) string Employer name.
title (required) string Role title.
url string Posting URL, if known.
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "declare_applied", "arguments": {
"company": "Globex",
"title": "VP Operations",
"url": "https://boards.example.com/987",
"confirm": true
} }

The two standing exclusion lists: fit (poor-fit employers, which the rubric could in principle learn) and reputation (vetoes that apply regardless of role). These shape every search and every score, so read them before concluding a search is behaving oddly.

Argument Type Notes

REPLACES both exclusion lists. Call get_exclusions first and send the complete lists including everything being kept — a partial call silently drops the rest. The two are different: fit is about match quality, reputation is a veto that applies whatever the role.

Argument Type Notes
fit (required) array of string Poor-fit employers. Complete list.
reputation (required) array of string Reputation vetoes, independent of role. Complete list.
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "set_exclusions", "arguments": {
"fit": [
"Acme Staffing"
],
"reputation": [
"BadCo Industries"
],
"confirm": true
} }

Master resume versions and every tailored artifact produced so far, with the job each belongs to. Use it to tell the owner what already exists before spending tailor quota producing it again.

Argument Type Notes

Everything queued or recently finished — tailoring, prep packets, scoring — with status and any failure reason. Check here before starting metered work: what the user asked for may already be running.

Argument Type Notes

READ a tailored resume, cover letter or prep packet as text. list_resumes gives you the artifact ids. This is what makes a draft reviewable: without it you can hand the owner a download link but cannot see what was produced, so you can neither critique it nor help them check it. ALWAYS read the draft before telling anyone it is ready — and read the gap list from get_operation alongside it. The guards stop the draft inventing figures; they cannot stop it being badly aimed, or carrying a credential from another industry onto this application.

Argument Type Notes
artifactId (required) string Artifact id, from list_resumes or get_job.

Example

{ "name": "get_tailored_document", "arguments": {
"artifactId": "d4e6f8a0-2b3c-4d5e-9f01-3c4d5e6f7a8b"
} }

The parsed master resume: name, headline, contact and every section, as stored. This is the record tailoring mirrors — sections come out in this order, under these titles — so read it to understand why a draft is shaped the way it is, and to see what the record does NOT contain before promising it can.

Argument Type Notes

Mark a resume version as an EXEMPLAR, or unmark it. Exemplars are loaded into the tailoring prompt as a style reference, so this is the direct lever on how future drafts read. Mark the versions the owner considers their best work, not the most recent — and only ones they have actually reviewed.

Argument Type Notes
resumeId (required) string Resume version id, from list_resumes.
isExemplar (required) boolean true marks it, false unmarks it.
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "mark_exemplar", "arguments": {
"resumeId": "e5f7a9b1-3c4d-4e6f-a012-4d5e6f7a8b9c",
"isExemplar": true,
"confirm": true
} }

Delete a tailored artifact. The posting, its score and its history are untouched — only the generated document goes. Use it to clear a draft the owner rejected so the next one is unambiguous.

Argument Type Notes
artifactId (required) string Artifact id, from list_resumes.
confirm (required) boolean Must be true. Required because this spends quota or changes state — ask the user first.

Example

{ "name": "delete_tailored_document", "arguments": {
"artifactId": "d4e6f8a0-2b3c-4d5e-9f01-3c4d5e6f7a8b",
"confirm": true
} }

What has this cost me? Cycle usage vs plan quotas + estimated spend.

Argument Type Notes
URI Contents
jobably://resume/master Latest master resume, parsed structure
jobably://board Current board snapshot

Tool failures come back as tool results with isError: true and a readable message (quota exceeded, illegal transition, missing confirm) — read them rather than retrying blindly. Protocol-level errors (unknown tool, bad auth) are JSON-RPC errors.

Built v1.1.0 · 1d03d44 · 2026-09-18 16:30 UTC