seco-labor-mcp
This server provides MCP tools to query Swiss labor market statistics (unemployment, job seekers, open positions, youth unemployment, occupational breakdowns, and UVG occupational accident data) from public sources without an API key.
Search and retrieve labor-market datasets from opendata.swiss (with publisher attribution)
Get national annual registered unemployment and job-seeker series (SECO figures via BFS)
Get cantonal unemployment for TG, FR, ZG, ZH; youth unemployment for TG (count) and ZG (rate)
Fetch SECO monthly press report PDF URLs
List all 26 Swiss canton codes and names
Get UVG occupational accident/disease key figures, branch-level results by NOGA, and ten-year trends with significance flags
Request results in markdown or JSON format
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@seco-labor-mcpshow youth unemployment in Bern"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
π¨π Part of the Swiss Public Data MCP Portfolio
SECO Labor Market MCP Server
π English | Deutsch
An MCP (Model Context Protocol) server for Swiss labor market data from SECO (Staatssekretariat fΓΌr Wirtschaft) and AMSTAT via opendata.swiss.
Overview
This server connects AI models to Swiss labor market statistics β unemployment rates, job seekers, open positions, youth unemployment, and occupational breakdowns β all without requiring an API key.
Primary audiences:
π« Schulamt / Education planning β youth unemployment, vocational guidance data
π Research & analysis β labor market trends, cantonal comparisons
π€ AI agents β automated labor market monitoring and reporting
Anchor query:
"Welche Berufsgruppen haben im Kanton ZΓΌrich die hΓΆchste Jugendarbeitslosigkeit, und welche Lehrberufe unterliegen der Stellenmeldepflicht?"
β More use cases by audience β
Related MCP server: mcp-sbb-transport
Data Sources (Phase 1 β No Auth Required)
Source | Description | Status |
CKAN catalogue; the pinned BFS table | β Live | |
Monthly press reports (PDF, structured URL pattern) | β Live | |
AMSTAT reference portal | β οΈ JavaScript SPA, no public REST API | |
Unfallstatistik UVG (SSUV/KSUV c/o Suva) β occupational accidents and diseases | β οΈ PDF only, no API (see below) |
Architecture
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β seco-labor-mcp β
β β
β βββββββββββββββ ββββββββββββββββββββββββββββ β
β β FastMCP β β 9 MCP Tools β β
β β Server βββββΊβ seco_search_datasets β β
β β (stdio / β β seco_get_dataset β β
β β HTTP) β β seco_get_unemployment_* β β
β βββββββββββββββ β seco_get_youth_* β β
β β β seco_get_job_seekers β β
β βΌ β seco_get_open_positions β β
β βββββββββββββββ β seco_get_monthly_url β β
β β httpx β β seco_list_cantons β β
β β async β ββββββββββββββββββββββββββββ β
β ββββββββ¬βββββββ β
βββββββββββΌββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββ
β opendata.swiss CKAN API β
β https://opendata.swiss/api/3/ β
β action/package_search β
β action/package_show β
βββββββββββββ¬ββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββ
β SECO Data Resources β
β CSV / XLSX / PDF Downloads β
β (monthly labor market data) β
βββββββββββββββββββββββββββββββββββββWhere the figures come from β and what is missing
SECO is no longer a publisher on opendata.swiss. Verified 2026-08-14:
organization_show returns 404, and none of the 176 entries in
organization_list is SECO. Until then the server filtered every search on
that organisation and therefore returned nothing β a name lookup that
misses looks exactly like an empty search.
The registered unemployed and job seekers are still SECO's figures: the BFS
publishes them in table T3.3.0.1 and names SECO in the footer. The server
reads that table through a pinned dataset id (sources.py), checked
against the live source by a live test.
Series | 2000 | 2025 |
Registered job seekers (SECO) | 124.6 | 214.1 |
Registered unemployed (SECO) | 72.0 | 133.7 |
ILO unemployed (BFS) | 126.5 | 248.5 |
thousands, annual average
The three series do not measure the same thing: in 2000 the ILO figure is 1.76Γ the registered one. The server reports them separately and labelled, and never converts one into the other.
The cantonal layer: four cantons, four schemas
There is no national monthly series β but four cantons publish their own
RAV figures, each in its own portal with its own column names. For those,
seco_get_unemployment_overview(canton=β¦) returns real values:
Canton | Granularity | from | Level | Note |
TG | monthly | 2016-01 | canton | only series by age class β youth unemployment as a count |
FR | monthly | 2004-01 | canton and Switzerland | carries the national monthly figure as a comparison row |
ZG | monthly | 1993-01 | canton | youth unemployment only as a rate, not a count |
ZH | annual | 1991 | municipality | no monthly values; districts and regions sit in the same column as municipalities and are separated out |
The other 22 cantons get a named refusal β no figure from another canton and no national aggregate. Partial coverage that feels complete is worse than none.
The four series are not comparable with each other and do not add up to a Swiss figure: different time axes, different geographic levels, and in ZG's case a rate rather than a count.
Still not available: unemployment by occupational group, open positions as a national series, and youth unemployment for Switzerland or for 24 of the 26 cantons. The affected tools say so and return no substitute figure. These values exist interactively on amstat.ch, which offers no interface a server could call.
Tools
Tool | Description | Key Use Case |
| Search labour-market datasets on opendata.swiss (publisher shown per hit) | Discovery |
| Full metadata + download links for a dataset | Data access |
| Registered unemployed: national annual, cantonal for TG/FR/ZG/ZH | Labor market overview |
| Youth unemployment (15β24) β TG (count) and ZG (rate) only | π Berufswahlberatung |
| Registered job seekers, national, annual series from 2000 | Training demand |
| Open positions β no national series available | Sector analysis |
| Breakdown by Berufshauptgruppe β no machine-readable source | π Vocational guidance |
| Generate/verify PDF report URL | Source access |
| All 26 canton codes and names | Utility |
| UVG key figures on occupational accidents and diseases | Risk overview |
| Results per NOGA 2008 economic branch | π Vocational guidance |
| Ten-year accident time series per branch | Trend analysis |
12 of a maximum of 15 tools.
Unfallstatistik UVG (SSUV)
The three seco_get_uvg_* tools cover the risk side of the same labour market
the unemployment tools describe: how many occupational accidents and diseases
occur per branch, and how that develops over ten years.
The publisher is not SECO. The Unfallstatistik UVG is issued by the
Koordinationsgruppe KSUV and the Sammelstelle SSUV c/o Suva, Lucerne. The
seco_ prefix addresses this server, not the source; every response names the
actual publisher in its source field.
Architecture decision: C (dump-first)
Verified live on 2026-08-05, full write-up in
PROBE_REPORT_UVG.md.
The source has no API. A link scan across every data page returned 165 PDFs
and zero files with .csv, .xlsx or .json. opendata.swiss does not list the
source at all (count=0 for six of seven search terms), and the BFS dam-api
silently ignores its filter parameters. What remains is machine-readable in
practice but not by design:
Access | Format | Refresh |
| HTML table, 5 years, Switzerland-wide | annually |
| annual edition, tables 1.2 and 2.4 by NOGA | annually, June |
| ten-year series per NOGA division | annually, January |
PDFs are cached for 24 h and fetched with 2s/4s/8s backoff.
What every response tells you
source_freshness.data_yearβ the data year, not the edition year. The 2026 edition reports 2024; that two-year lag is stated, not buried.totals_checkβ parsed rows are summed and compared against the total printed in the same publication. A broken layout shows up here instead of becoming a plausible wrong number.significantβ the source marks statistically significant year-on-year changes with an asterisk. That flag is preserved per data point, so a change is only reported as significant where the source says so.
Installation
Claude Desktop (stdio)
Add to claude_desktop_config.json:
{
"mcpServers": {
"seco-labor": {
"command": "uvx",
"args": ["seco-labor-mcp"]
}
}
}Cloud / HTTP
pip install seco-labor-mcp
MCP_TRANSPORT=http PORT=8000 seco-labor-mcphttp is the transport to use. It is the only one that can carry the modern
protocol era: measured against this server object, http negotiates
2026-07-28 while sse caps every client at 2025-11-25, even a
client that offers the modern era. sse and streamable-http remain accepted
for existing deployments β tests/test_transport_aera.py runs both and records
which era each one actually yields.
The HTTP server binds to 127.0.0.1 (loopback) by default to prevent
NeighborJack on shared networks. For container deployments where you actually
need to accept traffic from outside the container, set HOST=0.0.0.0
explicitly β ideally in your Dockerfile / orchestrator config, and only behind
an upstream proxy or firewall:
HOST=0.0.0.0 MCP_TRANSPORT=http PORT=8000 seco-labor-mcp # container onlyAn unknown MCP_TRANSPORT value now exits with an error. It used to fall back
to stdio silently, so a typo produced a server that simply never appeared on
the expected port.
Development
git clone https://github.com/malkreide/seco-labor-mcp.git
cd seco-labor-mcp
pip install -e ".[dev]"
pytest tests/ -m "not live" -vUsage Examples
Search for youth unemployment data
Tool: seco_search_datasets
Input: { "query": "Jugendarbeitslosigkeit Alter", "limit": 5 }Get cantonal unemployment for ZΓΌrich
Tool: seco_get_unemployment_overview
Input: { "canton": "ZH", "response_format": "markdown" }Get monthly report URL
Tool: seco_get_monthly_report_url
Input: { "year": 2026, "month": 2, "language": "de" }Key Concepts
Arbeitslose vs. Stellensuchende
EselsbrΓΌcke: Arbeitslose β Stellensuchende β Arbeitslose sind eine Teilmenge.
Term | Definition | Dec 2025 |
Arbeitslose | RAV-registered, immediately available | ~149'000 (3.2%) |
Stellensuchende | All RAV-registered (incl. training programs) | ~233'900 |
Youth Unemployment Seasonality
July/August: Sharp increase (school leavers without placements)
September/October: Decline (apprenticeship starts)
The residual that remains after the autumn decline signals structural need for bridge programs (BrΓΌckenangebote)
Stellenmeldepflicht (since 2020)
Occupations with β₯5% unemployment rate must be reported to the RAV before posting publicly. The list changes annually. This is directly relevant for vocational counseling β these professions have highest availability for Swiss job seekers.
Portfolio Synergies
Server | Synergy |
| BFS population/employment data for deeper context |
| City of Zurich-level education and social data |
| Economic context (GDP, wages) for labor market interpretation |
| ALV (Arbeitslosenversicherung) legislative framework |
Known Limitations
amstat.arbeit.swisshas no public REST API (JavaScript SPA) β workaround via CKANOccupational/sectoral detail requires CSV download from SECO resources
Monthly press report URL patterns may vary for older reports
Cantonal sub-municipal data not available at this level
UVG figures come from PDF parsing β the layout was stable across the 2025 and 2026 editions, but a redesign can break it. The
totals_checkin every response is what makes such a break visible rather than silent.UVG data lags roughly two years (the 2026 edition reports 2024)
UVG branch detail follows NOGA 2008 and groups some divisions (
41 β 42,77, 79 β 82); there is no cantonal breakdown at this levelDetailed UVG data beyond the publications sits behind the SSUV closed user group and is out of scope for this no-auth server
Phase 2 roadmap:
Automatic CSV caching with 24h TTL
Direct XLSX parsing for cantonal breakdowns
Integration with
zh-education-mcpfor Schulamt-specific correlations
Data License
Two different licences apply β the code of this server is MIT either way, but the data is not covered by it.
SECO / AMSTAT data published on opendata.swiss is under Creative Commons CCZero (public domain). Source: Staatssekretariat fΓΌr Wirtschaft (SECO) β seco.admin.ch
Unfallstatistik UVG data is not openly licensed. The publication states:
Β«Abdruck β ausser fΓΌr kommerzielle Nutzung β mit Quellenangabe gestattet.Β» (Reproduction permitted, except for commercial use, with attribution.)
That is a non-commercial restriction with an attribution requirement. It belongs
to KSUV/SSUV and cannot be lifted by this repository's MIT licence: the MIT terms
cover the code, not the figures the code retrieves. If you use this server
commercially, the UVG tools are not covered β clarify directly with the
Sammelstelle (unfallstatistik@suva.ch). Every UVG response repeats this
restriction in its source field, because a README is not passed to the model.
Safety & Limits
Aspect | Details |
Access | Read-only ( |
Personal data | No personal data β all sources are aggregated, anonymous public statistics |
Rate limits | No enforced external limits; server caps queries at 20 results by default; 30 s HTTP timeout |
Authentication | No API keys required β opendata.swiss and arbeit.swiss are publicly accessible |
Licenses | SECO data under Creative Commons CCZero (public domain) |
Terms of Service | Subject to ToS of: opendata.swiss, SECO, arbeit.swiss |
GDPR / DSG | Fully compliant β no personal data transmitted or stored; all data is official public statistics |
MCP Protocol Version
This server serves two protocol eras over the same server object, on
fastmcp 4.x / mcp 2.x:
Era | Revision | Shape |
Modern |
| no handshake β |
Handshake |
|
|
A client that offers the modern era gets it; a client that only knows the
handshake era still gets served. Both are pinned separately in
tests/test_protokoll_aeren.py, and both are measured β the test negotiates
a real connection against this server object rather than comparing two
constants.
Pinning only LATEST_PROTOCOL_VERSION would not be enough: in mcp 2.x that
name is an alias for the modern era, so it would leave the handshake ceiling
free to move β and that ceiling is what most clients in the field actually
speak.
Until 0.4.0 this server ran fastmcp 3.x, which pins mcp 1.x. There
2025-11-25 is the highest revision the SDK knows at all, so 2026-07-28 was
not partially supported β it was absent. The test that used to guard the
one-era state now guards its opposite: it fails if a downgrade takes the
modern era away again.
Note for anything reading server metadata: on a modern connection there is no
InitializeResult. Use the era-neutral protocol_version / server_info
instead of initialize_result.
Contributing
See CONTRIBUTING.md for development guidelines.
Security
See SECURITY.md for the security posture and how to report a vulnerability.
License
Released under the MIT License β Copyright Β© 2026 Hayal Oezkan.
Author
Hayal Oezkan Β· github.com/malkreide
Installation
Run via uv's uvx β no clone or manual install needed. Add to your MCP client config (mcpServers for Claude Desktop, Cursor and Windsurf; use a top-level servers key for VS Code in .vscode/mcp.json):
{
"mcpServers": {
"seco-labor-mcp": {
"command": "uvx",
"args": [
"seco-labor-mcp"
]
}
}
}Available Tools
12 toolsseco_get_datasetSECO-Datensatz-Details abrufenARead-onlyIdempotent
Fetch full details and download links for a specific SECO dataset.
Use this after seco_search_datasets to get complete metadata and all resource download URLs for a dataset.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Contains: - dataset_id (str): Dataset ID/slug from opendata.swiss - response_format (str): 'markdown' or 'json' |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, readOnlyHint=true, and destructiveHint=false. The description adds that it returns 'full details' and 'download links', which are useful output traits. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no redundancy. The first sentence clearly states the purpose, and the second provides usage guidance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to detail return values. It covers the tool's purpose and usage context sufficiently. Slight gap: what constitutes 'full details' could be elaborated, but the output schema handles that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by clarifying that dataset_id must be obtained from seco_search_datasets first, which is beyond the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Fetch' and the resource 'full details and download links for a specific SECO dataset'. It distinguishes this tool from siblings by specifying it should be used after seco_search_datasets, which retrieves a single dataset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to use this tool after seco_search_datasets, providing clear context for when it should be invoked. This guidance helps the agent decide between this and sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seco_get_job_seekersStellensuchende SchweizARead-only
Registrierte Stellensuchende β SECO-Zahlen, publiziert vom BFS.
Stellensuchende ist die weitere Kategorie: sie schliesst Personen in Umschulung, BeschΓ€ftigungsprogrammen und anderen ALV-Massnahmen ein, die nicht als arbeitslos gezΓ€hlt werden. Der Abstand zwischen beiden Reihen ist die eigentliche Aussage β er sagt, wie viele Menschen das System gerade begleitet, ohne dass sie in der Arbeitslosenquote auftauchen.
Dieselbe Tabelle wie seco_get_unemployment_overview (BFS T3.3.0.1),
Jahresdurchschnitte ab 2000, national. Kantonale und monatliche Werte gibt
es dort nicht; canton bekommt deshalb eine Absage statt einer nationalen
Zahl im kantonalen Gewand.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Contains: - canton (Optional[str]): wird abgelehnt, siehe oben. - response_format (str): 'markdown' oder 'json' |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Die Annotationen decken readOnly und destructive bereits ab; die Beschreibung ergΓ€nzt darΓΌber hinaus nΓΌtzliches Verhalten: nationale Aggregation, Jahresdurchschnitt ab 2000 und die Ablehnung des canton-Parameters statt stillschweigender nationaler Werte. Details zu Fehlermeldungen oder Authentifizierung fehlen, sind aber durch Annotationen und Schema teilweise abgedeckt.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Die Beschreibung ist klar strukturiert: Titelzeile, konzeptionelle Abgrenzung, technischer Geltungsbereich. Sie ist etwas lΓ€nger als eine reine Funktionsbeschreibung, aber der konzeptionelle Absatz trΓ€gt zur Unterscheidung vom Geschwister-Tool bei. Die invokationsrelevanteste Aussage zur canton-Ablehnung steht erst am Ende.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Da ein Output-Schema vorhanden ist und die Parameter im Schema vollstΓ€ndig beschrieben sind, muss die Beschreibung nur Verhalten und Kontext ergΓ€nzen. Das tut sie mit Quelle, Zeitraum, Aggregationsebene, nationaler BeschrΓ€nkung und Parameter-Ablehnung. Ein Agent kann das Tool korrekt aufrufen und weiss, welche Anfragen abgelehnt werden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Das Schema beschreibt beide Parameter bereits vollstΓ€ndig, daher liegt die Basis bei 3. Die Beschreibung fΓΌgt echten Mehrwert hinzu, indem sie erklΓ€rt, warum canton abgelehnt wird und dass die Daten nur national verfΓΌgbar sind. response_format wird zwar nur im Schema erklΓ€rt, aber bei 100% Schema-Abdeckung ist das ausreichend.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Die Beschreibung macht deutlich, dass das Tool registrierte Stellensuchende (SECO/BFS) betrifft und grenzt diesen Begriff explizit von der Arbeitslosenkategorie ab. Auch der Verweis auf dieselbe Tabelle wie seco_get_unemployment_overview hilft bei der Einordnung, aber ein explizites Verb wie 'liefert' oder 'gibt zurΓΌck' fehlt.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Der Text nennt die konkrete EinschrΓ€nkung: Jahresdurchschnitte, national, keine kantonalen oder monatlichen Werte, und erklΓ€rt, dass ein ΓΌbergebener canton-Parameter abgelehnt wird. Das grenzt die Nutzung klar vom Geschwister-Tool ab, auch wenn keine explizite 'benutze dies, wenn...'-Formulierung vorkommt.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seco_get_monthly_report_urlSECO Monatsbericht-URL generierenARead-onlyIdempotent
Generate and validate URL for SECO monthly labor market press report.
SECO publishes monthly press documentation 'Die Lage auf dem Arbeitsmarkt' as PDF. This tool constructs the URL for a specific month/year and verifies availability.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Contains: - year (int): Report year (e.g. 2025, 2026) - month (int): Report month (1-12) - language (str): 'de', 'fr', or 'it' |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the safety profile is clear. The description adds that the tool also verifies availability (a behavioral trait beyond read-only URL generation), which provides useful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences followed by a short paragraph. The main purpose is front-loaded in the first sentence. Every sentence adds value with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the presence of an output schema (not shown but indicated), the description sufficiently explains the tool's function. It covers the purpose, the construction logic, and the verification step, making it complete for an agent to understand when and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage with clear constraints (year range, month range, language pattern). The description adds the context that the tool constructs a URL for a specific month/year and verifies availability, going beyond the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool generates and validates a URL for SECO's monthly labor market press report. It specifies the exact resource (monthly press report PDF URL) and verb (generate and validate), and is distinct from sibling tools that handle datasets or job seekers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for constructing URLs for specific months/years and verifying availability, but it does not explicitly state when to use it versus sibling tools like seco_get_dataset or seco_get_unemployment_overview. No exclusionary guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seco_get_open_positionsOffene Stellen Schweiz (SECO)ARead-only
Get open job positions (Offene Stellen) statistics from SECO/AMSTAT.
Open positions data is a leading indicator for labor market demand β relevant for identifying which professions/sectors to emphasize in vocational guidance and which Lehrberufe are in high demand.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Contains: - response_format (str): 'markdown' or 'json' |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false. Description adds context about being a leading indicator, but no additional behavioral traits beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states function, second adds relevant context. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple parameter set and presence of output schema, the description adequately covers what the tool does and its relevance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and description does not add new meaning to parameters. The single parameter 'response_format' is already described in schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Get open job positions statistics from SECO/AMSTAT', specifying the verb and resource. It distinguishes from siblings like 'seco_get_job_seekers' and 'seco_get_unemployment_by_occupation'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context for when to use the tool: for identifying professions/sectors in high demand for vocational guidance. While it doesn't explicitly exclude alternatives, the sibling tools cover different metrics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seco_get_unemployment_by_occupationArbeitslosigkeit nach BerufsgruppeARead-only
Get unemployment statistics broken down by occupation/profession (Berufshauptgruppe).
This is the most directly relevant tool for Berufswahlberatung β it shows which professions have high unemployment rates, which sectors are declining, and which Lehrberufe lead to stable employment outcomes.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Contains: - response_format (str): 'markdown' for human-readable, 'json' for structured data. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false. The description adds beyond this by explaining what specific statistics it returns (high unemployment rates, declining sectors, stable outcomes). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first directly states purpose, second adds context and use-case. No wasted words, every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (one parameter, output schema exists, annotations present), the description is complete enough. It explains the purpose and relevance adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with both parameters documented. The description does not add additional parameter semantics beyond what the schema provides, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get unemployment statistics broken down by occupation/profession'. It uses a specific verb and resource, and distinguishes itself from siblings by directly linking to Berufswahlberatung (career counseling) and listing specific insights it provides.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states that this tool is 'the most directly relevant tool for Berufswahlberatung' and gives examples of its use. It provides clear context but does not explicitly state when not to use it or provide alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seco_get_unemployment_overviewAktuelle Arbeitslosigkeit SchweizARead-only
Registrierte Arbeitslose der Schweiz β SECO-Zahlen, publiziert vom BFS.
Liefert die Jahresreihe der registrierten Arbeitslosen (Jahresdurchschnitt,
2000 bis heute) aus der BFS-Tabelle T3.3.0.1. Die Zahlen stammen aus
SECOs RAV-System; das BFS verΓΆffentlicht sie und nennt SECO als Quelle.
Was dieses Werkzeug nicht liefert: monatliche Werte und kantonale
AufschlΓΌsselungen. Beide gibt es auf opendata.swiss nicht in
maschinenlesbarer Form β geprΓΌft am 2026-08-14 ΓΌber den ganzen Bestand.
Wer sie braucht, findet sie interaktiv auf amstat.ch. Eine Abfrage mit
canton bekommt deshalb eine Absage und keine national aggregierte Zahl,
die so aussieht, als wΓ€re sie kantonal.
Nicht mit der ILO-Erwerbslosigkeit verwechseln. Dieselbe Tabelle fΓΌhrt beide Reihen; die ILO-Zahl lag im Jahr 2000 um 76 Prozent hΓΆher. Das Werkzeug gibt beide aus und beschriftet sie, statt sie zu vermischen.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Contains: - canton (Optional[str]): wird abgelehnt, siehe oben. - year (Optional[int]): Jahr der Reihe. None = jΓΌngstes verfΓΌgbares. - response_format (str): 'markdown' oder 'json' |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely valuable behavior: a canton query is rejected with a refusal rather than a misleading national aggregate, and the tool outputs both SECO and ILO series labeled separately rather than mixing them. This contextualizes the data lineage (BFS publishes, SECO sources) beyond what structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then exclusions, then the ILO caveat. Well-organized with bold section breaks. Slightly long but every section earns its place given the rejection behavior and dual-series nuance; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and the complex canton-refusal behavior fully explained, nothing an agent needs to call this correctly is missing. Covers source, scope, exclusions, and the labeling of the two series.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% β all three params are documented in the schema. The description adds real value by reinforcing that canton is rejected outright and that year=None returns the latest available data, which clarifies the intent behind the nullable types beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States precisely what it delivers: the annual series of registered unemployed (yearly average, 2000 to today) from BFS table T3.3.0.1. Explicitly differentiates from siblings by naming what it does NOT provide β monthly values and cantonal breakdowns β and flags the SECO-vs-ILO distinction, so an agent can separate it from seco_get_monthly_report_url and seco_get_youth_unemployment 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context (annual national series) and explicit exclusions (monthly, cantonal β both get a refusal). Points to amstat.ch as the interactive fallback. It stops short of naming sibling tools like seco_get_monthly_report_url as direct alternatives, but the exclusion guidance is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seco_get_uvg_by_branchBerufsunfΓ€lle nach Wirtschaftszweig NOGA (UVG/SSUV)ARead-onlyIdempotent
Occupational accident and disease results per economic branch (NOGA 2008).
Answers which branches carry which accident risk β the counterpart to seco_get_unemployment_by_occupation for vocational guidance: a Lehrberuf recommendation can weigh demand against occupational risk.
Every response carries a totals check: the parsed rows are summed and compared against the total printed in the publication.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | noga, table, response_format |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the operation as read-only, idempotent, and non-destructive. The description adds a meaningful behavioral detail beyond the annotations: every response carries a totals check where parsed rows are summed and compared against the publication total. This gives the agent useful integrity context not present in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: scope first, then purpose/use case, then a behavioral guarantee. Every sentence earns its place, with no repetition of the title or redundant fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The input schema is highly detailed and an output schema is present, so the description rightly focuses on purpose, use case, and the totals-check behavior. There are no critical gaps for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description itself contains no parameter-specific guidance, but the input schema has 100% coverage with rich descriptions for noga, table, and response_format, including examples and grouping semantics. This meets the high-coverage baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource β occupational accident and disease results per economic branch (NOGA 2008) β and states the analytical purpose: answering which branches carry which accident risk. The branch-level focus clearly separates it from overview and trend siblings, and the counterpart mention anchors it in vocational guidance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete use case: pair demand from seco_get_unemployment_by_occupation with occupational risk when making a Lehrberuf recommendation. It does not explicitly say when not to use it versus the other UGV tools, but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seco_get_uvg_overviewBerufsunfΓ€lle und Berufskrankheiten β SchlΓΌsselzahlen (UVG/SSUV)ARead-onlyIdempotent
Switzerland-wide key figures on occupational accidents and diseases (UVG).
Covers all 22 Swiss accident insurers: registered and accepted cases, accepted occupational diseases, disability pensions, fatalities and costs over the five most recent years.
Published by KSUV/SSUV c/o Suva β not by SECO. Complements the unemployment tools of this server: same labour market, risk side instead of demand side.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | years, include_non_occupational, response_format |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful context beyond the annotations by stating that the data is published by KSUV/SSUV c/o Suva rather than SECO, and by specifying the all-insurer, five-year scope. It does not disclose further operational behavior such as update cadence or data freshness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no wasted words. The first sentence states what is returned, the second details scope and metrics, and the third adds source and positioning. Key information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists and annotations cover safety and idempotence, the description is largely complete for calling the tool correctly: it supplies the source, geographic scope, insurer coverage, time window, and relation to the server's unemployment tools. An explicit pointer to the UVG branch/trend sibling tools would improve completeness but is not essential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already fully documents the three parameters: years (with min, max, default), response_format (enum with default), and include_non_occupational (with default and explanatory note). The description adds no parameter-specific semantics beyond broad scope context, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool returns Switzerland-wide key figures on occupational accidents and diseases, enumerates the specific metrics (registered/accepted cases, occupational diseases, pensions, fatalities, costs) and fixes the scope (22 insurers, five recent years). It does not explicitly distinguish itself from seco_get_uvg_by_branch or seco_get_uvg_trends, though the 'overview' and 'all 22 insurers' framing implies the difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: it complements the unemployment tools on the same server and covers the risk side of the labour market rather than the demand side. It does not explicitly state when not to use it or name alternatives such as the branch or trend UVG tools, stopping short of a full exclusion-based guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seco_get_uvg_trendsUnfallgeschehen Zeitreihe nach Branche (UVG/SSUV)ARead-onlyIdempotent
Ten-year time series of accident indicators for one NOGA branch.
Twelve indicators per branch, among them case risk per 1000 full-time equivalents, occupational diseases per 100'000, severe accidents, disability pensions and fatalities.
Each data point carries a significant flag: the source marks statistically
significant year-on-year changes with an asterisk. Report a change as
significant only where that flag is set.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | noga, branch_type, indicator, response_format |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering safety and side effects. The description adds valuable behavioral context by disclosing that each data point carries a 'significant' flag and instructing to report significance only when that flag is set, which prevents misinterpretation. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is five sentences, front-loaded with the primary purpose ('Ten-year time series of accident indicators for one NOGA branch'), then the indicator list, then the significance caveat. Every sentence adds unique information; there is no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The combination of the description, comprehensive input schema (100% coverage), and annotations is sufficient for an agent to call the tool correctly and interpret results. The description explains data content and significance, the schema covers parameter syntax, and an output schema exists to define the return structure. Minor gaps like explicit usage guidance vs the annual table remain, but they are not essential for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add parameter-specific semantics beyond the schema; the schema already documents noga constraints, indicator matching behavior, branch_type meaning, and response_format. The description's mention of the twelve indicators and significance flag concerns output semantics, not parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides a ten-year time series of accident indicators for one NOGA branch, and lists the indicators (e.g., case risk per 1000 full-time equivalents, occupational diseases, severe accidents). It does not explicitly name or contrast sibling tools such as seco_get_uvg_by_branch, so the differentiation is implied by the temporal scope rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for time-series trend queries by branch, but it never explicitly says when to use this tool versus the annual table (seco_get_uvg_by_branch) or the overview. No exclusion criteria are given in the description text; the only relevant hint ('Ranges such as 41 - 42 exist only in the annual table') appears in the schema's noga field, not in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seco_get_youth_unemploymentJugendarbeitslosigkeit SchweizBRead-only
Jugendarbeitslosigkeit (15β24) β national keine Quelle, in zwei Kantonen schon.
National liefert dieses Werkzeug keine Zahlen. Eine Suche ΓΌber den ganzen Bestand von opendata.swiss nach Β«JugendarbeitslosigkeitΒ» ergab am 2026-08-14 null DatensΓ€tze. SECO erhebt die Zahl und zeigt sie auf amstat.ch, verΓΆffentlicht sie aber nicht als Datei.
Zwei Kantone publizieren sie, und zwar in unterschiedlicher Form:
TG als Anzahl registrierter Arbeitsloser und Stellensuchender der Altersklasse 15β24, monatlich seit 2016.
ZG als Quote, monatlich seit 1993.
Eine Anzahl und eine Quote sind nicht ineinander umrechenbar, solange die BezugsgrΓΆsse fehlt. Das Werkzeug gibt deshalb aus, was der jeweilige Kanton fΓΌhrt, und beschriftet es β statt beides zu einer Zahl zu verschmelzen.
Was es stattdessen gibt: die Einordnung, die eine Zahl brauchbar macht β das saisonale Muster und was daraus fΓΌr die Bildungsplanung folgt. Das ist Fachwissen und keine Messung, und es steht hier als solches.
Die frΓΌhere Fassung nannte an dieser Stelle Β«+2'186 Jugendarbeitslose (+18.6%)Β» als Beispielwert aus einem Snapshot. Eine als Beispiel eingefΓΌhrte Zahl wird als Zahl zitiert; der Zusatz Β«SnapshotΒ» ΓΌberlebt das Zitieren nicht.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Contains: - canton (Optional[str]): Kantonscode; Γ€ndert am Ergebnis nichts. - response_format (str): 'markdown' oder 'json' |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and non-destructive; the description adds meaningful behavior: no national dataset exists, count vs. quote are not interchangeable, and the tool labels the data and includes expert interpretation rather than merging figures. The only gap is unspecified behavior for unsupported or invalid canton codes, which is minor given the openWorldHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is substantial but overlong, with a final paragraph about the previous version's example value that is irrelevant for tool selection or invocation. The key limitation is front-loaded, but several sentences repeat or editorialize rather than help an agent call the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description thoroughly covers the data-availability situation and the difference between count and rate, but it leaves the actual invocation ambiguous: an agent cannot confidently determine how to request TG vs. ZG data, and the schema's contradictory canton description is not resolved. Since output schema exists, return-format details are covered, but the operational ambiguity is a significant gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, so the baseline is 3 even though the tool description adds little parameter-level detail. The description mentions TG and ZG but does not clarify how the canton parameter selects between them, especially since the schema itself says the canton code 'Γ€ndert am Ergebnis nichts' (changes nothing about the result).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource clearly: youth unemployment for ages 15β24 in Switzerland, with the caveat that no national series exists and only two cantons publish data. It also explains what the tool returns (the canton's own figure, labeled, plus seasonal/educational context). It does not explicitly compare itself to sibling tools, so it misses the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the tool is for youth-unemployment data in TG and ZG, and the description explicitly warns that national queries yield no numbers. However, it gives no concrete 'use this when...' guidance and names no alternatives among the sibling tools for national or general unemployment data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seco_list_cantonsSchweizer Kantone β Codes und NamenARead-onlyIdempotent
List all Swiss canton codes and their names.
Utility tool to look up canton codes needed for other seco_* tools. Returns all 26 cantons with their 2-letter codes and full names.
Returns: str: Markdown table of canton codes and names.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint. The description adds that it returns a Markdown table with all 26 cantons, which is consistent and provides no surprises.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief (3 sentences) and front-loaded with the main action. Every sentence adds value: what, why, and return format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, rich annotations, and output schema (implied as Markdown table), the description fully covers what the agent needs to know. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so schema coverage is 100%. The description adds value by specifying the exact output format (Markdown table) and the count (26 cantons). Baseline 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all Swiss canton codes and their names.' This is a specific verb+resource combination. It distinguishes itself from sibling tools like seco_get_dataset which query data, not codes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Utility tool to look up canton codes needed for other seco_* tools.' This tells the agent when to use it (to get codes for other tools) and implies it's not for querying data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seco_search_datasetsArbeitsmarkt-DatensΓ€tze suchenARead-onlyIdempotent
Sucht Arbeitsmarkt-DatensΓ€tze auf opendata.swiss.
Nicht auf SECO gefiltert, und das ist eine Aussage ΓΌber die Quelle. Bis
zum 2026-08-14 filterte diese Suche auf organization:staatssekretariat- fur-wirtschaft-seco. Diese Organisation existiert auf opendata.swiss nicht
(mehr): organization_show antwortet 404, und in den 176 EintrΓ€gen von
organization_list kommt kein SECO vor. Jede Suche lieferte deshalb null
Treffer β und ein Namensabgleich, der ins Leere lΓ€uft, sieht genau aus wie
eine leere Suche.
Die Suche lΓ€uft jetzt ΓΌber den ganzen Bestand, und jeder Treffer trΓ€gt seinen Herausgeber. Das ist die ehrlichere Antwort: DatensΓ€tze zum Arbeitsmarkt gibt es, sie stammen nur vom BFS, von Kantonen und vom liechtensteinischen Amt fΓΌr Statistik. Wer sie verwendet, muss wissen, von wem β die Erhebungsweise unterscheidet sich, und registrierte Arbeitslose (SECO) sind nicht dasselbe wie Erwerbslose gemΓ€ss ILO (BFS).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Contains: - query (str): Search terms (German/English) - limit (int): Max results (1-20, default 10) - response_format (str): 'markdown' or 'json' |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnly/idempotent annotations by disclosing that the search is not SECO-filtered (contrary to what the tool name and title might imply), that the old filter targeted a non-existent organization and caused zero results, and that results include their publisher with different survey methodologies. This is significant behavioral context that prevents the agent from assuming the results are SECO official statistics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is verbose, spending several sentences on the historical 404 issue and the distinction between SECO and ILO statistics. While informative, it is not tightly front-loaded; the key usage fact (search over all datasets, results include publisher) could be conveyed in two sentences. It earns a middle score for offering useful detail at the cost of brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with an output schema and full parameter documentation, the description adequately covers the critical caveat that results come from various publishers and are not SECO-specific. It also explains potential empty-result scenarios. The only missing piece is explicit routing guidance to sibling tools, but the output schema likely covers return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides comprehensive descriptions for query, limit, and response_format (100% coverage), including examples and defaults. The description adds no parameter-specific semantics, so it relies on the schema, yielding baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Sucht Arbeitsmarkt-DatensΓ€tze auf opendata.swiss', a specific verb+resource statement that clearly identifies a search tool over a public data catalog. It differentiates from siblings (seco_get_* specific indicators) by focusing on dataset discovery rather than retrieving a specific metric.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context that the search covers the entire opendata.swiss catalog, not just SECO, and explains the historical filtering that caused empty results. However, it does not explicitly tell the agent when to choose this search tool over the seco_get_* siblings, nor when not to use it; usage is 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.5.0- Changed
seco_get_job_seekers1 field changed- changed
Input schema / properties / params / descriptionPrevious value: -"Contains:\n- canton (Optional[str]): Canton code (e.g. 'ZH'). None = national.\n- response_format (str): 'markdown' or 'json'"New value: +"Contains:\n- canton (Optional[str]): wird abgelehnt, siehe oben.\n- response_format (str): 'markdown' oder 'json'"
- Changed
seco_get_unemployment_overview1 field changed- changed
Input schema / properties / params / descriptionPrevious value: -"Contains:\n- canton (Optional[str]): Canton code (e.g. 'ZH'). None = national.\n- year (Optional[int]): Filter year. None = latest available.\n- response_format (str): 'markdown' or 'json'"New value: +"Contains:\n- canton (Optional[str]): wird abgelehnt, siehe oben.\n- year (Optional[int]): Jahr der Reihe. None = jΓΌngstes verfΓΌgbares.\n- response_format (str): 'markdown' oder 'json'"
- Added
seco_get_uvg_by_branch - Added
seco_get_uvg_overview - Added
seco_get_uvg_trends - Changed
seco_get_youth_unemployment1 field changed- changed
Input schema / properties / params / descriptionPrevious value: -"Contains:\n- canton (Optional[str]): Canton code (e.g. 'ZH'). None = national.\n- response_format (str): 'markdown' or 'json'"New value: +"Contains:\n- canton (Optional[str]): Kantonscode; Γ€ndert am Ergebnis nichts.\n- response_format (str): 'markdown' oder 'json'"
9 tool updates
v0.3.0- First observed
seco_get_dataset - First observed
seco_get_job_seekers - First observed
seco_get_monthly_report_url - First observed
seco_get_open_positions - First observed
seco_get_unemployment_by_occupation - First observed
seco_get_unemployment_overview - First observed
seco_get_youth_unemployment - First observed
seco_list_cantons - First observed
seco_search_datasets
TDQS
Scored across 12 tools
Each tool targets a distinguishable data source or operation, and the descriptions carefully contrast overlapping concepts like registered unemployed vs. job seekers. However, several unemployment-related getters (overview, youth, by occupation, job seekers) cover closely related ground, so an agent must read descriptions carefully to avoid selecting the wrong one.
All tools follow a consistent seco_<verb>_<noun> snake_case pattern, with get, search, and list used predictably. This makes the tool surface easy to scan and reason about.
Twelve tools is well within the ideal range for a domain-specific data server. Each tool appears justified, from core unemployment statistics to metadata lookup and canton utilities, without unnecessary bloat.
The server covers the main labor market data needs: unemployment, job seekers, open positions, occupational breakdowns, youth unemployment, metadata search, and even occupational accident data. Minor gaps like monthly or cantonal breakdowns are explicitly documented as unavailable rather than left as dead ends.
Maintenance
Related MCP Connectors
Search and query 1,500+ OECD statistical datasets via SDMX. Keyless.
Official Swiss data for all 26 cantons and 2,100 communes: tax, rent, health premiums, fuel, jobs.
Search ILOSTAT labour indicators, query and compare series, build country profiles, run SQL.
Swiss federal law (Fedlex) and political data (LINDAS) for agents, every answer with sources
Related MCP Servers
- AlicenseAqualityAmaintenanceProvides AI-native access to Swiss Federal Statistical Office datasets through 9 tools for querying education, population, and cross-cantonal comparisons without authentication.15143 PyPI2MIT
- FlicenseNot gradedqualityDmaintenanceEnables querying Swiss public transport (trains, buses, trams, boats) for stations, connections, and station boards via the opendata.ch API.-
- FlicenseAqualityDmaintenanceEnables LLMs to query structured statistical data from the Swiss Federal Archives' Linked Data platform (LINDAS) by translating natural language questions into SPARQL queries against RDF data cubes.8-
- AlicenseNot gradedqualityBmaintenanceEnables access to global labour statistics from ILOSTAT via the Pipeworx gateway.406 npmMIT