使用说明
段落
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条:
- 去吧。 设置→ 连接器→ 添加自定义连接器
- 网址:
https://api.paragraf.dev/mcp/ - 费迪格
唯一的限制是每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)可通过 法律数据.
文档
- ADR-001:架构解决方案 -数据模型、搜索、同步、MCP工具
- ADR-002:访问模型 -开放存取和速率限制
- MCP规范
- Lovdata公用API