Skip to main content
Glama

Job Application Tracker MCP

npm license Star on GitHub

Too many job applications spread across tabs and notes. Track them in one place offline.

npx -y job-tracker-student-mcp

Try these prompts:

  1. "Add a Software Intern role at Shopify with a deadline of 2026-11-15, found on LinkedIn."

  2. "Move application 1 to interview on 2026-11-20 at 14:30."

  3. "What deadlines and interviews do I have in the next two weeks?"

A free, open source MCP server named job-tracker-student-mcp on npm. Track internships, jobs, interviews and deadlines, see what is coming up, and export your list as CSV or Markdown. Runs on your computer with Claude Desktop, Claude Code, Cursor, VS Code and Windsurf. No internet, no login, no API keys. Your applications are saved in one JSON file that you can open, back up or delete.

Install

Run it straight from npm with npx. You need Node.js 20 or newer, see Node version for the details. There is nothing else to install and no account to make.

npx -y job-tracker-student-mcp

Add it to your app's MCP config so the app can start it for you. Every app reads its config from its own file, so pick yours:

All of them start the same server the same way. The only difference is where the config goes.

Claude Desktop

Add this to claude_desktop_config.json:

{
  "mcpServers": {
    "job-tracker": {
      "command": "npx",
      "args": ["-y", "job-tracker-student-mcp"]
    }
  }
}

Restart Claude Desktop after you save the file.

Claude Code

Run this in a terminal:

claude mcp add job-tracker -- npx -y job-tracker-student-mcp

Cursor

Cursor reads .cursor/mcp.json from the project folder, or ~/.cursor/mcp.json from your home folder if you want the server in every project.

{
  "mcpServers": {
    "job-tracker": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "job-tracker-student-mcp"]
    }
  }
}

Restart Cursor after you save the file.

VS Code

Put this in .vscode/mcp.json in your project folder, or in the mcp.json file in your user profile:

{
  "servers": {
    "job-tracker": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "job-tracker-student-mcp"]
    }
  }
}

Restart VS Code after you save the file.

Windsurf

Add this to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "job-tracker": {
      "command": "npx",
      "args": ["-y", "job-tracker-student-mcp"]
    }
  }
}

Refresh the plugins list in Windsurf after you save the file.

After any of these, try one of the prompts below.

Related MCP server: Application Tracker MCP

Try these three prompts

  1. Add an application

    "Add a Software Intern role at Shopify with a deadline of 2026-11-15, found on LinkedIn."

    The assistant calls add_application with company "Shopify", role "Software Intern", deadline "2026-11-15" and source "LinkedIn". It is saved as application 1 in the applied stage.

  2. Move it along

    "Move application 1 to interview on 2026-11-20 at 14:30."

    update_status sets the status to interview and keeps the interview date, so it shows up in your reminders.

  3. See what is coming

    "What deadlines and interviews do I have in the next two weeks?"

    list_upcoming lists deadlines of open applications and interview dates, earliest first, with a reminder such as "due tomorrow" or "overdue by 2 days".

More things you can ask:

  • "Export all my applications as a CSV."

  • "Show only my offers as a Markdown table."

  • "Which deadlines have already passed?"

Tools

There are four tools. list_upcoming and export_report are read only. add_application and update_status write to the local JSON file and nothing else.

Tool

What it does

Parameters

Example prompt

add_application

Add a job or internship with company, role, deadline and source.

company, role, deadline, source, type, status, notes

"Add a Software Intern role at Shopify with a deadline of 2026-11-15, found on LinkedIn."

update_status

Move an application between applied, interview, offer and rejected.

id, status, interview_date, note

"Move application 1 to interview on 2026-11-20 at 14:30."

list_upcoming

Show upcoming deadlines and interviews sorted by date, with reminders.

days, include_overdue, today

"What deadlines and interviews do I have in the next two weeks?"

export_report

Export applications as CSV or Markdown.

format, status

"Export all my applications as a CSV."

Dates are written as YYYY-MM-DD. An interview can also have a time, written as YYYY-MM-DDTHH:MM.

Where your data lives

Applications are saved in ~/.job-tracker-student-mcp/applications.json. Set the JOB_TRACKER_FILE environment variable to use another path. Add it in the env part of your MCP config:

{
  "mcpServers": {
    "job-tracker": {
      "command": "npx",
      "args": ["-y", "job-tracker-student-mcp"],
      "env": { "JOB_TRACKER_FILE": "C:\\Users\\you\\Documents\\applications.json" }
    }
  }
}

Comparison

This tracker is built for job applications. Some servers focus on course or learning management systems, and some are general task trackers.

Compared with course focused servers, this one works offline with no login to a learning system and no keys. It is job specific, with statuses for applied, interview, offer and rejected, and it tracks deadlines and interview dates with reminders.

Compared with generic task MCP servers, it is focused on job applications rather than general todos. It keeps applications in a simple local JSON file, has read only and write tools for this specific workflow, and can export as CSV or Markdown. Everything runs locally with no account or network calls.

Privacy

The server makes no network calls and has no API keys, passwords or accounts. It reads and writes the one JSON file above and nothing else. There is no telemetry. What you tell the assistant in a chat is handled by the app you use, not by this server.

FAQ

Does it send reminders on its own? No. MCP servers answer when asked. list_upcoming gives you the reminders when you ask, so a good habit is to start the week with "what is coming up?".

Which applications show up in list_upcoming? Deadlines of applications in the applied stage, and interview dates of applications in the interview stage. Offers and rejected applications are left out.

Can I use it on two computers? Point JOB_TRACKER_FILE at a file in a folder you already sync, and both computers read the same list. Do not use both at the same moment.

Troubleshooting

If npx -y job-tracker-student-mcp fails or hangs:

  • Check your Node.js version with node --version. The server needs Node.js 20 or newer, see Node version.

  • Delete the folder where npx keeps its downloads, then try again. On Windows it is %LocalAppData%\npm-cache\_npx, and on macOS and Linux it is ~/.npm/_npx.

  • Make sure your computer can reach registry.npmjs.org. On a school or work network, npm may need proxy settings from the network's owner.

  • If node or npx is not found on Windows, reinstall Node.js with "Add to PATH" checked, then restart your terminal.

If a tool says the file is not valid JSON, open the file named in the message and fix it, or move it away to start a fresh list.

Node version

There are two floors here, and they are not the same number.

What you are doing

Node.js

Running the published server

20 or newer

Building and testing a clone

22.12 or newer, on the 22 and 24 release lines or 26 and later

The server itself is happy on Node.js 20, and that is what engines in package.json says. The test runner wants a newer Node.js, so the development floor lives in devEngines in the same file. npm checks devEngines before install, run and test, so a clone on Node.js 20 stops with a clear message instead of a strange failure part way through the test suite. The 23 and 25 release lines are left out on purpose, because the test runner does not run on them.

Both numbers live in package.json, and a test in tests/node-version.test.ts keeps them in step with the README and with the range the test runner asks for.

Development

npm install
npm run build
npm test

The tests call every tool through a real MCP client and save to a temporary folder, so they need no account or network. They need the newer Node.js from the Node version section above, because of the test runner.

License

MIT

Available Tools

4 tools
add_applicationAdd applicationA

Add a job or internship to the tracker. It starts in the applied stage unless you pass another status. Inputs: company and role (both required), an optional deadline as YYYY-MM-DD, an optional source such as LinkedIn or a career fair, an optional type of job or internship, an optional status and optional notes. The tool saves the application on this computer and returns its id, which update_status needs. Example prompt: "Add a Software Intern role at Shopify with a deadline of 2026-11-15, found on LinkedIn."

NameRequiredDescriptionDefault
roleYesTitle of the role.
typeNo"job" or "internship". Defaults to "job".job
notesNoAnything you want to remember about it.
sourceNoWhere you found the posting, such as LinkedIn or a career fair.
statusNoThe stage: "applied", "interview", "offer" or "rejected".applied
companyYesName of the company.
deadlineNoLast day to apply as YYYY-MM-DD.

Output Schema

NameRequiredDescription
applicationYesThe application that was saved.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare a non-destructive write that is not open-world; the description usefully adds that the record persists locally on this machine, that status defaults to "applied", and that an id comes back. It does not say what happens on duplicates or invalid deadlines, which would round out behavior for a 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what the tool does and its default behavior, followed by inputs and a concrete example. The input enumeration is somewhat redundant against the schema but stays a single efficient paragraph; the example prompt earns its space by showing combined usage.

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 annotations, full schema coverage, and an output schema, the description covers everything an agent needs to call this correctly, including the id return value that downstream tools depend on. Missing only edge-case behavior (duplicate entries, deadline format validation) for a fully complete picture.

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%, so all seven parameters and both enums are already documented in structured form. The description mostly restates that content (required company/role, YYYY-MM-DD deadline, source examples) rather than adding semantics 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.

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 job or internship to the tracker") and immediately clarifies default placement in the applied stage. It also names a downstream consumer ("returns its id, which update_status needs"), which distinguishes it from the sibling tools that read or change existing entries.

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 sequencing hint (the returned id is required by update_status) tells the agent where this fits relative to alternatives, and the worked example prompt anchors realistic usage. It stops short of explicit "do not use this for X" exclusions, but the create-vs-update boundary is implied clearly enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_reportExport reportA
Read-only

Export your applications as CSV or Markdown so you can share them or open them in a spreadsheet. Inputs: format, either csv or markdown (default markdown), and an optional status to export only that stage. The report is returned as text and nothing is written to disk. In CSV, a cell that starts with =, +, - or @ gets a leading apostrophe so spreadsheets do not run it as a formula. Example prompt: "Export all my applications as a CSV."

NameRequiredDescriptionDefault
formatNo"csv" or "markdown". Defaults to "markdown".markdown
statusNoOnly export applications in this stage.

Output Schema

NameRequiredDescription
countYesHow many applications are in the report.
formatYesThe format of the report.
contentYesThe report itself.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/destructive annotations by disclosing that the report is returned as text with nothing written to disk, and that CSV cells starting with =, +, - or @ get a leading apostrophe to prevent spreadsheet formula execution. These are non-obvious behavioral traits an agent could not infer from structured fields.

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-loads purpose and formats before the CSV-escaping note and example prompt, and every sentence carries information. The example prompt is slightly redundant with the opening sentence, keeping it just below maximum efficiency.

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 needn't explain return structure, and it already covers output medium (text), side effects (none on disk), filtering, and format default. Nothing an agent needs in order 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% and both parameters are enums with defaults already documented, so the schema does the heavy lifting. The description restates the default markdown format and the status stage filter without adding syntax or edge-case meaning beyond it, making 3 the correct baseline.

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+resource ("Export your applications") and states the two output formats, so the tool's identity is unambiguous. The line "returned as text and nothing is written to disk" further separates it from the mutation-oriented siblings add_application and update_status.

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 clear use case ("so you can share them or open them in a spreadsheet") and an example prompt ("Export all my applications as a CSV") that anchors invocation. It does not explicitly state when to prefer a sibling tool or when not to use it, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_upcomingList upcomingA
Read-only

Show upcoming deadlines and interviews sorted by date, with a reminder for each one. Deadlines come from applications still in the applied stage, and interviews come from applications in the interview stage that have an interview_date. Rejected applications and offers are left out. Inputs: optional days, how far ahead to look (default 14), include_overdue (default true) to also show deadlines that already passed, and an optional today as YYYY-MM-DD to ask as if it were another day. Example prompt: "What deadlines and interviews do I have in the next two weeks?"

NameRequiredDescriptionDefault
daysNoHow many days ahead to look. Defaults to 14.
todayNoTreat this YYYY-MM-DD date as today. Defaults to today on this computer.
include_overdueNoAlso show deadlines and interviews that already passed. Defaults to true.

Output Schema

NameRequiredDescription
itemsYesThe upcoming items, earliest first.
todayYesThe date used as today, YYYY-MM-DD.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description still adds real domain behavior: which application stages contribute deadlines versus interviews, that rejected applications and offers are omitted, and that results are date-sorted with reminders. It doesn't discuss volume, but with annotations and an output schema that is acceptable.

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 core purpose and filtering rules are front-loaded, followed by the parameter notes and an example prompt. It is a bit dense in a single block and repeats default values already present in the schema, but no sentence is truly 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?

With an output schema available, the description doesn't need to explain return values, and it covers the important remaining context: inclusion rules, sorting, defaults and a sample query. It is essentially complete for a read-only listing tool.

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%, so the schema already documents all three parameters and their defaults. The description largely restates days and include_overdue, though it does clarify that today means 'ask as if it were another day', which is a small semantic addition beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: showing upcoming deadlines and interviews sorted by date, with an explicit reminder per item. It also defines the population precisely (applied-stage deadlines, interview-stage items with interview_date, excluding rejected and offers), which clearly separates it from siblings like add_application, update_status and export_report.

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 inclusion/exclusion rules give a clear sense of when this tool applies, and the example prompt anchors the intended use. It stops short of explicitly naming an alternative (e.g. export_report for a saved file) or stating when not to use it, so a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_statusUpdate statusA

Move an application to another stage: applied, interview, offer or rejected. Inputs: id of the application (from add_application or export_report), the new status, an optional interview_date as YYYY-MM-DD or YYYY-MM-DDTHH:MM, and an optional note that is added to the notes. When the status is interview, pass interview_date so list_upcoming can remind you. Example prompt: "Move application 1 to interview on 2026-11-20 at 14:30."

NameRequiredDescriptionDefault
idYesThe id of the application.
noteNoA note to add to the application.
statusYesThe stage: "applied", "interview", "offer" or "rejected".
interview_dateNoInterview date as YYYY-MM-DD or YYYY-MM-DDTHH:MM.

Output Schema

NameRequiredDescription
applicationYesThe application after the change.
previous_statusYesThe stage before this change.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a non-read-only, non-destructive mutation. The description adds real behavioral context beyond them: the note is appended to existing notes rather than replacing them, and setting interview status with a date feeds list_upcoming reminders. It doesn't say whether re-setting an existing interview_date overwrites or duplicates it, which keeps it from 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?

Front-loaded with the action and its enum, then parameter guidance, then a concrete example prompt. Every sentence carries information, though the example prompt is slightly redundant with the preceding sentence about interview_date.

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. Four params at 100% schema coverage plus description-level detail on formats, provenance, append semantics and downstream effects leave nothing an agent needs 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. The description still adds value by documenting id provenance, the accepted date formats, and the append semantics of note, which the schema's terse "A note to add to the application" only hints at.

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 an application to another stage") and enumerates the four valid target stages inline. This clearly distinguishes it from add_application, list_upcoming and export_report, which all serve different functions.

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 explicit conditional guidance ("When the status is interview, pass interview_date so list_upcoming can remind you") and names where the id comes from (add_application or export_report). It stops short of stating when-not-to-use, but for a purpose-specific mutation tool the context is clear.

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. 4 tool updatesv0.1.0
    • First observedadd_application
    • First observedexport_report
    • First observedlist_upcoming
    • First observedupdate_status

TDQS

A4.2/5.0

Scored across 4 tools

Disambiguation5/5

Each tool maps to a distinct action on the application lifecycle: create, change stage, view upcoming dates, and export. There is no plausible confusion between update_status and add_application since one requires an id and only mutates the stage. list_upcoming and export_report both read data but differ clearly in output shape and purpose.

Naming Consistency5/5

All four tools follow a clean verb_noun snake_case pattern (add_application, update_status, list_upcoming, export_report). Verbs are distinct and predictable in meaning. No style mixing or vague naming.

Tool Count4/5

Four tools is on the thin side but each earns its place in a small tracker workflow. The surface is intentionally minimal rather than padded with redundant operations. A slightly richer set (e.g. a get/list-all tool) would round it out without bloat.

Completeness3/5

Core create/update/view/export flows exist, but there is no way to list or fetch all applications directly, no delete/archive operation, and no way to edit company, role, deadline, or source after creation (only the stage and notes). Agents must use export_report as a workaround to see the full list, and cannot correct mistakes.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Manages job applications, companies, roles, statuses, deadlines, and reminders through natural language queries.
    -
  • A
    license
    A
    quality
    D
    maintenance
    A privacy-first MCP server for locally managing job, fellowship, and graduate-school applications. It offers tools for tracking application status, analyzing role fit, generating LaTeX CV/cover letters, interview prep, and discovering public jobs from ATS APIs.
    8
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables tracking of job applications and freelance leads through an MCP interface, with tools to add and update items, list and summarize the pipeline, flag stale entries, and draft follow-up messages grounded in each item's logged notes using locally stored JSON data.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables Claude to organize a job search by registering openings, advancing applications through a status funnel, measuring conversion rates between stages, and flagging applications that have gone quiet and need follow-up. Data is kept locally in SQLite, so no external account or server is required.
    5
    MIT