Skip to main content
Glama
janmanuelwinkler

Swiss Law Local Search

README.md
# Swiss Law Local Search — MCP Server

Offline full-text search across **35,000+ Swiss laws** from all 26 cantons + federal level.

Built on the [rcds/swiss_legislation](https://huggingface.co/datasets/rcds/swiss_legislation) HuggingFace dataset (sourced from LexFind.ch), indexed locally with SQLite FTS5.

## Architecture

```
HuggingFace dataset (35k laws)
        │
        ▼  build_index.py (run once)
   swiss_law.db  (SQLite + FTS5 full-text index)
        │
        ▼  search_client.py
   server.py  (MCP tools)
        │
        ▼  stdio / SSE
   Claude Desktop / Cowork
```

## Setup

```bash
cd lexfind-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

# Build the index (downloads ~2-3 GB, takes 5-10 min)
python build_index.py
```

## Add to Claude Desktop

```json
{
  "mcpServers": {
    "swiss-law": {
      "command": "/ABSOLUTE/PATH/TO/lexfind-mcp/.venv/bin/python3",
      "args": ["/ABSOLUTE/PATH/TO/lexfind-mcp/server.py"]
    }
  }
}
```

## Tools

| Tool | What | Example |
|---|---|---|
| `search_laws` | Full-text search | `search_laws("Raumplanung", canton="zh")` |
| `get_law` | Metadata by ID | `get_law(1234)` |
| `get_law_text` | Full text | `get_law_text(1234)` |
| `get_article` | Single article | `get_article(1234, "22")` |
| `list_cantons` | Canton overview | `list_cantons()` |

## FTS5 query syntax

The search supports SQLite FTS5 syntax:

- `Raumplanung` — simple term match
- `Planungs- und Baugesetz` — implicit AND
- `"öffentliches Recht"` — exact phrase
- `title:Baugesetz` — search only in title column
- `Raumplan*` — prefix match
- `Baugesetz OR Planungsgesetz` — boolean OR
- `canton:zh AND Bauordnung` — combine with column filter

## Combining with the Fedlex MCP

This server and the Fedlex MCP server complement each other:

- **This server**: fast offline search, covers all cantons, has full text
- **Fedlex MCP**: live data, amendment history, FRBR versioning, legal taxonomy

You can run both in Claude Desktop simultaneously.

## Updating the data

The HuggingFace dataset is a snapshot. To refresh:

```bash
python build_index.py   # will ask to rebuild if DB exists
```

## License

Data: CC-BY-SA-4.0 (from HuggingFace dataset)
Code: MIT