Skip to main content
Glama

EasyCRM MCP

An MCP server for one Shopify store and one Horoshop store. Tools are grouped by platform and resource so each action has a clear destination and input contract.

The server runs locally and sends requests directly to each configured platform. Credentials stay in your MCP client configuration on your machine.

Quick start

https://github.com/user-attachments/assets/ab10078a-c557-4f72-b37a-1958c3991029

npx -y easycrm-mcp init

To run the setup wizard directly from a repository checkout, use npm ci and npm run dev -- init.

The wizard lets you configure Shopify, Horoshop, or both. It verifies each connection and registers the server in the client you pick:

  • Claude Code

  • Codex CLI

  • Gemini CLI

  • Claude Desktop

  • Cursor

  • Windsurf

  • VS Code (Copilot)

Pick "Other" to print a config entry for any other MCP client.

Related MCP server: MCP Shopify

Store credentials

Shopify

You need a store on a plan with Admin API access and one of:

Option A: Dev Dashboard app (for stores in your own Shopify organization)

  1. Go to dev.shopify.com/dashboard and create an app for a store in your organization. Shopify limits client credentials to stores in your own organization.

  2. Grant only the scopes needed for the tools you plan to use:

    Resource

    Read

    Write

    Themes

    read_themes

    write_themes

    Shopify Files for theme media

    read_files

    write_files

    Pages

    read_content

    write_content

    Menus

    read_online_store_navigation

    write_online_store_navigation

    Products and variants

    read_products

    write_products

    Inventory

    read_inventory, read_locations

    write_inventory

    Customers

    read_customers

    write_customers

    Orders

    read_orders

    write_orders

    Fulfillment orders

    Matching assigned, merchant-managed, or third-party fulfillment read scope

    Matching fulfillment write scope

    Discounts

    read_discounts

    write_discounts

    Native sales reports

    read_reports

    None

    Shopify customer data also requires protected customer data approval. Orders older than 60 days normally require read_all_orders. Some actions require additional staff permissions or an offline token. The individual tool descriptions state these cases. The native Shopify sales report requires Level 2 protected customer data access, as documented for shopifyqlQuery.

  3. Copy the Client ID and Client Secret from the app's settings.

Option B: existing admin access token

Use an existing shpat_… token from an admin-created custom app. Shopify no longer allows creating new admin-created custom apps.

Editing theme files requires Shopify's write_themes exemption in addition to the API scope. See Shopify's themeFilesUpsert requirements.

Horoshop

Create a dedicated API admin login in the Horoshop admin panel under Settings > Admins. Configure the store's HTTPS origin, login, and password. Horoshop issues an API token valid for 600 seconds; this server renews it automatically. See the official Horoshop API documentation and authentication details.

Manual configuration

If you skip the wizard, add this to your MCP client's config:

{
  "easycrm": {
    "command": "npx",
    "args": ["-y", "easycrm-mcp"],
    "env": {
      "SHOPIFY_STORE_DOMAIN": "your-store.myshopify.com",
      "SHOPIFY_CLIENT_ID": "…",
      "SHOPIFY_CLIENT_SECRET": "…",
      "HOROSHOP_STORE_URL": "https://shop.example.com",
      "HOROSHOP_LOGIN": "your_api_login",
      "HOROSHOP_PASSWORD": "…"
    }
  }
}

You can configure either platform by omitting the other platform's variables. For Shopify, you can use an existing access token instead of client credentials by setting SHOPIFY_ADMIN_ACCESS_TOKEN.

Tools

Shopify

Tool

What it does

shopify_get_info

Read Shopify store name, domain, plan, currency

shopify_theme_list

List Shopify themes

shopify_theme_active

Identify the current live MAIN theme

shopify_theme_import_draft

Import a theme ZIP as unpublished

shopify_theme_duplicate_draft

Copy an existing theme into an unpublished draft

shopify_theme_publish

Publish a theme after confirming the current MAIN theme and user approval

shopify_theme_read_file

Read a Shopify theme file

shopify_theme_update_file

Create or update a theme file, with a live-theme guard

shopify_theme_media_slots

Find image and video picker settings in a theme JSON template, section group, or global settings

shopify_theme_media_upload_local

Upload a local image or MP4 video into Shopify Files

shopify_theme_media_file_status

Check media processing and get its theme reference

shopify_theme_media_set

Fill or replace one selected theme media setting with a ready file

shopify_page_list

List Shopify pages

shopify_page_create

Create a Shopify page

shopify_page_update

Update a Shopify page

shopify_menu_list

List Shopify menus

shopify_menu_update

Replace a Shopify menu

shopify_product_list/get/create/update/delete

Manage core product fields

shopify_product_create_draft_with_images

Create an unpublished product and submit image URLs, optionally setting its first price

shopify_product_image_add

Add images to an existing product

shopify_product_image_add_local

Upload a local image and attach it to an existing product

shopify_product_media_list

Check image processing status and URLs

shopify_product_variant_list/update_price

Read variants and change a price

shopify_inventory_location_list

Find inventory locations

shopify_product_variant_inventory

Read available quantity by location

shopify_inventory_set_available

Set available quantity with a comparison value and idempotency key

shopify_customer_list/get/create/update/delete

Manage customer profiles

shopify_customer_purchase_history

Read a customer's orders and purchased items by customer ID

shopify_order_list/get/create/update/delete/cancel

Manage orders within Shopify's operation rules

shopify_order_line_items

Page through purchased items in one order

shopify_order_fulfillment_orders

Find fulfillable units for an order

shopify_fulfillment_create

Fulfill one entire fulfillment order

shopify_order_summary

Compute a bounded order summary from accessible orders

shopify_sales_report

Read native Shopify Analytics sales metrics by day, month, or total

shopify_discount_code_list/create/create_fixed/update/delete

Manage basic code discounts by percentage or fixed amount

shopify_discount_automatic_list/create/update/delete

Manage basic automatic discounts

Horoshop

Tool

What it does

horoshop_category_list

Read child categories under a parent

horoshop_product_list

Read products, optionally filtered by article (SKU)

horoshop_product_reviews

Read public product reviews and load more batches when available

horoshop_product_create

Create a product in a selected category with optional images

horoshop_product_update

Update an existing product's price, text, visibility, warehouse stock, or images

horoshop_customer_upsert

Create or update one customer by email

horoshop_customer_purchase_history

Find orders and purchased products by delivery email

horoshop_order_list

Read paged orders with optional date and status filters

horoshop_order_statuses

Read configured order status IDs

horoshop_order_update

Set one order's status or payment flag

horoshop_order_summary

Compute bounded counts and totals from orders in a date range

Each tool is tied to one configured platform. Horoshop product creation accepts image URLs for a variant gallery or a shared gallery. Image updates require an explicit append or replace mode; replace removes the existing images in that gallery. Horoshop fetches images from the supplied URLs, with a 5 MB limit for each source image. The product list supports offset and limit for paging, with a maximum of 500 products per request per the Horoshop export API. Horoshop category export requires platform version 4 or later.

horoshop_product_reviews accepts a product URL or path on the configured store. It reads public schema.org/Review markup, including reviews without star ratings. It tries a plain HTTP request first. For a JavaScript challenge or additional review batches, it opens a temporary headless Chrome session and closes it after the read. Chrome must be installed locally; no browser is downloaded with this package. Set HOROSHOP_BROWSER_EXECUTABLE_PATH if Chrome is installed in a nonstandard location. maxReviews defaults to 20 and is capped at 100. totalCount reflects the page's review count, and complete: false means more reviews may exist. The tool does not read private or unpublished reviews.

Before editing theme files, call shopify_theme_active or shopify_theme_list. The update tool checks the observed role again. Editing the live MAIN theme requires explicit user approval and confirmLiveTheme: true; publishing requires approval, confirmPublish: true, and the expected current MAIN theme ID. Draft themes can be edited without changing the live storefront. Shopify requires a theme API exemption for theme mutations.

To change a theme banner image or video, inspect its settings with shopify_theme_media_slots using the relevant template path, for example templates/index.json. The result identifies section, block, and setting IDs, including empty media pickers. Upload a local file with shopify_theme_media_upload_local, wait for shopify_theme_media_file_status to report READY, then call shopify_theme_media_set with the returned file ID and the slot's observed value. The setter checks the theme schema and current value again, and changes only that setting. Images may be PNG, JPEG, WebP, or GIF up to 20 MB. Video upload currently supports MP4 up to 1 GB and streams the local file. The file path is read on the machine running the MCP server. video_url settings for YouTube or Vimeo are separate from Shopify-hosted video pickers and are not handled by this flow. A concurrent Theme Editor save during the final theme file write can still overwrite changes because Shopify does not offer an atomic compare-and-swap for theme JSON files.

Shopify product images can be submitted from public HTTPS URLs or local files. The local-image tool accepts an absolute path on the MCP server machine and uploads one PNG, JPEG, WebP, or GIF up to 20 MB through Shopify staging before attaching it to the product. Shopify processes images asynchronously, so use shopify_product_media_list to check readiness. Creating a draft with an initial price uses a second mutation for the default variant. If that step fails, the tool returns the created product ID and marks the partial result as an error.

Analytics

  • shopify_sales_report reads native Shopify Analytics through ShopifyQL. Select a date range, total/daily/monthly interval, and metrics such as sales, orders, discounts, and average order value. This requires read_reports and Level 2 protected customer data access.

  • shopify_order_summary calculates order counts and current order totals from accessible orders. It reports paginationComplete and a cursor when it stops before the last page.

  • horoshop_order_summary calculates order counts, paid counts, totals by currency, and breakdowns by status and UTM source from the Horoshop orders API. Currency totals are exact decimal strings, for example "0.3". It scans at most 5,000 orders and reports complete: false if more may exist.

The two order summaries are calculated from API orders, not native analytics reports or settled payment revenue. Horoshop total_sum includes discounts and excludes shipping. The server does not currently expose traffic, sessions, or conversion funnel analytics for Horoshop.

Purchase history

Both purchase history tools read store data through the configured API connection. Shopify searches orders by customer ID, newest first, and returns an order cursor for the next page. Each order includes up to 20 line items; when itemsComplete is false, pass nextItemsCursor and the order ID to shopify_order_line_items to read more. Shopify normally limits order access to the most recent 60 days unless the app has read_all_orders.

Horoshop has no documented customer filter for orders/get, so horoshop_customer_purchase_history scans up to maxPages pages of 100 orders, matching delivery_email exactly without regard to letter case. Use from and to to narrow the search. If complete is false, pass nextOffset as offset in another call to continue. An empty result with complete: false does not establish that the customer has no earlier purchases.

The current tools do not cover every action in either admin. In particular, Shopify refunds, partial fulfillment, edits to line items, advanced discount types, and Horoshop customer deletion or order creation/deletion need separate workflows and API verification. Shopify cancellation returns a job ID because processing is asynchronous. See the architecture notes for the extension plan.

Moving from the Shopify-only package

The previously published shopify-store-builder-mcp package remains available. To use this package, replace the npm command with easycrm-mcp, use the new easycrm MCP entry, and update tool names to their shopify_ versions. Horoshop variables can then be added to the same entry.

Development

npm install
npm run dev     # run from source
npm run build   # compile to dist/
npm test
npm audit

License

ISC

Available Tools

9 tools
page_createCreate pageA

Create a new page in the Shopify store. Pages are created as unpublished drafts unless isPublished is true.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoPage content as HTML
titleYesPage title shown in the storefront
handleNoURL slug, e.g. about-us — derived from title if omitted
isPublishedNofalse keeps the page as an unpublished draft

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full disclosure burden. It does state the default unpublished/draft behavior, but this merely repeats the schema's isPublished default and field description. It says nothing about permissions, return values, side effects, or failure modes, which is a significant gap for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the primary purpose, and every clause contributes meaningful information. There is no redundant filler or over-explanation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple create tool with four parameters and no output schema or annotations, the description covers purpose and default publication state. However, it omits what the tool returns (e.g., created page object or ID) and any post-creation behavior, leaving some context incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds no extra meaning beyond the schema's parameter descriptions, merely referencing isPublished without elaborating on the other parameters or adding format details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Create') and resource ('a new page in the Shopify store'), clearly distinguishing creation from sibling tools like page_update or page_list. It also immediately signals the key scope (new page) without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes it clear this is for creating a new page, providing context that it is the create counterpart to page_update. It does not explicitly name alternatives or exclusions, but the sibling list and 'new page' wording imply when to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

page_listList pagesA
Read-only

List the store's pages with their GIDs, handles, and publish status. Use the id from here for page_update.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so read-only behavior is established. The description adds that it returns GIDs, handles, and publish status, and that the id is intended for subsequent updates, providing useful context beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that immediately states the action, the key output fields, and cross-references page_update. No redundant wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list tool, this description is sufficient: it specifies the output fields and the downstream use case. It is complete given the tool's simplicity and the available annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is empty with 0 parameters, so baseline is 4. The description doesn't need to add parameter details; it clarifies the output contents instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool lists the store's pages and specifies exact fields (GIDs, handles, publish status). It differentiates from sibling list tools like menu_list by focusing on pages, and the verb 'List' with resource 'pages' is specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a concrete usage context: use the returned id for page_update. It doesn't explicitly mention when not to use it or alternatives, but the purpose is clear enough to distinguish from sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

page_updateUpdate pageA
Destructive

Update an existing page's title, body, handle, or publish status. Only provided fields change. Get the page GID from page_list.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPage GID from page_list
bodyNoNew page content as HTML
titleNoNew page title
handleNoNew URL slug
isPublishedNotrue publishes the page, false unpublishes it — omit to leave unchanged

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation only says `destructiveHint: true`, which is generic. The description adds key behavioral transparency with 'Only provided fields change', clarifying partial update semantics. It does not describe side effects like broken links or unpublishing consequences, but this is a meaningful addition beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences, each earning its place: purpose, partial-update behavior, and a critical prerequisite. There is zero fluff and information is front-loaded, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an update tool with 5 parameters and no output schema, the description covers the essential context: what the tool does, how to obtain the required ID, and the key behavioral nuance. It does not explain return values, but none are defined, and the description is adequate for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (all 5 parameters have descriptions in the schema). The description adds the useful global note that only provided fields change, which clarifies how omitting optional parameters behaves. This is a marginal addition beyond the schema, so a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action ('Update an existing page') and specifies the exact fields that can be modified (title, body, handle, publish status). It distinguishes from the create sibling by emphasizing 'existing page', but does not explicitly name alternative tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a prerequisite ('Get the page GID from page_list'), which implies the required context for usage. However, it does not explicitly discuss when to choose this tool over alternatives like page_create or menu_update, so usage guidance is implied rather than fully stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

shop_get_infoGet shop infoA
Read-only

Get basic info about the connected Shopify store: name, domain, currency, plan.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation covers the safety profile. The description adds value by listing the exact output fields (name, domain, currency, plan), giving the agent a concrete expectation of the return value. This is useful behavioral context beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, concise and front-loaded, with no wasted words. It states the action and the key output fields in a compact format.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool, the description is complete. It explains what information will be returned, and no output schema exists to shift the burden. The sibling context further clarifies its unique purpose within the toolset.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool accepts no parameters, so the description has no parameter burden to carry. The baseline score of 4 applies because no additional parameter documentation is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') with a clear resource ('basic info about the connected Shopify store') and enumerates the exact fields (name, domain, currency, plan). This distinguishes it from sibling tools that target pages, menus, or themes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: whenever shop-level basic info is needed. It does not explicitly mention alternatives, but the sibling tool names make the context unambiguous. Clear context without explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

theme_listList themesA
Read-only

List the store's themes with their GIDs and roles. Role MAIN is the published live theme. Use the id from here for theme_read_file and theme_update_file.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation readOnlyHint=true already signals a safe read operation, and the description adds value by disclosing the output content (GIDs and roles) and the special meaning of role MAIN. It does not mention pagination or limits, but for a simple list tool with no parameters this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two concise sentences that are front-loaded with the primary action. Every sentence earns its place: the first defines the tool, the second explains the significance of role MAIN and cross-references sibling tools.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description clearly states what the tool returns (GIDs, roles) and provides the domain knowledge that MAIN is the live theme. It also links to downstream usage, making the tool's purpose and integration context fully understandable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so there is nothing to explain. The baseline for 0 params is 4, and the description does not need to add parameter details. It focuses on the output, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'list' with a clear resource ('the store's themes') and specifies what is included (GIDs, roles). It distinguishes itself from sibling tools like page_list and menu_list by scoping to themes, and even names the dependent tools theme_read_file and theme_update_file.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use this tool: to obtain theme IDs for use with theme_read_file and theme_update_file. It also provides practical context about the role MAIN being the published live theme, which helps the agent understand which theme to select.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

theme_read_fileRead theme fileA
Read-only

Read the content of one file in a Shopify theme. Get the theme ID from theme_list first.

ParametersJSON Schema
NameRequiredDescriptionDefault
themeIdYesTheme GID, e.g. gid://shopify/OnlineStoreTheme/123456789
filePathYesPath inside the theme, e.g. sections/header.liquid or templates/index.json

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already signals a safe read operation, and the description's 'read' is consistent. The description adds a small amount of context (single file, prerequisite) but does not disclose error behavior or permission requirements; given the annotation, this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, one for purpose and one for prerequisite, with no redundant words. The key information is front-loaded and every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with a well-documented schema and a clear prerequisite. The description gives sufficient context for an agent to select and invoke the tool, though it does not explicitly describe the return format or error cases, which are minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully documents both parameters with types and examples, and the description adds a cross-reference to theme_list for the themeId source. This extra guidance enhances parameter understanding beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool reads the content of one file in a Shopify theme, using a specific verb ('read') and resource ('file in a Shopify theme'). It distinctively scopes to a single file and contrasts with the sibling theme_update_file by focusing on reading.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It instructs the agent to obtain the theme ID from theme_list first, providing an explicit prerequisite. While it does not explicitly mention alternatives like theme_update_file, the prerequisite and read-focused language make the usage context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

theme_update_fileUpdate theme fileA
Destructive

Overwrite one file in a Shopify theme with new content. Get the theme ID from theme_list first.

ParametersJSON Schema
NameRequiredDescriptionDefault
themeIdYesTheme GID, e.g. gid://shopify/OnlineStoreTheme/123456789
filePathYesPath inside the theme, e.g. sections/header.liquid or templates/index.json
fileContentYesFull new file content — replaces the file entirely

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation destructiveHint=true already discloses the destructive nature of the operation. The description's 'Overwrite' confirms this but adds no additional behavioral context (e.g., permissions, reversibility, failure modes). The theme_list prerequisite is a usage note, not a behavioral disclosure. With annotations covering safety profile, this is an appropriate score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the primary action, followed by a necessary prerequisite. Every word earns its place; there is no fluff or redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple file overwrite tool, the description combined with annotations (destructiveHint) and full schema coverage provides sufficient context. The workflow dependency on theme_list is explicitly stated, and no output schema is needed for a write operation. The tool is adequately specified for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for all three parameters, so the baseline is 3. The description adds minimal parameter semantics; the only hint is to get themeId from theme_list, which is already implied by the GID format in the schema. No extra meaning is added for filePath or fileContent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it overwrites one file in a Shopify theme, specifying the verb 'Overwrite' and the resource 'theme file'. It distinguishes itself from sibling tools like theme_read_file (read operation) and page_update (different resource type). The title and description are consistent and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides a prerequisite: 'Get the theme ID from theme_list first.' This tells the agent when to use this tool relative to theme_list, establishing a clear workflow. While it doesn't explicitly name alternatives, the sibling context and the specific action make the usage context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.1.1
    • First observedmenu_list
    • First observedmenu_update
    • First observedpage_create
    • First observedpage_list
    • First observedpage_update
    • First observedshop_get_info
    • First observedtheme_list
    • First observedtheme_read_file
    • First observedtheme_update_file

TDQS

A4.3/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a distinct resource and action: pages, menus, themes, and shop info. The relationships between list/get and update/create tools are clearly documented, leaving no ambiguity about which tool to use for a given task.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using lowercase and underscores (page_list, menu_update, theme_read_file). The pattern is uniform across all nine tools, making them predictable and easy to navigate.

Tool Count5/5

With 9 tools, the server is well-scoped for managing pages, menus, themes, and shop info. This is a reasonable number that covers the core store-building functionality without unnecessary bloat or sparse coverage.

Completeness4/5

The toolset covers the main lifecycle for pages (list, create, update) and themes (list, read, update), plus menu replacement and shop info. Minor gaps exist (e.g., no delete operations for pages or menus, no theme creation), but the core workflows for customizing a storefront are covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    A comprehensive MCP server for Shopify Admin API integration, enabling AI assistants to manage products, orders, customers, inventory, analytics, and more through natural language.
    15 npm
    18
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Production-grade MCP server for the Shopify Admin GraphQL API, exposing typed tools for AI agents to manage products, orders, customers, and more.
    28 npm
    MIT
  • A
    license
    C
    quality
    D
    maintenance
    MCP server for Shopify Admin API. Enables product, order, customer, and inventory management via natural language.
    14
    3 npm
    1
    MIT