法律文本检索服务

提供AI助手访问挪威法律和法规的MCP服务器,支持全文搜索、语义搜索和批量获取功能。

  • by khjohns
  • Svelte
  • 本地部署
  • 更新于
在 GitHub 查看 khjohns/paragraf

使用说明

段落

MCP服务器为AI助手提供通过以下方式访问挪威所有法律法规的权限 模型上下文协议.

92000+paragrafer fra 773情人og 3 673 forskrider-根据NLOD 2.0免费。

为什么?

法学硕士是法律文本的幻觉。这台服务器为他们提供了准确、更新的挪威语作为工具,而不是猜测。

Bruker:  "Kan utleier si meg opp?"
AI:      sok("oppsigelse leie") → 4 treff
         lov("husleieloven", "9-7") → full tekst
Svar:    "Etter husleieloven § 9-7 skal oppsigelse fra utleier
          være skriftlig og begrunnet..."

函数

功能。说明。 |----------|-------------| | 激活 用短名称或全名打开任何法律/处方。 | 全文搜索(FTS) PostgreSQL向量,挪威投票~6ms。)。 | 语义搜索 混合vektor+FTS,嵌入Gemini用于自然语言。 | 批量亨廷 在一次通话中添加更多段落(大约快80%)。 | 目录 分层审查(Del→章→§)和令牌估计 | Alias解决方案 | aml, avhl, pbl +stavefeil的模糊匹配| | 或回退 当搜索结果为0时,会自动回退到OR。

Arkitektur

┌──────────────────┐     HTTPS/JSON-RPC      ┌──────────────────────────┐
│  Claude.ai       │ ──────────────────────►  │  Flask Backend           │
│  Copilot Studio  │                          │                          │
│  Gemini AI       │                          │  ┌────────────────────┐  │
│  (MCP-klient)    │ ◄──────────────────────  │  │  MCP Server        │  │
└──────────────────┘                          │  │  (JSON-RPC router) │  │
                                              │  └────────┬───────────┘  │
                                              │           │              │
                                              │  ┌────────▼───────────┐  │
                                              │  │  LovdataService    │  │
                                              │  │  (alias, validering│  │
                                              │  │   formatering)     │  │
                                              │  └────────┬───────────┘  │
                                              │           │              │
                                              └───────────┼──────────────┘
                                                          │
                                        ┌─────────────────┴──────────────────┐
                                        │                                    │
                                        ▼                                    ▼
                              ┌───────────────────┐              ┌───────────────────┐
                              │  Supabase         │              │  Lovdata API       │
                              │  PostgreSQL       │              │  api.lovdata.no    │
                              │                   │              │                    │
                              │  • FTS (GIN)      │              │  Bulk tar.bz2      │
                              │  • pgvector       │              │  (kun ved sync)    │
                              │  • pg_trgm        │              │                    │
                              └───────────────────┘              └───────────────────┘

使用

主机(未安装)

MCP-serveren er fritt tilgjengelig-ingen registrering eller API-nøkkel kreves公司。

第ai条:

  1. 去吧。 设置→ 连接器→ 添加自定义连接器
  2. 网址: https://api.paragraf.dev/mcp/
  3. 费迪格

唯一的限制是每IP 120 Req/min(突发保护)。

本地安装

pip install paragraf            # Minimal (SQLite backend)
pip install paragraf[supabase]  # Med Supabase PostgreSQL
pip install paragraf[all]       # Alt (Supabase + vektorsøk + HTTP)

或者源代码:

git clone https://github.com/khjohns/paragraf.git
cd paragraf
pip install -e ".[all]"

配置

# .env
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=eyJ...

# Valgfritt: for semantisk søk
GEMINI_API_KEY=AIza...

如果没有Supabase,SQLite将用作本地回退。

Synkroniser lovdata

paragraf sync                   # Inkrementell sync (sjekker last-modified)
paragraf sync --force           # Tving full re-sync

启动服务器

paragraf serve                  # stdio MCP (for Claude Desktop, Cursor)
paragraf serve --http           # HTTP MCP (for claude.ai connector)
paragraf serve --http --port 8000

MCP工具

Verktøy Beskrivelse Eksempel
lov 行动起来。 lov("aml", "14-9")
forskrift 打开处方。 forskrift("foa", "25-2")
sok Fulltekstsøk sok("mangel bolig")
semantisk_sok 人工智能驱动的搜索。 semantisk_sok("skjulte feil i boligen")
hent_flere 批量亨廷 hent_flere("aml", ["14-9", "15-6"])
sjekk_storrelse Token估计。 sjekk_storrelse("skatteloven", "5-1")
liste 维斯看见了。 liste()
status 同步状态 status()
sync Synkroniser sync(force=True)

Alias解决方案

找到正确法律的四个层次:

例如,级别。 |------|----------| 1.Hardkodet别名| aml → LOV-2005-06-17-62 | 2.数据库(短标题)| husleieloven → lov/1999-03-26-17 | 3.模糊(pg_trgm)| husleielova → 胡斯利埃洛夫(相似性:0.59)| 4.董事ID| lov/1999-03-26-17 →按原样使用。

寻求行动(FTS)

例如,Syntaks的意思。 |---------|----------|-----------| |标准| mangel bolig |AND(begge-ord)| |或| miljø OR klima 至少一个字。 句子 。 "vesentlig mislighold" |埃克萨克兄弟会| 排除。 mangel -bil 没有车,没有车。

如果搜索结果为0,则自动退回OR。

映射结构

