Skip to main content
Glama

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

check_tracker finds it, fix_tracker fixes it in one confirmed write

When each reply came

Known only if someone wrote it down

Recorded on every reply; reply_times shows when replies stop coming

Replies in your mailbox

The model reads them and decides which row each is about

match_emails names the row and the change, the same way every time

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-mcp

or just the server:

claude mcp add tracker -e TRACKER_PATH="$HOME/Documents/job-tracker.xlsx" -- uvx tracker-mcp

Cursor, 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 sync

and 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 tracker

No 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)

TRACKER_PATH=/path/tracker.xlsx

Dropdowns, filters and summary formulas are kept and extended to new rows

CSV

TRACKER_PATH=/path/tracker.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

TRACKER_PATH=https://docs.google.com/spreadsheets/d/<id>/edit

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 google

Your 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.file permission. 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-browser prints the link; the browser must still reach 127.0.0.1 on 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 spreadsheets

Without --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:

  1. Claude registers with the server (OAuth dynamic client registration) and opens its sign-in page.

  2. The server sends you to Google: your e-mail and drive.file, the files you pick.

  3. The server checks your e-mail against its allow-list.

  4. 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.

  5. 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.com

Before 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

describe_tracker

read

How the tracker is laid out: fields → columns, allowed and closed statuses, follow-up rule

list_applications

read

Filter by status, company/role text, submit dates

get_application

read

Every column of one application (by text or row)

followups_due

read

Follow-ups due within N days, overdue first; submitted rows with no follow-up date

stale_applications

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

summary

read

Counts by status and month; a cohort for a date range

funnel

read

Submitted → replied → screening → interview → offer, in total and by channel, source, month or any column

check_tracker

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

reply_times

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

match_emails

read

Which application each e-mail is about (confirmation, rejection, interview, offer) and the write that would record it

recent_writes

read

Audit log of the server's writes

add_application

write

New row with the not-applied status; other columns via extra; refuses duplicates

mark_applied

write

Submitted: date, channel, status, follow-up date by your rule

set_status

write

New status from your dropdown; a closed status cancels the pending follow-up; the first reply fills the reply date (on, default today)

log_followup

write

Log a sent follow-up, schedule the next one or close

reschedule_followup

write

Move the next follow-up, or plan none, when nothing was sent (no contact yet, waiting for credits)

edit_application

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

add_column

write

Add a column after the last one, styled like its neighbour, and map it in the config (replied_on, reached, your own field); undo removes both

close_stale

write

Close stale applications (or chosen rows) in one write, one backup, one undo step

fix_tracker

write

Fix what check_tracker can fix, in one write, one backup, one undo step

calendar_events

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

export_followups_calendar

file

The open follow-ups as an .ics file next to the tracker (the tracker is not touched)

undo_last_write

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

  1. 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.

  2. 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.

  3. 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.

  4. Audit and undo: one line per write; undo only if nothing changed since.

  5. 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 = true

A 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

TRACKER_PATH

--tracker

The tracker: a file path or a Google Sheets URL (required)

TRACKER_CONFIG

--config

The config, if not next to the tracker

TRACKER_BACKUP_DIR

--backup-dir

Backups and audit.jsonl (default: backups-tracker-mcp/ next to the tracker; ~/.tracker-mcp/backups/<id> for a Google Sheet)

GOOGLE_APPLICATION_CREDENTIALS

A service account key, for Google Sheets

TRACKER_MCP_HOME

Where the Google sign-in and Sheets configs live (default ~/.tracker-mcp)

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.xlsx and jobs.csv in one folder would share one; give one of them TRACKER_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.

  • init understands 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.py is the tracker logic; it knows nothing about MCP or storage.

  • stores.py reads and writes .xlsx and .csv files; gsheets.py does Google Sheets.

  • config.py is the config schema (pydantic, strict); scaffold.py is init and new.

  • server.py holds 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 tools
add_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.

