Read-only mirror of https://github.com/DCC-BS/mcp-data-bs — Basel-Stadt. Issues & pull requests at the source.
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Johannes Hool d738657d44
Feat/add vector similarity search (#2)
* feat: add vector similarity search, streamline lexical search

* docs: add semantic search info to readme

* refact: move catalog url to a .env file

* fix: normalize query strings to prevent odsql errors in huwise

---------

Co-authored-by: Hool, Johannes FKD <johannes.hool@bl.ch>
2026-06-02 09:36:45 +02:00
.env Feat/add vector similarity search (#2) 2026-06-02 09:36:45 +02:00
.gitignore inital commit 2026-02-27 12:55:27 +01:00
.python-version inital commit 2026-02-27 12:55:27 +01:00
main.py Feat/add vector similarity search (#2) 2026-06-02 09:36:45 +02:00
pyproject.toml Feat/add vector similarity search (#2) 2026-06-02 09:36:45 +02:00
README.md Feat/add vector similarity search (#2) 2026-06-02 09:36:45 +02:00
uv.lock fixed the search added uvx support 2026-02-27 14:33:49 +01:00

data-bs-mcp

MCP server for any Huwise/Opendatasoft data portal.

Installation

uv sync

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