mcpField
E
Emsal

Emsal

本地服务
avfatihsozer.com法律与政务35 天前更新

关于 Emsal

Dayanak(原名 Emsal)是面向土耳其法律研究者的 MCP 服务,可检索官方法院判决和法规,并辅助研究与法律文书准备。它支持本地 SQLite/FAISS 语料库和官方来源实时查询,并以不虚构引文、仅使用可引用全文为原则。

主要功能

  1. 01官方来源实时检索判决与法规
  2. 02本地全文及语义搜索
  3. 03主题研究与文档导出
  4. 04引文检查和法律文书准备
  5. 05隐私扫描与脱敏

适用场景

  1. 01查找土耳其法院判决和法规
  2. 02在本地语料库中开展法律检索
  3. 03核验引文并准备法律文书

MCP 相关

作为 MCP 服务,向客户端提供判决与法规搜索、文档获取、研究、导出及扩展工具;可通过 stdio 或 streamable HTTP 运行。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"afsozer-emsal": {
"command": "uvx",
"args": [
"emsal-mcp"
]
}
}
}
启动命令uvx emsal-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiemsal-mcp1.1.1

工具

11

收录的工具列表 · 更新于 2 周前

参数类型必填说明
dilany否
pageinteger否
limitinteger否
queryany否
sourceany否
esas_noany否
sort_byany否
birimAdiany否
karar_noany否
court_typesany否
include_rawboolean否
include_snippetsboolean否
karar_tarihi_endany否
karar_tarihi_startany否

详细介绍

Dayanak

v2.0.1 — 11 个核心 + 36 个扩展 MCP 工具(共 47 个)· 152 条 CLI 命令 · 80 个测试文件 · 48 个源模块

CI DOI

项目页面: avfatihsozer.com/projeler/dayanak · 英文版:README.en.md

面向土耳其官方公开法律资源(判例和法规),用于安全引用的搜索、研究和文档准备 MCP 服务。

项目原名为 emsal-mcp;自 2.0.0 版本起更名为 Dayanak。旧版 emsal-mcp 包现已安装 dayanak,旧的 EMSAL_* 环境变量和 ~/.emsal_mcp 数据目录仍会继续读取。

有两种运行方式:

  • 本地语料库 — 1,110 万份判决和全部现行法规存储在一个 SQLite 文件中;使用 FTS5 全文搜索 + FAISS 语义搜索。无需网络。
  • 实时资源 — Bedesten/Yargıtay、AYM、Danıştay、Uyuşmazlık、Rekabet、 Sayıştay、GİB、mevzuat.gov.tr、Resmî Gazete、KVKK 适配器。

红线

  • 不得捏造判决、元数据、日期、案号/裁判号、法庭、引用或法律条文。
  • 不得将没有 full_text / html_markdown 内容的文档用于引用/草拟。
  • 只有在存在全文/HTML Markdown 时,quoteUsable 和 draftUsable 才为 true。
  • 限流策略有意不设得过于保守;目标场景是单用户/单台电脑。

语料库

测量日期为 2026 年 9 月 16 日,使用实时语料库(cache.sqlite3,72 GB)。

层级指标
判决11.108.242 份文档(documents_v2)。基础数据:HF hamzabagirsakci/turkish-court-decisions(11.045.085,CC0),另加每日 Bedesten 爬取数据。
法规文档14.298 条记录 / 14.171 个现行版本:916 部法律、63 部 KHK、33 部 CBK、8.840 部条例(8.830 部现行)、4.446 份公告(4.329 份现行)
法规条文303.454 条条文,96.186 条修订记录
判决语义索引29.554.075 个分块向量 — intfloat/multilingual-e5-small(384 维),FAISS IVF16384,PQ64 + fp16 sidecar refine,nprobe=128,chunking v2
法规语义索引423.920 个分块向量(来自 303.454 条条文),使用相同的模型和索引类型

详细信息和指标:docs/BULK_INDEX.md。

安装

快速安装(不含语料库)

Dayanak 无需 1,100 万份判决的本地语料库也能运行。在这种情况下,判决和 法规搜索会实时查询官方资源(Bedesten、mevzuat.gov.tr、AYM、Danıştay 等),判决全文也会实时获取。仅在本地语料库中搜索的工具(search_local_corpus、mevzuat_korpus_ara、mevzuat_madde_getir)会返回空结果,并引导至实时工具。需要 Python 3.11 或更高版本。

# Kurmadan doğrudan çalıştırmak için (uv gerekir)
uvx --from dayanak dayanak-server

