关于 Hawaii Code
Hawaii Code 是查询夏威夷州修订法典的 MCP 服务,适合法律资料检索和历史版本核对。它按条文引证或官方主题标题搜索,并提供修订历史及 1999 年以来的年度版本。
主要功能
- 01按条文引证获取法条全文
- 02按官方标题搜索主题
- 03解析修订与制定历史
- 04查询 1999 年以来的历史版本
适用场景
- 01根据引证查阅州法条文
- 02按法条官方标题检索主题
- 03比较条文的历年版本与修订
MCP 相关
向 MCP 客户端提供法条查询和主题搜索工具;法条工具可返回修订历史,并按年份获取历史文本。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://gateway.pipeworx.io/hawaii-code/mcpclaude mcp add --transport http pipeworx-io-hawaii-code https://gateway.pipeworx.io/hawaii-code/mcp{"mcpServers":{"pipeworx-io-hawaii-code":{"type":"http","url":"https://gateway.pipeworx.io/hawaii-code/mcp"}}}在 Cursor 中打开{"servers":{"pipeworx-io-hawaii-code":{"type":"http","url":"https://gateway.pipeworx.io/hawaii-code/mcp"}}}在 VS Code 中打开{"mcpServers":{"pipeworx-io-hawaii-code":{"type":"http","url":"https://gateway.pipeworx.io/hawaii-code/mcp"}}}{"mcpServers":{"pipeworx-io-hawaii-code":{"serverUrl":"https://gateway.pipeworx.io/hawaii-code/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
@pipeworx/hawaii-code
《夏威夷修订法典》(HRS)——按引文、官方标题行(主题搜索)查询州法规,包含内联修订/制定历史,以及追溯至 1999 年的逐年历史档案。无需密钥。
属于 Pipeworx——一个将 AI Agent 连接到 1881+ 个实时数据源的 MCP 网关。这是独立的非官方集成,与上游提供方无关联、未获其认可,也未由其发布。
工具
hi_statute(citation, year?)— 按引文获取 HRS 条文全文 (“707-701”是一级谋杀;“521-44”是《住宅房东—租客法典》规定的房东押金义务)。 包含官方标题行、章节背景,以及从州议会尾部的 “[L 1972, c 9, ...]”州法律括号中解析出的修订/制定历史。传入year(1999-2025)可获取该条文对应年份的存档文本,而非当前版本。hi_search(query, limit?)— 在州议会官方条文和章节标题行中按主题/关键词 搜索(不搜索法规正文——见下文),并返回匹配的引文。
身份验证
无需密钥。
调查陷阱并不适用——网站从未真正被封锁
8 月的调查记录了“夏威夷(403)”,然后便停止了。进一步调查后发现:
州议会的法规网站(www.capitol.hawaii.gov/hrscurrent/)
位于 Cloudflare 后方,其 WAF 对本机群的笔记本电脑/办公室 IP 的每次请求都返回硬性 403 错误
“Sorry, you have been blocked”——使用十几种 UA/Accept/Accept-Language
组合进行了复现,其中包括一套完整的真实 Chrome 请求头,0 次成功。这与所描述的陷阱相符。
边缘探测却得出了不同结论。在生产 Cloudflare 账户上运行一个临时的
wrangler dev --remote Worker,抓取完全相同的 URL,每次都成功返回 200——
包括缓存 HIT 和 MISS、十几个不同的真实页面,且没有任何拦截。这与
oscn.net/oklahoma-code 案例正好相反(Worker 被拦截,浏览器正常):在这里,
能通过的是 Cloudflare Worker 客户端,无法通过的是笔记本电脑。由于实时网关
本身就是 Cloudflare Worker,因此无需出口中继、特殊请求头或 BYOK——从网关直接执行普通的
fetch() 即可访问该网站。此软件包的 src/index.ts 文件头部记录了完整的探测过程;
本文件只需记录结论,以便下一个在调查中看到“403”并本能地想用中继的人了解情况。
没有合并索引,没有搜索 API——每章抓取一次目录,然后一次性生成
hrscurrent/ 是一个普通的 IIS 目录树,每个条文对应一个文件:
/hrscurrent/Vol{NN}_Ch{range}/HRS{chapterNum}/HRS_{chapterNum}-{section}.htm
每个章节目录还恰好包含一个额外文件——
HRS_{chapterNum}-.htm——即该章自己的官方目录:包含“CHAPTER NNN”标题、
章节名称,以及所有带官方标题行的条文编号。每章抓取一次(共 1,108 次)
就足以生成完整的引文和标题行索引;hi_search 完全在内存中读取该生成的表格。
hi_statute 使用生成的表格解析章节,然后为请求的条文编码出预期文件名并在线抓取——
如果编码出的文件名无法解析,就回退到在线目录列表(例如,自上次生成索引后新增或重新编号的条文,
或编码器未能预测的带小数点/字母后缀的格式)。生成的表格绝不包含法规正文。
通过实际对比生成结果而非目测,发现的 3 个目录解析陷阱
- 某个章节后紧接着空行分隔符时,整个章节会被悄然丢弃,而不只是它的续行文本——处理空行的逻辑会重置正在处理的章节,却从未将其写入输出。这是最常见的情况(每个“Part”标题前的最后一个章节,以及每章的最后一个章节),因此在每个重置
current的位置添加刷新逻辑之前,首次生成时全州约有十分之一的章节悄然丢失(已确认:“521-11”和“414-1”都缺失)。 - 连续废止的章节会显示在同一行,而不是每个章节占一行——例如“27-12, 13 Repealed”或“27-21, 21.1, 21.2, 21.3 Repealed”(第 27 章,已在实际页面确认)。只有第一个编号带有章号前缀。如果不处理,这整行会被当作“续行文本”,悄然破坏前一个实际章节的标题。
- 少数章节会在实际章节列表后附上交叉引用附录:可能是“DERIVATION TABLE OF CHAPTER NNN FROM ”(第 414 章《示范商业公司法》的交叉引用会直接显示为“414-1 1.01”,符合章节引文的格式,从而悄然覆盖实际的“414-1 Short title”行),也可能是没有标题、仅以普通列格式呈现的重编号/处置表(第 634 章)。这两种内容都可靠地归属于实际章节列表从不使用的
XNotes/XNotesHeadingCSS 类,因此解析器会在遇到第一个此类块时停止——但前提是已经越过该章自身的标题,因为某个 Title 的首章(例如第 21 章)开头会先列出 Title 级别的章节,并在出现“CHAPTER 21”标题之前就包含自己的“Cross References”块;如果在这里无条件遇到第一个 XNotes 块就停止,整章的实际内容都会被丢弃。
第 4 个陷阱:出现在 SECTION 页面本身,而非目录中
标题和章节的首句通常位于同一个 <p> 块中——HRS 会将 <b>§707-701 Murder...</b> (1) A person commits... 写在同一个段落里,而不是分成两个段落。对整个扁平化段落文本匹配标题正则,会把首句吞进解析出的 catchline,并将其从正文中丢弃(已在实际页面确认:早期版本的 hi_statute('707-701') 返回的文本从“(a) More than one person...”开始,而不是“(1) A person commits the offense of murder in the first degree if the person intentionally or knowingly causes the death of:”)。修复方法是只从原始块中第一个 <b>...</b> 范围内的内容读取标题,并将同一块中该闭合标签之后的文本视为正文的第一部分。
刷新路径
每当夏威夷重新编纂法典时,都要重新运行生成脚本(通常每年一次,在立法会期的法案汇编完成后):
node mcps/hawaii-code/scripts/bake-index.mjs --relay <url> > mcps/hawaii-code/src/hi-index-data.ts
如果运行环境的网络被 WAF 拦截,--relay 必须指向正在运行的透传 Worker(GET /?raw=1&url=<target> → fetch(target) 原样返回字节)——本项目的笔记本需要它,线上网关则不需要。如果发现卷数少于 10、章节少于 500 或条款少于 10,000,脚本会明确报错,而不会静默失败——这表示网站标记发生了变化,而不是法典缩减了。
字符编码 — hrscurrent 使用 UTF-8,历史档案则不使用
/hrsarchive/hrs{YYYY}/(已确认在线可访问 1999-2025 年,目录结构与当前版本相同,只是根目录不同)中的较早年份采用 windows-1252 编码,字符集仅在 HTML <meta> 标签中声明,HTTP 标头中从不声明。无论如何都将每个页面解码为 UTF-8,会悄无声息地破坏档案页面中的每个 §、破折号和弯引号;这与曾通过共享出口中继损坏 oscn.net 的问题属于同一类缺陷(fleet #2742)。sniffAndDecode 会在每次抓取时先从原始字节中读取 <meta charset> 声明,再选择解码器;当前页面和历史页面皆如此。
“未找到”页面返回 HTTP 200,而不是 404
不存在的引文会返回 HTTP 200,页面内容是网站自己的通用 IIS/ASP.NET 404 页面(charset=iso-8859-2、/screen.css),而不是 404 状态码,也不是法规模板。仅检查状态码,会把每个缺失的引文都当成传输成功,但实际上没有可解析的内容。isNotFoundPage 会将这种情况与真正的解析失败区分开来(法规模板确实存在 — WordSection1/hrs.css — 但标题正则仍未找到内容;此时会明确报错,绝不会悄悄通过),也会将其与 Cloudflare 拦截页面区分开来(同样会明确报错 — 参见 isBlockedPage;这是纵深防御,尽管该网站的 WAF 会返回硬性 403,而不是 2xx 验证页面)。
四种能力 — 全部可用
- 引文查询 — 可用(
hi_statute)。 - 主题/关键词搜索 — 可用(
hi_search),但匹配的是官方 CATCHLINES,而不是法规正文全文。夏威夷并未提供法规正文全文搜索(已在线核实)。例如,查询 “landlord” 会直接找到 15 条以上的标题(例如第 521 章下的 “Landlord's remedies for failure by tenant to pay rent”);纳入章节标题召回后,总匹配数超过 80 条。 - 修订/制定历史 — 可用,内联呈现。每个曾被修订过的现行 HRS 条文,其正文末尾都会带有类似
[L 1972, c 9, pt of §1; am L 1986, c 314, §49; ...]的方括号 — 每次修订对应一条议会法案引文。hi_statute会将其提取并拆分到amendments_history中,而不是留在text里;没有此类方括号的条文也会明确说明,而非省略该字段。 - 历史版本 — 可追溯至 1999 年。
hi_statute({citation, year})会从/hrsarchive/hrs{YYYY}/下抓取相同目录树 — 已通过在线抓取 2015 年版本的 HRS 707-701(谋杀罪)确认;该版本的正文比现行版本短,因为它早于 2016 年增加家庭法院证人情形的修订。
引文格式
夏威夷采用“章-条”格式引用,例如 “707-701”(第 707 章第 701 条:一级谋杀)或 “521-44”(第 521 章第 44 条:保证金)。章节编号可能带有字母后缀,表示插入的章节(“502C-1”);条文编号可能带有小数和/或末尾字母(“69.5”、“21.6”)。hi_statute 会直接通过内置章节表解析完整引文,不要求后缀采用特定格式。
数据来源
https://www.capitol.hawaii.gov/hrscurrent/— 现行《夏威夷修订法典》,以纯目录树形式呈现(每条一个文件,每章一个目录页)。数据只构建一次并写入src/hi-index-data.ts(仅包含章节、引文和标题,绝不包含法规正文);hi_statute会在每次调用时实时抓取调用方所请求的单个条文页面。https://www.capitol.hawaii.gov/hrsarchive/hrs{YYYY}/— 历史年份的相同目录树,涵盖 1999-2025 年。实时抓取,绝不预先构建。
两者都是纯静态、无需密钥、由服务器渲染的 HTML — 无需登录,也不需要 JavaScript。该网站的 Cloudflare WAF 会拦截本项目集群的笔记本电脑/办公室网络(见上文);实时网关本身是 Cloudflare Worker,不受影响。
快速开始
将其添加到你的 MCP 客户端(Claude Desktop、Cursor、Windsurf 等):
{
"mcpServers": {
"hawaii-code": {
"url": "https://gateway.pipeworx.io/hawaii-code/mcp"
}
}
}
此端点实际提供的内容
https://gateway.pipeworx.io/hawaii-code/mcp 上的 tools/list 会返回上表中的工具,以及 Pipeworx 共享元工具——ask_pipeworx、
discover_tools、search_within、remember/recall 和网关级工具集中的其他工具。因此,你看到的工具数量会多于表格中的数量:目前,单个工具包端点除了列出该工具包自身的工具,还会列出大约 30 个共享工具。连接的 initialize 响应会说明确切的范围,并且是当天情况的权威依据。
这是有意为之,并非意外的多路复用。元工具让受限范围的连接也能回答本工具包未涵盖的问题——通过 ask_pipeworx 跨整个目录路由——无需再添加第二个 MCP 服务。目前无法挂载不包含这些元工具的工具包端点;如果额外的架构定义占用的上下文超过了路由带来的价值,请连接一次完整网关,而不是连接多个工具包端点。
或者,连接完整的 Pipeworx 网关,直接列出每个工具包的工具,而不只是当前工具包的工具:
{
"mcpServers": {
"pipeworx": {
"url": "https://gateway.pipeworx.io/mcp"
}
}
}
两个 URL 都会连接到同一个网关和相同的 1881+ 个数据源。唯一的区别是哪些工具包的工具会被直接列出;无论连接哪一个,ask_pipeworx 都能访问所有工具。
没有 MCP 客户端?通过 HTTP 调用
curl -X POST https://gateway.pipeworx.io/v1/tools/hi_statute \
-H 'Content-Type: application/json' \
-d '{"citation":"707-701"}'
首次调用无需账户。检查任意工具:GET https://gateway.pipeworx.io/v1/tools/hi_statute。查找工具:使用 {"query":"..."} 向 https://gateway.pipeworx.io/v1/tools/search_packs 发送 POST 请求。
独立运行(无需网关账户)
此软件包也可以作为本地 stdio MCP 服务运行——无需 Pipeworx 账户,也无需通过网关往返:
{
"mcpServers": {
"hawaii-code": {
"command": "npx",
"args": ["-y", "@pipeworx/mcp-hawaii-code"]
}
}
}
也可以直接运行它,以确认服务能够启动:
npx -y @pipeworx/mcp-hawaii-code
它通过 stdin/stdout 使用 MCP 协议,并仅针对本工具包的工具响应 initialize/tools/list/tools/call——不包含上述网关连接额外提供的共享元工具。数据源相同,工具相同,但没有 ask_pipeworx 路由。
使用 ask_pipeworx
你无需直接调用工具,也可以用通俗英语提问——这既适用于上面的工具包端点,也适用于完整网关:
ask_pipeworx({ question: "your question about Hawaii Code data" })
网关会选择合适的工具,并自动填入参数。
更多信息
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。