Connect AI Tools to Pack with MCP

Pack's Model Context Protocol (MCP) server lets compatible AI tools read and manage content in your Pack storefront. OAuth is the recommended way to connect: you sign in to Pack in your browser, choose the storefront the client can access, and approve the connection without copying a Pack access token into the client.

Use this MCP server URL for production connections:

https://pack-agent.packdigital.workers.dev/mcp

Connect with OAuth

You need a Pack account with access to at least one storefront and an MCP client that supports OAuth for remote MCP servers.

  1. Add https://pack-agent.packdigital.workers.dev/mcp as a remote MCP server in your client.
  2. Choose Connect or start authentication. Your client opens Pack in your browser.
  3. Sign in to Pack if prompted.
  4. Review the client name, callback URL, and requested pack:mcp scope.
  5. Select the organization and storefront the client should access.
  6. Choose Allow access. Pack returns you to the MCP client to finish the connection.

The authorization applies only to the storefront you select. To connect another storefront, add a separate MCP connection and complete the flow again.

Claude Code

Add the Pack MCP server without custom authentication headers:

claude mcp add --transport http pack https://pack-agent.packdigital.workers.dev/mcp

Claude opens the browser authorization flow when the connection authenticates. Check the connection afterward:

claude mcp list

Claude Desktop

In Claude Desktop, add a custom connector and enter this URL:

https://pack-agent.packdigital.workers.dev/mcp

Choose Connect, complete the Pack authorization flow in your browser, and return to Claude Desktop. OAuth connections do not require Node.js, npx, custom request headers, or manual changes to the Claude Desktop configuration file.

Example prompts

These prompts are based on tasks Pack users already do with Pack MCP. Replace the page names, links, and copy with your own.

Edits are saved as drafts. To get the most out of a session:

  • Name the page by its title or URL path, such as "the homepage" or "/pages/about-us", and name the section by its title.
  • Ask for a draft, review it in the Customizer, then ask the client to publish it.
  • Put related changes in a content release so they go live together.
  • For audits, ask for a list first, then ask for the changes.

Edit page content

  • "On the homepage, change the hero heading to 'Fall Collection' and the button text to 'Shop now'. Save it as a draft."
  • "Publish the hero change on the homepage."
  • "Copy the Products Slider from the homepage onto the About Us page, right after the first section. Save it as a draft."
  • "Add a copy of the homepage Half Hero section to the bottom of the Trail Jacket product page and publish it."

Find and fix content

  • "Find every section that links to /collections/all and change those links to /collections/new-arrivals. Save drafts and list what you changed."
  • "Which pages use the Products Slider section? We're about to remove it from our theme."
  • "Set the Terms page to noindex, and show me before you publish."
  • "Change the author of the 'Summer Recipes' article to 'Editorial Team', and show me before you publish."

Site settings and releases

  • "In site settings, change the free shipping threshold to $75. Show me the draft before you publish."
  • "Create a release called 'Holiday cart updates'. In it, change the cart upsell message to 'Holiday picks'. Show me what's in the release, and publish it when I say so."

Review and document

  • "List every section on the homepage and the fields an editor can change in each, so I can share it with our content team."
  • "What changed on the Terms page recently? Show me the differences from the previous version."
  • "Which A/B tests are running, and which goals does each one track?"

Access and permissions

Each OAuth connection:

  • is limited to the Pack user and storefront approved during authorization;
  • uses the single pack:mcp scope;
  • gives the MCP client a short-lived access token and a refresh token instead of a Pack access token; and
  • stops working if the authorization is disconnected or the user loses access to the storefront.

The Pack actor token remains encrypted in the Pack MCP service and is never sent to the MCP client.

OAuth and legacy connections expose the same tools, listed below. The tools returned by your client's MCP tool list are the source of truth for the current connection.

Pack MCP is stateless and does not add its own confirmation step before a tool runs. Your MCP client is responsible for asking for confirmation before destructive or customer-visible changes.

Available tools

AreaTools
Content (any type)pack_content_get, pack_content_list, pack_content_search, pack_content_publish, pack_content_unpublish, pack_content_delete, pack_content_restore, pack_content_history, pack_content_revision_get, pack_content_revision_diff, pack_content_translate, pack_content_add_sections
Bulk actionspack_content_publish_bulk, pack_content_unpublish_bulk, pack_content_delete_bulk, pack_content_add_sections_bulk
Pagespack_page_create, pack_page_update; pack_content_* with contentType: "page"
Product pagespack_product_create, pack_product_update; pack_content_* with contentType: "product"
Collection pagespack_collection_create, pack_collection_update, pack_collection_test_variant_get, pack_collection_test_variant_create, pack_collection_test_variant_update, pack_collection_test_variant_delete; pack_content_* with contentType: "collection"
Articlespack_article_create, pack_article_update, pack_article_test_variant_get, pack_article_test_variant_create, pack_article_test_variant_update, pack_article_test_variant_delete; pack_content_* with contentType: "article"
Blogspack_blog_create, pack_blog_update, pack_blog_test_variant_get, pack_blog_test_variant_create, pack_blog_test_variant_update, pack_blog_test_variant_delete; pack_content_* with contentType: "blog"
Templatespack_template_create, pack_template_update, pack_template_references; pack_content_* with contentType: "template"
Sectionspack_section_get, pack_section_list, pack_section_batch_get, pack_section_create, pack_section_patch, pack_section_publish, pack_section_unpublish, pack_section_references
Site settingspack_site_settings_get, pack_site_settings_patch, pack_site_settings_publish
Content releasespack_release_list, pack_release_get, pack_release_create, pack_release_update, pack_release_schedule, pack_release_clear_schedule, pack_release_publish, pack_release_archive, pack_release_rebase_draft, pack_release_move_page_changes
Schedulespack_schedule_list, pack_schedule_list_by_content, pack_schedule_get, pack_schedule_create, pack_schedule_update, pack_schedule_add_content, pack_schedule_execute, pack_schedule_clear, pack_schedule_delete
A/B testspack_test_list, pack_test_get, pack_test_current, pack_test_match_rules, pack_test_match_rules_list, pack_test_upsert, pack_test_start, pack_test_schedule, pack_test_clear_schedule, pack_test_pause, pack_test_end, pack_test_delete
Test variantspack_test_variant_list, pack_test_variant_list_by_test, pack_test_variant_get, pack_test_variant_get_by_handle, pack_test_variant_is_running, pack_test_variant_upsert, pack_test_variant_delete
Test goalspack_test_goal_list, pack_test_goal_upsert, pack_test_goal_delete, pack_test_goal_reorder, pack_test_goal_metric
Test variant contentpack_test_variant_overrides, pack_test_variant_override_get, pack_test_variant_override_upsert, pack_test_variant_override_delete
Content environmentspack_content_environment_list, pack_content_environment_get, pack_content_environment_get_by_handle, pack_content_environment_primary_get, pack_content_environment_create, pack_content_environment_update, pack_content_environment_copy, pack_content_environment_set_primary, pack_content_environment_delete
Localespack_locale_list, pack_locale_get, pack_locale_create, pack_locale_update, pack_locale_set_primary, pack_locale_delete
Preview URLspack_preview_url_list, pack_preview_url_create, pack_preview_url_update, pack_preview_url_delete
Shopify catalogpack_catalog_product_list, pack_catalog_product_get, pack_catalog_product_get_by_handle, pack_catalog_product_search, pack_catalog_sync_start, pack_catalog_sync_cancel, pack_shopify_sync_status
Media and storefrontspack_media_manager, pack_storefront_list

The pack_content_* tools take a contentType to choose which kind of content they act on. Each tool's description lists the types it supports.

For small edits to a section, call pack_section_get, copy its revisionId, and send only the changed JSON Pointer paths to pack_section_patch. pack_site_settings_patch works the same way for site settings. Pack rejects a stale revision ID instead of overwriting a newer edit. pack_section_patch can change a section's data, styles, dataSource, and title. Use pack_section_create to create a new section.

Content environments

If the connection does not specify a content environment, Pack uses the selected storefront's primary environment for both reads and writes.

Clients that support custom headers can pin the connection to another environment by sending the environment handle in this header:

x-pack-content-environment-id: <CONTENT_ENVIRONMENT_HANDLE>

For example, Claude Code can create an OAuth connection pinned to a non-primary environment:

claude mcp add --transport http pack-preview \
  https://pack-agent.packdigital.workers.dev/mcp \
  --header "x-pack-content-environment-id: hydrogen-preview"

To work across several environments, either add a separate named connection for each one, or keep one connection and pass context.environment on the calls that need a different environment. Clients that cannot add a custom header can still reach other environments through context.

Every tool also accepts an optional context argument that applies to that call only. It can select a different environment (the environment handle), a locale (such as fr-CA), or a test (handle, variantHandle, and ignoreStatus to preview a draft or paused test). The storefront always comes from the connection.

Content releases

To stage changes in a content release instead of editing live content:

  1. Create a release with pack_release_create, or find one with pack_release_list.
  2. Pass the release ID as releaseId to the tools that read or change content, such as pack_content_get, the pack_*_create and pack_*_update tools, pack_section_get, pack_section_create, pack_section_patch, pack_site_settings_get, and pack_site_settings_patch.
  3. Before publishing or scheduling, call pack_release_get to review the drafts and conflicts. Set includeConflictChanges to true to see field-level differences.
  4. Publish with pack_release_publish, or schedule it with pack_release_schedule.

pack_section_list and pack_section_batch_get always read live content. Use pack_section_get with releaseId to read a section from a release.

Clients that support custom headers can instead pin a connection to one release:

x-pack-release-id: <RELEASE_ID>

In both cases Pack sends the release ID to the Content Management API as the X-Pack-Release-Id header. The release-management tools themselves (pack_release_*) always act outside any release.

Manage connected apps

To review or remove MCP access:

  1. In Pack, open User settings.
  2. Find Connected apps.
  3. Review the client, organization, storefront, connection date, and scope.
  4. Choose Disconnect next to an app and confirm.

Disconnecting an app takes effect immediately. Remove the connection from the MCP client as well if you no longer plan to use it.

To switch a connection to another storefront, disconnect it and authorize a new connection for the correct storefront.

Legacy authentication

Existing integrations that send Pack credentials in request headers remain supported during the OAuth migration. Use OAuth for new desktop and remote connections.

Legacy clients must send:

Authorization: Bearer <PACK_ACCESS_TOKEN>
x-pack-store-id: <PACK_STORE_ID>
x-pack-content-environment-id: <CONTENT_ENVIRONMENT_HANDLE>

x-pack-content-environment-id is optional. If it is omitted, Pack uses the storefront's primary content environment. The access token determines the storefront it can access; x-pack-store-id cannot be used to select a different storefront.

Troubleshooting

The browser authorization flow does not open

Confirm that the client supports OAuth for remote MCP servers, dynamic client registration, and S256 PKCE. Remove the incomplete connection, add the production MCP URL again, and restart authentication.

No storefronts are available to select

The signed-in Pack user does not have access to a storefront that can be connected. Ask an organization administrator to grant access, then restart the authorization flow.

The connection uses the wrong storefront

Open User settings in Pack, disconnect the app under Connected apps, and authorize a new connection. Select the intended organization and storefront in the consent screen.

The connection uses the wrong content environment

Connections without an environment header use the storefront's primary environment. If your client supports custom headers, create a separate connection with x-pack-content-environment-id set to the intended environment handle.

Authentication expires or is revoked

OAuth-compatible clients refresh access automatically. If the connection continues to request authentication, remove it from the client and connect again. If the app was disconnected in Pack or the user lost storefront access, a new authorization is required.

Was this page helpful?