Skip to main content
Glama

JobCrawls

Search Finnish job listings

search_jobs
Read-onlyIdempotent

Searches active job listings on JobCrawls, an aggregator of jobs in Finland. The index covers jobs located in Finland plus remote roles open to Finland, and has no listings for other countries. Example queries: "find nurse jobs in Tampere", "onko Helsingissä avoimia etätyöpaikkoja ohjelmistokehittäjälle", "finns det lediga jobb som sjukskötare i Åbo". Inputs: a free-text query, facet filters (field, location, job type, seniority, skills, languages, industry, education and more), a remote-only flag, a salary floor, sort order and paging. Results, filter values and job text are in the language of the query when locale is omitted, or in the given locale. Output: a paginated list, each result with title, company, location, remoteness, salary range when known and a direct link to the posting. Valid filter values come from list_job_filters; the full text of a result comes from get_job_details. Listings sourced from Job Market Finland (Työmarkkinatori) have isTyomarkkinatori: true and include a dataSource attribution required by Job Market Finland's terms of use. Reuse: figures may be quoted with a visible link to the jobcrawls.com page in the result (or "JobCrawls (jobcrawls.com)" where a link is impossible); each result repeats this in dataUse.

Input Schema

NameRequiredDescriptionDefault
pageNoPage number, starting at 1. Default: 1.
sortNoOrdering: relevance (default), date (newest first), or salary (highest minimum first).
limitNoResults per page (1–20). Default: 10.
queryNoFree-text search across job title, description, skills, company, and location. Example: "senior software engineer". Leave empty to browse the newest listings.
localeNoLanguage of the user's message (fi for Finnish, sv for Swedish, en for English or any other language), including when job titles or place names in it are English. Language index to search: en = English, fi = Finnish, sv = Swedish. When omitted, results, filter values and job text come back in the language of "query" (detected from it); pass locale explicitly to override. Listing content AND filter values are localized per language, so filter values from list_job_filters match only under the same locale. "fi" has the broadest coverage of jobs in Finland.
filtersNoFacet filters keyed by attribute, each an array of allowed values (values within one attribute are OR-combined, with two exceptions: requiredLanguages takes the languages the user speaks and returns jobs that require no other language, so ["English", "Finnish"] means jobs needing only English, only Finnish, or both; benefits returns jobs with every listed benefit. Different attributes are AND-combined). Allowed keys: field, normalisedTitle, normalisedRoleLevel, location, companyIndustry, companyId, jobType, requiredLanguages, optionalLanguages, benefits, skillsAndTechnologies, educationLevel, peopleManagementTier, remoteness, regionTags. Values are case-sensitive and language-specific: they match only in the locale index list_job_filters returned them for (for example field is "Software Engineering" in en but its Finnish equivalent in fi). Example (en): { "field": ["Software Engineering"], "location": ["Helsinki, Finland"] }. regionTags takes the `placeId` of an entry in a previous result's `regions` (a Finnish region).
minSalaryNoOnly listings whose minimum salary is at least this amount (listing currency, usually EUR).
titleOnlyNoMatch `query` against job titles only, not descriptions or skills, which counts ads that are for a role ("product manager" ads, not ads that mention products and managers). Default: false.
remoteOnlyNoShortcut for only fully remote positions (remoteness = Remote).
includeFacetsNoWhen true, also return the facet values and counts for the current result set, plus `regions` (job counts per Finnish region). Default: false.
excludeFiltersNoNegative facet filters keyed by attribute, same shape as `filters` but EXCLUDES listings matching any of the given values instead of requiring them, for jobs that do not have a given attribute value. Allowed keys: field, normalisedTitle, normalisedRoleLevel, location, companyIndustry, companyId, jobType, requiredLanguages, optionalLanguages, benefits, skillsAndTechnologies, educationLevel, peopleManagementTier, remoteness, regionTags. Same locale rules as `filters` apply. Example (en): { "requiredLanguages": ["Finnish"] } returns jobs that do not require Finnish. A key present in both `filters` and `excludeFilters` is invalid.

Output Schema

