Search jobs on verified employer job boards. Every link is the employer's own posting.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Get the full description and application URL for a job returned by recommend_jobs or search_jobs.
Stable job id returned by search_jobs or recommend_jobs (jobId is accepted too)
Get the full description and application URL for a job returned by recommend_jobs or search_jobs.
| Argument | Type | Description |
|---|---|---|
| id* | string | Stable job id returned by search_jobs or recommend_jobs (jobId is accepted too) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Stable job id returned by search_jobs or recommend_jobs (jobId is accepted too)"
}
},
"additionalProperties": false
}Report how many live roles the index holds for each country and how recently they were posted. Use it to set expectations before asking a candidate for anything, or to judge whether preparation is worth running; use search_jobs instead to see the roles themselves. Reads the index already on hand and never crawls.
| Argument | Type | Description |
|---|---|---|
| countries* | array | Two-letter codes to report coverage for, such as IN or US |
{
"type": "object",
"required": [
"countries"
],
"properties": {
"countries": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z]{2}$"
},
"maxItems": 20,
"minItems": 1,
"description": "Two-letter codes to report coverage for, such as IN or US",
"uniqueItems": true
}
},
"additionalProperties": false
}Download and refresh the local job index so searches have data to read. The first call fetches the shared index of every verified source (thousands of employers); later calls crawl only missing or stale sources, at most 25 per call, returning a continuation token until nextAction reports ready. Call it when a search says setup is needed, not before every search, and not at all on the hosted server, where the index is already prepared and this returns ready at once. Uses the network and writes job data under the local Openings data directory; it never reads, writes or transmits a resume.
| Argument | Type | Description |
|---|---|---|
| countries* | array | Two-letter codes whose sources should be prepared, such as IN or US |
| continuation | string | Opaque token from the previous call's result. Pass it back to prepare the next batch of at most 25 sources; omit it to start |
{
"type": "object",
"required": [
"countries"
],
"properties": {
"countries": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z]{2}$"
},
"maxItems": 20,
"minItems": 1,
"description": "Two-letter codes whose sources should be prepared, such as IN or US",
"uniqueItems": true
},
"continuation": {
"type": "string",
"description": "Opaque token from the previous call's result. Pass it back to prepare the next batch of at most 25 sources; omit it to start"
}
},
"additionalProperties": false
}Search jobs immediately from role, country, location and optional stated experience. No resume required. Newest first; automatically widens 7, 14, 30 days then all dates until 5 matches. For another page reuse the same filters and returned window.daysUsed as maxAgeDays, with pagination.nextOffset. Resume-based ranking is optional via recommend_jobs.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many jobs to return in this page |
| query | string | Words to match in job title or company |
| offset | integer | Where the page starts. Use pagination.nextOffset from the previous result rather than counting by hand |
| remote | boolean | True for remote-only; false for non-remote-only |
| country | string | Two-letter country code for job eligibility, such as IN or DE |
| location | string | Case-insensitive location substring |
| maxAgeDays | integer | Omit to widen 7/14/30/all until 5 matches. Explicit positive values exclude undated roles; 0 includes all dates. |
| experienceYears | number |
| Years of experience to compare with the posting's stated min/max range; not a qualification or fit verdict. |
| includeUnknownExperience | boolean | With experienceYears, also keep roles without a stated range, clearly unknown rather than matched. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 50,
"maximum": 100,
"minimum": 1,
"description": "How many jobs to return in this page"
},
"query": {
"type": "string",
"description": "Words to match in job title or company"
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 1000000,
"minimum": 0,
"description": "Where the page starts. Use pagination.nextOffset from the previous result rather than counting by hand"
},
"remote": {
"type": "boolean",
"description": "True for remote-only; false for non-remote-only"
},
"country": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Two-letter country code for job eligibility, such as IN or DE"
},
"location": {
"type": "string",
"description": "Case-insensitive location substring"
},
"maxAgeDays": {
"type": "integer",
"maximum": 365,
"minimum": 0,
"description": "Omit to widen 7/14/30/all until 5 matches. Explicit positive values exclude undated roles; 0 includes all dates."
},
"experienceYears": {
"type": "number",
"maximum": 60,
"minimum": 0,
"description": "Years of experience to compare with the posting's stated min/max range; not a qualification or fit verdict."
},
"includeUnknownExperience": {
"type": "boolean",
"default": false,
"description": "With experienceYears, also keep roles without a stated range, clearly unknown rather than matched."
}
},
"additionalProperties": false
}