Skip to main content

jobctl

io.github.DmytroRybka/jobctlVersion 0.5.1

Job application tracker for developers - AI agents write over MCP, you review in a dashboard.

Status

Responds66 msAnswered our handshake without sign-in.

Registry data may be out of date

We could not refresh it, so this page shows the last copy.
Last checked
Nov 14, 2026, 14:37 UTC
Latency
66 ms
Remotes responding
1 of 1
Sign-in
No sign-in
Hosting
EU hosting detected (detected, not a legal statement)
Registry data as of
Nov 14, 2026, 22:14 UTC

Data from the official MCP Registry, checked by run.zero. How we check

Connect

Streamable HTTP
https://app.jobctl.app/mcpResponds66 ms
No sign-in

Claude Code

claude mcp add --transport http jobctl https://app.jobctl.app/mcp

Claude Desktop and claude.ai

Settings > Connectors > Add custom connector
Name: jobctl
Remote MCP server URL: https://app.jobctl.app/mcp

Cursor

{
  "mcpServers": {
    "jobctl": {
      "url": "https://app.jobctl.app/mcp"
    }
  }
}

VS Code

code --add-mcp '{"name":"jobctl","type":"http","url":"https://app.jobctl.app/mcp"}'

Built your own server? run.zero hosts MCP servers on European infrastructure.

Host your own MCP server on run.zero

Tools

11 tools

Tools of jobctl
Read-only
Idempotent
Open world
add_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 listed, tell the user instead of creating again.NoNoNot declaredNot declared
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"})`.NoNoNot declaredNot declared
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: "…", markdown: "# Bosch\n\n## Culture…"})`.YesNoNot declaredNot declared
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 (MIME is inferred from the filename if you omit it). Call this whenever you generate a tailored CV or cover letter for an application. Example: `attach_file({application_id: "…", kind: "cv", filename: "CV_Cursor.pdf", data_base64: "JVBERi0…"})`.YesNoNot declaredNot declared
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_application. Example: `attach_interview_file({application_id: "…", interview_id: "…", filename: "prep-round2.md", data_base64: "IyBQcmVw…"})`.NoNoNot declaredNot declared
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).Not declaredYesNot declaredNot declared
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.Not declaredYesNot declaredNot declared
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 action deadlines and is blind to booked interviews. Example: `get_planned({range: "tomorrow"})`.Not declaredYesNot declaredNot declared
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"})`.Not declaredYesNot declaredNot declared
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-interview date in sync. Example: `log_interview({application_id: "…", scheduled_at: "2026-07-20T14:00:00+02:00", status: "planned", attendees: [{name: "Anna Weber (HR)", url: "https://linkedin.com/in/annaweber"}], links: [{label: "Prep materials", url: "https://company.com/interview-prep"}], recap: "System design round"})`.NoNoNot declaredNot declared
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"})`.NoNoNot declaredNot declared

Details

Registry status
Active
Published
Jul 16, 2026
Updated
Jul 16, 2026
Repository
Not given
Categories (suggested)
Developer toolsData and analyticsSuggested categories are assigned automatically from the registry text and may be wrong. Verified operators can correct them.
GDPR
Not declared

Are you the operator? Claim this listing