Skip to main content
Glama
malkreide

Zurich Open Data MCP Server

by malkreide

🇨🇭 Part of the Swiss Public Data MCP Portfolio

🏙️ Zurich Open Data MCP Server

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

🌐 English | Deutsch

An MCP (Model Context Protocol) server providing AI-powered access to Open Data from the City of Zurich, Switzerland.

Enables Claude, ChatGPT, and other MCP-compatible AI assistants to directly query 900+ datasets, geodata, parliamentary proceedings, council resolutions, tourism data, linked data, and real-time environmental and mobility information from the City of Zurich. 23 Tools (+3 deprecated aliases), 5 Resources, 6 APIs.

Demo

Demo: Claude using zurich_parking_live and zurich_air_quality

✨ Features

CKAN Open Data (data.stadt-zuerich.ch)

  • zurich_search_datasets – Full-text search with Solr syntax across 900+ datasets

  • zurich_get_dataset – Complete metadata and download URLs for a dataset

  • zurich_datastore_query – Query tabular data directly (filters, sorting)

  • zurich_datastore_sql – SQL queries on the DataStore

  • zurich_list_categories – Browse 19 thematic categories

  • zurich_list_tags – Tag-based thematic search

Real-Time Environmental Data

  • zurich_weather_live – 🌤️ Current weather (temperature, humidity, pressure, rain) from 4 UGZ stations

  • zurich_air_quality – 🌬️ Live air quality (NO₂, O₃, PM10, PM2.5) with WHO thresholds

  • zurich_water_weather – 🌊 Lake Zurich data (water temperature, level, wind) every 10 min

Real-Time Mobility Data

  • zurich_pedestrian_traffic – 🚶 Pedestrian counts on Bahnhofstrasse (3 locations, hourly)

  • zurich_vbz_passengers – 🚊 VBZ public transit ridership (800,000+ records, all lines/stops)

  • zurich_parking_live – 🅿️ Real-time occupancy of 36 parking garages (ParkenDD)

Geoportal (WFS Geodata)

  • zurich_geo_layers – 📍 List 14 available geodata layers

  • zurich_geo_features – 📍 Fetch GeoJSON features (schools, districts, playgrounds, climate data, etc.)

City Parliament (Paris API)

  • zurich_parliament_search – 🏛️ Search parliamentary proceedings (interpellations, motions, postulates)

  • zurich_parliament_members – 🏛️ Search council members (party, commissions, mandates)

Zurich Tourism

  • zurich_tourism – 🏨 Attractions, restaurants, hotels, events (Schema.org data, 4 languages)

Linked Data (SPARQL)

  • zurich_sparql – 📊 SPARQL queries on the statistical linked data endpoint (endpoint not productive yet — the tool is not registered by default; opt in with the environment variable ZURICH_OPENDATA_ENABLE_SPARQL=1)

Stadtratsbeschlüsse (Council Resolutions)

  • zurich_strb_search – 📜 Full-text search of public council resolutions (title, department, date range)

  • zurich_strb_by_department – 📜 List all resolutions of a department (e.g. SSD, FD, PRD)

  • zurich_strb_detail – 📜 Single resolution by NNNN/YYYY number

(The former names search_stadtratsbeschluesse, get_beschluesse_by_departement and get_stadtratsbeschluss_detail remain available as deprecated aliases until the next major release.)

Analysis Tools

  • zurich_analyze_datasets – Comprehensive analysis: relevance, recency, data structure

  • zurich_catalog_stats – Catalog overview with statistics

  • zurich_find_school_data – Curated search for education-related datasets

MCP Resources

  • zurich://dataset/{name} – Dataset metadata

  • zurich://category/{group_id} – Category details

  • zurich://parking – Current parking data

  • zurich://geo/{layer_id} – GeoJSON geodata (14 layers)

  • zurich://tourism/categories – Tourism categories

Related MCP server: swiss-food-safety-mcp

🚀 Installation

Prerequisites

  • Python 3.11+

  • pip or uv

  • mcp[cli] 2.x — installed automatically; the server uses the 2.x API (mcp.server.mcpserver) and cannot run on mcp 1.x

Use 0.6.0 or newer. Release 0.5.1 declared mcp[cli]>=1.28.1 with no upper bound. Once mcp 2.0.0 removed mcp.server.fastmcp, every fresh install of 0.5.1 resolved to 2.0.0 and failed at import with ModuleNotFoundError. 0.6.0 runs on the 2.x API and pins >=2.0.0,<3. If you are pinned to 0.5.1, upgrade — there is no working configuration of that release left.

Install

# Clone
git clone https://github.com/malkreide/zurich-opendata-mcp.git
cd zurich-opendata-mcp

# Install
pip install -e .

# Or with uv
uv pip install -e .

⚙️ Configuration

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "zurich-opendata": {
      "command": "python",
      "args": ["-m", "zurich_opendata_mcp.server"],
      "env": {}
    }
  }
}

Alternatively, using the installed command:

{
  "mcpServers": {
    "zurich-opendata": {
      "command": "zurich-opendata-mcp"
    }
  }
}

Claude Code (CLI)

claude mcp add zurich-opendata -- python -m zurich_opendata_mcp.server

Cursor / VS Code

Add to .vscode/settings.json:

{
  "mcpServers": {
    "zurich-opendata": {
      "command": "python",
      "args": ["-m", "zurich_opendata_mcp.server"]
    }
  }
}

💬 Example Queries

Once configured, you can ask Claude:

Open Data

  • "What datasets are available about schools in Zurich?"

  • "Show me school holidays for public schools"

  • "Analyze the available geodata"

Real-Time Data

  • "What's the current temperature in Zurich?"zurich_weather_live

  • "How is the air quality today?"zurich_air_quality

  • "What's the water temperature in Lake Zurich?"zurich_water_weather

  • "How many parking spaces are free right now?"zurich_parking_live

  • "How many people are on Bahnhofstrasse right now?"zurich_pedestrian_traffic

Geodata

  • "Show me all school facilities in Zurich as GeoJSON"zurich_geo_features

  • "What geodata layers are available?"zurich_geo_layers

  • "Where are the playgrounds in Zurich?"

City Parliament

  • "What parliamentary motions about schools were filed?"zurich_parliament_search

  • "Which council members belong to the SP party?"zurich_parliament_members

Council Resolutions (Stadtratsbeschlüsse)

  • "Find council resolutions about Volksschule from 2025"zurich_strb_search

  • "List all SSD resolutions in 2025"zurich_strb_by_department

  • "Show council resolution 1203/2025"zurich_strb_detail

Tourism

  • "What restaurants does Zurich Tourism recommend?"zurich_tourism

🔗 Data Sources

API

Endpoint

Data

CKAN

data.stadt-zuerich.ch/api/3/

900+ open datasets

Geoportal WFS

ogd.stadt-zuerich.ch/wfs/geoportal

14 geodata layers (GeoJSON)

Paris API

gemeinderat-zuerich.ch/api

Parliamentary proceedings & members

Zurich Tourism

zuerich.com/en/api/v2/data

Attractions, restaurants, hotels

SPARQL

ld.stadt-zuerich.ch/query

Linked Open Data / statistics

ParkenDD

api.parkendd.de/Zuerich

Real-time parking occupancy

📊 Available Data Categories

Category

ID

Employment

arbeit-und-erwerb

Base Maps

basiskarten

Construction & Housing

bauen-und-wohnen

Population

bevolkerung

Education

bildung

Energy

energie

Finance

finanzen

Leisure

freizeit

Health

gesundheit

Crime

kriminalitat

Culture

kultur

Mobility

mobilitat

Politics

politik

Prices

preise

Social Affairs

soziales

Tourism

tourismus

Environment

umwelt

Administration

verwaltung

Economy

volkswirtschaft

📍 Available Geo Layers

Source of truth: GEOPORTAL_LAYERS in src/zurich_opendata_mcp/config.py.

Layer ID

Description

schulanlagen

School facilities (kindergartens, schools, after-school care)

schulkreise

School district boundaries (polygons)

schulwege

School-route crossings and hazard points

stadtkreise

City district boundaries (polygons)

spielplaetze

Public playgrounds

kreisbuero

City district offices

sammelstelle

Waste collection points

sport

Sports facilities

klimadaten

Climate data (raster, temperatures, heat islands)

lehrpfade

Educational trails

stimmlokale

Polling stations

sozialzentrum

Social centres

velopruefstrecken

Bicycle exam routes for schools

familienberatung

Family-counselling meeting points

🏗️ Project Structure

