Skip to main content
Glama
DCC-BS
by DCC-BS

data-bs-mcp

MCP server for any Huwise/Opendatasoft data portal.

Installation

uv sync

Related MCP server: mcp-data-strasbourg

Usage

uv run main.py

Debug

npx @modelcontextprotocol/inspector uv run main.py

Install with uvx

uvx --from git+https://github.com/DCC-BS/mcp-data-bs data-bs-mcp

Selecting a catalog

The catalog is chosen by whoever deploys the server via the .env file next to main.py. All Huwise/Opendatasoft portals share the same API path, so you only set the domain:

# .env
DATA_PORTAL_DOMAIN=data.bl.ch

The full API base URL is built as https://<domain>/api/explore/v2.1.

The .env file is committed, so a fork carries its catalog choice through uvx installs as well.

Configuration

OpenCode

Add to your OpenCode config:

{
  "mcpServers": {
    "data-bs": {
      "command": "uv",
      "args": [
        "--directory",
        "/ABSOLUTE/PATH/TO/data-bs-mcp",
        "run",
        "main.py"
      ]
    }
  }
}

Cursor

Add to your Cursor config (~/.cursor/mcp.json):

{
  "mcpServers": {
    "data-bs": {
      "command": "uv",
      "args": [
        "--directory",
        "/ABSOLUTE/PATH/TO/data-bs-mcp",
        "run",
        "main.py"
      ]
    }
  }
}

Tools

get_datasets

Search and list available datasets.

Two search modes:

  • semantic (default): ranks the catalog by meaning using the vector_similarity explore endpoint from Huwise. Best for natural-language / conceptual queries. Matches synonyms and other languages.

  • lexical: classic full-text match on the exact terms.

# semantic (default) — natural language, ranked by relevance
get_datasets(search="air quality measurements")

# lexical — exact full-text match
get_datasets(search="luft", search_mode="lexical")

# combine with facet filters
get_datasets(search="bevölkerung", refine="publisher:Statistisches Amt")

get_dataset

Get detailed metadata for a specific dataset.

get_dataset(dataset_id="100113")

get_records

Query records from a dataset with ODSQL filtering.

get_records(dataset_id="100113", where="pm25 > 10", limit=100, order_by="time DESC")

get_facets

Get available facet values for filtering.

get_facets(facet="publisher")  # Options: publisher, keyword, theme, features, modified, language

export_dataset_url

Get download URL for dataset export.

export_dataset_url(dataset_id="100113", format="csv", where="sensornr=240")

Formats: csv, json, geojson, xlsx, shp, parquet, gpx, kml, rdfxml, jsonld, turtle

Available Tools

5 tools
export_dataset_urlGet Export URLA

Generate a download URL for exporting a dataset in various formats (CSV, JSON, GeoJSON, XLSX, Shapefile, Parquet, etc.). Use this when you need to download or share dataset exports.

ParametersJSON Schema
NameRequiredDescriptionDefault
whereNo
formatNojson
dataset_idYes

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?

With no annotations provided, the description carries the burden. It explains that the tool generates a URL, implying no direct data manipulation, but does not explicitly state side effects, expiration, or permission requirements. Thus it provides minimal but non-contradictory behavioral 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?

The description is two sentences, front-loaded with the core action, and contains no filler. It is appropriately sized for the tool's complexity.

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?

The description covers the tool's purpose and usage context, and an output schema exists to define return values. However, the 'where' parameter is left unexplained, which is a notable gap for a tool with three parameters.

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 schema has 0% description coverage, so the description must compensate. It adds format examples for the 'format' parameter, but does not explain 'where' or 'dataset_id' beyond their schema titles. This is insufficient for a low-coverage 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 specifies the tool's function: generating a download URL for dataset exports. It lists supported formats and distinguishes itself from sibling tools that fetch datasets/records/facets.

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 provides an explicit use case: 'Use this when you need to download or share dataset exports.' However, it does not explicitly mention alternatives or when not to use this tool, so it scores a 4 rather than a 5.

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

