FreeApply
MCPB · FREEAPPLY-1.0.6.MCPB
Free job-search agent: finds matching jobs, applies through your AI app, tracks it all locally.
Available components
Last scanned (17 hours ago)
Scores higher than 75% of MCPB servers
Category CRM and Sales
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security13
- No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
- Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).Unverified
- No install/post-install scripts declared.Pass
- Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).Unverified
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 7 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability75
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 7080 tokens (~393/item across 18 items; 18 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
- Stability check failed: the tool surface changed between 1.0.0 and 1.0.6: 17 tool removals, 0 breaking changes, 10 additions. See how to fix → Fail
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 18 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 19 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Checks we ran (13)
- Install scripts
- Source repository
- Provenance
- License
- Maintenance
- Security disclosure
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
Checks we could not complete (3)
These are gaps on our side, not findings about this package. We only credit what we can confirm, so a category made up entirely of them scores 0.
- Malware scan in Supply Chain SecurityNo malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
- Known CVEs in Supply Chain SecurityKnown CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
- Dependency health in Supply Chain SecurityDependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
Does not apply to this package (2)
- Endpoint SecurityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
- Transport & ReachabilityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
The score does not measure everything. What the score does not measure →
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 29 Oct 26 −1
- Provenance: fail → unverified ▼ security
- Stability: fail → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Package version: 1.0.3 → 1.0.6 functional
- Package version: 1.0.3 → 1.0.5 functional
- Package version: 1.0.3 → 1.0.4 functional
- 28 Oct 26 +7
- Stability: unverified → fail ▼ security
- Schema quality: pass → fail ▼ functional
- Tool coverage: 4% → 100% ▲ functional
- License: fail → pass ▲ functional
- Schema quality: good → excellent functional
- Destructive annotations: 0 → pass functional
- Licence: MIT functional
- Package version: 1.0.0 → 1.0.3 functional
- Package version: 1.0.0 → 1.0.2 functional
- Package version: 1.0.0 → 1.0.1 functional
- 27 Oct 26 38
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed mcpb/https://github.com/FreeApply/freeapply/releases/download/v1.0.6/freeapply-1.0.6.mcpb@1.0.6
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | mcpb |
| Reason | No attestation published |
Background: How many MCP packages publish verified provenance →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
freeapply_check_replies Run a reply check: plan, read, mark, finish ~392
Runs one email reply check (the freeapply-replies procedure), always beginning with action start, and, when the user saved an email login in Settings, reads and marks their mailbox itself. Each email found is recorded with freeapply_record_outcome. Use: start first; then read (start's mail.reader freeapply) or the Gmail connector (connector); mark after recording each email read returned; finish once everything found is recorded. Behavior: start: read-only, repeatable. read: signs in with the app password kept on this computer (you never see it), returns matching emails, changes nothing. mark: stars and/or labels one email as the user chose in Settings. finish: sets the last check to now, so the next check reads only newer email: only after recording everything found. Returns: start (the plan) {since, gmail (the user's mail settings: action none|star|label|star_and_label, label_name, ...), mail {reader: freeapply|connector, address}, applied [{job_id, company, title, submitted_at}], known_message_ids (already recorded)}. read {emails: [{gmail_message_id, gmail_thread_id, sender, subject, received_at, text}] newest first, already-recorded left out, count}. mark {mail_action} (for freeapply_record_outcome). finish {last_check}. Errors: an action other than start, read, mark or finish; read or mark without a saved email login; the mail server refusing the login.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | start (always first): the plan; read: the mailbox; mark: star or label one email; finish (always last): the check is done. |
| gmail_message_id | string | – | Required for mark: the email's id, from read. |
| kind | string | – | Required for mark: the outcome you recorded for the email. |
No output schema declared.
No examples provided.
freeapply_check_text Check text and save the cover letter ~397
Checks a cover letter or free-text answer against what the user really has; saves a passing cover letter as a PDF to upload. Every piece of prose is checked here before you type or attach it (freeapply_update_job only records). Use: before typing any written answer or attaching any letter, and after each fix. Not for short fields straight from settings (name, date, yes/no). Behavior: flags every skill, tool, number or claim the résumé, settings, highlights and saved answers don't support. Without save, changes nothing. With save, a passing letter becomes a PDF in the documents folder, kept with the job; a failing one is never saved; saving again replaces the file; refused once the job is applied. Until setup has stored the résumé's text, most claims are reported unsupported. Returns: {ok, problems} (plain sentences: fix, remove or ask the user). With job_id also keywords {used, unused}: the posting's supported skills this text uses / could still use. With save also file {path, name, bytes}, or note (why not saved). Errors: save without kind cover_letter and job_id; unknown job_id.
| Name | Type | Req | Description |
|---|---|---|---|
| company | string | – | The employer, when there is no job_id. |
| job_id | integer | – | Adds the posting's keywords; numbers from the job's posting, title, pay, location and posting id, and the user's answers for this job, count as facts. Needed for save. |
| kind | string | – | cover_letter: also checks the user's length, sign-off, leftover placeholders and that the company is named. answer (default): facts only. |
| save | boolean | – | Save a passing cover letter as a PDF (default false). For a letter, pass it from the first call: checked and saved at once. |
| text | string | yes | The letter or answer, exactly as you will type or attach it. |
No output schema declared.
No examples provided.
freeapply_claim_job Claim or skip a job ~603
Claims a job before you work on it: duplicate check, the user's rules, starts tracking, returns the job_id every later call needs. Makes the job's first record (listing: freeapply_list_jobs; changing: freeapply_update_job). Use: before opening any application form; also to record a reviewed job you won't pursue (status skipped + status_note) so it isn't reviewed again. Not for a job already claimed. Behavior, first match wins: posting id already tracked: returns that job (existing true, nothing added); job site the user didn't choose, or signed out or paused: refused (refused says why, sites lists ready ones); same company and title as an applied job: refused as a repost; posted pay below the user's minimum: saved as skipped (rule pay_floor). Otherwise the job is added. A refused or existing claim changes nothing, so repeating the call is safe. Returns: {job_id, existing, status, rule, earlier}. earlier: up to 20 other jobs at the company [{id, title, company, status, same_title}]; if an applied one is clearly the same role under another title, mark this one skipped (freeapply_update_job). restart true (auto-run): the user saved new settings and wants them used now: don't work this job; the run finishes and starts again. Errors: a missing title or company.
| Name | Type | Req | Description |
|---|---|---|---|
| apply_url | string | – | Application form URL, if different. |
| company | string | yes | The employer as posted; not a staffing firm, when you can tell. |
| description | string | – | Short description or key requirements. |
| external_id | string | – | The posting's id on its source site; pass it whenever shown: finds the posting again and catches reposts. |
| fit_notes | string | – | Why it fits or doesn't, one sentence. |
| fit_score | integer | – | 0-100, scored as the apply procedure says. |
| location | string | – | As posted. |
| pay_max | number | – | Highest posted pay, a number. Feeds the pay floor. |
| pay_min | number | – | Lowest posted pay, a number: annual, or hourly if posted hourly. Feeds the pay floor. |
| pay_text | string | – | Pay exactly as posted, e.g. "$90k-$110k". |
| source | string | – | Where found: job site id (linkedin, indeed, company_sites, ...) or referral; tells the job site like url. |
| status | string | – | found (default): to work on; skipped: a job you won't pursue. |
| status_note | string | – | For skipped: why, one plain sentence. |
| title | string | yes | As posted. |
| url | string | – | Posting URL; tells the job site. The URL just read by freeapply_fetch_posting keeps its keywords. |
| work_mode | string | – | remote, hybrid or onsite, as posted. |
No output schema declared.
No examples provided.
freeapply_clear_to_submit Get clearance to submit ~409
Go-ahead for one submit after checking the pace, the user's limits and, in auto-run, the Stop button. Comes right before the submit; freeapply_update_job refuses applied without its clearance. Use: right before every submit, with job_id. Not early, not for a job you won't submit now: each clearance counts toward the per-minute pace at once. Behavior: at most 3 submits a minute (or the user's slower setting) and the user's daily cap. A clearance: one job, 15 minutes, used up when applied is recorded; asking again for the same job issues a new one; kept only while FreeApply runs. Parameters: job_id ties the clearance to that one job (without it you only see the pace). method: external (employer or ATS form, the default), easy_apply or email; the pace and daily cap count submits by that method, and easy_apply also needs one-click apply allowed in Settings. run_id, only in auto-run (from freeapply_manage_autorun start), adds the user's Stop and limits, and counts as the run checking in. Returns: {clear, advice, last_minute, limit_per_minute, today, daily_cap}, plus clearance {job_id, expires_at} when clear. clear false: don't submit; prepare the next job, call again later. refused: one-click apply is off; apply on the employer's site or skip the job. stop_run true (with reason): the run must end now: freeapply_manage_autorun action finish. restart true: the user saved new settings and wants them used now: submit and record this job, start no other, finish the run; the next begins at once.
| Name | Type | Req | Description |
|---|---|---|---|
| job_id | integer | – | The job about to be submitted. |
| method | string | – | How you will submit (default external). |
| run_id | string | – | Auto-run only: the run_id from freeapply_manage_autorun start. |
No output schema declared.
No examples provided.
freeapply_fetch_posting Fetch a job posting ~392
Fetches one job posting from the user's computer, trimmed: description, form questions, suggested answers, skills asked. Costs few tokens next to the browser, which you still use to fill and submit the form. Use: read each posting you found before scoring or applying. FreeApply has no job search of its own: search the user's job sites in the browser. Not for search-result or sign-in pages: read those in the browser. Behavior: read-only; one web request. Greenhouse, Lever, Ashby via their public APIs, other sites as page text. Public http(s) only: an address on this computer or a local network, or a redirect to one, is refused. Remembered this session, so freeapply_claim_job keeps its keywords. Parameters: url, the posting or its application form; max_chars caps only the description (default 6000, at least 500; description_chars tells you when it was cut); source, the job site where you found it (e.g. linkedin), picks the saved answers meant for that site. Returns: ats, title, company, location, work_mode, pay, description, description_chars (full length), questions [{label, required, type, options}], suggested_answers (from settings and saved answers; answer anything else only from the résumé or the user), keywords {matched, missing, coverage}: use matched in the posting's words, never claim missing; coverage = matched share in %, null if the posting names none. Errors: a bad or local address, or an unfetchable page, with the reason: read it in the browser. Next: freeapply_claim_job.
| Name | Type | Req | Description |
|---|---|---|---|
| max_chars | integer | – | Description cap in characters (default 6000). |
| source | string | – | Job site id where found, e.g. linkedin. |
| url | string | yes | The job page or its application form. |
No output schema declared.
No examples provided.
freeapply_find_site_account Find the user's employer-site account ~246
Whether the user already made an account on an employer's careers site, and with which email. Employer sites only (job boards such as LinkedIn that signed the user out: freeapply_report_site_problem). Use: when an application form asks you to sign in or create an account. Not for signing in or up: FreeApply stores no passwords and you never type one. Behavior: read-only. The user records the accounts they make on the dashboard's Needs you tab. Parameters: site, the host the sign-in form is on, or any URL there. It is reduced to the domain without www. and matched exactly, so careers.example.com and example.com are different sites: pass the one the form is on. Returns: known account {domain, email_used, created_at, job_id, note}: ask the user to sign in in the browser, then continue in their session. None {domain, account: null}: freeapply_update_job status needs_account, account_url = the sign-up page. Errors: a site that isn't a domain or web address.
| Name | Type | Req | Description |
|---|---|---|---|
| site | string | yes | Domain or any URL on it, e.g. careers.example.com. |
No output schema declared.
No examples provided.
freeapply_get_settings Read the user's settings ~288
Reads the user's settings: who they are, what they seek and how FreeApply should work. Single form answers: freeapply_manage_answers; whether FreeApply can run: freeapply_get_status. Use: once per session or helper, and again after each auto-run go, before scoring jobs or filling a form. With the résumé text and the user's own words, the only source of facts about the user: never invent beyond it. To change: freeapply_update_settings. Behavior: read-only; never includes installation secrets. Parameters: sections, the sections to return (default all, named under Returns): ask only for what the step needs, e.g. ["profile", "eligibility"] for a form, and leave out resume, the largest, unless you need its text. Returns: {settings, missing}. Sections: profile, targets, eligibility, resume (file paths, text, profile; the user adds and replaces résumé files in the dashboard), cover_letter, automation, autorun, gmail, custom_answers, models, model_choices, sharing (choices only). missing: required fields still empty [{key, label}]; while non-empty, apply nowhere: open the settings tab (freeapply_open_dashboard) and ask the user to fill them. Errors: an unknown section; the message lists valid ones.
| Name | Type | Req | Description |
|---|---|---|---|
| sections | array | – | Section names to return (default all). |
No output schema declared.
No examples provided.
freeapply_get_stats Get job-search statistics ~177
The user's job search in numbers: applications, replies, interviews, offers, rates (individual jobs: freeapply_list_jobs; whether FreeApply can run: freeapply_get_status). Use: to report progress, e.g. when wrapping up a session. Not for finding a particular job. Behavior: read-only, cheap: counted fresh from the local database each call, nothing cached. No parameters. Returns: tracked, applied, applied_today, queued, needs_you (jobs waiting on the user), interviews, offers, rejections, acknowledged, response_rate (% of applications with a real reply; automatic acknowledgements not counted), avg_fit, last_reply_check (when the last Gmail reply check finished), counts by_status, by_outcome, by_method, daily (applications per day), top_companies, top_titles, top_jobs.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
freeapply_get_status Check FreeApply and get a procedure ~456
Whether FreeApply can work now, plus the signed step-by-step procedure for a task. About FreeApply itself (user details: freeapply_get_settings; job search: freeapply_get_stats). Use: first in every session and before each task; with wait after asking the user to accept the Terms or finish setup in the dashboard. Works while locked or the Terms are unaccepted, so it can say why. Behavior: read-only: reports what FreeApply set up when it started (data folder, database, dashboard, the résumé copy to upload). wait holds the call up to 10 minutes until the Terms are accepted and setup is complete, and returns within seconds of that. Parameters: none for status only; procedure adds that task's signed steps; lane (with procedure freeapply-apply) is for a helper: only the hard rules and that lane's steps, with a short status; wait as above, with or without procedure. Returns: workflow {ok, problem}, terms {ok}, setup_complete, missing, sites [{id, name, ready}] (chosen job sites), autorun, update, dashboard (URL), data_dir, documents {dir, resume, cover_letters}, stats, procedures, models {can_delegate, rescan, levels, lanes, unfilled} (each level and lane {model, effort, source}; model current = your own model does it). With procedure also procedure {name, description, text, workflow_version, workflow_hash}, null while locked. wait_again true: a wait ran out first; call again. Next: workflow.ok false: tell the user why, stop. terms.ok or setup_complete false: follow freeapply-setup. models.rescan true: do its AI models step first.
| Name | Type | Req | Description |
|---|---|---|---|
| lane | string | – | A helper's lane of freeapply-apply; the agent that starts helpers omits it. |
| procedure | string | – | freeapply-setup (first run; Terms or settings missing; starting auto-run), freeapply-apply (find jobs, apply) or freeapply-replies (email reply check). |
| wait | boolean | – | Hold the call until the Terms are accepted and setup is complete (up to 10 minutes). |
No output schema declared.
No examples provided.
freeapply_list_jobs List tracked jobs ~312
Lists the user's tracked jobs, most recent activity first (submitted, else updated, else found): the jobs themselves (totals and rates: freeapply_get_stats). Use: to find a job_id, look up one job by job_id, or answer questions about particular jobs. Not for adding or changing jobs (freeapply_claim_job, freeapply_update_job). Removing a job is the user's, in the dashboard. Behavior: read-only. Filters combine: a job must match all given. limit and offset page through the same order (default 200 from 0); a page shorter than limit is the last. Parameters: job_id returns just that job (empty if unknown); status and outcome match exactly; search finds text in the title, company or location, ignoring case. Returns: [{id, title, company, location, work_mode, pay_text, pay_min, pay_max, url, apply_url, fit_score, status, status_note, outcome, outcome_at, source, found_at, updated_at, method, submitted_at, confirmation, resume_path, cover_path, reply_count}]; empty when nothing matched.
| Name | Type | Req | Description |
|---|---|---|---|
| job_id | integer | – | One job by its id. |
| limit | integer | – | Most jobs to return (default 200). |
| offset | integer | – | Jobs to skip (default 0). |
| outcome | string | – | Exact employer-outcome filter. |
| search | string | – | Text to find. |
| status | string | – | Exact status filter. |
No output schema declared.
No examples provided.
freeapply_manage_answers Get or save the user's answers ~309
Gets or saves the user's own answers to specific form questions, so you never guess one (general details: freeapply_get_settings). A new question for the user goes through freeapply_update_job status needs_info instead. Use: get before retrying a job the user re-queued from the Needs you tab; save when the user answers a question in this conversation, for later forms. Save only the user's own words: saved answers count as facts in freeapply_check_text. Behavior: get is read-only. save replaces the answer saved under the same question; an empty answer removes it. Returns: get {job_id, answers: [{label, answer}] the user gave for this job, saved_answers: {question: reusable answer}, cover_letter: the job's saved letter {path, text} (text: for a text-box letter field) or null}. save {label, saved, removed, saved_answers}. Errors: get without job_id or with an unknown one; save without label; an action other than get or save.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | get (read-only): a job's answers and saved letter; save (writes): one reusable answer the user just gave. |
| answer | string | – | For save: the user's own words; empty removes the saved answer. |
| job_id | integer | – | Required for get. |
| label | string | – | Required for save: the question as forms word it, e.g. "Are you willing to relocate?". |
No output schema declared.
No examples provided.
freeapply_manage_autorun Start or finish an auto-run ~589
Keeps FreeApply applying on its own from this session, with no scheduled task: start waits until something is due, finish ends a run (freeapply_get_status only shows the run state). Use: auto-run mode of freeapply-apply, which setup's last step enters: start with wait (takeover on the first call), finish after each run, then start again. Not in a session the user runs by hand. Behavior: start with wait holds the call up to 10 minutes while nothing is due (auto-run stopped by the user's Stop or a limit in Settings, the rest after a search found nothing new, the daily cap) and returns as soon as something is, within seconds of the user pressing Start. One session runs it at a time. A run checks in with each job-work tool call and freeapply_clear_to_submit (15 minutes without one counts as ended); freeapply_clear_to_submit with the run_id ends it at a hard stop. finish releases the run and starts the rest (autorun.every_hours), or none when the user asked for a restart with new settings; harmless on a run that already ended. Parameters: action start or finish. wait (start): hold as above; without it start answers at once. takeover (start with wait): only on the call right after the user asked for setup or to keep applying: it presses Start (clears a Stop, a reached limit and the rest) and makes this session the runner; the session it replaced gets replaced at its next start. run_id (finish): the run start returned. summary (finish): one line shown in the dashboard's run history. Returns: start {go: true, run_id, minutes (left before the time limit, null: none), max_applications, sites}; {go: false, replies_due: true}: do freeapply-replies, then start again; {go: false, needs_user: terms|setup}: ask the user (freeapply_open_dashboard), freeapply_get_status with wait, then start again; {go: false, wait_again: true}: start again; {go: false, replaced: true} or any other go false: end quietly. finish {finished, applied_this_run}, null for a run no longer active. Errors: f…
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | start a run (with wait: when one is due); finish it. |
| run_id | string | – | Required for finish. |
| summary | string | – | For finish: e.g. "applied 4, needs you 2" (up to 500 characters). |
| takeover | boolean | – | For start with wait: the call right after the user asked to start. |
| wait | boolean | – | For start in auto-run mode: hold until something is due. |
No output schema declared.
No examples provided.
freeapply_open_dashboard Open the dashboard in the browser ~197
Opens the local FreeApply dashboard in the user's browser, one tab (freeapply_get_status only reports its URL). Use: when the user must act there: accept the Terms, fill settings, answer questions waiting on them, review applications and replies. Not for reading data: other tools return it. Behavior: changes no data. Starts the dashboard if needed at http://127.0.0.1:7878 or the next free port; reachable only from this computer. Parameters: tab, the page to open: overview (default; shows the Terms until they're accepted), settings (setup fields), issues (Needs you: questions, sign-ups), applications or replies. Returns: {url, opened}. url null: it couldn't start (no free port); tell the user. opened false with a url: no browser launched; give the user the url.
| Name | Type | Req | Description |
|---|---|---|---|
| tab | string | – | The page to open (default overview). |
No output schema declared.
No examples provided.
freeapply_record_outcome Record what an employer did ~461
Records what an employer did with an application (your side, e.g. applied or skipped: freeapply_update_job). Use: for each employer email found in a reply check, between freeapply_check_replies start and finish, and when the user tells you about a call or corrects an outcome. Not for your own steps. Behavior: with an email (gmail_message_id): stores it; raises the job's outcome only if this email ranks higher than the current one (an interview outranks an acknowledgement); the same gmail_message_id again stores nothing new. Without an email: sets the outcome exactly, whatever its rank. The email fields fill the dashboard's Replies tab. Returns: with an email {recorded (false: recorded before), kind, job_id, outcome (the job's, afterwards)}, job_id and outcome null without job_id; without one {job_id, outcome}. Errors: an unknown job_id; no job_id and no email; an empty outcome with an email.
| Name | Type | Req | Description |
|---|---|---|---|
| company | string | – | Email: the employer that sent it. |
| gmail_message_id | string | – | The employer email's Gmail message id. |
| gmail_thread_id | string | – | Email: Gmail thread id. |
| job_id | integer | – | From the reply-check plan or freeapply_list_jobs. Required without an email; with one optional, but without it no outcome changes. |
| mail_action | string | – | Email: what you did with it in Gmail: starred, labeled:<name>, starred+labeled:<name> or none. |
| outcome | string | yes | What the employer did: acknowledged (automatic 'we received your application' email), replied (a person replied), assessment (test, assignment or screening questionnaire), interview (interview reques… |
| received_at | string | – | Email: when it arrived (ISO 8601). |
| sender | string | – | Email: sender address. |
| subject | string | – | Email: subject line. |
| summary | string | – | Email: what it says, one sentence of at most 20 words, no personal data beyond what is needed. |
No output schema declared.
No examples provided.
freeapply_report_site_problem Report a job site signed out or limited ~234
Marks a job site the user chose in Settings (e.g. LinkedIn, Indeed) unusable for now: it signed the user out or showed its own daily limit (an employer's own careers site: freeapply_find_site_account). Use: as soon as a chosen site shows a sign-in page or a daily limit; then keep applying on the ready sites or company career sites. Never type a password. Behavior: signed_out: unavailable until the user signs in again and confirms it in the dashboard; limit_reached: paused until midnight. Meanwhile freeapply_claim_job refuses new jobs from it. Reporting again changes nothing; only the user can mark a site ready. Returns: {site, status, sites} (each chosen site with ready). Errors: a site the user didn't choose.
| Name | Type | Req | Description |
|---|---|---|---|
| site | string | yes | Job site id, as freeapply_get_status lists it in sites. |
| status | string | yes | signed_out: a sign-in page, or the site says you're signed out. limit_reached: the site's own daily limit, e.g. "You reached today's Easy Apply limit". |
No output schema declared.
No examples provided.
freeapply_share_data Preview or send shared data ~252
Shows or sends the exact data the user chose to share with the FreeApply server (the sharing choices themselves: freeapply_get_settings). Use: preview when the user asks what is shared; sync only when the user asks to send now (it also runs on its own every 12 hours). Not for changing the choices: the user does that in the dashboard (Settings, Data sharing). Behavior: preview: read-only, sends nothing, safe any time. sync: sends over the internet only what the current choices allow; can't be undone from here (the user can delete shared data in the dashboard); refused moments after the last sync. Returns: preview: the exact requests that would be sent: analytics_request (anonymous usage and job-market data), the talent-pool request only if the user joined; secrets hidden. sync: {sent, result} or {sent: false, reason}: Terms not accepted, a sync moments ago, or the server unreachable (the automatic sync retries later). Errors: an action other than preview or sync.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | preview (read-only, the usual choice): show what would be sent; sync (only when the user asks): send it now. |
No output schema declared.
No examples provided.
freeapply_update_job Update a job's application status ~618
Sets a claimed job's status: your side of the application (employer's response: freeapply_record_outcome; adding a job: freeapply_claim_job). Use: after a submit (applied); giving up (skipped, failed); when the user must act: needs_info with the form's questions, needs_account with the sign-up page, blocked by a check you can't pass. Behavior: replaces the status. Enforced: applied needs a fresh freeapply_clear_to_submit clearance for this job; cover_text must pass the truthfulness check; an applied job only the user can change. needs_info questions go to the Needs you tab and re-queue the job once answered; if the user already answered them all, refused with the answers to use. A field marked for one status is refused with any other. Returns: {job_id, status} and when relevant: already_waiting; questions (each added, duplicate, grouped or already_answered, with its answer), questions_added; same_account (needs_account: jobs sharing one sign-up card); same_site (blocked: jobs blocked on the same site). Errors: an unknown job_id or a broken rule, saying what is missing.
| Name | Type | Req | Description |
|---|---|---|---|
| account_url | string | – | needs_account only: the site's sign-up page. Jobs with the same one share a card; one "I made the account" re-queues them all. Default: the application link, so jobs rarely share. |
| confirmation | string | – | applied only: the confirmation text or number the site showed. |
| cover_path | string | – | applied only: the letter file sent, if not the saved one. |
| cover_text | string | – | applied only: the letter sent, if not the saved one. |
| job_id | integer | yes | The job's id, as returned by freeapply_claim_job or freeapply_list_jobs. |
| letter_sent | boolean | – | applied only; required when a letter is saved for the job (freeapply_check_text save): true if attached or pasted, false if not (letter dropped from the record). |
| method | string | – | applied only: how it was submitted. |
| note | string | – | What happened, for the user: one plain sentence, no technical terms, e.g. "The site asked to prove you're a person." |
| questions | array | – | needs_info only, at least one: the form's unanswered questions, each with a plain prompt and the simplest kind of answer that fits. |
| resume_path | string | – | applied only: the résumé file sent, if not the documents copy (recorded by default). |
| status | string | yes | New status: found (qualified, not yet worked), ready (documents prepared, not yet submitted), applied (application submitted), skipped (filtered out (see status_note)), needs_info (a form asked somet… |
No output schema declared.
No examples provided.
freeapply_update_settings Save settings and résumé ~356
Changes the user's settings: facts and preferences the user states, the résumé's text and profile (setup), and the AI models scan. Reading: freeapply_get_settings; single form answers: freeapply_manage_answers. Use: when the user states a fact or preference, in setup's résumé step, in the AI models step. Never fill a field the user didn't give you. Behavior: overwrites the sent fields, no undo. Deep merge: only sent fields change, nested objects merge, lists are replaced whole. User-only sections (legal, sharing, automation, autorun, onboarding, integrity, model_choices) are skipped and listed in ignored. All or nothing: one wrong field saves nothing. Parameters: patch, nested by section with the names freeapply_get_settings returns, e.g. {"targets": {"min_pay": 60000}}. Writable: profile, targets, eligibility, cover_letter, custom_answers (one at a time: freeapply_manage_answers), gmail (not last_check or manual_logins); resume only text and profile {headline, skills, titles, education, certifications}, taken from the résumé text alone; models only the scan {app, current, can_delegate, available, efforts}, read from your own tools, which replaces the last one. Returns: {changed, ignored, setup_complete, missing}; after a scan also models (model and effort chosen per level). Errors: nothing writable, unknown section or field, wrong type, value outside its choices (e.g. cover_letter.length short|standard|long), résumé files (the user adds them in the dashboard), malformed scan; the message names every problem.
| Name | Type | Req | Description |
|---|---|---|---|
| patch | object | yes | Fields to change, nested by section. |
No output schema declared.
No examples provided.
How do I install the FreeApply MCP server?
FreeApply ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, 889aa016476ad61759a54c748defa9f8490bf16342a70070792d8872d8b823c3; the commands to do that are on this page. If it does not match, do not open it.
mcpb · freeapply-1.0.6.mcpb
Download bundleCheck the download matches the SHA-256 the MCP registry declares before you open it. If it does not match, do not open the file.
SHA-256
889aa016476ad61759a54c748defa9f8490bf16342a70070792d8872d8b823c3
macOS / Linux
echo "889aa016476ad61759a54c748defa9f8490bf16342a70070792d8872d8b823c3 freeapply-1.0.6.mcpb" | shasum -a 256 -c
Windows (PowerShell)
(Get-FileHash -Algorithm SHA256 .\freeapply-1.0.6.mcpb).Hash -eq "889aa016476ad61759a54c748defa9f8490bf16342a70070792d8872d8b823c3"
Run it in the folder you saved the bundle to, then open the file with an MCPB-capable host such as Claude Desktop.
What is the FreeApply MCP server?
FreeApply is an MCP server listed in the public MCP registry as io.github.FreeApply/freeapply. Free job-search agent: finds matching jobs, applies through your AI app, tracks it all locally. This page covers its MCPB bundle (https://github.com/FreeApply/freeapply/releases/download/v1.0.6/freeapply-1.0.6.mcpb).
Is the FreeApply MCP server safe to use?
FreeApply scores 44 out of 100 on VerifyMCP. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the FreeApply MCP server expose?
FreeApply exposes 18 tools: freeapply_get_status, freeapply_open_dashboard, freeapply_get_settings, freeapply_update_settings, freeapply_fetch_posting, and 13 more. Their descriptions and schemas cost roughly 6,688 tokens of context every time the server is loaded.
What licence is the FreeApply MCP server under?
FreeApply declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.
What did VerifyMCP test on the FreeApply MCP server?
VerifyMCP ran 13 checks on FreeApply, covering Install scripts, Source repository, Provenance, License and 9 more. 3 items could not be completed, a gap on our side rather than a finding about FreeApply: Malware scan, Known CVEs and Dependency health. Endpoint Security and Transport & Reachability do not apply to an MCPB bundle, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.