Skip to main content
Glama
malkreide

seco-labor-mcp

by malkreide

πŸ‡¨πŸ‡­ Part of the Swiss Public Data MCP Portfolio

SECO Labor Market MCP Server

Version CI PyPI Python 3.11+ MCP No Auth Required License: MIT

🌐 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

opendata.swiss

CKAN catalogue; the pinned BFS table T3.3.0.1 carries the SECO annual series

βœ… Live

arbeit.swiss

Monthly press reports (PDF, structured URL pattern)

βœ… Live

amstat.ch

AMSTAT reference portal

⚠️ JavaScript SPA, no public REST API

unfallstatistik.ch

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

seco_search_datasets

Search labour-market datasets on opendata.swiss (publisher shown per hit)

Discovery

seco_get_dataset

Full metadata + download links for a dataset

Data access

seco_get_unemployment_overview

Registered unemployed: national annual, cantonal for TG/FR/ZG/ZH

Labor market overview

seco_get_youth_unemployment

Youth unemployment (15–24) β€” TG (count) and ZG (rate) only

πŸŽ“ Berufswahlberatung

seco_get_job_seekers

Registered job seekers, national, annual series from 2000

Training demand

seco_get_open_positions

Open positions β€” no national series available

Sector analysis

seco_get_unemployment_by_occupation

Breakdown by Berufshauptgruppe β€” no machine-readable source

πŸŽ“ Vocational guidance

seco_get_monthly_report_url

Generate/verify PDF report URL

Source access

seco_list_cantons

All 26 canton codes and names

Utility

seco_get_uvg_overview

UVG key figures on occupational accidents and diseases

Risk overview

seco_get_uvg_by_branch

Results per NOGA 2008 economic branch

πŸŽ“ Vocational guidance

seco_get_uvg_trends

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

schluesselzahlen_d.htm

HTML table, 5 years, Switzerland-wide

annually

Ts{YY}.pdf

annual edition, tables 1.2 and 2.4 by NOGA

annually, June

WirtKl_{BUV|NBUV}_{NN}.pdf

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-mcp

http 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 only

An 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" -v

Usage 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

swiss-statistics-mcp

BFS population/employment data for deeper context

zurich-opendata-mcp

City of Zurich-level education and social data

swiss-snb-mcp

Economic context (GDP, wages) for labor market interpretation

fedlex-mcp

ALV (Arbeitslosenversicherung) legislative framework


Known Limitations

  • amstat.arbeit.swiss has no public REST API (JavaScript SPA) β†’ workaround via CKAN

  • Occupational/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_check in 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 level

  • Detailed 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-mcp for 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 (readOnlyHint: true) β€” the server cannot modify or delete any data

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

2026-07-28

no handshake β€” server/discover, one self-contained envelope per request

Handshake

2025-11-25

initialize, then a stateful session

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 tools
seco_get_datasetSECO-Datensatz-Details abrufenA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYesContains: - dataset_id (str): Dataset ID/slug from opendata.swiss - response_format (str): 'markdown' or 'json'

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. 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.

Purpose5/5

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.

Usage Guidelines5/5

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 SchweizA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYesContains: - canton (Optional[str]): wird abgelehnt, siehe oben. - response_format (str): 'markdown' oder 'json'

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 generierenA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYesContains: - year (int): Report year (e.g. 2025, 2026) - month (int): Report month (1-12) - language (str): 'de', 'fr', or 'it'

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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)A
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYesContains: - response_format (str): 'markdown' or 'json'

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 BerufsgruppeA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYesContains: - response_format (str): 'markdown' for human-readable, 'json' for structured data.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SchweizA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYesContains: - 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

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)A
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYesnoga, table, response_format

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)A
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYesyears, include_non_occupational, response_format

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, and the schema already 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.

Purpose4/5

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.

Usage Guidelines4/5

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_youth_unemploymentJugendarbeitslosigkeit SchweizB
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYesContains: - canton (Optional[str]): Kantonscode; Γ€ndert am Ergebnis nichts. - response_format (str): 'markdown' oder 'json'

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior4/5

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.

Conciseness2/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 NamenA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 suchenA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYesContains: - query (str): Search terms (German/English) - limit (int): Max results (1-20, default 10) - response_format (str): 'markdown' or 'json'

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 6 tool updatesv0.5.0
    • Changedseco_get_job_seekers1 field changed
      • changedInput schema / properties / params / description
        Previous 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'"
    • Changedseco_get_unemployment_overview1 field changed
      • changedInput schema / properties / params / description
        Previous 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'"
    • Addedseco_get_uvg_by_branch
    • Addedseco_get_uvg_overview
    • Addedseco_get_uvg_trends
    • Changedseco_get_youth_unemployment1 field changed
      • changedInput schema / properties / params / description
        Previous 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'"
  2. 9 tool updatesv0.3.0
    • First observedseco_get_dataset
    • First observedseco_get_job_seekers
    • First observedseco_get_monthly_report_url
    • First observedseco_get_open_positions
    • First observedseco_get_unemployment_by_occupation
    • First observedseco_get_unemployment_overview
    • First observedseco_get_youth_unemployment
    • First observedseco_list_cantons
    • First observedseco_search_datasets

TDQS

A4/5.0

Scored across 12 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Provides AI-native access to Swiss Federal Statistical Office datasets through 9 tools for querying education, population, and cross-cantonal comparisons without authentication.
    15
    143 PyPI
    2
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Enables 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
    -