get_datasetGet Dataset MetadataA

Get detailed metadata for a specific dataset including field definitions, schema, publisher info, and record count. Use this to understand a dataset's structure before querying records.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_idYes

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations provided, the description must carry the full burden of behavioral disclosure. It explains what the tool returns (metadata fields), which is useful, but it does not explicitly state that it is read-only, nor does it mention error conditions, auth needs, or any caveats. The 'get' verb hints at safety, but it is not fully transparent.

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 two sentences, front-loaded with the core action, and every sentence adds value. It efficiently combines purpose, output contents, and usage context without any 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 a single simple parameter and no output schema, the description is fairly complete: it states what is returned (field definitions, schema, publisher info, record count) and when to use it. It does not detail error responses or output format, but for a metadata retrieval tool, this is adequate.

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 schema provides only a required dataset_id of type string with 0% description coverage. The description adds minimal context by saying 'for a specific dataset,' but it does not explain how the ID maps to the resource, where to find it, or its expected format. The description does not compensate sufficiently for the lack of schema-level parameter documentation.

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 detailed metadata for a specific dataset, listing the types of metadata (field definitions, schema, publisher info, record count). This stands out from siblings like get_datasets (likely a listing) and get_records (querying records), making the purpose immediate 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 gives clear context for when to use: 'Use this to understand a dataset's structure before querying records.' This implies a workflow and differentiates from get_records, but it does not explicitly name alternatives or state when not to use the tool.

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

get_datasetsSearch DatasetsA

Search and list available open datasets from data.bs.ch. Two modes: 'semantic' (default) ranks the catalog by meaning using natural-language queries (handles synonyms and other languages); 'lexical' does a classic full-text match on the exact terms. Use semantic for conceptual discovery, lexical for precise term/name lookups.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
refineNo
searchNo
excludeNo
order_byNo
timezoneNo
search_modeNosemantic
include_app_metasNo

TDQS

A3.9/5.0
Behavior4/5

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

The description discloses key behavioral traits: it only searches open datasets, and it has two modes with distinct matching behavior. Semantic mode handles synonyms and other languages, lexical does exact matching. Since there are no annotations, this is helpful context, but it omits details such as pagination behavior or rate limits, which are often relevant for search tools.

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

Conciseness5/5

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

The description is three sentences long and front-loads the purpose. It succinctly explains the two modes and provides usage guidance without extraneous words.

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

Completeness2/5

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

The tool has nine parameters and no annotations or output schema, so the description needs to be quite thorough. It covers the core purpose and search modes, but it does not explain the majority of the parameters or the structure of the returned list. This leaves significant gaps for an agent trying to invoke the tool correctly.

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 input schema has nine parameters with zero descriptions, so the description must compensate. It explains 'search_mode' (semantic vs lexical) and implies the 'search' parameter, but leaves limit, offset, refine, exclude, order_by, timezone, and include_app_metas entirely unexplained. Given the low schema coverage, this is insufficient.

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 a specific action ('Search and list available open datasets') and identifies the source ('data.bs.ch'). It distinguishes itself from sibling tools by being the plural search tool, while 'get_dataset' implies retrieving a specific dataset. The two search modes further clarify its purpose.

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 provides explicit guidance on when to use each search mode: 'Use semantic for conceptual discovery, lexical for precise term/name lookups.' This is clear context, but it does not explicitly mention when to prefer sibling tools like 'get_dataset' for fetching a specific dataset, though the purpose implies the distinction.

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

get_facetsGet Facet ValuesB

Get available filter values for categorizing datasets. Useful for discovering publishers, keywords, themes, or other facets to refine dataset searches.

ParametersJSON Schema
NameRequiredDescriptionDefault
facetNo

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full burden of behavioral disclosure. It only says 'get' and 'discovering', which implies a read operation, but does not explicitly state safety, side effects, authentication needs, or return format. This is a significant gap.

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 two concise sentences. The first sentence states the core function, and the second adds practical context. There is no fluff or redundancy.

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?

