io.github.cyanheads/ilostat-mcp-server
REMOTE · ILOSTAT.CASEYJHAND.COM · 2 COMPONENTS
Search ILOSTAT labour indicators, query and compare series, build country profiles, run SQL.
Available components
Last scanned (7 hours ago)
Scores higher than 96% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Data and Analytics
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security83
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability72
- 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 4238 tokens (~470/item across 9 items; 8 tools + 1 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 Management100
- No destabilizing schema changes in the last 30 days.Pass
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
- We read all 8 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 10 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
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.
- 3 Nov 26 0
- Stability: 0.97 → pass security
- 2 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 29 Oct 26 +3
- The server rewrote its instructions, which are the text every model session reads security
- Tool “ilostat_dataframe_query” rewrote its description, which is the text the model reads security
- Tool “ilostat_search_indicators” rewrote its description, which is the text the model reads security
- First check of Schema quality: 100 functional
- New resource “ilostat-guide” functional
- Server version: 0.2.0 → 0.3.0 functional
- “ilostat_search_indicators” reworded the description of “query” cosmetic
- 27 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.
- 25 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.
- 23 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.
- 21 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.
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 5 Nov 2026 · Probed https://ilostat.caseyjhand.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=caseyjhand.com | CN=WE1,O=Google Trust Services,C=US | 2 Nov 2026 | 31 Jan 2027 | ECDSA 256 | ECDSA-SHA256 | 995a30681ab772540e934241ca1d576c |
| SANs: caseyjhand.com, *.caseyjhand.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC secure
Validation of ilostat.caseyjhand.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| caseyjhand.com. | present | 2371 | 13 | Verified |
| ilostat.caseyjhand.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| x-content-type-options | nosniff |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://ilostat.caseyjhand.com/mcp | Verified | 200 | |
| http (plaintext) | http://ilostat.caseyjhand.com/mcp | HTTPS enforced | 301 | https://ilostat.caseyjhand.com/mcp |
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 →
ilostat_compare_geographies Compare areas on an ILOSTAT dataset ~672
Compare reference areas on one ILOSTAT dataset and one slice — a sex code plus breakdown codes, defaulting to the dataset's totals — giving each area's value at a common period or at its latest non-projected period, optional change over N years, and a rank, with each value's period, source, status, and basis (reported, modelled_estimate, or projection). A change carries the earlier value's source, basis, status, and notes, and flags whether the source or basis differs or the series breaks between the two values. Areas without a value are listed separately with the reason, and the response flags mixed periods and mixed bases rather than hiding them. Select areas by code list, by group (X01 for every country, an ILO region or subregion, or a World Bank income group), or both; X-coded aggregates require a dataset with aggregates.
| Name | Type | Req | Description |
|---|---|---|---|
| area_group | string | – | X01 for every country, an ILO region or subregion, or a World Bank income group (X06, X56, X02, …); expands to its member countries. The group's own aggregate is compared only when listed in ref_area… |
| change_years | integer | – | Adds each value's change from the same sub-period this many years earlier, in the dataset unit. |
| classif1 | string | – | First breakdown code, case-insensitive. Defaults to the dataset's total code; required when the breakdown has no total (deciles); refused on a dataset without the breakdown. ilostat_describe_indicato… |
| classif2 | string | – | Second breakdown code; same defaults and rules as classif1. |
| dataset_id | string | yes | One dataset ID (UNE_DEAP_SEX_AGE_RT_A), as ilostat_search_indicators returns it; case-insensitive, a DF_ prefix (the SDMX dataflow form) stripped, a bare indicator code resolved when it has one frequ… |
| include_projections | boolean | – | Latest mode: let projections (ILO modelled values after the cutoff) be an area's latest value. |
| lookback_years | integer | – | Latest mode: an area's latest value must fall within this many years of the current year. |
| period | string | – | A common period, YYYY, YYYYQn, or YYYYMmm matching the dataset frequency (2024-Q2 and 2025-03 are normalized). Omit to compare each area at its latest period. |
| ref_areas | array | – | Reference areas (up to 300): ISO3 codes (USA) or X-coded aggregates (X01 World); case-insensitive, ILO_GEO_ forms accepted. At least one of ref_areas or area_group is required. |
| sex | string | – | Sex code SEX_T, SEX_M, SEX_F, or SEX_O; T/M/F/O and total/both/male/female/other are accepted. Defaults to SEX_T on a dataset with a sex breakdown; refused on one without. |
| sort | string | – | Row order: value_desc (default), value_asc, or ref_area. rank is always by value, highest first. |
| Name | Type | Req | Description |
|---|---|---|---|
| applied_filters | object | – | Every parameter sent upstream. |
| attribution | string | – | Citation to keep with any use of the data. |
| cap | number | – | Inline preview budget, in serialized characters. |
| change_years | number | – | Years the change is measured over, when requested. |
| comparability | object | – | What makes the current values more or less comparable, over every area; each change's baseline is compared by its own source_changed, basis_changed, and break_in_series. |
| dataframe | object | – | The staged dataframe holding the full result; present only when staged. |
| dataset | object | – | One requested dataset and how its values are classed. |
| error | object | – | Present when the call failed. Absent on success. |
| include_projections | boolean | – | Whether a projection could be an area's latest value. |
| legend | object | – | Labels for the status flags and note codes in rows. |
| missing | array | – | Requested areas with no value, and why. |
| mode | string | – | latest: each area's latest value; period: every area at one period. |
| notice | string | – | Mixed periods, mixed bases, changes that are not like-for-like, missing areas, a unit or area list the structure service could not supply, where the full comparison is staged, or why the inline rows… |
| period | string | – | Period mode: the period compared. |
| rows | array | – | Areas with a value, in the requested order; the staged dataframe holds all when larger. |
| shown | number | – | Rows returned inline. |
| slice | object | – | The one series compared per area. |
| truncated | boolean | – | True when the inline rows stop before the last area — also when a dataframe holds the full comparison. |
| window_from | number | – | Latest mode: the first year requested — lookback_years before the current year, and change_years further back to reach the change base. A latest value still falls within lookback_years. |
No examples provided.
ilostat_dataframe_describe Describe staged ILOSTAT dataframes ~211
Describe the df_<id> dataframes staged by ilostat_query_indicator and ilostat_compare_geographies or stored by ilostat_dataframe_query register_as: the tool and parameters that produced each, the datasets it holds (label, last update, and the unit with its measure, type, and multiplier — values stay in the published scale the multiplier names), coverage, basis counts, attribution, creation and expiry times, row count, and column schema. Pass name for one dataframe. Without it, every staged dataframe is listed, except on a deployment whose callers share one canvas, where listing is off and only the exact name works. Read the schema here before writing SQL for ilostat_dataframe_query.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | One dataframe name as the producing tool returned it (df_XXXXX_XXXXX: letters and digits, five in each part; case-insensitive, as in SQL). Omit to list every staged dataframe; a deployment whose call… |
| Name | Type | Req | Description |
|---|---|---|---|
| dataframes | array | – | Staged dataframes, newest first; empty when none. |
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | Guidance when the named dataframe does not exist. |
No examples provided.
ilostat_dataframe_query Query staged ILOSTAT dataframes ~487
Run a single-statement SELECT against the df_<id> dataframes staged by ilostat_query_indicator and ilostat_compare_geographies or stored by an earlier register_as. Inspect a dataframe with ilostat_dataframe_describe first; its column schema is what the SQL has to match. Read-only: writes, DDL, DROP, COPY, PRAGMA, ATTACH, file references, file-reading table functions, and functions that read engine settings or name a table from a string are rejected, and system catalogs (information_schema, pg_catalog, sqlite_master, duckdb_*) are denied. Breakdown versions overlap (AGE_YTHADULT_*, AGE_AGGREGATE_*, AGE_10YRBANDS_*, AGE_5YRBANDS_*; ECO_SECTOR_*, ECO_AGGREGATE_*, ECO_ISIC4_*, ECO_ISIC3_*), so filter to one version before summing. Optional register_as stores the result as a new dataframe with a fresh TTL.
| Name | Type | Req | Description |
|---|---|---|---|
| preview | integer | – | Rows returned inline; defaults to row_limit, and a larger value is applied as row_limit. Inline rows also stop at a size budget (applied_limits.preview_chars). Set lower when register_as keeps the fu… |
| register_as | string | – | Store the result as a new dataframe under this name (df_XXXXX_XXXXX: letters and digits, five in each part; stored uppercased after df_) with a fresh TTL, to chain analyses. A result over 1,000,000 r… |
| row_limit | integer | – | Cap on rows materialized; defaults to 1,000, or the per-call cap when that is lower. The per-call cap is 10,000, or the lower cap the deployment sets; a larger value, up to 1,000,000, is applied as t… |
| sql | string | yes | One SELECT over df_<id> tables (DuckDB SQL: joins, aggregates, window functions, CTEs), at most 20,000 characters. BIGINT results such as COUNT or SUM of integers serialize as strings; CAST to DOUBLE… |
| Name | Type | Req | Description |
|---|---|---|---|
| applied_limits | object | – | The limits this call ran under, after any clamp. |
| cap | number | – | The row cap that bound: preview when lower than row_limit, else row_limit. |
| columns | array | – | Column names in projection order. |
| error | object | – | Present when the call failed. Absent on success. |
| evicted | array | – | Dataframes dropped, oldest first, to keep this tenant within 1,000,000 staged rows and 100 dataframes; present only when storing the result evicted any. |
| expires_at | string | – | ISO 8601 expiry of the new dataframe. |
| notice | string | – | Guidance when the query returned no rows, a cap withheld some, or a limit was applied below the value sent. |
| registered_as | string | – | The new dataframe name, when register_as stored the result. |
| row_count | number | – | Rows the query produced. With register_as this is the exact count of the stored dataframe, which row_limit does not bound; otherwise at most row_limit, and when row_count_capped is true it is the cap… |
| row_count_capped | boolean | – | True when the query matched more rows than row_limit; never true with register_as, which stores every row. |
| rows | array | – | Result rows keyed by the names in columns, bounded by preview, row_limit, and an inline size budget; rows stop before the first that would pass the budget, and a value is never clipped. BIGINT values… |
| shown | number | – | Rows returned inline. |
| truncated | boolean | – | True when a cap withheld rows from this response. |
No examples provided.
ilostat_describe_indicator Describe an ILOSTAT dataset ~211
Explain one ILOSTAT dataset before comparing numbers: its definition, unit and multiplier, frequency variants and coverage, the sex and breakdown codes in use across its frequencies (the total code of each breakdown marked), the reference areas it covers, whether it carries World/regional/income-group aggregates, and how its observations are classed as reported, modelled, or projected. Accepts a dataset ID (UNE_DEAP_SEX_AGE_RT_A) or a bare indicator code (UNE_DEAP_SEX_AGE_RT), which describes every frequency. An unknown code returns found: false with guidance.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_id | string | yes | One dataset ID (indicator code plus _A, _Q, or _M, e.g. UNE_DEAP_SEX_AGE_RT_A) or a bare indicator code (UNE_DEAP_SEX_AGE_RT), as ilostat_search_indicators returns them. Case-insensitive; a DF_ prefi… |
| Name | Type | Req | Description |
|---|---|---|---|
| attribution | string | – | Citation to keep with any use of the data. |
| basis_rule | object | – | How observations are classed reported, modelled_estimate, or projection. |
| breakdowns | object | – | Breakdown codes in use, from ILOSTAT's structure service; absent when structure_status is unavailable. |
| cap | number | – | The most related indicators listed. |
| catalog_as_of | string | – | ISO timestamp the catalog was last confirmed current. |
| database | object | – | Source database code and label. |
| dataset_id | string | – | The dataset requested, when a dataset ID (not a bare indicator code) was given. |
| datasets | array | – | Every frequency variant of the indicator, annual first. |
| default_slice | object | – | The dataset's total codes from its default view — the slice ilostat_compare_geographies uses when sex, classif1, or classif2 is omitted; a breakdown with no total (deciles) is left out. |
| definition | string | – | ILOSTAT definition of the indicator, HTML stripped; links kept as "text (url)". |
| error | object | – | Present when the call failed. Absent on success. |
| found | boolean | – | False when no dataset or indicator has the code. |
| guidance | string | – | On a miss: how to find a valid dataset ID. |
| has_aggregates | boolean | – | Whether the requested dataset (or, for an indicator code, any of its datasets) carries World, regional, or income-group rows. |
| indicator | string | – | Indicator code. |
| label | string | – | Indicator label as ILOSTAT publishes it. |
| measure | object | – | Measure (the quantity measured, shared by breakdown variants) code and label. |
| notice | string | – | Where to find breakdown codes and units when the structure service did not supply them, and how to list every related indicator when the list is cut — whichever apply, joined. |
| ref_areas | object | – | Reference areas the indicator covers across its frequencies, from ILOSTAT's structure service; absent when structure_status is unavailable. |
| related_datasets | array | – | The first 20 other indicators sharing this measure under other breakdowns, by code; related_total counts all of them. |
| related_total | number | – | How many other indicators share this measure. ilostat_search_indicators with measure set to measure.code lists them all. |
| shown | number | – | Related indicators listed. |
| structure_status | string | – | unavailable when ILOSTAT's structure service has no entry for the indicator or cannot be reached; breakdowns, default_slice, unit, and ref_areas are then absent. |
| subject | object | – | Subject code and label. |
| truncated | boolean | – | True when related_datasets lists fewer than related_total. |
| unit | object | – | Unit of the values, already in the multiplier scale; absent when unresolved. |
No examples provided.
ilostat_get_country_profile Get an ILOSTAT labour-market profile ~265
Build a headline labour-market profile for one reference area: labour force participation, employment-to-population ratio, unemployment and youth unemployment rates, youth NEET rate, informal employment rate, employment level, labour income share, and working poverty rate. Each indicator shows its latest reported value (from a national or institutional source, with its source and notes) and, separately, its latest ILO modelled estimate that is not a projection, each with its dataset, period, and status — a missing reported value stays missing and is never filled from the model. Accepts a country (ISO3, e.g. KEN) or an X-coded aggregate (X01 World, regions, income groups), for which only modelled values exist.
| Name | Type | Req | Description |
|---|---|---|---|
| ref_area | string | yes | One reference area with annual data: an ISO3 country code (KEN) or an X-coded aggregate (X01 World, X06, X02); ILO_GEO_ forms accepted, case-insensitive. ilostat_list_reference topic ref_areas lists… |
| sex | string | – | SEX_T (default), SEX_M, or SEX_F; T/M/F and total/both/male/female are accepted. Indicators without a sex breakdown (labour income share) are unaffected. |
| Name | Type | Req | Description |
|---|---|---|---|
| attribution | string | – | Citation to keep with any use of the data. |
| catalog_as_of | string | – | ISO timestamp the catalog was last confirmed current. |
| error | object | – | Present when the call failed. Absent on success. |
| indicators | array | – | The headline indicators, in a fixed order. |
| modelled_cutoff_year | number | – | Latest year the modelled values could come from; later modelled years are projections. |
| notice | string | – | Which indicators have no reported value, and which of those have an ILO modelled estimate instead. |
| ref_area | object | – | The area profiled. |
| reported_missing | array | – | Keys with no reported value, including those that have no reported dataset. |
| sex | string | – | Sex code profiled. |
No examples provided.
ilostat_list_reference List ILOSTAT reference codes ~434
Decode ILOSTAT's code vocabulary: reference areas (ISO3 countries and X-coded aggregates, with World Bank income group and ILO region), the groups that area_group accepts (X01 for every country, ILO regions and subregions, World Bank income groups; exact-code lookups list their member countries), databases, subjects, sex codes, breakdown codes for classif1/classif2 with their classification types, per-country data sources, observation status flags, note codes, and frequencies. Filter by text or look up exact codes; long topics page with a cursor. These are ILOSTAT-wide vocabularies; ilostat_describe_indicator lists the sex and breakdown codes one dataset actually uses.
| Name | Type | Req | Description |
|---|---|---|---|
| classification_type | string | – | Topic classifications only: keep codes of this classification type, the code prefix (AGE, ECO, EDU, …). |
| codes | array | – | Exact codes to look up (up to 100; case-insensitive, and ILO_GEO_ forms accepted for ref_areas and area_groups). Codes the topic lacks are listed in not_found. With topic area_groups, each group foun… |
| cursor | string | – | Opaque continuation token: the previous page's next_cursor, passed unchanged. |
| filter | string | – | Text filter: every word must match a word or word prefix of the code or label (case, accents, and punctuation ignored; labor matches labour). Omit to list the whole topic. |
| limit | integer | – | Entries per page, at most 500; a larger value, up to 10,000, is applied as 500 and the notice says so. |
| ref_area | string | – | Topic sources only: list the sources of this reference area (ISO3 or X code; case-insensitive, ILO_GEO_ forms accepted). |
| topic | string | yes | Vocabulary to list: ref_areas, area_groups (the X codes area_group accepts), databases, subjects, sexes, classifications (classif1/classif2 codes), classification_types, sources, obs_status, notes, o… |
| Name | Type | Req | Description |
|---|---|---|---|
| cap | number | – | The limit applied to this page. |
| catalog_as_of | string | – | ISO timestamp the in-memory catalog was last confirmed current. |
| entries | array | – | This page of decoded codes, ordered by code — except sexes, which keep the ILOSTAT dictionary's order (SEX_T first), and frequencies, listed annual, quarterly, monthly. |
| error | object | – | Present when the call failed. Absent on success. |
| next_cursor | string | – | Pass as cursor to get the next page; absent on the last page. |
| not_found | array | – | Requested codes the topic does not contain; present only when codes missed. |
| notice | string | – | That a limit past the page cap was applied as the cap, why a filter with no searchable word was not applied, why nothing matched, that the cursor starts past the last entry, and how to reach the rema… |
| shown | number | – | Entries returned on this page. |
| topic | string | – | The topic listed. |
| total | number | – | Entries matching the filters, across all pages. |
| truncated | boolean | – | True when more entries remain beyond this page. |
No examples provided.
ilostat_query_indicator Query ILOSTAT observations ~918
Fetch observations for up to 3 ILOSTAT datasets per call, filtered by reference area or area group, sex, breakdown codes (classif1, classif2), source, and period; datasets past the first 3 come back as remaining_dataset_ids for another call. Rows keep their source, observation status, decoded notes, and a basis — reported, modelled_estimate, or projection — and the response echoes every filter applied, including the best-source default. Codes are checked against ILOSTAT's dictionaries before the request is sent: ilostat_list_reference lists valid codes and ilostat_describe_indicator lists the codes a dataset actually uses. A result larger than the inline preview is staged in full as a df_<id> dataframe for SQL through ilostat_dataframe_describe and ilostat_dataframe_query when this deployment enables dataframes. A request with no filters at all is refused when the dataset exceeds the row ceiling, and a filtered request that still exceeds it is refused with guidance to narrow it.
| Name | Type | Req | Description |
|---|---|---|---|
| area_group | string | – | X01 for every country, an ILO region or subregion, or a World Bank income group (X06, X56, X02, …); expands to its member countries, unioned with ref_areas. ilostat_list_reference topic area_groups l… |
| classif1 | array | – | Codes of the first breakdown (e.g. AGE_YTHADULT_YGE15); case-insensitive. ilostat_describe_indicator lists the codes a dataset uses. |
| classif2 | array | – | Codes of the second breakdown, for datasets that have one; case-insensitive. ilostat_describe_indicator lists them. |
| dataset_ids | array | yes | Dataset IDs, up to 100 — an indicator code plus _A, _Q, or _M (UNE_DEAP_SEX_AGE_RT_A), as ilostat_search_indicators returns them. Case-insensitive; a DF_ prefix (the SDMX dataflow form) is stripped,… |
| latest_only | boolean | – | Only each series' latest period — a series is one dataset, reference area, sex, classif1, and classif2 code — with every row at that period (one per source under source_selection all or secondary; th… |
| ref_areas | array | – | Reference areas (up to 300): ISO3 country codes (USA) or X-coded aggregates (X01 World); case-insensitive, ILO_GEO_ forms accepted. Aggregates need a dataset with has_aggregates true. Omit for every… |
| sex | array | – | Sex codes SEX_T, SEX_M, SEX_F, SEX_O; T/M/F/O and total/both/male/female/other are accepted. |
| source_selection | string | – | best (default): the preferred source per area and period; all: secondary sources too, each row flagged best_source; secondary: secondary sources only. Defaults to all when sources is set. |
| sources | array | – | Source codes (e.g. BA:453); ilostat_list_reference topic sources with ref_area lists an area's sources. Without source_selection, setting sources switches it to all, since a secondary source matches… |
| time | string | – | One exact period: YYYY (on a quarterly or monthly dataset, every period of that year), YYYYQn, or YYYYMmm; 2024-Q2, 2024 Q2, and 2025-03 are normalized. Not combinable with time_from, time_to, or lat… |
| time_from | string | – | First year (YYYY); upstream filters by year only. |
| time_to | string | – | Last year (YYYY), not before time_from. |
| Name | Type | Req | Description |
|---|---|---|---|
| applied_filters | object | – | Every parameter sent upstream, defaults included. |
| attribution | string | – | Citation to keep with any use of the data. |
| cap | number | – | Inline preview budget, in serialized characters. |
| dataframe | object | – | The staged dataframe holding the full result; present only when staged. |
| datasets | array | – | The queried datasets, in request order. |
| error | object | – | Present when the call failed. Absent on success. |
| legend | object | – | Labels for every code in rows. |
| notice | string | – | Datasets left for another call, a latest_only fallback to the latest period per area and dataset, filters that could not narrow a dataset, a unit the structure service could not supply, why nothing m… |
| remaining_dataset_ids | array | – | Requested datasets past the first 3, as canonical IDs in request order; not fetched in this call. Pass them as dataset_ids with the same filters to get them. Absent when every requested dataset was q… |
| row_count | number | – | Rows the request returned — exact unless reading stopped early at the inline preview (summary.complete false), when it counts the rows read. |
| rows | array | – | Inline preview rows; the staged dataframe holds every row when the result is larger. |
| shown | number | – | Rows returned inline. |
| summary | object | – | Summary over every row read, not just the preview. |
| truncated | boolean | – | True when reading stopped at the inline preview and more rows exist. |
No examples provided.
ilostat_search_indicators Search ILOSTAT indicators ~655
Search ILOSTAT's catalog of labour-statistics indicators by plain-language terms and filters. Each hit is one indicator with its datasets — one per available frequency (annual, quarterly, monthly) — plus breakdowns, coverage years, number of reference areas, source database, and last update; pass a dataset ID to ilostat_describe_indicator for its units and breakdown codes, then to ilostat_query_indicator or ilostat_compare_geographies for values. Every search term must match a word or word prefix in the indicator's label, subject, database, breakdown names, code, or definition; a term that matches no word or word prefix anywhere in the catalog matches the words sharing its stem instead (informality finds informal, unionization finds union, disabled finds disability), and the notice names it. female, women, male, and men (or their plurals) also match every indicator broken down by sex, and the notice names the sex filter that selects those values in ilostat_query_indicator. British and American spellings (labour/labor) match alike. The measure filter lists every indicator of one measured quantity, as ilostat_describe_indicator's related indicators count them. Facet counts reflect all applied filters.
| Name | Type | Req | Description |
|---|---|---|---|
| aggregates_only | boolean | – | Keep only datasets carrying World, regional, or income-group rows, dropping indicators with none. |
| breakdown | string | – | Classification type the indicator is broken down by, e.g. AGE, ECO, GEO, SEX; case-insensitive. ilostat_list_reference topic classification_types lists them. |
| cursor | string | – | Opaque continuation token: the previous page's next_cursor, passed unchanged. |
| database | string | – | Source database code, e.g. LFS or ILOEST (the ILO modelled estimates); case-insensitive. ilostat_list_reference topic databases lists them. |
| frequency | string | – | Keep only datasets of this frequency: A annual, Q quarterly, M monthly. Narrows each hit's datasets; an indicator with none left drops out. |
| limit | integer | – | Hits per page, at most 50; a larger value, up to 1,000, is applied as 50 and the notice says so. |
| measure | string | – | Measure code, exactly as ilostat_describe_indicator's measure.code gives it (e.g. EMP_TEMP_NB); case-insensitive. Keeps every indicator measuring that quantity, under any breakdown. |
| query | string | – | Plain-language terms, e.g. "youth unemployment" or "informal employment rate". Case, accents, and punctuation are ignored, labor matches labour, and a trailing plural s is tolerated; a term no catalo… |
| subject | string | – | Subject code, e.g. LUU (unemployment and labour underutilization); case-insensitive. ilostat_list_reference topic subjects lists them. |
| Name | Type | Req | Description |
|---|---|---|---|
| cap | number | – | The limit applied to this page. |
| catalog_as_of | string | – | ISO timestamp the searched catalog was last confirmed current. |
| error | object | – | Present when the call failed. Absent on success. |
| facets | object | – | Counts over the fully filtered match set, not just this page. |
| hits | array | – | This page of hits. With a query: tier, then more reference areas first, then code. Without: by code. |
| next_cursor | string | – | Pass as cursor to get the next page; absent on the last page. |
| notice | string | – | That a limit past the page cap was applied as the cap, why the query was browsed by filters alone, which terms were matched by stem and as which catalog words (check those hits are on topic), the sex… |
| shown | number | – | Hits returned on this page. |
| total | number | – | Indicators matched after all filters. |
| truncated | boolean | – | True when more hits remain beyond this page. |
No examples provided.
How do I install the io.github.cyanheads/ilostat-mcp-server server?
io.github.cyanheads/ilostat-mcp-server is a hosted endpoint at https://ilostat.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · ilostat.caseyjhand.com
claude mcp add --transport http cyanheads-ilostat-mcp-server 'https://ilostat.caseyjhand.com/mcp'
What is the io.github.cyanheads/ilostat-mcp-server server?
io.github.cyanheads/ilostat-mcp-server is listed in the public MCP registry as io.github.cyanheads/ilostat-mcp-server. Search ILOSTAT labour indicators, query and compare series, build country profiles, run SQL. This page covers its hosted endpoint (https://ilostat.caseyjhand.com/mcp).
Is the io.github.cyanheads/ilostat-mcp-server server safe to use?
io.github.cyanheads/ilostat-mcp-server scores 88 out of 100 on VerifyMCP. 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 io.github.cyanheads/ilostat-mcp-server server expose?
io.github.cyanheads/ilostat-mcp-server exposes 8 tools: ilostat_search_indicators, ilostat_describe_indicator, ilostat_query_indicator, ilostat_get_country_profile, ilostat_compare_geographies, and 3 more. Their descriptions and schemas cost roughly 3,853 tokens of context every time the server is loaded.
Does the io.github.cyanheads/ilostat-mcp-server server require authentication?
No. We connected to io.github.cyanheads/ilostat-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the io.github.cyanheads/ilostat-mcp-server server still maintained?
io.github.cyanheads/ilostat-mcp-server is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.