🚀 Shopify MCP Server
(気に入ったらスターをつけてください!)
Shopify API用のMCPサーバーで、GraphQL APIを通じてストアデータとのやり取りを可能にします。このサーバーは、商品、顧客、注文などの管理ツールを提供します。
📦 パッケージ名: shopify-mcp
🚀 コマンド: shopify-mcp (NOT shopify-mcp-server)
✨ 主な機能
- 商品管理:商品情報の検索、取得、更新が可能で、SEO最適化されたコンテンツも含まれます。
- 顧客管理:顧客データの読み込みと顧客タグの管理ができます。
- 注文管理:高度な注文のクエリとフィルタリングが可能です。
- ブログ管理:カスタムテンプレートとコメントポリシーを使って、ブログの作成、取得、更新ができます。
- 記事管理:豊富なコンテンツ、著者情報、SEOメタデータを持つブログ記事の作成と管理ができます。
- ストア検索:商品、記事、ブログ、ページを横断した統一検索が可能です。
- GraphQL統合:ShopifyのGraphQL Admin APIと直接統合されています。
- 包括的なエラーハンドリング:APIと認証に関する問題に対して明確なエラーメッセージを提供します。
- LLM最適化:AI言語モデルとのシームレスな使用のために設計されています。
📦 インストール
前提条件
- Node.js(バージョン16以上)
- Shopifyカスタムアプリアクセストークン(以下のセットアップ手順を参照)
セットアップ
Shopifyアクセストークン
このMCPサーバーを使用するには、Shopifyストアでカスタムアプリを作成する必要があります。
- Shopify管理者画面から、設定 > アプリと販売チャネルに移動します。
- アプリを開発するをクリックします(開発者プレビューを有効にする必要がある場合があります)。
- アプリを作成するをクリックします。
- アプリの名前を設定します(例:"Shopify MCP Server")。
- Admin APIスコープを構成するをクリックします。
- 以下のスコープを選択します。
read_products, write_products
read_customers, write_customers
read_orders, write_orders
read_content, write_content(ブログと記事用)
- 保存をクリックします。
- アプリをインストールするをクリックします。
- インストールをクリックして、アプリにストアデータへのアクセスを許可します。
- インストール後、Admin APIアクセストークンが表示されます。
- このトークンをコピーします。設定に必要になります。
Claude Desktopでの使用
claude_desktop_config.jsonに以下を追加します。
{
"mcpServers": {
"shopify": {
"command": "npx",
"args": [
"shopify-mcp",
"--accessToken",
"<YOUR_ACCESS_TOKEN>",
"--domain",
"<YOUR_SHOP>.myshopify.com"
]
}
}
}
Claude Desktop設定ファイルの場所:
- MacOS:
~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:
%APPDATA%/Claude/claude_desktop_config.json
代替方法:環境変数を使用してローカルで実行
コマンドライン引数の代わりに環境変数を使用する場合は、以下の手順を実行します。
- Shopifyの資格情報を含む
.envファイルを作成します。
SHOPIFY_ACCESS_TOKEN=your_access_token
MYSHOPIFY_DOMAIN=your-store.myshopify.com
- npxでサーバーを実行します。
npx shopify-mcp
直接インストール(オプション)
パッケージをグローバルにインストールする場合は、以下のコマンドを実行します。
npm install -g shopify-mcp
その後、以下のコマンドで実行します。
shopify-mcp --accessToken=<YOUR_ACCESS_TOKEN> --domain=<YOUR_SHOP>.myshopify.com
⚠️ 重要提示
コマンドライン引数を使用しているときに「SHOPIFY_ACCESS_TOKEN環境変数が必要です」というエラーが表示される場合は、別のパッケージがインストールされている可能性があります。必ずshopify-mcpを使用し、shopify-mcp-serverではないことを確認してください。
💻 使用例
商品管理
get-products
- 商品を取得するか、タイトルで検索し、カーソルベースのナビゲーションを使用します。
- 入力:
searchTitle(オプションの文字列):商品をタイトルでフィルタリングします。
limit(オプションの数値、デフォルト: 10):返される商品の最大数。
after(オプションの文字列):ページネーション用のカーソル - このカーソル以降のアイテムを取得します。
before(オプションの文字列):ページネーション用のカーソル - このカーソル以前のアイテムを取得します。
reverse(オプションのブール値、デフォルト: false):返される商品の順序を逆にします。
- 返り値:
- 以下を含むオブジェクト:
products: 商品の配列で、各商品には以下が含まれます。
title: 商品タイトル(SEO最適化済み)
description: 商品のプレーンテキストの説明
descriptionHtml: HTML形式の商品説明
- 追加フィールド: id、ハンドル、ステータス、在庫、価格設定など
cursor: ページネーション用のカーソル
pageInfo: 以下を含むページネーション情報
hasNextPage: 現在のページの後にさらにアイテムがあるかどうか
hasPreviousPage: 現在のページの前にさらにアイテムがあるかどうか
startCursor: 現在のページの最初のアイテムのカーソル
endCursor: 現在のページの最後のアイテムのカーソル
🌟 ナビゲーションの例
- 基本的なページネーション
{
"limit": 10
}
{
"limit": 10,
"after": "endCursor_from_previous_response"
}
{
"limit": 10,
"before": "startCursor_from_current_response"
}
- ページネーション付きの検索
{
"searchTitle": "t-shirt",
"limit": 5,
"after": "cursor_from_previous_response"
}
- 逆順で取得
{
"limit": 10,
"reverse": true
}
💡 ページネーションのヒント
- 各レスポンスから
startCursorとendCursorの両方を保存します。
hasNextPageとhasPreviousPageを使用して、ナビゲーションコントロールを表示/非表示にします。
- 一貫したページサイズを維持するために、同じ
limit値を使用します。
- 最新/最古のアイテムを最初に取得する必要がある場合は、
reverseを使用します。
searchTitleと組み合わせて、ページネーション付きの検索結果を取得します。
get-product-by-id
- IDで特定の商品を取得し、すべての詳細を表示します。
- 入力:
productId(文字列):取得する商品のGID(例:"gid://shopify/Product/1234567890")
- 返り値:
- 以下を含む単一の商品オブジェクト:
title: 商品タイトル(SEO最適化済み)
description: 商品のプレーンテキストの説明
descriptionHtml: HTML形式の商品説明
- 追加フィールド: id、ハンドル、ステータス、在庫、価格、バリエーション、コレクションなど
update-product
- 商品の基本詳細、SEO、バリエーションなど、商品の任意の側面を更新します。
- 入力:
productId(必須の文字列):商品のID(例:"gid://shopify/Product/1234567890")
title(オプションの文字列):新しい商品タイトル
descriptionHtml(オプションの文字列):HTML形式の商品説明
seo(オプションのオブジェクト):SEO設定
title(オプションの文字列):SEO最適化されたタイトル
description(オプションの文字列):検索エンジン用のメタ説明
status(オプションの文字列):商品ステータス - "ACTIVE"、"ARCHIVED"、または"DRAFT"
vendor(オプションの文字列):商品のメーカーまたはブランド
productType(オプションの文字列):商品のカテゴリまたはタイプ
tags(オプションの文字列配列):商品の分類用のタグ
variants(オプションのオブジェクト配列):更新する商品バリエーション
id(文字列):更新するバリエーションのID
price(オプションの文字列):新しい価格
compareAtPrice(オプションの文字列):元の/比較用の価格
sku(オプションの文字列):在庫管理番号
barcode(オプションの文字列):商品のバーコード
inventoryPolicy(オプションの文字列):在庫切れ時の動作についての "DENY" または "CONTINUE"
- 返り値:
- 更新された商品オブジェクトで、以下が含まれます。
id: 商品ID
title: 更新されたタイトル
descriptionHtml: 更新された説明
updatedAt: 更新タイムスタンプ
🌟 商品更新の初心者ガイド
- 基本的な商品更新
{
"productId": "gid://shopify/Product/1234567890",
"title": "Awesome T-Shirt",
"status": "ACTIVE"
}
- SEO情報の更新
{
"productId": "gid://shopify/Product/1234567890",
"seo": {
"title": "Awesome T-Shirt | 100% Cotton | Available in 5 Colors",
"description": "High-quality cotton t-shirt perfect for everyday wear. Available in multiple colors and sizes."
}
}
- 商品バリエーションの更新
{
"productId": "gid://shopify/Product/1234567890",
"variants": [
{
"id": "gid://shopify/ProductVariant/1234567",
"price": "29.99",
"compareAtPrice": "39.99",
"inventoryPolicy": "DENY"
}
]
}
- 商品の完全更新
{
"productId": "gid://shopify/Product/1234567890",
"title": "Premium Cotton T-Shirt",
"vendor": "Fashion Basics",
"productType": "Apparel",
"tags": ["cotton", "t-shirt", "basics", "summer"],
"seo": {
"title": "Premium Cotton T-Shirt | Fashion Basics | Multiple Colors",
"description": "Experience comfort with our premium cotton t-shirt. Perfect for any occasion."
},
"variants": [
{
"id": "gid://shopify/ProductVariant/1234567",
"price": "29.99",
"compareAtPrice": "39.99"
}
]
}
💡 新規ユーザー向けのヒント
- 小さな変更から始める:複雑な変更を試す前に、簡単な更新(タイトルや価格など)から始めます。
- 最初にテストする:ライブ商品を変更する前に、常にドラフト商品で更新をテストします。
- IDを確認する:正しい商品とバリエーションのIDを持っていることを確認します。
- SEOのベストプラクティス:
- SEOタイトルを60文字以内に保ちます。
- 説明的なメタ説明(150 - 160文字)を書きます。
- 関連するキーワードを自然に含めます。
- 価格戦略:
compareAtPriceを使用して節約額を表示します。
- サイズ/素材が異なる場合を除き、バリエーション間で価格を一貫させます。
- 在庫管理:
- 在庫が限られている商品には "DENY" を使用します。
- 受注生産の商品には "CONTINUE" を使用します。
⚠️ 避けるべき一般的な間違い
- 商品IDを含めるのを忘れないでください。
- 間違ったID形式を使用しないでください(常に完全なGID形式を使用します)。
- 無効な価格を設定しないでください(文字列である必要があり、数値ではありません)。
- バリエーションIDを混同しないでください。
- 通常のテキストフィールドにHTMLを使用しないでください。
🔍 IDの検索方法
- 商品ID:商品URLに表示されるか、
get-productsを使用して取得できます。
- バリエーションID:
get-product-by-idを使用してすべてのバリエーションを表示します。
- 常に完全なGID形式を使用します:"gid://shopify/Product/1234567890"
update-product-image-alt-text
- 特定の商品画像の代替テキストを更新します。
- 入力:
productId(文字列):画像が属する商品のGID(例:"gid://shopify/Product/1234567890")
imageId(文字列):更新する商品画像/メディアのGID(例:"gid://shopify/MediaImage/123")
altText(文字列 | null):画像の新しい説明的な代替テキスト。削除するにはnullに設定します。ベストプラクティスは125文字以内、最大512文字です。
- 返り値:
- 以下を含む更新されたメディアオブジェクト:
id: メディアID
altText: 更新された代替テキスト
コレクション管理
get-collections
- コレクションを取得するか、タイトルで検索します。
- 入力:
searchTitle(オプションの文字列):コレクションをタイトルでフィルタリングします。
limit(オプションの数値、デフォルト: 10):返されるコレクションの最大数。
- 返り値:
- 以下を含むコレクションの配列:
id: コレクションID
title: コレクションタイトル
handle: URLに適したハンドル
description: コレクションの説明
descriptionHtml: HTML形式の説明
updatedAt: 最後の更新タイムスタンプ
productsCount: コレクション内の商品の数
update-collection
- 既存のコレクションの詳細を更新します。
- 入力:
collectionId(文字列、必須):更新するコレクションのGID
title(オプションの文字列):新しいコレクションタイトル
description(オプションの文字列):新しいコレクションの説明
descriptionHtml(オプションの文字列):新しいHTML説明
seo(オプションのオブジェクト):SEO設定
title(オプションの文字列):SEOタイトル
description(オプションの文字列):SEO説明
- 返り値:
- 更新されたコレクションオブジェクトで、変更されたフィールドが含まれます。
- 例:
{
"collectionId": "gid://shopify/Collection/123456789",
"title": "Summer Kawaii Collection",
"descriptionHtml": "<p>Discover our cutest summer items!</p>",
"seo": {
"title": "Summer Kawaii Collection 2025",
"description": "Explore our adorable summer collection featuring..."
}
}
ブログ管理
get-blogs
- すべてのブログを取得するか、タイトルで検索します。
- 入力:
searchTitle(オプションの文字列):ブログをタイトルでフィルタリングします。
limit(オプションの数値、デフォルト: 10):返されるブログの最大数。
- 返り値:
- 以下を含むブログの配列:
id: ブログID
title: ブログタイトル
handle: URLに適したハンドル
templateSuffix: カスタムテーマのテンプレートサフィックス
commentPolicy: コメントモデレーションポリシー
createdAt: 作成タイムスタンプ
updatedAt: 最後の更新タイムスタンプ
update-blog
- 既存のブログの詳細を更新します。
- 入力:
blogId(文字列、必須):更新するブログのGID(例:"gid://shopify/Blog/1234567890")
title(オプションの文字列):新しいブログタイトル
handle(オプションの文字列):新しいURLに適したハンドル
templateSuffix(オプションの文字列):カスタムテーマの新しいテンプレートサフィックス
commentPolicy(オプションの文字列):新しいコメントポリシー("MODERATED" または "CLOSED")
- 返り値:
- 更新されたブログオブジェクトで、変更されたフィールドが含まれます。
get-blog-by-id
- IDで特定のブログを取得し、すべての詳細を表示します。
- 入力:
blogId(文字列、必須):取得するブログのGID
- 返り値:
- 以下を含むブログオブジェクト:
id: ブログID
title: ブログタイトル
handle: URLに適したハンドル
templateSuffix: テンプレートサフィックス
commentPolicy: コメントポリシー
articles: 最近の記事(最初の5件)
記事管理
get-articles
- 特定のブログから記事を取得します。
- 入力:
blogId(文字列、必須):記事を取得するブログのGID
searchTitle(オプションの文字列):記事をタイトルでフィルタリングします。
limit(オプションの数値、デフォルト: 10):返される記事の最大数。
- 返り値:
- 以下を含む記事の配列:
id: 記事ID
title: 記事タイトル
handle: URLに適したハンドル
author: 著者情報
publishedAt: 公開日
tags: 関連するタグ
image: 注目画像(ある場合)
create-article
- 指定されたブログに新しい記事を作成します。
- 入力:
blogId(文字列、必須):記事を作成するブログのGID
title(文字列、必須):記事のタイトル
content(文字列、必須):HTML形式の記事の内容
author(オブジェクト、必須):
published(オプションのブール値):すぐに公開するかどうか(デフォルト: false)
tags(オプションの文字列配列):記事を分類するためのタグ
- 返り値:
- 作成された記事オブジェクトで、以下が含まれます。
id: 記事ID
title: 記事タイトル
handle: URLに適したハンドル(タイトルから自動生成)
body: 記事の内容
summary: 記事の要約(提供された場合)
author: 著者情報
tags: 関連するタグ
image: 注目画像の詳細(提供された場合)
- 例:
{
"blogId": "gid://shopify/Blog/123456789",
"title": "My New Article",
"content": "<p>Article content with <strong>HTML formatting</strong>.</p>",
"author": {
"name": "John Doe"
},
"published": true,
"tags": ["news", "updates"]
}
{
"blogId": "gid://shopify/Blog/123456789",
"title": "Upcoming Article",
"content": "<p>Draft content...</p>",
"author": {
"name": "Jane Smith"
},
"published": false,
"tags": ["draft"]
}
update-article
- 既存の記事の詳細を更新します。
- 入力:
articleId(文字列、必須):更新する記事のGID
title(オプションの文字列):新しい記事タイトル
body(オプションの文字列):新しい記事の内容
summary(オプションの文字列):新しい記事の要約
tags(オプションの文字列配列):新しい記事のタグ
author(オプションのオブジェクト):著者情報
- 返り値:
- 更新された記事オブジェクトで、変更されたフィールドが含まれます。
get-article-by-id
- IDで特定の記事を取得し、すべての詳細を表示します。
- 入力:
articleId(文字列、必須):取得する記事のGID
- 返り値:
- 以下を含む記事オブジェクト:
id: 記事ID
title: 記事タイトル
handle: URLに適したハンドル
author: 著者情報
body: 記事の内容
blog: 親ブログ情報
tags: 関連するタグ
ブログと記事管理の重要な注意事項
ブログコンテンツの操作
- 常に
get-blogsを最初に使用して、有効なブログIDを取得します。
get-blog-by-idを使用して、特定のブログの詳細情報を取得します。
- ブログを更新するときは、変更したいフィールドのみを含めます。
commentPolicyは "MODERATED" または "CLOSED" にのみ設定できます。
記事の操作
- 記事は既存のブログに関連付ける必要があります。
get-articlesを使用して、特定のブログ内の記事をリストします。
- 記事を作成または更新するとき、
bodyフィールドはHTMLコンテンツをサポートします。
- 著者情報には常に少なくとも名前が含まれている必要があります。
- タグは大文字と小文字を区別し、記事全体で一貫している必要があります。
- 画像URLは公開アクセス可能である必要があります。
- ハンドルの作成はオプションです - 提供されない場合、Shopifyがタイトルから自動生成します。
記事作成のベストプラクティス
- 記事の内容にはセマンティックHTML(
<p>、<h2>、<ul>など)を使用します。
- 記事の要約を簡潔に保ちます(推奨: 150 - 160文字)。
- 一貫したタグ命名規則を使用します。
- 記事を作成する前に、常にブログIDを確認します。
- タイトルと内容を書くときにSEOの影響を考慮します。
- 最初にステージング環境でHTMLフォーマットをテストします。
- ドラフトの場合は、公開せずに保存するために
published: falseを設定します。
- タグを使用する場合は、一貫した分類法を維持します。
- 画像には説明的な代替テキストを提供します。
- 公開日を使用して戦略的に記事をスケジュールします。
- HTMLコンテンツをクリーンで構造化された状態に保ちます。
- より良いSEOのために、意味のあるハンドルを使用します。
- コンテンツをフォーマットするときは、モバイルでの読みやすさを考慮します。
記事作成のヒント
- HTMLコンテンツ:コンテンツフィールドは、リッチフォーマットのためにHTMLマークアップを受け入れます。
<p>First paragraph with <strong>bold text</strong>.</p>
<h2>Section Heading</h2>
<ul>
<li>List item one</li>
<li>List item two</li>
</ul>
- タグ:より良い組織化のために、説明的で一貫したタグを使用します。
"tags": ["product-updates", "how-to", "tips"]
- ドラフトモード:公開をfalseに設定して、未公開のドラフトを作成します。
{
"published": false,
}
"author": {
"name": "Full Author Name"
}
ストア検索
search-shopify
- 商品、記事、ブログ、ページを横断した統一検索を実行します。
- 入力:
query(文字列、必須):ストア全体のコンテンツを検索するためのクエリ
types(オプションの文字列配列):検索するリソースのタイプ。利用可能なタイプ:
- "ARTICLE"
- "BLOG"
- "PAGE"
- "PRODUCT"
first(オプションの数値、デフォルト: 10、最大: 50):返される結果の数
- 返り値:
- 検索結果の配列で、各結果には以下が含まれます。
id: リソースID
title: リソースタイトル
type: リソースタイプ
url: リソースのURL
- リソースタイプに基づく追加フィールド
- 例:
{
"query": "kawaii",
"types": ["ARTICLE", "BLOG"],
"first": 5
}
{
"query": "new collection",
"first": 10
}
ページ管理
get-pages
- すべてのページを取得するか、タイトルで検索します。
- 入力:
searchTitle(オプションの文字列):ページをタイトルでフィルタリングします。
limit(オプションの数値、デフォルト: 10):返されるページの最大数。
- 返り値:
- 以下を含むページの配列:
id: ページID
title: ページタイトル
handle: URLに適したハンドル
body: ページの内容
bodySummary: 内容の要約
createdAt: 作成タイムスタンプ
updatedAt: 最後の更新タイムスタンプ
update-page
- 既存のページの詳細を更新します。
- 入力:
pageId(文字列、必須):更新するページのGID(例:"gid://shopify/Page/1234567890")
title(オプションの文字列):新しいページタイトル
body(オプションの文字列):新しいページの内容
bodyHtml(オプションの文字列):新しいHTML内容
seo(オプションのオブジェクト):SEO設定
title(オプションの文字列):SEOタイトル
description(オプションの文字列):SEO説明
published(オプションのブール値):ページが公開されているかどうか
- 返り値:
- 更新されたページオブジェクトで、変更されたフィールドが含まれます。
- 例:
{
"pageId": "gid://shopify/Page/123456789",
"title": "About Our Store",
"bodyHtml": "<h1>Welcome!</h1><p>Learn about our story...</p>",
"seo": {
"title": "About Us - Kawaii Store",
"description": "Discover our journey in bringing kawaii culture to you"
}
}
📚 詳細ドキュメント
コンテンツ管理のベストプラクティス
SEO最適化
- 説明的なタイトルとハンドルを使用します。
- すべてのコンテンツにメタ説明を提供します。
- 関連するキーワードを自然に含めます。
- URLをクリーンで意味のあるものに保ちます。
- HTMLコンテンツで適切な見出し階層を使用します。
コンテンツの組織化
- 関連する商品をコレクションにグループ化します。
- 一貫した命名規則を使用します。
- 明確なコンテンツ階層を維持します。
- 商品説明を詳細かつ正確に保ちます。
- 説明的な代替テキストを持つ高品質の画像を使用します。
パフォーマンスの考慮事項
- 画像サイズを最適化します。
- 適切なクエリ制限を使用します。
- 頻繁にアクセスされるコンテンツをキャッシュします。
- 可能な場合はバッチ更新を行います。
- APIの使用状況を監視します。
コンテンツ管理のヒント
- 定期的なコンテンツ監査を行います。
- すべてのコンテンツで一貫したブランディングを維持します。
- モバイルに対応したフォーマットを使用します。
- 重要なコンテンツの定期的なバックアップを行います。
- 主要な変更についてはバージョン管理を行います。
エラーハンドリング
すべてのツールには包括的なエラーハンドリングが含まれています。
- 無効なIDエラー
- 権限エラー
- レート制限エラー
- 検証エラー
- ネットワークエラー
エラーレスポンスには以下が含まれます。
- エラーコード
- エラーの原因となったフィールド
- 詳細なエラーメッセージ
- 解決策の提案
APIの制限
レート制限
- ShopifyのAPIレート制限を尊重します。
- 適切なクエリ制限を使用します。
- 失敗したリクエストに対してリトライロジックを実装します。
- APIの使用状況を監視します。
コンテンツ制限
- 最大コンテンツ長
- サポートされるHTMLタグ
- 画像サイズ制限
- APIバージョンの互換性
認証
- 必要なアクセススコープ
- トークンの有効期限
- IP制限
- アプリの権限