{"name":"io.github.tanmayagrawal21/applywise","slug":"tanmayagrawal21-applywise","title":"ApplyWise","description":"Job search and form filling; dry run by default, real submits need your approval or consent.","url":"https://mcp.market/server/tanmayagrawal21-applywise","rating":null,"grade":"A","score":92,"certified":false,"status":"active","category":"search","tags":["search"],"presence":{"score":25,"stars":0,"forks":0,"downloads_week":93,"last_push_at":"2026-10-23T22:39:29.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/tanmayagrawal21/job-apply-mcp","website":null,"version":"0.1.0","remotes":[],"packages":[{"registryType":"pypi","identifier":"applywise","version":"0.1.0","runtimeHint":"uvx","transport":{"type":"stdio"}}],"tools":[{"name":"answer_profile_question","description":"Ask 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"apply_batch","description":"Plan + submit many applications concurrently. Returns one compact status row per ref. Open profile questions are asked once, before the batch starts (never mid-batch).","write_action":false,"price_micros":0,"input_schema":null},{"name":"consent_status","description":"Active 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`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"control_check","description":"Check 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}.","write_action":false,"price_micros":0,"input_schema":null},{"name":"control_status","description":"Active mode, quotas used/remaining, enabled controls and recent blocks.","write_action":false,"price_micros":0,"input_schema":null},{"name":"draft_answers","description":"Draft 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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"facts_report","description":"Resume-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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_form","description":"Return the application form schema (keys, labels, kinds, required, options).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_job","description":"Fetch one posting. Add 'description' to fields to include the (trimmed) description.","write_action":false,"price_micros":0,"input_schema":null},{"name":"give_feedback","description":"Feedback 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\"","write_action":false,"price_micros":0,"input_schema":null},{"name":"grants_status","description":"Active 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"health","description":"Report enabled platforms, LLM providers and which local models are reachable.","write_action":false,"price_micros":0,"input_schema":null},{"name":"improvement_report","description":"Ranked improvement proposals learned from recent run failures (compact). Page with `cursor` (= `next`).","write_action":false,"price_micros":0,"input_schema":null},{"name":"ingest_confirmations","description":"Record 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_applications","description":"List recorded applications from the local store.","write_action":false,"price_micros":0,"input_schema":null},{"name":"plan_application","description":"Run 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","write_action":true,"price_micros":0,"input_schema":null},{"name":"profile_questions","description":"Top 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"provenance","description":"Origin, model, prompt hash and ancestor chain for a text id.","write_action":false,"price_micros":0,"input_schema":null},{"name":"provide_verification_code","description":"The 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"reconcile_submissions","description":"Match 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_text","description":"Record 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"request_feature","description":"Propose (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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"resolve_submission","description":"Inspect (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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"run_applications","description":"Apply 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","write_action":true,"price_micros":0,"input_schema":null},{"name":"run_report","description":"Report 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).","write_action":true,"price_micros":0,"input_schema":null},{"name":"search_jobs","description":"Search 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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_status","description":"Progress of a search_jobs session: status, boards done/total, rows, elapsed. Accepts a session id or cursor.","write_action":false,"price_micros":0,"input_schema":null},{"name":"seed_from_confirmations","description":"Seed 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"submit_application","description":"Submit 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>`).","write_action":true,"price_micros":0,"input_schema":null},{"name":"sync_confirmations","description":"Pull 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tune_run","description":"Train 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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"tune_status","description":"Local style-tuning state: backend, promoted/previous adapter, new user texts vs threshold, last run.","write_action":false,"price_micros":0,"input_schema":null},{"name":"vault_status","description":"Which 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`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"verify_text","description":"User approves LLM text. Without edited_text -> user_verified; with it -> user_edited child plus diff.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":92,"grade":"A","scanned_at":"2026-10-24T16:17:40.945Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-24T16:17:40.876Z","components":{"code":{"score":25,"max":25,"notes":["145 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 1 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"applywise","version":"0.1.0","found":true,"weeklyDownloads":93,"license":"MIT","dependencyCount":17,"publishedAt":"2026-10-23T10:33:46.450065Z","repositoryUrl":"https://github.com/tanmayagrawal21/job-apply-mcp"}],"repo":{"found":true,"owner":"tanmayagrawal21","repo":"job-apply-mcp","archived":false,"pushedAt":"2026-10-23T22:39:29Z","stars":0,"forks":0,"openIssues":16,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/75105967?v=4","ownerCreatedAt":"2020-11-27T03:13:14Z","license":"MIT"},"icon":{"url":null,"source":"none"},"presence":{"stars":0,"forks":0,"downloadsWeek":93,"license":"MIT","lastPushAt":"2026-10-23T22:39:29.000Z","score":25}}}},"grade_history":[],"reviews":[]}