job-tracker
Optional Gmail integration that searches the user's inbox for recruiter emails, scans for updates on tracked job applications, and drafts/sends replies through five dedicated tools.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@job-trackerWhich applications are still waiting for a response?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Job Search Assistant — MCP Server
A local Model Context Protocol server that lets Claude read and update your job-search spreadsheets through natural conversation — "what's still awaiting a response after 2 weeks?", "add this posting to my tracker", "mark the Amazon role as interviewing", "add a Salary Range column and set it to 180-210k for the Amazon role", "what remote leads did I find this week?", "promote the Acme Corp lead to my tracker".
It manages a funnel — discover → apply → track — plus an interview-prep note:
File | Role | Env var |
| Applications you've submitted (the tracker) |
|
| Leads you've found but not yet applied to (discovery) |
|
| Rolling interview Q&A reference (prep) |
|
| Folder for generated resumes / cover letters, saved and printed from |
|
| Stable resume facts that |
|
promote_to_tracker turns a discovery lead into a tracked application; save_document
and print_document write generated docs to the Resumes\ folder and print them. An
optional Gmail integration (five tools) searches your inbox for recruiter mail,
scans for updates on tracked roles, and drafts/sends replies — see Gmail integration.
Runtime: Node.js + TypeScript
Transport: stdio (local process — no networking, no auth)
Data source: your
.xlsxfiles, read/written with SheetJS (xlsx)Schema: dynamic — driven by each sheet's header row (custom columns supported)
Printing: silent PDF printing via
pdf-to-printer(bundles SumatraPDF);.docxis converted to PDF first using LibreOffice or Microsoft WordClient: Claude Desktop or Claude Code (see config below)
Build
cd mcp-job-tracker
npm install
npm run buildThis produces dist/index.js. npm install also pulls pdf-to-printer, which
bundles SumatraPDF for silent PDF printing (no separate install). Printing
.docx additionally requires LibreOffice or Microsoft Word for the
docx→PDF conversion step; PDFs need neither. Keeping the discovery sheet's
formatting on MCP writes uses Python + openpyxl (scripts/format_discovery.py);
optional — writes still succeed without it. generate_resume needs Python +
python-docx (scripts/gen_resume.py) plus LibreOffice (matches the
existing resumes' look) for its PDF step. read_document uses Python +
pypdf (PDFs) and python-docx (docx) via scripts/extract_text.py. The
optional Gmail tools need a one-time npm run gmail:auth (see Gmail integration).
Related MCP server: quantjobs
Configure Claude Desktop
Open Claude Desktop's config file (Windows):
%APPDATA%\Claude\claude_desktop_config.jsonAdd a job-tracker server entry (create the file / mcpServers object if needed):
{
"mcpServers": {
"job-tracker": {
"command": "node",
"args": ["C:\\Users\\developer\\mcp-job-tracker\\dist\\index.js"],
"env": {
"JOB_TRACKER_FILE": "C:\\Users\\developer\\Documents\\Job_Tracking.xlsx",
"JOB_DISCOVERY_FILE": "C:\\Users\\developer\\Documents\\Job_Search_Discovery.xlsx",
"JOB_INTERVIEW_PREP_FILE": "C:\\Users\\developer\\Documents\\Interview_Prep_QA.md",
"JOB_RESUMES_DIR": "C:\\Users\\developer\\Documents\\Resumes"
}
}
}
}Restart Claude Desktop. You should see the job-tracker tools appear. If
JOB_TRACKER_FILE is omitted, the server defaults to
<home>\Documents\Job_Tracking.xlsx. If JOB_DISCOVERY_FILE,
JOB_INTERVIEW_PREP_FILE, or JOB_RESUMES_DIR are omitted, they default to
Job_Search_Discovery.xlsx, Interview_Prep_QA.md, and a Resumes\ folder
sitting **next to** the tracker file. **Claude Code** uses the same entry under
mcpServers in ~/.claude.json.
Moving to another machine
The server is portable (plain Node stdio — Windows or macOS). To set it up on a new machine:
Copy this project folder over (you can skip
node_modulesanddist).Copy your
Job_Tracking.xlsxto the new machine.Make sure Node.js 18+ is installed (
node --version).Run the installer, pointing it at your spreadsheet:
node setup.mjs "C:\\path\\to\\Job_Tracking.xlsx" # Windows node setup.mjs "/Users/you/Documents/Job_Tracking.xlsx" # macOSIt installs deps, builds, backs up the existing Claude Desktop config, and wires in the
job-trackerentry with paths correct for that machine. Omit the path to default to<home>/Documents/Job_Tracking.xlsx. Flags:--no-build(reuse a copieddist/),--bare-node(usenodefrom PATH instead of an absolute node path).Fully quit and restart Claude Desktop.
Tools
Tool | What it does |
| List all rows. Optional filters: |
| Full details for one application, matched by |
| Append a new row. |
| Update |
| Edit any field(s) of a row matched by |
| Permanently remove a row matched by |
| Rows still Awaiting Response or Applied whose Date Applied is more than |
| Rows whose Next Follow-Up date is due — on/before today, or within the next |
| Case-insensitive substring search across Company, Position, and Notes. |
| (stretch) Drafts a short, professional follow-up email for a role, referencing time since applying and the resume version used. Draft text only — it does not send anything. |
| Add a new custom column at the end of the sheet. Optional |
| Rename a custom column ( |
| Remove a custom column, shifting the columns to its right left (like Excel's Delete Column). Refuses on the base columns. |
Discovery-sheet tools (Job_Search_Discovery.xlsx)
Tool | What it does |
| List leads. Optional filters: |
| Append a lead. |
| Edit a lead matched by |
| Remove a lead matched by |
| Copy a lead into the tracker as an application — maps Company/Position/Job Link/Location, sets Status Applied and Date Applied today (both overridable), and folds Salary + Match Assessment into Notes. Refuses to create a duplicate tracker row. Optional |
Interview-prep tools (Interview_Prep_QA.md)
Tool | What it does |
| Return the prep file as text, or just one company's section with the optional |
| Append markdown under a |
Document tools (Resumes\)
Tool | What it does |
| **Generate a tailored resume PDF (or docx) host-side and save it to |
| Save a |
| Silently print a saved file (name in |
| Extract the plain text of a saved |
| Read any plain-text file ( |
| List saved resumes / cover letters in the |
| Delete a document from the |
| Show the shape of |
| Read one field from |
| Update one existing field in |
Gmail tools (optional — require one-time auth)
Tool | What it does |
| Search your Gmail for job-related mail by |
| Read one message's full body by its |
| Scan recent Gmail for updates relevant to your tracked applications — optional |
| Save a Gmail draft — reply within a |
| Sends immediately and cannot be recalled. Refuses unless |
Until Gmail is authorized (see Gmail integration below), all five return a clear "authorize first" error.
Spreadsheet schema
Both workbooks use a dynamic schema — the columns are driven by each sheet's actual header row, and the read/write engine is schema-agnostic (a sheet is just a spec: file path, required columns, which columns are dates, and the match keys).
Tracker (Job_Tracking.xlsx)
The ten base columns below must always be present (the tools match, filter, and compute dates on them) and are protected from rename/delete:
Company | Position | Job Link | Location | Resume Version | Contact/Referral | Date Applied | Status | Next Follow-Up | NotesAny custom columns you add beyond these are first-class:
They appear in
list_jobs/get_joboutput automatically.You set them per job with the
extra_fieldsargument ofadd_jobandupdate_job, e.g.extra_fields: { "Salary Range": "180-210k" }(an empty string clears the value).You add / rename / remove them with
add_column,modify_column, anddelete_column.
Custom columns are stored as text. The two base date columns (Date Applied, Next Follow-Up) are the ones stored as Excel date serials.
Managing columns
// add a column, pre-filled on every existing row
add_column { "name": "Salary Range", "default_value": "TBD" }
// rename it and/or overwrite every row's value
modify_column { "name": "Salary Range", "new_name": "Comp", "fill_value": "Confidential" }
// remove it (shifts later columns left, like Excel)
delete_column { "name": "Comp" }Conventional Status values: Applied, Awaiting Response,
Informal - Referral Sent, Interviewing, Offer, Declined, Withdrawn,
Closed - No Longer Available. (The field is free text — these are just the
values suggested to Claude.)
Discovery (Job_Search_Discovery.xlsx)
The base columns, in order:
Date Found | Company | Position | Location (Remote/Hybrid) | Salary | Salary Confidence (Confirmed/Estimated) | Job Link | Source (Company Careers Page/LinkedIn/Aggregator) | Posted Date / Days Since Posted | Known Gap Flag | Match Assessment | StatusAll discovery values are stored as text (including Date Found, kept as an
ISO YYYY-MM-DD string — no date-serial conversion). Rows are matched by
Company + Position. Set columns through the fields argument of
discovery_add / discovery_update; Company and Position have their own
parameters. Status on new leads defaults to Open.
The column-management tools (add_column etc.) operate on the tracker; the
discovery sheet is managed through its own row tools.
Formatting: the discovery sheet is also written by the daily 11 AM task
(Python + openpyxl, with bold header / frozen row / auto-filter / clickable
links). Because SheetJS (used by the MCP tools) doesn't re-serialize that rich
styling, every MCP discovery write is followed by a best-effort openpyxl
reformat pass (scripts/format_discovery.py) that re-applies the standard
formatting — so MCP edits and the daily task keep the file looking the same.
Requires Python + openpyxl; if absent, the write still succeeds (the tool
returns formatted: false) and the next daily run restores styling.
Interview prep (Interview_Prep_QA.md)
A plain-markdown reference — not a spreadsheet — organised as:
# Interview Prep — Q&A Reference
## Company — Role
**Q: ...?**
A: ...
*Notes: ...*
---
## Next Company — Role
...append_interview_prep matches an existing ## Company section on the company
portion of the heading (the part before — Role), so appending "Acme Corp" lands
under ## Acme Corp — Engineering Manager. New sections are separated with ---.
Keep to the **Q: …** / A: … / optional *Notes: …* pattern when adding content.
If a bare company name matches more than one section (e.g. ## Acme Corp — Billing
and ## Acme Corp — Clinical), both read/append refuse and list the matches — pass
the full heading to disambiguate. An exact full-title match always wins over a
bare prefix, so a specific heading is never ambiguous.
Generating a tailored resume (generate_resume)
The recommended way to produce a resume — especially from Claude Desktop,
which can't write to arbitrary host paths. The model never emits the binary;
it emits tailored text, and the server renders the PDF host-side. The server's
MCP instructions tell connected clients to use this tool for resumes rather
than hand-rolling a python-docx/LibreOffice script or moving bytes through
base64, so it's the single resume path (scripts/gen_resume.py is the one
generator).
generate_resume {
"company": "Acme Corp",
"position": "Engineering Manager",
"summary": "…tailored SUMMARY paragraph for this posting…",
"key_qualifications": [
"…bullet tying real experience to this role…",
"…another alignment bullet…"
]
// optional: skills[], include_projects, format ("pdf"|"docx"), filename, overwrite
}Facts stay fixed. Employers, titles, dates, education, certs, and the base skills live in
resume_master.json; the model can't invent or drift them — it only supplies thesummaryandkey_qualificationsfor thiscompany+position. Edit your real facts inresume_master.json(a sibling of the tracker; override withJOB_RESUME_MASTER_FILE).Rendering merges master + tailoring →
.docxviascripts/gen_resume.py(python-docx, the measured spec: Liberation Serif, 20 pt name, ruled 11 pt headings, 0.63" margins, US Letter) → PDF via LibreOffice. ~15 s per resume.Output lands in
Resumes\(e.g.Dale-Magrath-Resume-Acme-Corp-Engineering-Manager.pdf), ready forprint_document. No base64, no download-then-move.Wired to tracking. The result carries a
nextStepwith the exact follow-up call, chosen from the sheets: brand-new company →add_job(as Applied, Resume Version set to the file), an existing discovery lead →promote_to_tracker, already tracked →update_jobto set the Resume Version. So tailor → save → apply → track is one Desktop flow — the model just offers the suggested step.
Why this beats base64: the tailored text is ~1 k tokens; the 55 KB PDF binary would be ~22 k. The model does the writing; the host does the rendering.
Rendering notes (why it's built this way)
Hard-won details worth keeping — changing them tends to reintroduce old bugs:
Role/date lines are a 2-column borderless table, not a tab stop. A tab with a right tab-stop spanning a bold title and italic dates in one paragraph triggered a LibreOffice PDF-export bug (ToUnicode CMap on subset fonts) that made the title extract as garbled characters in
pdftotext,pypdf, andpdfminer.six— even though it looked fine on screen (and could trip ATS parsers). The table renders identically and extracts cleanly in all three. Keep it a table.LibreOffice does the docx→PDF, not Word. LibreOffice subsets fonts → ~55 KB with Liberation Serif, matching the existing resumes. Word barely subsets (embedded ~1.1 MB of Calibri → a 258 KB PDF), so
convertDocxToPdfprefers LibreOffice and falls back to Word only if it's absent.2-page fit is by layout, never by truncation. A full experience history + 6-bullet Key Qualifications + Projects + Education + Skills lands on 2 pages with Honors & Awards off (opt in with
include_honors). If it ever runs long, the lever is tightening spacing (heading 12/5 pt, body 8 pt) — content is never silently trimmed to hit a page count.base64 is a last resort. The only resume ever saved through the base64 path came out corrupt (valid
%PDF/%%EOFbut a brokenstartxref). The leading-bytes check catches gross truncation, not subtle corruption — so prefergenerate_resume, orsave_documentwithsource_path, for anything binary.
Saving an already-generated document (Resumes\)
If a file already exists on disk (e.g. produced by the docx/pdf skill),
save_document puts it into Resumes\, and print_document sends it to a printer:
// Preferred: hand over a path to a file already written to disk.
save_document { "filename": "Dale-Resume-Acme-Corp.docx", "source_path": "C:\\Temp\\out.docx" }
print_document { "filename": "Dale-Resume-Acme-Corp.docx" } // default printer
print_document { "filename": "sample.pdf", "printer_name": "Office EPSON ET-3850 Series" }Always prefer
source_pathfor real documents.content_base64makes the model emit the whole file as base64 token-by-token — roughly 3 characters per token for binary formats, so a 53 KB resume is ~22 000 output tokens (several minutes), and a 134 KB PDF exceeds the response limit and can never finish.source_pathcosts ~30 tokens at any file size and can't corrupt the bytes. Inline base64 is therefore capped at 20 000 characters and fails immediately with a pointer tosource_path.
PDFs print directly via SumatraPDF (bundled with
pdf-to-printer); no dialog, single copy, default settings..docxis converted to a PDF next to it first — using LibreOffice (soffice --headless --convert-to pdf) if installed, otherwise Microsoft Word via COM. The PDF is cached and reused while it's newer than the docx. If neither LibreOffice nor Word is available, printing a.docxreturns a clear error suggesting you save it as a PDF instead.print_documentconfirms the job was sent to the printer — not that it physically finished. Base64 transport is meant for small files (resumes, well under 1 MB), not large documents.
Gmail integration (optional)
The five Gmail tools let Claude search your inbox for recruiter mail, scan for updates on tracked applications, and draft/send replies — all against your own account. They're off until you authorize them; unauthorized calls return a clear error telling you what to run.
One-time setup (full walkthrough in GMAIL_SETUP.md):
Create a Google Cloud project, enable the Gmail API, and create a Desktop app OAuth client; download its JSON as
credentials.jsonin the project root (next topackage.json). This step is manual — it can't be scripted.Run the one-time consent flow:
npm run gmail:authIt opens Google's consent screen and saves the token to
gmail_token.json. The server refreshes it automatically afterward.Restart Claude Desktop so the tools load.
Config / files (both .gitignored):
File | Purpose | Env override |
| OAuth client (manual download) |
|
| Stored access/refresh token from consent |
|
Requested scopes are read-only + compose + send (gmail.readonly,
gmail.compose, gmail.send) — intentionally no mailbox modify/delete
access. npm install pulls the one dependency (google-auth-library).
Safety: search_gmail_for_job / read_gmail_message / scan_job_updates
are read-only; draft_gmail_reply only ever creates a draft; send_gmail_email
sends immediately and can't be undone, so it refuses without confirm: true
and should only be called after you've reviewed the exact to/subject/body.
Safety & behavior notes
Backups (rotating): every write first copies the file into a sibling
.backups\folder with a timestamped name (<file>.<YYYYMMDD-HHmmss-SSS>.bak), keeping the **last 10** per file. This replaces the old single-slot.bak, so repeated writes (manual edits or the daily task) can't clobber your last-good copy. Applies to the sheets, the prep file, anddelete_document;promote_to_trackerbacks up each file it writes. (Nothing is backed up when a file is created fresh.)Fresh reads: the workbook is re-read on every call, so edits you make directly in Excel are always reflected.
Validation: row-editing tools verify the row exists (and is unambiguous) before changing anything; bad dates are rejected up front.
promote_to_trackerrefuses to create a duplicate tracker row.Dates (tracker only) are stored as Excel date serials formatted
d-mmm-yy. New rows are written the same way, so2026-06-01shows as1-Jun-26— matching the existing rows. Reads/writes use timezone-free calendar-date math. Discovery dates are plain ISO text.Formatting preservation: new rows copy the number format (and, where the writer supports it, the cell style) of the last existing row, and column widths are preserved — the way a human copy-pasting a row would leave things.
Note: the open-source SheetJS build faithfully preserves number formats and column widths (what this workbook uses). Rich per-cell styling (custom fonts/fills/borders) is not re-serialized by the community build; if you later add heavy cell styling, preserving it would require SheetJS Pro.
File locked: if a file is open in another program (Excel for the sheets, Word/an editor for the prep
.md), writes fail with a clear "please close it" message rather than a cryptic error.
Testing
npm testtest-client.mjs builds the server, then spins it up over stdio against
self-contained fixtures in a temp folder and asserts on every tool (66
checks across the tracker, discovery, promote, interview-prep ambiguity,
document, and backup paths). Your real files are never touched — the suite
creates its own throwaway tracker/discovery/prep/Resumes in the OS temp dir and
deletes them afterward. It exits non-zero if any check fails.
It does not send a physical print job — print_document is covered only via
its error paths (missing file, unsupported type, unknown printer).
Available Tools
35 toolsadd_columnAdd columnA
Add a new custom column to the spreadsheet, appended after the last column. Optionally fill every existing job row with a default value. Refuses if a column with that name already exists. Backs the file up before writing. (Note: the built-in job tools only read/write the standard columns; custom columns are managed with these column tools.)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Header text for the new column. | |
| default_value | No | If given, written into this column for every existing job row. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses several key behaviors: appending after the last column, optional default-value filling, refusal on duplicate names, and file backup before writing. These details give the agent a clear understanding of side effects and failure conditions.
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 three sentences long, front-loaded with the primary action, and every sentence contributes unique information. There is no redundancy or filler, making it highly concise and well-structured.
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?
This is a simple tool with only two parameters and no output schema. The description covers purpose, behavioral rules, failure modes, and the relationship to sibling tools, making it fully self-contained and sufficient for correct use.
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 a baseline of 3 is appropriate. However, the description adds meaning beyond schema by explaining that default_value is written into every existing job row and that name uniqueness is enforced. This enriches the parameter semantics.
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 'Add a new custom column to the spreadsheet, appended after the last column' with a specific verb and resource. It distinguishes from sibling job tools by explicitly noting that job tools only handle standard columns and custom columns are managed with these column tools.
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 context about when to use this tool: for managing custom columns, as opposed to the built-in job tools which read/write standard columns. It also notes duplicate-name refusal, implicitly suggesting that a different tool (like modify_column) would be needed for existing columns, though it doesn't name the alternative explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_jobAdd jobA
Append a new job application row. Company and Position are required; all other fields are optional. Status defaults to "Awaiting Response" and Date Applied defaults to today if omitted. Use extra_fields to set any custom columns you've added. Backs the file up to .bak before writing.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | ||
| status | No | Status. Defaults to "Awaiting Response". | |
| company | Yes | Company name (required). | |
| job_link | No | URL of the job posting. | |
| location | No | ||
| position | Yes | Position / title (required). | |
| date_applied | No | Date applied (YYYY-MM-DD). Defaults to today. | |
| extra_fields | No | Values for custom columns you've added, as {"Column Name": "value"}. Each name must be an existing column (create it first with add_column). | |
| next_follow_up | No | Next follow-up date (YYYY-MM-DD). | |
| resume_version | No | Which resume version was used. | |
| contact_referral | No | Contact or referral name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses several behavioral traits: required fields, default values for status and date_applied, custom column handling via extra_fields, and backup creation before writing. It does not mention return values or error behavior, but the provided context 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 four concise sentences, front-loaded with the primary action and then covering defaults, custom fields, and backup behavior. Every sentence adds useful information with no redundancy.
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 mutation tool with 11 parameters, no output schema, and nested objects, the description covers the critical aspects: required fields, defaults, custom column usage, and backup safety. It does not describe return values or error handling, but the essential operational details are present.
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 82%, so the schema already documents most parameters. The description reinforces defaults and explains extra_fields, but does not add significant new meaning beyond what the schema descriptions already provide. 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 action ('Append a new job application row') and identifies the resource ('job application row'). It also specifies required fields (Company and Position), which helps distinguish it from update/delete/list operations.
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 implies this is for creating new job entries and mentions extra_fields for custom columns, but it does not explicitly state when to use this tool versus alternatives like update_job or delete_job. No exclusions or alternative references are given, leaving usage context implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_interview_prepAppend interview prepA
Append markdown to the interview-prep file under a company's section. Creates the file (with a top-level heading) and/or the company section if needed; otherwise adds to the existing section without duplicating its heading. Keep the file's style: 'Q: ...' / 'A: ...' pairs and optional 'Notes: ...' lines. Backs the file up before writing.
| Name | Required | Description | Default |
|---|---|---|---|
| company | Yes | Company name; matches an existing '## Company' section or creates one. | |
| content | Yes | Markdown to add under the company section (e.g. a Q/A pair and notes). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses key behavioral traits: creating the file and section as needed, avoiding duplicate headings, enforcing a markdown style, and backing up the file before writing. This is rich and useful for an agent.
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 three sentences, front-loaded with the primary action. Every sentence adds critical information (behavior, style, safety) without redundancy or 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 tool's simplicity (2 parameters, no output schema), the description covers all necessary aspects: what it does, file creation behavior, formatting conventions, and backup safety. It 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 coverage is 100% for both parameters, so the baseline is 3. The description adds value by specifying the expected markdown style ('**Q: ...**' / 'A: ...' pairs) and clarifying that content is appended under the company section, going beyond the 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 clearly states the action ('Append markdown'), the target resource ('the interview-prep file'), and the context ('under a company's section'). It distinguishes itself from sibling tools like read_interview_prep by specifying append behavior and file organization.
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 context on when the tool creates the file or section versus appending to existing ones, which effectively guides usage. However, it does not explicitly mention alternatives or exclusion criteria, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_columnDelete columnA
Permanently remove a custom column and shift the columns to its right left by one (like Excel's Delete Column). Refuses on the built-in columns and on a missing column. Backs the file up to .bak first.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Header text of the column to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden of behavioral disclosure. It explicitly states the operation is permanent, describes the column-shifting side effect, lists refusal conditions (built-in and missing columns), and mentions the backup to .bak. This is exemplary transparency for a destructive operation.
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 three sentences, each providing distinct value: purpose and behavior, failure conditions, and safety backup. No unnecessary words or repetition, and it is front-loaded with the core action.
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 simple single-parameter tool with no output schema, the description comprehensively covers what the tool does, how it affects the data, when it refuses, and what safety measure is taken. It is complete without being verbose.
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 has 100% coverage for the single 'name' parameter, which is already described as 'Header text of the column to delete.' The description adds no additional parameter-level meaning beyond 'custom column' in the purpose, so the baseline of 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 'permanently remove a custom column' and describes the specific behavior of shifting columns to the right left by one, using the Excel analogy for immediate understanding. This distinguishes it from sibling tools like add_column or modify_column.
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 implies usage through the Excel analogy and notes it refuses on built-in columns, but it does not explicitly state when to use this tool versus alternatives like modify_column or add_column. No direct when-not-to-use guidance beyond built-in columns is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_documentDelete documentA
Delete a saved document from the Resumes folder. Backs it up (to the rotating .backups folder) first so it can be restored, then removes it. Refuses a missing file or any path outside the Resumes folder.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | File name in the Resumes folder, e.g. "Old-Resume.pdf". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It transparently explains that a backup is made first, the file is then removed, and invalid inputs are refused. It does not mention return values on success/failure or backup failure handling, but the key behavioral traits are covered.
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?
Two sentences front-load the primary action and then add critical safety/backup details. Every sentence earns its place with no repetition of schema information.
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 deletion tool with no output schema and no annotations, the description adequately covers purpose, safety, and backup. It omits details about return values or error responses, but these are less critical for such a simple operation.
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 has 100% coverage for the single parameter, and the schema description already states the filename is in the Resumes folder. The tool description reinforces that paths outside the folder are refused, which adds a little context, but overall it does not significantly go 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 clearly states 'Delete a saved document from the Resumes folder' with a specific verb and resource. It distinguishes itself from sibling document tools (list, read, save, print) by focusing on deletion and exclusively referencing the Resumes folder.
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 context is clear: the tool is for deleting saved documents in the Resumes folder, and it adds a safety note about refusing paths outside that folder. However, it does not explicitly mention when to prefer this over other delete tools (e.g., delete_job, delete_column), though the resource type makes it obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_jobDelete jobA
Permanently remove a job application row, matched by company + position, shifting the rows below it up (like Excel's Delete Row). Refuses to act on a missing or ambiguous match, backs the file up to .bak first, and returns the full deleted row so it can be re-added if needed.
| Name | Required | Description | Default |
|---|---|---|---|
| company | Yes | Company name (case-insensitive). | |
| position | Yes | Position / title (case-insensitive). Required so the correct row is removed even when a company has several entries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses important behaviors: permanent action, row shift, refusal on missing/ambiguous matches, automatic backup to .bak, and return of the deleted row for recovery. This is excellent for a mutation tool.
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 a single, tightly packed sentence that front-loads the main action and then adds each behavioral detail without redundancy. Every clause 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 deletion tool with no output schema and no annotations, the description covers all essential context: what is deleted, how matching works, failure behavior, backup, and return value. An agent has enough to use it correctly and handle outcomes.
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%, with both parameters already described (case-insensitive, position disambiguates). The description reinforces the combined match but adds no new parameter details beyond what the schema already provides, so baseline 3 applies.
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 action: permanently remove a job application row, with specific matching criteria (company + position) and a concrete effect (shifting rows below up). It also distinguishes from sibling tools like delete_column or delete_document by explicitly targeting job application rows.
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 is obvious when to use this tool (to delete a job application row) and it adds safety context by refusing on missing or ambiguous matches. It doesn't explicitly contrast with alternatives, but no sibling tool offers job deletion, so the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discovery_addAdd discovery leadA
Append a new lead to the discovery sheet. Company and Position are required; set any other columns via fields (e.g. Salary, Job Link, "Match Assessment"). Date Found defaults to today and Status to "Open" if not supplied. Backs the file up first.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Other discovery columns as {"Column Name": "value"}. Each name must be an existing discovery column. | |
| company | Yes | Company name (required). | |
| position | Yes | Position / title (required). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full disclosure burden. It adds valuable behavioral details: Date Found defaults to today, Status defaults to 'Open', and it 'Backs the file up first'. These go beyond the schema and reveal side effects and defaulting behavior, though it does not mention return values or error handling.
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 with no fluff. It front-loads the core action and then supplies key details in a compact, scannable manner. 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 simple append operation with no output schema, the description covers purpose, required vs optional inputs, defaults, and a safety behavior (backup). It does not mention return values, but that is easily inferable for an append tool and is not a critical gap. The description is complete enough 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?
Although schema coverage is 100%, the description adds meaning by providing concrete field examples (Salary, Job Link, 'Match Assessment') and explaining default behavior for Date Found and Status, which are not explicit schema properties. This enriches understanding beyond the structured definitions.
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 'Append a new lead to the discovery sheet' with a specific verb and resource, clearly distinguishing it from sibling update/delete/list operations. The title 'Add discovery lead' reinforces this purpose without ambiguity.
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 phrase 'Append a new lead' implies usage for adding new entries, but the description does not explicitly state when to use this tool versus alternatives like discovery_update or discovery_delete. There are no exclusions or alternative tool mentions, making the guidance only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discovery_deleteDelete discovery leadA
Permanently remove a discovery lead, matched by company + position, shifting rows below it up. Refuses missing/ambiguous matches, backs up first, and returns the deleted row so it can be re-added.
| Name | Required | Description | Default |
|---|---|---|---|
| company | Yes | Company (case-insensitive). | |
| position | Yes | Position (case-insensitive). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explicitly states the destructive nature ('Permanently remove'), side effects ('shifting rows below it up'), safety measures ('backs up first'), refusal conditions ('missing/ambiguous matches'), and return value ('returns the deleted row'). This is thorough behavioral disclosure.
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, front-loaded with the action and resource, and every clause adds value. There is no redundancy or padding.
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 2-parameter delete tool with no annotations and no output schema, the description is highly complete. It explains the matching key, side effects, safety behavior, failure conditions, and return value, which is sufficient for an AI agent to use 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% and both parameters are described, but the description adds meaning by establishing that company and position are used together as a composite match key. It also adds behavior for ambiguous/missing matches, going beyond the schema's simple 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 ('Permanently remove') with a clear resource ('discovery lead') and matching criteria ('company + position'). It clearly distinguishes from sibling tools like discovery_add, discovery_update, and delete_job.
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 clearly indicates when to use this tool—to permanently delete a discovery lead—and provides context about its behavior (e.g., refuses missing/ambiguous matches, backs up first). It does not explicitly mention alternatives, but the scope is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discovery_listList discovery leadsA
List job leads from the discovery sheet (Job_Search_Discovery.xlsx). Optional filters: company (case-insensitive substring), status (case-insensitive exact), and query (substring across every column).
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Substring searched across all columns. | |
| status | No | Exact status, e.g. "Open". | |
| company | No | Company substring to filter by. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing behavior. It explicitly notes case-insensitive matching for company and status, and that query is a substring across all columns. This adds meaningful behavioral context beyond simply saying 'list'. It does not mention return format or that it is read-only, but the verb 'List' and source file imply a safe read operation.
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?
Two sentences, front-loaded with the action and resource, then filters. Everything is relevant and no redundancy. It strikes an ideal balance between completeness and brevity.
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 simple list tool with three optional filters and no output schema, the description covers the source, filter behavior, and purpose. It omits return shape/pagination, but for a list operation on a spreadsheet this is minor and the description is sufficiently complete for an agent to invoke 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 clarifying that all filters are optional, that company and query are substring matches (case-insensitive), and that status is an exact match. This supplements the schema's per-property descriptions with matching semantics.
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 verb 'List' and the specific resource 'job leads from the discovery sheet (Job_Search_Discovery.xlsx)', which differentiates it from sibling tools like list_jobs that operate on other data. It also names the optional filters, making the tool's scope 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 clearly indicates the tool is for listing discovery leads from a specific file, implying use when discovery sheet data is needed rather than tracker jobs. It does not explicitly name alternatives or exclusions, but the resource specificity gives clear context for 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.
discovery_updateUpdate discovery leadA
Edit a discovery lead, matched by company + position. Rename via new_company / new_position; set any columns via fields (empty string clears a value). Refuses missing/ambiguous matches; backs up first.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Columns to set as {"Column Name": "value"}; "" clears. | |
| company | Yes | Current company (case-insensitive). | |
| position | Yes | Current position (case-insensitive). | |
| new_company | No | Rename the company. | |
| new_position | No | Rename the position. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses important behaviors: refuses missing/ambiguous matches and backs up first. It also explains the empty-string-clears-value behavior. This is solid but does not cover return values or permissions, which would push it higher.
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, front-loaded with the primary action, and every phrase adds useful information. No waste or redundancy.
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 5 parameters and no output schema, the description covers all key aspects: matching, renaming, field updates, clearing, refusal behavior, and backup. It is adequate for an update tool, though it does not describe the success response format.
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 meaning by explicitly stating that company and position are the matching keys and that new_company/new_position rename. It clarifies the fields mechanism and clearing semantics, adding value 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 explicitly states the action ('Edit') and resource ('discovery lead'), and clarifies the matching criteria (company + position). It distinguishes from sibling tools like discovery_add and discovery_delete by focusing on updating an existing lead.
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 clearly indicates this tool edits discovery leads matched by company and position, providing context on when to use it. It does not explicitly mention alternatives like discovery_add or discovery_delete, but the 'Edit' phrasing and resource make the intended use obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_followup_messageDraft follow-up messageA
Draft a short, professional follow-up email for a given application, referencing how long it has been since applying, the role, and the resume version used. Returns draft text only — it does not send anything.
| Name | Required | Description | Default |
|---|---|---|---|
| company | Yes | Company name (case-insensitive). | |
| position | No | Position, if the company has more than one row. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It explicitly discloses the key behavior: 'Returns draft text only — it does not send anything', indicating no side effects. It also mentions what the draft references, but omits error conditions or prerequisites.
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?
Two sentences, front-loaded with the main action, and both sentences earn their place. The second sentence adds a crucial behavioral boundary without 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?
For a simple drafting tool with two parameters and no output schema, the description covers purpose, behavioral scope, and return value ('Returns draft text only'). It does not mention potential errors or prerequisites, but the overall context is sufficiently complete.
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 slight context by mentioning 'role' and 'resume version used', which map to the position parameter and application context, but it doesn't explain parameters 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 uses a specific verb 'draft' and resource 'follow-up email for a given application', clearly stating what the tool does. It also distinguishes itself from sending tools by noting 'Returns draft text only — it does not send anything.'
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 context: use it to draft a follow-up for an application, referencing time since applying, role, and resume version. It explicitly states it does not send, providing an exclusion, though it doesn't name alternative tools like send_gmail_email or draft_gmail_reply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_gmail_replyDraft a Gmail reply (not sent)A
Create a real Gmail draft — visible in the Drafts folder — but does NOT send it; a human still has to open it and hit Send. Either replies within an existing thread (pass thread_id, e.g. from search_gmail_for_job or scan_job_updates) or starts a new message (pass to + subject). Requires Gmail to be authorized (see GMAIL_SETUP.md).
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Optional Cc address(es). | |
| to | No | Recipient email address. Required if thread_id is omitted. | |
| body | Yes | The email body text. | |
| subject | No | Subject line. Required if thread_id is omitted; ignored (the thread's own subject is used) otherwise. | |
| thread_id | No | Gmail thread ID to reply within (recipient/subject are inferred from the thread's last message). Omit to start a new email. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well by disclosing that the draft is visible in the Drafts folder, not actually sent, and requires Gmail authorization (referencing GMAIL_SETUP.md). It also explains how thread_id affects recipient/subject inference, adding useful behavioral context. A minor gap is that it doesn't describe what happens after the draft is created (e.g., return value), but this isn't critical.
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?
Three sentences, front-loaded with the most important fact (not sent), and each sentence adds distinct value. No repetition of schema content; it's tightly written 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?
For a tool with 5 parameters and no output schema, the description is adequately complete: it explains the two invocation modes, parameter relationships, and a prerequisite. The only omission is a explicit description of the return/confirmation behavior, but given the tool's simplicity and schema coverage, this is acceptable.
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 meaningful semantics: it explains that thread_id can come from search_gmail_for_job or scan_job_updates, clarifies that subject is ignored when thread_id is used, and explicitly states that 'to' is required when thread_id is omitted. Examples and precedence rules go beyond the 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 specifies a clear action ('Create a real Gmail draft') and a distinct behavioral outcome ('does NOT send it'), distinguishing it from the sibling send_gmail_email. It also names the concrete resource (Drafts folder) and two usage modes (reply vs new message).
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 solid usage context: when to reply within a thread (pass thread_id with examples of source tools) and when to start a new message (pass to + subject). It also notes the authorization prerequisite. However, it doesn't explicitly name send_gmail_email as the alternative when sending is actually intended, though the 'does NOT send' phrasing implies it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_resumeGenerate tailored resumeA
Generate a tailored resume PDF (or docx) on the host and save it into the Resumes folder — no base64, works from Claude Desktop.
The STABLE facts (employers, titles, dates, education, skills) come from resume_master.json; YOU supply only the per-posting tailoring: a rewritten summary and the key_qualifications bullets aligning the candidate to this specific company + position. The server renders the master + your tailoring into a formatted PDF (python-docx + LibreOffice) matching the existing resumes. Do NOT invent employers, dates, or degrees — those are fixed in the master. Returns the saved path and size, plus a nextStep with a suggested follow-up call (add_job / promote_to_tracker / update_job) — offer it to the user so tailoring, saving, and tracking flow together.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format (default pdf). | |
| skills | No | Optional skills list to override/reorder the master's skills. | |
| company | Yes | Target company, e.g. "Acme Corp". | |
| summary | Yes | The tailored SUMMARY paragraph, rewritten to foreground the fit for this posting. Factual — draw only on the real background. | |
| filename | No | Output file name (no folders). Defaults to Dale-Magrath-Resume-{Company}-{Position}.{ext}. | |
| position | Yes | Target role, e.g. "Engineering Manager". | |
| overwrite | No | If false (default), refuse to replace an existing file. | |
| include_honors | No | Include a Honors & Awards section from the master (default false; off keeps a full resume at 2 pages). | |
| include_projects | No | Include the Projects section (default true). | |
| key_qualifications | Yes | Bullet points for the 'KEY QUALIFICATIONS — {company} {position} ALIGNMENT' section, each tying real experience to this posting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for behavioral disclosure. It states that output is saved to a specific folder, no base64 is used, the rendering uses python-docx + LibreOffice, factual constraints (do not invent employers/dates/degrees), and the return payload (path, size, nextStep). This is exceptionally transparent.
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 a succinct four-sentence paragraph. The first sentence front-loads the core purpose; subsequent sentences add necessary constraints and workflow details. No filler or redundancy—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 10 parameters and no output schema, the description covers purpose, input responsibilities, rendering process, file location, constraints, return values, and a suggested follow-up. It is fully complete for an agent 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% with meaningful descriptions for each parameter. The description adds extra context for key parameters (summary and key_qualifications) by explicitly labeling them as the per-posting tailoring. This enriches the schema without redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb+resource: 'Generate a tailored resume PDF (or docx) on the host and save it into the Resumes folder.' This clearly distinguishes it from all sibling tools (job tracking, document management, etc.) which serve different purposes.
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 explains that stable facts come from resume_master.json and that the user supplies only per-posting tailoring (summary, key_qualifications). It also suggests offering the nextStep to keep tailoring, saving, and tracking together. However, it does not explicitly contrast with sibling tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_due_followupsGet due follow-upsA
List applications whose Next Follow-Up date is due — on or before today (or within the next days days). Skips clearly-closed rows (Declined / Withdrawn / Closed). Sorted most-overdue first; daysUntil is negative when overdue.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-ahead window in days (default 0 = only due today or overdue). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that closed rows (Declined/Withdrawn/Closed) are skipped, that results are sorted by most-overdue first, and that the daysUntil field is negative when overdue. These are meaningful behavioral details not available elsewhere.
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 three sentences with no filler. It front-loads the core purpose, then provides filtering, sorting, and field semantics efficiently.
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 simple 1-parameter tool with no output schema, the description sufficiently covers purpose, filtering, sorting, and a key output field (daysUntil). It could enumerate all return fields, but the essential behavior is clear.
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% for the single 'days' parameter; the schema already explains it as a look-ahead window with default 0. The description only restates this concept ('within the next `days` days') without adding new semantic detail about the parameter.
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 'List' with a clear resource 'applications whose Next Follow-Up date is due' and defines the date condition. It distinguishes itself from siblings like list_jobs and get_stale_jobs by focusing on follow-up due dates.
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 clearly states when to use: to list applications due for follow-up on or before today or within a given days window, and that closed rows are skipped. However, it does not explicitly mention alternatives or when not 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.
get_jobGet jobA
Return full details for a single application, matched by company (and position, if the company has more than one row).
| Name | Required | Description | Default |
|---|---|---|---|
| company | Yes | Company name (case-insensitive). | |
| position | No | Position/title, needed only if the company has multiple rows. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It explains the matching rule (position needed if company has multiple rows), which is a useful behavioral nuance. However, it does not disclose what happens when no match is found or when the company has multiple rows and position is omitted, leaving some ambiguity.
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 a single, front-loaded sentence that states the verb, resource, and matching criteria without any fluff. Every word contributes to understanding what the tool does.
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 simple getter with two parameters and no output schema, the description covers the essential matching logic and the condition on position. It does not specify the return format or error behavior, but given the low complexity and the schema descriptions, the description is sufficiently complete for most use cases.
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% (both parameters have descriptions in the schema), so the baseline is 3. The description reiterates the relationship between company and position (position needed if multiple rows), which adds slight context beyond the schema but does not provide significant new semantics.
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 the specific verb 'Return' and identifies the resource ('full details for a single application') plus the matching key (company, optionally position). This clearly distinguishes it from sibling tools like list_jobs (lists many) and search_jobs (searches broadly).
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 clearly implies when to use this tool: when you need full details for one specific application identified by company. It does not explicitly name alternatives or exclusion criteria, but the context is clear and the sibling tool names reinforce the distinction. No exclusions are necessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resume_master_fieldGet resume master fieldA
Read one field from resume_master.json (the stable resume facts) by dot/bracket path, e.g. "skills", "projects[0].description", "experience[2].title". Scoped to that one file. Use list_resume_master_structure first if you're unsure of the path.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Dot/bracket path, e.g. "experience[0].dates". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing behavior. It states the operation is a read, scopes access to one file, and describes the nature of the data ('stable resume facts'). It does not explain error behavior or return characteristics for invalid paths, but for a simple read tool the provided context is adequate.
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, front-loads the verb and resource, and every element adds value. It is concise without being under-specified, including examples and a usage hint without unnecessary 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?
This is a simple single-parameter read tool. The description includes the file name, path format with examples, scope limitation, and guidance for an alternative tool, making it sufficiently complete without an output schema or complex annotations.
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 covers the path parameter with one example. The description adds multiple examples ('skills', 'projects[0].description') and clarifies the dot/bracket path syntax, providing additional meaning beyond the schema description.
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 reads one field from resume_master.json using a dot/bracket path. It uses a specific verb ('Read') and resource ('resume_master.json'), and the examples distinguish it from sibling tools like update_resume_master_field and list_resume_master_structure.
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 advises using list_resume_master_structure first if unsure of the path, providing an alternative for a specific scenario. It also notes the tool is scoped to one file, but it does not explicitly contrast with the update sibling or clarify when a list/read of the entire file would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stale_jobsGet stale jobsA
List applications still "Awaiting Response" or "Applied" whose Date Applied is more than N days ago (default 14), computed against today.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Threshold in days (default 14). Returns jobs older than this. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It does specify the filtering logic (statuses and date threshold) and states the default of 14 days computed against today. However, it does not explicitly state that this is a read-only operation or describe side effects, permissions, or return format. The 'List' verb implies safety, but the absence of annotations makes this a moderate, not strong, disclosure.
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 a single, compact sentence that front-loads the core functionality and includes essential details (statuses, threshold, default, baseline date). No wasted words.
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 simple single-parameter schema and lack of output schema, the description adequately explains what the tool does and the input behavior. It does not detail return shape or ordering, but these are not critical for this simple list operation. It is complete enough for an agent to understand the tool's role.
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 only parameter, 'days', has a clear schema description covering its meaning and default. The tool description adds no new parameter semantics beyond what the schema already provides, so the baseline of 3 applies.
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 lists applications filtered by specific statuses ('Awaiting Response' or 'Applied') and by a date threshold. This is a specific verb+resource+scope description that distinguishes it from sibling tools like list_jobs or get_job.
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 context on when to use the tool: when needing to surface applications stuck in certain statuses older than a configurable number of days. It does not explicitly name alternatives or exclusions, but the criteria are well-defined enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_documentsList documentsA
List the saved resumes / cover letters in the Resumes folder (name, size, and modified date). Optional filter is a case-insensitive substring on the file name. Newest first.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Case-insensitive substring to filter file names by. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must convey behavioral traits. It does so by specifying the sort order ('Newest first'), the filtering behavior ('case-insensitive substring'), and the output fields. It clearly indicates a read-only listing operation. Minor gaps remain about folder scope or error handling, but it is well above the baseline.
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, front-loads the core action and resource, and every phrase adds value: the folder location, the output fields, the filter behavior, and the sort order. No unnecessary words.
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 simple list tool with one optional parameter and no output schema, the description is quite complete: it states the returned fields and ordering. It does not mention potential edge cases (e.g., empty folder, subfolder recursion), but these are not critical for core usage. The low complexity means this level of detail is sufficient.
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 fully documents the single parameter 'filter' with a matching description. The tool description repeats the case-insensitive substring semantics but adds no additional meaning beyond the schema, so the baseline score of 3 applies.
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 action ('List'), the resource (saved resumes/cover letters in the Resumes folder), and the returned attributes (name, size, modified date). This distinctly differentiates it from sibling document tools like read_document, save_document, or delete_document.
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 implies usage: use this tool to see available resumes/cover letters with an optional substring filter. However, it does not explicitly state when to prefer this over alternatives like read_document or save_document, nor does it mention any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_jobsList jobsA
List all tracked job applications, with optional filters. Filter by status (case-insensitive exact match), company (case-insensitive substring), and/or a Date Applied range (inclusive, YYYY-MM-DD).
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Exact status to filter by, e.g. one of: Applied, Awaiting Response, Informal - Referral Sent, Interviewing, Offer, Declined, Withdrawn, Closed - No Longer Available | |
| company | No | Company name substring to filter by. | |
| applied_to | No | Only include jobs applied on/before this date (YYYY-MM-DD). | |
| applied_from | No | Only include jobs applied on/after this date (YYYY-MM-DD). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It discloses specific matching semantics: case-insensitive exact match for status, case-insensitive substring for company, and inclusive date range. This is valuable behavioral detail beyond a simple 'list'. It does not mention return format, ordering, or pagination, but the read-only nature of 'list' is clear.
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 with the main purpose front-loaded, and the filter details follow logically. Every clause adds value, and there is no redundant or vague language. It is concise and well-structured.
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 simplicity (4 optional parameters, no required params, no output schema), the description covers the essential behaviors and filter semantics thoroughly. It does not mention ordering or pagination, but these are often implied for a list operation. The lack of explicit return-format information is a minor gap, but overall it is close to complete for this tool.
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. The description adds extra semantics beyond the schema: it explains that status is case-insensitive exact match, company is case-insensitive substring, and the date range is inclusive. This clarifies how the parameters behave, raising the score to 4.
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 verb 'list' and the resource 'tracked job applications', with optional filters. It explicitly distinguishes this from getting a single job (get_job) and from search_jobs, which likely has different search behavior. The scope 'all tracked job applications' is precise 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?
The description clearly implies when to use this tool: when you need to list job applications with optional filters. It provides a strong context of use but does not explicitly mention alternatives or when not to use it. However, the purpose is clear enough that an agent can infer appropriate usage without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_resume_master_structureList resume master structureA
Show the SHAPE of resume_master.json (keys, array lengths, scalar types — not the full field values) to help pick a path for get_resume_master_field / update_resume_master_field. Optional path scopes the listing to a sub-section.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Optional sub-path to scope the listing, e.g. "experience". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It transparently explains that the tool returns only structural metadata (keys, array lengths, scalar types) and not full field values, and that 'path' scopes the listing. This sets accurate expectations about output scope, though it doesn't explicitly mention that the operation is read-only or describe error cases.
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 exactly two sentences, front-loaded with the primary purpose and followed by the parameter note. Every word earns its place; there is no redundancy or 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?
For a simple introspection tool with one optional parameter and no output schema, the description adequately covers purpose, parameter behavior, and relationships to sibling tools. It doesn't specify the exact output format, but that is not critical given the tool's nature and the explicit 'shape' framing.
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% for the single optional 'path' parameter, so the description doesn't need to add much. The description repeats the schema's meaning ('scopes the listing to a sub-section') without adding new syntax or format details. This matches the baseline of 3 when the schema handles parameter documentation.
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 shows the structural shape of resume_master.json (keys, array lengths, scalar types) and explicitly distinguishes it from sibling field-access tools by explaining its role in path selection. The verb 'Show' is specific and the resource is named unmistakably.
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 the tool exists 'to help pick a path for get_resume_master_field / update_resume_master_field', giving direct context for when to use it. It also notes the optional 'path' scoping, which further clarifies usage. While it doesn't list exclusions, the guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modify_columnModify columnA
Modify a custom column: rename it (new_name) and/or set the same value into every existing job row (fill_value; pass an empty string to clear the column). At least one of new_name / fill_value is required. Refuses on the built-in columns and on a missing column. Backs the file up first.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Current header text of the column to modify. | |
| new_name | No | New header text (renames the column). | |
| fill_value | No | If given, written into this column for every existing job row (empty string clears the column). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that fill_value writes to every existing row, empty string clears, built-in/missing columns are refused, and a file backup is made first. This is strong behavioral detail for a mutating tool, though it does not mention return values or error formats.
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, front-loaded, and consists of four short sentences, each providing essential operational, constraint, or safety information. There is no filler or redundant repetition of the title.
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 three-parameter mutation tool with no annotations or output schema, the description covers the action, parameter effects, preconditions, refusal cases, and backup behavior. It is sufficiently complete for an agent to select and invoke the tool correctly, even though it does not describe the success response shape.
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 all three parameters (100% coverage), so the baseline is 3. The description adds value by specifying the cross-parameter constraint that at least one of new_name or fill_value must be provided, which is not expressed in the schema. Most other parameter meaning is already present in 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 opens with a specific verb and resource ('Modify a custom column') and clearly breaks the action into rename and fill operations. It also distinguishes itself from sibling tools like add_column and delete_column by specifying it operates on existing custom columns.
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 preconditions: at least one of new_name or fill_value is required, and it refuses on built-in/missing columns. This provides clear context for when the tool should or should not be used, though it does not explicitly name sibling alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
print_documentPrint documentA
Silently print a saved document to a printer. Give a file name in the Resumes folder (or a full path). PDFs print directly; .docx files are converted to PDF first (cached next to the docx). Uses the system default printer unless printer_name is given. Confirms the job was SENT to the printer, not that it physically finished.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | File in the Resumes folder, or a full path to a .pdf/.docx. | |
| printer_name | No | Printer name to use; omit for the system default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral disclosure burden. It covers conversion of .docx to PDF, caching next to the docx, default printer usage, and the important distinction that confirmation only means the job was sent, not physically printed. This is rich, specific behavioral information.
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?
Three sentences, each earning its place. Front-loaded with the core action, then key details on file handling and printing behavior. No redundant or vague wording.
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 simplicity (2 parameters, no output schema), the description covers essential aspects: file names, format conversion, printer selection, and confirmation semantics. It lacks details about error handling or return format, but these are less critical for a straightforward print action.
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 has 100% coverage, so parameters are already documented. The description goes beyond by explaining the Resumes folder shortcut, full path support, PDF vs .docx handling, and the default behavior of the printer_name parameter. This adds meaningful practical context.
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 action: 'Silently print a saved document to a printer.' It identifies the resource (saved document) and distinguishes from sibling tools like save_document, read_document, and delete_document by focusing on the print operation.
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 context for usage: it mentions saved documents, file names in the Resumes folder or full paths, and default printer behavior. While it doesn't explicitly state when not to use it or name alternatives, the context is unambiguous enough for an agent to choose this tool for printing tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
promote_to_trackerPromote lead to trackerA
Turn a discovery lead into a tracked application: copies Company, Position, Job Link, and Location into the tracker with Status "Applied" and Date Applied = today (both overridable). Salary and Match Assessment are carried into Notes unless you supply your own. Optionally removes the lead from the discovery sheet. Backs up both files it writes.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Tracker notes. Defaults to a summary of salary + match. | |
| status | No | Tracker status. Defaults to "Applied". | |
| company | Yes | Discovery lead company (case-insensitive). | |
| position | Yes | Discovery lead position (case-insensitive). | |
| date_applied | No | Date applied (YYYY-MM-DD). Defaults to today. | |
| resume_version | No | Resume version used for the application. | |
| remove_from_discovery | No | If true, delete the lead from the discovery sheet after promoting. Defaults to false (the lead is left in place). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals key side effects: copying fields, overridable defaults, notes derived from salary/match unless overridden, optional deletion of the lead, and backup of both files. It does not mention error handling or return format, but the major behaviors are transparent.
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 concise and well-structured: four short sentences, each adding a distinct piece of information (core purpose, notes default, optional deletion, backup). No filler or redundancy, and the most important action is 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?
For a cross-sheet promotion tool with 7 parameters and no output schema, the description explains the main workflow, defaults, optional behavior, and backup. It omits return value and error handling, but the schema covers parameter details, making the description reasonably complete for the 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?
Schema coverage is 100%, so parameters are already documented. The description adds value by clarifying default behaviors for status, date_applied, notes, and remove_from_discovery, and explains how notes derive from salary/match if not supplied. This supplements the schema with practical semantics.
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's purpose: 'Turn a discovery lead into a tracked application' and enumerates specific actions (copies Company, Position, Job Link, Location; sets Status and Date Applied). This distinguishes it from sibling tools like add_job or discovery_add, which operate on single sheets.
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 conveys a clear use case (promoting a discovery lead to a tracker) and mentions optional removal from the discovery sheet, which implies workflow context. However, it does not explicitly say when to use this tool instead of alternatives like add_job or discovery_update, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_documentRead documentA
Extract and return the plain text of a saved resume / cover letter (.pdf or .docx) from the Resumes folder, so it can be read and analyzed in conversation (e.g. "read my Acme Corp resume and check it against this posting"). Read-only. Give a file name in the Resumes folder.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | File name in the Resumes folder, e.g. "Dale-Magrath-Resume-Acme-Corp.pdf". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It explicitly states 'Read-only' and specifies the file formats (.pdf/.docx) and location (Resumes folder). It does not detail error handling or return format, but for a simple read tool this is adequate and non-misleading.
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, front-loaded with the main action and purpose, followed by an example and a clear instruction. Every sentence contributes value without redundancy or 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?
The tool is simple (1 parameter, no output schema, no nested objects). The description includes purpose, scope, file types, location, and behavioral safety ('Read-only'). It is complete enough for an agent to select and invoke correctly, though it omits potential error cases, which are not critical for a read operation.
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 covers the filename parameter fully (100% coverage) with an example. The description adds extra meaning by emphasizing 'Give a file name in the Resumes folder,' reinforcing the location constraint and the expected input format.
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 specifies a unique verb and resource: "Extract and return the plain text of a saved resume / cover letter (.pdf or .docx) from the Resumes folder." This distinguishes it from siblings like read_text_file (generic) and list_documents, and includes an example use case.
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 states when to use it (to read and analyze a resume/cover letter in conversation) and gives a concrete example. It does not explicitly exclude alternatives, but the context is clear and the instruction 'Give a file name in the Resumes folder' provides direct usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_gmail_messageRead a Gmail message's full bodyA
Read the full body of ONE specific Gmail message — search_gmail_for_job and scan_job_updates only return a short snippet, so use this when you need the actual content (e.g. an interview link or instructions). Pass message_id (the id from a search/scan result), or thread_id to read the most recent message in that thread. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | No | Gmail thread id — reads the most recent message in the thread. Ignored if message_id is given. | |
| message_id | No | Gmail message id, e.g. the `id` from a search_gmail_for_job result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the disclosure burden. It discloses read-only nature ('Read-only'), explains behavior with thread_id ('reads the most recent message in that thread'), and clarifies the precedence when both parameters are given. While it doesn't discuss authentication or side effects, the read-only declaration and behavioral details are valuable for this simple tool.
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?
Two sentences, front-loaded with the primary purpose, then providing usage context and parameter guidance. Every sentence provides functional value; no filler or redundant information.
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?
This is a simple 2-parameter read tool with no output schema. The description covers what it does, when to use it, how parameters interact, and its read-only nature. For the given complexity, it is complete and leaves no obvious gaps for an agent to correctly select and invoke the tool.
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 parameters are already documented. The description adds meaningful relationship semantics: it explains that message_id comes from a search/scan result, that thread_id reads the most recent message, and that thread_id is ignored if message_id is given. This goes beyond the schema's standalone 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+resource: 'Read the full body of ONE specific Gmail message.' It clearly distinguishes from sibling tools by stating that search_gmail_for_job and scan_job_updates only return snippets, while this tool provides the full content.
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 states when to use: 'use this when you need the actual content (e.g. an interview link or instructions).' It also names the alternatives (search_gmail_for_job, scan_job_updates) and explains their limitation, providing clear context for selecting this tool. Additionally, it provides parameter usage guidance (message_id vs thread_id).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_interview_prepRead interview prepA
Read the interview-prep Q&A markdown file (Interview_Prep_QA.md) and return it as text. Pass an optional company to return just that company's section. Returns a friendly message (not an error) if the file doesn't exist yet or the company has no section.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Return only this company's section (case-insensitive). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It discloses key behaviors: returns text, handles missing file or missing company section with a friendly message rather than an error. This is adequate for a simple read operation.
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?
Two sentences, front-loaded with the primary action, and every phrase adds value (file name, return format, optional filter, error handling). No wasted words.
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 one optional parameter and no output schema, the description is complete. It covers the file source, behavior with and without the filter, and error/friendly-message handling. No additional context is needed.
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% with a clear property description. The main description repeats the optional company filter but adds no new meaning beyond the schema. 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 reads a specific file (Interview_Prep_QA.md) and returns it as text, with an optional company filter. This specific verb+resource+scope distinguishes it from generic read_document or read_text_file 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?
Provides clear context for when to use: to retrieve interview prep content, optionally filtered by company. No explicit exclusions or alternatives are named, but the specificity of the file and behavior makes the usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_text_fileRead text fileA
Read any plain-text file (.md, .txt, .json, .csv, …) inside the Job Tracking folder tree — handoff notes, scratch files, etc. Give a filename or relative path (e.g. "HANDOFF_2026-08-02.md" or "notes/plan.txt"), resolved under the Job Tracking root. Read-only, and strictly scoped to that tree — paths that escape it are refused. For PDFs/docx in the Resumes folder use read_document instead.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | Filename or relative path under the Job Tracking root, e.g. "notes/plan.txt". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses read-only behavior, strict scoping to the Job Tracking tree, and refusal of escaping paths. This is strong transparency, though it doesn't mention error handling or encoding, which are minor for a read tool.
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 three sentences, front-loaded with the primary purpose, and each sentence adds value: scope, usage examples, and a pointer to an alternative. No redundancy.
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 simple single-parameter read tool, the description covers purpose, scope, safety, and alternatives. It lacks mention of return format or error behavior, but the operation is self-explanatory. The absence of an output schema raises the bar slightly, yet the description remains adequate.
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. The description repeats the schema's parameter meaning but adds example values and explicit resolution under the Job Tracking root. This is useful but not a significant addition over structured 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 clearly states the tool reads plain-text files within the Job Tracking folder tree, listing specific file extensions and example files. It explicitly distinguishes itself from read_document for PDFs/docx, making the purpose 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?
It provides concrete guidance on when to use this tool (for text files in Job Tracking) and explicitly names an alternative (read_document for PDFs/docx in Resumes). It also clarifies input format (filename or relative path) and scoping constraints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_documentSave documentA
Save a generated document (docx or PDF) into the Resumes folder (created if missing).
PREFERRED: pass source_path — the full path to a file already written to disk (e.g. one the docx/pdf skill just generated). The server copies it; this is instant and cannot corrupt the file.
FALLBACK: content_base64, for SMALL files only (~15 KB decoded max). Base64 must be generated token-by-token, so a typical 50 KB resume takes minutes and may exceed the response limit outright — use source_path for anything binary or non-trivial.
Give exactly one of the two. Refuses to overwrite an existing file unless overwrite=true, in which case the old file is backed up first. Returns the saved path and size.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | File name only (no folders), e.g. "Dale-Magrath-Resume-Acme-Corp.docx". | |
| overwrite | No | If false (default), refuse to replace an existing file. | |
| source_path | No | PREFERRED. Absolute path to an existing file to copy into the Resumes folder. Use this for any real document. | |
| content_base64 | No | Fallback for small files only (~15 KB decoded). Base64-encoded file bytes; a data: URL prefix is tolerated. Prefer source_path. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, but the description compensates fully. It discloses folder creation, copy behavior (instant, cannot corrupt), base64 inefficiency, overwrite refusal with backup, and the return value (path and size). This is comprehensive behavioral disclosure.
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 concise yet well-structured: purpose in the first sentence, then PREFERRED/FALLBACK formatting, then overwrite behavior and return value. Every sentence contributes no waste.
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 file-saving tool with 4 well-documented params and no output schema, the description fully covers behavior, parameter selection, safety considerations, and expected return. No critical information 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%, but the description adds critical depth: why source_path is preferred (instant, no corruption), why content_base64 is limited (token-by-token generation, response limit), and the mutual exclusivity of the two parameters. This goes beyond the schema's 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 clearly states 'Save a generated document (docx or PDF) into the Resumes folder' with a specific verb, resource, and destination. This distinguishes it from sibling tools like list_documents, delete_document, and read_document.
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 provides PREFERRED (source_path) and FALLBACK (content_base64) usage paths, including size limits and performance tradeoffs. It also instructs 'Give exactly one of the two', giving clear guidance on parameter selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_job_updatesScan Gmail for tracker updatesA
Cross-reference open applications in the tracker against Gmail: for each open job (or one company, if given), searches Gmail for recent related mail and flags simple keyword-based signals (interview, offer, rejection language). Read-only — it only SUGGESTS a status change via suggestedCall; it never updates the tracker itself. Review the emails and call update_job_status yourself if the suggestion looks right.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Limit the scan to one company (case-insensitive substring). | |
| days_back | No | Only search mail from the last N days (default 30). | |
| max_per_company | No | Max messages to fetch per company (default 3). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and it excels: it explicitly says 'Read-only', states it 'never updates the tracker itself', and explains that it only produces a `suggestedCall`. This fully discloses the non-mutating, advisory nature of the tool.
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, front-loaded with the main action, and every clause adds value. It efficiently communicates scope, method, side effects, and follow-up action without redundancy.
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?
The tool has no output schema and the description gives a hint about return values via `suggestedCall`, which implies a suggestion object. It covers the core workflow and side effects well, though a detailed explanation of the return structure could improve completeness.
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?
All three parameters already have descriptions in the schema (100% coverage), so the description adds little new param-level meaning. It only re-emphasizes the 'one company' option, while days_back and max_per_company are not mentioned beyond 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 clearly states the tool's function: cross-referencing open applications against Gmail and flagging keyword-based signals. It uses specific verbs like 'cross-reference' and 'searches', and distinguishes itself from siblings by emphasizing it only suggests status changes rather than updating the tracker.
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 context for when to use the tool: for each open job or optionally one company, scanning recent email for signals. It also gives post-usage guidance (review emails and call update_job_status if the suggestion looks right), though it doesn't explicitly compare to sibling tools like search_gmail_for_job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_gmail_for_jobSearch Gmail for job-related emailA
Read-only search of the authorized Gmail account for messages related to a company (and optionally position/keywords) — recruiter replies, interview invites, rejections, etc. Does not modify anything. Requires Gmail to be authorized first (see GMAIL_SETUP.md / npm run gmail:auth).
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Advanced override for the raw Gmail search query (Gmail search syntax, e.g. 'from:recruiter@acme.com newer_than:30d'). If given, replaces the default company/position query entirely. | |
| company | Yes | Company name to search for. | |
| position | No | Position/title to narrow the search further. | |
| max_results | No | Max messages to return (default 10, max 50). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description discloses key behavioral traits: it is read-only ('Does not modify anything') and requires prior Gmail authorization. This is significant for safety. It does not detail pagination/rate limits, but given the scope, this is adequate.
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?
Two sentences, front-loaded with the verb and resource, no redundant information. Every clause adds value (scope, examples, safety, prerequisite).
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 4-parameter search tool with no output schema, the description covers purpose, safety, and prerequisites but omits what the function returns (e.g., list of message metadata). The examples hint at matches, but not the return structure.
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 fully describes parameters like company, position, query, max_results. The description adds no extra parameter details beyond what is in the schema, so baseline 3 applies.
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 is a 'Read-only search of the authorized Gmail account for messages related to a company (and optionally position/keywords)' and lists example content (recruiter replies, interview invites, rejections). It distinguishes itself from siblings like read_gmail_message (which reads a specific message) and send_gmail_email (which writes) by explicitly noting read-only/no modification.
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 clear context for when to use: searching for job-related emails in Gmail. States prerequisite 'Requires Gmail to be authorized first'. Does not explicitly name alternatives or exclusions, but clearly implies this is the search tool versus other Gmail action tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_jobsSearch jobsA
Case-insensitive substring search across the Company, Position, and Notes columns.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Keyword or phrase to search for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosure. It goes beyond a vague 'search' by specifying case-insensitivity, substring matching, and the exact columns considered, which is meaningful behavioral context. It omits return format or pagination, but core matching behavior is transparent.
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 a single, front-loaded sentence with no filler. It precisely conveys the tool's behavior in minimal words.
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 simple one-parameter search tool with no output schema, the description is adequately complete. It covers the search scope and matching behavior, though it could optionally mention what the return payload looks like. Overall, the tool is simple enough that this description suffices.
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 fully describes the single parameter with 100% coverage, so the baseline is 3. The description adds semantic value by explaining how the query is used (case-insensitive substring across Company, Position, Notes), which helps the agent understand the query's effect beyond the schema's generic 'Keyword or phrase to search for.'
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 performs a case-insensitive substring search across specific columns (Company, Position, Notes). This is a specific verb+resource+scope that distinguishes it from sibling tools like list_jobs or get_job.
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 implies the use case: when you need to find jobs by a keyword across three textual fields. It does not explicitly mention alternatives or exclusions, but the context is clear enough for an agent to decide when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_gmail_emailSend an email via GmailA
SENDS a real email immediately through the authorized Gmail account. This cannot be undone — there is no draft step. Only call this after showing the user the exact to/subject/body and getting explicit confirmation; the call must include confirm: true or it is refused. Either sends a reply within an existing thread (thread_id) or a new email (to + subject). Requires Gmail to be authorized (see GMAIL_SETUP.md).
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Optional Cc address(es). | |
| to | No | Recipient email address. Required if thread_id is omitted. | |
| body | Yes | The email body text. | |
| confirm | Yes | Must be true. Set this only after the user has explicitly approved sending this exact email. | |
| subject | No | Subject line. Required if thread_id is omitted; ignored (the thread's own subject is used) otherwise. | |
| thread_id | No | Gmail thread ID to reply within (recipient/subject are inferred from the thread's last message). Omit to send a new email. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers richly: it discloses irreversibility ('cannot be undone'), the absence of a draft step, the confirmation prerequisite, the refusal when confirm is missing, and the Gmail authorization requirement. This is exemplary behavioral disclosure.
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 only three packed sentences, front-loaded with the irreversible action and immediately followed by the critical safety rule. Every clause earns its place, covering confirmation, moded behavior, and authorization without 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 six parameters, no annotations, and no output schema, the description fully specifies preconditions, the confirmation gate, both usage modes, parameter dependencies, and auth requirements. It leaves no ambiguity about how or when to invoke the tool.
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?
Although schema coverage is 100%, the description adds crucial semantics beyond the schema: confirm must be true or the call is refused, to/subject are only required when thread_id is omitted, and subject is ignored in thread replies. These conditional interrelations are not evident from the property descriptions alone.
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 ('SENDS a real email immediately') and identifies the resource ('authorized Gmail account'), making the tool's purpose unmistakable. It also differentiates from sibling tools like draft_gmail_reply by emphasizing there is no draft step and no undo.
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 an explicit when-to-use gate: 'Only call this after showing the user the exact to/subject/body and getting explicit confirmation' and states the hard requirement 'must include confirm: true or it is refused.' It also explains the two distinct modes (thread_id vs to + subject), giving clear situational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_jobUpdate job (any field)A
Edit any field(s) of an existing application, matched by company + position. Only the fields you supply are changed; pass an empty string to clear a field. Rename with new_company / new_position. Set custom columns via extra_fields. Refuses missing or ambiguous matches, validates dates, and backs the file up before writing.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | ||
| status | No | Status, e.g. one of: Applied, Awaiting Response, Informal - Referral Sent, Interviewing, Offer, Declined, Withdrawn, Closed - No Longer Available | |
| company | Yes | Current company name (case-insensitive). | |
| job_link | No | Job posting URL. | |
| location | No | ||
| position | Yes | Current position / title (case-insensitive). | |
| new_company | No | Rename the company. | |
| date_applied | No | Date applied (YYYY-MM-DD, or empty string to clear). | |
| extra_fields | No | Custom columns to set, as {"Column Name": "value"}. Empty string clears a column. Each name must be an existing custom column. | |
| new_position | No | Rename the position / title. | |
| next_follow_up | No | Next follow-up date (YYYY-MM-DD, or empty string to clear). | |
| resume_version | No | ||
| contact_referral | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It richly covers partial updates ('Only the fields you supply are changed'), clearing fields ('pass an empty string to clear a field'), renaming via 'new_company / new_position', custom columns via 'extra_fields', refusal on 'missing or ambiguous matches', date validation, and file backup. This goes well beyond basic what-it-does and gives the agent a strong sense of side effects and guardrails.
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 three concise sentences with no filler. The first sentence front-loads the core purpose, followed by efficient details on partial updates, clearing, renaming, and extra_fields, then a final sentence covers failure modes and side effects. Every phrase earns its place, making it easily scannable and informative.
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 13 parameters and no annotations or output schema, the description covers essential behavior: matching criteria, partial update semantics, clearing, renaming, custom fields, refusal conditions, validation, and backup. It does not mention return values or confirmation behavior, but since there is no output schema, this is not a strict requirement. It also does not reference sibling tools like 'update_job_status', which would have improved completeness, but the description is still substantive enough for an agent to use the tool safely and effectively.
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 covers 69% of parameters, so the baseline is 3. The description adds meaningful semantics beyond the schema: it clarifies the partial-update behavior, the empty-string clearing mechanism, the purpose of 'new_company'/'new_position' for renaming, and that 'extra_fields' sets custom columns. These details help an agent understand how parameters interact, which is not evident from the schema alone. The description does not compensate for the remaining 31% of undocumented parameters, but it adds enough value to warrant a 4.
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 the specific verb 'Edit' and clearly states the resource: 'existing application, matched by company + position'. It conveys the tool's broad scope ('any field(s)'), which is consistent with its title. However, it does not explicitly differentiate from the sibling tool 'update_job_status', which is a more specialized alternative for status-only updates.
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 implies when to use the tool ('existing application', matched by company + position) and provides operational details like 'Only the fields you supply are changed' and 'pass an empty string to clear a field'. However, it does not explicitly say when to use this tool instead of alternatives such as 'update_job_status' or 'add_job', nor does it list exclusion criteria. The intended use is inferred rather than explicitly contrasted with sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_job_statusUpdate job statusA
Update the Status (and optionally the Notes) of an existing application, matched by company + position. Validates the row exists and backs the file up before writing.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Optional new Notes value (replaces existing Notes). | |
| status | Yes | New status, e.g. one of: Applied, Awaiting Response, Informal - Referral Sent, Interviewing, Offer, Declined, Withdrawn, Closed - No Longer Available | |
| company | Yes | Company name (case-insensitive). | |
| position | Yes | Position / title (case-insensitive). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It discloses important behaviors: 'Validates the row exists and backs the file up before writing.' This goes beyond a bare 'update' and reassures the user about safety, though it doesn't detail error handling or return values.
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?
Two concise sentences, no redundancy. The first sentence front-loads the purpose, and the second adds key safety details. Every word 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 simple 4-parameter update tool with no annotations or output schema, the description covers the essentials: what is updated, matching criteria, validation, and backup. Missing return-value/error behavior is a minor gap, but the description is sufficient for typical usage.
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 semantic value by grouping parameters into roles: 'status (and optionally the notes)' and 'matched by company + position.' This clarifies how parameters relate, which is extra beyond the schema's per-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 clearly states the tool's action: 'Update the Status (and optionally the Notes) of an existing application.' It specifies the matching criteria (company + position), which distinguishes it from generic update_job or other mutations. This is a precise verb+resource+scope statement.
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 context for when to use the tool: it updates an existing application identified by company and position. However, it does not explicitly mention alternatives or exclusion criteria (e.g., 'use update_job for other fields'), so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_resume_master_fieldUpdate resume master fieldA
Update one existing field in resume_master.json by dot/bracket path (e.g. a corrected date, an added skill, a new project). Only edits fields that ALREADY exist — it will not create new keys (that's a deliberate schema change to make by hand). Backs the file up first and reports old → new. Scoped to resume_master.json only.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Existing path to update, e.g. "skills" or "projects[0].description". | |
| value | Yes | New value — string, number, boolean, array, or object. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It goes beyond a simple mutation statement by revealing that it only edits existing fields, backs up the file first, and reports old → new values. It also scopes the operation to the single file, which is valuable context. This level of detail surpasses typical tool descriptions.
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 (three sentences) and front-loaded with the core purpose in the first sentence. Each subsequent sentence adds meaningful detail: the existing-field constraint, backup and reporting behavior, and file scope. There is no fluff or redundancy, making it highly efficient.
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 straightforward two-parameter update operation, the description covers the essential aspects: what it does, its constraints, the backup mechanism, and the reporting of old/new values. Since no output schema is provided, describing the 'reports old → new' behavior is a good substitute for return format. The description is sufficiently complete for an agent to use 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?
The input schema already provides 100% coverage for both parameters, including concrete examples for 'path' and a type list for 'value'. The description adds some context with 'dot/bracket path' and use-case examples, but these are largely re-statements of schema information. The baseline of 3 is appropriate when the schema handles most of the explanatory 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 verb 'Update', the specific resource 'resume_master.json', and the scope 'one existing field' with dot/bracket path. It distinguishes itself from sibling tools like 'get_resume_master_field' and 'list_resume_master_structure' by focusing on mutation of existing fields. Examples (corrected date, added skill, new project) further clarify the intended use.
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 notes that it 'will not create new keys', providing a clear constraint on when not to use it and directing schema additions to manual hand-editing. It also scopes usage to 'resume_master.json only', which prevents accidental use on other files. However, it does not explicitly name alternative sibling tools for different scenarios (e.g., add vs. update), leaving some inference to the user.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools target distinct resources and actions, but update_job_status overlaps with update_job (which can also set status), and scan_job_updates vs search_gmail_for_job both provide Gmail search functionality. The descriptions help, but a few tools could cause misselection.
The dominant pattern is underscore-separated verb_noun (add_job, delete_document, get_resume_master_field), but discovery_* tools reverse this to noun_verb (discovery_list, discovery_add), and Gmail tools mix patterns (search_gmail_for_job vs read_gmail_message). The inconsistency is noticeable but not chaotic.
With 35 tools this is well above the typical well-scoped range (3-15) and even the heavy range (16-25). The large count reflects the many subdomains covered, but several tools could be consolidated (e.g., update_job_status into update_job, or read_document/read_text_file into one scoped reader).
The tool set covers the full job-search lifecycle: tracker CRUD, discovery pipeline, interview prep, resume generation and document management, plus Gmail integration with a safety-conscious send. Minor gaps exist (e.g., no way to edit or delete interview prep sections, no direct Gmail thread listing) but they don't create dead ends.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Manage job applications — jobs, companies, boards, notes, and profile — from your AI client.
Analyze job listings against your resume, track applications, and generate cover letters.
AI job search MCP — fact-checked jobs, application tracker, alerts. ChatGPT, Claude, Cursor.
Generate tailored, ATS-optimized resume PDFs and cover letters from a job description, over MCP.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables job search and scraping across multiple job boards (LinkedIn, Indeed, Glassdoor, etc.) with advanced filtering, directly from Claude Desktop or other MCP clients.5MIT
- FlicenseAqualityCmaintenanceEnables conversational management of quant job search, tailored CV generation, and skill gap analysis through MCP tools. Allows Claude to search, ingest, score jobs, and build/iterate LaTeX CVs.32
- FlicenseNot gradedqualityCmaintenanceEnables running a job search with Claude Code: parses CV, discovers roles, fetches exact application fields, drafts non-trivial applications (positioning, not autofill), and renders an offline dashboard for review.
- FlicenseBqualityCmaintenanceEnables searching justjoin.it for job listings and tracking applications locally with status updates, all via natural language in Claude.4
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/DaleMagrath/mcp-job-tracker'
If you have feedback or need assistance with the MCP directory API, please join our Discord server