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
Pack MCP tools can change customer-visible content, including publishing and unpublishing it. Review the proposed changes and confirm the target storefront and content environment before allowing an AI client to perform a write.
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.
- Add
https://pack-agent.packdigital.workers.dev/mcpas a remote MCP server in your client. - Choose Connect or start authentication. Your client opens Pack in your browser.
- Sign in to Pack if prompted.
- Review the client name, callback URL, and requested
pack:mcpscope. - Select the organization and storefront the client should access.
- 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:mcpscope; - 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
| Area | Tools |
|---|---|
| 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 actions | pack_content_publish_bulk, pack_content_unpublish_bulk, pack_content_delete_bulk, pack_content_add_sections_bulk |
| Pages | pack_page_create, pack_page_update; pack_content_* with contentType: "page" |
| Product pages | pack_product_create, pack_product_update; pack_content_* with contentType: "product" |
| Collection pages | pack_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" |
| Articles | pack_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" |
| Blogs | pack_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" |
| Templates | pack_template_create, pack_template_update, pack_template_references; pack_content_* with contentType: "template" |
| Sections | pack_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 settings | pack_site_settings_get, pack_site_settings_patch, pack_site_settings_publish |
| Content releases | pack_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 |
| Schedules | pack_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 tests | pack_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 variants | pack_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 goals | pack_test_goal_list, pack_test_goal_upsert, pack_test_goal_delete, pack_test_goal_reorder, pack_test_goal_metric |
| Test variant content | pack_test_variant_overrides, pack_test_variant_override_get, pack_test_variant_override_upsert, pack_test_variant_override_delete |
| Content environments | pack_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 |
| Locales | pack_locale_list, pack_locale_get, pack_locale_create, pack_locale_update, pack_locale_set_primary, pack_locale_delete |
| Preview URLs | pack_preview_url_list, pack_preview_url_create, pack_preview_url_update, pack_preview_url_delete |
| Shopify catalog | pack_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 storefronts | pack_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:
- Create a release with
pack_release_create, or find one withpack_release_list. - Pass the release ID as
releaseIdto the tools that read or change content, such aspack_content_get, thepack_*_createandpack_*_updatetools,pack_section_get,pack_section_create,pack_section_patch,pack_site_settings_get, andpack_site_settings_patch. - Before publishing or scheduling, call
pack_release_getto review the drafts and conflicts. SetincludeConflictChangestotrueto see field-level differences. - Publish with
pack_release_publish, or schedule it withpack_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:
- In Pack, open User settings.
- Find Connected apps.
- Review the client, organization, storefront, connection date, and scope.
- 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.
Treat a Pack access token as a secret. Do not commit it, paste it into shared documentation, or place it directly in a client configuration when the OAuth flow is available.
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.