使用说明
Shopify MCP服务器
(如果你愿意,请留下一颗星!)
Shopify API的MCP服务器,通过GraphQL API实现与商店数据的交互。此服务器提供用于管理产品、客户、订单等的工具。
📦 包名称: shopify-mcp
🚀 命令: shopify-mcp (不是 shopify-mcp-server)
特性
- 产品管理:搜索、检索和更新产品信息,包括SEO优化的内容
- 客户管理:加载客户数据并管理客户标签
- 订单管理:高级订单查询和筛选
- 博客管理:使用自定义模板和评论策略创建、检索和更新博客
- 物品管理:创建和管理内容丰富、作者信息和SEO元数据的博客文章
- 店铺搜索:跨产品、文章、博客和页面的统一搜索
- GraphQL集成:与Shopify的GraphQL Admin API直接集成
- 全面的错误处理:清除API和身份验证问题的错误消息
- LLM优化:专为与AI语言模型无缝使用而设计
先决条件
- Node.js(版本16或更高)
- Shopify自定义应用访问令牌(请参阅下面的设置说明)
设置
Shopify访问令牌
要使用此MCP服务器,您需要在Shopify商店中创建一个自定义应用程序:
- 从您的Shopify管理员,转到 设置 > 应用程序和销售渠道
- 点击 开发应用程序 (您可能需要先启用开发人员预览)
- 点击 创建应用程序
- 为您的应用程序设置一个名称(例如,“Shopify MCP服务器”)
- 点击 配置管理员API作用域
- 选择以下范围:
read_products,write_productsread_customers,write_customersread_orders,write_ordersread_content,write_content(博客和文章)
- 点击 保存
- 点击 安装应用程序
- 点击 安装 让应用程序访问您的商店数据
- 安装后,您将看到 管理员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 - 窗户:
%APPDATA%/Claude/claude_desktop_config.json
替代方案:使用环境变量在本地运行
如果您更喜欢使用环境变量而不是命令行参数:
-
创建一个
.env使用您的Shopify凭据文件: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
⚠️ 重要提示: 如果在使用命令行参数时看到有关“SHOPY_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:当前页面最后一项的光标
- 对象包含:
🌟 导航示例:
- 基本分页:
// Get first page of products { "limit": 10 } // Get next page using the endCursor from previous response { "limit": 10, "after": "endCursor_from_previous_response" } // Get previous page using the startCursor from current response { "limit": 10, "before": "startCursor_from_current_response" }- 分页搜索:
// Search products with pagination { "searchTitle": "t-shirt", "limit": 5, "after": "cursor_from_previous_response" }- 逆序:
// Get products in reverse order { "limit": 10, "reverse": true }💡 分页提示:
- 存储两者
startCursor和endCursor从每个回复 - 使用
hasNextPage和hasPreviousPage显示/隐藏导航控件 - 保持不变
limit页面大小一致的价值 - 使用
reverse当你首先需要最新/最旧的物品时 - 与…结合
searchTitle用于分页搜索结果
-
get-product-by-id- 按ID获取特定产品及其所有详细信息
- 输入:
productId(string):要获取的产品的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(string):要更新的变量IDprice(可选字符串):新价格compareAtPrice(可选字符串):原始/价格比较sku(可选字符串):库存单位barcode(可选字符串):产品条形码inventoryPolicy(可选字符串):“DENY”或“CONTINUE”表示缺货行为
🌟 产品更新入门指南
- 基本产品更新:
// Update product title and status { "productId": "gid://shopify/Product/1234567890", "title": "Awesome T-Shirt", "status": "ACTIVE" }- 更新SEO信息:
// Make your product more visible in search results { "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." } }- 更新产品变体:
// Change prices and inventory settings { "productId": "gid://shopify/Product/1234567890", "variants": [ { "id": "gid://shopify/ProductVariant/1234567", "price": "29.99", "compareAtPrice": "39.99", "inventoryPolicy": "DENY" } ] }- 完成产品更新:
// Update multiple aspects at once { "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”
- 对于定制商品,请使用“继续”
⚠️ 要避免的常见错误:
- 忘记包含产品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- 更新特定产品图像的alt文本
- 输入:
productId(string):图像所属产品的GID(例如,“gid://shopify/Product/1234567890")imageId(string):要更新的产品图像/媒体的GID(例如,“gid://shopify/MediaImage/123")altText(string | null):图像的新描述性alt文本。设置为null以删除。最佳做法是将其保持在125个字符以下,最多512个字符。
- 退货:
- 更新的媒体对象包含:
id:媒体IDaltText:更新的alt文本
- 更新的媒体对象包含:
收集管理
get-collections- 获取收藏或按标题搜索
- 输入:
searchTitle(可选字符串):按标题筛选集合limit(可选数字,默认值:10):要返回的最大集合数
博客管理
-
get-blogs- 获取所有博客或按标题搜索
- 输入:
searchTitle(可选字符串):按标题筛选博客limit(可选数字,默认值:10):要返回的博客的最大数量
- 退货:
- 博客数组包含:
id:博客IDtitle:博客标题handle:URL友好句柄templateSuffix:自定义主题的模板后缀commentPolicy:评论审核政策createdAt:创建时间戳updatedAt:上次更新时间戳
- 博客数组包含:
-
update-blog- 更新现有博客的详细信息
- 输入:
blogId(string,必填):要更新的博客的GID(例如,“gid://shopify/Blog/1234567890")title(可选字符串):新博客标题handle(可选字符串):新的URL友好句柄templateSuffix(可选字符串):自定义主题的新模板后缀commentPolicy(可选字符串):新的评论策略(“MODERATED”或“CLOSED”)
- 退货:
- 用修改后的字段更新博客对象
-
get-blog-by-id- 按ID获取特定博客及其所有详细信息
- 输入:
blogId(string,必填):要获取的博客GID
- 退货:
- 博客对象包含:
id:博客IDtitle:博客标题handle:URL友好句柄templateSuffix:模板后缀commentPolicy:评论政策articles:最近的文章(前5篇)
- 博客对象包含:
物品管理
-
get-articles- 从特定博客获取文章
- 输入:
blogId(string,必填):从中获取文章的博客GIDsearchTitle(可选字符串):按标题筛选文章limit(可选数字,默认值:10):要返回的最大文章数
- 退货:
- 包含以下内容的文章数组:
id:文章IDtitle:文章标题handle:URL友好句柄author:作者信息publishedAt:出版日期tags:关联标签image:特色图片(如有)
- 包含以下内容的文章数组:
-
create-article- 在指定博客中创建新文章
- 输入:
blogId(string,必填):用于创建文章的博客GIDtitle(string,必填):文章的标题content(string,必填):HTML格式的文章内容author(对象,必填):name(string,必填):文章作者的姓名
published(可选布尔值):是否立即发布(默认值:false)tags(可选字符串数组):对文章进行分类的标签
- 退货:
- 创建的文章对象包含:
id:文章IDtitle:文章标题handle:URL友好句柄(由标题自动生成)body:文章内容summary:文章摘要(如有提供)author:作者信息tags:关联标签image:特色图片详情(如有提供)
- 创建的文章对象包含:
- 示例用法:
// Create a published article with formatted content { "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"] } // Create a draft article with future publication { "blogId": "gid://shopify/Blog/123456789", "title": "Upcoming Article", "content": "<p>Draft content...</p>", "author": { "name": "Jane Smith" }, "published": false, "tags": ["draft"] }
-
update-article- 更新现有文章的详细信息
- 输入:
articleId(string,必填):要更新的文章的GIDtitle(可选字符串):新文章标题body(可选字符串):新文章内容summary(可选字符串):新文章摘要tags(可选字符串数组):新文章标签author(可选对象):作者信息name(string):作者姓名
- 退货:
- 使用修改后的字段更新文章对象
-
get-article-by-id- 按ID获取特定文章及其所有详细信息
- 输入:
articleId(string,必填):要获取的文章的GID
- 退货:
- 文章对象包含:
id:文章IDtitle:文章标题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保存而不发布 - 使用标签时,保持一致的分类
- 为任何图像提供描述性alt文本
- 使用publishDate策略性地安排文章
- 保持HTML内容干净且结构良好
- 使用有意义的句柄以获得更好的SEO
- 格式化内容时考虑移动可读性
- 对文章内容使用语义HTML(例如。,
-
文章创建技巧
- 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"] - 草稿模式:通过将published设置为false来创建未发布的草稿:
{ "published": false, // other fields... } - 作者信息:始终提供完整的作者详细信息:
"author": { "name": "Full Author Name" }
- HTML内容:内容字段接受HTML标记以实现丰富的格式:
店铺搜索
search-shopify- 跨产品、文章、博客和页面执行统一搜索
- 输入:
query(string,必填):在商店中查找内容的搜索查询types(可选字符串数组):要搜索的资源类型。可用类型:- “文章”
- “博客”
- “页面”
- “产品”
first(可选数字,默认值:10,最大值:50):要返回的结果数
- 退货:
- 搜索结果数组,每个结果包含:
id:资源IDtitle:资源标题type:资源类型url:资源URL- 基于资源类型的其他字段
- 搜索结果数组,每个结果包含:
- 示例用法:
// Search for articles and blogs about "kawaii" { "query": "kawaii", "types": ["ARTICLE", "BLOG"], "first": 5 } // Search across all content types { "query": "new collection", "first": 10 }
页面管理
-
get-pages- 获取所有页面或按标题搜索
- 输入:
searchTitle(可选字符串):按标题筛选页面limit(可选数字,默认值:10):返回的最大页数
- 退货:
- 包含以下内容的页面数组:
id:页面IDtitle:页面标题handle:URL友好句柄body:页面内容bodySummary:内容摘要createdAt:创建时间戳updatedAt:上次更新时间戳
- 包含以下内容的页面数组:
-
update-page- 更新现有页面的详细信息
- 输入:
pageId(string,必填):要更新的页面的GID(例如,“gid://shopify/Page/1234567890")title(可选字符串):新页面标题body(可选字符串):新页面内容bodyHtml(可选字符串):新建HTML内容seo(可选对象):SEO设置title(可选字符串):SEO标题description(可选字符串):SEO描述
published(可选布尔值):页面是否已发布
- 退货:
- 更新了带有修改字段的页面对象
- 示例用法:
// Update page content and SEO { "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" } }
收集管理
-
get-collections- 获取所有收藏或按标题搜索
- 输入:
searchTitle(可选字符串):按标题筛选集合limit(可选数字,默认值:10):要返回的最大集合数
- 退货:
- 包含以下内容的集合数组:
id:集合IDtitle:收藏标题handle:URL友好句柄description:收藏说明descriptionHtml:HTML格式的描述updatedAt:上次更新时间戳productsCount:收藏中的产品数量
- 包含以下内容的集合数组:
-
update-collection- 更新现有收藏的详细信息
- 输入:
collectionId(string,必填):要更新的集合的GIDtitle(可选字符串):新收藏标题description(可选字符串):新集合描述descriptionHtml(可选字符串):新建HTML描述seo(可选对象):SEO设置title(可选字符串):SEO标题description(可选字符串):SEO描述
- 退货:
- 已更新具有修改字段的集合对象
- 示例用法:
// Update collection with SEO optimization { "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-products- 获取所有产品或按标题搜索
- 输入:
searchTitle(可选字符串):按标题筛选产品limit(可选数量,默认值:10):可退回的最大产品数量
- 退货:
- 一系列产品包含:
id:产品IDtitle:产品名称handle:URL友好句柄description:产品描述descriptionHtml:HTML格式的描述status:产品状态totalInventory:总库存盘点priceRange:产品价格范围images:产品图片
- 一系列产品包含:
-
get-product-by-id- 获取特定产品的详细信息
- 输入:
productId(string,必填):要获取的产品的GID
- 退货:
- 产品对象包含:
id:产品IDtitle:产品名称handle:URL友好句柄description:产品描述descriptionHtml:HTML格式的描述status:产品状态totalInventory:总库存盘点variants:产品变体images:产品图片collections:相关收藏
- 产品对象包含:
-
update-product- 更新产品的详细信息
- 输入:
productId(string,必填):要更新的产品的GIDtitle(可选字符串):新产品标题descriptionHtml(可选字符串):新建HTML描述
- 退货:
- 更新的产品对象包含:
id:产品IDtitle:更新标题descriptionHtml:更新的描述updatedAt:更新时间戳
- 更新的产品对象包含:
内容管理的最佳实践
-
搜索引擎优化
- 使用描述性标题和句柄
- 为所有内容提供元描述
- 自然地包含相关关键字
- 保持URL干净且有意义
- 在HTML内容中使用适当的标题层次结构
-
内容组织
- 集合中的集团相关产品
- 使用一致的命名约定
- 保持清晰的内容层次结构
- 保持产品描述详细准确
- 使用具有描述性alt文本的高质量图像
-
性能注意事项
- 优化图像大小
- 使用适当的查询限制
- 缓存频繁访问的内容
- 尽可能批量更新
- 监控API使用情况
-
内容管理提示
- 定期内容审核
- 在所有内容中保持一致的品牌
- 移动友好格式
- 定期备份重要内容
- 重大变更的版本控制
错误处理
所有工具都包括全面的错误处理:
- ID错误无效
- 权限错误
- 速率限制错误
- 验证错误
- 网络错误
错误响应包括:
- 错误代码
- 导致错误的字段
- 详细错误消息
- 解决建议
API限制
-
速率限制
- 遵守Shopify的API价格限制
- 使用适当的查询限制
- 对失败的请求实施重试逻辑
- 监控API使用情况
-
内容限制
- 最大内容长度
- 支持的HTML标签
- 图像大小限制
- API版本兼容性
-
认证
- 所需访问范围
- 令牌过期
- IP限制
- 应用程序权限