Tool reference
Generated from the running tool registry, so this page always matches what the server actually accepts.
Passing arguments correctly
Section titled “Passing arguments correctly”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.
confirmis the booleantrue, 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 —
jobIdfromlist_matches,searchIdfromlist_searches,operationIdfrom the tool that queued the work. Never invent one. update_searchmerges: 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 | — |
search_jobs
Section titled “search_jobs”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} }count_jobs
Section titled “count_jobs”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} }list_matches
Section titled “list_matches”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} }get_job
Section titled “get_job”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"} }set_job_status
Section titled “set_job_status”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_job
Section titled “rate_job”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."} }tailor_resume
Section titled “tailor_resume”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} }revise_tailored
Section titled “revise_tailored”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} }list_tailoring_sessions
Section titled “list_tailoring_sessions”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_tailoring_session
Section titled “open_tailoring_session”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"} }get_tailoring_session
Section titled “get_tailoring_session”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"} }review_tailoring_session
Section titled “review_tailoring_session”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} }decide_tailoring
Section titled “decide_tailoring”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_tailored_resume
Section titled “build_tailored_resume”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} }discard_tailoring_session
Section titled “discard_tailoring_session”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} }get_prep_packet
Section titled “get_prep_packet”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} }get_board
Section titled “get_board”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_card
Section titled “move_card”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} }list_searches
Section titled “list_searches”Saved searches with stored query translation and warnings.
| Argument | Type | Notes |
|---|
create_search
Section titled “create_search”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_search
Section titled “pause_search”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} }get_operation
Section titled “get_operation”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"} }list_accomplishments
Section titled “list_accomplishments”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
Section titled “add_accomplishments”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." ]} }update_search
Section titled “update_search”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_search_now
Section titled “run_search_now”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} }get_search_health
Section titled “get_search_health”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 |
|---|
rescore_job
Section titled “rescore_job”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} }add_job_note
Section titled “add_job_note”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."} }declare_applied
Section titled “declare_applied”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} }get_exclusions
Section titled “get_exclusions”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 |
|---|
set_exclusions
Section titled “set_exclusions”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} }list_resumes
Section titled “list_resumes”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 |
|---|
list_operations
Section titled “list_operations”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 |
|---|
get_tailored_document
Section titled “get_tailored_document”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"} }get_master_resume
Section titled “get_master_resume”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_exemplar
Section titled “mark_exemplar”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_tailored_document
Section titled “delete_tailored_document”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} }get_usage
Section titled “get_usage”What has this cost me? Cycle usage vs plan quotas + estimated spend.
| Argument | Type | Notes |
|---|
Resources
Section titled “Resources”| URI | Contents |
|---|---|
jobably://resume/master |
Latest master resume, parsed structure |
jobably://board |
Current board snapshot |
Errors
Section titled “Errors”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

