内容
# 国家公报 MCP 服务器
一个封装了 [国家公报](https://www.riigiteataja.ee/) 的 MCP 服务器 - 爱沙尼亚官方的国家公报 - 使得 AI 助手可以查找爱沙尼亚的立法:元数据(标题、状态、生效日期)和全文。
## 本项目涵盖和不涵盖的内容
国家公报 **没有公开的法律搜索 API**。在开发过程中,对可能的搜索/目录端点的每次探测都返回了通用的“未知路由”错误或根本没有返回 - 唯一真正的、通过观察记录的 API 是按 ID 获取:
- `GET /public-api/api/v1/akt/{id}` -- JSON 元数据(爱沙尼亚语)
- `GET /public-api/api/v1/en/akt/{id}` -- JSON 元数据(英文翻译,如果存在)
- `GET /public-api/api/v1/akt/{id}/blob-html` -- 全文(HTML)
因此,以下工具仅在您已经拥有法令的 ID 或 riigiteataja.ee 链接时才有效 - 它们无法通过主题或关键词发现法令。
**法院判决(`kohtulahendid`/`kohtuteave`)被故意不纳入**。该数据存在一个类似搜索的端点(`/public-api/api/v1/kohtuteave/kohtulahendid/otsing`),但其所需的查询参数无法通过合理的探测确定,并且 `robots.txt` 明确禁止爬取 `*/kohtulahendid/*` 和 `*/kohtuteave/*` - 几乎可以肯定是因为判决可能包含发布者不希望批量索引的个人数据。这里尊重了这一点。
## 值得了解的 API 怪癖(在第 0 阶段探测期间发现)
- 未知/格式错误的法令 ID 返回 **HTTP 500 且空正文**,而不是 404。客户端(`riigiteataja_client.py`)将两者视为“未找到”。
- 同一部法律在不同语言下具有 **不同的数字 ID**(爱沙尼亚语版本和英文版本,如果有翻译,通过 `tolkeSeosId` 字段相互链接)。工具优先尝试请求的语言,如果找不到,则静默地回退到另一种语言。
- 对于大型法规,全文数据块可以是几 MB(例如,《义务法》约为 4MB HTML)- 永远不会直接返回。文本被提取为纯文本,按法令缓存以避免重新获取,并限制在 `max_chars`(默认为 6000),除非使用 `search_term` 缩小范围。
## 工具
- `get_legal_act(query, language="et")` -- 通过数字 ID 或 riigiteataja.ee URL(任何形式:`/akt/`、`/eli/.../consolide`、`/en/akt/`、`/en/eli/...`)获取法令的元数据。
- `get_legal_act_text(query, language="et", search_term=None, max_chars=6000)` -- 获取全文,或如果提供 `search_term`,则获取其周围的聚焦摘录。
## 本地运行
```bash
python3.12 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python3 test_tools.py # 与真实 API 进行实时验证,必须退出 0
uvicorn server:app --host 0.0.0.0 --port 8000
curl http://localhost:8000/health # -> OK
```
MCP 端点是 `http://localhost:8000/mcp`。无需身份验证(公共、只读政府数据)。
## 部署
尚未部署。要将其部署到 Railway:
```bash
railway login
railway init # 或:railway link,如果已有项目
railway up
```
Railway 需要 `Procfile`(已存在)并将通过 `.python-version`(固定为 3.12)自动检测 Python。在第一次部署后,在 Railway UI 中前往 **Settings -> Source -> Connect Environment to Branch -> main** - 否则后续的 `git push` 不会重新部署。
然后在 Intric(或任何 MCP 客户端)中:添加服务器 URL `https://<your-railway-domain>.railway.app/mcp`,无需令牌。