Job application tracker for developers - AI agents write over MCP, you review in a dashboard.
Inferred from the transports this listing declares (streamable-http). A client not listed here hasn’t been ruled out — it just isn’t something Forge can confirm.
Verification confirms publisher identity (repo ownership), not code safety. The security scan covers known CVEs and suspicious install scripts.
Read from a real MCP initialize → tools/list handshake against the declared endpoint. No tool was ever invoked — tools/list is the read-only introspection call the protocol defines for this. It reflects what the server advertised at that moment; a hosted endpoint is not pinned to any version and can change without notice.
https://app.jobctl.app/mcp11 tools · 622msadd_applicationTrack a new job application. Pass either a single `raw` line — `add_application({raw: "Bosch, Tech Lead, prio A, due friday, remote, via LinkedIn"})` — or structured fields (`company` and `role` required then). Returns the created application and possible-duplicate warnings; if duplicates are liste…Track a new job application. Pass either a single `raw` line — `add_application({raw: "Bosch, Tech Lead, prio A, due friday, remote, via LinkedIn"})` — or structured fields (`company` and `role` required then). Returns the created application and possible-duplicate warnings; if duplicates are liste…
| Parameter | Type | Description |
|---|---|---|
| raw | string | Free-form line: "Company, Role, prio A|B|C, due <date>, remote|hybrid|onsite, via <source>, https://…, in <location>, applied <date>" |
| company | string | — |
| role | string | — |
| status | string | — |
| priority | string | A = top priority |
| remote | string | — |
| remote_note | string | e.g. "2 days office" |
| source | string | LinkedIn, referral, recruiter, Easy Apply… |
| url | string | Link to the job posting |
| location | string | — |
| salary_asked | integer | What the candidate asked for — yearly gross EUR as a plain number, e.g. 110000 |
| salary_range_min | integer | Posting salary range lower bound — yearly gross EUR, plain number |
| salary_range | integer | Posting salary range upper bound — yearly gross EUR, plain number |
| cv_variant | string | Which CV was sent: DE, EN, AI-focused… |
| match_notes | string | Markdown match assessment: why the candidate fits this role — strengths vs requirements, gaps, level/salary advice, process notes. Save your vacancy analysis h… |
| next_interview_at | string | ISO datetime, e.g. 2026-07-20T14:00:00+02:00 |
| next_action | string | e.g. "follow-up", "thank-you email" |
| next_action_due | string | ISO date YYYY-MM-DD |
| applied_at | string | ISO date YYYY-MM-DD |
list_applicationsList job applications. Filter by view (active = default working set, archive = rejected/withdrawn/no-response), status list, priority, or free-text search in company/role. Example: `list_applications({view: "active"})`, `list_applications({q: "bosch"})`.List job applications. Filter by view (active = default working set, archive = rejected/withdrawn/no-response), status list, priority, or free-text search in company/role. Example: `list_applications({view: "active"})`, `list_applications({q: "bosch"})`.
| Parameter | Type | Description |
|---|---|---|
| view | string | — |
| status | string | Comma-separated: started_apply, waiting_referral, applied, waiting, interview, offer, accepted, rejected, no_response, on_hold, withdrawn, archived |
| priority | string | — |
| q | string | Search in company/role |
| limit | integer | — |
update_applicationUpdate fields of an application (get the id from list_applications). Status changes are logged to the timeline automatically. Example: `update_application({id: "…", status: "interview", next_action: "prepare system design", next_action_due: "2026-07-20"})`.Update fields of an application (get the id from list_applications). Status changes are logged to the timeline automatically. Example: `update_application({id: "…", status: "interview", next_action: "prepare system design", next_action_due: "2026-07-20"})`.
| Parameter | Type | Description |
|---|---|---|
| id* | string | — |
| company | string | — |
| role | string | — |
| status | string | — |
| priority | string | A = top priority |
| remote | string | — |
| remote_note | string | e.g. "2 days office" |
| source | string | LinkedIn, referral, recruiter, Easy Apply… |
| url | string | Link to the job posting |
| location | string | — |
| salary_asked | integer | What the candidate asked for — yearly gross EUR as a plain number, e.g. 110000 |
| salary_range_min | integer | Posting salary range lower bound — yearly gross EUR, plain number |
| salary_range | integer | Posting salary range upper bound — yearly gross EUR, plain number |
| cv_variant | string | Which CV was sent: DE, EN, AI-focused… |
| match_notes | string | Markdown match assessment: why the candidate fits this role — strengths vs requirements, gaps, level/salary advice, process notes. Save your vacancy analysis h… |
| next_interview_at | string | ISO datetime, e.g. 2026-07-20T14:00:00+02:00 |
| next_action | string | e.g. "follow-up", "thank-you email" |
| next_action_due | string | ISO date YYYY-MM-DD |
| applied_at | string | ISO date YYYY-MM-DD |
add_noteAppend a free-text note to an application timeline — recruiter call summaries, interview instructions, pasted messages. Multiline markdown is fine. Example: `add_note({application_id: "…", text: "Recruiter: team of 5, on-call rotation, offer range 85-95k"})`.Append a free-text note to an application timeline — recruiter call summaries, interview instructions, pasted messages. Multiline markdown is fine. Example: `add_note({application_id: "…", text: "Recruiter: team of 5, on-call rotation, offer range 85-95k"})`.
| Parameter | Type | Description |
|---|---|---|
| application_id* | string | — |
| text* | string | — |
log_interviewLog an interview for an application (max 10 per application): when it takes place, its status (planned or done), who attends (each with an optional profile link), related links (prep materials the company sent, meeting URL), and a short recap of what was discussed. Also keeps the application's next…Log an interview for an application (max 10 per application): when it takes place, its status (planned or done), who attends (each with an optional profile link), related links (prep materials the company sent, meeting URL), and a short recap of what was discussed. Also keeps the application's next…
| Parameter | Type | Description |
|---|---|---|
| application_id* | string | — |
| scheduled_at* | string | ISO datetime with offset, e.g. 2026-07-20T14:00:00+02:00 |
| status | string | planned (default) or done |
| attendees | array | Who attends, each with an optional profile link |
| links | array | Related links: prep materials, meeting URL, docs |
| recap | string | Short recap of what was discussed |
get_dueWhat is burning today: applications with next_action_due today or overdue. Call this when the user asks "what should I do today?" about their job search.What is burning today: applications with next_action_due today or overdue. Call this when the user asks "what should I do today?" about their job search.
No input schema was published for this tool.
get_plannedWhat is actually SCHEDULED: interviews with their time, attendees and meeting links, plus the actions falling due, for today, tomorrow, or the next seven days. Use this whenever the user asks what is planned, what the day or week looks like, or before proposing a time to anyone — get_due only knows…What is actually SCHEDULED: interviews with their time, attendees and meeting links, plus the actions falling due, for today, tomorrow, or the next seven days. Use this whenever the user asks what is planned, what the day or week looks like, or before proposing a time to anyone — get_due only knows…
| Parameter | Type | Description |
|---|---|---|
| range | string | today (default), tomorrow, or week (today plus the next 6 days) |
attach_analysisAttach a markdown company analysis (research you produced) to an application. Single document per application — a new call REPLACES the previous one. Max 100000 bytes (~100 KB) of utf-8. The user reads it in the dashboard, e.g. before an interview. Example: `attach_analysis({application_id: "…", ma…Attach a markdown company analysis (research you produced) to an application. Single document per application — a new call REPLACES the previous one. Max 100000 bytes (~100 KB) of utf-8. The user reads it in the dashboard, e.g. before an interview. Example: `attach_analysis({application_id: "…", ma…
| Parameter | Type | Description |
|---|---|---|
| application_id* | string | — |
| markdown* | string | The analysis as markdown |
attach_fileAttach or replace a file on an application so the user sees it in the dashboard: a CV/resume (kind: 'cv') or a cover letter (kind: 'cover_letter'). Pass the file bytes as base64 in data_base64. One file per (application, kind) - a new call REPLACES the previous one. Max ~5 MB; pdf/doc/docx/txt/md (…Attach or replace a file on an application so the user sees it in the dashboard: a CV/resume (kind: 'cv') or a cover letter (kind: 'cover_letter'). Pass the file bytes as base64 in data_base64. One file per (application, kind) - a new call REPLACES the previous one. Max ~5 MB; pdf/doc/docx/txt/md (…
| Parameter | Type | Description |
|---|---|---|
| application_id* | string | — |
| kind* | string | — |
| filename* | string | — |
| data_base64* | string | Base64-encoded file bytes |
| mime | string | Optional; inferred from the filename extension when omitted |
attach_interview_fileAttach prep material to a specific interview so the user sees it next to that round in the dashboard: the prep document you wrote, the job description, a deck, notes the company sent. Max 3 files per interview, 20000000 bytes (20 MB) each; pass the bytes as base64. Get interview ids from get_applic…Attach prep material to a specific interview so the user sees it next to that round in the dashboard: the prep document you wrote, the job description, a deck, notes the company sent. Max 3 files per interview, 20000000 bytes (20 MB) each; pass the bytes as base64. Get interview ids from get_applic…
| Parameter | Type | Description |
|---|---|---|
| application_id* | string | — |
| interview_id* | string | — |
| filename* | string | — |
| data_base64* | string | Base64-encoded file bytes |
| mime | string | Optional; inferred from the filename extension when omitted |
get_applicationFull detail of one application: all fields, contacts, recent timeline events, and whether a company analysis is attached (fetch it via the dashboard or attach_analysis to replace).Full detail of one application: all fields, contacts, recent timeline events, and whether a company analysis is attached (fetch it via the dashboard or attach_analysis to replace).
| Parameter | Type | Description |
|---|---|---|
| id* | string | — |
11 of 11 tools published a description.
Tool names and descriptions are written by the publisher and shown verbatim as inert text. They are the strings an MCP client passes to a model, so Forge scans them for prompt-injection patterns — any finding appears with the security scan above. “Privileged” is a keyword match on the tool name, not an audit of what the tool does: a benign-sounding name can still do anything.
Job application tracker for developers - AI agents write over MCP, you review in a dashboard.
Linked names open Forge’s index of every entry observed exposing that tool. Browse all indexed tools.
This entry publishes no npm package, so Forge has no dependency tree for it. That is a gap in coverage — not a statement that it has no dependencies.