Guam Code について
Guam Codeは、Guam Code Annotatedの条文照会とキーワード検索を提供します。グアム法を調べる人向けで、引用検索ではライブの章PDFから現行条文を抽出し、トピック検索では条文・章の見出しを対象とします。
主な機能
- 01引用による現行条文の取得
- 02条文・章の見出し検索
- 03ピリオド形式と連結形式の引用に対応
- 04ライブPDFから法令本文を抽出
活用シーン
- 01指定したグアム法の条文を読む
- 02トピックやキーワードから法令を探す
- 03指定Title内で条文を検索する
MCP 対応
Pipeworx経由またはローカルのstdio MCPサーバーとして、グアム法の条文照会と見出し検索ツールをMCPクライアントに提供します。ゲートウェイ接続にはPipeworx共通メタツールも含まれます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://gateway.pipeworx.io/guam-code/mcpclaude mcp add --transport http pipeworx-io-guam-code https://gateway.pipeworx.io/guam-code/mcp{"mcpServers":{"pipeworx-io-guam-code":{"type":"http","url":"https://gateway.pipeworx.io/guam-code/mcp"}}}Cursor で開く{"servers":{"pipeworx-io-guam-code":{"type":"http","url":"https://gateway.pipeworx.io/guam-code/mcp"}}}VS Code で開く{"mcpServers":{"pipeworx-io-guam-code":{"type":"http","url":"https://gateway.pipeworx.io/guam-code/mcp"}}}{"mcpServers":{"pipeworx-io-guam-code":{"serverUrl":"https://gateway.pipeworx.io/guam-code/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
@pipeworx/guam-code
Guam Code Annotated(GCA)— グアム準州法を、引用またはトピック/キーワード検索で調べられます。キーは不要です。
Pipeworx の一部です。AI エージェントを1,879以上のライブデータソースに接続するMCPゲートウェイです。これは独立した非公式インテグレーションであり、上流プロバイダーとは提携も承認もされておらず、同プロバイダーによる公開でもありません。
ツール
gu_statute(citation, title?)— 引用に基づくGCA条文の全文 (「9 GCA 16.30」は加重殺人の定義、「21 GCA 33101」は証書の認証を行える者を指します)。引用に対応する1つの章のPDFを特定し、ライブで取得してテキストを抽出します。citationに含まれていない場合のみ、titleが必要です。gu_search(query, title?, limit?)— 条文および章の見出しに対するトピック/キーワード検索(法令本文全体は対象外です。詳しくは以下を参照)。必要に応じて1つのタイトル(1~22)に絞り込めます。
認証
キーは不要です。
ソースと構成
Compiler of Laws(Judiciary of Guam、col.guamcourts.gov)は、GCAを約800件の章別PDFとして公開しており、これらは1つの静的HTMLページからリンクされています。このページには折りたたみ式のタイトルパネルが22個あり、それぞれに章が一覧表示されています。タイトル別の一覧も、検索APIも、サイト全体の条文索引もありません(ライブ環境で確認済み)。これはCentury Codeでmcps/north-dakota-codeが直面したものと同じ不足です。このページの内容(タイトル/章/見出し/PDF URL)は、scripts/bake-index.mjsによって一度だけ焼き込みます。
North Dakotaとは異なり、GCAの索引ページには全条文の一覧がありません。しかし、サンプルした章別PDFはすべて、各PDFの冒頭に独自の目次(§ <chapter>.<nn>. Catchline.形式の見出しの連続)を含んでいます。そのため、scripts/bake-sections.mjsは約800件の章別PDFをもう一度すべて取得し、その目次部分から条文単位の見出し索引(15,760行)を焼き込みます。gu_searchはこれを読み込みますが、gu_statuteは返すテキストの取得にこの索引を一切使用せず、呼び出しのたびにライブPDFから条文の境界を再導出します。
更新手順
Compiler of LawsによるGCAの改正内容を反映する必要がある場合は、両方を再実行してください(条文索引の焼き込みでは章索引を読み込むため、先に章索引を実行します)。
node mcps/guam-code/scripts/bake-index.mjs > mcps/guam-code/src/gu-index-data.ts
node --experimental-strip-types mcps/guam-code/scripts/bake-sections.mjs > mcps/guam-code/src/gu-section-data.ts
条文索引の焼き込みでは、パック独自のTypeScript抽出器を直接インポートするため、--experimental-strip-typesが必要です(このリポジトリにはtsx/ts-nodeへの依存関係がありません)。このフラグは実行時には必要なく、このオフラインスクリプトだけで必要です。控えめな並列数で約800件のHTTP取得を行うため、数分かかります。これはレート制限への対応ではなく、col.guamcourts.govへの配慮によるものです。
焼き込み済みの両モジュールは、単純な再エクスポートであるsrc/gu-baked-data.tsによって、ゲートウェイがこのパック用として参照する唯一のデータモジュールworkers/gateway/src/pack-baked-indexes.jsonにまとめられます。ゲートウェイはデプロイ時にエクスポートをKVにアップロードし、モジュールスコープでインポートするのではなく、args._bakedIndexとして注入します(index.tsのensureIndexを参照してください。焼き込み済みのテーブルを値としてインポートした際に、全アイソレートに影響してゲートウェイが停止した事例が1度ありました。fleet #2754)。
実際に使われている2種類の引用規則
比較的新しく再編成されたタイトル(9 GCA、1977年のModel Penal Codeを基にした刑事・矯正法典)では、「章.条文」の形式で引用します。たとえば、「9 GCA § 16.30」は加重殺人を指します。古いタイトル(例:21 GCA第33章、文書の証明および認証)では、章番号とゼロ埋めされた条文番号を区切りなしで連結します。たとえば、「21 GCA § 33101」は第33章第101条を指します。gu_statuteはどちらの形式も受け付けます(src/index.tsのparseGuCitationを参照してください)。区切りのない形式では、数字列だけでは章と条文の境界を一意に特定できません(章番号の桁数が異なるためです)。これは、該当するタイトルで、引用の文字列が先頭にそのまま一致する既知の章番号のうち、最も長いものを選んで解決します。サンプルしたすべてのケースで正しく機能しています。
shared/src/pdf-text.ts に実際の修正が必要だったため、取り込み済み。フォークは削除(fleet #2904)
Guamの章ごとのPDFは、当初、共有エクストラクターがまだ処理できない形で失敗していました。また、このパックの作成と同じ週に、別のパック(#2884、New Mexico)が独立して同じ共有ファイルを編集していたため、修正は当初、shared/src/pdf-text.ts をパック内でフォークした src/gu-pdf-extract.ts に置かれていました。次に共有エクストラクターを変更する人が取り込めるよう、目立つヘッダーコメントも付けていました(いずれもGuam固有のものではありません)。この取り込みはfleet #2904で完了しました。フォークは削除され、このパックは @pipeworx/shared の extractPdfText を直接呼び出すようになり、以下の3つの修正はすべて shared/src/pdf-text.ts 自体に反映されました。このパックだけでなく、ほかのすべてのPDFパック(kentucky-code、north-dakota-code、wyoming-code、new-mexico-code)にも役立ちます。
- リテラル文字列がフォントデコーダーに渡されていませんでした。 GuamのPDF作成元(WordからのNeevia Document Converter)は、一部の非WinAnsiサブセットフォントのテキストを、16進数形式(
<...>Tj)ではなく、括弧で囲んだリテラル文字列((abc)Tj)として出力します。共有エクストラクターのdecodeRunはリテラル文字列をそのまま通していました。WinAnsiなら正しい処理ですが、これらのフォントでは、生のバイト列はフォント独自の/ToUnicodeCMap を通してのみ意味を持つ、非常に小さく任意のコード空間です。共有コードにはすでにこの処理の仕組みがあり(North Dakota向けに作られたものです)、16進文字列の経路でしか使われていませんでした。実データで確認したところ、未修正の場合は§ 16.10が制御文字のノイズとして抽出されましたが、修正後は正しく読み取れます。 - 宣言された
/Lengthが数バイト長すぎるケース。 古い章ごとのPDFのいくつか(上記のNeevia変換PDFより古い時期の「MS Word for Windows Document」生成元)は、実際のdeflateストリームよりも/Lengthを1バイト以上長く宣言しています。Pythonのzlibは末尾の余分なバイトを黙って許容しますが、Node/Workersの厳格なDecompressionStreamはERR_TRAILING_JUNK_AFTER_STREAM_ENDをスローします。諦める前に、ストリーム末尾を1バイトずつ(最大4バイト)削って再試行するようになりました。 - セクションインデックスの作成中に、クラッシュ寸前の問題を発見しました。 共有の
inflate()ヘルパーでは、2つのストリーム書き込みが結果を待たずに実行されていました(void writer.write(...))。形式不正のdeflateストリーム(上記2で説明したものと同じPDF)があると、書き込みのPromiseが未処理の拒否(UNHANDLED rejection)になり、呼び出し元のtry/catchでは検知できず、プロセス全体が停止していました。scripts/bake-sections.mjsは実行途中でクラッシュしていました。各書き込みとクローズに何もしない.catch()を付けて修正しました。実際のエラーは引き続きreader.read()経由で表面化し、呼び出し元がすでに処理しています。
一方、src/gu-font-cmap-fix.ts に残した差分はパック内にとどめました。これは本当にGuam固有の問題だからです。 各章のPDFに埋め込まれている記号フォント(...+WPTypographicSymbols。曲がった引用符にのみ使用)には、2つのコードを、見た目上描画される左右の曲がった引用符ではなく、U+0041(「A」)とU+0040(「@」)に対応付ける /ToUnicode CMap が含まれています。目視で確認したところ、生の抽出結果の「ADirector of Public Safety@」は、この2つのコードを置き換えると「“Director of Public Safety”」になります。これは明らかに意図された読み方であり、どのPDFビューアーでコピー&ペーストしても再現されます。これはGuamが公開したPDF自体の不具合であり、汎用エクストラクターが推測できるものではありません。そのため、新しい fontCMapOverride オプションを介して extractPdfText に渡しています。これは汎用のフックであり、フォント自身の辞書テキストに一致させ、必要に応じて置き換え用の /ToUnicode マップを返せます。この仕組み自体にGuam固有の要素はなく、同様に壊れたソースPDFに遭遇した将来のパックでも利用できます。
4 つの機能 — 利用可能なもの 2 つ、利用できないもの 2 つ
- 引用の検索 — 利用可能です(
gu_statute)。 - トピック/キーワード検索 — 利用可能です(
gu_search)。公式の CATCHLINES(セクション名と章名)が対象で、法令本文全体は対象外です。網羅性は可能な限り確保していますが、キャッチラインは独立した公式索引ではなく、各章 PDF の目次から取得しているため、書式が通常と異なる章は十分に反映されない場合があります。 - 改正/制定履歴 —
gu_statuteのtextフィールドに、法令固有の「SOURCE:」行として含まれています(例:「1977 年に 16.30 として制定、P.L. 14-125 による改正…」)。独立したフィールドには分割されていません。サンプルとして確認した 2 つの PDF 世代にまたがって確実に解析できるほど、GCA では明確に区分されていないためです。 - 過去のバージョン(改正前のセクション本文)— 利用できません。
col.guamcourts.govが提供するのは現行の本文のみで、年別または会期別のアーカイブは見つかりませんでした。
既知の注意点:章の最後のセクションにページ装飾のノイズが残る場合があります
gu_statute は、繰り返し表示されるランニングヘッダー(「9 GCA CRIMES AND
CORRECTIONS CH. 16 CRIMINAL HOMICIDE 1」)と、各ページに付されている「COL」のスタンプを、章本文の最初の出現箇所から自動的に特定して除去します。旧世代の PDF(上記 #2 の「MS Word for Windows Document」製)では、このヘッダーが単語間のスペースなしで抽出されることがあります(「9 GCA REAL PROPERTY」ではなく「21GCAREAL
PROPERTY」など)。その場合、GCA の直前に空白があることを条件とする除去用正規表現では一致しません。法令本文自体には影響しませんが、これらの旧形式の章で、ページ末尾にたまたま配置されているセクションには、次ページのヘッダー/フッターの一部が末尾に残る場合があります。見た目だけの問題であり、正確性に影響する不具合ではありません。
引用
citation には "9 GCA 16.30"、"9 GCA § 16.30"、"21 GCA 33101"、または title を別途渡したうえでセクション単独("16.30"/"33101")を指定します。
データソース
https://col.guamcourts.gov/guam-code-annotated/guam-code-annotated— Title/Chapter 索引(折りたたみ式の 1 ページ)。一度だけsrc/gu-index-data.tsに組み込まれ、呼び出しごとに取得されることはありません。https://col.guamcourts.gov/sites/default/files/9gc016.pdf— 1 つの章の法令本文全体(ここでは 9 GCA Chapter 16, Criminal Homicide。ほかの章を指定する場合はファイル名を置き換えます)。gu_statuteは呼び出しのたびにこの PDF をリアルタイムで取得し、対象のセクションを抽出します。同じ約 800 件の章 PDF も、キャッチライン検索索引の作成にあたり、scripts/bake-sections.mjsによってオフラインで一度だけ取得されます。
どちらも、認証情報不要でサーバー側レンダリングされた通常の HTML/PDF です。ログインや JavaScript は不要で、開発中にレート制限は確認されませんでした。
クイックスタート
MCP クライアント(Claude Desktop、Cursor、Windsurf など)に追加します。
{
"mcpServers": {
"guam-code": {
"url": "https://gateway.pipeworx.io/guam-code/mcp"
}
}
}
このエンドポイントが実際に提供するもの
https://gateway.pipeworx.io/guam-code/mcp の tools/list は、上の表にあるツールに加えて、Pipeworx 共通のメタツール(ask_pipeworx、discover_tools、search_within、remember/recall など、ゲートウェイ全体で使えるツール一式)を返します。そのため、表示されるツール数はこの表より多くなります。現在、単一パックのエンドポイントには、そのパック専用のツールに加えて、およそ 30 個の共通ツールが一覧表示されます。接続の initialize レスポンスに正確なスコープが記載されており、その日の状況を確認する際の正式な情報源となります。
これは意図的なものであり、誤って多重化されたわけではありません。メタツールがあることで、このパックの対象外の質問にも、カタログ全体を横断して振り分ける ask_pipeworx を通じて回答できます。そのため、2 つ目の MCP サーバーを追加する必要はありません。現在、メタツールなしでパックのエンドポイントを接続する方法はありません。追加のスキーマによるコンテキスト消費がルーティングのメリットを上回る場合は、複数のパックエンドポイントではなく、フルゲートウェイに一度だけ接続してください。
または、フル Pipeworx ゲートウェイに接続すると、このパックだけでなく、すべてのパックのツールが直接一覧表示されます。
{
"mcpServers": {
"pipeworx": {
"url": "https://gateway.pipeworx.io/mcp"
}
}
}
どちらの URL も、同じゲートウェイと同じ 1879 以上のデータソースに接続します。違いは、どのパックのツールが直接一覧表示されるかだけです。どちらからでも、ask_pipeworx を使ってすべてのツールにアクセスできます。
MCP クライアントがない場合は、HTTP で呼び出す
curl -X POST https://gateway.pipeworx.io/v1/tools/gu_statute \
-H 'Content-Type: application/json' \
-d '{"citation":"9 GCA 16.30"}'
最初の呼び出しにアカウントは必要ありません。任意のツールを確認するには、GET https://gateway.pipeworx.io/v1/tools/gu_statute を使います。ツールを探すには、{"query":"..."} を指定して POST https://gateway.pipeworx.io/v1/tools/search_packs を使います。
スタンドアロン(ゲートウェイアカウント不要)
このパッケージは、ローカルの stdio MCP サーバーとしても実行できます。Pipeworx アカウントも、ゲートウェイとの往復通信も必要ありません。
{
"mcpServers": {
"guam-code": {
"command": "npx",
"args": ["-y", "@pipeworx/mcp-guam-code"]
}
}
}
または、直接実行して起動を確認できます。
npx -y @pipeworx/mcp-guam-code
stdin/stdout 経由で MCP を使用し、このパックのツールのみを対象に initialize/tools/list/tools/call に応答します。上記のゲートウェイ接続で追加される共通メタツールは含まれません。同じソース、同じツールで、ask_pipeworx によるルーティングはありません。
ask_pipeworx の使用
ツールを直接呼び出す代わりに、平易な英語で質問できます。これは上記のパックエンドポイントとフルゲートウェイの両方で使用できます。
ask_pipeworx({ question: "your question about Guam Code data" })
ゲートウェイが適切なツールを選び、引数を自動的に設定します。
詳細
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。