zurich-opendata-mcp/
├── src/zurich_opendata_mcp/
│   ├── __init__.py
│   ├── app.py               # Shared FastMCP instance
│   ├── server.py            # Console entry + back-compat re-exports
│   ├── config.py            # Endpoints, layer maps, resource IDs
│   ├── http_client.py       # Shared httpx client + CKAN wrapper
│   ├── formatters.py        # CKAN→model mapping + Markdown rendering
│   ├── models.py            # Pydantic structured-output models
│   ├── clients/             # API clients: paris, sparql, tourism, wfs
│   └── tools/               # @mcp.tool implementations:
│                            #   catalog, datastore, geo, parliament,
│                            #   realtime, sparql, strb, tourism,
│                            #   resources (zurich:// URIs)
├── tests/                   # respx round-trip, unit and live-marked tests
├── audits/                  # Code-audit reports
├── .github/workflows/       # ci.yml + publish.yml (Trusted Publisher)
├── pyproject.toml
├── README.md / README.de.md
├── CONTRIBUTING.md / .de.md
├── SECURITY.md / .de.md
├── CHANGELOG.md
├── CLAUDE.md                # Project conventions for Claude
├── LICENSE
└── claude_desktop_config.json

🧪 Development

# Install dev dependencies
pip install -e ".[dev]"

# Unit + validation tests (no network)
pytest tests/ -m "not live"

# Live integration tests (against live APIs — opt-in)
pytest tests/ -m live

# Linting
ruff check src/ tests/

🌐 HTTP transport

By default the server speaks MCP over stdio. --http serves Streamable HTTP instead:

zurich-opendata-mcp --http --port 8000              # binds 127.0.0.1 (default)
zurich-opendata-mcp --http --host 0.0.0.0 --port 8000

Option

Meaning

Default

--http

Serve Streamable HTTP instead of stdio

(off → stdio)

--host

Bind address

127.0.0.1

--port

Bind port (1–65535)

8000

MCP_ALLOWED_HOSTS

Comma-separated names this server is reachable under, port included (e.g. zurich.example.ch:8000). Requests under any other Host get 421; loopback stays allowed so container health checks keep working.

(unset)

The loopback default is deliberate. Binding 0.0.0.0 exposes the server on every interface, to everyone who can reach the machine — there is no authentication in front of it.

Set MCP_ALLOWED_HOSTS whenever you bind beyond loopback. It guards against DNS rebinding: a page on your network resolves its own hostname to this server's address and then talks to it from the browser. From the browser's point of view that request is same-origin, so no origin rule stops it — only the Host check does.

Left unset on a non-loopback bind, the check stays off and a warning is logged. That is the right default only when something in front of the server validates Host. It is deliberately not guessed: on 0.0.0.0 the reachable name is unknowable inside the process, and a wrong guess would answer the very deployment it is meant to protect with 421 on every request.

MCP Protocol Version

This server speaks two protocol eras over the same endpoint. The client's first request on a connection decides which one applies; a later claim from the other era is refused.

Era

Revision

Who reaches it

initialize handshake

2024-11-052025-11-25

What today's clients speak. The server answers with the revision asked for, or with the 2025-11-25 ceiling when the request asks for something newer.

Per-request envelope

2026-07-28

A request carrying the 2026-07-28 _meta envelope opens a modern connection.

Both revisions are pinned in tests/test_protocol_version.py and asserted against the installed SDK, so a Dependabot bump of mcp cannot move either one silently. This server builds no ASGI app to send an initialize through, so the gate asserts the SDK constants rather than a measured response — the weaker form, named rather than left unsaid.

Note that the SDK's LATEST_PROTOCOL_VERSION is an alias for the modern era, not for the handshake era — pinning against it alone would leave the era that current clients actually negotiate free to drift.

Update policy. When the gate fails, do not edit the constant blindly: read the spec changelog between the two revisions, verify the server still behaves, then move the constant, this section, README.de.md and CHANGELOG.md together.

Safety & Limits

  • Read-only: All tools perform HTTP GET requests only — no data is written, modified, or deleted.

  • No personal data: The APIs return open civic datasets (parking occupancy, weather readings, parliamentary proceedings). No personally identifiable information (PII) is processed or stored by this server.

  • Rate limits: CKAN Solr search and ParkenDD are public APIs without documented rate limits; use rows and limit parameters conservatively. The server enforces a 30s timeout per request; transient upstream errors (connect failures, HTTP 502/503/504) are retried once with a short backoff.

  • Data freshness: Real-time tools (parking, weather, air quality) reflect the upstream source at query time. Measurement data is never cached; only the lookup of the current per-year UGZ resource ID (weather/air quality) is cached in-process for 24h.

  • Terms of service: Data is subject to the ToS of each source — data.stadt-zuerich.ch, ParkenDD, gemeinderat-zuerich.ch. All City of Zurich data is published under CC0 (Open by Default since 2021).

  • No guarantees: This server is a community project, not affiliated with the City of Zurich or any of the API providers. Availability depends on upstream APIs.


🤝 Contributing

Contributions are welcome — see CONTRIBUTING.md (Deutsch).

🔒 Security

Read-only, no PII, no authentication, a fixed set of public-data endpoints. See SECURITY.md (Deutsch) for the full security posture and accepted-risk decisions.

📜 License

MIT License — see LICENSE. All data used is published under open licenses (CC0 / Open by Default since 2021).

👤 Author

Hayal Oezkan · malkreide


Powered by Model Context Protocol • 6 APIs • 23 Tools • 5 Resources

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": {
    "zurich-opendata-mcp": {
      "command": "uvx",
      "args": [
        "zurich-opendata-mcp"
      ]
    }
  }
}

Available Tools

26 tools
get_beschluesse_by_departementC
Read-onlyIdempotent

Deprecated: alter Name von zurich_strb_by_department — bitte das neue Tool verwenden. Dieser Alias verhält sich identisch und wird mit der nächsten Major-Version entfernt.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds no behavioral context beyond the deprecation notice, providing no added value.

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?

The description is very short and front-loaded with the deprecation warning. It is concise, but could be improved by also stating the tool's purpose.

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?

Despite having annotation coverage and a schema, the description fails to inform the agent about the tool's core functionality. The agent cannot determine what this tool retrieves without inferring from the name or alternative.

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 includes detailed descriptions for all parameters, so the baseline is 3. The description does not contribute any additional parameter information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description only states that the tool is deprecated and an alias for another tool. It does not describe what the tool does, leaving the agent without any understanding of its function.

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 tells the agent not to use this tool and directs them to the new tool 'zurich_strb_by_department'. This is clear guidance for a deprecated tool.

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

get_stadtratsbeschluss_detailA
Read-onlyIdempotent

Deprecated: alter Name von zurich_strb_detail — bitte das neue Tool verwenden. Dieser Alias verhält sich identisch und wird mit der nächsten Major-Version entfernt.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

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?

The description adds that it behaves identically to `zurich_strb_detail`, which is useful but does not go beyond the annotations (readOnlyHint, idempotentHint, destructiveHint) that already indicate a safe, idempotent read operation.

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 extremely concise (two sentences) and front-loads the critical deprecation information, making it efficient for an agent to parse.

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 the tool is deprecated and the description redirects to the new tool, it is contextually complete for its primary intention. The output schema exists but is not described; however, for a deprecated tool, that is acceptable.

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

Parameters2/5

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

Schema description coverage is 0%, and the description provides no parameter information. While the input schema itself describes the single parameter with format and examples, the description does not compensate for the low coverage, which is expected for a deprecated alias but still leaves the agent with minimal guidance.

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 it is a deprecated alias for `zurich_strb_detail`, which tells the agent the tool's purpose (retrieve a single city council decision) indirectly through the sibling name. The title also adds clarity.

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 tells the agent not to use this tool and to use `zurich_strb_detail` instead, providing clear when-not-to-use and an alternative.

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

search_stadtratsbeschluesseD
Read-onlyIdempotent

Deprecated: alter Name von zurich_strb_search — bitte das neue Tool verwenden. Dieser Alias verhält sich identisch und wird mit der nächsten Major-Version entfernt.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

D1.7/5.0
Behavior2/5

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

Annotations already convey readOnly, idempotent, non-destructive traits. The description adds no behavioral detail beyond stating it behaves identically to the replacement tool, which 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.

Conciseness2/5

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

The description is a single sentence, but it is a deprecation notice rather than a functional description. It is concise but fails to inform about the tool's purpose or usage.

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?

