ApplyWise MCP server
io.github.tanmayagrawal21/applywise·v0.1.0Job search and form filling; dry run by default, real submits need your approval or consent.
0 stars93 downloads/wk
Reviews
Write oneNobody has reviewed ApplyWise yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
ApplyWise tools (34, 5 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
answer_profile_questionAsk the USER (MCP elicitation) to type the answer for a gap key from profile_questions. This tool takes no value: the answer comes only from the user's own input and is stored as user_written. If the client cannot elicit, nothing is stored; tell the user to run `job-apply-mcp profile ask`. Scope: global | company | role_family (+ scope_value, or 'company:Acme'). Demographics are never stored here.
apply_batchPlan + submit many applications concurrently. Returns one compact status row per ref. Open profile questions are asked once, before the batch starts (never mid-batch).
consent_statusActive consent windows (mode, scopes, seconds left, submissions left). Read-only: only a human can consent, in a terminal: `job-apply-mcp consent --for 24h` or `--per-run`.
control_checkCheck a side-effecting action against the control layer. action: apply|submit|send_message| write_prose|merge. payload: ref, platform, company, dry_run, text, recipient, page_text, form_labels, attestations. Returns {decision: pass|block|needs_human, violations, warnings}.
control_statusActive mode, quotas used/remaining, enabled controls and recent blocks.
draft_answersDraft the prose fields a plan left open (writing.mode="deferred", or ones that timed out): local writer + reviewer under writing.timeout_s. Returns the same shape as plan_application with a fresh approval_id, paged the same way (`cursor=next` pages the last draft from memory).
facts_reportResume-first fact precedence: counts, profile/resume conflicts, and user-letter facts excluded because they conflict with or are outdated relative to the resume (with the reason and the resume's version).
get_formReturn the application form schema (keys, labels, kinds, required, options).
get_jobFetch one posting. Add 'description' to fields to include the (trimmed) description.
give_feedbackFeedback on a run (optionally on one `ref` of it), applied at the start of the next run. Structured: {"kind":"deny_company"|"deny_title", "pattern"?} (no pattern + ref = that item's company/title), {"kind":"answer","pattern","value"} for plain questions only; any authorization, demographic, consent, attestation, legal or AI-use question (or {"kind":"profile_answer","key"|"question","value","scope"
grants_statusActive human-issued grants (scope, seconds left, uses left). Read-only: only a human can create or revoke a grant, via `job-apply-mcp grant` in a terminal.
healthReport enabled platforms, LLM providers and which local models are reachable.
improvement_reportRanked improvement proposals learned from recent run failures (compact). Page with `cursor` (= `next`).
ingest_confirmationsRecord the user's own application-confirmation emails so those jobs are never re-applied to. Pass message summaries from the user's mail tool: [{sender, subject, date, snippet}] (snippet = first ~500 chars, optional). Read-only on mail; the server stores only company, title and date. Returns counts plus up to a few new matches. preview=true parses without writing.
list_applicationsList recorded applications from the local store.
plan_applicationwrite actionRun policy gates + duplicate check, fill answers from the profile and local LLMs, and list unresolved fields. Unresolved free-text fields come back as `client_tasks` for the calling agent to write. `src` names the source of every answer that is not "profile". A result too large for one response is paged: it carries `next` and `total`; call again with `cursor=next` to get the next page of the SAME
profile_questionsTop open profile gaps (questions the tool could not answer, or answered with a default), ranked by frequency x impact (blocked applications weigh most). Ask the user these, then call answer_profile_question.
provenanceOrigin, model, prompt hash and ancestor chain for a text id.
provide_verification_codeThe user types the code they received (email/SMS) for a submission in status `awaiting_code`. Ask the USER; never try to read their mail or guess. Only the format is checked; the code is typed into the open page, the page's verify button is clicked once, then the normal confirmation check runs. One attempt per code; the application is never resubmitted; after `verification.code_ttl_s` it becomes a
reconcile_submissionsMatch open submissions (submitted/unknown/submitting/handoff) to confirmation emails and mark confident matches `confirmed` (evidence = email subject/date; never bodies). Checks run at ingest.reconcile_delays_min after each submit; force=true checks now. With the default client mail source and no `messages`, returns a `client_task`: fetch recent confirmation-email summaries and pass them here or t
record_textRecord provenance for a text artifact (kind: resume_bullet|cover_letter|answer|profile_fact). origin: user_written | llm_generated (llm_generated needs `model`). `context` = job/question the text answers.
request_featurePropose (and, if a coder backend is configured, implement as a PR for human review) a change to this tool. kind: platform_adapter | control | config | new_tool | bug (auto-detected if omitted).
resolve_submissionInspect (no outcome) or resolve a submission stuck in submitting/unknown. outcome: submitted|failed| handoff. Requires `evidence` = the evidence folder path reported for the ref. Audit-logged.
run_applicationswrite actionApply from any mix of sources in one run: explicit `links` (or `links_file`, one URL per line), job links the user emailed to themselves (read-only mail; sender, recipient and label come from config only; `mail` may only narrow with {query, since, since_days}), and discovery (`discovery` = search_jobs arguments). Priority: links, then mail, then discovery. `sources` subsets ["links","mail","discov
run_reportwrite actionReport of a run (default: the latest): counts plus rows per status (submitted, confirmed, dry_run_ok, needs_human, quota_blocked, skipped, unsupported_site, unknown, failed; see run_applications), each with `why`. `category` shows one only (the old names handed_off and dry_run still work).
search_jobsSearch postings across enabled platforms in parallel. Returns compact rows: ref, co, title, loc, pay, flags. The first call runs the whole search once; pass the returned `next` as `cursor` for more pages (instant).
search_statusProgress of a search_jobs session: status, boards done/total, rows, elapsed. Accepts a session id or cursor.
seed_from_confirmationsSeed dedupe from confirmation-email history (default ingest.seed_since_days=180) before a run, so no side files are needed. mbox/imap sources are read directly; with the client source and no `messages` this returns a `client_task` to fetch summaries and call it again with them.
submit_applicationwrite actionSubmit using the best available path (platform API, else browser driver). Honors global dry_run; a per-call dry_run can only make it safer. `approval_id` is the server-issued id from plan_application. With approval_mode=human a person must approve (dialog, or `job-apply-mcp approve <id>`).
sync_confirmationsPull confirmation emails from the configured read-only source (ingest.source: mbox or imap) for the last `since_days` days and record them as already applied. Never sends, moves, flags or deletes mail.
tune_runwrite actionTrain a LoRA on the user's own texts, gate it against the incumbent, promote only if better. trigger: manual | new_data (skips below the configured threshold) | rollback (restore previous adapter). wait=False starts in the background; poll tune_status.
tune_statusLocal style-tuning state: backend, promoted/previous adapter, new user texts vs threshold, last run.
vault_statusWhich ATS hosts have a stored login (host and count only, never a username's password), whether the credentials consent window is open, accounts awaiting email verification, and this run's login flags (lockout, wrong_password, captcha). Read-only: logins are added by a human with `job-apply-mcp vault add`.
verify_textUser approves LLM text. Without edited_text -> user_verified; with it -> user_edited child plus diff.
Public scan report
scanner v0.1.10 · 2026-10-24 · same rubric, same numbers if you re-run it
- Code scan145 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 1 days ago15/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
How ApplyWise compares
Against every graded Web search MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 92/100
- higher than 90% of 3,470 Web search servers
- Tools
- 34
- the typical Web search server has 5
- Tools that change things
- 15%
- typical: 0%. Fewer write tools means less an agent can break
- Downloads a week
- 93
- more than 55% of 827 Web search servers with a package
What its tools let an agent do: 27 read · 4 change · 3 run or deploy
Install ApplyWise in Claude Code, Cursor or VS Code
claude mcp add applywise -- uvx applywise
What the publisher says
From the ApplyWise repository's README, as published. We do not edit it. Read it on GitHub
job-apply-mcp (ApplyWise)
<!-- mcp-name: io.github.tanmayagrawal21/applywise -->
An MCP server that finds jobs and fills applications for you, and stops before anything irreversible. It is modular (pluggable platforms, LLM providers, browser drivers), parallel, token-frugal (compact, paginated output) and local-first (routine form fields go to Ollama, LM Studio or MLX on your machine; only hard prose escalates). Works with any MCP client on macOS, Linux and Windows.
[!WARNING]
Alpha. Field results from the first live dogfooding run (one user, one night, ~330 discovered postings):
search, ranking, dedupe and planning work end to end, and the browser driver now fills and verifies
complete Greenhouse and Lever forms, but no application has yet been submitted unattended. Most
Greenhouse boards are reCAPTCHA-protected, so the tool fills the form and hands the final click to you
(handoff), which is the intended behaviour. Free-text questions need writing.reviewer = "router" (local strict
review) to go out without you. Expect rough edges; every irreversible step is gated, logged and
never retried when the outcome is uncertain.
Install as a Claude Code plugin
The repository is also a Claude Code plugin marketplace. The applywise plugin starts the MCP server for you (pinned to a reviewed version) and adds a skill that tells Claude how to use the tools safely:
claude plugin marketplace add tanmayagrawal21/job-apply-mcp
claude plugin install applywise@applywiseThen run init and doctor from the quickstart below in your own terminal, and check /mcp for plugin:applywise:applywise. The same safety model applies: dry run by default, a human approves every real submit, and visible CAPTCHAs always come back to you; logins, codes and account creation stay with you unless you open a consent window yourself (safety model, items 7 and 8). To update, run claude plugin update applywise@applywise. How releases and the version pin work: docs/release.md.
5-minute quickstart
You need uv (or pipx). No clone required.
# 1. Create config.toml, profile.toml, controls.toml (asks a few questions; --yes to skip them)
uvx --from git+https://github.com/tanmayagrawal21/job-apply-mcp job-apply-mcp init
# 2. Put your real details in the profile it printed the path of, then check everything
uvx --from git+https://github.com/tanmayagrawal21/job-apply-mcp job-apply-mcp doctor
# 3. Add the printed snippet to your MCP client (guides for ten clients: docs/clients/)
claude mcp add --transport stdio job-apply -- uvx --from git+https://github.com/tanmayagrawal21/job-apply-mcp job-apply-mcpThen ask your assistant: "search jobs at greenhouse:examplecorp for data roles, plan the best one, and do a dry run." Everything is a dry run until you set dry_run = false.
Install alternatives: pipx install git+https://github.com/tanmayagrawal21/job-apply-mcp (then the command is just job-apply-mcp), or pip install into a virtualenv. After the first PyPI release, uvx applywise (the PyPI distribution is applywise; the job-apply-mcp command stays as an alias). Optional extras: [browser] (Playwright), [agent], [jobspy], [mlx], [hf], [litellm], [keyring].
Features
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
ApplyWise: common questions
- Is ApplyWise MCP server safe?
- Yes, by our scan: it is graded A (92/100). Read the ApplyWise safety report
- How do I install ApplyWise?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does ApplyWise need an API key?
- Not as far as the registry entry and our scan can tell: no credentials are declared or required.
- Is ApplyWise maintained?
- The last commit was 11 days ago (2026-10-23). The latest release is v0.1.0.
- What can I use instead of ApplyWise?
- Servers from other publishers that do the same job: Jobseek MCP server and Workopia — Job Search MCP server.
- How does ApplyWise compare with other Web search MCP servers?
- safety score 92/100 (higher than 90% of 3,470 Web search servers); tools 34 (the typical Web search server has 5); tools that change things 15% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.
Alternatives to ApplyWise
Same job from other publishers: the closest match first, then the best rated.
- JobseekSearch jobs and companies on Job Seek (jseek.co)not reviewedEstablishedA
- Workopia — Job SearchSearch 6.3M+ live jobs from companies' own career pages, plus resume tailoring & cover letters.not reviewedGrowingB