mcpField
H
Hawaii Code

Hawaii Code

远程服务
pipeworx.io法律与政务02 天前更新

关于 Hawaii Code

Hawaii Code 是查询夏威夷州修订法典的 MCP 服务,适合法律资料检索和历史版本核对。它按条文引证或官方主题标题搜索,并提供修订历史及 1999 年以来的年度版本。

主要功能

  1. 01按条文引证获取法条全文
  2. 02按官方标题搜索主题
  3. 03解析修订与制定历史
  4. 04查询 1999 年以来的历史版本

适用场景

  1. 01根据引证查阅州法条文
  2. 02按法条官方标题检索主题
  3. 03比较条文的历年版本与修订

MCP 相关

向 MCP 客户端提供法条查询和主题搜索工具;法条工具可返回修订历史,并按年份获取历史文本。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://gateway.pipeworx.io/hawaii-code/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;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 个目录解析陷阱
  1. 某个章节后紧接着空行分隔符时,整个章节会被悄然丢弃,而不只是它的续行文本——处理空行的逻辑会重置正在处理的章节,却从未将其写入输出。这是最常见的情况(每个“Part”标题前的最后一个章节,以及每章的最后一个章节),因此在每个重置 current 的位置添加刷新逻辑之前,首次生成时全州约有十分之一的章节悄然丢失(已确认:“521-11”和“414-1”都缺失)。
  2. 连续废止的章节会显示在同一行,而不是每个章节占一行——例如“27-12, 13 Repealed”或“27-21, 21.1, 21.2, 21.3 Repealed”(第 27 章,已在实际页面确认)。只有第一个编号带有章号前缀。如果不处理,这整行会被当作“续行文本”,悄然破坏前一个实际章节的标题。
  3. 少数章节会在实际章节列表后附上交叉引用附录:可能是“DERIVATION TABLE OF CHAPTER NNN FROM ”(第 414 章《示范商业公司法》的交叉引用会直接显示为“414-1 1.01”,符合章节引文的格式,从而悄然覆盖实际的“414-1 Short title”行),也可能是没有标题、仅以普通列格式呈现的重编号/处置表(第 634 章)。这两种内容都可靠地归属于实际章节列表从不使用的 XNotes/XNotesHeading CSS 类,因此解析器会在遇到第一个此类块时停止——但前提是已经越过该章自身的标题,因为某个 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

评论

支持 Markdown

第一次接触 MCP?

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

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