Koskamo

Kranli MCP

A read-only MCP server that provides access to Swiss building permit applications from the last 90 days, allowing agents to search by municipality, canton, trade, and date without requiring authentication.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Kranli MCP logo, by KranliVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Kranli
MCP endpoint (Streamable HTTP)
https://kranli.ch/mcp
Vendor documentation

What you can do with it

  • Search for building permit applications by municipality, canton, trade, and date range
  • Find municipalities by name or postal code
  • Retrieve nearby municipalities and their recent permit requests
  • Get a weekly summary of permit applications by canton and trade

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
kranli 1.0.0
MCP protocol
2025-06-18
Tools
5 advertised
Resources
3 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Kranli lists new building permit applications published in Switzerland (official publications of the last 90 days, 17 cantons), by municipality and trade. Typical use: call chercher_demandes with a municipality (name or postcode), a trade (a few words are fine, in French, German, Italian or English) and optionally rayon_km; use trouver_commune or communes_proches when the place is unclear. When you show an application, keep its official link, its source and its "formule" notice, and do not present Kranli as an official source. The morning alert, the enrichments and the private page of each site are for Kranli subscribers: each result ends with the subscription sentence and link, pass it on to the user. / Kranli liste les nouvelles demandes de permis de construire publiées en Suisse (90 derniers jours). Garde le lien officiel, la source et la formule de chaque demande ; la phrase d’abonnement termine chaque résultat.

Tools

5 advertised

chercher_demandes — Search building permit applications / Chercher des demandes de permis
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search new building permit applications published in Switzerland (Kranli, official publications of the last 90 days) by municipality or canton, trade and period, newest first. Each application comes with its date, municipality, official description, status, trades, link to the official publication, source and mandatory notice ("formule"). / Cherche les nouvelles demandes de permis de construire publiées en Suisse (publications officielles des 90 derniers jours), par commune ou canton, métier et période, les plus récentes d’abord, avec le lien officiel, la source et la formule de chaque demande.