src/paragraf/
├── __init__.py              # Pakke-eksport (MCPServer, LovdataService)
├── server.py                # MCP JSON-RPC server (9 verktøy)
├── service.py               # Forretningslogikk, aliaser, validering
├── supabase_backend.py      # Supabase PostgreSQL backend
├── sqlite_backend.py        # SQLite fallback + sync fra API
├── structure_parser.py      # XML → hierarkisk struktur
├── vector_search.py         # Hybrid vektor+FTS søk
├── cli.py                   # CLI (serve, sync, status)
├── web.py                   # Flask blueprint factory
└── _supabase_utils.py       # Retry/backoff, feilhåndtering

web/
└── app.py                   # Standalone Flask-app (hosted deploy)

site/                        # Landing page (paragraf.dev, GitHub Pages)

scripts/
└── embed.py                 # Generer embeddings for vektorsøk

migrations/
└── 001_complete_schema.sql  # Supabase-skjema (tabeller, funksjoner, indekser)

docs/
├── ADR-001.md               # Arkitekturbeslutninger
└── ADR-002.md               # Tilgangsmodell og rate limiting

API-除油器

不过,描述。 |--------|-----|-------------| | POST | /mcp/ |MCP JSON-RPC(hovendepunkt)| | HEAD | /mcp/ 协议版本检查。 | GET | /mcp/ |SSE流(防腐蚀)| | GET | /mcp/health 健康检查。 | GET | /mcp/info 服务器信息和工具列表。

喊叫

梅特里克,威尔第。 |---------|-------| FTS搜索(热缓存)~6ms。 FTS搜索(冷缓存)~600毫秒 |洛夫普斯渣|~50-200ms| |第3批paragrafer |~100ms(与单独491ms相比)| 数据库大小~~160MB表+42MB TOAST+37MB GIN。 矢量搜索~200-500ms(包括嵌入)。

数据模型

Tabeller

lovdata_documents (4 446 rader)
├── dok_id TEXT UNIQUE        "lov/2005-05-20-28"
├── title TEXT                "Lov om arbeidsmiljø..."
├── short_title TEXT          "Arbeidsmiljøloven"
├── doc_type TEXT             "lov" | "forskrift"
├── ministry TEXT             "Arbeids- og inkluderingsdepartementet"
└── search_vector TSVECTOR

lovdata_sections (92 164 rader)
├── dok_id + section_id       UNIQUE
├── content TEXT               Paragraftekst
├── search_vector TSVECTOR     Norsk stemming
├── embedding VECTOR(1536)     Gemini embedding (100% dekning)
├── char_count INTEGER         GENERATED ALWAYS
└── structure_id UUID FK       → lovdata_structure

lovdata_structure (14 798 rader)
├── structure_type TEXT        "del" | "kapittel" | "avsnitt" | "vedlegg"
├── title TEXT                 "Kapittel 2. Arbeidsgivers plikter"
├── parent_id UUID FK          Hierarkisk (self-ref)
└── sort_order INTEGER

Indekser

  • 金酒 在 search_vector -全文搜索
  • 金酒 在 short_title 医学 pg_trgm --模糊匹配
  • IVFFlat 在 embedding (列表=100)--权重搜索
  • B-树 在 dok_id, section_id, structure_id --铜渣

安全

  • 未存储用户数据 --过时的、未经授权的设计
  • 没有注册 -MCP URL是免费的。
  • 速率限制 -每IP 120请求/分钟(通过闪光限制器进行突发保护)
  • 参数化查询 --ingen SQL注入
  • 输入验证 在所有MCP工具上
  • NLOD 2.0升传感器 所有数据都是公开的

测试

Angrep 结果
SQL注入('; DROP TABLE--此 路 不通。
路径遍历(../../../etc/passwd没有文件系统访问权限。
XSS (<script>alert('xss')</script>).作为文本处理。

限制

包含(通过Lovdata Public API免费)

  • 常规法律(773+)
  • 中央处方(3673+)
  • Lokale的创始人、代表、指导者

不包括

  • 法院判决(最高法院、存储法院)要求Lovdata Pro
  • 工人(NOU、Prop、Ot.prp)-需要Lovdata Pro
  • 法律条款

环境变量

变量 Påkrevd Beskrivelse
SUPABASE_URL 是的。请提供项目URL。
SUPABASE_SERVICE_ROLE_KEY 服务的作用是关键。
GEMINI_API_KEY 否。用于语义搜索。
LOVDATA_CACHE_DIR Nei SQLite缓存sti(默认值: /tmp/lovdata-cache)

*SQLite在没有Supabase的情况下用作后备。

发展

# Installer fra kildekode
pip install -e ".[all,dev]"

# Generer embeddings (krever GEMINI_API_KEY)
python scripts/embed.py --dry-run    # Sjekk kostnad
python scripts/embed.py              # Kjør

# Linting (pre-commit hook kjører automatisk)
ruff check src/ scripts/
ruff format src/ scripts/

# Helsesjekk
curl http://localhost:8000/mcp/health

# Test MCP-kall
curl -X POST http://localhost:8000/mcp/ \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "lov",
      "arguments": {"lov_id": "aml", "paragraf": "14-9"}
    }
  }'

技术

组件 技术
服务器 Flask+Python 3.11
数据库 支持PostgreSQL(SQLite回退)
全文搜索。PostgreSQL向量+GIN。
向量IVFFlat+Gemini嵌入。
模糊匹配 pg_trgm
Protokoll MCP 2025-06-18,流式HTTP
Datakilde Lovdata公用API(非直瞄2.0)
登录页面 GitHub页面(paragraf.dev)

利森斯

包含挪威公共数据许可证下的数据(NLOD 2.0)可通过 法律数据.

文档