Given the tool's complexity (multiple parameters, output schema exists), the description is insufficient. It lacks information on what the tool returns or how to invoke it effectively, despite the existence of an output schema.

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

Parameters1/5

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

The description does not describe any parameters. Despite the input schema having detailed parameter descriptions, the tool's own description provides no parameter semantics, relying entirely on schema, which context signals indicate 0% coverage from the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description only states it is deprecated and an alias for `zurich_strb_search`, but does not explain what the tool does (e.g., search Stadtratsbeschlüsse). The purpose is unclear without knowledge of the replacement tool.

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

Usage Guidelines1/5

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

No usage guidance is provided. It instructs to use the new tool but gives no context on when or why to use this alias versus alternatives.

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

zurich_air_qualityA
Read-only

Liefert stündlich aktualisierte Luftqualitätsmessungen aus Zürich.

Datenquelle: Umwelt- und Gesundheitsschutz Stadt Zürich (UGZ). Parameter: NO, NO2, NOx, O3, PM10, PM2.5.

Returns: Aktuelle Schadstoffwerte je Station mit Einheiten

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds value by specifying the data source (UGZ), update frequency (hourly), and that it returns current values per station with units. This provides operational 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?

The description is extremely concise: three sentences covering purpose, data source, and return format. Every sentence adds value, and the most important information is front-loaded.

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

Completeness3/5

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

For a simple read-only query tool with well-documented parameters and annotations, the description is adequate. However, it lacks usage guidelines and does not explain the output schema (which exists but is not shown). This leaves minor gaps in completeness.

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 detailed descriptions for all parameters (limit, format, station, parameter) with enums and defaults. The tool description only lists the parameters generically, adding no extra meaning. Since schema coverage is high, baseline 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 the verb (liefert), resource (Luftqualitätsmessungen aus Zürich), and update frequency (stündlich). It also lists the measured parameters. This sufficiently distinguishes it from sibling tools which focus on other datasets like parking or weather.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives, or any conditions/precautions. The description does not mention when not to use it or suggest other tools for related queries.

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

zurich_analyze_datasetsA
Read-onlyIdempotent

Analysiert Datensätze umfassend: Relevanz, Aktualität und Datenstruktur.

Kombiniert Suche mit Analyse der Update-Frequenz und Feld-Schemas. Besonders nützlich um herauszufinden, welche Daten verfügbar sind und wie aktuell/vollständig sie sind.

Returns: Strukturiertes AnalysisResult (JSON mit Feldern, Ressourcen-IDs und DataStore-Zählungen) plus lesbarer Markdown-Report.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
queryYes
totalNo
analyzedNo
datasetsNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, covering safety. The description adds behavioral context about combining search with analysis and returning structured results plus Markdown report, which is consistent and adds value.

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?

The description is concise with two paragraphs and a clear 'Returns:' section. It is front-loaded with purpose. Minor redundancy between first sentence and subsequent explanation, but overall well-structured.

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 the presence of an output schema, the description need not detail return values. It adequately covers purpose, what the tool does, and the nature of output. It could mention that query is required, but the schema covers this. Annotations add openWorldHint. Overall complete for its complexity.

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 has detailed descriptions for all parameters (e.g., query, max_datasets, include_freshness, include_structure), so the description adds little beyond referencing update frequency and field schemas. With high schema coverage, baseline score 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 the tool analyzes datasets comprehensively, focusing on relevance, actuality, and data structure. It combines search with analysis, distinguishing it from sibling tools like zurich_search_datasets (search only) and zurich_get_dataset (single dataset retrieval).

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 notes it is useful for finding available data and assessing its timeliness/completeness, providing clear usage context. It does not explicitly state when not to use or list alternatives, but the context of siblings implies differentiation.

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

zurich_catalog_statsA
Read-onlyIdempotent

Gibt einen Überblick über den gesamten Open-Data-Katalog der Stadt Zürich.

Zeigt Gesamtzahl der Datensätze, Verteilung nach Kategorien, häufigste Formate und Tags.

Returns: Statistik-Übersicht des Katalogs

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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 indicate the tool is read-only, idempotent, and non-destructive. The description adds value by detailing the kind of statistical information returned (counts, distributions), beyond what annotations provide. No contradictions detected.

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 extremely concise: two short sentences plus a return note. It front-loads purpose immediately and uses bullet-like clarity without superfluous 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 tool has no parameters, simple output, and annotations covering safety and openness, the description sufficiently explains what the tool does and returns. The presence of an output schema further reduces the need for detail.

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 tool has no parameters, and the input schema coverage is 100%. The description does not need to explain parameters, and the baseline score of 4 is appropriate as it adds no unnecessary information.

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 provides an overview of the entire Zurich open data catalog, specifying that it shows total number of datasets, category distribution, and common formats and tags. This uniquely distinguishes it from sibling tools that focus on specific datasets, searches, or other domains.

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 usage for obtaining aggregate catalog statistics but does not explicitly state when to use this tool versus alternatives like search or specific dataset tools. There is no guidance on when not to use it or mention of prerequisites.

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

zurich_datastore_queryA
Read-onlyIdempotent

Fragt tabellarische Daten direkt aus dem CKAN DataStore ab.

Ermöglicht gefilterte Abfragen auf Ressourcen, die im DataStore gespeichert sind (CSV-Daten werden automatisch indexiert).

Returns: Markdown-Tabelle mit Daten und Feld-Informationen

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations declare readOnly, idempotent, non-destructive. The description adds return format (Markdown table) and indexing behavior, complementing annotations well.

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 short sentences plus a return line, no wasted words. Front-loaded with core action.

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?

Covers purpose, return format, and basic behavior. Minor gaps like pagination details are handled by schema.

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?

Input schema has descriptions for all parameters (high coverage). The description adds no additional parameter details, so baseline score applies.

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 the tool queries tabular data from CKAN DataStore with filtering. It implicitly distinguishes from the SQL sibling but does not explicitly differentiate.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives like zurich_datastore_sql or search tools. Missing when-not-to-use context.

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

zurich_datastore_sqlA
Read-only

Führt eine SQL-Abfrage auf dem CKAN DataStore aus.

Ermöglicht komplexe Abfragen mit JOINs, GROUP BY, Aggregationen etc. Nur SELECT-Abfragen sind erlaubt.

Returns: JSON-Ergebnisse der SQL-Abfrage

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

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?

Annotations already indicate read-only and non-destructive behavior. The description adds that only SELECT queries are allowed and returns JSON results, which aligns with annotations and provides useful behavioral context beyond what annotations offer.

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 concise with three sentences, front-loads the purpose, and avoids unnecessary details. Every sentence adds value.

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 the tool's complexity (SQL queries) and the presence of an output schema (context indicates it exists), the description covers input, constraints, and output format. It could mention error handling or performance but is adequate for agent selection.

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 includes a description with an example. The tool description adds constraints (only SELECT) and capability (complex queries) that are not in the schema, providing some added value, but does not elaborate on parameter format or validation.

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 it executes SQL queries on the CKAN DataStore, specifying it supports complex queries like JOINs and GROUP BY, and only SELECT is allowed. This differentiates it from sibling tools like zurich_datastore_query.

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

Usage Guidelines2/5

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

The description does not provide explicit guidance on when to use this tool versus alternatives such as zurich_datastore_query. It only implicitly suggests it's for complex SQL queries but lacks when-not-to-use or alternative comparisons.

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

zurich_find_school_dataA
Read-onlyIdempotent

Findet Datensätze, die für das Schulamt und die Volksschule relevant sind.

Durchsucht gezielt nach Schulanlagen, Bildungsdaten, Kreisschulbehörden, Schülerstatistiken, Schulwegen und verwandten Themen. Nutzt eine kuratierte Kombination von Suchbegriffen.

Returns: Markdown-Liste schulrelevanter Datensätze

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already indicate read-only, open-world, idempotent, and non-destructive behavior. The description adds behavioral context by mentioning it uses a curated combination of search terms and returns a Markdown list, providing value beyond 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 paragraphs plus a return type line. Every sentence adds value; no fluff or repetition. Front-loaded with the core purpose.

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 a single optional parameter and an output schema (not shown), the description covers the main purpose, returns format, and search methodology. Could mention pagination or result limits but is largely complete for a focused search tool.

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

Parameters2/5

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

Schema description coverage is 0%, meaning the tool description does not explain the 'topic' parameter. Although the schema itself describes the parameter with examples, the description fails to compensate for the low coverage, offering no semantic addition for the parameter.

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 it finds datasets relevant to the school board and primary schools. It uses specific examples like school facilities, education data, district school boards, student statistics, school routes, and related topics, differentiating it from general search tools like zurich_search_datasets.

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?

