Skip to main content
Glama

Suomiatlas — Finnish area statistics

Server Details

Finnish postal-area and municipality statistics; rank, compare, history, air quality, nearby places

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 38 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.5/5.0

Scored across 10 tools

Disambiguation4/5

Each tool targets a distinct operation: resolution (search_places), single-place snapshot (get_place_stats), time series (get_place_history), ranking (rank_areas), multi-area comparison (compare_areas), similarity (find_similar_areas), proximity (get_nearby_places), air quality, report link, and a variable catalogue. The only mild overlap is compare_areas versus rank_areas, both operating over multiple areas, but the descriptions clearly separate side-by-side benchmarking from single-metric ranking.

Naming Consistency5/5

All ten tools follow a strict verb_noun snake_case pattern (compare_areas, find_similar_areas, get_*, list_variables, rank_areas, search_places). The convention is uniform with no deviations in casing or verb style.

Tool Count5/5

Ten tools is well-scoped for a statistical data server, with each tool earning its place across resolution, retrieval, ranking, comparison, and specialized datasets (air quality, nearby amenities, reports). No redundant or filler tools.

Completeness5/5

The surface covers the full lifecycle: name resolution, current stats, historical trends, cross-area ranking and comparison, similarity, geographic context, air quality, and a variable catalogue to drive metric selection. Both postal-area and municipality grains are handled, and edge cases (locked data, suppressed values) are documented rather than left as gaps.

Available Tools

10 tools
compare_areasCompare Finnish postal areasA
Read-only
Inspect

Side-by-side statistics for several Finnish postal areas, with national benchmarks and percentiles. Accepts names or codes. Free callers are served only the FIRST TWO areas — the API truncates silently, and this tool reports the dropped ones in locked. If areas were dropped, say so; do not present a two-area answer as if it covered everything asked for. A null value or percentile is suppressed or unpublished for that area and year (small-area confidentiality), not zero; only the areas named in locked are paywalled.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoStatistics year; defaults to the newest.
placesYesPostal area names or 5-digit codes, 2 to 12 of them, e.g. ["Hervanta", "Tikkurila", "02100"].

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the readOnly/openWorld annotations: it warns that free callers are silently truncated to the first two areas, that dropped areas are surfaced in `locked`, and that null values/percentiles mean confidentiality suppression rather than zero. This is exactly the kind of hidden behavior an agent must know to interpret results correctly.

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-loads the purpose, then layers the truncation warning and null semantics efficiently. Slightly dense with several clauses, and the 'say so' instruction is response guidance rather than tool description, but every clause carries useful information.

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?

