本文へスキップ
Edition · Tokyo
実装・公開事例 · 定期更新

egov-law-mcp npm公開メモ: MCPサーバー配布とCI

スコープ付きnpmパッケージ、GitHubリポジトリ、README、Granular Access Token、GitHub Actions、provenance publishの手順を整理します。

codeagent.jp編集部 情報確認 約6分
Tags
  • mcp
  • npm
  • github-actions
  • release
  • egov
  • japanese-law
  • provenance
情報確認
参考リンク
8件
更新性
定期更新
読了目安
約6分
更新管理

仕様・料金・提供範囲が変わりやすいテーマは、公開日・更新日・情報確認日を分けて管理します。 導入前には必ず記事末尾の一次情報と公式ドキュメントで最新状況を確認してください。

egov-law-mcp npm公開メモ: MCPサーバー配布とCI の16:9共有用サマリー画像。 MCPサーバー公開は、npm名衝突を受け入れスコープ付き配布・独立Repo・CI publishで整える 1. 配布設計: 未スコープ名が取れない時は@scope付きnpm名へ切り替える、MCP本体は独立リポジトリに分けて依存を軽くする、READMEにClaude Code/Cursor設定例を最短で置く 2. CI公開: タグ作成からnpm publishまでGitHub Actionsで自動化する、NPM_TOKENはActions secretsへ置きログに出さない、dry-runとversion確認で誤公開を防ぐ 3. 運用注意: 破壊的変更はsemver majorとCHANGELOGで明示する、stdio MCPは標準出力ログ混入で壊れやすい、公開後はnpm installとMCP接続を別環境で確認する
egov-law-mcp npm公開メモ: MCPサーバー配布とCI 資料 26-1A8R 2026.04.25 実装・公開事例

日本法令をAIエージェントから出典付きで参照するMCPサーバー、@codeagentjp/egov-law-mcpv0.1.0 をnpmに公開しました。

この記事は、機能紹介ではなく公開作業の実務メモです。既存の egov-law-mcp というnpm名が使われていたため、スコープ付きパッケージへ切り替え、GitHubリポジトリを独立させ、GitHub Actionsから npm publish --provenance で公開するところまでを整理します。

Claude CodeやCursorで実際に使う手順は、Claude Codeで日本法令を引く。@codeagentjp/egov-law-mcp の使い方実演に分けました。

結論

MCPサーバーを配布物にするなら、GitHubリポジトリ、npmパッケージ、README、公開記事、CI publishの5点を同時に整えるのが早いです。

今回の要点は、既存名と衝突したら無理に同名を取りにいかず、スコープ付きパッケージで差別化を明示すること。そして、初回からGitHub Actionsでタグ駆動のnpm publishを作っておくことです。

公開したもの

今回公開した成果物は次のとおりです。

項目内容
npm@codeagentjp/egov-law-mcp
GitHubSHAYOUWORLD/egov-law-mcp
Releasev0.1.0
LicenseMIT
RuntimeNode.js 20+
Transportstdio MCP
Sourcee-Gov法令検索API

インストール設定は、MCPクライアント側で次のように書きます。

{
"mcpServers": {
"egov-law": {
"command": "npx",
"args": ["-y", "@codeagentjp/egov-law-mcp"]
}
}
}

@codeagentjp はnpmユーザースコープです。npm whoamicodeagentjp を返す状態だったため、npm Organizationを別途作る必要はありませんでした。

まず名前衝突を受け入れる

最初に想定していたnpm名は egov-law-mcp でした。しかし確認すると、同名のパッケージはすでに公開済みでした。

ここで取れる選択肢は3つあります。

選択肢内容今回の判断
既存パッケージを紹介する自作をやめて、使ってみた記事にする見送り
スコープ付きで出す@codeagentjp/egov-law-mcp として出す採用
別領域へピボットする条例、判例、法案、法令diffへ寄せるRoadmap化

後発で似たパッケージを出す場合、名前を変えるだけでは弱いです。READMEでは、既存実装との差分を明記しました。

差分目的
find_related_laws本体法から施行令・施行規則の候補を返す
出典埋め込み全Toolの戻り値にe-Gov出典情報を含める
no-build構成単一 .mjs をNode 20+で直接実行し、監査しやすくする

この3点がないなら、後発で出す理由はかなり薄くなります。

