npm package: @iflow-mcp/wolfgangihloff-rechtsinformationen
Description: MCP server for rechtsinformationen.bund.de - Official German Federal Legal Information Portal with semantic and full-text search
Latest version: 1.4.0

# Rechtsinformationen Bund DE MCP Server

An MCP (Model Context Protocol) server that provides access to the official German Federal Legal Information Portal (rechtsinformationen.bund.de). **Any AI agent can use this server for German legal questions** to provide authoritative, fact-based answers with proper legal citations from official sources.

## 🚀 Quick Setup

**The fastest way to get started:**

1. **Run the setup script:**
```bash
./quick-setup.sh
```

2. **Restart Claude Desktop completely** (or your MCP client)

3. **Test with:** "Wie lange kann ich in Elternzeit gehen?"

## 🎯 What This Server Provides

**AI agents will automatically use this MCP server for:**
- **German legal questions** ("What happens if I miss a Jobcenter appointment?")
- **Legal rights and obligations** ("How long can I take parental leave?")
- **Court decisions and precedents** ("Recent BGH decisions on trademark law")
- **Specific law lookups** ("What does § 32 SGB II say?")
- **Administrative law questions** ("When do I need a hearing in administrative proceedings?")

**Purpose:** Ensures all German legal answers are grounded in official sources with proper citations.

## ✨ Features

### Core Capabilities
- **Full-text search** across German federal laws and legislation
- **Case law search** through German federal court decisions (BGH, BVerfG, BAG, BFH, BSG, BVerwG)
- **Intelligent search** with English-to-German translation and misconception correction
- **German compound word decomposition** (e.g., "Mieterhöhungsantrag" → "Mieterhöhung")
- **HTML URLs for users** (clickable, readable documents)
- **Model-agnostic** - works with Claude, Qwen, DeepSeek, LLaMA, and other models

### Recent Improvements (2025-10-06)
✅ **HTML URLs**: Returns human-readable web links, not just JSON API URLs
✅ **Compound word handling**: Decomposes German compound words for better search
✅ **Fallback search**: Never returns zero results for valid queries
✅ **English translation**: Automatically translates English legal terms to German
✅ **Type coercion**: Works with models that pass strings instead of numbers

## 📚 Available Tools

The server provides **6 specialized tools** with intelligent routing:

### 1. 🧠 semantische_rechtssuche (PRIMARY TOOL)
**Intelligent Legal Search** - Use this FIRST for any German legal question

**What it does automatically:**
- ✓ Translates English → German ("employee rights" → "Arbeitnehmerrechte")
- ✓ Corrects misconceptions ("Überprüfungsantrag" → "Widerspruch")
- ✓ Extracts legal references (§ patterns)
- ✓ Searches multiple related terms
- ✓ Returns both legislation AND case law

**What it does NOT do:**
- ✗ Does NOT generate semantically similar terms (agent must provide variations)
- ✗ Does NOT try multiple query phrasings automatically
- ✗ Does NOT use ML embeddings (uses keyword matching + Fuse.js fuzzy search)

**Parameters:**
- `query` (required): Search query in German or English
- `threshold` (optional): Fuzzy match threshold 0.0-1.0 (default: 0.3)
- `limit` (optional): Max results (default: 10, max: 100)

**URLs returned:**
```
🌐 READ ONLINE (HTML): https://testphase.rechtsinformationen.bund.de/.../regelungstext-1.html
📊 API ACCESS (JSON): https://testphase.rechtsinformationen.bund.de/v1/legislation/...
```

### 2. 🇩🇪 deutsche_gesetze_suchen (SECONDARY TOOL)
Search German federal legislation (laws, ordinances)

**When to use:**
- Follow-up after semantische_rechtssuche
- Legislation-only results needed
- Searching for specific law abbreviations (BEEG, BGB, SGB)

**Limitations:**
⚠️ Date filters may exclude relevant results

### 3. ⚖️ rechtsprechung_suchen (SECONDARY TOOL)
Search German court decisions

**When to use:**
- Follow-up after semantische_rechtssuche
- Court-specific filtering needed
- Searching for specific judges or case types

**Common courts:**
- BGH (Federal Court of Justice)
- BVerfG (Constitutional Court)
- BAG (Federal Labour Court)
- BFH (Federal Fiscal Court)
- BSG (Federal Social Court)
- BVerwG (Federal Administrative Court)

### 4. 🔍 alle_rechtsdokumente_suchen (SECONDARY TOOL)
Comprehensive search across all document types

**When to use:**
- After other specialized tools
- Mixed results needed (legislation + case law)
- Broad topic exploration

### 5. 📄 dokument_details_abrufen (RETRIEVAL TOOL)
Get full text of specific documents

**When to use:**
- After finding document in search results
- Need complete document text (searches only return snippets)
- Want HTML or XML format

### 6. 🏛️ gesetz_per_eli_abrufen (RETRIEVAL TOOL)
Get legislation by ELI identifier

**When to use:**
- Have specific ELI from search results
- Need exact version/date of legislation

## 🤖 Model Compatibility

### Tested & Working
- ✅ **Claude 3.5 Sonnet** - Excellent tool selection, proper citations
- ✅ **Qwen 2.5-72B** - Best open-source option, good German support
- ✅ **DeepSeek-R1** - Strong reasoning, needs recursion limit
- ✅ **LLaMA 3.3-70B** - Reliable, good for straightforward queries
- ✅ **GLM-4.6** - Works with type coercion fixes

### Recommended Agent Configuration (LibreChat)

For best results with any model:

```json
{
  "name": "German Legal Research Assistant",
  "description": "Searches official German legal database",
  "model": "qwen2.5:72b",
  "tools": [
    "mcp__rechtsinformationen__semantische_rechtssuche",
    "mcp__rechtsinformationen__deutsche_gesetze_suchen",
    "mcp__rechtsinformationen__rechtsprechung_suchen"
  ],
  "recursionLimit": 5,
  "temperature": 0.3,
  "instructions": "CRITICAL: Always use semantische_rechtssuche FIRST. If search returns results, STOP immediately and generate answer. Maximum 2-3 tool calls total. MUST include ALL URLs in 'Quellen:' or 'Sources:' section."
}
```

**Key settings:**
- `recursionLimit: 5` - Prevents endless searching
- `temperature: 0.3` - More deterministic for legal queries
- Stop condition - Generate answer immediately after finding results

## 📦 Installation

### Quick Setup
```bash
git clone <repo-url>
cd rechtsinformationen
./quick-setup.sh
```

### Manual Installation
```bash
npm install
npm run build
npm test  # Should show passing tests
```

### Claude Desktop Configuration

**macOS:** Edit `~/Library/Application Support/Claude/claude_desktop_config.json`

```json
{
  "mcpServers": {
    "rechtsinformationen": {
      "command": "node",
      "args": ["/absolute/path/to/rechtsinformationen/dist/index.js"]
    }
  }
}
```

**Windows:** Edit `%APPDATA%/Claude/claude_desktop_config.json`

```json
{
  "mcpServers": {
    "rechtsinformationen": {
      "command": "node",
      "args": ["C:\\absolute\\path\\to\\rechtsinformationen\\dist\\index.js"]
    }
  }
}
```

**Important:**
- Use absolute paths (not relative like `./dist/index.js`)
- Restart Claude Desktop completely after config changes
- Run `npm run check-config` to verify setup

### LibreChat Agent Configuration

For optimal performance with LibreChat and Ollama models (Qwen, DeepSeek, LLaMA):

```json
{
  "name": "German Legal Research Assistant",
  "model": "qwen2.5:72b",
  "provider": "ollama",
  "recursionLimit": 5,
  "temperature": 0.3,
  "instructions": "CRITICAL RULES:\n- MAXIMUM 2-3 tool calls per query\n- STOP searching after finding 3+ relevant documents\n- ALWAYS include URLs in 'Quellen' section\n- Use semantische_rechtssuche first\n\nCitation Format (MANDATORY):\n## Quellen\n1. [Law name] - [URL]\n2. [Law name] - [URL]",
  "tools": [
    "semantische_rechtssuche_mcp_rechtsinformationen",
    "deutsche_gesetze_suchen_mcp_rechtsinformationen",
    "rechtsprechung_suchen_mcp_rechtsinformationen"
  ]
}
```

**Key Settings:**
- **recursionLimit: 5** - Prevents endless searching (typical issue with some models)
- **temperature: 0.3** - Accuracy over creativity for legal research
- **STOP instructions** - Forces agent to synthesize answer after finding results
- **Citation requirements** - Mandatory URL inclusion in responses

