tracker-mcp
Click on "Deploy 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., "@tracker-mcpwhich follow-ups are due this week?"
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.
tracker-mcp
An MCP server for the spreadsheet where you track your job applications: Excel, CSV or Google Sheets. Connect it to Claude (or any MCP client), and the assistant keeps the tracker for you: it answers from it, reminds you what is due, and records what happened, with your yes for every change.
По-русски: как подключить.
You: Which follow-ups are due this week?
Claude: Three. Acme (applied 17 Sep): nudge Sarah Kim on LinkedIn, overdue by two days. Globex: due Thursday, no contact yet. Initech: due Friday.
You: I can't reach anyone at Globex until Monday. Move it.
Claude: Row 8 · Globex — Head of Engineering. Follow-up date: 23 Oct → 27 Oct; follow-up log: + "follow-up moved to 2026-10-27: no contact yet". Write it?
You: Yes.
Claude: Done. A backup was taken first; say "undo" to revert.
Also: "Which channel gets me the most replies?", "Initech rejected me", "I applied to Hooli via a referral today", "close everything that hasn't answered in 45 days".
Why a server? Can't Claude just do this?
It can, if you set it up. Claude reads a spreadsheet you attach, and with access to your files (Claude Code, or Claude working in a folder on your computer) it can edit the tracker by writing a little code, and in claude.ai the Google Sheets connector lets it edit a Google Sheet directly. Give it good instructions (where the tracker is, what each column means, how follow-ups are counted, "back up and ask me before every write") and it works: tracker-mcp grew out of exactly that setup. The difference is where the rules live: in instructions the model reads and follows, or in a program that applies them.
Claude with your instructions | tracker-mcp | |
Knows your tracker | From the instructions you wrote, or worked out again in each chat | Learned once from your headers and dropdowns, kept in a config |
Follow-up dates, silent applications, funnel | The model writes code for it each time | Fixed rules in tested code: the same answer every time |
Asks before writing | When the instructions say so and the model follows them | The server refuses any write you have not confirmed |
Backup, undo, change log | When the model makes them | Every write |
Dropdowns and formulas on new rows | Depends on the code written for that change | Extended to new rows, every time |
Excel has the file open, or it changed meanwhile | Checked if the model thinks of it | The write is refused |
Text pasted from job posts and e-mails | Text starting with "=" becomes a formula unless the code prevents it | Always written as text |
What earlier edits left behind (text dates, rows without a status) | Found if you ask, fixed by code written for it |
|
When each reply came | Known only if someone wrote it down | Recorded on every reply; |
Replies in your mailbox | The model reads them and decides which row each is about |
|
Each request | Write, run and check a script | One tool call |
Free-form analysis, charts, reshaping the sheet | Anything | Not its job: Claude still does that alongside |
Where | Where Claude can run code on your files, or on a copy you upload | Any MCP client: Claude Desktop (in a normal chat), Claude Code, Cursor, ...; in a browser or on a phone through your own server |
So tracker-mcp mostly does not give Claude new abilities. It gives the everyday part of a job search (record what happened, see what is due, see what works) fixed rules and fixed safety, with no instructions to write. The one thing Claude cannot do later is know when a reply came if nobody wrote it down; the server writes it down as it happens.
Rules belong in code, not in a prompt. "Which follow-ups are due?" is date arithmetic with your rule: 10 days after applying, then every 14, weekends moved to Monday, nothing for closed applications. A model gets it right most of the time, but it works it out anew in each chat, and the slips are the quiet kind: a follow-up for a rejected application, a date on a Sunday, a status spelled differently from your dropdown. Here the rule is code covered by tests. The same goes for silent applications and the funnel.
Safety the model cannot skip. You see the exact cells that will change, and your yes is checked by the server, not taken on the model's word. That matters most where no one re-reads the instructions: a scheduled weekly review, a long chat, a note pasted from a job post that tells the model to do something.
Fewer steps. One tool call instead of writing and running a script, so answers come quicker and the model's attention stays on your question.
The same tracker everywhere. Every chat, a scheduled review and every client you use work on the same file, and each change lands in it right away.
Your spreadsheet stays yours: you keep opening it in Excel or Sheets, sorting and editing it. Nothing about a particular tracker is in the code; the server reads your headers and dropdowns and keeps what it learned in a small config file.
You don't need tracker-mcp if you only want a one-time analysis of your applications, if you rarely update the tracker, or if you only use Claude in a browser or on your phone and don't want to run a server of your own: Claude's Google Sheets connector may be enough. If Claude already keeps your tracker well with instructions you wrote, what you gain is reliability, not new features.
Quick start
Let an agent do it. Paste this into Claude Code or Codex; it installs what is needed, asks where your tracker is, connects it and checks the result:
Install tracker-mcp for me: an MCP server that lets AI keep my job-application spreadsheet.
Read the instructions for agents and follow them:
https://raw.githubusercontent.com/butyavk/tracker-mcp/main/docs/agent-setup.md
First ask me where my tracker is and which app to connect it to.
Don't edit the tracker yourself, and check at the end that it works.Or by hand. You need uv, which also fetches Python for you. Pick your client:
Claude Desktop, the easy way: download tracker-mcp-<version>.mcpb from the
latest release, double-click it,
press Install, choose your tracker file in Your tracker, Save, and switch the
extension on. On a Mac this also avoids the Documents folder problem.
Claude Desktop, by hand. Open Settings → Developer → Edit Config and add:
{
"mcpServers": {
"tracker": {
"command": "uvx",
"args": ["tracker-mcp"],
"env": { "TRACKER_PATH": "/Users/you/Documents/job-tracker.xlsx" }
}
}
}On Windows the path looks like C:\\Users\\you\\Documents\\job-tracker.xlsx
(double backslashes in JSON). Restart Claude Desktop. If Claude can't find uvx,
put its full path in command (which uvx / where uvx). On macOS, if your
tracker is in Documents, Desktop or Downloads, see macOS privacy.
Claude Code: as a plugin (the server plus a weekly-review skill; it asks for the
path to your tracker):
/plugin install tracker-mcp --marketplace butyavk/tracker-mcpor just the server:
claude mcp add tracker -e TRACKER_PATH="$HOME/Documents/job-tracker.xlsx" -- uvx tracker-mcpCursor, VS Code, others: a stdio server with command uvx, arguments
["tracker-mcp"] and the environment variable TRACKER_PATH. Cursor reads the same
JSON as Claude Desktop from ~/.cursor/mcp.json.
From a clone (to change the code, or before a release is out):
git clone https://github.com/butyavk/tracker-mcp && cd tracker-mcp && uv syncand use "command": "uv", "args": ["--directory", "/path/to/tracker-mcp", "run", "tracker-mcp"].
First start
On its first start the server reads your tracker, finds the sheet and the header
row, maps headers to fields (English and Russian headers are understood), works out
what each status in your dropdown means, and writes job-tracker.tracker-mcp.toml
next to the tracker. It does not touch the tracker itself. Ask Claude to describe
your tracker: it shows the mapping and the guesses worth checking. Edit the config
whenever you like; changes apply on the next request, no restart needed.
To see the guess before anything is written, run it yourself:
uvx tracker-mcp init ~/Documents/job-tracker.xlsx # writes the config, lists what to check
uvx tracker-mcp --check --tracker ~/Documents/job-tracker.xlsx # how the config maps the trackerNo tracker yet? uvx tracker-mcp new ~/Documents/job-tracker.xlsx creates an empty
one with dropdowns, a filter, a summary sheet and its config; add --lang ru for Russian
headers and statuses.
A weekly routine
The server answers when asked; it does not send reminders. Two habits make it pay off:
Once a week, run the Weekly review prompt (or just ask "review my job search for this week"): what is due, what went silent, how the funnel moves, and a plan. If your client can run scheduled tasks, schedule that sentence for Monday morning.
After each event, tell Claude in a sentence: "applied to X via Y", "X rejected me", "sent the follow-up to X", "can't follow up with X until Friday". It finds the row, shows the change and writes it when you say yes.
Related MCP server: JobTrack MCP Server
Where your tracker can live
How to point to it | Notes | |
Excel (.xlsx) |
| Dropdowns, filters and summary formulas are kept and extended to new rows |
CSV |
| Exports from Notion, Huntr, Teal or Sheets. The delimiter, the encoding (UTF-8 or Windows-1252) and line endings are kept; statuses come from the config |
Google Sheets |
| Sign in once and pick the sheet, below |
Google Sheets
Sign in once and pick your tracker; there is nothing to set up in Google Cloud:
uvx tracker-mcp auth googleYour browser opens Google's sign-in and then Google's file picker. Choose the spreadsheet
with your applications. tracker-mcp writes its config for that sheet and prints what to
add to your client: the same setup as for a file, with the sheet's URL as TRACKER_PATH.
What tracker-mcp can reach: only the files you pick in Google's picker (or that it creates), through Google's
drive.filepermission. It cannot see your other sheets or files, your e-mail or your contacts. To use another sheet later, run the command again and pick it.Where the sign-in is kept: on your computer, in
~/.tracker-mcp/google-token.json(readable by you only), with backups of changed cells in~/.tracker-mcp/backups/. There is no tracker-mcp server; the program talks to Google directly. To withdraw access, remove tracker-mcp at myaccount.google.com/permissions. The privacy policy has the details.On Google's screens you sign in "to continue to tracker-mcp", with links to its home page and privacy policy. Google has not reviewed the app's brand, so it shows no logo; the access it asks for (
drive.file) is one Google lets apps request without a review.No browser on that computer (a server over SSH):
uvx tracker-mcp auth google --no-browserprints the link; the browser must still reach127.0.0.1on that computer to finish, so forward the port or sign in where the browser is and copy~/.tracker-mcp/.
Your own Google client instead (a fork, a company account that blocks outside apps,
or if you prefer not to rely on this project's client): in the
Google Cloud console, create a project, enable the
Google Sheets API (and the Google Picker API for --pick), configure the consent
screen (External), create an OAuth client of type Desktop app and download its JSON:
uvx tracker-mcp auth google --client-secret ~/Downloads/client_secret_….json --pick # only the sheets you pick
uvx tracker-mcp auth google --client-secret ~/Downloads/client_secret_….json # all your spreadsheetsWithout --pick the permission (spreadsheets) covers every spreadsheet you can open,
although the server opens only the one in TRACKER_PATH; then run
uvx tracker-mcp init "https://docs.google.com/spreadsheets/d/<id>/edit" to write the
config. While your consent screen is in Testing, Google ends the sign-in after 7 days;
publish it (Audience → Publish app) to keep it.
Or a service account: create one, download its key, share your sheet with the
service account's e-mail, and set GOOGLE_APPLICATION_CREDENTIALS=/path/key.json in the
server's environment. The server can then reach only the sheets you share with it.
Remote server: Claude on the web and on your phone
Everything above runs on your computer, so Claude reaches the tracker only from that
computer. tracker-mcp remote serves the same tools over HTTP from a server you run,
for Google Sheets trackers: add it to Claude as a custom connector (Settings →
Connectors → Add custom connector → https://<your server>/mcp) and it works in Claude
on the web, the desktop app and the phone. Several people can use one server; each
signs in with Google and works on their own sheet.
How the sign-in goes:
Claude registers with the server (OAuth dynamic client registration) and opens its sign-in page.
The server sends you to Google: your e-mail and
drive.file, the files you pick.The server checks your e-mail against its allow-list.
A consent page says which app is connecting, as whom and to which sheet. Pick your tracker in Google's file picker, start a new one, or continue with the sheet you chose last time.
Claude gets the server's own tokens (an hour, refreshed for 30 days, rotated on every use), never your Google token, which the server keeps encrypted.
Writes work as on your computer: preview, your yes, a backup, undo. In claude.ai answer
the preview with a yes that names the change ("yes, row 12: status → Interview"): its
own safeguards may refuse a write approved with a bare "yes". The server keeps
the backups and the audit log per person. Not available remotely:
export_followups_calendar (no files to hand you; use the calendar prompt) and Excel or
CSV files.
Running one on Google Cloud Run, from Cloud Shell:
git clone https://github.com/butyavk/tracker-mcp && cd tracker-mcp
./deploy/cloudrun.sh --project <project-id> --dry-run # prints the addresses to register
./deploy/cloudrun.sh --project <project-id> --client-id <web client id> \
--allow you@gmail.com,friend@gmail.comBefore that, in the project: billing on; an OAuth client of type Web application
with the redirect URI and JavaScript origin the dry run prints, and openid and
email added to its Data Access scopes next to drive.file. The script creates a
private Cloud Storage bucket for the server's data, an encryption key in Secret Manager,
the file picker's API key (Picker API only, your server's address only; or pass yours
with --picker-key), asks for the client's secret without showing it, and deploys one
instance. At personal use it fits Cloud Run's free tier; the bucket costs cents.
Clients may register only with Claude's connector callback (on claude.ai or
claude.com) or an address on your own machine, for the MCP Inspector;
TRACKER_MCP_REDIRECT_URIS changes the list.
Other hosts: the Dockerfile runs tracker-mcp remote; the settings are in
tracker-mcp remote --help. Whoever runs a server can reach the sheets of the people
who sign in to it, so use one run by someone you trust.
What Claude can do with it
Tool | Kind | What it does |
| read | How the tracker is laid out: fields → columns, allowed and closed statuses, follow-up rule |
| read | Filter by status, company/role text, submit dates |
| read | Every column of one application (by text or row) |
| read | Follow-ups due within N days, overdue first; submitted rows with no follow-up date |
| read | Still waiting, silent N+ days since the last touch (the submit date or the newest dated follow-up log entry), no follow-up planned |
| read | Counts by status and month; a cohort for a date range |
| read | Submitted → replied → screening → interview → offer, in total and by channel, source, month or any column |
| read | What hand edits left behind: dates kept as text, rows without a status, statuses not in the dropdown, weekend follow-ups, closed rows with a planned follow-up, the furthest stage behind the status, replies without a date, duplicates |
| read | Days from submitting to the first reply (median, 75th percentile), in total and by group, and how many silent applications still got a reply after 7, 14, 21, 30, 45, 60 days |
| read | Which application each e-mail is about (confirmation, rejection, interview, offer) and the write that would record it |
| read | Audit log of the server's writes |
| write | New row with the not-applied status; other columns via |
| write | Submitted: date, channel, status, follow-up date by your rule |
| write | New status from your dropdown; a closed status cancels the pending follow-up; the first reply fills the reply date ( |
| write | Log a sent follow-up, schedule the next one or close |
| write | Move the next follow-up, or plan none, when nothing was sent (no contact yet, waiting for credits) |
| write | Correct fields of one row: a wrong or missing date, a typo, the furthest stage, a custom column; dates are checked, the reason goes to the notes |
| write | Add a column after the last one, styled like its neighbour, and map it in the config ( |
| write | Close stale applications (or chosen rows) in one write, one backup, one undo step |
| write | Fix what |
| read | The open follow-ups as all-day events with a stable id line, so the client's calendar tool can add, move and remove them without duplicates |
| file | The open follow-ups as an |
| write | Restore the state before the last write, if nothing changed since |
Four prompts, for clients that show MCP prompts: Weekly review checks the
tracker and goes through follow-ups, stale applications, reply times, the funnel and
this week's submissions, and ends with a plan; Update the tracker from my e-mail
has the client's own mail tool find replies from companies, matches them with
match_emails and proposes the changes; Put my follow-ups in my calendar keeps
the client's calendar in step (below); Draft a follow-up writes a short message
for one row. Two resources: tracker://layout and tracker://application/{row}.
add_application and mark_applied warn when the same company already has an
application submitted within 28 days ([rules] same_company_days); the warning shows
in the preview and does not stop the write.
Reply dates and when to stop waiting
Give the tracker a reply-date column (Replied on, Дата ответа; the new template
has one) and set_status fills it on the first reply: a rejection or any funnel
stage, with on= for the e-mail's date. check_tracker fills past ones from the
Response column (the earliest date there that is not about the application being
received) for you to approve. Then reply_times says how long your replies take per
channel, and after how many silent days they stopped coming: the point where closing
an application costs nothing. Without the column, it uses only the replies recorded
through the server.
Follow-ups in your calendar
tracker-mcp calendar --tracker ~/Documents/job-tracker.xlsx (or the
export_followups_calendar tool) writes the open follow-ups as an .ics file next to
the tracker: one all-day event each, overdue ones on today, with the contact and the
last log line. Open the file to import it into Calendar, Outlook or Google Calendar.
It is a snapshot: after the dates change, export and import again (each event keeps
its ID; importing into a calendar of its own makes an old copy easy to clear).
To keep a calendar in step instead, use the Put my follow-ups in my calendar
prompt with a client that has a calendar tool (Claude with the Google Calendar
connector, say). calendar_events gives each follow-up an id line at the end of its
description; the client finds the events already there by it, then adds the new ones,
moves the changed ones and deletes those whose application closed, after asking you.
It never touches events without an id line. The server itself does not sign in to
your calendar.
Read tools are marked read-only. Writes are marked destructive where they
overwrite cells, and all of them take dry_run, expected_version and confirm.
How a write stays safe
The server checks your yes. Before a write it computes the plan, the exact cell changes at the current version of the tracker. A client with confirmation dialogs (MCP elicitation) shows it to you there; otherwise the write needs the token of a dry run that you saw, which fingerprints the changes and the version. The write lands exactly as approved, or not at all.
Nobody's edit is lost. Each read returns a
version(a hash of the file, or of the sheet's values); a write against an old version is refused, and so is a write while Excel has the file open.Write, check, keep a backup. Files are written to a temporary copy, re-read cell by cell, backed up and swapped in atomically; a Google Sheet gets one update of the changed cells, is read back and rolled back on any difference.
Audit and undo: one line per write; undo only if nothing changed since.
Your data is data: text never turns into a formula, and the model is told not to follow instructions found in cells (a pasted job post). See SECURITY.md.
Allowed statuses come from the status column's dropdown. Columns are found by header text, not by letter, so you can reorder them. When a row is added to an .xlsx file, the server stretches dropdowns, the filter and summary formulas to it.
Config
job-tracker.xlsx is described by job-tracker.tracker-mcp.toml next to it (for a
Google Sheet, ~/.tracker-mcp/<id>.tracker-mcp.toml), or by the file TRACKER_CONFIG
points to. uvx tracker-mcp example prints a config with every key explained
(examples/tracker-mcp.example.toml). In short:
sheet = "Applications"
[columns] # field = header text (exact, else the first header starting with it)
company = "Company" # company, role and status are required
role = "Role"
status = "Status"
applied_on = "Applied on"
followup_on = "Follow-up date"
followup_log = "Follow-up log"
salary = "Salary" # any other key is a custom field
[statuses]
not_applied = "Not applied"
applied = "Applied"
closed = ["Rejected", "Withdrawn", "No response", "Offer"]
rejected = ["Rejected"]
[statuses.stages] # funnel stages after a reply, in order
screening = ["Screening"]
interview = ["Interview", "Final"]
offer = ["Offer"]
[followups]
first_after_days = 10
next_after_days = 14
weekend_to_monday = trueA missing optional column only switches off what needs it: with no follow-up
column, followups_due says so. The config is validated strictly, so a typo in a
key is an error, not a silent default. If an edit breaks the config, every request
says why until it is fixed.
The funnel counts a rejection as a reply and needs to know your stages
([statuses.stages]). The status column only holds the current state, so add a
reached column ("Furthest stage") for the furthest stage, or a rejection after an
interview counts as just a reply; set_status moves it forward, never back.
Free-text columns such as the source are grouped by their text up to the first
bracket or dash ("Ashby (direct form)" → "Ashby"), or by substrings you list in
[funnel.groups] (all columns) or [funnel.by.source] (one column).
Variable | Option | |
|
| The tracker: a file path or a Google Sheets URL (required) |
|
| The config, if not next to the tracker |
|
| Backups and |
| A service account key, for Google Sheets | |
| Where the Google sign-in and Sheets configs live (default |
Known limits
The version covers the whole tracker, so any edit elsewhere in it invalidates a pending write. Fine for one person; a shared tracker would need row-level versions.
A small window remains between the last version check and the write: neither an .xlsx file nor the Sheets API offers real locking.
openpyxl cannot keep some parts of newer Excel files, such as dropdowns that take their list from another sheet and are stored in an extension. If loading the file warns that a part would be removed, the server refuses writes to that workbook rather than drop it, and says so. Reading works.
openpyxl drops cached formula values; the server asks Excel to recalculate on open.
In a CSV file, text the server writes that starts like a formula (
=,+,@,-1…) gets a leading apostrophe, so Excel shows it as text.The config is named after the tracker without its extension, so
jobs.xlsxandjobs.csvin one folder would share one; give one of themTRACKER_CONFIG.Only .xlsx and .csv files: an .xlsm would lose its macros on save, and .xls, .ods or Numbers files need saving as .xlsx first.
initunderstands English and Russian headers and status words. In other languages it maps less and lists the rest under "check by hand".Undo goes back one step only. For a Google Sheet it restores values, not formatting.
Without a dialog, the token proves that a preview was made and nothing drifted since. It cannot prove the model showed you that preview.
The remote server keeps its data as files and runs as one instance; it is meant for a person and a few friends, not for a crowd.
macOS: Claude Desktop and your Documents folder
The easy way: use the Claude Desktop extension (tracker-mcp-<version>.mcpb from
the releases). Claude Desktop runs an
extension under its own permissions, so a tracker in Documents works: in our test
(Claude Desktop 2.42304, October 2026) the extension read a tracker in ~/Documents
with nothing else to set up. If macOS asks whether Claude may access the folder, allow it.
The rest of this section is about adding the server to Claude Desktop's config by hand.
Claude Desktop starts such servers without its own privacy permissions. If your
tracker is in Documents, Desktop or Downloads, the server may fail with "Operation
not permitted" in its log (Settings → Developer), and
macOS never shows a prompt. Full Disk Access for Claude does not change that.
Moving the tracker to another folder (say ~/JobSearch) is the simplest fix.
To keep it where it is, sh install.sh /absolute/path/to/tracker.xlsx (from a clone)
builds a tiny launcher app, ~/Applications/Tracker MCP.app (macos/launcher.c,
about 60 lines of C, signed locally). It starts the server as its child, so macOS
asks once whether "Tracker MCP" may access Documents, and only this app gets that
permission. The script also runs the tests, backs up Claude Desktop's config and
adds the server to it; quit Claude first.
Development
uv sync
uv run pytest # the tests use synthetic trackers and a fake Sheets API
uvx ruff check src tests evals
npx @modelcontextprotocol/inspector uv --directory . run tracker-mcp --tracker /path/tracker.xlsx
ANTHROPIC_API_KEY=… uv run python evals/run_evals.py # does a model use the tools right? (a few cents)src/tracker_mcp/tracker.pyis the tracker logic; it knows nothing about MCP or storage.stores.pyreads and writes .xlsx and .csv files;gsheets.pydoes Google Sheets.config.pyis the config schema (pydantic, strict);scaffold.pyisinitandnew.server.pyholds the MCP tools, prompts, resources and the confirmation flow.evals/checks that a model picks the right tools, asks before writing and ignores instructions planted in a cell.macos/is the launcher for Claude Desktop;mcpb/builds the Claude Desktop extension.
See CONTRIBUTING.md for how releases are made. Built with the official MCP Python SDK. MIT licensed.
Available Tools
23 toolsadd_applicationAdd an applicationA
Add a new row with the not-applied status. Refuses a duplicate (same company+role or link).
The tool writes only with the user's yes. The client may ask in its own confirmation dialog. Otherwise call with dry_run=true, show the preview to the user, and after they agree in a new message repeat the same call with confirm=. The write is refused if the tracker changed since expected_version. A backup is taken first, and undo_last_write reverts the write.
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | Application URL | |
| role | Yes | Job title, as in the posting | |
| extra | No | Other columns: a field name from describe_tracker or an exact header text -> value | |
| notes | No | Text for the notes column | |
| company | Yes | Company name | |
| confirm | No | Token from the dry run the user approved. Not needed when the client shows the server's confirmation dialog | |
| dry_run | No | Only show what would change, plus the confirm token; write nothing | |
| allow_duplicate | No | Add it even though the same company+role or link is already in the tracker (a second application on purpose) | |
| expected_version | No | `version` from your last read; the write is refused if the file changed since |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: a backup is taken first, undo_last_write can revert it, the write is refused on a version mismatch, and duplicates are rejected on company+role or link. The annotations only mark it non-read-only and non-destructive; the description supplies the actual safety and failure semantics an agent needs.
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?
Purpose and duplicate rule are front-loaded in the first two sentences, and the confirmation protocol follows in a compact paragraph. Slightly dense, but each sentence carries non-obvious operational 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?
With an output schema present, annotations covering the safety profile, and 100% schema coverage, the description fills the remaining gaps: consent flow, token mechanics, optimistic-concurrency refusal, backup/undo. Nothing needed to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents company, role, link, notes, extra, confirm, dry_run, allow_duplicate and expected_version. The description only reinforces confirm and expected_version, which the schema already explains; it adds no new meaning for the remaining parameters. 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?
States a specific verb and resource ('Add a new row') and pins down the resulting state ('not-applied status') plus the duplicate-refusal rule, which lets an agent distinguish it from edit_application or set_status. It never names a sibling explicitly, so differentiation is inferred rather than declared.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete usage protocol: write only after user consent, either via the client's own confirmation dialog or via dry_run=true followed by a repeat call with confirm=<token> in a new user message. What is missing is guidance on the create-vs-edit boundary (when to prefer edit_application or allow_duplicate for an intentional second application).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_columnAdd a columnADestructive
Add a column after the last one, its header styled like its neighbour's, and with
field map it in the config so the tools start using it: describe_tracker's
unavailable_tools says which columns a tool is missing. Only at the end, so no
formula, dropdown or filter of the sheet moves. Undo removes the column and the
config line together.
The tool writes only with the user's yes. The client may ask in its own confirmation dialog. Otherwise call with dry_run=true, show the preview to the user, and after they agree in a new message repeat the same call with confirm=. The write is refused if the tracker changed since expected_version. A backup is taken first, and undo_last_write reverts the write.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | date formats the cells as dates (implied by a date field) | text |
| field | No | Also map it in the config so the tools use it: replied_on (reply date), reached (furthest stage), followup_on, channel, … or a new name of your own; omit for a column the tools only show | |
| header | Yes | The header text, in the tracker's language | |
| confirm | No | Token from the dry run the user approved. Not needed when the client shows the server's confirmation dialog | |
| dry_run | No | Only show what would change, plus the confirm token; write nothing | |
| options | No | A dropdown with these values (Excel; for reached the stages by default) | |
| expected_version | No | `version` from your last read; the write is refused if the file changed since |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say destructive/non-idempotent; the description adds the real behavioural detail: an undo reverts the column and the config line together, a backup is taken first, the write is refused when expected_version is stale, and the confirm/dry_run handshake is spelled out. That is exactly the context an agent needs before a destructive write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and placement, then the confirmation workflow, then safety guarantees — a sensible order. Dense but each sentence carries information; the opening clause about header styling is slightly convoluted but still 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?
An output schema exists so return values needn't be described, and the description covers the remaining burden for a destructive, non-idempotent mutation: preview flow, confirmation token, version conflict handling, backup, and undo. Nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value by explaining why `field` exists (it makes other tools use the column) and by explicitly tying `expected_version` to a refusal on concurrent change. It does not elaborate on `kind`, `options` interaction, or header language, so it sits above baseline but not at 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (add a column), plus the exact placement and styling rule: inserted after the last column with the header styled like its neighbour's. It also flags the config-mapping side effect for `field`, which no sibling tool does, so the agent can tell it apart from edit_application or fix_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?
Explains when to set `field` (so the tools start using the column, checked via describe_tracker's unavailable_tools) and when to omit it, and gives the ordering rationale that columns must be added at the end. It does not name a sibling alternative to use instead when the column already exists, which keeps it 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.
calendar_eventsFollow-ups as calendar eventsARead-only
The open follow-ups as all-day calendar events: date (an overdue one on today), title and description. Each description ends with a line "tracker-mcp id: "; search the calendar for it to update an event instead of adding a second one. For the user's own calendar tool (see the sync_calendar prompt); the tracker is not touched.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Follow-ups due up to this many days ahead |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses meaningful behavior: events are all-day, overdue follow-ups are placed on today, each description ends with a tracker-mcp id line, and callers should search the calendar for that id to update rather than duplicate. It also clearly states the tracker is not touched, consistent with readOnlyHint=true. No annotation contradiction is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the core concept: open follow-ups rendered as all-day calendar events. Every clause contributes useful information about event format, duplicate avoidance, and tracker isolation, though the semicolon-heavy phrasing is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema, annotations, and single fully documented parameter, the description supplies the remaining context an agent needs: it explains the event shape, the embedded tracker-mcp id, duplicate handling, and the fact that the tracker is not modified. No essential behavioral or integration detail appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter, days, is already fully described in the schema as 'Follow-ups due up to this many days ahead'. The tool description itself does not add further meaning, constraints, or examples for this parameter. With 100% schema coverage and only one parameter, the baseline score 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 establishes that this tool exposes open follow-ups as all-day calendar events with date, title, and description, and notes that overdue items appear on today. It is understandable, but it does not explicitly name the closest sibling, export_followups_calendar, or use a direct verb such as 'export' or 'generate', leaving some sibling differentiation implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: it is for the user's own calendar tool via the sync_calendar prompt, and the tracker is not modified. It also explains how to avoid duplicates by searching the calendar for the embedded tracker-mcp id before adding another event. It does not explicitly compare against alternative tools such as followups_due or export_followups_calendar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_trackerCheck the trackerARead-only
Find what hand edits leave behind, row by row: dates kept as text or bare numbers (Excel cannot sort or filter them as dates), rows with no status or a status not in the dropdown, follow-ups on a weekend or on closed applications, waiting applications with no follow-up date, the applied column disagreeing with the status, the furthest stage behind the status, replies without a reply date (with the date found in the response text), duplicates. Each issue says whether fix_tracker can fix it.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | At most this many issues listed |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description still adds real behavioral context: it is per-row diagnostic output, it names the detection heuristics (e.g. dates stored as text, applied column disagreeing with status, reply date recovered from response text), and it flags per-issue fixability. It stops short of describing ordering or whether results are truncated at the limit, which is a minor gap.
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?
It is one long but dense sentence with the core purpose front-loaded ('find what hand edits leave behind, row by row') and the issue catalogue as an efficient list. The nested parentheticals make it slightly heavy to parse, but every clause names a real detection case rather than 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?
With an output schema present, the description need not explain return shape, and annotations cover the safety profile; the parameter is documented at 100% coverage. What remains uniquely on the description's shoulders, the set of issues detected and their fixability, is fully spelled out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'limit' parameter is fully documented in the schema (default 200, max 1000), so the baseline is 3. The description adds nothing about what 'limit' truncates or how ordering interacts with it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('find what hand edits leave behind') on a specific resource (tracker rows) and then enumerates the concrete defect classes it detects, which distinguishes it sharply from siblings like summary, list_applications, and fix_tracker. An agent can tell exactly what this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing line 'Each issue says whether fix_tracker can fix it' establishes the remediation path and implies the check-then-fix workflow. It does not, however, state explicit preconditions or when to prefer describe_tracker or list_applications instead, so the routing is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_staleClose stale applicationsADestructive
Close stale applications in one write: the no-response status, no follow-up date, a line in the follow-up log. One backup and one undo step for the whole batch.
The tool writes only with the user's yes. The client may ask in its own confirmation dialog. Otherwise call with dry_run=true, show the preview to the user, and after they agree in a new message repeat the same call with confirm=. The write is refused if the tracker changed since expected_version. A backup is taken first, and undo_last_write reverts the write.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Submitted at least this many days ago | |
| rows | No | Only these rows (each must be stale); default: all from stale_applications | |
| confirm | No | Token from the dry run the user approved. Not needed when the client shows the server's confirmation dialog | |
| dry_run | No | Only show what would change, plus the confirm token; write nothing | |
| expected_version | No | `version` from your last read; the write is refused if the file changed since |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds substantial context beyond them: a backup is taken first, one undo step reverts the whole batch, and the write is refused if expected_version no longer matches. This is exactly the safety and concurrency information an agent needs before invoking a destructive batch mutation.
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?
Content is front-loaded, with the mutation summary first and the confirmation protocol second, and no sentence is filler. The confirmation paragraph is a dense multi-clause sentence, slightly reducing scannability, but the density is justified by the safety-critical content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and rich annotations, the description only needs to cover invocation protocol and risk, both of which it does thoroughly — including the client-dialog vs. token path and the backup/undo guarantee. Nothing required to call this destructive batch tool safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description earns extra credit by explaining the sequencing between dry_run and confirm (token obtained from the approved dry run) and the refusal semantics of expected_version. It does not elaborate on formatting of the token or partial-failure behavior across rows, keeping it below a 5.
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 opening states a specific verb and resource ('Close stale applications in one write') and enumerates the exact fields mutated (status, follow-up date, log entry), which separates it cleanly from the sibling stale_applications read tool. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit conditional workflow: if the client provides its own confirmation dialog, proceed; otherwise call with dry_run=true, show the preview, and repeat with confirm=<token> after approval in a new message. It also names undo_last_write as the recovery path and states the rows parameter defaults to the stale_applications set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_trackerDescribe the trackerARead-only
How this tracker is laid out: field -> column, custom fields, other headers
(usable by exact text in add_application's extra and in funnel's by), allowed
statuses, which statuses are closed, the follow-up rule, and tools this layout
cannot support (unavailable_tools). On the first start the server writes the
config itself; then config_generated says where, and what to check.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context: the server writes config on first start and `config_generated` reports where it is and what to check.
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 front-loaded with the tool's purpose and packs useful details into two sentences. It is dense but not wasteful, though the parenthetical and list make it slightly harder to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to enumerate return values in full. It still explains the key returned concepts and the first-start config behavior, making it complete enough for a zero-parameter, read-only introspection 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?
The tool takes zero parameters, so parameter semantics are inherently simple and the schema has full coverage. No additional parameter guidance is needed.
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 that this tool reports the tracker's layout: field-to-column mapping, custom fields, headers, statuses, closed statuses, follow-up rule, and unsupported tools. It is specific about the returned information, though it does not explicitly distinguish itself from siblings like check_tracker or fix_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?
Usage is implied by references to add_application's `extra` and funnel's `by`, suggesting the tool helps callers learn exact header text before using those tools. However, there is no explicit when-to-use guidance, no exclusions, and no direct comparison with check_tracker or fix_tracker.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_applicationCorrect fields of an applicationADestructive
Correct fields of one row by hand: a wrong or missing date, a typo in the company or role, the furthest stage, the link, a custom column. Dates are checked (a submit or reply date cannot be in the future, a reply cannot come before the submit) and written as dates. The status is changed with set_status, a sent follow-up recorded with log_followup, a moved one with reschedule_followup: they keep the related columns in step. The preview shows the old and new value of each cell.
The tool writes only with the user's yes. The client may ask in its own confirmation dialog. Otherwise call with dry_run=true, show the preview to the user, and after they agree in a new message repeat the same call with confirm=. The write is refused if the tracker changed since expected_version. A backup is taken first, and undo_last_write reverts the write.
| Name | Required | Description | Default |
|---|---|---|---|
| row | Yes | Sheet row number of the application (see list/get results) | |
| fields | Yes | Field name (see describe_tracker) -> new value; null clears the cell. Dates as YYYY-MM-DD | |
| reason | Yes | Why, in a few words ("from the rejection e-mail of 02.10"); goes to the notes with what changed | |
| confirm | No | Token from the dry run the user approved. Not needed when the client shows the server's confirmation dialog | |
| dry_run | No | Only show what would change, plus the confirm token; write nothing | |
| expected_version | No | `version` from your last read; the write is refused if the file changed since |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a destructive, non-idempotent write, and the description adds substantial context beyond them: user confirmation is required, a dry_run/confirm token flow is specified, expected_version guards against concurrent changes, a backup is taken first, and undo_last_write can revert the write. These details are consistent with the annotations and materially improve safe invocation.
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 front-loaded with the purpose and correction examples, then moves into validation, alternatives, and the confirmation workflow. Despite its length, every sentence carries necessary operational detail for a destructive write tool, with no redundant or filler text.
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 destructive mutation, six parameters, nested fields object, and existing output schema, the description covers everything an agent needs: what can be corrected, which siblings handle related changes, how to preview and confirm writes, how concurrency is guarded, and how undo works. No critical behavioral or procedural gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter. The description adds useful semantic detail beyond the schema, particularly date validation rules: a submit or reply date cannot be in the future and a reply cannot precede the submit date. It also clarifies that related status and follow-up changes belong to other tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Correct fields of one row by hand' with concrete examples such as a wrong date, typo in company or role, furthest stage, link, or custom column. It also distinguishes the tool from siblings by explicitly routing status changes to set_status and follow-up changes to log_followup or reschedule_followup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear conditions for use (manual corrections to specific fields) and explicitly names alternatives for related operations: set_status for status, log_followup for sent follow-ups, and reschedule_followup for moved follow-ups. The confirmation workflow further clarifies the required invocation sequence with dry_run and confirm.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_followups_calendarExport follow-ups to a calendar fileAIdempotent
Write the open follow-ups as an .ics file next to the tracker (overdue ones on today), to import into Calendar, Outlook or Google Calendar; the tracker itself is not touched. If your client has a calendar tool, you can add the events there instead: followups_due has the same data.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Follow-ups due up to this many days ahead |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond annotations: the file is written next to the tracker, the tracker itself is untouched, and overdue follow-ups are mapped onto today. Combined with readOnlyHint=false and idempotentHint=true this is coherent, though it doesn't state the filename or whether an existing .ics is overwritten.
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 artifact, with the alternative pushed to the end. Density is high but nearly every clause carries information; a slight syntax parse cost comes from the embedded parenthetical about overdue items.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers side effects and the fallback path. Minor gaps remain around file naming and overwrite behavior for a repeated idempotent export.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'days' parameter is fully documented there, so the baseline applies. The description never mentions the look-ahead window, leaving a reader of the prose alone to wonder how far ahead follow-ups are exported.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and output artifact ('write the open follow-ups as an .ics file next to the tracker') plus the destination use case (Calendar, Outlook, Google Calendar). That clearly distinguishes it from followups_due, which returns the same data as tool output rather than a file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule: if the client has a calendar tool, add events there instead, since followups_due carries the same data. It does not address the sibling calendar_events or explain when a file export is preferable to reading calendar events, which keeps it 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.
fix_trackerFix the trackerADestructive
Fix the fixable issues check_tracker found, in one write with one backup and one undo step: text dates become real dates, a missing status gets the not-applied (or applied) one, weekend follow-ups move to Monday, closed applications lose a planned follow-up, the furthest stage catches up with the status, missing reply dates are filled from the response text.
The tool writes only with the user's yes. The client may ask in its own confirmation dialog. Otherwise call with dry_run=true, show the preview to the user, and after they agree in a new message repeat the same call with confirm=. The write is refused if the tracker changed since expected_version. A backup is taken first, and undo_last_write reverts the write.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | Only these rows; default: all | |
| kinds | No | Only these kinds of issue from check_tracker; default: every fixable one | |
| confirm | No | Token from the dry run the user approved. Not needed when the client shows the server's confirmation dialog | |
| dry_run | No | Only show what would change, plus the confirm token; write nothing | |
| expected_version | No | `version` from your last read; the write is refused if the file changed since |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses that the tool takes a backup, performs one write and one undo step, requires the user's yes, and supports undo_last_write. It also explains the version-check refusal behavior, which is important for a destructive write 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 front-loaded with purpose and then safety workflow, and every sentence earns its place. The enumeration of fixes is dense but useful for an agent deciding whether this tool will make the needed changes.
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 destructive multi-fix mutation with an output schema, the description covers the essential context: what gets fixed, the approval protocol, backup and undo behavior, and version-conflict handling. Nothing critical is missing for correct invocation.
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 workflow semantics for dry_run, confirm, and expected_version that the schema alone does not fully convey. It does not add much beyond the schema for rows and kinds, which keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Fix the fixable issues check_tracker found') and enumerates the exact repairs performed. It clearly differentiates this tool from check_tracker, which detects issues, and undo_last_write, which reverses writes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit workflow guidance: use after check_tracker, call with dry_run=true first unless the client shows its own confirmation dialog, then repeat with the confirm token after user approval. It also states that writes are refused if expected_version no longer matches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
followups_dueFollow-ups dueARead-only
Follow-ups due by today + within_days (overdue included), plus submitted applications that have no follow-up date at all.
| Name | Required | Description | Default |
|---|---|---|---|
| within_days | No | Look this many days ahead |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral detail beyond that: overdue items are included in the window, and applications with no follow-up date at all are appended to the result set — a non-obvious composition rule an agent would otherwise miss.
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?
One dense sentence with no filler, and the primary criteria are front-loaded before the secondary 'no follow-up date' clause. Slightly compressed phrasing ('due by today + within_days') costs a little readability but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape needn't be explained, and annotations cover safety. For a single optional-parameter read tool, the description supplies what structured fields cannot: inclusion rules, the today anchor, and the union with undated applications. Only ordering/sort behavior is unstated, which is minor.
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% (single param documented as 'Look this many days ahead' with default 7, range 0-60), so baseline is 3. The description adds the reference point the schema lacks — the window is anchored at today and extends forward, with overdue included — which meaningfully interprets within_days=0 and the default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (follow-ups) and precisely states its selection scope: due by today + within_days, overdue included, plus submitted applications lacking a follow-up date. That distinguishes it from mutation siblings like log_followup/reschedule_followup, though the verb is implicit and no sibling is named as an alternative.
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?
Usage is implied by the selection criteria rather than stated: an agent can infer this is the 'what's due' query, but nothing says when to prefer it over stale_applications, summary, or export_followups_calendar. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
funnelFunnelARead-only
Conversion of submitted applications: how many got any reply (a rejection counts), and how many reached each funnel stage (screening, interview, offer, as configured). In total and per group, with rates in percent of submitted.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | Group by: 'channel', 'source', 'month', or another field from describe_tracker. Default: channel if the tracker has one, else month | |
| since | No | Only applications submitted on/after | |
| until | No | Only applications submitted on/before |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Read-only behavior is already declared by readOnlyHint, so the description wisely spends its words on semantics instead: it clarifies that a rejection counts as a reply and that stages come from the tracker configuration, which an agent could not infer otherwise. It does not mention pagination or performance characteristics, but that is a minor omission for an aggregate 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?
Two sentences, no filler: the first names the metric and its edge case, the second states the aggregation and rate basis. Front-loaded and every clause carries 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?
With an output schema present, full parameter documentation and read-only annotations, the description need only supply the conceptual model, and it does: what counts as a reply and where stage definitions come from. The only gap is the absence of explicit routing guidance among the many sibling analysis tools.
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 'by', 'since' and 'until' each fully documented including defaults and allowed values. The description only alludes to grouping ('per group') and date scoping ('submitted') without adding anything the schema lacks, 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 states a specific computation: conversion of submitted applications into reply counts and configured funnel stages, aggregated in total and per group with percentage rates. It is clear what the tool produces, but it does not explicitly distinguish itself from analytics-focused siblings such as summary or reply_times.
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?
Usage is only implied by the tool's analytical nature; there is no explicit statement of when to use this versus summary or reply_times, nor any exclusions or prerequisites. The 'as configured' phrasing hints that the tracker must be inspected first (describe_tracker) but does not say so as a precondition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_applicationGet an applicationARead-only
Everything recorded for one job application: every column, the notes and the
follow-up log. Find it by row, or by company or role text in query. A text
that matches several rows returns all of them. Use it before a write to show the
user the current values. To browse many rows in brief, use list_applications.
| Name | Required | Description | Default |
|---|---|---|---|
| row | No | Exact sheet row number | |
| query | No | Company or role text, e.g. 'Acme' |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral detail: it returns every column plus notes and the follow-up log, and a text query matching several rows returns all matches. It does not specify no-match behavior, but otherwise adds solid context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with what is returned, then how to locate it, then usage guidance and the sibling alternative. Every sentence contributes useful selection or invocation information without 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?
Given the tool's low complexity, two fully documented parameters, existing output schema, and read-only annotations, the description is complete enough. It covers return scope, lookup modes, multi-match behavior, workflow usage, and the relevant alternative 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 description coverage is 100%, so the schema already documents `row` as an exact sheet row number and `query` as company or role text. The description adds meaningful semantics by explaining that `query` can match multiple rows and return all of them, though it does not clarify precedence if both parameters are supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific retrieval resource and scope: 'Everything recorded for one job application: every column, the notes and the follow-up log.' It also distinguishes this tool from the sibling list_applications by noting that list is for browsing many rows in brief.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly gives a workflow condition: 'Use it before a write to show the user the current values.' It also names the alternative for a different need: 'To browse many rows in brief, use list_applications.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_applicationsList applicationsARead-only
Browse the job applications in the tracker, one line each: row, company, role, status, submit and follow-up dates. Filter by status, by company or role text, by submit dates, or show open ones only. For every column of one row use get_application. For counts use summary or funnel, and for what is due use followups_due.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | At most this many rows | |
| query | No | Substring of company or role, case-insensitive | |
| status | No | Filter by status; comma-separated for several | |
| open_only | No | Hide closed statuses (rejected, withdrawn, ...) | |
| applied_since | No | Only applications submitted on/after | |
| applied_until | No | Only applications submitted on/before |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered, and an output schema exists. The description still adds real value by disclosing the compact one-line-per-application projection, which is why an agent picks this over get_application. It stops short of mentioning the default 100-row cap or any truncation behavior beyond the limit parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with purpose and output shape, followed by filter affordances and then sibling routing. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a fully documented schema and an output schema covering return values, the remaining burden is scope and routing — both fully handled. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are self-documenting. The description's sentence about filtering by status, company/role text, submit dates, and open-only merely restates those parameters in prose without adding syntax or edge-case guidance. 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?
States a specific verb and resource ('Browse the job applications in the tracker') and immediately defines the shape of what comes back ('one line each: row, company, role, status, submit and follow-up dates'). This makes it clearly distinguishable from get_application, which returns every column of a single row.
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 routes to alternatives by task: 'For every column of one row use get_application. For counts use summary or funnel, and for what is due use followups_due.' It also lists the filter dimensions inline, so the agent knows which narrowing options exist before opening the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_followupLog a follow-upADestructive
Record a follow-up that the user actually sent for one job application. The tool
appends text to the follow-up log and replaces the contact if one is given. It
also sets the next follow-up date: next_on, or the follow-up rule counted from
today. final=true clears the date, so there are no more follow-ups while the status
stays open. Use reschedule_followup when nothing was sent and only the date moves.
Use set_status when the company replied or the application closes. followups_due
lists what is due.
The tool writes only with the user's yes. The client may ask in its own confirmation dialog. Otherwise call with dry_run=true, show the preview to the user, and after they agree in a new message repeat the same call with confirm=. The write is refused if the tracker changed since expected_version. A backup is taken first, and undo_last_write reverts the write.
| Name | Required | Description | Default |
|---|---|---|---|
| row | Yes | Sheet row number of the application (see list/get results) | |
| text | Yes | What was sent and to whom; appended to the follow-up log | |
| final | No | No more follow-ups: clears the follow-up date | |
| confirm | No | Token from the dry run the user approved. Not needed when the client shows the server's confirmation dialog | |
| contact | No | Replace the follow-up contact / channel | |
| dry_run | No | Only show what would change, plus the confirm token; write nothing | |
| next_on | No | Next follow-up date; default from the follow-up rule | |
| expected_version | No | `version` from your last read; the write is refused if the file changed since |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining the consent requirement, the dry_run/confirm-token flow, the expected_version conflict check, and the backup/undo behavior. These details are important for a destructive, non-idempotent write tool and are not contradicted by the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well structured and front-loaded: it states the core action first, then alternatives, then the write-safety workflow. Given the tool's complexity and confirmation requirements, every sentence carries useful 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?
Although an output schema exists, the description provides the behavioral context an agent needs: when to use it, what it mutates, how confirmation works, conflict handling, and rollback. It is complete for a complex write tool with eight parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds useful semantics beyond the schema: final=true clears the date and prevents further follow-ups, next_on defaults from the follow-up rule, and confirm is tied to the dry-run flow. It does not individually explain every parameter, but it substantially enriches the important interactions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: recording a follow-up the user actually sent for one job application. It also distinguishes the tool from reschedule_followup, set_status, and followups_due, so an agent can select it without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool versus alternatives: use reschedule_followup when nothing was sent, set_status when the company replied or the application closes, and followups_due to list what is due. The confirmation workflow for writes is also clearly described.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_appliedMark as appliedADestructive
Record that the user submitted an application that is already a row in the tracker. Add a new one with add_application first. The write sets the applied flag, the submit date, the channel and the applied status, unless the row already has another status. It also sets the first follow-up date by the follow-up rule and adds a line to the follow-up log. An existing follow-up date is kept unless followup_on is given. A row already marked as applied is refused; correct its date with edit_application. The tool warns when the same company got another application within a few weeks. Replies and closing go through set_status.
The tool writes only with the user's yes. The client may ask in its own confirmation dialog. Otherwise call with dry_run=true, show the preview to the user, and after they agree in a new message repeat the same call with confirm=. The write is refused if the tracker changed since expected_version. A backup is taken first, and undo_last_write reverts the write.
| Name | Required | Description | Default |
|---|---|---|---|
| row | Yes | Sheet row number of the application (see list/get results) | |
| note | No | Appended to the notes column | |
| channel | No | How it was sent, e.g. 'Ashby (direct form)' | |
| confirm | No | Token from the dry run the user approved. Not needed when the client shows the server's confirmation dialog | |
| dry_run | No | Only show what would change, plus the confirm token; write nothing | |
| applied_on | No | Submit date; default today | |
| followup_on | No | Default: from the follow-up rule (describe_tracker) | |
| expected_version | No | `version` from your last read; the write is refused if the file changed since |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it enumerates the exact fields mutated (applied flag, submit date, channel, status, follow-up date, follow-up log line), the situations that are refused (already applied, tracker changed since expected_version), the duplicate-company warning, and that a backup is taken and undo_last_write reverts. This is what makes a destructiveHint=true write safe to invoke.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and alternatives, then the confirmation workflow, then conflict/backup guarantees. Dense but nearly every sentence carries distinct information; the phrasing is a little long-winded in the multi-clause status sentence but nothing is redundant.
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 an output schema present and 100% parameter coverage, the description need only cover side effects and workflow, which it does fully: confirmation token flow, version conflict behavior, backup/undo, and cross-tool routing. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantics: followup_on overrides the follow-up rule while an existing date is otherwise kept, and confirm/dry_run are explained as a paired workflow rather than isolated fields. It does not restate row/applied_on, which the schema already covers well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: records that an application already present as a row was submitted, and names the sibling (add_application) that handles the not-yet-tracked case. An agent can distinguish this from add_application, edit_application and set_status without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Add a new one with add_application first', 'correct its date with edit_application', 'Replies and closing go through set_status'. It also states the precondition (row must already exist) and the two-step confirmation procedure, so both when to use and when not to use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_emailsMatch e-mails to applicationsARead-only
Which application each e-mail is about and what it says: a confirmation, a rejection, an interview invitation or an offer. The company comes from the subject, the sender's name or the sender's own domain (not from applicant-tracking systems such as Ashby, Greenhouse, Lever or Workable). Each message gets the matching rows and the write tool that would record it, with the e-mail's date. Suggestions only: fetch the messages with your mail tool first, and make each change with its write tool after the user's yes.
| Name | Required | Description | Default |
|---|---|---|---|
| messages | Yes | E-mails from the user's mailbox, each {from, subject, date, snippet}: the sender as in the From header, the date as ISO or RFC 2822, a few hundred characters of the body |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false. The description adds real value beyond that: it states the output is advisory, that each message is paired with the write tool that would record it, and that sender/company attribution comes from subject, sender name or domain rather than ATS vendors. It omits the 200-message cap and any failure behavior, keeping it below a 5.
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?
Content is front-loaded with the meaning of the output, then the attribution rule, then the workflow caveat. A couple of clauses run long (the ATS parenthetical, the final sentence), but every sentence carries 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?
Output schema exists, yet the description still tells the agent what the rows and write-tool pairing mean, which is the non-obvious part. Combined with the single fully-documented parameter and clean annotations, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the messages parameter fully documented ({from, subject, date, snippet}, ISO/RFC 2822 dates). The description restates that these are e-mails from the user's mailbox but adds no new syntax or constraints, 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?
Names a specific verb (match) and resource (e-mails to applications), then enumerates the output categories (confirmation, rejection, interview, offer). The agent can tell exactly what it gets back without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit procedural guidance: fetch messages with the mail tool first, apply changes with the write tool only after the user's yes, and treat results as suggestions. It doesn't name a sibling alternative (e.g., list_applications) for the non-email case, so it stops short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recent_writesRecent writesARead-only
The audit log of this server's writes to the tracker, newest first. Each entry has the time, the tool, the row, the backup file, and every changed cell with its old and new value. Use it to answer "what did you change?" or to check that a write landed. It also shows what undo_last_write would revert. Edits made by hand in Excel or Sheets are not in it.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | At most this many entries |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is settled; the description still adds real value by disclosing ordering, per-entry payload, the fact that entries correspond to what undo_last_write reverts, and the omission of external/manual edits. It stops short of covering limit/truncation behavior when more writes exist than the requested count.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core identity, then contents, then usage, then the scope caveat. No redundancy with the title or schema; every sentence adds new 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 simple, annotation-covered read tool with an output schema and a fully described single parameter, the description supplies everything an agent needs: what it returns, ordering, how to use it, and its blind spot. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single limit parameter is already fully documented in the schema (min 1, max 200, default 10), so the schema carries the semantics. The description says "newest first" but never mentions how the limit interacts with ordering or what happens when the limit truncates history — 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?
States a specific verb and resource — an audit log of this server's writes to the tracker — plus ordering (newest first) and per-entry contents (time, tool, row, backup file, changed cells with old/new values). This clearly separates it from generic read siblings like get_application or summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit use cases ("answer 'what did you change?' or to check that a write landed"), names the related tool it feeds (undo_last_write would revert these entries), and states an exclusion: manual edits in Excel or Sheets are not captured. When-to-use, relationship, and scope boundary are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_timesReply timesARead-only
How long replies take: median and 75th percentile of days from submitting to the first reply, in total and per group, and a silence table: of the applications that had heard nothing for 7, 14, 21, 30, 45, 60 days, how many still got a reply later. Use it to decide when to close silent applications. Needs reply dates (a reply-date column, filled by set_status; check_tracker can fill past ones).
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | Also per group: 'channel', 'source', 'month' or another field, as in funnel | |
| since | No | Only applications submitted on/after |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds genuinely new context: the tool depends on reply-date data, results degrade without it, and the silence table is a conditional 'of those silent at day N, how many later heard back' construct rather than raw counts. It stops short of saying what happens when there are zero replies or too few data points, which is the one gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core metric before the silence-table explanation, and every clause carries information — no filler. The middle sentence is long and stacks two outputs plus a threshold list, which slightly hurts scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description still pre-explains the non-obvious silence-table semantics and the data dependency. For a read-only, zero-required-param analytics tool, nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both params (`by`, `since`) carry their own descriptions, including a cross-reference to funnel for `by`. The prose adds no format, enum, or value examples beyond 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?
States a specific verb+resource with real precision: median and 75th-percentile days from submission to first reply, plus a silence table with explicit day thresholds. This is clearly distinguishable from siblings like funnel, summary, and stale_applications, which an agent could otherwise confuse with it.
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 says 'Use it to decide when to close silent applications,' which ties the tool to a concrete decision and implicitly routes the agent away from stale_applications/summary. It also names the prerequisite (reply dates, filled by set_status or backfilled by check_tracker). It does not explicitly exclude or compare against the closest alternative, close_stale, 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.
reschedule_followupMove or drop a follow-upADestructive
Move the next follow-up to another date, or plan none, when nothing was sent: no one to write to yet, waiting for message credits, the company promised an answer by a date. Use log_followup instead when a follow-up was actually sent, and set_status to close an application.
The tool writes only with the user's yes. The client may ask in its own confirmation dialog. Otherwise call with dry_run=true, show the preview to the user, and after they agree in a new message repeat the same call with confirm=. The write is refused if the tracker changed since expected_version. A backup is taken first, and undo_last_write reverts the write.
| Name | Required | Description | Default |
|---|---|---|---|
| on | Yes | New follow-up date; null for no follow-up while the application stays open | |
| row | Yes | Sheet row number of the application (see list/get results) | |
| reason | Yes | Why, in a few words; appended to the follow-up log | |
| confirm | No | Token from the dry run the user approved. Not needed when the client shows the server's confirmation dialog | |
| dry_run | No | Only show what would change, plus the confirm token; write nothing | |
| expected_version | No | `version` from your last read; the write is refused if the file changed since |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it documents the confirmation protocol (client dialog or dry_run plus confirm token), the expected_version conflict refusal, the automatic backup, and that undo_last_write reverts the change. This is strong disclosure for a destructiveHint=true write. Minor gap: it doesn't say what the dry_run preview or confirmation dialog actually contains.
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?
Purpose and alternative routing are front-loaded in the first two sentences, with the write-safety protocol following. Dense but nearly every sentence carries distinct information; the second paragraph is slightly run-on and could be split for scanability.
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 destructive, six-parameter write tool with an output schema available, the description covers the full decision surface: when to call, what not to call, the confirm/dry_run flow, concurrency refusal, backup, and revert path. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds workflow meaning to confirm and dry_run by explaining the preview-then-repeat-with-token sequence that the per-parameter text only states statically. It adds no detail beyond the schema for row, on, reason, or expected_version.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Move the next follow-up to another date, or plan none') and immediately constrains it with a condition ('when nothing was sent'), with concrete examples. It is clearly separable from log_followup (a follow-up was sent) and set_status (close an application), both named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions (no one to write to yet, waiting for message credits, company promised an answer by a date) plus when-not-to with two named alternatives and their triggering conditions. Nothing about sibling selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_statusSet the statusADestructive
Change the status of one job application when the company replies or the
application ends. It covers a rejection, a screening call, an interview, an offer
or a withdrawal. status must be a value from the tracker's status dropdown;
describe_tracker lists them and which are closed. The response and the note are
appended with a date. The furthest-stage column moves forward, never back. The
first reply fills the reply date with on, and a closed status clears a pending
follow-up date. For a new submission use mark_applied, and for many silent
applications at once use close_stale. To fix another cell, use edit_application.
The tool writes only with the user's yes. The client may ask in its own confirmation dialog. Otherwise call with dry_run=true, show the preview to the user, and after they agree in a new message repeat the same call with confirm=. The write is refused if the tracker changed since expected_version. A backup is taken first, and undo_last_write reverts the write.
| Name | Required | Description | Default |
|---|---|---|---|
| on | No | When the reply came (the e-mail's date); default today. Goes into the reply date on the first reply | |
| row | Yes | Sheet row number of the application (see list/get results) | |
| note | No | Appended to the notes column | |
| status | Yes | A value from the status dropdown | |
| confirm | No | Token from the dry run the user approved. Not needed when the client shows the server's confirmation dialog | |
| dry_run | No | Only show what would change, plus the confirm token; write nothing | |
| response | No | What the company replied; appended to the response column | |
| expected_version | No | `version` from your last read; the write is refused if the file changed since |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations covering safety profile (destructive, non-idempotent), the description adds substantial context: dropdown constraint, describe_tracker reference, date-appending behavior, furthest-stage monotonicity, reply-date and follow-up clearing semantics, plus a full confirm/dry_run/expected_version workflow with backup and undo. This is far beyond what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and sibling routing are front-loaded, then the confirmation workflow. Dense but every sentence carries operational info; a bit long but well organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. For an 8-param mutating tool, the description fully covers when to use, alternatives, behavioral side effects, and the confirmation/versioning protocol an agent needs to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, baseline 3. The description adds meaningful semantics on top: status must come from the tracker dropdown listed by describe_tracker, `on` feeds the reply date only on first reply, response/note are appended, and the confirm/expected_version flow is explained operationally.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Change the status of one job application'. It is explicitly distinguished from mark_applied, close_stale, and edit_application, so an agent can route to it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use ('when the company replies or the application ends') plus explicit alternatives: mark_applied for new submissions, close_stale for many silent applications, edit_application for other cells.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stale_applicationsStale applicationsARead-only
Applications still waiting for a reply: a waiting status, silent for days+ days
since the last touch (the submit date or the newest dated follow-up log entry, not
counting moved or dropped follow-ups), and no follow-up planned for today or later.
These are what close_stale closes.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Silent at least this many days |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered; the description goes further and defines the non-obvious computation: 'last touch' is the submit date or the newest *dated* follow-up log entry, explicitly excluding moved and dropped follow-ups. That is exactly the kind of internal rule an agent could not infer and would otherwise get wrong.
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, zero filler: the definition comes first, the sibling relationship last. Every clause (silence window, last-touch definition, follow-up exclusion) carries distinct semantic load rather than restating the name or 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?
With an output schema present, return values need no explanation, and the single optional parameter is fully documented. The one behavioural subtlety that could cause a wrong call – what counts as the last touch – is spelled out, so nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% ('Silent at least this many days', default 30), so the baseline is 3. The description adds real meaning by specifying the reference point the day count is measured from (submit date or newest dated follow-up, ignoring moved/dropped ones), which the schema field alone does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (applications awaiting a reply) and gives the exact membership criteria: a waiting status, silence of `days`+ days, and no follow-up scheduled today or later. It explicitly distinguishes the set from related siblings in both directions – these are NOT followups_due (no future follow-up) and these are exactly what close_stale closes – so an agent can pick it apart from the 22 siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The criteria themselves imply when to call it (auditing neglected applications), and the closing clause routes the agent to `close_stale` as the write counterpart of this read. There is no explicit 'use this instead of X when Y' exclusion or prerequisite statement, so it stops short of a 5, but the context is clear rather than merely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
summarySummaryARead-only
Counts the job applications in the tracker: per status, submitted and not yet, and submissions per month. With since/until, it shows the applications submitted in that period and where they stand now. For reply and interview rates use funnel, and for how fast replies come use reply_times. For what to do next, use followups_due and stale_applications.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Period start for the submitted cohort | |
| until | No | Period end for the submitted cohort |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this is a read-only, closed-world tool. The description adds the important cohort nuance: since/until filters by submission period while statuses reflect where applications stand now. It does not specify boundary inclusivity or empty-range behavior, so it is strong but not exhaustive.
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 definition is front-loaded with the core behavior, then explains parameter effects, then routes to alternatives. Every sentence earns its place, and the size is appropriate for a two-parameter summary tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a read-only summary with two optional parameters and an output schema. The description covers purpose, parameter behavior, and sibling alternatives, leaving no material gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema itself documents since/until as period bounds for the submitted cohort. The description adds useful meaning beyond the schema by explaining that the result shows applications submitted in that period and their current status, though it does not add date-format or inclusivity details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it counts job applications in the tracker. It names the concrete breakdowns (status, submitted/not-yet, submissions per month) and distinguishes itself from funnel and reply_times.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes overlapping analytical questions to alternatives: funnel for reply/interview rates, reply_times for reply speed, and followups_due/stale_applications for next actions. It also clarifies the added behavior when since/until are supplied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_last_writeUndo the last writeADestructive
Restore the file to its state before this server's last write. Refused if the file has changed since that write (it would lose someone else's edits).
The tool writes only with the user's yes. The client may ask in its own confirmation dialog. Otherwise call with dry_run=true, show the preview to the user, and after they agree in a new message repeat the same call with confirm=. The write is refused if the tracker changed since expected_version.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Token from the dry run the user approved. Not needed when the client shows the server's confirmation dialog | |
| dry_run | No | Only show what would change, plus the confirm token; write nothing | |
| expected_version | No | `version` from your last read; the write is refused if the file changed since |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/non-idempotent, but the description adds real behavior: the write is refused if the file changed since the last write, refusal also occurs if the tracker moved past expected_version, and the confirm token must come from a user-approved dry run. These are workflow-critical traits no annotation conveys.
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?
Purpose is front-loaded and every sentence carries operational content. Minor redundancy: the closing line about the tracker changing since expected_version restates the earlier file-changed refusal, and 'the write is refused' appears twice.
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 an output schema present and annotations covering the safety profile, the description needn't explain return values; it instead covers the confirmation protocol, refusal conditions, and version guard — everything an agent needs to call this destructive undo safely.
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 goes further by tying confirm, dry_run, and expected_version into a concrete approval workflow rather than restating field meanings. It stops short of naming token lifetime or reuse rules.
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 first sentence states a specific verb and resource with scope: 'Restore the file to its state before this server's last write.' That is unambiguously distinct from sibling listing tools like recent_writes or describe_tracker, and an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It spells out two mutually exclusive invocation paths — client-side confirmation dialog, or dry_run=true then repeat with confirm=<token> after the user agrees in a new message — and states the precondition (expected_version) that causes refusal. When-to-use and when-not are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.5.2- Changed
add_application4 fields changed- added
Input schema / properties / allow_duplicate / descriptionAdded value: +"Add it even though the same company+role or link is already in the tracker (a second application on purpose)" - added
Input schema / properties / company / descriptionAdded value: +"Company name" - added
Input schema / properties / notes / descriptionAdded value: +"Text for the notes column" - added
Input schema / properties / role / descriptionAdded value: +"Job title, as in the posting"
- Changed
mark_applied1 field changed- added
Input schema / properties / note / descriptionAdded value: +"Appended to the notes column"
23 tool updates
v0.5.1- First observed
add_application - First observed
add_column - First observed
calendar_events - First observed
check_tracker - First observed
close_stale - First observed
describe_tracker - First observed
edit_application - First observed
export_followups_calendar - First observed
fix_tracker - First observed
followups_due - First observed
funnel - First observed
get_application - First observed
list_applications - First observed
log_followup - First observed
mark_applied - First observed
match_emails - First observed
recent_writes - First observed
reply_times - First observed
reschedule_followup - First observed
set_status - First observed
stale_applications - First observed
summary - First observed
undo_last_write
TDQS
Scored across 23 tools
Nearly every tool's description explicitly names its siblings and when to prefer them (log_followup vs reschedule_followup vs set_status, check_tracker vs fix_tracker, stale_applications vs close_stale, get_application vs list_applications), so read/write pairs are cleanly separated. The one soft spot is the follow-up-to-calendar trio (followups_due, calendar_events, export_followups_calendar), which all surface the same data in different shapes and could tempt a wrong pick despite the notes.
Names are uniformly snake_case, with verb_noun for actions (add_application, set_status, close_stale, undo_last_write) and bare nouns for reports (summary, funnel, reply_times, recent_writes, followups_due). The verb-vs-noun split is a deliberate and readable convention rather than a clash, though a couple of names (match_emails, export_followups_calendar) are longer and less parallel than the rest.
23 tools is on the heavy side for a spreadsheet job tracker, but the domain genuinely spans CRUD, batch repair, undo, three analytics reports, calendar export and e-mail matching, and each tool has a distinct job with no filler. It would be tighter if the two calendar-output tools were merged, but nothing here feels redundant.
Coverage is strong across the lifecycle: add, mark applied, status changes, follow-up logging/rescheduling, manual edits, column addition, bulk closing, integrity checking/repair, undo, and analytics. The main gap is destructive cleanup — there is no delete/remove row tool (or column removal), so a bogus or duplicate row can only be blanked via edit_application.
Maintenance
Related MCP Connectors
Job search tracker for Claude and ChatGPT: applications, interviews, follow-ups, company watch.
- jobwyreOAuthapp.jobwyre
Track job applications on a board: let Claude or ChatGPT read and update jobs, interviews, notes.
Track job applications: find the ones to follow up on, add jobs, update status, notes and steps.
Analyze job listings against your resume, track applications, and generate cover letters.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables tracking job applications through a pipeline, scheduling follow-ups, and summarizing job search progress via natural language.7-
- FlicenseNot gradedqualityDmaintenanceManages job applications, companies, roles, statuses, deadlines, and reminders through natural language queries.-
- AlicenseAqualityBmaintenanceEnables managing a job search through natural language: tracking applications, discovery leads, interview prep, and resume generation. Connects to Claude via MCP to read and update local Excel files and documents.35ISC
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to manage a personal job application tracker, allowing users to list, add, update, and delete job applications with company, role, and status details through natural language.-