monorepoから独立リポジトリへ切り出した理由

最初のMVPは codeagent サイトの packages/egov-law-mcp/ にありました。最終的にはこれを削除し、MCP本体を独立リポジトリへ移しました。

理由は単純です。MCPディレクトリ、GitHub検索、npm検索、README流入を考えると、サブディレクトリのままでは弱いからです。

monorepo内独立リポジトリ
サイトの一部に見えるツール単体として見える
StarやIssueがサイト全体と混ざるMCP単体で評価される
READMEが埋もれるREADMEがそのまま着地ページになる
npm repository URLがサブディレクトリになるnpmからGitHubへ素直につながる

公開リポジトリには、GitHub Topicsも設定しました。mcpmodel-context-protocoljapanese-lawlegal-techegovjapanclaude-codecursoranthropiclawsygennai です。

これは飾りではありません。MCPはディレクトリ流入とGitHub検索流入の比重が高いので、READMEとTopicsは実質的な配布導線です。

package.jsonで決めたこと

package.json では、配布物を意図的に小さくしました。

{
"name": "@codeagentjp/egov-law-mcp",
"version": "0.1.0",
"type": "module",
"bin": {
"egov-law-mcp": "./bin/egov-law-mcp.mjs"
},
"files": [
"bin",
"README.md",
"LICENSE"
],
"engines": {
"node": ">=20.0.0"
},
"publishConfig": {
"access": "public"
}
}

ポイントは3つです。

1つ目は、files を絞ること。npmに余計な開発ファイル、メモ、環境ファイルを入れないためです。

2つ目は、bin を用意すること。MCPクライアントから npx -y @codeagentjp/egov-law-mcp で起動できるようにします。

3つ目は、publishConfig.accesspublic にすること。npmのスコープ付きパッケージは、デフォルトではprivate寄りの扱いになるため、公開パッケージでは npm publish --access public が必要です。npm公式ドキュメントでも、スコープ付きpublic packageは npm publish --access public で公開すると説明されています。

GitHub Actionsでタグ駆動publishにする

公開ワークフローは、タグ v* のpushで動くようにしました。

name: Publish to npm
on:
push:
tags:
- 'v*'
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org/'
- name: Verify version matches tag
run: |
PKG_VERSION=$(node -p "require('./package.json').version")
TAG_VERSION="${GITHUB_REF#refs/tags/v}"
if [ "$PKG_VERSION" != "$TAG_VERSION" ]; then
echo "Tag $TAG_VERSION does not match package.json version $PKG_VERSION"
exit 1
fi
- name: Publish
run: npm publish --access public --provenance
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

package.json のversionとGitタグを照合しているのは、v0.1.0 なのに中身が 0.1.1、またはその逆の事故を避けるためです。

id-token: write は、provenance生成に必要になる構成です。npmのtrusted publishingでは、GitHub Actionsなどからの公開時にprovenance attestationを生成できます。今回のように npm publish --provenance を使う場合も、公開元のリポジトリとworkflowを検証可能にする意図があります。

npm Granular Access Tokenで入れた値

CIからnpmへpublishするには、npm側の認証情報をGitHub Secretsに入れる必要があります。今回はnpmのGranular Access Tokenを使いました。

入力した値は次です。トークン本体は当然ながら記事にもログにも出しません。

フィールド入れた値
Token nameegov-law-mcp-ci
DescriptionGitHub Actions publish workflow for @codeagentjp/egov-law-mcp
Bypass two-factor authenticationチェックあり
Allowed IP ranges空欄
Packages and scopes@codeagentjp/egov-law-mcp または @codeagentjp にRead and write
OrganizationsNo access
Expiration30 days

GitHub ActionsのRunnerはIPが固定ではないため、Allowed IP rangesは空欄にしました。Organizations権限も不要です。@codeagentjp はnpm Organizationではなくユーザースコープだからです。

npm公式ドキュメントでは、Granular Access Tokenはパッケージやスコープ単位でアクセスを制限でき、書き込み権限や2FA bypassも設定できます。CI用トークンは、必要なパッケージだけにRead and writeを付け、期限を短くするのが扱いやすいです。

GitHub Secretsへ入れる

生成したnpm tokenは、GitHub Actionsのrepository secretとして入れます。

Terminal window
gh secret set NPM_TOKEN -R SHAYOUWORLD/egov-law-mcp

貼り付けるのは、npmの画面で一度だけ表示される npm_... の文字列です。GitHub Docsでは、repository secretはCLIの gh secret set でも作成できると説明されています。

確認は次です。

Terminal window
gh secret list -R SHAYOUWORLD/egov-law-mcp

ここで NPM_TOKEN が表示されれば、workflowから参照できます。値そのものは表示されません。

タグを切って公開する

準備ができたら、タグを切ってpushします。

Terminal window
git tag -a v0.1.0 -m "v0.1.0: initial public release"
git push origin v0.1.0

今回はこのタグpushで Publish to npm workflowが走り、npm publishまで成功しました。GitHub側のリリースは v0.1.0 として公開されています。

公開後はnpm側も確認します。

Terminal window
npm view @codeagentjp/egov-law-mcp version name repository.url homepage

確認時点では、次の値が返りました。

version = '0.1.0'
name = '@codeagentjp/egov-law-mcp'
repository.url = 'git+https://github.com/SHAYOUWORLD/egov-law-mcp.git'
homepage = 'https://codeagent.jp/tools/egov-law-mcp'

Roadmap issueを先に置く

公開直後に重要なのは、次に何を作るかをREADMEの外に出しておくことです。今回はRoadmap issue #1として、関連MCPの候補を切りました。

候補役割優先度
houan-mcp国会提出法案・議案情報C
law-diff-mcp法令改正前後diffD
local-ordinances-mcp自治体条例A
precedent-mcp判例検索B

優先順は C → D → A → B としました。理由は、データソースの扱いやすさとニュース/政策文脈との相性です。

このRoadmapを置いておくと、egov-law-mcp が「単発のe-Govラッパー」ではなく、日本語法令・制度データをMCP化していく入口だと伝わります。

今回やらなかったこと

初回公開では、あえてやらなかったこともあります。

  • /tools/egov-law-mcp のランディングページ
  • MCPディレクトリへの掲載申請
  • Smithery / Glama / awesome-mcp系へのPR
  • Cloudflare Workers版
  • ローカル全文検索インデックス

理由は、npmに出る前に配布導線を作っても弱いからです。まず npx -y @codeagentjp/egov-law-mcp で使える状態を作り、その後にランディングページとMCPディレクトリ申請を積む方が順番として自然です。

注意点

CI publishは便利ですが、npm tokenを長期で放置しない方がよいです。期限を短めにして、不要になったtokenはrevokeします。npmのtrusted publishingが使える構成では、長期tokenよりもOIDCベースのtrusted publishingへ寄せる方が安全です。npm公式ドキュメントでも、trusted publishingは短命でスコープされた認証情報を使うため、長期tokenのリスクを減らせると説明されています。

また、MCPサーバーは利用者のローカル環境で起動されます。READMEには、次の境界を必ず書くべきです。

  • シェルコマンドを実行しない
  • e-Gov法令検索エンドポイントだけに通信する
  • stdoutにはJSON-RPCだけを書く
  • ログはstderrに書く
  • 法的助言ではなく、法令参照ツールである

MCPは便利な接続口ですが、配布される側から見ればローカルで実行するプログラムです。小さく作るほど、監査しやすくなります。

まとめ

@codeagentjp/egov-law-mcp の初回公開でやったことは、派手な機能追加ではありません。名前衝突を受け入れ、スコープ付きで出し、READMEに差別化を明記し、GitHub Actionsで再現可能にpublishできる状態を作っただけです。

ただ、MCPサーバーはこの地味な配布設計がかなり大事です。AIクライアントから1行で起動でき、GitHubで中身を読めて、npmで取得でき、リリース履歴とRoadmapが見える。ここまでそろうと、個人開発の実験から、他人が試せる公開ツールに変わります。

次は、ランディングページとMCPディレクトリ申請です。npm公開が済んだので、ようやく配布導線を伸ばす段階に入れます。利用手順は、使い方実演記事で確認できます。

出典

Primary sources

一次情報・参考リンク

About the author
codeagent.jp編集部

Claude Code / Codex / MCP を個人開発サイト運用と公開MCPサーバー開発で試し、一次情報・検証ログ・失敗例をもとに整理します。

関連して読む