With no output schema and no annotations, the description should clarify what the tool returns and how to use the optional parameter. It lacks details on return structure, default behavior when 'facet' is null, and any limitations. The description is minimal and leaves the agent guessing.

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 input schema has one parameter 'facet' with no description, and the schema description coverage is 0%. The tool description does not explain how to use the 'facet' parameter, what valid values are, or whether it is required. It only mentions types of facets without linking them to 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?

The description clearly states the tool 'gets available filter values for categorizing datasets' and lists examples like publishers, keywords, and themes. This specific verb+resource pairing distinguishes it from siblings that deal with datasets/records rather than facets.

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 phrase 'Useful for discovering publishers, keywords, themes, or other facets to refine dataset searches' gives clear context for when to use this tool. It does not explicitly name alternatives or exclusions, but the use case is well implied.

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

get_recordsQuery Dataset RecordsA

Query and filter records from a dataset using ODSQL syntax. Use this to retrieve actual data from a dataset with optional WHERE clauses, ordering, and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNo
limitNo
whereNo
offsetNo
refineNo
selectNo
excludeNo
group_byNo
order_byNo
timezoneNo
dataset_idYes
include_linksNo

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It reveals important behavioral traits: ODSQL syntax, optional filters, ordering, and pagination. However, it does not explain return format, default pagination behavior, or error handling, leaving gaps for a query tool.

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 two sentences, front-loaded with the core purpose. Every word adds value, and the structure is efficient for a tool description.

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 12 parameters, no annotations, and no output schema, the description is notably incomplete. It gives only a surface-level overview and does not clarify the ODSQL syntax or the semantics of the many optional parameters. This is insufficient for an agent to use the tool correctly without additional context.

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%, so the description must compensate. It mentions high-level concepts like WHERE, ordering, and pagination, but fails to map them to actual parameters (where, order_by, limit, offset). Many parameters (select, refine, group_by, timezone, include_links) remain completely unexplained, making proper invocation difficult.

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's purpose: 'Query and filter records from a dataset using ODSQL syntax.' It specifies the verb (query/filter), resource (records from a dataset), and distinguishes itself from siblings by emphasizing 'actual data' versus metadata or export functions.

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 provides clear context: 'Use this to retrieve actual data from a dataset with optional WHERE clauses, ordering, and pagination.' This tells the agent when to use the tool, though it does not explicitly mention exclusions or alternative tools. It lacks a direct comparison to siblings like get_dataset or get_facets.

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. 5 tool updatesv0.1.0
    • First observedexport_dataset_url
    • First observedget_dataset
    • First observedget_datasets
    • First observedget_facets
    • First observedget_records

TDQS

A3.9/5.0
Disambiguation4/5

Each tool targets a distinct stage: search (get_datasets), metadata (get_dataset), facets (get_facets), records (get_records), and export (export_dataset_url). Minor potential confusion exists between get_datasets and get_facets for discovery, but descriptions clarify their different purposes.

Naming Consistency5/5

All tools follow a verb_noun pattern, with four using 'get_' and one using 'export_', both being clear verbs. The naming is consistent and predictable across the set.

Tool Count5/5

Five tools is well-scoped for a data portal: search, metadata, facets, records, and export cover the core read workflows without unnecessary bloat.

Completeness5/5

The set covers the full read lifecycle: discover datasets, understand their structure, query records, and export data. No obvious missing operations for a public read-only open data portal.

Maintenance

ActivityInactive
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

  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for accessing Strasbourg Open Data (data.strasbourg.eu). Allows searching datasets, retrieving metadata, and querying records with ODSQL.
    16
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    An MCP server to find and fetch Norwegian open government data from data.norge.no. Enables search, metadata retrieval, and data download.
    5
    3
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for the French open-data catalogue data.gouv.fr, enabling dataset search and retrieval, organization lookup, and reuse discovery via natural language queries.
    15
    MIT

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/DCC-BS/mcp-data-bs'

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