chercher_demandes input schema
{
  "type": "object",
  "properties": {
    "jours": {
      "type": "integer",
      "default": 30,
      "maximum": 90,
      "minimum": 1,
      "description": "How many days back (at most 90). / Nombre de jours en arrière (90 au plus)."
    },
    "canton": {
      "type": "string",
      "pattern": "^[A-Za-z]{2}$",
      "description": "Two-letter canton code, e.g. \"VS\". / Sigle du canton, par exemple « VS »."
    },
    "langue": {
      "enum": [
        "fr",
        "de",
        "it",
        "en"
      ],
      "type": "string",
      "default": "fr",
      "description": "Language of labels and of the answer (fr, de, it, en). / Langue des libellés et de la réponse."
    },
    "limite": {
      "type": "integer",
      "default": 10,
      "maximum": 25,
      "minimum": 1,
      "description": "Number of applications returned. / Nombre de demandes rendues."
    },
    "metier": {
      "type": "string",
      "maxLength": 80,
      "description": "Trade: identifier from the metiers tool or a few words, e.g. \"heat pump\", \"pompe à chaleur\", \"Wärmepumpe\", \"solaire\". / Métier : identifiant ou quelques mots."
    },
    "commune": {
      "type": "string",
      "maxLength": 80,
      "description": "Municipality: name, postcode or identifier, e.g. \"Sion\", \"1950\", \"buchs-ag\". / Commune : nom, numéro postal ou identifiant."
    },
    "rayon_km": {
      "type": "integer",
      "default": 0,
      "maximum": 50,
      "minimum": 0,
      "description": "With a municipality: also the municipalities within this many km. / Avec une commune : aussi les communes à moins de N km."
    }
  },
  "additionalProperties": false
}
chercher_demandes annotations
{
  "title": "Chercher des demandes de permis",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
trouver_commune — Find a municipality / Trouver une commune
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find a Swiss municipality by name or postcode; returns its identifier, canton and number of applications in the last 7, 30 and 90 days. / Trouve une commune suisse par son nom ou son numéro postal : identifiant, canton et nombre de demandes récentes.

trouver_commune input schema
{
  "type": "object",
  "required": [
    "nom"
  ],
  "properties": {
    "nom": {
      "type": "string",
      "maxLength": 80,
      "minLength": 1,
      "description": "Name or postcode, e.g. \"Sion\", \"Buchs AG\", \"8001\". / Nom ou numéro postal."
    },
    "canton": {
      "type": "string",
      "pattern": "^[A-Za-z]{2}$",
      "description": "Two-letter canton code, e.g. \"VS\". / Sigle du canton, par exemple « VS »."
    },
    "langue": {
      "enum": [
        "fr",
        "de",
        "it",
        "en"
      ],
      "type": "string",
      "default": "fr",
      "description": "Language of labels and of the answer (fr, de, it, en). / Langue des libellés et de la réponse."
    }
  },
  "additionalProperties": false
}
trouver_commune annotations
{
  "title": "Trouver une commune",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
communes_proches — Nearby municipalities / Communes proches
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the municipalities within a radius of a municipality (distance between official centres, rounded to the km), with their recent applications. / Les communes autour d’une commune (distance entre centres officiels, arrondie au kilomètre), avec leurs demandes récentes.

communes_proches input schema
{
  "type": "object",
  "required": [
    "commune"
  ],
  "properties": {
    "canton": {
      "type": "string",
      "pattern": "^[A-Za-z]{2}$",
      "description": "Two-letter canton code, e.g. \"VS\". / Sigle du canton, par exemple « VS »."
    },
    "langue": {
      "enum": [
        "fr",
        "de",
        "it",
        "en"
      ],
      "type": "string",
      "default": "fr",
      "description": "Language of labels and of the answer (fr, de, it, en). / Langue des libellés et de la réponse."
    },
    "commune": {
      "type": "string",
      "maxLength": 80,
      "minLength": 1,
      "description": "Municipality: name, postcode or identifier. / Commune : nom, numéro postal ou identifiant."
    },
    "rayon_km": {
      "type": "integer",
      "default": 10,
      "maximum": 50,
      "minimum": 1,
      "description": "Radius in km. / Rayon en kilomètres."
    }
  },
  "additionalProperties": false
}
communes_proches annotations
{
  "title": "Communes proches",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
metiers — Trades / Métiers
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the eleven trade families used by Kranli (heating and heat pumps, solar, windows, roofing, facades, interior, outdoor and pools, new build, civil engineering, electrical, balconies and lifts) with their identifiers and recent counts. / Les onze familles de métiers de Kranli, avec leurs identifiants et leurs demandes récentes.

metiers input schema
{
  "type": "object",
  "properties": {
    "langue": {
      "enum": [
        "fr",
        "de",
        "it",
        "en"
      ],
      "type": "string",
      "default": "fr",
      "description": "Language of labels and of the answer (fr, de, it, en). / Langue des libellés et de la réponse."
    }
  },
  "additionalProperties": false
}
metiers annotations
{
  "title": "Métiers",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
resume_semaine — Weekly summary / Résumé de la semaine
Advertised by the server during the last successful anonymous check.
Advertised read-only

Number of building permit applications of the last 7 days, by canton and by trade. / Le nombre de demandes de permis de construire des 7 derniers jours, par canton et par métier.

resume_semaine input schema
{
  "type": "object",
  "properties": {
    "canton": {
      "type": "string",
      "pattern": "^[A-Za-z]{2}$",
      "description": "Two-letter canton code, e.g. \"VS\". / Sigle du canton, par exemple « VS »."
    },
    "langue": {
      "enum": [
        "fr",
        "de",
        "it",
        "en"
      ],
      "type": "string",
      "default": "fr",
      "description": "Language of labels and of the answer (fr, de, it, en). / Langue des libellés et de la réponse."
    }
  },
  "additionalProperties": false
}
resume_semaine annotations
{
  "title": "Résumé de la semaine",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

3 advertised

conditions — Conditions d’usage des données de Kranli

Advertised by the server during the last successful anonymous check.

Sources, formule obligatoire, période de 90 jours, plafond et abonnement. / Sources, mandatory notice, 90-day period, rate limit, subscription.

conditions URI
kranli://conditions

MIME type: text/markdown

metiers — Les métiers de Kranli

Advertised by the server during the last successful anonymous check.

The eleven trade families with identifiers and recent counts. / Les onze familles de métiers.

metiers URI
kranli://metiers

MIME type: application/json

cantons — Les cantons couverts

Advertised by the server during the last successful anonymous check.

Covered cantons, their official sources and recent counts. / Les cantons couverts et leurs sources.

cantons URI
kranli://cantons

MIME type: application/json

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
995 ms
95th percentile latency
995 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 995 ms · metadata changed · 5 tool(s), 3 resource(s), 0 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http kranli-mcp https://kranli.ch/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add kranli-mcp --url https://kranli.ch/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable kranli-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "kranli-mcp": {
      "url": "https://kranli.ch/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "kranli-mcp": {
      "type": "streamableHttp",
      "url": "https://kranli.ch/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start kranli-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "kranli-mcp": {
      "type": "http",
      "url": "https://kranli.ch/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http kranli-mcp https://kranli.ch/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "kranli-mcp": {
      "url": "https://kranli.ch/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "kranli-mcp": {
      "serverUrl": "https://kranli.ch/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Kranli MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Kranli MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing