npx でフォークしたレポジトリを実行すると command not found となる場合の対処方法

問題

公開されている npm パッケージをフォークして機能追加したとき、あるいはバグ修正したとき、フォーク先の npm パッケージを npx コマンドで実行すると、以下のようなエラーとなる事があります。(私は freee-mcp をフォークして使おうとしました。)

# npx k4200/freee-mcp
Need to install the following packages:
github:k4200/freee-mcp
Ok to proceed? (y) y
sh: freee-mcp: command not found

解決策

package.json に以下のような修正をすると解決します。

--- a/package.json
+++ b/package.json
@@ -8,6 +8,7 @@
   "scripts": {
     "clean": "rm -rf dist",
     "build": "bun run build.ts",
+    "prepare": "npm run build",
     "start": "bun run src/index.ts",
     "dev": "bun --watch run src/index.ts",
     "typecheck": "tsc --noEmit",

原因

npm パッケージは、build 済のファイルが含まれているのに対して、GitHub レポジトリにはそうしたファイルが含まれていないためです。

freee-mcp の例で言うと、package.json に以下の記述があります。npx コマンドを使うとこの ./bin/cli.js が実行されますが、このファイルはレポジトリには含まれていません。

  "bin": {
    "freee-mcp": "./bin/cli.js"
  },

なぜ必要か

OSS なら、PR を出せば?と言う人もいるかもしれませんが、

  • PR を出しても、マージされるとは限らない、あるいはマージまでに時間がかかる
  • 他の人が欲しがらない(自分しか必要ではないと思われる)変更は、PR に出してもしょうがない

という理由で、フォークしたレポジトリをそのまま使いたい場合もあります。

自分の場合は後者の理由です。以下の PR なのですが、背景に書いたとおり他の人にはメリットがなさそうだったので。

設定ファイルのパスを指定する環境変数を導入 by k4200 · Pull Request #1 · k4200/freee-mcp

というか、freee-mcp レポジトリは、そもそも contributor 以外は PR を作れないような設定のようです。

最後に

JS に慣れている人であればすぐ分かることかもしれませんが、私は20分くらい悩んだので、npm のパッケージを公開する人は、最初から package.jsonprepare を書いておいてもらえると助かります。

フォーク版の freee-mcp が動くようになったので、業務の自動化に取り組んでいこうと思います。

あと、 MHaaS は、そろそろクローズドβを始められそうです。また、来週くらいにはデモ動画を YouTube に上げたいと思ってます。

we are hiring

優秀な技術者と一緒に、好きな場所で働きませんか

株式会社もばらぶでは、優秀で意欲に溢れる方を常に求めています。働く場所は自由、働く時間も柔軟に選択可能です。

現在、以下の職種を募集中です。ご興味のある方は、リンク先をご参照下さい。

コメントを残す