どうもカッツプロダクション代表のカッツです、今回はEC系の裏方ネタになるのかな!!

ネットショップ作成サービスBASEのAPIをラップして、Claude Codeから商品管理を操作できるMCPサーバーを自作したというネタです。結論から言うと、作ること自体は思ったより素直にできました。ただし、実データで動作確認できたのはまだ一部だけ、というのも正直に書いておきます(笑)。

※2026年9月時点の内容です。BASE APIはβ版で、公式ドキュメントにも「正式リリースまでに仕様が変更、調整される可能性がある」と書かれています。ショップ名・トークン等は伏せています。
※30分は、プロンプトを投げてから完成するまでの時間です。AIさんにどう作らせるかのプロンプト設計や、アイディアを練る頭の中の妄想作業は、もっとかかってます(笑)

きっかけは単純に商品管理をAIに任せたかったから

運営に関わっているBASEのショップがあって、その商品管理をClaude Codeから直接操作できたら楽だなと思ったのがきっかけです。ログイン・商品の登録・編集・公開切り替え・カテゴリ整理、、、管理画面でポチポチやるのは地味に手間なんですよね。

ただ、2026年9月時点でBASEには公式のMCPサーバーがありません。ないなら作ればいいじゃん、ということで自作しました。

APIを叩くこと自体は昔から難しい話じゃないですが、今はそれをAIから使えるMCPサーバーにするところまで、AIに作ってもらえます。今回はAPIドキュメントを渡して、ヴァイブコーディングで進めました。自分専用のMCPサーバーがサクッと作れる時代です(自分は構想込みでもっとかかってますが、この記事を参考にすれば、生成自体は30分くらいでいけると思います)。公式MCPが出るのを待たなくていいし、自分や会社の業務に必要な機能だけに絞れるのも自作のいいところです。

形式はNode.jsのSTDIOタイプのMCPサーバーです。MCPの通信方式(stdioとStreamable HTTP)の違いは以前の記事で触れてるので、気になる方はそちらをどうぞ。

話が横道に逸れますが、、、「AIにマニュアルを読ませて作らせる」ってことは、マニュアル側に悪意ある指示が仕込まれてたらプロンプトインジェクションできそうだなとか思いました。公式ドキュメントなら心配ないと思いますが、出どころの怪しいドキュメントやサンプルコードをそのままAIに読ませるのは、ちょっと気をつけた方がよさそうです。

BASE APIの前提を先に整理

実装の話に入る前に、BASE APIの前提をざっと公式ドキュメントで確認しておきます(人間がですよ)。

  • 認証はPersonal Access Token(PAT)のみ。Authorization: Bearer <token>の形式で送ります。OpenAI APIやClaude APIと同じで、発行したキーをヘッダーに載せて送るよくあるパターンですね
  • トークンでできる操作の範囲は、発行するときに選ぶスコープ(権限)で決まります
  • 商品作成のAPIは、商品が非公開で作られる仕様。公開は別のエンドポイントで切り替える
トークン発行するときにスコープ(権限)を選ぶ画面

最後の「商品は非公開で作成される」は、自動化との相性がいいですね。AIが間違えて商品を作ってしまっても、いきなりお客さんに見える状態にはならないので。

今回使いたいスコープは、items.read、items.create、items.update、items.delete、items.publish、item_categories.write、files.write、user.readの8つです。注文系(orders.*)のスコープもあるんですが、今回は商品管理に絞ったので入れてません。

作ったものは13個のツール

さー、Claude Codeさんにこの呪文を入れて生成してもらいました!

実際のプロンプト

# ECプラットフォームBASEのmcpサーバーを作成
## フォマット
- NODE
- STDIOタイプ
## 参考にするAPIのリファレンス
https://apiv2.thebase.com/docs/
 
## mcpでできるスコープ
items.read
items.create
items.update
items.delete
items.publish
item_categories.write
files.write
user.read
## その他
APIトークンは.envに逃す構造
 
# 終わったあとのタスク
- CLAUD.mdとAGENTS.mdを作成
- .mcp.json を作成
- gitingoreを適切に設定
- commit & push

割と短いけどうまくいけました
BASEのAPIスコープに1対1で対応する形で、13個のツールを持つMCPサーバーになりました。

ツールスコープ対応エンドポイント
base_items_listitems.readGET /api/items
base_items_getitems.readGET /api/items/{id}
base_items_createitems.createPOST /api/items
base_items_updateitems.updatePOST /api/items/{id}
base_items_deleteitems.deleteDELETE /api/items/{id}
base_items_set_visibilityitems.publishPUT /api/items/{id}/visibility
base_item_categories_createitem_categories.writePOST /api/item_categories
base_item_categories_updateitem_categories.writePOST /api/item_categories/{id}
base_item_categories_deleteitem_categories.writeDELETE /api/item_categories/{id}
base_item_categories_add_itemitem_categories.writePUT /api/item_categories/{id}/items/{item_id}
base_item_categories_remove_itemitem_categories.writeDELETE /api/item_categories/{id}/items/{item_id}
base_files_uploadfiles.writePOST /api/files
base_user_getuser.readGET /api/user

ディレクトリ構成も、スコープごとにファイルが分かれててシンプルです。
見るからに単純な気はします。

ディレクトリ構成
src/
  index.js          # エントリーポイント。ツール登録とstdio接続
  baseClient.js     # Bearer認証つきfetch/multipartアップロードのヘルパー
  toolError.js      # エラーをMCPのisError結果に変換するラッパー
  tools/
    items.js
    itemCategories.js
    files.js
    user.js
今回のツールには、在庫設定、画像追加、種類(バリエーション)の追加・編集あたりは入ってません。商品管理を本格的に自動化するなら、このへんが次の候補ですね。

動作確認はまず401から

最初はダミートークンでbase_user_getを呼んで、BASE APIから実際に401エラーが返ってくるところまで確認しました。

ダミートークンでの実行結果(抜粋)
{
  "content": [{
    "type": "text",
    "text": "BASE API request failed with status 401: {\"type\":\"/errors/auth/unauthenticated\", ... }"
  }],
  "isError": true
}

「ちゃんと失敗する」ことを先に確認しておくのは、地味ですが大事なステップだと思ってます。成功するパターンだけ確認して、失敗時の挙動が未確認だと、本番で困るので。

そのあと、自分で発行した本物のアクセストークンを.envに設定して、同じbase_user_getを再実行。ショップ情報が正しく取得できることを確認しました。

お〜さっくり!当然ですがAIさんが作ったほうが人間様よりうまくいくよね〜笑 指示は人間・作業はAIさん

リポジトリの整備

プロンプトの「終わったあとのタスク」で指示した周辺ファイルも、まとめて作ってくれました。

  • .env.example と .gitignore — トークンなどの秘密情報がコミットされないように
  • .mcp.json — Claude Codeなどのクライアントが、このディレクトリでMCPサーバーを自動認識できるように
  • CLAUDE.md と AGENTS.md — コーディングエージェント向けの作業ルール
  • README.md — セットアップ手順とツール一覧

ドキュメントは最初英語で書かれてたので、日本人メンバーも読めるように、あとから日本語に書き直してもらいました。

このMCPサーバーは商品の削除までできます。トークンは、パスワードと同じ扱いで管理してください。試すときは、まず読み取り系のスコープだけのトークンで動かして、書き込み・削除系は非公開のテスト商品で動作を確認してから本番に使うのがおすすめです。本番のショップに、そのまま投入するのは避けてくださいね。

まだ検証できていないところ

ここは正直に書いておきます。実データで動作確認できたのはbase_user_getだけです。

商品一覧・作成・編集・削除、カテゴリ操作、公開切り替え、ファイルアップロード、、、これらはまだ実データでテストしていません。実際にショップの商品を動かす作業のタイミングで、1つずつ確認していく予定です。

特に気になってるのが、ファイルアップロードです。公式ドキュメントを見ると、POST /api/filesは「ファイルを直接アップロードするAPI」ではなくて、「アップロード先を発行するAPI」なんですよね。

  1. POST /api/filesで用途と画像形式を指定して、upload_url・upload_fields・file_idを受け取る
  2. 受け取ったupload_urlへ、upload_fieldsの全項目とファイル本体をmultipart/form-dataで送る
  3. 商品画像の追加などのエンドポイントにfile_idを渡す(ちょっとWordPressと似てますね)

つまり3ステップ構成なので、ツールの実装がこの流れに沿っているかは、実データで確認するまで正直わかりません、、、ここが一番ハマりそうなポイントだと思ってます(笑)。

あと、レートリミットは「今後導入予定」とロードマップに書かれてます。実データでテストするときは、連続で大量に叩かないよう、様子を見ながらやるのが無難ですね。

今回のまとめ

  • BASEには公式MCPがまだないけど、APIドキュメントさえあれば自分専用のMCPサーバーが作れる
  • BASE APIはPATで認証するシンプルな仕様で、ヴァイブコーディングで13個のツールがわりと素直にできた
  • 商品の削除までできるので、トークン管理とテスト商品での確認は必須
  • 実データで動作確認できたのはuser.readだけ。残りは実作業のタイミングで1つずつ検証する

ま〜体感的になんとなくわかってたんですけどね。

しかしマニュアルあればMCPいらん気もするがツールで縛って暴走制御みたいにはよさそうよね。

「格安でMCP開発します!」って人、自分も含めて単価が下がるか、仕事ごと溶けそうですね(マジ涙)

参考になれば幸いです!ツッコミどころあれば連絡くださいね。AIの困りごとあれば相談にのれますよ!

地味にBASEのパートナーです(笑)