NameRequiredDescriptionDefault
linkNoApplication URL
roleYesJob title, as in the posting
extraNoOther columns: a field name from describe_tracker or an exact header text -> value
notesNoText for the notes column
companyYesCompany name
confirmNoToken from the dry run the user approved. Not needed when the client shows the server's confirmation dialog
dry_runNoOnly show what would change, plus the confirm token; write nothing
allow_duplicateNoAdd it even though the same company+role or link is already in the tracker (a second application on purpose)
expected_versionNo`version` from your last read; the write is refused if the file changed since

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 columnA
Destructive

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.

NameRequiredDescriptionDefault
kindNodate formats the cells as dates (implied by a date field)text
fieldNoAlso 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
headerYesThe header text, in the tracker's language
confirmNoToken from the dry run the user approved. Not needed when the client shows the server's confirmation dialog
dry_runNoOnly show what would change, plus the confirm token; write nothing
optionsNoA dropdown with these values (Excel; for reached the stages by default)
expected_versionNo`version` from your last read; the write is refused if the file changed since

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 eventsA
Read-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.

NameRequiredDescriptionDefault
daysNoFollow-ups due up to this many days ahead

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 trackerA
Read-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.

NameRequiredDescriptionDefault
limitNoAt most this many issues listed

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 applicationsA
Destructive

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.

NameRequiredDescriptionDefault
daysNoSubmitted at least this many days ago
rowsNoOnly these rows (each must be stale); default: all from stale_applications
confirmNoToken from the dry run the user approved. Not needed when the client shows the server's confirmation dialog
dry_runNoOnly show what would change, plus the confirm token; write nothing
expected_versionNo`version` from your last read; the write is refused if the file changed since

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 trackerA
Read-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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 applicationA
Destructive

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.

NameRequiredDescriptionDefault
rowYesSheet row number of the application (see list/get results)
fieldsYesField name (see describe_tracker) -> new value; null clears the cell. Dates as YYYY-MM-DD
reasonYesWhy, in a few words ("from the rejection e-mail of 02.10"); goes to the notes with what changed
confirmNoToken from the dry run the user approved. Not needed when the client shows the server's confirmation dialog
dry_runNoOnly show what would change, plus the confirm token; write nothing
expected_versionNo`version` from your last read; the write is refused if the file changed since

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 fileA
Idempotent

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.

NameRequiredDescriptionDefault
daysNoFollow-ups due up to this many days ahead

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 trackerA
Destructive

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.

NameRequiredDescriptionDefault
rowsNoOnly these rows; default: all
kindsNoOnly these kinds of issue from check_tracker; default: every fixable one
confirmNoToken from the dry run the user approved. Not needed when the client shows the server's confirmation dialog
dry_runNoOnly show what would change, plus the confirm token; write nothing
expected_versionNo`version` from your last read; the write is refused if the file changed since

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 dueA
Read-only

Follow-ups due by today + within_days (overdue included), plus submitted applications that have no follow-up date at all.

NameRequiredDescriptionDefault
within_daysNoLook this many days ahead

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

funnelFunnelA
Read-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.

NameRequiredDescriptionDefault
byNoGroup by: 'channel', 'source', 'month', or another field from describe_tracker. Default: channel if the tracker has one, else month
sinceNoOnly applications submitted on/after
untilNoOnly applications submitted on/before

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 applicationA
Read-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.

NameRequiredDescriptionDefault
rowNoExact sheet row number
queryNoCompany or role text, e.g. 'Acme'

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 applicationsA
Read-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.

NameRequiredDescriptionDefault
limitNoAt most this many rows
queryNoSubstring of company or role, case-insensitive
statusNoFilter by status; comma-separated for several
open_onlyNoHide closed statuses (rejected, withdrawn, ...)
applied_sinceNoOnly applications submitted on/after
applied_untilNoOnly applications submitted on/before

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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-upA
Destructive

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.

NameRequiredDescriptionDefault
rowYesSheet row number of the application (see list/get results)
textYesWhat was sent and to whom; appended to the follow-up log
finalNoNo more follow-ups: clears the follow-up date
confirmNoToken from the dry run the user approved. Not needed when the client shows the server's confirmation dialog
contactNoReplace the follow-up contact / channel
dry_runNoOnly show what would change, plus the confirm token; write nothing
next_onNoNext follow-up date; default from the follow-up rule
expected_versionNo`version` from your last read; the write is refused if the file changed since

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 appliedA
Destructive

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.