Implies usage for school-related data search but provides no explicit guidance on when not to use it or how it compares to alternatives like the general search tool. Lacks exclusion criteria or context for using this over zurich_search_datasets.

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

zurich_geo_featuresA
Read-onlyIdempotent

Ruft Geodaten aus dem WFS-Geoportal der Stadt Zürich als GeoJSON ab.

Liefert geografische Features (Punkte, Polygone) mit Eigenschaften wie Name, Adresse, Kategorie etc. Nützlich für Schulanlagen, Stadtkreise, Spielplätze, Veloprüfstrecken und mehr.

Returns: GeoJSON FeatureCollection mit Features und ihren Eigenschaften

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare the tool as read-only, non-destructive, and idempotent. The description adds that it returns a GeoJSON FeatureCollection and supports markdown or JSON output, but does not disclose additional behavioral traits like rate limits or authentication needs.

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?

The description is two short paragraphs, front-loading the purpose and listing examples. It is concise without redundant information, though the 'Returns' line could be more integrated.

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 the simple read-only nature, annotations, and output description (GeoJSON FeatureCollection), the description covers the essential context. It does not explain pagination or edge cases, but the tool's scope is narrow and well-covered.

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 descriptions for parameters (layer_id, format, max_features, property_filter) are detailed, so schema_description_coverage is high. The description adds minimal extra beyond mentioning feature types and properties (points, polygons, names, addresses).

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 it fetches geo data from the Zurich WFS Geoportal as GeoJSON. It lists example features (schools, districts, playgrounds) and differentiates from sibling tools which focus on other city data like parliamentary records or weather.

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 gives examples of use cases (schools, playgrounds, etc.) but does not explicitly state when to use this tool versus alternatives like zurich_geo_layers or other data tools. The usage context is implied but not clearly scoped.

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

zurich_geo_layersA
Read-onlyIdempotent

Listet alle verfügbaren WFS-Layer des Geoportals der Stadt Zürich auf.

Zeigt Layer-ID, WFS-Service-Name, Typename und Beschreibung für jeden verfügbaren Geodatensatz. Die IDs können mit dem Tool zurich_geo_features verwendet werden.

Returns: Markdown-formatierte Liste aller Geodaten-Layer (oder JSON bei format='json')

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already provide readOnlyHint, idempotentHint, and destructiveHint. The description adds that it returns a markdown-formatted list (or JSON) and mentions the format parameter, but does not disclose further behavioral traits beyond what annotations cover.

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?

The description is four sentences, clearly front-loaded with the main purpose. It is well-structured and free of fluff, though it could be slightly more concise by merging the second and third sentences.

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 simple listing tool with an output schema (present but not shown), the description covers purpose, linkage to a sibling tool, and output formats. It is complete enough for an agent to understand how to use it correctly.

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

Parameters3/5

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

Schema coverage is 0% (context signal), so the description must compensate. It mentions 'format' can be 'markdown' or 'json' and 'Markdown-formatierte Liste... (oder JSON bei format='json')'. This adds meaning but is minimal; the schema itself also has a description for format.

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 lists all available WFS layers of Zurich's geoportal, specifying the information shown (Layer-ID, WFS service name, typename, description). It also notes that the IDs can be used with zurich_geo_features, distinguishing it from sibling tools.

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 usage context: to get available layers before using zurich_geo_features. However, it does not explicitly state when to use this tool versus alternatives, nor does it list exclusions or when-not-to-use scenarios.

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

zurich_get_datasetA
Read-onlyIdempotent

Ruft vollständige Metadaten und Ressourcen eines Datensatzes ab.

Gibt Titel, Beschreibung, Autor, Lizenz, Aktualisierungsintervall, alle verfügbaren Dateiformate und Download-URLs zurück.

Returns: Strukturiertes GetDatasetResult (JSON mit Ressourcen-IDs zum Verketten mit zurich_datastore_query) plus lesbares Markdown.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
extrasNo
datasetNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, indicating safe, non-destructive behavior. The description adds value by specifying the return format (structured JSON plus markdown) and chaining opportunity, but does not disclose any additional behavioral traits like rate limits or permissions.

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 (two sentences plus a returns line), front-loaded with the main purpose, and efficiently conveys key details without extraneous information.

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

Completeness5/5

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

Given the simple single-parameter input, rich annotations, and presence of an output schema, the description sufficiently covers what the tool does, what it returns, and how it connects to other tools, making it complete for its complexity.

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 a clear description for the single parameter dataset_id, including examples. The tool description does not add further semantic detail, so it meets the baseline for a well-documented schema parameter.

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 retrieves complete metadata and resources of a dataset, listing specific fields returned (title, description, author, etc.). It distinguishes from siblings like zurich_datastore_query (query data) and zurich_search_datasets (search), making the purpose specific and unambiguous.

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 implies a usage pattern by mentioning the result can be chained with zurich_datastore_query, providing context for when to use this tool. However, it lacks explicit when-not or alternative recommendations, which is a minor gap.

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

zurich_list_categoriesA
Read-onlyIdempotent

Listet alle Datenkategorien (Gruppen) im Katalog auf oder zeigt Details einer Kategorie.

Die Stadt Zürich organisiert ihre Datensätze in 19 thematische Kategorien wie Bildung, Bevölkerung, Mobilität, Umwelt etc.

Returns: Markdown-Liste der Kategorien mit Datensatz-Anzahl

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds context: returns Markdown list with dataset counts, and that it can list all or show details. No contradictions.

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?

Description is short, front-loaded with the main action, and each sentence provides distinct value. No fluff.

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 simple listing tool with one optional parameter and an output schema, the description adequately explains the purpose and return format. Could mention the hierarchical structure if any, but not necessary.

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 schema already describes the group_id parameter with an enum and explanation. The tool description reinforces the behavior: if group_id provided, shows details; if empty, lists all. This adds practical usage context beyond the schema.

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?

Description clearly states it lists all categories or shows details of a specific category. It uses specific verb (listet/zeigt) and resource (Datenkategorien). However, it does not explicitly differentiate from similar sibling tools like zurich_list_tags, though the context suggests different purposes.

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 when to use: when you need to see categories. It explains behavior based on whether group_id is provided. However, no explicit guidance on when not to use or comparison with alternatives.

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

zurich_list_tagsA
Read-onlyIdempotent

Durchsucht verfügbare Tags im Open-Data-Katalog.

Tags helfen, thematisch verwandte Datensätze zu finden. Z.B. 'volksschule', 'kindergarten', 'schulweg' für Bildungsdaten.

Returns: Liste passender Tags

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

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=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds that the tool returns a list of tags, which is consistent with read-only behavior. No additional behavioral traits (e.g., rate limits, auth needs) are disclosed, but the annotations cover the core safety profile.

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 concise: a single sentence stating the purpose, a brief explanatory line, and an example. It is front-loaded with the core action. No unnecessary words.

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?

The tool has an output schema (not shown) and clear annotations. The description states it returns a list of tags, which is sufficient for a simple search tool. It could mention that tags are returned in order of relevance or that pagination may apply, but overall it is complete for the task.

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 provides clear descriptions for both parameters ('limit' with min/max and default, 'query' with example). The tool description does not add any further semantic meaning beyond what the schema already offers. Baseline score of 3 is appropriate given high schema coverage.

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 searches available tags in the open data catalog, with a specific verb 'Durchsucht' and resource 'Tags'. Examples like 'volksschule' and 'kindergarten' make the purpose concrete. Sibling tools cover distinct data types, so the distinction is clear.

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 mentions that tags help find thematically related datasets, which implies usage when searching for tags. However, no explicit guidance is given on when to use this tool versus alternatives or when not to use it. The context is adequate but lacks formal usage boundaries.

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

zurich_parking_liveA
Read-only

Ruft Echtzeit-Parkplatz-Belegungsdaten für die Stadt Zürich ab.

Liefert aktuelle Daten von 36 Parkhäusern und Parkplätzen: freie Plätze, Gesamtkapazität, Standort und Status. Datenquelle: ParkenDD API.

Returns: Markdown-Tabelle mit aktuellen Parkhaus-Belegungen (oder JSON bei format='json')

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds context beyond annotations by specifying the data source (ParkenDD API), number of parking garages, and output format options (Markdown table or JSON). 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.

Conciseness3/5

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

The description is presented in both German and English, which adds redundancy and length. While it is not overly long, it could be more concise by using a single language or combining the two.

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 the tool's simplicity (one optional parameter, read-only), the description covers essentials: real-time data, 36 locations, output format, and data source. It could mention limitations or update frequency, but is fairly complete.

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?

Although the schema description coverage is indicated as 0%, the schema actually contains a description for the `format` parameter. The description further clarifies by mentioning 'Markdown-Tabelle mit aktuellen Parkhaus-Belegungen (oder JSON bei format='json')', adding value beyond the 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?

The description clearly states it retrieves real-time parking occupancy data for Zurich, specifying the resource (36 parking garages) and output details. It distinguishes itself from sibling tools which are mostly about city council, air quality, or datasets, as this is the only parking-specific tool.

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 implicitly indicates usage for real-time parking data, but does not explicitly state when to use this tool vs alternatives. However, given the unique nature of this tool among siblings, the context is clear.

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

zurich_parliament_membersA
Read-onlyIdempotent

Sucht Mitglieder des Gemeinderats der Stadt Zürich.

Ermöglicht die Suche nach Name, Partei und Kommissionszugehörigkeit. Zeigt aktuelle Mandate und Funktionen.

Returns: Markdown-Liste der gefundenen Ratsmitglieder

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare it read-only, idempotent, and non-destructive. The description adds that it shows current mandates and functions and returns a Markdown list, providing additional useful behavior context.

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

Conciseness5/5

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

Extremely concise: three sentences plus a return note, front-loaded with the main purpose, no unnecessary information.

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 annotations, schema, and output schema present, the description covers the tool's purpose and return format. Lacks mention of optional parameters (format, active_only, max_results) but schema compensates.

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 mentions three of the six parameters (name, party, commission) but does not explain format, active_only, max_results. However, the input schema provides detailed parameter descriptions, so the overall parameter understanding is adequate.

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 searches for members of the city council of Zurich, and specifies searchable fields (name, party, commission). It distinguishes itself from sibling 'zurich_parliament_search' which likely focuses on documents.

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 by stating the search capabilities, but no explicit guidance on when to use this tool versus alternatives or when not to use it.

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

zurich_pedestrian_trafficA
Read-only

Liefert stündliche Passantenfrequenzen an der Zürcher Bahnhofstrasse.

Datenquelle: hystreet.com Sensoren an 3 Standorten (Nord, Mitte, Süd). Misst die Anzahl Fussgänger:innen pro Stunde inkl. Richtung und Wetter.

Returns: Stundenwerte der Passantenfrequenz (neueste zuerst)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

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?

Annotations indicate read-only and open-world hints. The description adds behavioral context: data source, measurement details (direction, weather), and ordering (newest first). It does not contradict annotations and provides useful transparency beyond them.

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 concise with two short paragraphs, four sentences. It front-loads the core purpose, includes data source and method, and uses a 'Returns' section. No wasted words.

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?

The description covers data source, measurement, and ordering. However, it omits explicit mention of the 'limit' parameter and pagination behavior. Given the presence of an output schema (not shown), the tool is mostly complete but could benefit from parameter context.

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 does not mention parameters, but the input schema includes descriptions for 'limit' and 'format' with defaults and constraints. Since the schema covers these details, the description adds no extra semantic value; baseline 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 the tool delivers hourly pedestrian frequencies at Zurich's Bahnhofstrasse, specifies data source (hystreet.com sensors at 3 locations), and mentions measured data (number of pedestrians per hour including direction and weather). This distinguishes it from other Zurich data tools.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus sibling tools (e.g., zurich_air_quality, zurich_vbz_passengers). No context about prerequisites or alternatives is given.

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

zurich_search_datasetsA
Read-onlyIdempotent

Durchsucht den Open-Data-Katalog der Stadt Zürich nach Datensätzen.

Nutzt die CKAN-Suchmaschine (Solr) für Volltextsuche über Titel, Beschreibung, Tags und Metadaten aller 900+ Datensätze.

Returns: Strukturiertes SearchResult (JSON, IDs maschinenlesbar zum Verketten mit zurich_get_dataset) plus lesbares Markdown.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of datasets in this page
errorNo
queryYes
totalNo
offsetNo
datasetsNo
next_offsetNoOffset for the next page, or null if exhausted

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows it's a safe read operation. The description adds context about using Solr for full-text search and the return format, but does not detail any limitations or error conditions.

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 concise: two short sentences that front-load the action, then explain the search engine and return format. Every sentence is meaningful with no redundancy.

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 the complexity (5 parameters well-documented in schema) and presence of an output schema, the description adequately explains the search mechanism and result usage. It could mention sorting/filtering capabilities, but the schema covers those details.

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 does not add meaning beyond what the input schema provides. Since the schema already documents all parameters with descriptions and examples (e.g., query, rows, sort), the description adds no extra value for parameter semantics.

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 'Durchsucht den Open-Data-Katalog der Stadt Zürich nach Datensätzen', specifying the verb (search) and resource (open data catalog). It distinguishes from siblings by mentioning the return format and chaining with zurich_get_dataset.

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 usage for general dataset search but does not explicitly state when to use this tool over siblings or when not to use it. No exclusions or alternative suggestions are provided.

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

zurich_strb_by_departmentA
Read-onlyIdempotent

Gibt alle öffentlichen Stadtratsbeschlüsse eines Departements zurück.

Ideal für institutionelle Analysen, z.B. alle Beschlüsse des Schul- und Sportdepartements (SSD) in einem bestimmten Quartal oder Jahr.

Args: params (BeschluesseDepartementInput): Parameter mit: - departement (str): Kürzel oder Name, z.B. 'SSD' (Pflicht) - datum_von (Optional[str]): Frühestes Datum YYYY-MM-DD - datum_bis (Optional[str]): Spätestes Datum YYYY-MM-DD - limit (int): Max. Ergebnisse (Standard: 50) - format (str): 'markdown' oder 'json'

Returns: str: Liste aller Beschlüsse des Departements. Jeder Eintrag enthält: - beschlussnummer, titel, datum, departement, link

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate readOnly, idempotent, non-destructive behavior. The description adds context about the return format (list with specific fields) and parameter behavior, going 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?

The description is structured with a clear purpose, usage example, Args section, and Returns section. Every sentence adds value and is front-loaded.

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

Completeness5/5

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

For a tool with 5 parameters and no output schema provided, the description covers all necessary aspects: input parameters, return structure, and safety (via annotations). It is complete.

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

Parameters5/5

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

Despite 0% schema description coverage, the description explains all parameters in detail, including examples for `departement` and valid formats. This compensates fully for the lack of schema descriptions.

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 it returns city council decisions by department with an example. However, it does not distinguish itself from the sibling tool `get_beschluesse_by_departement`, which appears to have a similar purpose.

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 a specific use case (institutional analysis) but does not mention when not to use this tool or suggest alternative tools for different contexts.

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

zurich_strb_detailA
Read-onlyIdempotent

Gibt die Metadaten eines einzelnen Stadtratsbeschlusses anhand der Beschlussnummer zurück.

Liefert Titel, Datum, Departement und den direkten Link zum vollständigen Beschluss auf der offiziellen Website der Stadt Zürich (stadt-zuerich.ch).

Args: params (GetSTRBDetailInput): Parameter mit: - beschlussnummer (str): Nummer im Format 'NNNN/JJJJ' (z.B. '1203/2025')

Returns: str: Markdown-Detailansicht mit beschlussnummer, titel, datum, departement, link. Fehlermeldung wenn Beschluss nicht gefunden oder ausserhalb des Archivs (vor Feb 2025).

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

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?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds context about the Markdown return format and error cases (not found or before Feb 2025), which helps with behavioral expectations 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.

Conciseness4/5

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

The description is well-structured with a summary, argument details, and return description. It is concise but covers essential information without unnecessary fluff.

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 the output schema exists, the explanation of the Markdown return format and error handling is sufficient. The tool is simple with one parameter, and the description provides adequate completeness for an agent to use it correctly.

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

Parameters4/5

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

Despite the schema description coverage being 0% per context, the description provides the format and an example for the parameter, and adds context about where the number appears. This adds value beyond the schema's pattern and length constraints.

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 it returns metadata of a single council decision (Stadtratsbeschluss) by number, listing the specific fields (title, date, department, link). It does not explicitly differentiate from the sibling tool 'get_stadtratsbeschluss_detail', which may appear similar, but the purpose is clear.

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 usage when one has a Beschlussnummer and wants details, but it does not provide guidance on when to avoid this tool or suggest alternatives like search or filtering tools among siblings.

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

zurich_tourismA
Read-onlyIdempotent

Sucht Attraktionen, Restaurants, Hotels und Events über die Zürich Tourismus API.

Liefert Informationen zu Sehenswürdigkeiten, gastronomischen Angeboten, Unterkünften, Aktivitäten und Veranstaltungen in Zürich. Daten basieren auf Schema.org-Formaten.

Returns: Markdown-formatierte Liste der Tourismus-Einträge

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the tool is known to be safe and read-only. The description adds a return format (Markdown list) but does not disclose any additional behavioral traits beyond annotations. No contradictions.

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 extremely concise: four sentences that front-load the core purpose, list supported categories, mention data format, and state the return type. No filler or repetition.

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 the tool is a straightforward search with clear categories and filters, the description and annotations together provide adequate context. An output schema is indicated as present, and the description notes the return format. Slightly lacking in usage guidance for specific categories, but overall satisfactory.

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

Parameters2/5

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

The description does not elaborate on any of the five parameters (format, category, language, max_results, search_text) beyond what the input schema already provides. Schema descriptions are detailed, but the free-form description adds no extra meaning for parameters.

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 searches (Sucht) for attractions, restaurants, hotels, and events via the Zurich Tourism API. It lists specific categories and uses a German verb that precisely describes the action. Among siblings, it is distinctly about tourism, not other city data.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It does not mention when not to use it or which sibling tools might be more appropriate for specific tasks (e.g., parking or air quality queries).

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

zurich_vbz_passengersA
Read-only

Fragt Fahrgastzahlen der Verkehrsbetriebe Zürich (VBZ) ab.

Jährlich aktualisierte Ein-/Aussteiger-Zahlen pro Linie und Haltestelle. Die Daten umfassen Tram, Bus, Trolleybus und Seilbahnen.

Returns: Fahrgastzahlen mit Linien- und Haltestellendetails

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true. The description adds that data is yearly updated, but does not disclose pagination, rate limits, or exact response structure. Some additional context but not comprehensive.

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?

The description is concise with two main sentences and a returns line. It is front-loaded with the main purpose. The returns line is somewhat redundant given an output schema exists, but it adds clarity.

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 the output schema exists, the description does not need to detail return values. It mentions key aspects (yearly updates, vehicle types). The omission of real-time indicator is acceptable as a static dataset.

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

Parameters2/5

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

Schema description coverage is 0%, meaning the tool description does not compensate for the schema's parameter descriptions. The text only mentions line and stop examples, ignoring limit, query, and format parameters. The schema itself has descriptions, but the tool description adds minimal value.

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 specifies that the tool retrieves passenger numbers for VBZ lines and stops, including vehicle types and yearly updates. This distinguishes it from unrelated sibling tools like parliament or weather data.

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?

No explicit when-to-use or when-not-to-use guidance is provided. The context implies it is for VBZ passenger data, but alternatives or exclusions are not mentioned.

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

zurich_water_weatherA
Read-only

Liefert Echtzeit-Wetterdaten der Wasserschutzpolizei Zürich.

Stationen am Zürichsee: Tiefenbrunnen und Mythenquai. 10-Minuten-Intervall mit See- und Lufttemperatur, Wind, Wasserstand, Niederschlag, Luftdruck, Taupunkt, Globalstrahlung.

Returns: Aktuelle See-Messwerte mit Wasser- und Lufttemperatur, Wind, Pegel

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

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?

Annotations already declare readOnlyHint=true, so the description adds value by specifying the real-time nature, 10-minute interval, and station-specific measurements. No contradictions 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.

Conciseness4/5

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

The description is short and front-loaded with the core purpose, then details stations, interval, and measurements. There is minor redundancy with a 'Returns' line that repeats content. Overall efficient but could be slightly tighter.

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?

The tool is simple with 3 parameters, annotations cover read-only safety, and there is an output schema. The description provides sufficient context for a real-time data retrieval tool, including what data is returned. No major gaps given the tool's complexity.

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

Parameters2/5

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

Schema description coverage is 0% according to context, meaning the description does not add meaningful information about parameters beyond what is in the schema. The tool description mentions measurements but does not explain parameters like limit, format, or station. Given low schema coverage, the description should compensate but does not.

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 it provides real-time weather data from the Zurich water police, specifying stations (Tiefenbrunnen, Mythenquai), interval (10 minutes), and measurements (water/air temperature, wind, water level, precipitation, etc.). It distinguishes itself from siblings like zurich_weather_live by focusing on water-specific weather.

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 usage for water-related weather data but does not explicitly state when to use this tool over alternatives like zurich_weather_live. No exclusions or when-not-to-use guidance is provided. Usage is implied but not instructed.

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

zurich_weather_liveA
Read-only

Liefert stündlich aktualisierte Wetterdaten der UGZ-Messstationen Zürich.

Datenquelle: Umwelt- und Gesundheitsschutz Stadt Zürich (UGZ). Messstationen: Stampfenbachstrasse, Schimmelstrasse, Rosengartenstrasse, Heubeeribüel.

Returns: Aktuelle Temperatur, Luftfeuchte, Luftdruck, Regendauer je Station

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds value by specifying the data source (UGZ), update frequency (hourly), and list of stations, which provides behavioral context beyond annotations. No contradiction.

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 concise: three sentences covering purpose, data source, stations, and return values. It is front-loaded with the main action and efficiently structured.

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 the existence of an output schema (context indicates yes) and annotations covering safety, the description is complete enough. It mentions return values (temperature, humidity, etc.) and station list, adequately complementing the schema.

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 has descriptions for each parameter (limit, format, station, parameter), achieving high schema description coverage. The description does not add further parameter details, 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 the tool 'liefert stündlich aktualisierte Wetterdaten der UGZ-Messstationen Zürich', specifying the verb 'delivers', resource (weather data), and scope (hourly, from specific stations). It distinguishes itself from siblings like zurich_air_quality and zurich_water_weather by focusing on live weather data from UGZ stations.

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 live weather data but does not explicitly compare with sibling tools or provide when-not-to-use guidance. Given the existence of weather-related siblings (e.g., zurich_air_quality, zurich_water_weather), more explicit distinction would be helpful.

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. Dates show when Glama detected each change.

  1. 18 tool updatesv0.5.0
    • Changedzurich_air_quality5 fields changed
      • addedInput schema / $defs / AirQualityInput / properties / format
        Added value: +{
        +  "default": "markdown",
        +  "description": "Ausgabeformat: 'markdown' (Standard, lesbar) oder 'json' (maschinenlesbar).",
        +  "enum": [
        +    "markdown",
        +    "json"
        +  ],
        +  "title": "Format",
        +  "type": "string"
        +}
      • changedInput schema / $defs / AirQualityInput / properties / parameter / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "NO",
        +      "NO2",
        +      "NOx",
        +      "O3",
        +      "PM10",
        +      "PM2.5"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / AirQualityInput / properties / parameter / description
        Previous value: -"Schadstoff: 'NO2' (Stickstoffdioxid), 'O3' (Ozon), 'PM10' (Feinstaub), 'PM2.5', 'NOx', 'SO2', 'CO'. Leer = alle."New value: +"Schadstoff: 'NO2' (Stickstoffdioxid), 'O3' (Ozon), 'PM10' (Feinstaub), 'PM2.5', 'NO', 'NOx'. Leer = alle."
      • changedInput schema / $defs / AirQualityInput / properties / station / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "Zch_Heubeeribüel",
        +      "Zch_Rosengartenstrasse",
        +      "Zch_Schimmelstrasse",
        +      "Zch_Stampfenbachstrasse"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / AirQualityInput / properties / station / description
        Previous value: -"Messstation: 'Zch_Stampfenbachstrasse', 'Zch_Schimmelstrasse', 'Zch_Rosengartenstrasse', 'Zch_Heubeeribüel', 'Zch_Kaserne'. Leer = alle."New value: +"Messstation filtern. Verfügbar: Zch_Heubeeribüel, Zch_Rosengartenstrasse, Zch_Schimmelstrasse, Zch_Stampfenbachstrasse. Leer = alle."
    • Changedzurich_analyze_datasets10 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "DatasetAnalysis": {
        +    "description": "Per-dataset slice of an analysis run.",
        +    "properties": {
        +      "datastore_records": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Datastore Records"
        +      },
        +      "fields": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "$ref": "#/$defs/FieldInfo"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Fields"
        +      },
        +      "formats": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Formats",
        +        "type": "array"
        +      },
        +      "id": {
        +        "title": "Id",
        +        "type": "string"
        +      },
        +      "modified": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Modified"
        +      },
        +      "resources": {
        +        "items": {
        +          "$ref": "#/$defs/ResourceInfo"
        +        },
        +        "title": "Resources",
        +        "type": "array"
        +      },
        +      "title": {
        +        "title": "Title",
        +        "type": "string"
        +      },
        +      "update_interval": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Update Interval",
        +        "type": "array"
        +      },
        +      "url": {
        +        "title": "Url",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "title",
        +      "url"
        +    ],
        +    "title": "DatasetAnalysis",
        +    "type": "object"
        +  },
        +  "FieldInfo": {
        +    "description": "A DataStore field (column) definition.",
        +    "properties": {
        +      "id": {
        +        "title": "Id",
        +        "type": "string"
        +      },
        +      "type": {
        +        "title": "Type",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "type"
        +    ],
        +    "title": "FieldInfo",
        +    "type": "object"
        +  },
        +  "ResourceInfo": {
        +    "description": "A single downloadable resource of a dataset.",
        +    "properties": {
        +      "datastore_active": {
        +        "default": false,
        +        "description": "True if the resource is queryable via the CKAN DataStore API",
        +        "title": "Datastore Active",
        +        "type": "boolean"
        +      },
        +      "format": {
        +        "title": "Format",
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Resource UUID — use as resource_id for DataStore queries",
        +        "title": "Id",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "url": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Url"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "format"
        +    ],
        +    "title": "ResourceInfo",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / description
        Added value: +"Result of an analysis run across several datasets."
      • addedOutput schema / properties / analyzed
        Added value: +{
        +  "default": 0,
        +  "title": "Analyzed",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / datasets
        Added value: +{
        +  "items": {
        +    "$ref": "#/$defs/DatasetAnalysis"
        +  },
        +  "title": "Datasets",
        +  "type": "array"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Error"
        +}
      • addedOutput schema / properties / query
        Added value: +{
        +  "title": "Query",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "title": "Result",
        -  "type": "string"
        -}
      • addedOutput schema / properties / total
        Added value: +{
        +  "default": 0,
        +  "title": "Total",
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "query"
        +]
      • changedOutput schema / title
        Previous value: -"zurich_analyze_datasetsOutput"New value: +"AnalysisResult"
    • Changedzurich_geo_features1 field changed
      • addedInput schema / $defs / GeoFeaturesInput / properties / format
        Added value: +{
        +  "default": "markdown",
        +  "description": "Ausgabeformat: 'markdown' (Standard, lesbar) oder 'json' (maschinenlesbar). Bei 'json' wird die rohe GeoJSON-FeatureCollection zurückgegeben.",
        +  "enum": [
        +    "markdown",
        +    "json"
        +  ],
        +  "title": "Format",
        +  "type": "string"
        +}
    • Changedzurich_geo_layers2 fields changed
      • addedInput schema / $defs
        Added value: +{
        +  "GeoLayersInput": {
        +    "additionalProperties": false,
        +    "description": "Input für die Layer-Liste.",
        +    "properties": {
        +      "format": {
        +        "default": "markdown",
        +        "description": "Ausgabeformat: 'markdown' (Standard, lesbar) oder 'json' (maschinenlesbar).",
        +        "enum": [
        +          "markdown",
        +          "json"
        +        ],
        +        "title": "Format",
        +        "type": "string"
        +      }
        +    },
        +    "title": "GeoLayersInput",
        +    "type": "object"
        +  }
        +}
      • addedInput schema / properties / params
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/GeoLayersInput"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Changedzurich_get_dataset8 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "DatasetSummary": {
        +    "description": "Compact, machine-readable view of a CKAN dataset.",
        +    "properties": {
        +      "author": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Author"
        +      },
        +      "groups": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Groups",
        +        "type": "array"
        +      },
        +      "id": {
        +        "description": "CKAN dataset name/slug — use as dataset_id in zurich_get_dataset",
        +        "title": "Id",
        +        "type": "string"
        +      },
        +      "license": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "License"
        +      },
        +      "modified": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Last modified date (YYYY-MM-DD)",
        +        "title": "Modified"
        +      },
        +      "notes": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Notes"
        +      },
        +      "num_resources": {
        +        "default": 0,
        +        "title": "Num Resources",
        +        "type": "integer"
        +      },
        +      "resources": {
        +        "items": {
        +          "$ref": "#/$defs/ResourceInfo"
        +        },
        +        "title": "Resources",
        +        "type": "array"
        +      },
        +      "tags": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Tags",
        +        "type": "array"
        +      },
        +      "title": {
        +        "title": "Title",
        +        "type": "string"
        +      },
        +      "update_interval": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Update Interval",
        +        "type": "array"
        +      },
        +      "url": {
        +        "title": "Url",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "title",
        +      "url"
        +    ],
        +    "title": "DatasetSummary",
        +    "type": "object"
        +  },
        +  "ResourceInfo": {
        +    "description": "A single downloadable resource of a dataset.",
        +    "properties": {
        +      "datastore_active": {
        +        "default": false,
        +        "description": "True if the resource is queryable via the CKAN DataStore API",
        +        "title": "Datastore Active",
        +        "type": "boolean"
        +      },
        +      "format": {
        +        "title": "Format",
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Resource UUID — use as resource_id for DataStore queries",
        +        "title": "Id",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "url": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Url"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "format"
        +    ],
        +    "title": "ResourceInfo",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / description
        Added value: +"Full metadata for a single dataset."
      • addedOutput schema / properties / dataset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/DatasetSummary"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Error"
        +}
      • addedOutput schema / properties / extras
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "title": "Extras",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "title": "Result",
        -  "type": "string"
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"zurich_get_datasetOutput"New value: +"GetDatasetResult"
    • Changedzurich_parking_live2 fields changed
      • addedInput schema / $defs
        Added value: +{
        +  "ParkingLiveInput": {
        +    "additionalProperties": false,
        +    "description": "Input für Echtzeit-Parkplatzdaten.",
        +    "properties": {
        +      "format": {
        +        "default": "markdown",
        +        "description": "Ausgabeformat: 'markdown' (Standard, lesbar) oder 'json' (maschinenlesbar).",
        +        "enum": [
        +          "markdown",
        +          "json"
        +        ],
        +        "title": "Format",
        +        "type": "string"
        +      }
        +    },
        +    "title": "ParkingLiveInput",
        +    "type": "object"
        +  }
        +}
      • addedInput schema / properties / params
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/ParkingLiveInput"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Changedzurich_parliament_members1 field changed
      • addedInput schema / $defs / ParliamentMembersInput / properties / format
        Added value: +{
        +  "default": "markdown",
        +  "description": "Ausgabeformat: 'markdown' (Standard, lesbar) oder 'json' (maschinenlesbar).",
        +  "enum": [
        +    "markdown",
        +    "json"
        +  ],
        +  "title": "Format",
        +  "type": "string"
        +}
    • Changedzurich_parliament_search1 field changed
      • addedInput schema / $defs / ParliamentSearchInput / properties / format
        Added value: +{
        +  "default": "markdown",
        +  "description": "Ausgabeformat: 'markdown' (Standard, lesbar) oder 'json' (maschinenlesbar).",
        +  "enum": [
        +    "markdown",
        +    "json"
        +  ],
        +  "title": "Format",
        +  "type": "string"
        +}
    • Changedzurich_pedestrian_traffic1 field changed
      • addedInput schema / $defs / PedestrianInput / properties / format
        Added value: +{
        +  "default": "markdown",
        +  "description": "Ausgabeformat: 'markdown' (Standard, lesbar) oder 'json' (maschinenlesbar).",
        +  "enum": [
        +    "markdown",
        +    "json"
        +  ],
        +  "title": "Format",
        +  "type": "string"
        +}
    • Changedzurich_search_datasets12 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "DatasetSummary": {
        +    "description": "Compact, machine-readable view of a CKAN dataset.",
        +    "properties": {
        +      "author": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Author"
        +      },
        +      "groups": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Groups",
        +        "type": "array"
        +      },
        +      "id": {
        +        "description": "CKAN dataset name/slug — use as dataset_id in zurich_get_dataset",
        +        "title": "Id",
        +        "type": "string"
        +      },
        +      "license": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "License"
        +      },
        +      "modified": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Last modified date (YYYY-MM-DD)",
        +        "title": "Modified"
        +      },
        +      "notes": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Notes"
        +      },
        +      "num_resources": {
        +        "default": 0,
        +        "title": "Num Resources",
        +        "type": "integer"
        +      },
        +      "resources": {
        +        "items": {
        +          "$ref": "#/$defs/ResourceInfo"
        +        },
        +        "title": "Resources",
        +        "type": "array"
        +      },
        +      "tags": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Tags",
        +        "type": "array"
        +      },
        +      "title": {
        +        "title": "Title",
        +        "type": "string"
        +      },
        +      "update_interval": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Update Interval",
        +        "type": "array"
        +      },
        +      "url": {
        +        "title": "Url",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "title",
        +      "url"
        +    ],
        +    "title": "DatasetSummary",
        +    "type": "object"
        +  },
        +  "ResourceInfo": {
        +    "description": "A single downloadable resource of a dataset.",
        +    "properties": {
        +      "datastore_active": {
        +        "default": false,
        +        "description": "True if the resource is queryable via the CKAN DataStore API",
        +        "title": "Datastore Active",
        +        "type": "boolean"
        +      },
        +      "format": {
        +        "title": "Format",
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Resource UUID — use as resource_id for DataStore queries",
        +        "title": "Id",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "url": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Url"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "format"
        +    ],
        +    "title": "ResourceInfo",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / description
        Added value: +"Result of a dataset search."
      • addedOutput schema / properties / count
        Added value: +{
        +  "default": 0,
        +  "description": "Number of datasets in this page",
        +  "title": "Count",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / datasets
        Added value: +{
        +  "items": {
        +    "$ref": "#/$defs/DatasetSummary"
        +  },
        +  "title": "Datasets",
        +  "type": "array"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Error"
        +}
      • addedOutput schema / properties / next_offset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Offset for the next page, or null if exhausted",
        +  "title": "Next Offset"
        +}
      • addedOutput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "title": "Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / query
        Added value: +{
        +  "title": "Query",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "title": "Result",
        -  "type": "string"
        -}
      • addedOutput schema / properties / total
        Added value: +{
        +  "default": 0,
        +  "title": "Total",
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "query"
        +]
      • changedOutput schema / title
        Previous value: -"zurich_search_datasetsOutput"New value: +"SearchResult"
    • Removedzurich_sparql
    • Addedzurich_strb_by_department
    • Addedzurich_strb_detail
    • Addedzurich_strb_search
    • Changedzurich_tourism1 field changed
      • addedInput schema / $defs / TourismSearchInput / properties / format
        Added value: +{
        +  "default": "markdown",
        +  "description": "Ausgabeformat: 'markdown' (Standard, lesbar) oder 'json' (maschinenlesbar).",
        +  "enum": [
        +    "markdown",
        +    "json"
        +  ],
        +  "title": "Format",
        +  "type": "string"
        +}
    • Changedzurich_vbz_passengers3 fields changed
      • addedInput schema / $defs / VBZPassengersInput / properties / format
        Added value: +{
        +  "default": "markdown",
        +  "description": "Ausgabeformat: 'markdown' (Standard, lesbar) oder 'json' (maschinenlesbar).",
        +  "enum": [
        +    "markdown",
        +    "json"
        +  ],
        +  "title": "Format",
        +  "type": "string"
        +}
      • changedInput schema / $defs / VBZPassengersInput / properties / line / description
        Previous value: -"Liniennummer filtern, z.B. '4' (Tram 4), '33' (Bus 33). Leer = alle Linien."New value: +"Liniennummer filtern (exakter Linienname), z.B. '4' (Tram 4), '33' (Bus 33). Leer = alle Linien."
      • changedInput schema / $defs / VBZPassengersInput / properties / stop / description
        Previous value: -"Haltestelle filtern (Name oder Teilname), z.B. 'Paradeplatz', 'Central', 'Bellevue'. Leer = alle."New value: +"Haltestelle filtern (Name oder Teilname), z.B. 'Paradeplatz', 'Central', 'Bellevue'. Wird über das Haltestellenverzeichnis aufgelöst. Leer = alle."
    • Changedzurich_water_weather1 field changed
      • addedInput schema / $defs / WaterWeatherInput / properties / format
        Added value: +{
        +  "default": "markdown",
        +  "description": "Ausgabeformat: 'markdown' (Standard, lesbar) oder 'json' (maschinenlesbar).",
        +  "enum": [
        +    "markdown",
        +    "json"
        +  ],
        +  "title": "Format",
        +  "type": "string"
        +}
    • Changedzurich_weather_live5 fields changed
      • addedInput schema / $defs / WeatherLiveInput / properties / format
        Added value: +{
        +  "default": "markdown",
        +  "description": "Ausgabeformat: 'markdown' (Standard, lesbar) oder 'json' (maschinenlesbar).",
        +  "enum": [
        +    "markdown",
        +    "json"
        +  ],
        +  "title": "Format",
        +  "type": "string"
        +}
      • changedInput schema / $defs / WeatherLiveInput / properties / parameter / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "Hr",
        +      "RainDur",
        +      "StrGlo",
        +      "T",
        +      "WD",
        +      "WVs",
        +      "WVv",
        +      "p"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / WeatherLiveInput / properties / parameter / description
        Previous value: -"Messparameter filtern: 'T' (Temperatur °C), 'Hr' (Luftfeuchte %), 'p' (Luftdruck hPa), 'RainDur' (Regendauer min). Leer = alle."New value: +"Messparameter filtern: 'T' (Temperatur °C), 'Hr' (Luftfeuchte %), 'p' (Luftdruck hPa), 'RainDur' (Regendauer min), 'StrGlo' (Globalstrahlung W/m²), 'WD' (Windrichtung °), 'WVs'/'WVv' (Windgeschwindigkeit m/s). Leer = alle."
      • changedInput schema / $defs / WeatherLiveInput / properties / station / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "Zch_Heubeeribüel",
        +      "Zch_Rosengartenstrasse",
        +      "Zch_Schimmelstrasse",
        +      "Zch_Stampfenbachstrasse"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / WeatherLiveInput / properties / station / description
        Previous value: -"Messstation filtern (z.B. 'Zch_Stampfenbachstrasse', 'Zch_Schimmelstrasse', 'Zch_Rosengartenstrasse'). Leer = alle Stationen."New value: +"Messstation filtern. Verfügbar: Zch_Heubeeribüel, Zch_Rosengartenstrasse, Zch_Schimmelstrasse, Zch_Stampfenbachstrasse. Leer = alle Stationen."
  2. 24 tool updatesv0.3.3
    • First observedget_beschluesse_by_departement
    • First observedget_stadtratsbeschluss_detail
    • First observedsearch_stadtratsbeschluesse
    • First observedzurich_air_quality
    • First observedzurich_analyze_datasets
    • First observedzurich_catalog_stats
    • First observedzurich_datastore_query
    • First observedzurich_datastore_sql
    • First observedzurich_find_school_data
    • First observedzurich_geo_features
    • First observedzurich_geo_layers
    • First observedzurich_get_dataset
    • First observedzurich_list_categories
    • First observedzurich_list_tags
    • First observedzurich_parking_live
    • First observedzurich_parliament_members
    • First observedzurich_parliament_search
    • First observedzurich_pedestrian_traffic
    • First observedzurich_search_datasets
    • First observedzurich_sparql
    • First observedzurich_tourism
    • First observedzurich_vbz_passengers
    • First observedzurich_water_weather
    • First observedzurich_weather_live

TDQS

B3.3/5.0
Disambiguation3/5

The presence of deprecated alias tools (get_beschluesse_by_departement, etc.) alongside the newer zurich_strb_* tools creates direct overlap and ambiguity. While most tools target distinct domains, these redundant entries could cause an agent to select the wrong tool or confuse the two sets.

Naming Consistency4/5

The majority of tools follow a consistent zurich_verb_noun pattern (e.g., zurich_search_datasets, zurich_parking_live). However, the deprecated aliases use a different naming style (get_... instead of zurich_...) and the zurich_strb_* tools use an abbreviated naming that slightly breaks the pattern.

Tool Count5/5

With 26 tools covering diverse domains (air quality, weather, parking, parliament, tourism, geographic data, etc.), the count is well-scoped for a city open data portal. Each tool serves a distinct purpose and earns its place without feeling bloated.

Completeness4/5

The tool surface covers a broad range of Zurich open data topics, including live data, search, geographic features, and parliamentary records. Minor gaps exist (e.g., no update or create operations), but these are acceptable for a read-only API focused on data exploration.

Maintenance

ActivityActive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/malkreide/zurich-opendata-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server