FoundRole — AI Job Search & Application Tracker MCP for Claude & ChatGPT
NPM · @FOUNDROLE/AI-JOB-SEARCH-MCP · 2 COMPONENTS · SCANNED SEP 28
AI job search MCP — fact-checked jobs, application tracker, alerts. ChatGPT, Claude, Cursor.
Available components
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 Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 38 of 109 dependencies flagged as unhealthy. View diagnostics → Partial
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 (ISC).Pass
- Actively maintained (last published 0 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability76
- 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 7894 tokens (~375/item across 21 items; 21 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 not yet verified: not enough scan history yet (needs a 30-day window).Unverified
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
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 21 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
Unverified: 1 category
A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.
How do I install the FoundRole — AI Job Search & Application Tracker MCP for… server?
FoundRole — AI Job Search & Application Tracker MCP for… runs locally as an npm package, launched with npx -y @foundrole/ai-job-search-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @foundrole/ai-job-search-mcp
claude mcp add foundrole-jobs-mcp-proxy -- npx -y @foundrole/ai-job-search-mcp
{
"mcpServers": {
"foundrole-jobs-mcp-proxy": {
"command": "npx",
"args": [
"-y",
"@foundrole/ai-job-search-mcp"
]
}
}
} {
"servers": {
"foundrole-jobs-mcp-proxy": {
"command": "npx",
"args": [
"-y",
"@foundrole/ai-job-search-mcp"
]
}
}
} codex mcp add foundrole-jobs-mcp-proxy -- npx -y @foundrole/ai-job-search-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"foundrole-jobs-mcp-proxy": {
"type": "local",
"command": [
"npx",
"-y",
"@foundrole/ai-job-search-mcp"
],
"enabled": true
}
}
} openclaw mcp add foundrole-jobs-mcp-proxy --command npx --arg -y --arg @foundrole/ai-job-search-mcp
mcp_servers:
foundrole-jobs-mcp-proxy:
command: "npx"
args: ["-y", "@foundrole/ai-job-search-mcp"] {
"McpServers": {
"foundrole-jobs-mcp-proxy": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"@foundrole/ai-job-search-mcp"
]
}
}
} assistant mcp add foundrole-jobs-mcp-proxy -t stdio -c npx -a -y @foundrole/ai-job-search-mcp
{
"mcpServers": {
"foundrole-jobs-mcp-proxy": {
"command": "npx",
"args": [
"-y",
"@foundrole/ai-job-search-mcp"
]
}
}
} 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.
- 28 Sept 26 +10
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 27 Sept 26 +22
- Known CVEs: pass → unverified ▼ security
- Injection markers: unverified → pass ▲ security
- First check of Judged manipulation: pass security
- Tool safety: Tool safety not yet verified: we do not have a sandbox capture of the tool definitions this version of the package serves yet. security
- Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet. security
- Tool safety: Tool safety not yet verified: our sandbox run could not list this package's tools (it declared tools, or its tool listing failed outright). security
- Stability: Stability not yet verified: one of the two schema captures we compare could not list the server's tools (the server declared tools, or its tool listing failed outright). Comparing them would report every tool as removed, or find nothing to compare at all. security
- Dependency health: 0.83 → unverified ▼ functional
- Schema quality: unverified → 100 ▲ functional
- Tool coverage: unverified → 100 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- First check of Schema quality: fail functional
- First check of Schema quality: excellent functional
- First check of Schema quality: fail functional
- First check of Destructive annotations: 100 functional
- First check of Tool coverage: 100 functional
- First check of Tool coverage: 100 functional
- Capabilities: Protocol version not yet verified: we do not have a sandbox capture of the MCP handshake this version of the package performs yet. functional
- Tool coverage: Tool coverage not yet verified: we do not have a sandbox capture of the tool definitions this version of the package serves yet. functional
- Schema quality: Schema quality not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet. functional
- Tool coverage: Tool coverage not yet verified: our sandbox run could not list this package's tools (it declared tools, or its tool listing failed outright). functional
- Schema quality: Schema quality not yet verified: our sandbox run could not list this package's tools (it declared tools, or its tool listing failed outright), so the captured schema is incomplete. functional
- Package version: 1.1.12 → 1.1.16 functional
- Package version: 1.1.12 → 1.1.15 functional
- Package version: 1.1.12 → 1.1.14 functional
- Package version: 1.1.12 → 1.1.13 functional
- 26 Sept 26 0
- Package version: 1.1.11 → 1.1.12 functional
- 25 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 2 Sept 26 0
- Tool safety: Tool safety not yet verified: this package installed, but its server did not start, so we have no tool text to scan. security
- Stability: Stability not yet verified: this package installed, but its server did not start, so we have no schema to compare. security
- Schema quality: Schema quality not yet verified: this package installed, but its server did not start, so we have no schema to assess. functional
- Capabilities: Protocol version not yet verified: this package installed, but its server did not start, so we never saw its MCP handshake. functional
- Tool coverage: Tool coverage not yet verified: this package installed, but its server did not start, so we have no tool definitions to assess. functional
- 1 Sept 26 0
- Tool safety: Tool safety not yet verified: we do not have a sandbox capture of the tool definitions this version of the package serves yet. security
- Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet. security
- Capabilities: Protocol version not yet verified: we do not have a sandbox capture of the MCP handshake this version of the package performs yet. functional
- Tool coverage: Tool coverage not yet verified: we do not have a sandbox capture of the tool definitions this version of the package serves yet. functional
- Schema quality: Schema quality not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet. functional
- Package version: 1.1.10 → 1.1.11 functional
- 26 Aug 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 18 Aug 26 0
- Package version: 1.1.9 → 1.1.10 functional
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 28 Sept 2026 · Analysed npm/@foundrole/ai-job-search-mcp@1.1.16
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 109 packages
| Packages resolved | 109 |
|---|---|
| Stale | 38 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
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 →
job_alert_list List job alerts ~188
Lists the authenticated user's job alerts across all subscription sources (regular, company page, MCP). **Input:** - `status`: Filter by status — one of pending, active, unsubscribed (optional, default: all statuses) - `limit`: Number of results to return (default 20, max 50) - `offset`: Number of results to skip (default 0) **Output:** Returns the user's job alerts with pagination info and a summary of the underlying job search (query, location, company where available). Each response includes a system_instruction describing how to present the results for the current client.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Number of results to return (default 20, max 50) |
| offset | integer | – | Number of results to skip (default 0) |
| status | string | – | Filter by status: pending, active, unsubscribed |
| Name | Type | Req | Description |
|---|---|---|---|
| frequencies | array | – | – |
| hasMore | boolean | – | – |
| jobAlerts | array | – | – |
| totalCount | integer | – | – |
No examples provided.
job_alert_subscribe Create a job alert ~335
Subscribes the authenticated user to job alerts for a specific saved job search. **Input:** - `job_search_id`: The job search identifier to subscribe to (required). Accepts either the job search UUID or the composite job ID returned by `jobs_search` / `jobs_details` (format: "seo_id--job_search_id"). - `frequency`: Alert frequency — one of daily, weekly, monthly (optional, defaults to "weekly") **Output:** Returns the created or updated job alert with id, status, and frequency. Idempotent: calling this tool for an already-subscribed search updates the existing alert without creating a duplicate. An existing active alert with the same query text, location, company and filters, and at least the same radius, is returned instead of a new one, with the requested frequency applied to it. **Delivery:** All of a user's alerts arrive together in one email digest, one section per alert. Each section applies every filter and the sort of its saved search, the same way `jobs_search` does; Pro-only filters apply while the user has Pro. A job appears in the digest once, even when it matches several alerts, and no email is sent when there are no new matches. The digest follows the most frequent alert, and arrives less often when the user has not used FoundRole for a while.
| Name | Type | Req | Description |
|---|---|---|---|
| frequency | string | – | Alert frequency: daily, weekly, monthly (defaults to "weekly") |
| job_search_id | string | yes | Job search UUID or composite job id ("seo_id--job_search_id") from jobs_search results |
| Name | Type | Req | Description |
|---|---|---|---|
| jobAlert | object | – | – |
No examples provided.
job_alert_unsubscribe Unsubscribe from a job alert ~140
Unsubscribes the authenticated user from job alerts for a specific job search. **Input:** - `job_search_id`: The job search identifier to unsubscribe from (required). Accepts either the job search UUID or the composite job ID returned by `jobs_search` / `jobs_details` (format: "seo_id--job_search_id"). **Output:** Confirms the alert has been unsubscribed. Idempotent: returns success even when the user was not subscribed or is already unsubscribed.
| Name | Type | Req | Description |
|---|---|---|---|
| job_search_id | string | yes | Job search UUID or composite job id ("seo_id--job_search_id") from jobs_search results |
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | – | – |
| success | boolean | yes | – |
No examples provided.
job_alert_unsubscribe_all Unsubscribe from all job alerts ~128
Unsubscribes the authenticated user from ALL of their job alerts at once, across every subscription source (regular, company page, MCP). **Input:** - `confirm`: Must be `true` to execute. The call is rejected when omitted or not true — this guards against an unintended bulk unsubscribe. **Output:** Confirms how many alerts were unsubscribed. Idempotent: returns success even when the user has no active alerts.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Set to true to confirm unsubscribing from every alert; the call is rejected otherwise |
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | – | – |
| success | boolean | yes | – |
No examples provided.
jobs_analyze_external Analyze a job from another site ~598
Analyzes one job found outside FoundRole using the authenticated user's FoundRole profile and the same signals used for FoundRole jobs: resume match, missing skills, H-1B sponsorship history, E-Verify, ghost-job risk, posted compensation, and market salary estimates. Use tracker_add_external only when the user asks to save without analysis. The input represents the direct posting URL and all job content already available in the conversation. The five text identity fields are required; every structured fact field is optional, with a fact the source does not state simply omitted (or null). The optional `client_extraction` object carries evidence-backed skills, technology, benefits, bonuses, seniority, industry, management, clearance, visa, and remote-scope labels when source excerpts for them exist. FoundRole validates the evidence, stores the client extraction separately, derives missing deterministic facts, and reports which values were provided, derived, accepted, rejected, or remain unknown. The output includes `comparisonRef`; retain it exactly for a later jobs_compare call. The analysis is a decision aid, not a guarantee about sponsorship, legitimacy, compensation, or hiring outcome.
| Name | Type | Req | Description |
|---|---|---|---|
| client_extraction | object|null | – | Evidence-backed facts extracted by the client model from the posting; non-null evidence is a short source excerpt rather than an inference. Fields absent from the source are omitted or null. |
| company_name | string | yes | Company name from the posting |
| description | string | yes | Complete posting text available in the conversation; a source summary is valid only when no fuller posting text is available |
| education_requirements | array|null | – | Education requirements: no_requirements, high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degree |
| employment_type | array|null | – | Employment types: full_time, part_time, contractor, temporary, intern, volunteer, per_diem, other |
| experience_months | integer|null | – | Minimum required experience in months, when stated |
| location_name | string | yes | Location text from the posting, including Remote when stated |
| posted_at | string|null | – | Posting date as ISO 8601, when the source states it |
| salary_currency | string|null | – | ISO 4217 salary currency code, when stated |
| salary_max_value | number|null | – | Salary range maximum, when stated |
| salary_min_value | number|null | – | Salary range minimum, when stated |
| salary_type | string|null | – | Salary period: year, month, week, day, hour |
| salary_value | number|null | – | Single salary amount, when the posting gives one figure instead of a range |
| title_name | string | yes | Job title from the posting |
| url | string | yes | Direct URL of the specific job posting; a company homepage is invalid |
| work_location_type | string|null | – | Work arrangement: on_site, remote, hybrid |
| Name | Type | Req | Description |
|---|---|---|---|
| clientExtraction | object|null | yes | – |
| derivedFields | array | yes | – |
| jobs | array | yes | – |
| mode | string | yes | – |
| providedFields | array | yes | – |
| statusOrder | array | yes | – |
| studioUrl | string|null | – | – |
| system_instruction | string|null | – | – |
| trackerWebUrl | string | yes | – |
| unknownFields | array | yes | – |
No examples provided.
jobs_compare Compare jobs ~152
Compares 2 to 4 jobs side by side using the same FoundRole analysis fields: resume match, missing skills, H-1B and E-Verify signals, ghost-job risk, posted pay, and market salary estimates. `comparison_refs` accepts exact FoundRole job IDs returned by jobs_search and exact external `comparisonRef` URLs returned by jobs_analyze_external. Analyze each outside job first; a bare URL that has not been analyzed cannot be compared because FoundRole does not have its posting facts. Preserve every reference exactly, keep the user's requested order, and do not send duplicates.
| Name | Type | Req | Description |
|---|---|---|---|
| comparison_refs | array | yes | Two to four exact FoundRole job IDs or external comparisonRef URLs |
| Name | Type | Req | Description |
|---|---|---|---|
| jobs | array | yes | – |
| mode | string | yes | – |
| statusOrder | array | yes | – |
| studioUrl | string|null | – | – |
| system_instruction | string|null | – | – |
| trackerWebUrl | string | yes | – |
No examples provided.
jobs_details Get job details ~219
Fetches full details for one job by the `id` returned from jobs_search — the deeper view behind a search result. **Input:** - `job_id`: The exact ID string from the `id` field of a `jobs_search` result. - `result_item_id`: The matching occurrence ID from that result's `resultItemId` field, when available. **Output:** Complete job details: description, skills, benefits, requirements, salary benchmark, resume match, H-1B and E-Verify signals, job-trust analysis, and application link. A posting that passed the fully-remote check carries `remoteCheck`: the posting lines that make the role remote and where the employee may work from, or an unknown scope when the posting does not say. Personalized and extended insight fields follow the authenticated user's current entitlements.
| Name | Type | Req | Description |
|---|---|---|---|
| job_id | string | yes | The unique identifier of the job from jobs_search results |
| result_item_id | string | – | The result occurrence ID returned with the selected job |
| Name | Type | Req | Description |
|---|---|---|---|
| job | object | – | – |
| statusOrder | array | – | – |
| studioUrl | string|null | – | – |
| trackedJob | object|null | – | – |
| trackerWebUrl | string | – | – |
No examples provided.
jobs_recommendations Recommend jobs for my profile ~1,026
Returns the authenticated user's personalized job recommendations built from their resume, skills, target roles, and preferred location. Results are ranked by fit, may include related roles, and carry the same salary, match, H-1B, and job-trust insight payload used by job search. The search filters and sort parameters apply to this personalized feed too. Advanced parameters return a matching preview and hidden count for free accounts; Pro accounts receive the complete filtered list. An explicit query for a different or unrecognized profession uses the same general job search as jobs_search, preserving the query and filters instead of substituting the profile's target roles. A processing status means the personalized feed is still being prepared; a later call returns the completed feed. Page numbers fetch additional recommendations from the same feed.
| Name | Type | Req | Description |
|---|---|---|---|
| benefits | array | – | Advanced filter: benefit names such as "health insurance", "401k" or "parental leave"; a job qualifies only when it states every listed benefit. Names that match no known benefit are ignored. |
| bonuses_only | boolean | – | Advanced filter: only jobs that state a bonus (sign-on, performance, referral, commission and the like). |
| companies | array | – | Filter: official company names; a job from any of them qualifies, across every job board each employer posts on. More than one company makes it an advanced filter. Next to company, a job has to match… |
| company | string | – | The official company name |
| confirmed_work_from | boolean | – | Advanced filter: with strict_remote, also leaves out postings that do not say where the work can be done from. |
| education | array | – | Filter: jobs whose posting requires one of these education levels (no_requirements, high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degree); bachelor_degree mea… |
| employment_types | array | – | Filter: jobs offered as any of these employment types (full_time, part_time, contractor, temporary, intern, volunteer, per_diem, other). |
| exclude_companies | array | – | Advanced filter: official company names whose jobs are removed from the results, across every job board each employer posts on. |
| experience_levels | array | – | Filter: jobs at any of these experience levels (entry_level, mid_level, senior_level, executive). The level comes from the years of experience the posting asks for and the seniority in its title, the… |
| h1b_sponsors_only | boolean | – | Advanced filter: only companies known to sponsor H1B visas. |
| hide_low_quality | boolean | – | Advanced filter: hides postings with a risky ghost grade (D/F); ungraded postings stay. |
| hiring_brand | string | – | Filter: one brand inside the company, for example company "Google" with hiring_brand "YouTube"; used only together with company. |
| location | string | – | Geographic location (e.g., 'Boston, MA') |
| min_match | string | – | Advanced filter: lowest personal FoundRole match grade to keep, the same letter each job shows in insights.match.grade. A and A- are rare even for a strong resume; B keeps good and strong matches; C+… |
| page | integer | – | Recommendation page number |
| posted_days_ago | integer | – | Number of days ago to search for jobs (1-365) |
| query | string | – | The full job title or skill (e.g., "Ruby Developer", NOT just "Ruby") |
| radius | integer | – | Search radius in miles around a city location (default 40); not used for state, country or remote searches. |
| remote | boolean | – | Advanced filter: only remote-eligible jobs, matched across the whole country of the requested location rather than its radius. |
| salary_floor | integer | – | Advanced filter: minimum annualized salary in USD; a posting qualifies when the lower bound of its pay band reaches the floor. Jobs without a USD salary are dropped. |
| sort | string | – | Result order (score, posted_at, match, salary): score is relevance and the default, posted_at is newest first, salary is highest pay first, match is best personal fit first and needs a resume. Orderi… |
| strict_remote | boolean | – | Advanced filter: only postings checked as fully remote that can be worked from the requested location: the posting names that area, allows anywhere, or does not say where. Stricter than remote; work_… |
| work_modes | array | – | Advanced filter: jobs in any of these work modes (on_site, remote, hybrid). remote is matched across the whole country of the location, the others within the radius. ["remote"] is the same search as… |
| Name | Type | Req | Description |
|---|---|---|---|
| continueUrl | string | – | – |
| feedKind | string | – | – |
| feedStatus | string | – | – |
| jobSearchId | string|null | – | – |
| jobs | array | – | – |
| nextPage | integer|null | – | – |
| preview | object|null | – | – |
| profileSetupState | string|null | – | – |
| profileSetupUrl | string|null | – | – |
| resultBatchId | string|null | – | – |
| resultSetId | string|null | – | – |
| revalidating | boolean | – | – |
| statusOrder | array | – | – |
| totalCount | integer | – | – |
| trackerWebUrl | string | – | – |
No examples provided.
jobs_search Search jobs ~1,486
Searches a database for real-time job listings matching the user's criteria. The query is the full job title or role: "Ruby Developer" or "Ruby on Rails Engineer" rather than a bare keyword like "Ruby", which is too broad and matches unrelated fields. Results may be filtered by location, company, and how recently a job was posted. Each result carries an `id` and `resultItemId`; jobs_details takes that `id` with the corresponding `result_item_id` and returns the job's full description, requirements, and benefits. The response also carries a `nextCursor` for the next page of results; a follow-up page is fetched by passing only that cursor, with no other search parameters. With a ready profile, a query for the profile's target profession or an omitted query uses the same personalized feed as jobs_recommendations and the website. A different or unrecognized profession uses general job search, preserving the explicit query and filters. An omitted location uses the profile location. Without a ready profile, search uses the general job listings. Job details include FoundRole salary benchmarks, H-1B sponsorship signals, E-Verify status, and job-trust analysis; list-level employer signals follow the user's current entitlements. Constraints in the user's request — remote-only work, H1B sponsorship, a minimum salary, hiding risky postings, a minimum match grade — are the search parameters remote, h1b_sponsors_only, salary_floor, hide_low_quality, and min_match; sort orders the results by relevance, newest, salary or personal match. The search enforces only constraints passed as parameters; a constraint left out of the call is not applied to the result set. Job type, work mode, required education, experience level, benefits, bonuses, employers to include or exclude, and the search radius are the parameters employment_types, work_modes, education, experience_levels, benefits, bonuses_only, companies, exclude_companies and radius. Remote and hybrid are independent work mode…
| Name | Type | Req | Description |
|---|---|---|---|
| benefits | array | – | Advanced filter: benefit names such as "health insurance", "401k" or "parental leave"; a job qualifies only when it states every listed benefit. Names that match no known benefit are ignored. |
| bonuses_only | boolean | – | Advanced filter: only jobs that state a bonus (sign-on, performance, referral, commission and the like). |
| companies | array | – | Filter: official company names; a job from any of them qualifies, across every job board each employer posts on. More than one company makes it an advanced filter. Next to company, a job has to match… |
| company | string | – | The official company name |
| confirmed_work_from | boolean | – | Advanced filter: with strict_remote, also leaves out postings that do not say where the work can be done from. |
| cursor | string | – | Pagination cursor. Treat as an opaque string. COPY EXACTLY. |
| education | array | – | Filter: jobs whose posting requires one of these education levels (no_requirements, high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degree); bachelor_degree mea… |
| employment_types | array | – | Filter: jobs offered as any of these employment types (full_time, part_time, contractor, temporary, intern, volunteer, per_diem, other). |
| exclude_companies | array | – | Advanced filter: official company names whose jobs are removed from the results, across every job board each employer posts on. |
| experience_levels | array | – | Filter: jobs at any of these experience levels (entry_level, mid_level, senior_level, executive). The level comes from the years of experience the posting asks for and the seniority in its title, the… |
| h1b_sponsors_only | boolean | – | Advanced filter: only companies known to sponsor H1B visas. |
| hide_low_quality | boolean | – | Advanced filter: hides postings with a risky ghost grade (D/F); ungraded postings stay. |
| hiring_brand | string | – | Filter: one brand inside the company, for example company "Google" with hiring_brand "YouTube"; used only together with company. |
| location | string | – | Geographic location (e.g., 'Boston, MA') |
| min_match | string | – | Advanced filter: lowest personal FoundRole match grade to keep, the same letter each job shows in insights.match.grade. A and A- are rare even for a strong resume; B keeps good and strong matches; C+… |
| posted_days_ago | integer | – | Number of days ago to search for jobs (1-365) |
| query | string | – | The full job title or skill (e.g., "Ruby Developer", NOT just "Ruby") |
| radius | integer | – | Search radius in miles around a city location (default 40); not used for state, country or remote searches. |
| remote | boolean | – | Advanced filter: only remote-eligible jobs, matched across the whole country of the requested location rather than its radius. |
| salary_floor | integer | – | Advanced filter: minimum annualized salary in USD; a posting qualifies when the lower bound of its pay band reaches the floor. Jobs without a USD salary are dropped. |
| sort | string | – | Result order (score, posted_at, match, salary): score is relevance and the default, posted_at is newest first, salary is highest pay first, match is best personal fit first and needs a resume. Orderi… |
| strict_remote | boolean | – | Advanced filter: only postings checked as fully remote that can be worked from the requested location: the posting names that area, allows anywhere, or does not say where. Stricter than remote; work_… |
| work_modes | array | – | Advanced filter: jobs in any of these work modes (on_site, remote, hybrid). remote is matched across the whole country of the location, the others within the radius. ["remote"] is the same search as… |
| Name | Type | Req | Description |
|---|---|---|---|
| continueUrl | string | – | – |
| feedKind | string | – | – |
| feedStatus | string|null | – | – |
| jobSearchId | string|null | – | – |
| jobs | array | – | – |
| lowRelevanceNotice | string|null | – | – |
| preview | object|null | – | – |
| profileSetupState | string|null | – | – |
| profileSetupUrl | string|null | – | – |
| resultBatchId | string|null | – | – |
| resultSetId | string|null | – | – |
| revalidating | boolean | – | – |
| statusOrder | array | – | – |
| system_instruction | string | – | – |
| trackerWebUrl | string | – | – |
No examples provided.
knowledge_search Search career guides ~390
Searches FoundRole's published content by semantic similarity and returns the most relevant sources for a job-search question: career-guidance blog articles plus FoundRole site pages that describe the product's features (job tracker, Pro plan and pricing, H1B salary data, AI job search) and industry/sector career landings. Each article carries a title, url, summary, a content excerpt, publication date, and tags; each page carries a title, url, description, and its FAQ entries — enough material to answer the question and link the source. Two optional facets add further result groups: company returns FoundRole's employer profile pages matching that company name; location returns the market landing page for that city, state, or country — an analytical page about that labour market, not a list of openings. The facets describe what the user is asking about — a company mentioned only in passing does not need the company facet. Returns empty groups when nothing is relevant rather than padding with off-topic content. Results are the closest matches to the given question, not an index of the site's full coverage; questions about overall topic coverage are answered by knowledge_topics, which lists the blog's categories and tags with article counts. It does not search job listings and reports no open-job counts — jobs_search covers live roles, including questions about openings for a particular job title. Each response includes a system_instruction describing how to present the sources.
| Name | Type | Req | Description |
|---|---|---|---|
| company | string | – | A company name, when the question is about that employer — returns FoundRole company profile pages |
| limit | integer | – | Maximum articles to return (default 5) |
| location | string | – | A city, state, or country, when the question is about that labour market — returns its market landing page |
| query | string | yes | The career, job-search, or FoundRole product question to answer |
| Name | Type | Req | Description |
|---|---|---|---|
| articles | array | – | – |
| companyPages | array | – | – |
| landingPages | array | – | – |
| pages | array | – | – |
| proUrl | string|null | – | – |
| profileSetupUrl | string|null | – | – |
| system_instruction | string | – | – |
| totalCount | integer | – | – |
No examples provided.
knowledge_topics List career guide topics ~92
Lists what FoundRole's published career-guidance blog covers: every category and the most-used tags, each with its published-article count and url, plus the total number of published articles. This is the factual source for questions about the blog's topics or overall coverage. It takes no parameters and reflects the live published corpus. It does not retrieve articles for a specific question; knowledge_search does that.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| categories | array | – | – |
| system_instruction | string | – | – |
| tags | array | – | – |
| totalArticles | integer | – | – |
No examples provided.
reminder_delete Delete a reminder ~110
Deletes a reminder from a tracked job. **Input:** - `tracked_job_id`: The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) **Output:** Returns the updated tracked job with reminderAt cleared.
| Name | Type | Req | Description |
|---|---|---|---|
| tracked_job_id | string | yes | The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) |
| Name | Type | Req | Description |
|---|---|---|---|
| hasMore | boolean | – | – |
| statusOrder | array | – | – |
| subStatusOrder | object | – | – |
| totalCount | integer | – | – |
| trackedJob | object | – | – |
| trackedJobs | array | – | – |
| trackerWebUrl | string | – | – |
No examples provided.
reminder_list List reminders ~81
Lists tracked jobs that have reminders set, ordered by reminder time (soonest first). **Input:** - `limit`: Number of results to return (default 20, max 50) **Output:** Returns a list of tracked jobs with active reminders.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Number of results to return (default 20, max 50) |
| Name | Type | Req | Description |
|---|---|---|---|
| hasMore | boolean | – | – |
| totalCount | integer | – | – |
| trackedJobs | array | – | – |
No examples provided.
reminder_set Set a follow-up reminder ~201
Sets a reminder for a tracked job. Sends a confirmation email with .ics calendar attachment. **Input:** - `tracked_job_id`: The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) - `remind_at`: Reminder date/time in ISO 8601 format, e.g. "2025-03-15T10:00:00Z" (required, must be in the future) **Output:** Returns the updated tracked job with reminderAt field.
| Name | Type | Req | Description |
|---|---|---|---|
| remind_at | string | yes | ISO 8601 datetime, e.g. "2025-03-15T10:00:00Z" (must be in the future) |
| tracked_job_id | string | yes | The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) |
| Name | Type | Req | Description |
|---|---|---|---|
| hasMore | boolean | – | – |
| statusOrder | array | – | – |
| subStatusOrder | object | – | – |
| totalCount | integer | – | – |
| trackedJob | object | – | – |
| trackedJobs | array | – | – |
| trackerWebUrl | string | – | – |
No examples provided.
resume_check Check how hiring software reads a resume ~257
Checks resume text for machine-readable sections, recognized skills, contact channels, a headline, and experience date ranges using FoundRole's deterministic parser. Pass resume_text to check plain text supplied in the conversation. If resume_text is omitted, the tool reads the previously extracted text of the primary resume in the authenticated user's FoundRole account. It returns a readability band (strong, good, partial), parsed facts, and findings. This is FoundRole's text-readability assessment, not a test against a named ATS, a hiring prediction, or a file-layout check. Pasted text does not preserve the original PDF or DOCX layout. The tool does not upload a file, create a saved resume or report, change the user's profile, submit an application, or fetch URLs found in the text. It may return a FoundRole website link; opening that link and uploading or editing a resume are separate user actions. Operational request records and diagnostics may retain tool inputs; this tool does not promise that submitted text is never stored.
| Name | Type | Req | Description |
|---|---|---|---|
| resume_text | string | – | Plain text of the resume to check, when it is available in the conversation. Omit to check the resume uploaded to the user's FoundRole account. Minimum 200 characters. |
| Name | Type | Req | Description |
|---|---|---|---|
| band | string|null | – | – |
| findings | array | – | – |
| mode | string | yes | – |
| parsedAs | object|null | – | – |
| studioReportUrl | string|null | – | – |
| system_instruction | string | – | – |
| uploadUrl | string|null | – | – |
No examples provided.
tracker_add Save a job to the tracker ~400
Tracks a job from jobs_search results in the user's job tracker, identified by its job_id. For a job found elsewhere on the open web (with a URL but no jobs_search job_id), tracker_add_external is the right tool instead. Fields: - `job_id`: the job ID from jobs_search results (required) - `status`: initial status (saved, applied, interviewing, offered, archived); defaults to "saved" - `sub_status`: sub-status within the main status: saved: interested, researching_company, preparing_application, ready_to_apply; applied: application_submitted, followed_up; interviewing: interview_scheduled, phone_screen, technical, onsite, final_round, pending_feedback; offered: negotiating, considering, offer_received, accepted; archived: ghosted, rejected_by_company, withdrawn_by_candidate, not_interested, employed_by_this_company, employed_by_another_company - `notes`: notes about the job Returns the tracked job with its details. Repeated saves return the existing tracked job. A job that was previously removed from the tracker is restored with its earlier status and notes.
| Name | Type | Req | Description |
|---|---|---|---|
| job_id | string | yes | The job ID from jobs.search results |
| notes | string | – | Notes about this job |
| result_item_id | string | – | The result occurrence ID returned with the selected job |
| status | string | – | Initial tracking status: saved, applied, interviewing, offered, archived |
| sub_status | string | – | Sub-status within the main status, valid only for that status — saved: interested, researching_company, preparing_application, ready_to_apply; applied: application_submitted, followed_up; interviewin… |
| Name | Type | Req | Description |
|---|---|---|---|
| hasMore | boolean | – | – |
| statusOrder | array | – | – |
| subStatusOrder | object | – | – |
| totalCount | integer | – | – |
| trackedJob | object | – | – |
| trackedJobs | array | – | – |
| trackerWebUrl | string | – | – |
No examples provided.
tracker_add_external Save a job from another site to the tracker ~1,120
Saves a job posting found anywhere on the open web into the user's tracker. For jobs that came from jobs_search results, tracker_add (which takes a job_id) is the right tool instead. A job seen elsewhere in the conversation needs no prior jobs_search call — its URL and details from the conversation are sufficient input. `url`, `company_name`, `title_name`, `location_name`, and `description` identify the posting and are the only required fields. Every structured fact field (salary, dates, employment type, education, experience) is optional: a fact the source does not state is simply omitted (or null), and FoundRole's own extractors derive missing salary, employment, work-arrangement, education, experience, skills, benefits, and bonuses from the description. A save never waits on facts the source did not provide. The optional `client_extraction` object carries evidence-backed skills, technology, benefits, bonuses, seniority, industry, management, clearance, visa, and remote-scope labels when source excerpts for them exist; FoundRole validates and stores those labels separately. Fields: - `url`: the job posting's direct URL (required; not a company homepage) - `company_name`: company name (required) - `title_name`: job title (required) - `location_name`: location, e.g. "New York, NY" (required) - `description`: the posting's description from the source result; a short summary is acceptable (required) - `salary_min_value` / `salary_max_value`: salary range bounds (numbers) - `salary_value`: a single salary figure when there is no range (number) - `posted_at`: ISO 8601 posting date - `salary_currency`: ISO 4217 currency code - `salary_type`: one of year, month, week, day, hour - `employment_type`: array of full_time, part_time, contractor, temporary, intern, volunteer, per_diem, other - `work_location_type`: one of on_site, remote, hybrid - `education_requirements`: array of no_requirements, high_school, associate_degree, bachelor_degree, professional_certificate, pos…
| Name | Type | Req | Description |
|---|---|---|---|
| client_extraction | object|null | – | Evidence-backed facts extracted by the client model from the posting; non-null evidence is a short source excerpt rather than an inference. Fields absent from the source are omitted or null. |
| company_name | string | yes | Company name from the posting |
| description | string | yes | Complete posting text available in the conversation; a source summary is valid only when no fuller posting text is available |
| education_requirements | array|null | – | Education requirements: no_requirements, high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degree |
| employment_type | array|null | – | Employment types: full_time, part_time, contractor, temporary, intern, volunteer, per_diem, other |
| experience_months | integer|null | – | Minimum required experience in months, when stated |
| location_name | string | yes | Location text from the posting, including Remote when stated |
| notes | string | – | Notes about this job |
| posted_at | string|null | – | Posting date as ISO 8601, when the source states it |
| salary_currency | string|null | – | ISO 4217 salary currency code, when stated |
| salary_max_value | number|null | – | Salary range maximum, when stated |
| salary_min_value | number|null | – | Salary range minimum, when stated |
| salary_type | string|null | – | Salary period: year, month, week, day, hour |
| salary_value | number|null | – | Single salary amount, when the posting gives one figure instead of a range |
| status | string | – | Initial tracking status: saved, applied, interviewing, offered, archived |
| sub_status | string | – | Sub-status within the main status, valid only for that status — saved: interested, researching_company, preparing_application, ready_to_apply; applied: application_submitted, followed_up; interviewin… |
| title_name | string | yes | Job title from the posting |
| url | string | yes | Direct URL of the specific job posting; a company homepage is invalid |
| work_location_type | string|null | – | Work arrangement: on_site, remote, hybrid |
| Name | Type | Req | Description |
|---|---|---|---|
| hasMore | boolean | – | – |
| statusOrder | array | – | – |
| subStatusOrder | object | – | – |
| totalCount | integer | – | – |
| trackedJob | object | – | – |
| trackedJobs | array | – | – |
| trackerWebUrl | string | – | – |
No examples provided.
tracker_list List tracked jobs ~164
Lists the user's tracked jobs with optional filtering and pagination. **Input:** - `status`: Filter by status (saved, applied, interviewing, offered, archived) - `limit`: Number of results per page (default 20, max 50) - `offset`: Number of results to skip (default 0) **Output:** Returns a list of tracked jobs grouped by status with pagination info. Each response includes a system_instruction describing how to present the results for the current client.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Number of results per page (default 20, max 50) |
| offset | integer | – | Number of results to skip (default 0) |
| status | string | – | Filter by status: saved, applied, interviewing, offered, archived |
| Name | Type | Req | Description |
|---|---|---|---|
| hasMore | boolean | – | – |
| statusOrder | array | – | – |
| subStatusOrder | object | – | – |
| totalCount | integer | – | – |
| trackedJob | object | – | – |
| trackedJobs | array | – | – |
| trackerWebUrl | string | – | – |
No examples provided.
tracker_remove Remove a job from the tracker ~110
Removes a job from the user's job tracker. **Input:** - `tracked_job_id`: The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) **Output:** Confirms the job was removed from tracking.
| Name | Type | Req | Description |
|---|---|---|---|
| tracked_job_id | string | yes | The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) |
| Name | Type | Req | Description |
|---|---|---|---|
| hasMore | boolean | – | – |
| statusOrder | array | – | – |
| subStatusOrder | object | – | – |
| totalCount | integer | – | – |
| trackedJob | object | – | – |
| trackedJobs | array | – | – |
| trackerWebUrl | string | – | – |
No examples provided.
tracker_update Update a tracked job ~350
Updates details of a tracked job (notes, deadline, salary, tags). **Input:** - `tracked_job_id`: The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) - `notes`: Updated notes - `deadline`: Deadline date (ISO 8601 format) - `salary_offered`: Salary amount - `salary_offered_type`: Salary type: year, month, week, day, hour - `tags`: Comma-separated tags (e.g., "remote,startup,tech") - `reminder_at`: Reminder date/time in ISO 8601 format, e.g. "2025-03-15T10:00:00Z" (must be in the future, or empty to clear) **Output:** Returns the updated tracked job.
| Name | Type | Req | Description |
|---|---|---|---|
| deadline | string | – | Deadline date in ISO 8601 format |
| notes | string | – | Notes about this job |
| reminder_at | string | – | ISO 8601 datetime, e.g. "2025-03-15T10:00:00Z" (must be in the future, or empty to clear) |
| salary_offered | number | – | Salary amount |
| salary_offered_type | string | – | Salary type: year, month, week, day, hour |
| tags | string | – | Comma-separated tags (e.g., "remote,startup,tech") |
| tracked_job_id | string | yes | The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) |
| Name | Type | Req | Description |
|---|---|---|---|
| hasMore | boolean | – | – |
| statusOrder | array | – | – |
| subStatusOrder | object | – | – |
| totalCount | integer | – | – |
| trackedJob | object | – | – |
| trackedJobs | array | – | – |
| trackerWebUrl | string | – | – |
No examples provided.
tracker_update_status Move a tracked job to another stage ~347
Updates the status of a tracked job. **Input:** - `tracked_job_id`: The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) - `status`: New status: saved, applied, interviewing, offered, archived (required) - `sub_status`: Sub-status within the main status, valid only for that status (optional): saved: interested, researching_company, preparing_application, ready_to_apply; applied: application_submitted, followed_up; interviewing: interview_scheduled, phone_screen, technical, onsite, final_round, pending_feedback; offered: negotiating, considering, offer_received, accepted; archived: ghosted, rejected_by_company, withdrawn_by_candidate, not_interested, employed_by_this_company, employed_by_another_company **Output:** Returns the updated tracked job.
| Name | Type | Req | Description |
|---|---|---|---|
| status | string | yes | New status: saved, applied, interviewing, offered, archived |
| sub_status | string | – | Sub-status within the main status, valid only for that status — saved: interested, researching_company, preparing_application, ready_to_apply; applied: application_submitted, followed_up; interviewin… |
| tracked_job_id | string | yes | The tracked job ID — `trackedJobs[].id` from tracker_list output, distinct from `trackable.id` and `job.id` (required) |
| Name | Type | Req | Description |
|---|---|---|---|
| hasMore | boolean | – | – |
| statusOrder | array | – | – |
| subStatusOrder | object | – | – |
| totalCount | integer | – | – |
| trackedJob | object | – | – |
| trackedJobs | array | – | – |
| trackerWebUrl | string | – | – |
No examples provided.
What is the FoundRole — AI Job Search & Application Tracker MCP for… server?
FoundRole — AI Job Search & Application Tracker MCP for… is listed in the public MCP registry as io.github.foundrole/jobs-mcp-proxy. AI job search MCP, fact-checked jobs, application tracker, alerts. ChatGPT, Claude, Cursor. This page covers its npm package (@foundrole/ai-job-search-mcp).
Is the FoundRole — AI Job Search & Application Tracker MCP for… server safe to use?
FoundRole — AI Job Search & Application Tracker MCP for… scores 70 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 28 September 2026. 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 FoundRole — AI Job Search & Application Tracker MCP for… server expose?
FoundRole — AI Job Search & Application Tracker MCP for… exposes 21 tools: job_alert_unsubscribe, job_alert_subscribe, job_alert_list, job_alert_unsubscribe_all, jobs_analyze_external, and 16 more. Their descriptions and schemas cost roughly 7,894 tokens of context every time the server is loaded.
Is the FoundRole — AI Job Search & Application Tracker MCP for… server still maintained?
FoundRole — AI Job Search & Application Tracker MCP for… is still listed as active in the MCP registry. We last reached this channel on 28 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the FoundRole — AI Job Search & Application Tracker MCP for… server under?
FoundRole — AI Job Search & Application Tracker MCP for… declares the ISC licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.