{"name":"io.github.SidneyBissoli/ilo-mcp-server","slug":"sidneybissoli-ilo-mcp-server","title":"ILO Labour Statistics (ILOSTAT): unemployment, wages, informality","description":"Labour market data from the ILO (ILOSTAT) by country, year, sex and age, with provenance.","url":"https://mcp.market/server/sidneybissoli-ilo-mcp-server","rating":null,"grade":"A","score":86,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":38,"stars":1,"forks":0,"downloads_week":310,"last_push_at":"2026-09-16T23:46:41.000Z","license":"MIT"},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/SidneyBissoli/ilo-mcp-server","website":"https://ilo.sidneybissoli.com","version":"0.6.1","remotes":[{"type":"streamable-http","url":"https://ilo.sidneybissoli.com/mcp"}],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"ilo-mcp-server","version":"0.6.1","transport":{"type":"stdio"}}],"tools":[{"name":"fetch","description":"Returns the full document for an id obtained from `search`, as { id, title, text, url, metadata }: `text` is the readable content (Markdown) and `url` the canonical public page to cite.\n\nCompanion of `search` in the OpenAI Deep Research contract, over the ILOSTAT labour statistics (≈1,200 SDMX dataflows: employment, unemployment, wages, working time, informality, SDG labour indicators) catalog. Only ids returned by `search` are valid; an unknown id returns an error.\nThe `ilo_*` tools remain the tools for data queries.\n\nBehavior: read-only and idempotent — a live GET against the public source when the document needs it.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Identifier of a document returned by `search`"}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"ilo_get_data","description":"Statistical observations from one ILOSTAT dataflow, filtered by dimension codes (filters, e.g. {\"REF_AREA\": [\"BRA\",\"ARG\"], \"SEX\": \"SEX_T\"}) and period (start_period/end_period, e.g. \"2015\"/\"2024\"). REF_AREA is required, maximum 30 areas per call — for broad panels, split areas into batches and/or paginate by period. Unfiltered dimensions return all their categories. Does not aggregate, convert or otherwise transform values (raw ILOSTAT data only), and does not search indicators (use ilo_search_indicators).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dataflow":{"type":"string","minLength":1,"description":"Dataflow id from ilo_search_indicators (e.g. \"DF_UNE_DEAP_SEX_AGE_RT\")"},"filters":{"type":"object","properties":{"REF_AREA":{"anyOf":[{"type":"string"},{"minItems":1,"type":"array","items":{"type":"string"}}],"description":"Area codes — REQUIRED, at most 30 per call (e.g. [\"BRA\",\"ARG\"]). Without them the ILO gateway times out (HTTP 504). Discover codes with ilo_list_dimension_values (dimension REF_AREA)."}},"required":["REF_AREA"],"additionalProperties":{"anyOf":[{"type":"string"},{"minItems":1,"type":"array","items":{"type":"string"}}]},"description":"Dimension id → code or list of codes (from ilo_list_dimension_values). REF_AREA is required (up to 30 area codes); any other dimension is optional and, left out, returns all of its categories."},"start_period":{"description":"First period, e.g. \"2015\"","type":"string","minLength":1},"end_period":{"description":"Last period, e.g. \"2024\"","type":"string","minLength":1},"last_n_observations":{"description":"Alternative to periods: only the latest N observations per series","type":"integer","minimum":1,"maximum":100},"provenance_mode":{"description":"Provenance verbosity: 'concise' (default — source, url, vintage, retrieval date, citation, license) or 'detailed' (full canonical block with dataset, dimension key and notices)","type":"string","enum":["concise","detailed"]}},"required":["dataflow","filters"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"ilo_get_indicator_metadata","description":"Structure of one ILOSTAT dataflow: dimensions (in SDMX key order), their codelists, the time dimension, the source's default selection and the data vintage (last update at the ILO). Use before ilo_get_data to know which filters exist. Does not return statistical values and does not list the codes themselves (use ilo_list_dimension_values).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"dataflow":{"type":"string","minLength":1,"description":"Dataflow id from ilo_search_indicators (e.g. \"DF_UNE_DEAP_SEX_AGE_RT\")"},"provenance_mode":{"description":"Provenance verbosity: 'concise' (default — source, url, vintage, retrieval date, citation, license) or 'detailed' (full canonical block with dataset, dimension key and notices)","type":"string","enum":["concise","detailed"]}},"required":["dataflow"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"ilo_list_dimension_values","description":"Valid codes (id + label) of one dimension of an ILOSTAT dataflow — e.g. the country/area codes of REF_AREA (ISO 3166-1 alpha-3 such as BRA, plus X-codes for aggregates such as X01 World) or the categories of SEX (SEX_T/SEX_M/SEX_F) and AGE. Use `search` to resolve a name to a code (e.g. search \"Brazil\") instead of paging through hundreds of codes; codelists are shared across dataflows, so a code found here is valid wherever the same codelist is used. Use to build correct ilo_get_data filters. Does not return statistical values, does not say which codes actually have data for a given dataflow, and is not applicable to the time dimension (filter it via start_period/end_period in ilo_get_data).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dataflow":{"type":"string","minLength":1,"description":"Dataflow id the dimension belongs to"},"dimension":{"type":"string","minLength":1,"description":"Dimension id from ilo_get_indicator_metadata (e.g. \"REF_AREA\", \"SEX\")"},"search":{"description":"Case-insensitive filter on code id or label","type":"string","minLength":1},"limit":{"description":"Maximum codes returned (default 200)","type":"integer","minimum":1,"maximum":500},"offset":{"description":"Codes to skip, for pagination (default 0)","type":"integer","minimum":0,"maximum":9007199254740991},"provenance_mode":{"description":"Provenance verbosity: 'concise' (default — source, url, vintage, retrieval date, citation, license) or 'detailed' (full canonical block with dataset, dimension key and notices)","type":"string","enum":["concise","detailed"]}},"required":["dataflow","dimension"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"ilo_search_indicators","description":"Search the ILOSTAT catalogue of ~1,200 indicator dataflows by keywords in the name or id (e.g. \"unemployment rate sex age\"). All terms must match (AND, case-insensitive), so start with 2–3 English words and drop terms if you get 0 results. Everyday and US wording is resolved to the ILO's own (labor→labour, wages/salary→earnings, informality→informal, gender→sex, productivity→output per worker); when that happens the response says so in vocabulary_notes. Results are ranked by ILO relevance weight, not by match count. Reading the id tells you the shape: suffix _RT = rate/ratio, _NB = number (usually thousands); dataflows whose second token starts with 2 (e.g. DF_UNE_2EAP_…) are ILO modelled estimates with full country/year coverage, the others are reported national data. Returns dataflow ids to use with ilo_get_data / ilo_get_indicator_metadata. Searches the local catalogue only — it does not return statistical values (use ilo_get_data), does not search dimension codes such as countries (use ilo_list_dimension_values) and does not cover non-ILO sources.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"description":"Keywords, matched against dataflow name and id (AND between terms)"},"limit":{"description":"Maximum results (default 20)","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Results to skip, for pagination (default 0)","type":"integer","minimum":0,"maximum":9007199254740991},"provenance_mode":{"description":"Provenance verbosity: 'concise' (default — source, url, vintage, retrieval date, citation, license) or 'detailed' (full canonical block with dataset, dimension key and notices)","type":"string","enum":["concise","detailed"]}},"required":["query"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"search","description":"Searches the ILOSTAT labour statistics (≈1,200 SDMX dataflows: employment, unemployment, wages, working time, informality, SDG labour indicators) catalog and returns up to 10 matching documents as { id, title, url }, ordered by relevance (an empty list means nothing matched).\n\nThis tool exists for the OpenAI Deep Research contract: ChatGPT deep research, company knowledge and research workflows over the Responses API require exactly the tools `search` and `fetch`. Pass one of the returned ids to `fetch` to read the document.\nFor direct questions and for data (values, series, rankings) prefer the `ilo_*` tools, which return the actual data with provenance — this is a catalog index, not a data query.\n\nQuery: natural language or keywords, Portuguese or English; accents and case are ignored.\n\nBehavior: read-only and idempotent — the catalog comes from the public source and is cached in memory.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"type":"string","description":"Search terms, natural language or keywords (accents and case are ignored)"}},"required":["query"],"$schema":"https://json-schema.org/draft/2020-12/schema"}}],"scan":{"score":86,"grade":"A","scanned_at":"2026-09-19T09:55:44.394Z","report":{"scannerVersion":"0.1.3","scannedAt":"2026-09-19T09:55:44.323Z","components":{"code":{"score":25,"max":25,"notes":["27 source files scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 620ms"]},"poisoning":{"score":15,"max":15,"notes":["6 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 1 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 2 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://ilo.sidneybissoli.com/mcp","reachable":true,"authRequired":false,"latencyMs":620,"serverInfo":{"name":"ilo-mcp-server","version":"0.6.1"}}],"packages":[{"registryType":"npm","identifier":"ilo-mcp-server","version":"0.6.1","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":4,"publishedAt":"2026-09-16T23:47:23.083Z","repositoryUrl":"git+https://github.com/SidneyBissoli/ilo-mcp-server.git","weeklyDownloads":310}],"repo":{"found":true,"owner":"SidneyBissoli","repo":"ilo-mcp-server","archived":false,"pushedAt":"2026-09-16T23:46:41Z","stars":1,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/66520599?v=4","ownerCreatedAt":"2020-06-06T13:10:18Z","license":"MIT"},"icon":{"url":"https://ilo.sidneybissoli.com/icon.png","source":"registry","width":512,"height":512},"presence":{"stars":1,"forks":0,"downloadsWeek":310,"license":"MIT","lastPushAt":"2026-09-16T23:46:41.000Z","score":38}}}},"grade_history":[],"reviews":[]}