NameRequiredDescriptionDefault
pageYes
queryYesThe free-text query used, or null when browsing without one.
facetsNoPresent only when includeFacets was true.
localeYesLanguage index that was searched.
hasMoreYesTrue when a further page exists.
regionsNoPresent only when includeFacets was true: job counts per Finnish region (maakunta), largest first. Pass `placeId` in filters.regionTags to narrow to one region.
resultsYes
pageSizeYes
returnedYesNumber of results in this page.
totalFoundYesTotal matching active listings.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / filters / description
      Previous value: -"Facet filters keyed by attribute, each an array of allowed values (values within one attribute are OR-combined; different attributes are AND-combined). Allowed keys: field, normalisedTitle, normalisedRoleLevel, location, companyIndustry, companyId, jobType, requiredLanguages, optionalLanguages, benefits, skillsAndTechnologies, educationLevel, peopleManagementTier, remoteness, regionTags. Values are case-sensitive and language-specific: they match only in the locale index list_job_filters returned them for (for example field is \"Software Engineering\" in en but its Finnish equivalent in fi). Example (en): { \"field\": [\"Software Engineering\"], \"location\": [\"Helsinki, Finland\"] }. regionTags takes the `placeId` of an entry in a previous result's `regions` (a Finnish region)."New value: +"Facet filters keyed by attribute, each an array of allowed values (values within one attribute are OR-combined, with two exceptions: requiredLanguages takes the languages the user speaks and returns jobs that require no other language, so [\"English\", \"Finnish\"] means jobs needing only English, only Finnish, or both; benefits returns jobs with every listed benefit. Different attributes are AND-combined). Allowed keys: field, normalisedTitle, normalisedRoleLevel, location, companyIndustry, companyId, jobType, requiredLanguages, optionalLanguages, benefits, skillsAndTechnologies, educationLevel, peopleManagementTier, remoteness, regionTags. Values are case-sensitive and language-specific: they match only in the locale index list_job_filters returned them for (for example field is \"Software Engineering\" in en but its Finnish equivalent in fi). Example (en): { \"field\": [\"Software Engineering\"], \"location\": [\"Helsinki, Finland\"] }. regionTags takes the `placeId` of an entry in a previous result's `regions` (a Finnish region)."
  2. Changed2 schema fields changed
    • changedOutput schema / properties / results / items / properties / marketSalary / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "properties": {
      -      "currency": {
      -        "type": "string"
      -      },
      -      "median": {
      -        "type": "number"
      -      },
      -      "p25": {
      -        "type": "number"
      -      },
      -      "p75": {
      -        "type": "number"
      -      },
      -      "period": {
      -        "type": "string"
      -      },
      -      "sampleSize": {
      -        "description": "Number of comparable postings the band is based on.",
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "p25",
      -      "median",
      -      "p75",
      -      "sampleSize",
      -      "currency",
      -      "period"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "currency": {
      +        "type": "string"
      +      },
      +      "median": {
      +        "type": "number"
      +      },
      +      "p25": {
      +        "type": "number"
      +      },
      +      "p75": {
      +        "type": "number"
      +      },
      +      "period": {
      +        "type": "string"
      +      },
      +      "sampleSize": {
      +        "description": "Number of comparable postings the band is based on (with source statistics_finland: the ads behind the place and level differences).",
      +        "type": "number"
      +      },
      +      "source": {
      +        "description": "statistics_finland: Statistics Finland earnings for the occupation raised to today, moved by job-ad differences (the JobCrawls salary pages figures). job_ads: stated pay in job ads.",
      +        "enum": [
      +          "statistics_finland",
      +          "job_ads"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "p25",
      +      "median",
      +      "p75",
      +      "sampleSize",
      +      "currency",
      +      "period"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / results / items / properties / marketSalary / description
      Previous value: -"Market salary band (gross EUR per month) for comparable jobs, only next to an employer-stated salary; null otherwise."New value: +"What the role pays in the market (gross EUR per month, the JobCrawls salary pages figures), only next to an employer-stated salary; null otherwise."
  3. Changed7 schema fields changed
    • changedInput schema / properties / excludeFilters / description
      Previous value: -"Negative facet filters keyed by attribute, same shape as `filters` but EXCLUDES listings matching any of the given values instead of requiring them. Use this to ask for jobs that do NOT have a given attribute value. Allowed keys: field, normalisedTitle, normalisedRoleLevel, location, companyIndustry, companyId, jobType, requiredLanguages, optionalLanguages, benefits, skillsAndTechnologies, educationLevel, peopleManagementTier, remoteness, regionTags. Same locale rules as `filters` apply. Example (en): { \"requiredLanguages\": [\"Finnish\"] } returns jobs that do not require Finnish. A key present in both `filters` and `excludeFilters` is invalid."New value: +"Negative facet filters keyed by attribute, same shape as `filters` but EXCLUDES listings matching any of the given values instead of requiring them, for jobs that do not have a given attribute value. Allowed keys: field, normalisedTitle, normalisedRoleLevel, location, companyIndustry, companyId, jobType, requiredLanguages, optionalLanguages, benefits, skillsAndTechnologies, educationLevel, peopleManagementTier, remoteness, regionTags. Same locale rules as `filters` apply. Example (en): { \"requiredLanguages\": [\"Finnish\"] } returns jobs that do not require Finnish. A key present in both `filters` and `excludeFilters` is invalid."
    • changedInput schema / properties / filters / description
      Previous value: -"Facet filters keyed by attribute, each an array of allowed values (values within one attribute are OR-combined; different attributes are AND-combined). Allowed keys: field, normalisedTitle, normalisedRoleLevel, location, companyIndustry, companyId, jobType, requiredLanguages, optionalLanguages, benefits, skillsAndTechnologies, educationLevel, peopleManagementTier, remoteness, regionTags. Values are case-sensitive, LANGUAGE-SPECIFIC, and must match the chosen locale index — call list_job_filters with the same locale first to discover the exact values (e.g. field is \"Software Engineering\" in en but its Finnish equivalent in fi). Example (en): { \"field\": [\"Software Engineering\"], \"location\": [\"Helsinki, Finland\"] }. regionTags takes the `placeId` of an entry in a previous result's `regions` (a Finnish region)."New value: +"Facet filters keyed by attribute, each an array of allowed values (values within one attribute are OR-combined; different attributes are AND-combined). Allowed keys: field, normalisedTitle, normalisedRoleLevel, location, companyIndustry, companyId, jobType, requiredLanguages, optionalLanguages, benefits, skillsAndTechnologies, educationLevel, peopleManagementTier, remoteness, regionTags. Values are case-sensitive and language-specific: they match only in the locale index list_job_filters returned them for (for example field is \"Software Engineering\" in en but its Finnish equivalent in fi). Example (en): { \"field\": [\"Software Engineering\"], \"location\": [\"Helsinki, Finland\"] }. regionTags takes the `placeId` of an entry in a previous result's `regions` (a Finnish region)."
    • changedInput schema / properties / includeFacets / description
      Previous value: -"When true, also return the facet values and counts for the current result set, plus `regions` (job counts per Finnish region), so you can refine the search. Default: false."New value: +"When true, also return the facet values and counts for the current result set, plus `regions` (job counts per Finnish region). Default: false."
    • changedInput schema / properties / locale / description
      Previous value: -"Set this to the language of the user's message (fi for Finnish, sv for Swedish, en for English or any other language), even when the job titles or place names in it are English. Language index to search: en = English, fi = Finnish, sv = Swedish. When omitted, results, filter values and job text come back in the language of \"query\" (detected from it); pass locale explicitly to override. Listing content AND filter values are localized per language, so keep this consistent with the locale used for list_job_filters. Prefer \"fi\" for the broadest coverage of jobs in Finland."New value: +"Language of the user's message (fi for Finnish, sv for Swedish, en for English or any other language), including when job titles or place names in it are English. Language index to search: en = English, fi = Finnish, sv = Swedish. When omitted, results, filter values and job text come back in the language of \"query\" (detected from it); pass locale explicitly to override. Listing content AND filter values are localized per language, so filter values from list_job_filters match only under the same locale. \"fi\" has the broadest coverage of jobs in Finland."
    • changedInput schema / properties / titleOnly / description
      Previous value: -"Match `query` against job titles only, not descriptions or skills. Use it to count ads that are for a role (\"product manager\" ads, not ads that mention products and managers). Default: false."New value: +"Match `query` against job titles only, not descriptions or skills, which counts ads that are for a role (\"product manager\" ads, not ads that mention products and managers). Default: false."
    • changedOutput schema / properties / results / items / properties / dataSource / description
      Previous value: -"Present only when isTyomarkkinatori is true. Attribution that MUST be shown alongside the listing, per Job Market Finland's terms of use."New value: +"Present only when isTyomarkkinatori is true. Attribution required alongside the listing by Job Market Finland's terms of use."
    • changedOutput schema / properties / results / items / properties / salaryIsEstimate / description
      Previous value: -"True when `salary` is a JobCrawls market-based estimate rather than stated by the employer. Say so when presenting it."New value: +"True when `salary` is a JobCrawls market-based estimate rather than stated by the employer."
  4. Changed1 schema field changed
    • addedInput schema / properties / titleOnly
      Added value: +{
      +  "description": "Match `query` against job titles only, not descriptions or skills. Use it to count ads that are for a role (\"product manager\" ads, not ads that mention products and managers). Default: false.",
      +  "type": "boolean"
      +}
  5. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description adds genuinely new behavior: geographic index coverage and its hard limit, locale-dependent result and filter-value language, the isTyomarkkinatori flag, and a licensing/attribution obligation (visible jobcrawls.com link, mirrored in dataUse). Those are terms-of-use constraints an agent cannot infer from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and coverage, then examples, inputs, output and reuse terms in a logical order. It is dense but long, and the output sentence partly duplicates the output schema; a little could be trimmed without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter, zero-required, nested-filter search tool, it covers corpus scope, locale semantics, filter sourcing, output contents and legal reuse in one place. With an output schema present it need not enumerate return fields, and the brief output summary is a convenience rather than a gap-filler.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description goes slightly beyond by grouping the input space (free-text query, facet filters, remote-only flag, salary floor, sort, paging) and by pointing to list_job_filters as the source of legal filter values. It does not add syntax the schema lacks, so it stops short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Searches active job listings on JobCrawls") and immediately bounds the corpus: jobs in Finland plus remote roles open to Finland, nothing else. It is clearly distinguishable from get_job_details (full text of one result) and list_job_filters (valid filter values), so an agent can route without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly assigns work to siblings: valid filter values come from list_job_filters, full text from get_job_details, with search_jobs as the discovery step. It also supplies three concrete multilingual example queries, which shows the intended query shape and the Finnish/Swedish input case that is otherwise easy to get wrong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources