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_products - read_customers, write_customers - read_orders, write_orders - read_content, write_content (博客和文章)
- 点击 保存
- 点击 安装应用程序
- 点击 安装 让应用程序访问您的商店数据
- 安装后,您将看到 管理员API访问令牌
- 复制此令牌-您需要它进行配置
使用Claude Desktop
将此添加到您的 claude_desktop_config.json:
{
"mcpServers": {
"shopify": {
"command": "npx",
"args": [
"shopify-mcp",
"--accessToken",
"",
"--domain",
".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= --domain=.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:当前页面最后一项的光标
#### 🌟 导航示例:
1. 基本分页:
// 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"
}2. 分页搜索:
// Search products with pagination
{
"searchTitle": "t-shirt",
"limit": 5,
"after": "cursor_from_previous_response"
}3. 逆序:
// Get products in reverse order
{
"limit": 10,
"reverse": true
}#### 💡 分页提示:
1. 存储两者 startCursor 和 endCursor 从每个回复 1. 使用 hasNextPage 和 hasPreviousPage 显示/隐藏导航控件 1. 保持不变 limit 页面大小一致的价值 1. 使用 reverse 当你首先需要最新/最旧的物品时 1. 与…结合 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):要更新的变量ID - price (可选字符串):新价格 - compareAtPrice (可选字符串):原始/价格比较 - sku (可选字符串):库存单位 - barcode (可选字符串):产品条形码 - inventoryPolicy (可选字符串):“DENY”或“CONTINUE”表示缺货行为
#### 🌟 产品更新入门指南
1. 基本产品更新:
// Update product title and status
{
"productId": "gid://shopify/Product/1234567890",
"title": "Awesome T-Shirt",
"status": "ACTIVE"
}2. 更新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."
}
}3. 更新产品变体:
// Change prices and inventory settings
{
"productId": "gid://shopify/Product/1234567890",
"variants": [
{
"id": "gid://shopify/ProductVariant/1234567",
"price": "29.99",
"compareAtPrice": "39.99",
"inventoryPolicy": "DENY"
}
]
}4. 完成产品更新:
// 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"
}
]
}#### 💡 新用户提示:
1. 从小做起:在尝试复杂的更改之前,先从简单的更新(如标题或价格)开始 1. 测试优先:在修改实时产品之前,始终测试草稿产品的更新 1. 检查ID:确保您有正确的产品和变体ID 1. SEO最佳实践: - 保持SEO标题不超过60个字符 - 编写描述性元描述(150-160个字符) - 自然地包含相关关键字 1. 定价策略: - 使用 compareAtPrice 显示节省 - 除非尺寸/材料不同,否则保持不同型号的价格一致 1. 库存管理: - 对于库存有限的商品使用“DENY” - 对于定制商品,请使用“继续”
#### ⚠️ 要避免的常见错误:
1. 忘记包含产品ID 1. 使用错误的ID格式(始终使用完整的GID格式) 1. 设置无效价格(必须是字符串,而不是数字) 1. 混淆变体ID 1. 在常规文本字段中使用HTML
#### 🔍 如何查找ID:
1. 产品ID:可在产品URL中找到或使用 get-products 1. 变量ID:使用 get-product-by-id 查看所有变体 1. 始终使用完整的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:媒体ID - altText:更新的alt文本
收集管理
get-collections
- 获取收藏或按标题搜索 - 输入: - searchTitle (可选字符串):按标题筛选集合 - limit (可选数字,默认值:10):要返回的最大集合数
博客管理
get-blogs
- 获取所有博客或按标题搜索 - 输入: - searchTitle (可选字符串):按标题筛选博客 - limit (可选数字,默认值:10):要返回的博客的最大数量 - 退货: - 博客数组包含: - id:博客ID - title:博客标题 - 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:博客ID - title:博客标题 - handle:URL友好句柄 - templateSuffix:模板后缀 - commentPolicy:评论政策 - articles:最近的文章(前5篇)
物品管理
get-articles
- 从特定博客获取文章 - 输入: - blogId (string,必填):从中获取文章的博客GID - searchTitle (可选字符串):按标题筛选文章 - limit (可选数字,默认值:10):要返回的最大文章数 - 退货: - 包含以下内容的文章数组: - id:文章ID - title:文章标题 - handle:URL友好句柄 - author:作者信息 - publishedAt:出版日期 - tags:关联标签 - image:特色图片(如有)
create-article
- 在指定博客中创建新文章 - 输入: - blogId (string,必填):用于创建文章的博客GID - title (string,必填):文章的标题 - content (string,必填):HTML格式的文章内容 - author (对象,必填): - name (string,必填):文章作者的姓名 - published (可选布尔值):是否立即发布(默认值:false) - tags (可选字符串数组):对文章进行分类的标签 - 退货: - 创建的文章对象包含: - id:文章ID - title:文章标题 - handle:URL友好句柄(由标题自动生成) - body:文章内容 - summary:文章摘要(如有提供) - author:作者信息 - tags:关联标签 - image:特色图片详情(如有提供) - 示例用法:
// Create a published article with formatted content
{
"blogId": "gid://shopify/Blog/123456789",
"title": "My New Article",
"content": "
Article content with HTML formatting.
",
"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": "
Draft content...
",
"author": {
"name": "Jane Smith"
},
"published": false,
"tags": ["draft"]
}update-article
- 更新现有文章的详细信息 - 输入: - articleId (string,必填):要更新的文章的GID - title (可选字符串):新文章标题 - body (可选字符串):新文章内容 - summary (可选字符串):新文章摘要 - tags (可选字符串数组):新文章标签 - author (可选对象):作者信息 - name (string):作者姓名 - 退货: - 使用修改后的字段更新文章对象
get-article-by-id
- 按ID获取特定文章及其所有详细信息 - 输入: - articleId (string,必填):要获取的文章的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(例如。, , , 等等) - 保持文章摘要简洁(建议:150-160个字符) - 使用一致的标签命名约定 - 在创建文章之前,始终验证博客ID - 在撰写标题和内容时考虑SEO的影响 - 首先在暂存环境中测试HTML格式 - 对于草稿,设置 published: false 保存而不发布 - 使用标签时,保持一致的分类 - 为任何图像提供描述性alt文本 - 使用publishDate策略性地安排文章 - 保持HTML内容干净且结构良好 - 使用有意义的句柄以获得更好的SEO - 格式化内容时考虑移动可读性
- 文章创建技巧
- HTML内容:内容字段接受HTML标记以实现丰富的格式:
First paragraph with bold text.
Section Heading
List item one
List item two
- 标签:使用描述性、一致的标签以更好地组织:
"tags": ["product-updates", "how-to", "tips"]- 草稿模式:通过将published设置为false来创建未发布的草稿:
{
"published": false,
// other fields...
}- 作者信息:始终提供完整的作者详细信息:
"author": {
"name": "Full Author Name"
}店铺搜索
search-shopify
- 跨产品、文章、博客和页面执行统一搜索 - 输入: - query (string,必填):在商店中查找内容的搜索查询 - types (可选字符串数组):要搜索的资源类型。可用类型: - “文章” - “博客” - “页面” - “产品” - first (可选数字,默认值:10,最大值:50):要返回的结果数 - 退货: - 搜索结果数组,每个结果包含: - id:资源ID - title:资源标题 - 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:页面ID - title:页面标题 - 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": "
Welcome!
Learn about our story...
",
"seo": {
"title": "About Us - Kawaii Store",
"description": "Discover our journey in bringing kawaii culture to you"
}
}收集管理
get-collections
- 获取所有收藏或按标题搜索 - 输入: - searchTitle (可选字符串):按标题筛选集合 - limit (可选数字,默认值:10):要返回的最大集合数 - 退货: - 包含以下内容的集合数组: - id:集合ID - title:收藏标题 - handle:URL友好句柄 - description:收藏说明 - descriptionHtml:HTML格式的描述 - updatedAt:上次更新时间戳 - productsCount:收藏中的产品数量
update-collection
- 更新现有收藏的详细信息 - 输入: - collectionId (string,必填):要更新的集合的GID - title (可选字符串):新收藏标题 - description (可选字符串):新集合描述 - descriptionHtml (可选字符串):新建HTML描述 - seo (可选对象):SEO设置 - title (可选字符串):SEO标题 - description (可选字符串):SEO描述 - 退货: - 已更新具有修改字段的集合对象 - 示例用法:
// Update collection with SEO optimization
{
"collectionId": "gid://shopify/Collection/123456789",
"title": "Summer Kawaii Collection",
"descriptionHtml": "
Discover our cutest summer items!
",
"seo": {
"title": "Summer Kawaii Collection 2025",
"description": "Explore our adorable summer collection featuring..."
}
}产品管理
get-products
- 获取所有产品或按标题搜索 - 输入: - searchTitle (可选字符串):按标题筛选产品 - limit (可选数量,默认值:10):可退回的最大产品数量 - 退货: - 一系列产品包含: - id:产品ID - title:产品名称 - handle:URL友好句柄 - description:产品描述 - descriptionHtml:HTML格式的描述 - status:产品状态 - totalInventory:总库存盘点 - priceRange:产品价格范围 - images:产品图片
get-product-by-id
- 获取特定产品的详细信息 - 输入: - productId (string,必填):要获取的产品的GID - 退货: - 产品对象包含: - id:产品ID - title:产品名称 - handle:URL友好句柄 - description:产品描述 - descriptionHtml:HTML格式的描述 - status:产品状态 - totalInventory:总库存盘点 - variants:产品变体 - images:产品图片 - collections:相关收藏
update-product
- 更新产品的详细信息 - 输入: - productId (string,必填):要更新的产品的GID - title (可选字符串):新产品标题 - descriptionHtml (可选字符串):新建HTML描述 - 退货: - 更新的产品对象包含: - id:产品ID - title:更新标题 - descriptionHtml:更新的描述 - updatedAt:更新时间戳
内容管理的最佳实践
- 搜索引擎优化
- 使用描述性标题和句柄 - 为所有内容提供元描述 - 自然地包含相关关键字 - 保持URL干净且有意义 - 在HTML内容中使用适当的标题层次结构
- 内容组织
- 集合中的集团相关产品 - 使用一致的命名约定 - 保持清晰的内容层次结构 - 保持产品描述详细准确 - 使用具有描述性alt文本的高质量图像
- 性能注意事项
- 优化图像大小 - 使用适当的查询限制 - 缓存频繁访问的内容 - 尽可能批量更新 - 监控API使用情况
- 内容管理提示
- 定期内容审核 - 在所有内容中保持一致的品牌 - 移动友好格式 - 定期备份重要内容 - 重大变更的版本控制
错误处理
所有工具都包括全面的错误处理:
- ID错误无效
- 权限错误
- 速率限制错误
- 验证错误
- 网络错误
错误响应包括:
- 错误代码
- 导致错误的字段
- 详细错误消息
- 解决建议
API限制
- 速率限制
- 遵守Shopify的API价格限制 - 使用适当的查询限制 - 对失败的请求实施重试逻辑 - 监控API使用情况
- 内容限制
- 最大内容长度 - 支持的HTML标签 - 图像大小限制 - API版本兼容性
- 认证
- 所需访问范围 - 令牌过期 - IP限制 - 应用程序权限