With no output schema, the description carries the return-value burden and does so: it explains `locked`, confidentiality nulls, paywalling, and the silent truncation. An agent has everything needed to call it and report results honestly.

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 baseline is 3, but the description adds real meaning: `places` accepts names or codes, and although the schema allows up to 12, the effective limit for free callers is two. The year-linked null semantics also enrich interpretation.

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 (side-by-side comparison) and resource (several Finnish postal areas' statistics), plus the added value (national benchmarks and percentiles). The multi-area framing distinguishes it from single-area siblings like get_area_report or get_place_stats.

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

Usage Guidelines3/5

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

The comparison framing implies use when multiple areas must be viewed together, but no sibling is named and there is no explicit 'use this instead of X' or when-not guidance. The free-caller limit is disclosed, but that is behavioral rather than routing guidance.

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

find_similar_areasFind statistically similar Finnish areasA
Read-only
Inspect

Postal areas most like a given one across its whole statistical profile — income, age structure, education, housing and employment together, not one metric. Useful for "where else in Finland feels like this neighbourhood?". Similarity is statistical, not geographic: the results are usually spread across the country. An area whose statistics are suppressed shares too few dimensions to be compared and is left out, so absence from the list is not dissimilarity — it is unmeasured.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoYear; defaults to the newest.
limitNoNeighbours to return (default 10).
placeYesPostal area name or 5-digit code, e.g. "Hervanta", "00530".

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: results are country-wide rather than local, and suppressed areas are omitted, meaning absence signals 'unmeasured' not 'dissimilar' — a subtlety an agent would otherwise misread.

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 the core definition, then supporting nuance about statistical vs geographic and the suppression caveat. Four sentences, each carrying weight, though slightly long for the payload.

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

Completeness4/5

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

No output schema exists, but the description covers what the results mean (spread nationally, absence due to suppression), which is the key ambiguity for this tool. Combined with the fully-covered input schema and safety annotations, an agent has enough to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so place, year, and limit are already documented in the schema (including formats, defaults, and the limit bounds). The description adds the notion of a 'whole statistical profile' but no per-parameter meaning beyond the schema, so the baseline 3 applies.

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 operation (find postal areas most statistically like a given one) with explicit scope across a whole statistical profile. It distinguishes itself from siblings like get_nearby_places by clarifying 'similarity is statistical, not geographic,' so an agent can route correctly without opening schemas.

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

Usage Guidelines4/5

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

Gives a concrete use case ('where else in Finland feels like this neighbourhood?') and implicitly contrasts with geographic siblings. It stops short of explicitly naming an alternative tool or stating when not to use it, so it is clear context without full routing guidance.

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

get_air_qualityAir quality for a Finnish placeA
Read-only
Inspect

Measured annual-mean air quality (PM2.5, PM10, NO₂, O₃) for a Finnish postal area or municipality, from Finnish Meteorological Institute and municipal monitoring stations, each compared against the WHO 2021 guideline and the EU limit. Answers "is the air clean in Vantaa?" with a verdict rather than a bare number. The latest reading, its benchmarks and its station are free for everyone; the multi-year series behind them needs Pro or an Area Pass and arrives empty otherwise, reported in locked. Coverage is sparse: Finland has ~160 stations, so a pollutant with no nearby station is reported as a gap — report that as unmeasured, never as clean.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoMunicipality gives the median over its stations; postal area uses the nearest station.
placeYesPlace name or code, e.g. "Vantaa", "00560"

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint/openWorldHint annotations: it discloses the free-vs-Pro gating on the multi-year `series`, the `locked` marker for gated data, and the critical sparse-station behavior that a missing pollutant is a gap rather than clean air. These are exactly the non-obvious traits an agent needs to avoid misreporting.

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?

Four dense sentences, front-loaded with what is measured and where before moving to the paywall and coverage caveats. Every sentence is informative, though the place-type enumeration marginally overlaps with the schema and purpose statement.

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?

With no output schema, the description still explains the shape of the return (a verdict, its benchmarks, the station, a locked `series`, and gap reporting), so an agent knows both the entitlement behavior and how to interpret missing pollutants. Nothing material is missing for a 2-parameter read tool.

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

Parameters3/5

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

Schema description coverage is 100%, including the municipality-median vs postal-area-nearest-station semantics, so the schema already carries the parameter meaning. The description only restates the place-type choice, adding no syntax or format detail beyond what the schema provides.

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 (retrieve measured annual-mean air quality), names the exact pollutants, the geography (Finnish postal area or municipality) and the data sources. This is clearly distinguishable from siblings like get_area_report or compare_areas, which are broader or comparative.

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

Usage Guidelines4/5

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

Gives clear usage context via the example question ("is the air clean in Vantaa?") and explains the sparse-coverage caveat that governs how to interpret results. It does not, however, explicitly name an alternative tool or state when to prefer get_area_report or compare_areas over this one.

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

get_area_reportPDF report link for a Finnish postal areaA
Read-only
Inspect

The download link for one postal area's printable PDF report (composite scores, trends and the full statistics table). Returns a URL and never the file itself — the report renders the same data the other tools return, so offer the link when someone wants the document, and answer questions from get_place_stats instead. Downloading requires Suomiatlas Pro or an Area Pass for that area; when the caller has neither, the link still comes back and locked says what it costs. Reports exist per postal area only, not per municipality.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoStatistics year; defaults to the newest.
placeYesPostal area name or 5-digit code, e.g. "Hervanta", "00560"
languageNoReport language: fi (default), sv or en.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare readOnlyHint/openWorldHint; the description adds substantial behavior the annotations cannot convey: it returns a URL and never the file, the link is returned even without entitlement, and the `locked` field discloses the cost. It also notes the report duplicates data available from other tools, which is non-obvious behavioral context.

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

Conciseness5/5

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

Front-loaded with the deliverable (the URL), then access conditions, then the scope limit. Every sentence carries distinct information — return type, routing, entitlement, and granularity — with no restatement of the name or title.

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?

No output schema exists, and the description compensates by describing the return value (a URL plus a `locked` cost field) rather than the document itself. Combined with entitlement rules and the postal-area-only scope, an agent has everything needed to call and interpret the result.

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 description coverage is 100%, so year/place/language are already documented and the baseline is 3. The description adds one genuine semantic constraint beyond the schema: `place` must be a postal area, not a municipality, which is not stated in the parameter description.

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 — 'the download link for one postal area's printable PDF report' — and immediately scopes it ('composite scores, trends and the full statistics table'). It also separates itself from siblings by naming get_place_stats as the tool for answering questions rather than fetching the document.

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?

Explicit routing: 'offer the link when someone wants the document, and answer questions from get_place_stats instead.' It also states a hard eligibility boundary ('Reports exist per postal area only, not per municipality') and the access condition (Suomiatlas Pro or an Area Pass), which is exactly the when/when-not guidance an agent needs.

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

get_nearby_placesTransit stops and services inside a Finnish postal area, or within a few km of itA
Read-only
Inspect

What is physically inside one Finnish postal area: public transport stops (bus, tram, metro, train, ferry) from Digitransit; daycare centres from the Suomi.fi service catalogue (PTV), with OpenStreetMap adding only those with no PTV daycare within 250 m; and schools, higher and further education, health clinics, pharmacies, supermarkets and libraries from OpenStreetMap; and swimming pools and beaches from LIPAS, the national register of sports facilities. Answers "what is there in Tikkurila?" or "is there a school in 99980?" with counts and names. With withinKm (up to 5) it also looks beyond the area: places within that straight-line distance of the area's boundary, nearest first per category with their distance — one call for "is there a pool or a beach near 00250?". Postal areas only; a city name returns its areas to choose from. Transit counts are platforms (most stops have one per direction); names groups platforms by stop name. A zero for an OpenStreetMap category means none is mapped there, not that none exists; a null count means that source has not been loaded; a null name is a place its source has no name for. This says nothing about travel times or service frequency. Free for everyone. Licensed per source: the OpenStreetMap places and the daycare layer are ODbL 1.0, the pools and beaches CC BY 4.0; credit "© OpenStreetMap contributors", Digitransit, the Suomi.fi service catalogue and "Jyväskylän yliopisto, Lipas Liikuntapaikat.fi" when reproducing it.

ParametersJSON Schema
NameRequiredDescriptionDefault
placeYesPostal area name or 5-digit code, e.g. "Tikkurila", "00530"
withinKmNoAlso look this many km beyond the area's boundary (straight-line, 0.1 to 5), and answer with the nearest places and their distance.
categoriesNoOnly these categories; defaults to all fourteen.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint; the description adds substantial non-obvious behavior: transit counts are platforms, names groups platforms, zero means unmapped-not-absent, null count means source not loaded, null name means un-named source. It also states limits (nothing about travel times/frequency), cost, and per-source licensing.

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?

It is long but a single front-loaded paragraph where most sentences carry load-bearing semantics or licensing. The one redundancy is re-listing all fourteen categories that the schema enum already enumerates verbatim, which costs some compactness.

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?

With no output schema, the description explicitly explains the return shape (counts and names, distances under withinKm) and the meaning of null/zero values. For a multi-source, three-parameter tool this is complete enough to call correctly.

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, but the description adds meaning beyond the schema: withinKm looks beyond the boundary (straight-line) and returns nearest-first per category with distances, and names groups platforms by stop name. The categories default to all fourteen is also clarified.

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?

Opens with a precise scope statement: what is physically inside one Finnish postal area, with specific categories and named sources (Digitransit, PTV, OpenStreetMap, LIPAS). This clearly distinguishes it from siblings like get_area_report, get_place_stats and search_places.

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

Usage Guidelines4/5

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

Gives concrete triggering questions ("what is there in Tikkurila?", "is there a school in 99980?") and the condition that selects the withinKm behavior. It also routes city-name queries correctly ("a city name returns its areas to choose from"). It stops short of explicitly naming alternative sibling tools, so not a full 5.

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

get_place_historyHistory and trends for a Finnish placeA
Read-only
Inspect

Time series for one Finnish postal area or municipality, with the direction and size of change computed for each metric so the trend does not have to be eyeballed. Answers questions like "have apartment prices been rising in Espoo?" and "is the population growing?". Defaults to housing sale prices and population. For a postal area it also returns trendMetrics: precomputed 1/5/10-year indicators — population growth, income momentum, aging velocity, family influx, construction, education uplift, and unemployment relative to the national change — which answer "is this area gentrifying / aging / declining?" directly, and whose latest values are free for everyone. Free callers receive only the last 3 years of series, no per-year history on the trend metrics (Pro or an Area Pass adds up to 10 years per metric), and no municipality housing price history — each reported in locked. A short window is NOT evidence of a short trend: if a field is locked, say the full series requires Pro rather than describing the 3-year window as the trend. Series points are index-aligned to years: a null point is a year the source did not publish for this area, and trend is null when fewer than two points have values or the series starts at zero — call that too sparse to read, not flat.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoForce a grain.
placeYesPlace name or code, e.g. "Espoo", "Hervanta", "00560"
variablesNoVariable codes to chart (see list_variables). Defaults to housing prices and population.

TDQS

A4.4/5.0
Behavior5/5

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

With annotations only covering readOnly/openWorld, the description carries substantial extra context: free-tier limits (last 3 years, no per-year history, no municipality housing prices), how each limitation surfaces in `locked`, null-point semantics aligned to `years`, and the null `trend` condition. It also instructs the agent not to misread a locked 3-year window as the trend.

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-loads the purpose, then layers return-shape and tier-behavior detail; every clause carries information. It is dense, but the long sentences are justified by the interpretive warnings that prevent wrong answers.

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?

No output schema exists, yet the description explains the return shape (index-aligned series, `trendMetrics`, `locked`) and the edge cases (sparse series, locked fields). An agent has everything needed to call and interpret it.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already documents all three parameters (place, kind, variables). The description only restates the default variables (housing prices and population), adding no format or syntax detail beyond the schema, so the baseline 3 applies.

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+resource+scope: 'Time series for one Finnish postal area or municipality' with trend computation. The `trendMetrics` / gentrification framing makes it clearly distinct from snapshot-style siblings like get_place_stats and compare_areas.

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

Usage Guidelines4/5

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

Gives concrete example questions ('have apartment prices been rising in Espoo?') and states defaults, which signals when to use it. However, it never names an alternative tool or an explicit when-not-to-use condition relative to get_place_stats or compare_areas.

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

get_place_statsStatistics for a Finnish placeA
Read-only
Inspect

Current statistics for one Finnish postal area or municipality: population, age, income, employment, education, housing sale prices (€/m²) and municipal crime rates, with national/regional percentiles where available. Accepts a name or a code and resolves it automatically; if the name is ambiguous it returns the candidates instead of guessing. Answers questions like "how many people live in Hervanta?", "how many live in Akaa?" and "how much is an apartment in Matinkylä?". Returns a headline set of metrics by default — pass variables to fetch specific codes from list_variables. A postal area's result also includes ratios[]: household composition and jobs-to-residents ratios compared against Finland as a whole (see each entry's nationalBasis and the response's notes). Anything in the locked field is withheld pending a Pro subscription, not missing: say so rather than reporting it as absent. Outside locked, a null value is a figure Statistics Finland suppressed (small-area confidentiality) or never published for that vintage, and a null percentile means one could not be computed — report both as unpublished, never as zero; ratios[].areaValue is null when the area's denominator is under 30 or an input is unpublished.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoForce a grain when a name exists at both, e.g. Helsinki the municipality.
yearNoStatistics year; defaults to the newest available.
placeYesPlace name or code, e.g. "Hervanta", "Akaa", "00560"
variablesNoExtra variable codes to include beyond the headline set (see list_variables).
includeAllVariablesNoReturn all ~131 variables. Large; only use when the headline set is insufficient.
includeCompositeScoresNoInclude composite 0-100 scores (postal areas only). Component detail needs Pro.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond readOnlyHint/openWorldHint, the description discloses a rich behavioral contract that annotations cannot: ambiguous names return candidates instead of guessing, `locked` means Pro-gated not missing, nulls mean suppression or non-publication (never zero), a null percentile means it couldn't be computed, and ratios[].areaValue is null when the denominator is under 30. This is exactly the disclosure that prevents an agent from misreporting absent data.

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 metrics, then resolution behavior, then return-shape and null-handling semantics. Appropriate for a data-dense statistical tool. The final sentence on nulls/percentiles/ratios is long but each clause earns its place by preventing a specific misreporting error.

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 a single-place statistics tool with no output schema, the description adequately covers what is returned (headline set, ratios[], percentiles, locked/Pro fields), how ambiguity is handled, and how to read nulls. Given no output schema exists, this description does the heavy lifting and nothing an agent needs to interpret results correctly is missing.

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, but the description adds real semantics: name-or-code resolution behavior, the ambiguity-candidate return, the default-headline-set behavior that explains the `variables` parameter, and the Pro caveat on composite scores. It doesn't restate enum or year semantics, but supplements meaningfully.

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+resource ('current statistics for one Finnish postal area or municipality') and enumerates the exact metric domains returned. An agent can distinguish it from siblings like compare_areas, rank_areas, or get_area_report 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 Guidelines4/5

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

Gives example questions that select this tool, explains name-vs-code resolution, and points to list_variables for variable codes and variables/includeAllVariables for fetching specific data. It doesn't explicitly contrast against sibling tools like get_area_report or get_place_history, so exclusions are implied rather than stated.

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

list_variablesList available Suomiatlas metricsA
Read-only
Inspect

The catalogue of every metric Suomiatlas publishes — population, income, education, employment, buildings and dwellings, housing sale prices, crime rates, composite scores — grouped by theme, with codes, units and types. Call this to find the right variableCode for rank_areas or get_place_stats. Pass variableCode to get the years that metric covers instead; coverage differs per metric (Paavo 2010–2024, housing prices 2009–2025, air quality per municipality from 2019 with fewer stations in the early years). Air-quality codes (aq_pm25_avg, aq_pm10_avg, aq_no2_avg, aq_o3_avg) are municipality-grain and not in this catalogue; pass them to rank_areas directly. An empty year list for a code means it is unpublished, not that the metric is zero.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupNoFilter to one theme, matched case-insensitively, e.g. "income", "crime".
variableCodeNoReturn the years available for this metric rather than the catalogue.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description goes well beyond them: per-metric coverage windows (Paavo 2010–2024, housing prices 2009–2025, air quality from 2019 with sparse early stations) and the crucial semantic that an empty year list means unpublished, not zero. That last point prevents a real misinterpretation.

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 the catalogue's contents, then routing, then the air-quality exception and the empty-list caveat. Every sentence carries information, though the long theme enumeration and the parenthetical air-quality code list make it denser than strictly necessary.

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?

There is no output schema, so the description has to describe returns itself — and it does: grouped by theme with codes, units and types, plus the alternate year-list shape and how to read an empty one. Nothing an agent needs to call it correctly is missing.

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 baseline is 3, but the description adds genuine meaning: variableCode does not filter — it switches the tool into a different mode (years for that metric), and group is a case-insensitive theme filter. The coverage examples give the agent a sense of what values to expect. It stops short of enumerating valid group values.

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 — the catalogue of every metric Suomiatlas publishes — and enumerates the themes, codes, units and types it returns. It names the sibling tools it feeds (rank_areas, get_place_stats), so an agent can place it relative to the rest of the set without opening a 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 says when to call it (to find the right variableCode for rank_areas or get_place_stats), what the alternative mode is (passing variableCode returns years instead of the catalogue), and carves out the air-quality codes that are NOT in this catalogue and must go straight to rank_areas. That is when/when-not/alternative routing in one place.

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

rank_areasRank Finnish areas by a metricA
Read-only
Inspect

Rank Finnish postal areas by any metric — highest or lowest income, population, unemployment, education, housing prices — nationally or within one municipality or region. Crime rates (crime_total_rate and friends) and air quality (aq_pm25_avg, aq_pm10_avg, aq_no2_avg, aq_o3_avg — annual means in µg/m³) rank municipalities instead, since both are published only at that grain; the aq_ codes are not in list_variables, pass them directly. For air quality order="bottom" gives the cleanest municipalities first and order="top" the most polluted, so "which municipality has the cleanest air?" is rank_areas with aq_pm25_avg and order="bottom" — get_air_quality answers for one place only. A municipality absent from an air-quality or crime ranking has no published value there: report it as unmeasured, never as clean or safe. A null in additionalValues means that metric is unpublished for that area, not zero. For gender_balance_20_39 the useful question is usually which areas are closest to an even split, not which are most skewed: pass order="balance" for that, since both a high and a low ratio mean imbalance. Get valid metric codes from list_variables. Free callers receive at most 10 rows regardless of limit, reported in locked. near plus withinKm narrows the ranking to areas within a straight-line radius of another place. That is distance over the ground, never a travel or commute time. To screen areas on several metrics at once — "above-average family share and below-average housing prices" — rank by one metric and pass the rest as includeVariables; that is a single call. Do not call get_place_stats per area to collect a second metric.

ParametersJSON Schema
NameRequiredDescriptionDefault
nearNoKeep only areas within `withinKm` of this place — a postal area or municipality, by name or code, e.g. "Tampere", "00100". Distance is centre to centre in a straight line.
yearNoYear; defaults to the newest with data.
limitNoRows to return (default 10).
orderNoHighest first (default), lowest first, or — for a metric whose ideal value is a specific number rather than an extreme — closest to that value first. "balance" is currently valid only for gender_balance_20_39, whose target is an even 1.0; asking for it on any other metric is an error. For aq_* metrics "bottom" is cleanest first.
scopeNoLimit to one municipality or region by name or code, e.g. "Espoo", "Uusimaa". Not applicable to crime or air-quality rankings, which are national lists of municipalities — use `near` + `withinKm` to narrow those.
withinKmNoRadius in kilometres around `near`. Required with `near`, and only with it.
variableCodeYesMetric code from list_variables, e.g. "hr_mtu", "unemployment_rate", or an air-quality code such as "aq_pm25_avg".
includeVariablesNoExtra metric codes to report for each ranked area, as `additionalValues` on every row. Each metric's own year is given in `includedVariables`, since the sources run to different years. Not available for municipality-grain rankings (crime, air quality).

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the readOnly/openWorld annotations: free callers capped at 10 rows reported in `locked`, null in additionalValues means unpublished not zero, absent municipality means unmeasured rather than clean/safe, `near`/`withinKm` is straight-line distance never travel time, and aq codes are not in list_variables. This is unusually rich constraint disclosure.

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 the core purpose in sentence one, and nearly every later sentence carries a real caveat. However it is a dense block of many clauses and the routing/gotcha guidance is interleaved, so it is longer and harder to scan than it needs to be.

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 8-parameter tool with no output schema, the description covers the notable return facets (`locked`, `additionalValues`, `includedVariables`), grain limitations, and error conditions. Nothing an agent needs to invoke it correctly appears missing.

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, but the description adds meaning the schema does not carry: why order="balance" exists, that aq_* codes must be passed directly since list_variables omits them, and what includeVariables produces (`additionalValues`, `includedVariables`). Marginal value above the schema is real but partial.

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?

Specific verb (rank) plus resource (Finnish postal areas) plus the metric dimension, with the alternative path named ('get_air_quality answers for one place only', 'do not call get_place_stats per area'). An agent can distinguish this from all siblings without opening the 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?

Explicit routing rules: crime/air-quality metrics rank municipalities, get valid codes from list_variables, use includeVariables for multi-metric screening, use get_air_quality for a single place, use order="balance" for gender_balance_20_39. Both when-to-use and when-not-to-use are stated.

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

search_placesSearch Finnish placesA
Read-only
Inspect

Resolve a Finnish place name to the code every other Suomiatlas tool takes. Handles postal areas (e.g. Toukola, Töölö), municipalities (Espoo, Akaa) and regions (Uusimaa). Diacritics are optional: "toolo" finds "Töölö". Call this first whenever the user names a place rather than a code. Many Finnish neighbourhood names are shared across cities, so several results is normal — present the choices instead of assuming the first one. Postal-area results carry an inhabitant count with the year it was published for; if you quote it, quote the year with it. population is null for municipalities and regions — the count is carried per postal area only — not a sign the place is empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoRestrict to one grain. Omit to search all three.
limitNoMaximum results (default 10).
queryYesPlace name or code, e.g. "Töölö", "Espoo", "00560"

TDQS

A4.6/5.0
Behavior5/5

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

Goes well past the readOnly/openWorld annotations: diacritic-insensitive matching ('toolo' → 'Töölö'), the fact that shared neighbourhood names yield multiple results, and the null-population semantics for municipalities/regions which prevents a false 'empty place' inference. This is meaningful behavior an agent could not derive from structured fields.

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 the core purpose and routing rule, then behavioral caveats. It runs long with several dense clauses (diacritics, multi-results, population year, null semantics), but each sentence earns its place.

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?

With no output schema, the description carries the burden of explaining return shape and it does: results are codes, postal-area results carry an inhabitant count plus publication year, and population is null for non-postal grains. An agent has everything needed to call and interpret it.

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

Parameters3/5

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

Schema coverage is 100%, so parameters are already documented. The description's mention of postal areas, municipalities, and regions loosely maps to the `kind` enum but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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 (resolve), resource (Finnish place name), and output (the code every other Suomiatlas tool takes), and enumerates the three grains it handles. An agent can immediately tell this is the name-to-code resolver, distinct from siblings like get_place_stats or compare_areas that consume codes.

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?

Explicit routing instruction: 'Call this first whenever the user names a place rather than a code.' It also gives handling guidance for the ambiguous case (several results is normal — present the choices) and when to quote population (quote the year with it).

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updates
    • Changedcompare_areas1 field changed
      • changedInput schema / properties / places / description
        Previous value: -"Postal area names or 5-digit codes, 2 to 12 of them."New value: +"Postal area names or 5-digit codes, 2 to 12 of them, e.g. [\"Hervanta\", \"Tikkurila\", \"02100\"]."
    • Changedfind_similar_areas1 field changed
      • changedInput schema / properties / place / description
        Previous value: -"Postal area name or 5-digit code."New value: +"Postal area name or 5-digit code, e.g. \"Hervanta\", \"00530\"."
    • Changedget_area_report1 field changed
      • changedInput schema / properties / place / description
        Previous value: -"Postal area name or 5-digit code, e.g. \"Toukola\", \"00560\""New value: +"Postal area name or 5-digit code, e.g. \"Hervanta\", \"00560\""
    • Changedget_nearby_places1 field changed
      • changedInput schema / properties / place / description
        Previous value: -"Postal area name or 5-digit code, e.g. \"Kallio\", \"00530\""New value: +"Postal area name or 5-digit code, e.g. \"Tikkurila\", \"00530\""
    • Changedget_place_history1 field changed
      • changedInput schema / properties / place / description
        Previous value: -"Place name or code, e.g. \"Espoo\", \"Töölö\", \"00560\""New value: +"Place name or code, e.g. \"Espoo\", \"Hervanta\", \"00560\""
    • Changedget_place_stats1 field changed
      • changedInput schema / properties / place / description
        Previous value: -"Place name or code, e.g. \"Toukola\", \"Akaa\", \"00560\""New value: +"Place name or code, e.g. \"Hervanta\", \"Akaa\", \"00560\""
    • Changedrank_areas1 field changed
      • changedInput schema / properties / near / description
        Previous value: -"Keep only areas within `withinKm` of this place — a postal area or municipality, by name or code. Distance is centre to centre in a straight line."New value: +"Keep only areas within `withinKm` of this place — a postal area or municipality, by name or code, e.g. \"Tampere\", \"00100\". Distance is centre to centre in a straight line."
  2. 1 tool update
    • Changedget_nearby_places1 field changed
      • addedInput schema / properties / withinKm
        Added value: +{
        +  "description": "Also look this many km beyond the area's boundary (straight-line, 0.1 to 5), and answer with the nearest places and their distance.",
        +  "maximum": 5,
        +  "minimum": 0.1,
        +  "type": "number"
        +}
  3. 1 tool update
    • Changedget_nearby_places2 fields changed
      • changedInput schema / properties / categories / description
        Previous value: -"Only these categories; defaults to all twelve."New value: +"Only these categories; defaults to all fourteen."
      • changedInput schema / properties / categories / items / enum
        Previous value: -[
        -  "bus",
        -  "tram",
        -  "metro",
        -  "train",
        -  "ferry",
        -  "kindergarten",
        -  "school",
        -  "higher_education",
        -  "health_clinic",
        -  "pharmacy",
        -  "supermarket",
        -  "library"
        -]New value: +[
        +  "bus",
        +  "tram",
        +  "metro",
        +  "train",
        +  "ferry",
        +  "kindergarten",
        +  "school",
        +  "higher_education",
        +  "health_clinic",
        +  "pharmacy",
        +  "supermarket",
        +  "library",
        +  "swimming_pool",
        +  "beach"
        +]
  4. 1 tool update
    • Changedget_nearby_places2 fields changed
      • changedInput schema / properties / categories / description
        Previous value: -"Only these categories; defaults to all ten."New value: +"Only these categories; defaults to all twelve."
      • changedInput schema / properties / categories / items / enum
        Previous value: -[
        -  "bus",
        -  "tram",
        -  "metro",
        -  "train",
        -  "ferry",
        -  "kindergarten",
        -  "school",
        -  "health_clinic",
        -  "pharmacy",
        -  "supermarket"
        -]New value: +[
        +  "bus",
        +  "tram",
        +  "metro",
        +  "train",
        +  "ferry",
        +  "kindergarten",
        +  "school",
        +  "higher_education",
        +  "health_clinic",
        +  "pharmacy",
        +  "supermarket",
        +  "library"
        +]
  5. 1 tool update
    • Addedget_nearby_places
  6. 9 tool updates
    • First observedcompare_areas
    • First observedfind_similar_areas
    • First observedget_air_quality
    • First observedget_area_report
    • First observedget_place_history
    • First observedget_place_stats
    • First observedlist_variables
    • First observedrank_areas
    • First observedsearch_places

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Search Statistics Finland's StatFin database (3,000+ tables), inspect table variables, and query clean flattened statistics on population, economy, labour and regions.
    8 npm
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server for official statistics from Statistics Finland (Tilastokeskus) — the StatFin database, exposed through the PxWeb API. Search 3000+ tables, inspect their dimensions, and pull data as JSON-stat2.
    4
    30 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides access to Sweden's comprehensive municipal and regional statistics database with semantic search capabilities. Enables natural language queries against thousands of Key Performance Indicators covering various aspects of Swedish public sector data.
    16
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    Provides access to 5,000+ Key Performance Indicators across 264 operating areas for all Swedish municipalities and regions, enabling statistical analysis, comparisons, and trend tracking of Swedish public sector data.
    21
    119 npm
    12
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources