法律刮刀MCP
一个全面的模型上下文协议(MCP)服务器,用于访问和分析API众议院的波兰法律行为,实现AI驱动的法律研究和文件分析。
特性
- 全面的法律行为访问 -从Dziennik Ustaw(DU)和Monitor Polski(MP)全面获取波兰法律行为
- 高级搜索和过滤 -按日期、类型、关键字、发布者和状态进行多条件搜索
- 带有链式过滤的结果存储 -存储搜索结果并使用正则表达式、类型/状态/年份匹配、日期范围、排序进行筛选
- 文档存储模式 -加载操作到内存中,以实现高效的节级导航和搜索
- 详细的文档分析 -元数据、结构、引用和内容检索
- 内容处理 -自动将PDF转换为文本和HTML转换为Markdown
- 日期计算 -用于法律文件分析的专用数据工具
- 系统元数据 -关键字、状态、文档类型和机构数据
- FastMCP集成 -采用FastMCP框架构建,提供灵活的传输选项
- 异步HTTP客户端 -具有重试逻辑和连接池的高效httpx客户端
- TTL缓存 -具有可配置TTL的智能响应缓存
- 结构化日志记录 -JSON和文本日志格式,便于调试
- Docker支持 -使用docker compose进行容器化部署
- 全面的文件 -示例和清晰的参数描述
需求
- python:3.13或更高
- 包管理器:uv(推荐)或pip
- Internet连接:访问Sejm API终结点时必需
- MCP兼容工具:游标IDE、Claude Code或其他MCP客户端
安装
使用紫外线(推荐)
# Clone the repository
git clone https://github.com/numikel/law-scrapper-mcp.git
cd law-scrapper-mcp
# Install dependencies
uv sync
# Install with dev dependencies
uv sync --extra dev使用pip
# Clone the repository
git clone https://github.com/numikel/law-scrapper-mcp.git
cd law-scrapper-mcp
# Install dependencies
pip install -e .使用uvx(无需安装)
为了在不克隆存储库的情况下进行快速测试:
# Run the server directly from GitHub
uvx --from git+https://github.com/numikel/law-scrapper-mcp law-scrapper快速开始
STDIO传输(默认)
STDIO是MCP通信的默认传输方式。启动服务器并从MCP客户端连接:
# Run the server
uv run python -m law_scrapper_mcp
# Or use the installed script
law-scrapper在MCP客户端中配置(例如,Cursor .cursor/mcp.json):
{
"mcpServers": {
"law-scrapper-mcp": {
"command": "law-scrapper"
}
}
}克劳德代码:
claude mcp add law-scrapper "uvx --from git+https://github.com/numikel/law-scrapper-mcp law-scrapper"HTTP传输(可流式传输HTTP)
使用可流式传输的HTTP在HTTP上运行服务器:
# Run with HTTP transport on port 7683
LAW_MCP_TRANSPORT=streamable-http uv run python -m law_scrapper_mcp
# Or specify custom host and port
LAW_MCP_TRANSPORT=streamable-http LAW_MCP_HOST=0.0.0.0 LAW_MCP_PORT=8080 uv run python -m law_scrapper_mcp在MCP客户端中配置:
{
"mcpServers": {
"law-scrapper-mcp": {
"url": "http://localhost:7683/mcp",
"transport": "streamable-http"
}
}
}注: URL必须包含 /mcp 路径。FastMCP在以下位置公开了可流式传输的http端点 /mcp不是在根上。使用 http://localhost:7683 没有 /mcp 结果为404(未找到)。
码头工人
使用Docker构建和运行:
# Build the image
docker build -t law-scrapper-mcp .
# Run with STDIO transport (default)
docker run -it law-scrapper-mcp
# Run with HTTP transport on port 7683
docker run -it -p 7683:7683 -e LAW_MCP_TRANSPORT=streamable-http law-scrapper-mcp或者使用docker compose:
# Run with STDIO transport
docker compose up
# Run with HTTP transport (set TRANSPORT=streamable-http in docker-compose.yml)
docker compose -f docker-compose.yml up配置
所有设置都是通过环境变量配置的 LAW_MCP_ 前缀:
| 变量 | 默认值 | 描述 |
|---|---|---|
LAW_MCP_TRANSPORT | stdio | 运输: stdio 或 streamable-http |
LAW_MCP_HOST | 0.0.0.0 | HTTP服务器主机(使用流式HTTP时) |
LAW_MCP_PORT | 7683 | HTTP服务器端口(使用流式HTTP时) |
LAW_MCP_API_TIMEOUT | 30.0 | HTTP请求超时(秒) |
LAW_MCP_API_MAX_CONCURRENT | 10 | 最大并发API请求数 |
LAW_MCP_API_MAX_RETRIES | 3 | 最大API请求重试次数 |
LAW_MCP_CACHE_METADATA_TTL | 86400 | 元数据缓存TTL(24小时) |
LAW_MCP_CACHE_SEARCH_TTL | 600 | 搜索结果缓存TTL(10分钟) |
LAW_MCP_CACHE_BROWSE_TTL | 3600 | 浏览结果缓存TTL(1小时) |
LAW_MCP_CACHE_DETAILS_TTL | 3600 | 动作细节缓存TTL(1小时) |
LAW_MCP_CACHE_CHANGES_TTL | 300 | 更改跟踪缓存TTL(5分钟) |
LAW_MCP_CACHE_MAX_ENTRIES | 1000 | 最大缓存条目数 |
LAW_MCP_DOC_STORE_MAX_DOCUMENTS | 10 | 文档存储中的最大文档数 |
LAW_MCP_DOC_STORE_MAX_SIZE_BYTES | 5242880 | 最大文档存储大小(5 MB) |
LAW_MCP_DOC_STORE_TTL | 7200 | 文档存储TTL(2小时) |
LAW_MCP_CIRCUIT_BREAKER_THRESHOLD | 5 | 断路器打开前的故障 |
LAW_MCP_CIRCUIT_BREAKER_RECOVERY_TIMEOUT | 60.0 | 尝试恢复前的几秒钟 |
LAW_MCP_CIRCUIT_BREAKER_HALF_OPEN_MAX_CALLS | 3 | 半开状态下的测试呼叫 |
LAW_MCP_LOG_LEVEL | INFO | 日志级别:调试、信息、警告、错误 |
LAW_MCP_LOG_FORMAT | text | 日志格式: text 或 json |
环境配置示例:
export LAW_MCP_TRANSPORT=streamable-http
export LAW_MCP_PORT=7683
export LAW_MCP_LOG_LEVEL=DEBUG
export LAW_MCP_CACHE_METADATA_TTL=86400工具参考
Law Scraper MCP提供13种法律研究和分析工具:
1.get_system_metadata(类别)
检索系统元数据以过滤和搜索法律行为。
参数:
category(字符串,默认值:“all”)-元数据类别:“关键字”、“发布者”、“状态”、“类型”、“机构”或“全部”
退货: 系统中可用的关键字、出版商、文档类型、状态和机构
示例:
- Get all available search keywords
- Retrieve all legal document types
- List all publishers (DU, MP)
- Get all document statuses
- Get complete system metadata2.search_legal_ats(发布者、年份、关键字、详细级别、状态、类型)
使用高级筛选选项搜索法律行为。
参数:
publisher(字符串)-出版商代码:“DU”(Dziennik Ustaw)或“MP”(Monitor Polski)year(整数)-出版年份(例如2024年)keywords(string)-搜索关键字(AND逻辑-使用多次搜索OR)detail_level(字符串,默认值:“标准”)-响应详细信息:“最小”、“标准”或“完整”status(字符串,可选)-文档状态筛选器type(字符串,可选)-文档类型筛选器
退货: 与元数据匹配的法律行为列表
搜索备注: 多个关键字使用AND逻辑。一次搜索一个关键字以查找OR行为。
示例:
- Search DU 2024 for "environment protection" acts
- Find all MP 2023 acts with status "active"
- Search for COVID-19 related legislation
- Find acts by specific type (e.g., "regulation")
- Get minimal detail results for quick scanning3.browse_ats(发布者、年份、详细级别)
浏览出版商在特定年份发布的所有法律行为。
参数:
publisher(string)-发布商代码:“DU”或“MP”year(整数)-出版年份detail_level(字符串,默认值:“标准”)-响应详细信息:“最小”、“标准”或“完整”
退货: 指定年份公布的完整法案清单
示例:
- Browse all DU acts from 2024
- Get minimal details of all MP acts from 2023
- Browse full details of DU 2022 legislation
- Get an overview of acts by publisher and year
- Track legislation published in a specific year4.过滤结果(result_set_id、模式、字段、type_equals等)
过滤并缩小以前检索到的搜索/浏览/更改结果。
参数:
result_set_id(string)-之前搜索/浏览/更改调用的结果集ID(例如“rs_1”)pattern(字符串,可选)-用于文本搜索的正则表达式模式(支持OR:“podatek|VAT|akcyza”)field(字符串,默认值:“title”)-要搜索的字段:“标题”、“eli”、“状态”、“类型”、“发布者”type_equals(string, optional) - 文件类型的确切匹配(例如,“法律”,“条例”)status_equals(string, optional) - 精确匹配状态(例如,“有效行为”,“已撤销行为”)year_equals(整数,可选)-与出版年份完全匹配date_field(字符串,可选)-范围筛选器的日期字段:“publication_Date”或“effective_Date”date_from/date_to(字符串,可选)-日期范围(YYYY-MM-DD)sort_by(字符串,可选)-排序字段:“标题”、“年份”、“位置”、“发布日期”等。sort_desc(boolean,默认值:false)-降序排序limit(整数,可选)-返回的最大结果
退货: 使用新的筛选结果 result_set_id 用于链式过滤
示例:
- Filter search results to only "Rozporządzenie" type
- Search titles with regex "zdrow|apteka|lekar"
- Filter by date range and sort by promulgation date
- Chain filters: first by type, then by regex pattern
- Get top 10 most recent results5.获取_细节(eli、load_content、detail_level)
检索特定法律行为的详细信息,并可选择加载其内容。
参数:
eli(字符串)-格式为“出版商/年份/编号”的行为标识符(例如,“DU/2024/1”)load_content(boolean,默认值:false)-将动作内容加载到文档存储中以进行节读取detail_level(字符串,默认值:“标准”)-响应详细信息:“最小”、“标准”或“完整”
退货: 如果load_content=true,则执行元数据(标题、发布日期、状态、类型等)、目录
示例:
- Get metadata for act DU/2024/1
- Load act content for section-level reading
- Get full details including table of contents
- Retrieve act status and publication information
- Load multiple acts for comparison6.read_act_content(eli,section)
阅读加载的法律行为的特定部分的内容。
参数:
eli(string)-动作标识符(必须首先通过get_acct_details加载,load_content=true)section(string)-应改为(例如,“第1条”、“第2章”、“序言”)
退货: 所请求章节的内容
工作流程说明: 必须先调用get_act_details(eli=“…”,load_content=true),然后使用此工具。
示例:
- Read Article 1 from loaded act
- Get Chapter 2 content
- Read the Preamble section
- Access specific numbered articles
- Navigate act by chapters7.search_in_act(eli,query)
在加载的法律行为中搜索特定术语。
参数:
eli(string)-动作标识符(必须首先通过get_acct_details加载,load_content=true)query(string)-搜索词或短语
退货: 将部分与上下文和位置相匹配
示例:
- Find all mentions of "penalty" in loaded act
- Search for specific legal terms
- Locate articles containing "fine" or "punishment"
- Find definitional sections
- Search for specific references8.分析_关系(eli,relationship_type)
分析法案的法律关系和参考文献(修正案、参考文献等)。
参数:
eli(string)-动作标识符relationship_type(字符串,默认值:“all”)-类型:“修订”、“amended_by”、“引用”、“referenced_by”或“all”
退货: 相关行为及其关系清单
示例:
- Find which acts amend this legislation
- See what acts this legislation amends
- Get all legal references in the act
- Find acts that reference this legislation
- Analyze complete act relationship network9.track_legal_changes(date_from、date_to、publisher、关键字)
跟踪日期范围内的法律变更和新行为。
参数:
date_from(字符串)-开始日期(YYYY-MM-DD格式)date_to(字符串)-结束日期(YYYY-MM-DD格式)publisher(字符串,可选)-按发布者筛选:“DU”或“MP”keywords(字符串,可选)-按关键字筛选
退货: 在日期范围内公布的法律行为
示例:
- Track changes from 2024-01-01 to 2024-12-31
- Find new DU acts from last month
- Get changes published in past 7 days
- Track legislation on specific topics over time
- Monitor legal changes by publisher and date range10.calculate_legal_date(天、月、年、基准日)
使用直观的符号约定计算法定日期。
参数:
days(整数,默认值:0)-天数偏移(+未来,-过去)months(整数,默认值:0)-月偏移量(+未来,-过去)years(整数,默认值:0)-年份偏移(+未来,-过去)base_date(字符串,可选)-基准日期(YYYY、YYYY-MM或YYYY-MM-DD格式,默认为今天)
退货: 计算日期和相关描述
签署约定: 积极=未来,消极=过去
示例:
- Get current date (call with no parameters)
- Calculate date 30 days in the future (+30)
- Calculate date 6 months in the past (-6 months)
- Calculate date 1 year from a specific date
- Calculate legal deadlines and periods11.比较行为(eli_a,eli_b)
比较两项法律行为的元数据。
参数:
eli_a(string)-第一个动作的ELI标识符(例如“DU/2024/1692”)eli_b(string)-第二幕的ELI标识符(例如“DU/2024/1716”)
退货: 标题、类型、状态、日期、关键字重叠和差异的比较
示例:
- Compare two acts from the same year
- Compare old and new versions of legislation
- Identify metadata differences between related acts12.list_result_sets()
显示存储在内存中的活动结果集。
退货: 包含ID、查询摘要、计数和创建时间的结果集列表
13.list_loaded_documents()
显示加载到文档存储中的文档。
退货: 加载的文档列表,包括ELI、大小、节数和时间戳
文档存储工作流
文档存储模式可在法律行为中实现高效的内容导航和搜索:
工作流程步骤
- 加载一个动作 -呼叫
get_act_details(eli="DU/2024/1", load_content=true)将该行为加载到文档存储中 - 阅读章节 -使用
read_act_content(eli="DU/2024/1", section="Art. 1")阅读特定章节 - 在行动中搜索 -使用
search_in_act(eli="DU/2024/1", query="penalty")查找术语
好处
- 高效的内存使用(可配置的最大文档数和TTL)
- 快速分段级导航,无需重新绘制
- 在没有API调用的加载动作中搜索
- 自动内容处理(PDF→文本,HTML→Markdown)
配置
LAW_MCP_DOC_STORE_MAX_DOCUMENTS-要在内存中保留多少个动作(默认值:10)LAW_MCP_DOC_STORE_MAX_SIZE_BYTES-最大内存使用量(默认值:5 MB)LAW_MCP_DOC_STORE_TTL-行为在内存中保留多长时间(默认值:2小时)
项目结构
law-scrapper-mcp/
├── src/law_scrapper_mcp/
│ ├── __init__.py
│ ├── __main__.py # Entry point for python -m
│ ├── server.py # FastMCP app, lifespan, transport config
│ ├── config.py # Pydantic settings (env vars)
│ ├── logging_config.py # Structured logging setup
│ ├── models/ # Pydantic models
│ │ ├── enums.py # Enumerations
│ │ ├── api_responses.py # Sejm API response models
│ │ ├── tool_inputs.py # Tool input models
│ │ └── tool_outputs.py # Tool output models
│ ├── client/ # HTTP client
│ │ ├── sejm_client.py # AsyncClient with retry and circuit breaker
│ │ ├── cache.py # Async TTL cache implementation
│ │ ├── circuit_breaker.py # Circuit breaker for API protection
│ │ └── exceptions.py # Custom exceptions (Polish messages)
│ ├── services/ # Business logic
│ │ ├── metadata_service.py # Metadata retrieval
│ │ ├── search_service.py # Search and browse
│ │ ├── act_service.py # Act details and content
│ │ ├── changes_service.py # Change tracking
│ │ ├── document_store.py # In-memory act storage
│ │ ├── result_store.py # Search result persistence and filtering
│ │ ├── content_processor.py # PDF/HTML processing
│ │ └── response_enrichment.py # Response hints
│ └── tools/ # MCP tool definitions
│ ├── metadata.py # get_system_metadata
│ ├── search.py # search_legal_acts
│ ├── browse.py # browse_acts
│ ├── act_details.py # get_act_details
│ ├── act_content.py # read_act_content
│ ├── act_search.py # search_in_act
│ ├── relationships.py # analyze_act_relationships
│ ├── filter_results.py # filter_results, list_result_sets
│ ├── changes.py # track_legal_changes
│ ├── compare.py # compare_acts
│ ├── dates.py # calculate_legal_date
│ └── error_handling.py # Centralized @handle_tool_errors decorator
├── tests/
│ ├── unit/ # Unit tests
│ └── integration/ # Integration tests with Sejm API
├── Dockerfile # Container image definition
├── docker-compose.yml # Multi-service setup
├── pyproject.toml # Project metadata and dependencies
├── uv.lock # Reproducible dependency lock
└── README.md # This file码头工人
Dockerfile
包括 Dockerfile 构建一个容器化的Law Scraper MCP服务器:
FROM python:3.13-slim
WORKDIR /app
COPY . .
RUN pip install -e .
EXPOSE 7683
CMD ["law-scrapper"]构建并运行:
# Build the image
docker build -t law-scrapper-mcp .
# Run with STDIO transport
docker run -it law-scrapper-mcp
# Run with HTTP transport
docker run -it -p 7683:7683 -e LAW_MCP_TRANSPORT=streamable-http law-scrapper-mcp
# With custom settings
docker run -it -p 7683:7683 \
-e LAW_MCP_TRANSPORT=streamable-http \
-e LAW_MCP_LOG_LEVEL=DEBUG \
law-scrapper-mcpdocker-compose.yml
使用docker compose进行部署:
# Start service
docker compose up -d
# View logs
docker compose logs -f
# Stop service
docker compose down迁移指南(v1到v2)
如果从v1.0.2升级,请注意这些突破性的变化:
| v1.0.2(旧) | v2.0.0(新) | 注意事项 |
|---|---|---|
get_current_date | calculate_legal_date() | 当前日期无参数调用 |
calculate_date_offset | calculate_legal_date(days/months/years) | 使用直观+未来/-过去符号约定 |
get_legal_keywords | get_system_metadata(category="keywords") | 整合到一个工具中 |
get_legal_publishers | get_system_metadata(category="publishers") | 整合到一个工具中 |
get_legal_statuses | get_system_metadata(category="statuses") | 整合到一个工具中 |
get_legal_types | get_system_metadata(category="types") | 整合到一个工具中 |
get_legal_institutions | get_system_metadata(category="institutions") | 整合到一个工具中 |
get_publisher_details | N/A | 使用 get_system_metadata(category="publishers") |
search_legal_acts | search_legal_acts | 增强与 detail_level 参数 |
get_publisher_year_acts | browse_acts | 为清楚起见,已重命名 |
get_act_comprehensive_details | get_act_details | 已添加 load_content 和 detail_level |
get_act_content | read_act_content | 需要预加载 get_act_details |
get_act_table_of_contents | get_act_details | TOC包含在详细回复中 |
get_act_relationships | analyze_act_relationships | 为清楚起见,已重命名 |
| ELI格式 | 单个字符串“DU/2024/1” | 从单独的参数更改而来 |
| SSE传输 | STDIO(默认) | STDIO为默认值,通过可流式传输HTTP |
| 端口7683 | 端口7683 | 相同的默认HTTP端口 |
v2.3.1的新增功能
- uvx/FastMCP修复 --已修复
NameError: name 'Annotated' is not defined当通过时uvx --from "git+https://github.com/numikel/law-scrapper-mcp" law-scrapper.已删除from __future__ import annotations从compare.py因此,在工具注册过程中,参数类型提示会正确解析。
v2.3.0的新增功能
- 3个新工具 —
compare_acts,list_result_sets,list_loaded_documents(共13个工具) - 断路器 -在Sejm API不可用时防止级联故障
- 集中错误处理 —
@handle_tool_errors具有错误分类和完整回溯的装饰器 - 异步。锁迁移 --所有商店使用
asyncio.Lock为了实现适当的异步兼容性 - 默认搜索限制 --默认情况下,搜索/浏览最多返回20个结果,以限制令牌使用
- 健康终点 —
/health适用于具有流式http传输的Docker部署 - 波兰语错误消息 --所有异常消息均以波兰语显示,以获得一致的用户体验
- 决策树文档字符串 --所有工具的“何时使用”/“何时不使用”
发展
设置
# Install dependencies
uv sync
# Install with dev dependencies
uv sync --extra dev运行测试
# Run unit tests
uv run pytest tests/unit/ -v
# Run integration tests (requires internet)
uv run pytest tests/integration/ -v -m integration
# Run all tests with coverage
uv run pytest --cov=law_scrapper_mcp --cov-report=term-missing
# Run with timeout for slow tests
uv run pytest --timeout=10 -v代码质量
该项目遵循FastMCP最佳实践:
- 模块化架构 -独立关注点(模型、客户、服务、工具)
- 键入提示 -Pydantic模型的完整类型注释
- 异步贯穿始终 -异步/等待所有I/O操作
- 综合示例 -每个工具至少5个示例
- 标记工具 -按类别组织,便于发现
- 带注释的参数 -所有输入的清晰描述
- 结构化日志记录 -可配置的JSON/文本格式
运行服务器
# STDIO transport (default)
uv run python -m law_scrapper_mcp
# HTTP transport
LAW_MCP_TRANSPORT=streamable-http uv run python -m law_scrapper_mcp
# With debug logging
LAW_MCP_LOG_LEVEL=DEBUG uv run python -m law_scrapper_mcp贡献
- 分叉存储库
- 创建功能分支(
git checkout -b feature/amazing-feature) - 使用常规提交格式提交更改
- 添加新功能的测试
- 确保所有测试通过并保持覆盖率
- 推到分支(
git push origin feature/amazing-feature) - 打开拉取请求
开发指南
- 遵循FastMCP最佳实践进行工具定义
- 包括全面的示例和参数描述
- 为工具分类添加适当的标签
- 全程编写异步代码
- 为所有新功能添加测试
- 用您的更改更新CHANGELOG.md
- 所有代码注释和文档均使用英语
许可证
该项目根据MIT许可证获得许可。有关详细信息,请参阅LICENSE文件。
作者
在以下人员的帮助下开发:
对于模型:
______________________________________________________________________
法律免责声明:该工具为研究目的提供了波兰法律文件的访问权限。始终咨询合格的法律专业人士,以获得法律建议和法律解释。