See [LIBRECHAT_AGENT_CONFIG.md](LIBRECHAT_AGENT_CONFIG.md) for complete configuration details.

## 🧪 Testing & Evaluation

### Run Tests
```bash
# Run golden test cases
npm test

# Test API connectivity
npm run test:api

# Verify complete setup
npm run verify
```

### Agentic Evaluation

To evaluate agent performance with different models:

```bash
# Analyze LibreChat conversation exports
node tests/eval-simple.js tests/your-conversation.json
```

**Metrics tracked:**
- Tool call efficiency (target: ≤3 calls)
- Document accuracy (found correct ECLI/ELI)
- Citation completeness (URLs in sources)
- Recursion safety (no limit hits)
- Answer quality (comprehensive + cited)

See [AGENTIC_EVAL_GUIDE.md](AGENTIC_EVAL_GUIDE.md) for detailed evaluation framework.

## 🔧 Troubleshooting

### Common Issues

#### 1. No Search Results
```bash
# Test API connectivity
npm run test:api

# Check if you have internet connection
curl https://testphase.rechtsinformationen.bund.de/v1/legislation
```

#### 2. Server Won't Start
```bash
# Check Node.js version (needs v18+)
node --version

# Rebuild
npm install && npm run build
```

#### 3. Recursion Limit Hit
**Symptom:** Agent makes 10+ tool calls without stopping

**Solution:**
- Set `recursionLimit: 5` in agent config
- Add explicit STOP instructions
- Use semantische_rechtssuche as primary tool

#### 4. Missing Citations in Output
**Symptom:** Agent doesn't include URLs despite MCP response containing them

**Solution:**
- This is a model behavior issue, not server issue
- Strengthen instructions: "MUST include ALL URLs"
- Consider agentic architecture with dedicated citation agent

#### 5. Schema Validation Errors
**Symptom:** "Received tool input did not match expected schema"

**Solution:** ✅ Fixed - server now handles string→number type coercion

## 📖 Usage Examples

### Simple Query
```
User: "Wie lange kann ich in Elternzeit gehen?"

Agent: Uses semantische_rechtssuche("Elternzeit Dauer")
→ Finds BEEG § 15
→ Answer: Up to 3 years per child

Sources:
1. https://testphase.rechtsinformationen.bund.de/.../regelungstext-1.html
```

### Compound Word Query
```
User: "Was passiert bei einem Mieterhöhungsantrag?"

Agent: Uses semantische_rechtssuche("Mieterhöhungsantrag")
→ Decomposes to "Mieterhöhung"
→ Finds § 558 BGB
→ Answer: Rent increase procedures

Sources:
1. https://testphase.rechtsinformationen.bund.de/.../regelungstext-1.html
```

### English Query
```
User: "What are employee rights during company restructuring?"

Agent: Uses semantische_rechtssuche(translates to "Arbeitnehmerrechte Betriebsumstrukturierung")
→ Finds KSchG, BetrVG
→ Answer: Dismissal protection and works council participation

Sources:
1. https://testphase.rechtsinformationen.bund.de/.../regelungstext-1.html
```

## 🏗️ Architecture

### How It Works

```
User Query
    ↓
AI Agent (Claude/Qwen/etc)
    ↓
MCP Server (this project)
    ↓
rechtsinformationen.bund.de API
    ↓
German Federal Legal Database
```

**Communication:** Local stdio (no HTTP ports)
**Data Flow:** Real-time API calls for each query
**URLs:** Returns both HTML (users) and JSON (developers)

### Intelligent Search Features

**1. English Translation**
```typescript
"employee rights" → "Arbeitnehmerrechte"
"data protection" → "Datenschutz"
"dismissal" → "Kündigung"
```

**2. Misconception Correction**
```typescript
"Überprüfungsantrag" → ["Widerspruch", "Rücknahme", "Widerruf"]
"§ 535 BGB Mieterhöhung" → "§ 558 BGB" (correct law)
```

**3. Compound Word Decomposition**
```typescript
"Mieterhöhungsantrag" → "Mieterhöhung" (309 results)
"Kündigungsschutzantrag" → "Kündigungsschutz"
"Sozialhilfeantrag" → "Sozialhilfe"
```

**4. Legal Reference Extraction**
```typescript
Detects: § 44 SGB X, Art. 3 GG, § 558 Abs. 2 BGB
Validates: Law abbreviations (BEEG, BGB, SGB, etc.)
```

## 📊 API Source

**Base URL:** `https://testphase.rechtsinformationen.bund.de/v1`
**Documentation:** https://docs.rechtsinformationen.bund.de
**Standards:** ELI (European Legislation Identifier), ECLI (European Case Law Identifier)
**Status:** Trial service - may be subject to changes

**Coverage:**
- ✅ Current federal legislation
- ✅ Federal court decisions (2010-2024)
- ✅ Historical versions of laws
- ⚠️ Amendment laws (partial coverage)
- ❌ Legislative materials (not included)

## ⚠️ Known Limitations

### 1. Date Filtering Issues
**Problem:** Temporal filters may exclude relevant results when laws enacted in one year become effective in another.

**Example:** Searching for "§ 44 SGB X Änderung 2021" with date filter 2021 misses the 7. SGB-IV-Änderungsgesetz from June 2020 (effective January 1, 2021).

**Workaround:** Search without date filters, manually review effective dates.

### 2. Amendment Law Discovery
**Problem:** Amendment laws are poorly indexed and may not show which paragraphs they modify.

**Workaround:**
- Search for "BGBl [year]" to find Federal Law Gazette entries
- Look for "Artikelgesetz" or amendment law names
- Search effective dates like "2021-01-01 Inkrafttreten"

### 3. Historical Versions
**Problem:** Only current versions easily accessible through ELI identifiers.

**Workaround:** Search Federal Law Gazette references for specific dates.

### 4. Model Behavior
**Citations not appearing:** Some models ignore citation instructions despite clear guidance in MCP response. This is a model limitation, not server issue.

**Solution:** Use agent configuration with explicit citation requirements or consider multi-agent architecture.

## 🚀 Recent Fixes (2025-10-06)

### Major Improvements

✅ **HTML URLs for Users**
- Returns clickable HTML links instead of JSON API URLs
- Users can now read laws in browsers
- Both HTML and JSON URLs provided

✅ **German Compound Word Handling**
- Decomposes "Mieterhöhungsantrag" → "Mieterhöhung"
- Removes suffixes: -antrag, -verfahren, -klage, -gesetz, -verordnung
- Special handling for common legal terms

✅ **Fallback Search**
- Never returns zero results for valid queries
- Searches with original query if no legal references found
- Provides helpful suggestions when nothing found

✅ **Type Coercion**
- Handles models passing "10" (string) instead of 10 (number)
- Schema validation now works with GLM-4.6 and similar models

✅ **Model-Agnostic Instructions**
- Removed Claude-specific language
- Works with any AI model
- Clear imperative instructions

## 📝 Development

### Build Commands
```bash
npm run build       # Compile TypeScript
npm run dev         # Development mode with tsx
npm start           # Run production build
npm test            # Run test suite
```

### Helper Commands
```bash
npm run claude-config  # Generate config for Claude Desktop
npm run check-config   # Show config file path
npm run verify         # Complete verification
npm run setup          # Install + build + test
```

### Project Structure
```
src/
├── index.ts                 # Main MCP server
tests/
├── golden_case_tests.json   # Test cases
├── test-golden.js           # Test runner
├── eval-simple.js           # Agent evaluation
debug/
├── test-*.js                # API debugging tools
```

## 🤝 Contributing

Contributions welcome! Areas for improvement:

1. **More compound word patterns** - Expand German word decomposition
2. **Better concept mappings** - Add common legal misconceptions
3. **English translation coverage** - More legal term translations
4. **Historical version access** - Better handling of law amendments
5. **Literature search** - Add `/v1/literature` endpoint support

## 📄 License

MIT

## 🔗 Related Documentation

- [CLAUDE.md](CLAUDE.md) - Detailed instructions for Claude Code
- [AGENTIC_EVAL_GUIDE.md](AGENTIC_EVAL_GUIDE.md) - Agent evaluation framework
- [LIBRECHAT_AGENT_CONFIG.md](LIBRECHAT_AGENT_CONFIG.md) - LibreChat configuration
- [RECOMMENDED_MODELS.md](RECOMMENDED_MODELS.md) - Model comparison and recommendations
- [FIXES_APPLIED.md](FIXES_APPLIED.md) - Detailed change log

---

**Last Updated:** 2025-10-06
**Version:** 1.1.0
**Status:** Production-ready with test phase API