# ya da kalıcı kurulum
pipx install dayanak

添加到 Claude Code:

claude mcp add dayanak -- uvx --from dayanak dayanak-server

Claude Desktop 或其他 MCP 客户端的配置:

{
  "mcpServers": {
    "dayanak": {
      "command": "uvx",
      "args": ["--from", "dayanak", "dayanak-server"]
    }
  }
}

默认工具配置包含 11 个核心工具;如需启用全部工具,请设置环境变量 DAYANAK_TOOL_PROFILE=full。获取的文档会缓存到 ~/.dayanak/cache.sqlite3 文件中(可通过 DAYANAK_CACHE_PATH 更改)。

开发安装(含语料库)
# Windows
cd <repo-dizini>
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -e ".[dev,mcp,embeddings]"

# macOS / Linux
cd <repo-dizini>
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev,mcp,embeddings]"

dayanak version

若要让语义搜索使用批量 FAISS 索引,还需运行 pip install faiss-cpu。详细安装说明:INSTALL.md。

运行

HTTP(streamable-http)服务

在实时部署中,服务通过 scripts\mcp_http_sunucu.cmd 启动;此脚本会在内部设置环境变量,并将日志写入 %LOCALAPPDATA%\dayanak\mcp_http.log 文件。

.\scripts\mcp_http_sunucu.cmd

在 Windows 上,计划任务 EmsalMcpHttp 会在用户登录时运行同一脚本。端点:http://<host>:<port>/mcp。

stdio 服务
call .\scripts\dayanak-env.cmd
dayanak-server
环境变量
变量用途示例值
DAYANAK_CACHE_PATH语料库 SQLite 文件<veri-dizini>\cache.sqlite3
DAYANAK_BULK_VEC_DIRfp16 向量 sidecar(用于 refine)<bench-dizini>\vec
DAYANAK_EMBEDDING_PROVIDER嵌入提供方fastembed-multilingual-e5
DAYANAK_EMBEDDING_CACHE_DIRONNX 模型缓存<veri-dizini>\models\fastembed
DAYANAK_MCP_TRANSPORTstdio(默认)或 streamable-httpstreamable-http
DAYANAK_MCP_HOST / DAYANAK_MCP_PORTHTTP 监听地址127.0.0.1 / 8790
DAYANAK_TOOL_PROFILEcore(默认)或 fullcore
DAYANAK_TOOL_THREADS同步工具的线程池(0 = 关闭)6
DAYANAK_TOOL_TIMEOUT每个工具的超时秒数180

对于一次性 CLI 调用,scripts\dayanak-env.cmd 会设置相同的变量 (call .\scripts\dayanak-env.cmd && .venv\Scripts\dayanak ...)。

机器专属值(数据目录、监听地址、备份目标)不会保存在仓库中:将 scripts\yerel-ayar.ornek.cmd 复制为 scripts\yerel-ayar.cmd 并填写(该文件已列入 .gitignore)。dayanak-env.cmd、 crawl_incremental.ps1 和 Python 脚本(scripts/_yollar.py)会读取此文件; 留空的路径均从 ~/.dayanak 推导。

MCP 工具

默认配置为 core,包含 11 个已注册工具。其余工具通过 load_extended_tools 按类别加载到正在运行的服务中。契约: docs/MCP_CONTRACTS.md。

Core(11 个):

工具用途
search_decisions搜索实时来源中的裁决(包括路由)
get_document获取单份文档
search_local_corpus在本地 11 M 裁决语料库中进行 FTS5 + 语义搜索
search_legislation在 mevzuat.gov.tr 上搜索法规
get_legislation获取法规文本 / 条文
mevzuat_korpus_ara在本地法规语料库中按条文搜索
mevzuat_madde_getir从本地语料库获取单条法规
research_topic主题研究包(bundle + 质量仪表板)
export_document导出文档
load_extended_tools在运行时加载 Extended 类别
health_check来源/熔断器/索引/定时任务健康状态

Extended(36 个),按类别划分:

类别工具数量工具
legislation1mevzuat_degisiklik_raporu
drafting2citation_check、prepare_petition
files1read_legal_file
meta2list_sources、legal_research_guide
health_admin4circuit_breaker_status、source_health、source_smoke、check_government_servers_health
watch4watch_add、watch_list、watch_run、watch_remove
privacy3privacy_scan、privacy_redact、privacy_audit
chambers4chamber_overview、profile_chamber、chamber_timeline、find_similar_chambers
indexing1index_status
drafting_advanced10draft_document、export_bundle、inspect_petition_pack、build_multi_issue_pack、inspect_multi_issue_pack、list_petition_templates、get_petition_template、build_argument_chain、score_argument、get_argument_strength_report
udf_admin4udf_toolkit_status、udf_authoring_instructions、pdf_toolkit_status、promote_pdf_to_full_text

