在渲染上部署CourtListener MCP服务器
本指南将介绍如何创建和部署一个与CourtListener v4 REST API通信的Python MCP服务器,并提供五个可靠的工具:
courtlistener.search-案例法搜索/PACER/法官/口头辩论(Citegist搜索API)courtlistener.find_court--向CourtListener解析法庭字符串court_id代码(通过courts_db)courtlistener.get_cluster--通过集群ID(CourtListener意见URL中的ID)检索案例(集群)courtlistener.get_opinion--按意见ID检索特定意见文档(全文)courtlistener.resolve_from_url--粘贴CourtListener URL并返回底层集群+意见
您将使用HTTP传输将MCP服务器部署到Render,以便多个客户端可以连接。
先决条件
需求
- Python 3.10+
- MCP Python SDK(FastMCP)
httpx对于HTTP请求
在本地安装依赖项:
pip install "mcp[cli]" httpx courts-dbCourtListener API令牌
从您的CourtListener帐户(个人资料)创建或复制令牌→ API).所有请求必须包括:
Authorization: Token 渲染最佳实践:将令牌存储为名为的环境变量 COURTLISTENER_API_TOKEN.
CourtListener API模型(您正在集成的内容)
CourtListener在这里公开了两种重要的API风格:
- 搜索API(搜索引擎支持)
- 端点: /api/rest/v4/search/ - 用于发现和排名 - 支持关键字搜索(默认)和语义搜索(仅适用于判例法) - 使用光标分页
- 判例法REST API(数据库支持)
- 集群: /api/rest/v4/clusters/ (CourtListener URL中使用的案例/分组) - 意见: /api/rest/v4/opinions/ (个人决定文本;领导/同意/反对) - 卷宗/法院也存在,但四种工具的基线侧重于搜索+集群+意见。
关键区别: CourtListener网站URL包含一个集群ID(不是意见ID)。意见ID与集群ID不可靠匹配。
项目结构
建议的最小结构(已存在于此仓库中):
courtlistener-mcp/
courtlistener_server.py
requirements.txt
README.mdrequirements.txt:
mcp[cli]
httpx实施:MCP服务器(全部5个工具)
服务器在中实现 courtlistener_server.py.关键可靠性目标:
- 一个共享
httpx.AsyncClient - 一个请求助手,持续添加身份验证、超时和错误
- 随时随地使用CourtListener v4端点
- 在意见获取中使用字段选择来保持有效载荷较小
该文件定义了五个工具:
0) courtlistener.find_court
将人类法庭字符串(或CourtListener标识符)解析为CourtListener court_id 代码使用 courts_db 数据集。
示例流程(先解析后搜索):
{ "query": "Supreme Court of the United States" }然后通过返回 court_ids 进入搜索:
{ "query": "habeas", "type": "o", "courts": ["scotus"], "limit": 10 }1) courtlistener.search
通过搜索 /api/rest/v4/search/ 跨越多个语料库。返回一个规范化的、对代理友好的列表(默认限制=10)和一个 next_cursor.
响应总是包括 warnings 数组提醒消费者LLM摘要可能是错误的,并包含CourtListener链接(url)在引用结果时。
输入合同
query是必需的type选择您要搜索的内容courts是一个可选列表court_id代码court_query是一个可选的人类法庭字符串(解析为court_id代码通过courts_db)court_bankruptcy和court_date_found可选择细化court_query决心semantic仅适用于type="o"highlight切换代码段突出显示cursor支持分页
备注
- 对于
type="o"结果,可靠的标识符通常是cluster_id. - 工具返回
raw每个项目的稳健性;如果你想要一个更严格的模式,请删除。
2) courtlistener.get_cluster
按ID获取集群。可选地获取所有子意见文档。
3) courtlistener.get_opinion
按意见ID获取意见文档,返回首选格式的文本。用途 fields= 省略不需要的字段。
4) courtlistener.resolve_from_url
接受CourtListener URL,如下所示 https://www.courtlistener.com/opinion/2812209/obergefell-v-hodges/ 并返回规范集群(以及可选的意见文档)。
运行服务器(渲染的HTTP传输)
添加入口点(已在 courtlistener_server.py):
if __name__ == "__main__":
port = int(os.environ.get("PORT", "8000"))
mcp.run(transport="http", host="0.0.0.0", port=port)对于HTTP传输,FastMCP在以下位置公开JSON-RPC端点 /mcp.
要渲染的部署
- 推送到Git。 将此项目推送到GitHub(或其他git主机)。
- 创建渲染Web服务。
- 环境:Python - 构建命令:渲染自动安装 requirements.txt (或设置 pip install -r requirements.txt) - 启动命令:
python courtlistener_server.py- 环境变量。 在渲染上设置:
- COURTLISTENER_API_TOKEN =您的代币 - 自动设置渲染 PORT
- 核实。 部署后,您的MCP端点将是:
https://.onrender.com/mcp从代理使用MCP服务器
一旦向支持MCP的客户端注册,代理就可以呼叫:
MCP提示
此服务器还公开MCP提示(由返回的模板 prompts/get 客户在与模特交谈时可以应用)。
legal_research--使用courtlistener.*工具。
- 论据: question (必填), court_query, date_window, court_level, notes
搜索案例(10个结果)
{
"query": "breach of warranty",
"type": "o",
"courts": ["ca5"],
"limit": 10
}获取法律研究清单提示
{
"name": "legal_research",
"arguments": {
"question": "What is the standard for fair use in the Ninth Circuit?",
"court_query": "Ninth Circuit",
"date_window": "all years"
}
}根据结果检索全文
{
"cluster_id": 2812209,
"include_opinions": true,
"opinion_text_format": "html_with_citations"
}注:include_opinions默认为false当集群包含许多子意见时,避免长时间的扇出请求。
检索特定意见文件
{
"opinion_id": 9969234,
"text_format": "html_with_citations"
}粘贴URL
{
"url": "https://www.courtlistener.com/opinion/2812209/obergefell-v-hodges/",
"include_opinions": true
}可靠性检查表(为什么这种实施有效)
- 正确的API版本:所有使用
/api/rest/v4/...(无v3端点)。 - 正确的标识符:搜索返回集群;网站URL包含集群ID;通过意见ID获取的意见。
- 一致的HTTP行为:客户端以一致的超时延迟创建,并通过提供的帮助程序关闭。
- 一致的输出:所有工具都返回规范化的JSON对象(不是脆弱的格式化字符串)。
- 字段选择:意见获取使用
fields=以减小有效载荷大小。 - 分页支持:搜索返回
next_cursor代理人继续。
日志记录注意事项
如果你添加日志记录,请使用Python logging 并写入stderr。对于Render上的HTTP模式,stdout是可以接受的,但结构化日志记录是首选。
许可证
MIT许可证。看 LICENSE.
