Search 13,000+ remote/hybrid jobs in Germany/EU, open a posting, get market stats. Free, no auth.
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.
Fetch ONE nomado24 job posting by id, with the complete v2 payload: the posting body where the source permits redistribution, per-field provenance (dataOrigin: who asserted each field, by which method, when), salaryOrigin, firstSeenAt, lastVerifiedAt with its verification method, and updatedAt (the last genuine content change). Returns an error result for an id that is not a live posting; expired and withdrawn postings are not served. Read-only, free, attribution required (see structuredContent.attribution).
Job id as returned by search_jobs ('job_<slug>'). A bare slug is also accepted
Fetch ONE nomado24 job posting by id, with the complete v2 payload: the posting body where the source permits redistribution, per-field provenance (dataOrigin: who asserted each field, by which method, when), salaryOrigin, firstSeenAt, lastVerifiedAt with its verification method, and updatedAt (the last genuine content change). Returns an error result for an id that is not a live posting; expired and withdrawn postings are not served. Read-only, free, attribution required (see structuredContent.attribution).
| Argument | Type | Description |
|---|---|---|
| id* | string | Job id as returned by search_jobs ('job_<slug>'). A bare slug is also accepted |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Job id as returned by search_jobs ('job_<slug>'). A bare slug is also accepted"
}
}
}Get aggregate statistics (active jobs, new-this-week/month, top sources, salary ranges) for nomado24's remote-jobs board. No input required.
No arguments.
{
"type": "object",
"properties": {}
}Search nomado24's remote/hybrid job board. Read-only, free, attribution required (see structuredContent.attribution). Answers over one of two contracts, chosen by the arguments you send. Send only q/language/page/per_page and you get the legacy v1 result shape with page-based paging. Send any structured filter (country, applicant_region, work_arrangement, employment_type, seniority, skills, salary_min/max, published_after, verified_after, source, company, sort, include_total) or a cursor and you get the v2 contract: richer job objects, per-posting provenance (salaryOrigin, firstSeenAt, lastVerifiedAt, verification.method, updatedAt), a corpus changeWatermark, a snapshotId and keyset paging via pagination.nextCursor. The two are mutually exclusive: page plus a structured filter is refused rather than silently resolved. Structured results omit the posting body and the per-field dataOrigin to stay cheap to read; call get_job for those. A filter nomado24 cannot answer honestly is refused with the reason, never answered with the unfiltered corpus. Structured pagination.total is currently null (totalRelation 'not_computed') for every query, because a current-text on-site-only serving gate cannot be counted accurately by the database. A null total is deliberate, not an error.
| Argument | Type | Description |
|---|---|---|
| q | string | Free-text search over job title/company/tags |
| page | integer | 1-based page number, default 1 |
| sort | string | One of published_desc, verified_desc, salary_asc, salary_desc. Default published_desc |
| cursor | string | Continuation cursor from pagination.nextCursor. Send it ALONE (with per_page at most), never alongside filters: the cursor already carries the filter set it traverses |
| skills | array | Skill slugs, lowercase kebab-case (react, node-js) |
| source | array | Feed/source ids, lowercase kebab-case |
| company | array | Company name, exact match, case-insensitive. Aggregated postings carry no verified employer identity |
| country | array | Where the ROLE sits, ISO 3166-1 alpha-2 uppercase (DE, US) |
| language | string | Filter by job content language |
| per_page | integer | Results per page, 1-25, default 20 |
| seniority | array | Seniority. 'unknown' means the field is absent in the response, not a stored value |
| salary_max | number | Upper bound in normalized ANNUAL EUR (gross) |
| salary_min | number | Lower bound in normalized ANNUAL EUR (gross). Matches jobs whose salary interval overlaps it |
| skills_match | string | How to combine skills. Requires skills |
| include_total | string | Requested total mode (none, estimated, exact). Totals are currently withheld for every structured search: a current-text on-site-only serving gate is not visible to the database count, even without a named filter. The response reports total: null and totalRelation: 'not_computed' for all three modes. |
| verified_after | string | RFC 3339 date-time. Compares against the SAME value the response reports as lastVerifiedAt |
| employment_type | array | Employment type. 'unknown' means the field is absent in the response, not a stored value |
| published_after | string | RFC 3339 date-time, e.g. 2026-08-01T00:00:00Z |
| salary_currency | string | ISO 4217. Only EUR: every salary is normalized to EUR at ingest and no conversion is performed |
| applicant_region | array | Where a CANDIDATE may be: WORLDWIDE, EU or an ISO 3166-1 alpha-2 code. EEA/DACH/EMEA are refused, nomado24 does not classify them |
| work_arrangement | array | Work arrangement. The board serves remote and hybrid postings only, so these are the only two values |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Free-text search over job title/company/tags"
},
"page": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "1-based page number, default 1"
},
"sort": {
"type": "string",
"maxLength": 32,
"description": "One of published_desc, verified_desc, salary_asc, salary_desc. Default published_desc"
},
"cursor": {
"type": "string",
"maxLength": 4096,
"description": "Continuation cursor from pagination.nextCursor. Send it ALONE (with per_page at most), never alongside filters: the cursor already carries the filter set it traverses"
},
"skills": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxItems": 20,
"description": "Skill slugs, lowercase kebab-case (react, node-js)"
},
"source": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxItems": 20,
"description": "Feed/source ids, lowercase kebab-case"
},
"company": {
"type": "array",
"items": {
"type": "string",
"maxLength": 128
},
"maxItems": 10,
"description": "Company name, exact match, case-insensitive. Aggregated postings carry no verified employer identity"
},
"country": {
"type": "array",
"items": {
"type": "string",
"maxLength": 8
},
"maxItems": 20,
"description": "Where the ROLE sits, ISO 3166-1 alpha-2 uppercase (DE, US)"
},
"language": {
"enum": [
"de",
"en",
"fr"
],
"type": "string",
"description": "Filter by job content language"
},
"per_page": {
"type": "integer",
"maximum": 25,
"minimum": 1,
"description": "Results per page, 1-25, default 20"
},
"seniority": {
"type": "array",
"items": {
"enum": [
"student",
"entry",
"junior",
"mid",
"senior",
"lead",
"manager",
"director",
"executive",
"unknown"
],
"type": "string"
},
"maxItems": 10,
"description": "Seniority. 'unknown' means the field is absent in the response, not a stored value"
},
"salary_max": {
"type": "number",
"minimum": 0,
"description": "Upper bound in normalized ANNUAL EUR (gross)"
},
"salary_min": {
"type": "number",
"minimum": 0,
"description": "Lower bound in normalized ANNUAL EUR (gross). Matches jobs whose salary interval overlaps it"
},
"skills_match": {
"enum": [
"any",
"all"
],
"type": "string",
"description": "How to combine skills. Requires skills"
},
"include_total": {
"enum": [
"none",
"estimated",
"exact"
],
"type": "string",
"description": "Requested total mode (none, estimated, exact). Totals are currently withheld for every structured search: a current-text on-site-only serving gate is not visible to the database count, even without a named filter. The response reports total: null and totalRelation: 'not_computed' for all three modes."
},
"verified_after": {
"type": "string",
"maxLength": 64,
"description": "RFC 3339 date-time. Compares against the SAME value the response reports as lastVerifiedAt"
},
"employment_type": {
"type": "array",
"items": {
"enum": [
"full_time",
"part_time",
"contract",
"freelance",
"temporary",
"internship",
"working_student",
"apprenticeship",
"minijob",
"volunteer",
"other",
"unknown"
],
"type": "string"
},
"maxItems": 12,
"description": "Employment type. 'unknown' means the field is absent in the response, not a stored value"
},
"published_after": {
"type": "string",
"maxLength": 64,
"description": "RFC 3339 date-time, e.g. 2026-08-01T00:00:00Z"
},
"salary_currency": {
"type": "string",
"maxLength": 8,
"description": "ISO 4217. Only EUR: every salary is normalized to EUR at ingest and no conversion is performed"
},
"applicant_region": {
"type": "array",
"items": {
"type": "string",
"maxLength": 16
},
"maxItems": 20,
"description": "Where a CANDIDATE may be: WORLDWIDE, EU or an ISO 3166-1 alpha-2 code. EEA/DACH/EMEA are refused, nomado24 does not classify them"
},
"work_arrangement": {
"type": "array",
"items": {
"enum": [
"remote",
"hybrid"
],
"type": "string"
},
"maxItems": 2,
"description": "Work arrangement. The board serves remote and hybrid postings only, so these are the only two values"
}
}
}