由于 Core 配置的 docstring 预算(20,000 个字符)已满,citation_check、 prepare_petition、read_legal_file、list_sources 和 legal_research_guide 于 2026 年 9 月 6 日移至 Extended;使用 load_extended_tools 即可重新加载。

CLI 示例

dayanak sources
dayanak search bedesten "muvazaa" --limit 5
dayanak get bedesten DOCUMENT_ID
dayanak semantic bulk-status
dayanak mevzuat korpus-ara "tahliye taahhüdü"
dayanak smoke --offline

语料库抓取 + 面板

长期语料库抓取(从 Bedesten 逐年下载判决)由一个主脚本运行, 并可在浏览器中查看状态。

.\scripts\kur-otomatik-baslatma.ps1          # oturum açılışına ekler (yönetici gerekmez)
.\scripts\kur-otomatik-baslatma.ps1 -Durum   # ne çalışıyor?
.\scripts\kur-otomatik-baslatma.ps1 -Kaldir  # geri al
部分功能
crawl_master.ps1按顺序抓取各年份。使用单实例锁(mutex),将检查点写入 crawl_logs\crawl_state.json——如果 PC 关机,会从中断时的年份和页面继续。
scripts\panel.pyhttp://127.0.0.1:8799 — 实时抓取状态、年份目标、库分布、速度/预估。无需额外依赖。
计划任务EmsalCrawlMaster(登录时 + 1 分钟),EmsalPanel(登录时 + 20 秒)。

注意:

  • 速率限制为 DAYANAK_RATE_LIMIT_MAX=12。实测结果:设为 12 时不会出现 429(约 2,800 份文档/小时), 设为 15 时会进入 429 冷却循环,速度降为零。
  • 面板不会在 cache.sqlite3 上统计年份——单个年份的查询因全表扫描需要约 60 秒。计数会增量保存在 ~/.dayanak/panel_stats.sqlite3 中(仅处理新的 rowid),每天进行一次完整计数。
  • 年份目标取自 Bedesten 的 total 字段(crawl_logs\hedefler.json), 不进行估算。

运维

计划任务(Windows 任务计划程序,语料库服务器):

任务时间脚本功能
EmsalMcpHttp登录时scripts\mcp_http_sunucu.cmd发布 MCP 服务
EmsalCrawlDaily每天 04:30scripts\crawl_incremental.ps1增量抓取判决
EmsalMevzuatWeekly周日 03:00scripts\mevzuat_weekly.cmd法规更新(+ 后续处理 mevzuat_semantic.cmd)
EmsalMonthlyMerge每月 1 日 02:00scripts\monthly_merge.cmd将增量向量合并到 FAISS 索引

health_check 工具会在 scheduled_jobs 块中报告这些任务的最近运行情况:它不会调用 schtasks,而是读取任务在各自日志文件中写入的完成标记和文件时间戳。如果任务运行延迟或以 rc != 0 结束,overall 会返回 "degraded"(src/dayanak/ops_status.py)。 同一输出中的 tool_runtime 块会提供线程池/超时计数器;如果 runaway > 0,则应重启服务。

文档

文档内容
docs/BULK_INDEX.md批量语料库配置、FAISS 索引结构、chunking v2、测量结果、注意事项
docs/MCP_CONTRACTS.mdMCP 工具契约、配置文件、类别
docs/COOKBOOK.md复制即用的工作流配方
docs/JSON_CONTRACTS.md通用 API 函数的 JSON 输出契约
docs/ERROR_CATALOG.md错误代码和建议操作
docs/INDEX.md所有文档的索引
CHANGELOG.md版本历史

测试

.venv\Scripts\python.exe -X utf8 -m pytest tests -q
ruff check src tests scripts

默认跳过访问实时数据源的测试;如需启用,请设置 DAYANAK_LIVE_TESTS=1。

许可证

本项目依据 GNU Affero 通用公共许可证第 3 版授权(AGPL-3.0-only);完整 文本见 LICENSE 文件。如果您修改软件并通过网络向他人提供服务, 则必须也以相同许可证向这些用户提供修改后的源代码。有关如何报告安全漏洞, 请参阅 SECURITY.md。

版权所有 © 2026 Alpaslan Fatih Sözer

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。