jobctl

io.github.DmytroRybkaPublished by GitHub account DmytroRybkav0.5.1Updated Oct 24, 2026

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

VerifiedStreamable HTTPWeb executableProductivity & WorkflowFiles & Storage

Overview

AI-generated overview

Lets an assistant track job applications, log interviews, notes and due actions, and attach CVs and analyses, reviewed in a dashboard.

What you can do
An assistant can add applications from a free-text line or structured fields, list and filter them by view, status, priority or search, and update fields such as status and next action. It can append timeline notes, log interviews with attendees and links, and report what is due today or what is scheduled for the coming days. It can also attach a company analysis, a CV or cover letter to an application, and prep files to an interview.
When to use it
Useful when someone wants an AI assistant to maintain their job search pipeline while they review and edit it in a web dashboard. Fits workflows like asking what to do today, what interviews are planned, or recording recruiter calls and interview recaps.
Requirements
A remote MCP endpoint at app.jobctl.app over streamable HTTP; no packages, environment variables or headers are declared. The user reviews and manages the data in the jobctl dashboard.
Before you install
The assistant writes to the user's job search data: it creates and updates applications, notes, interviews and attached files, and a new analysis or file replaces the previous one for that application or kind. Attached files are sent as base64 and stored in the service. No authentication is declared in the manifest, so check how the endpoint is secured before use.

Installation

In SourceWeft

  1. Open jobctl in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.DmytroRybka%2Fjobctl/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

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

Tools

11

add_application

Add application

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 listed, tell the user instead of creating again.

Parametersrawurlroleremotesourcestatuscompanylocationpriorityapplied_atcv_variantmatch_notes+7 more

list_applications

List applications

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"})`.

Parametersqviewlimitstatuspriority

update_application

Update application

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"})`.

Parametersidrequiredurlroleremotesourcestatuscompanylocationpriorityapplied_atcv_variantmatch_notes+7 more

add_note

Add note

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"})`.

Parameterstextrequiredapplication_idrequired

log_interview

Log interview

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-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"})`.

Parameterslinksrecapstatusattendeesscheduled_atrequiredapplication_idrequired

get_due

Due actions

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.

Takes no parameters.

get_planned

Planned schedule

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 action deadlines and is blind to booked interviews. Example: `get_planned({range: "tomorrow"})`.

Parametersrange

attach_analysis

Attach company analysis

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: "…", markdown: "# Bosch\n\n## Culture…"})`.

Parametersmarkdownrequiredapplication_idrequired

attach_file

Attach CV or cover letter

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 (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…"})`.

Parameterskindrequiredmimefilenamerequireddata_base64requiredapplication_idrequired

attach_interview_file

Attach interview prep file

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_application. Example: `attach_interview_file({application_id: "…", interview_id: "…", filename: "prep-round2.md", data_base64: "IyBQcmVw…"})`.

Parametersmimefilenamerequireddata_base64requiredinterview_idrequiredapplication_idrequired

get_application

Get application

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

Parametersidrequired

Version history

1
  1. v0.5.1LatestSep 16, 2026

Score

83% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts

    Declare a GitHub repository with a README, or serve resource_documentation in the OAuth protected-resource metadata.

  • LicenseNot applicable

    A hosted service is used under its provider's terms, so no license is expected here. This check is left out of the percentage.