Skip to main content
Glama
MananCoder29

Berlin Services MCP Server

by MananCoder29
README.md
# Berlin Services MCP Server - Enhanced

A production-grade Model Context Protocol (MCP) server for Berlin city services (Dienstleistungen). It features resilient caching, advanced search, PDF form discovery, and filling capabilities.

## Features
- **Comprehensive Tools**: Search, browse, and get detailed information on Berlin services.
- **Form Management**: Discover, analyze, and fill PDF forms for various services.
- **Resilient Caching**: Optimized for performance with intelligent fallback for offline use.
- **Remote Sync**: Supports both local and remote (Cloud) deployments.

## Technical Architecture

### 1. Data Sourcing
The server pulls data from the official **Berlin City Services API**

- **Live Fetching**: Tools like `search_services` and `get_service_details` hit the live API.
- **Resilient Caching**: Implements a dual-layer cache (Memory + Disk) to ensure high performance and offline reliability.
- **Smart Fallback**: If the API is down and no cache exists, it falls back to a minimal set of core services to remain functional.

### 2. Advanced PDF Processing
Powered by `PyMuPDF` (`fitz`), the server provides sophisticated document handling:
- **Field Extraction**: Automatically detects fillable fields in PDF forms hosted on the city's servers.
- **Intelligent Filling**: Maps user data to PDF fields using smart matching and common translation fragments.
- **Loop Protection**: Includes a `LoopProtector` to prevent redundant tool executions and LLM loops.
- **Visual Previews**: Can render specific pages of a PDF to JPEG for a quick in-chat snapshot (useful for verification without leaving the chat).

### 3. Deployment Modes
- **Local Mode**: Optimized for use with Claude Desktop. In this mode, `open_file_locally` can be used to open filled PDFs directly with your system's default viewer.
- **Remote/Cloud Mode**: Designed for deployment on platforms like Fly.io or Railway. Replaces local file opening with secure synchronization and in-chat previews.

## Prerequisites
- Python 3.11 or higher
- `uv` (recommended) or `pip`

## Local Setup

### Using `uv` (Recommended)
1. Install dependencies and sync the environment:
   ```bash
   uv sync
   ```
2. Run the server as a module:
   ```bash
   export PYTHONPATH=$PYTHONPATH:$(pwd)/src && uv run python -m berlin_mcp.main
   ```
   *Note: If you've installed the package via `uv sync`, you can also just run:*
   ```bash
   uv run berlin-mcp
   ```

### Using `pip`
1. Install dependencies:
   ```bash
   pip install -r requirements.txt
   ```
2. Run the server:
   ```bash
   export PYTHONPATH=$PYTHONPATH:$(pwd)/src && python -m berlin_mcp.main
   ```

## Claude Desktop Configuration

Add the following to your Claude Desktop configuration file. Replace `/Users/mananshah/Desktop/Berlin-Services-MCP-Server` with the actual absolute path to the folder.

### macOS
File location: `~/Library/Application Support/Claude/claude_desktop_config.json`

```json
{
  "mcpServers": {
    "berlin-services": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/Users/YourUser/Desktop/Berlin-Services-MCP-Server",
        "python",
        "-m",
        "berlin_mcp.main"
      ],
      "env": {
        "PYTHONPATH": "src"
      }
    }
  }
}
```

### Windows
File location: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "berlin-services": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "C:\\Users\\YourUser\\Desktop\\Berlin-Services-MCP-Server",
        "python",
        "-m",
        "berlin_mcp.main"
      ],
      "env": {
        "PYTHONPATH": "src"
      }
    }
  }
}
```

## Tools and Resources

The server exposes the following tools to help you navigate and manage Berlin city services:

| Tool | Description |
|------|-------------|
| `search_services` | Advanced search for Berlin services with paging and filters. |
| `get_service_details` | Get complete details about a service including forms and prerequisites. |
| `get_service_forms` | Get all forms associated with a service with detailed metadata. |
| `search_forms` | Search for forms across all services. |
| `get_forms_by_type` | Get all forms of a specific type across services. |
| `get_service_prerequisites` | Get all prerequisites and requirements for a service. |
| `get_service_checklist` | Get a comprehensive checklist for completing a service application. |
| `analyze_form_for_filling` | Download a PDF form and extract its fillable fields. |
| `perform_form_filling` | Fill a PDF form and save locally. |
| `download_filled_form` | Retrieve a filled PDF form. |
| `get_form_visual_preview` | Render a page of a filled PDF as an image. |
| `open_file_locally` | Open a file on the user's local system (Local setup only). |
| `delete_filled_form` | Manually delete a filled form from the server. |
| `browse_services_by_category` | Browse services by category. |
| `find_online_services` | Find all services available online. |
| `get_service_locations` | Get all locations for a service. |
| `get_api_status` | Get API and cache status diagnostics. |
| `clear_cache` | Clear the service cache and force refresh. |

## Security Note

PDF forms filled on remote servers should be downloaded and then deleted using the `delete_filled_form` tool to ensure data privacy.

TDQS

C2.8/5.0

Scored across 18 tools

Disambiguation4/5

Most tools have distinct purposes, but some overlap exists (e.g., 'search_forms' vs 'get_forms_by_type', 'get_service_details' vs 'get_service_prerequisites'). Descriptions help disambiguate.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with snake_case naming. No mixing of conventions (e.g., 'get_service_details', 'search_services').

Tool Count4/5

18 tools is on the higher side but appropriate for the broad domain of Berlin services and forms. Each tool covers a distinct aspect without feeling bloated.

Completeness3/5

Covers many aspects (services, forms, filling, maintenance) but notably missing a 'list_filled_forms' tool despite having 'delete_filled_form'. Some operations for form lifecycle are incomplete.

Maintenance

ActivityInactive
ResponsivenessNo issues