NameRequiredDescriptionDefault
rowYesSheet row number of the application (see list/get results)
noteNoAppended to the notes column
channelNoHow it was sent, e.g. 'Ashby (direct form)'
confirmNoToken from the dry run the user approved. Not needed when the client shows the server's confirmation dialog
dry_runNoOnly show what would change, plus the confirm token; write nothing
applied_onNoSubmit date; default today
followup_onNoDefault: from the follow-up rule (describe_tracker)
expected_versionNo`version` from your last read; the write is refused if the file changed since

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 applicationsA
Read-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.

NameRequiredDescriptionDefault
messagesYesE-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

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 writesA
Read-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.

NameRequiredDescriptionDefault
limitNoAt most this many entries

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 timesA
Read-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).

NameRequiredDescriptionDefault
byNoAlso per group: 'channel', 'source', 'month' or another field, as in funnel
sinceNoOnly applications submitted on/after

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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-upA
Destructive

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.

NameRequiredDescriptionDefault
onYesNew follow-up date; null for no follow-up while the application stays open
rowYesSheet row number of the application (see list/get results)
reasonYesWhy, in a few words; appended to the follow-up log
confirmNoToken from the dry run the user approved. Not needed when the client shows the server's confirmation dialog
dry_runNoOnly show what would change, plus the confirm token; write nothing
expected_versionNo`version` from your last read; the write is refused if the file changed since

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 statusA
Destructive

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.

NameRequiredDescriptionDefault
onNoWhen the reply came (the e-mail's date); default today. Goes into the reply date on the first reply
rowYesSheet row number of the application (see list/get results)
noteNoAppended to the notes column
statusYesA value from the status dropdown
confirmNoToken from the dry run the user approved. Not needed when the client shows the server's confirmation dialog
dry_runNoOnly show what would change, plus the confirm token; write nothing
responseNoWhat the company replied; appended to the response column
expected_versionNo`version` from your last read; the write is refused if the file changed since

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 applicationsA
Read-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.

NameRequiredDescriptionDefault
daysNoSilent at least this many days

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

summarySummaryA
Read-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.

NameRequiredDescriptionDefault
sinceNoPeriod start for the submitted cohort
untilNoPeriod end for the submitted cohort

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 writeA
Destructive

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.

NameRequiredDescriptionDefault
confirmNoToken from the dry run the user approved. Not needed when the client shows the server's confirmation dialog
dry_runNoOnly show what would change, plus the confirm token; write nothing
expected_versionNo`version` from your last read; the write is refused if the file changed since

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 2 tool updatesv0.5.2
    • Changedadd_application4 fields changed
      • addedInput schema / properties / allow_duplicate / description
        Added value: +"Add it even though the same company+role or link is already in the tracker (a second application on purpose)"
      • addedInput schema / properties / company / description
        Added value: +"Company name"
      • addedInput schema / properties / notes / description
        Added value: +"Text for the notes column"
      • addedInput schema / properties / role / description
        Added value: +"Job title, as in the posting"
    • Changedmark_applied1 field changed
      • addedInput schema / properties / note / description
        Added value: +"Appended to the notes column"
  2. 23 tool updatesv0.5.1
    • First observedadd_application
    • First observedadd_column
    • First observedcalendar_events
    • First observedcheck_tracker
    • First observedclose_stale
    • First observeddescribe_tracker
    • First observededit_application
    • First observedexport_followups_calendar
    • First observedfix_tracker
    • First observedfollowups_due
    • First observedfunnel
    • First observedget_application
    • First observedlist_applications
    • First observedlog_followup
    • First observedmark_applied
    • First observedmatch_emails
    • First observedrecent_writes
    • First observedreply_times
    • First observedreschedule_followup
    • First observedset_status
    • First observedstale_applications
    • First observedsummary
    • First observedundo_last_write

TDQS

A4.1/5.0

Scored across 23 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables tracking job applications through a pipeline, scheduling follow-ups, and summarizing job search progress via natural language.
    7
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Manages job applications, companies, roles, statuses, deadlines, and reminders through natural language queries.
    -
  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    35
    ISC
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables 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.
    -