Skip to main content
Meridian MCP connects the AI coding client you already work in (Cursor, Claude Code, or Claude Desktop) to your Meridian organizations and apps. Instead of guessing, the agent reads your app’s real Plan Builder catalog, deploy plane, runtime logs, secret metadata, Shopify API alerts, Grow config (emails, automations, segments, discounts), and developer databases before it writes a line of code. So the agent reads your actual feature and event keys before writing isEnabled() / track() calls, reads the real error off a failed deployment before proposing a fix, and can trigger a deploy or roll one back without you leaving the editor. Meridian MCP never grants access you don’t already have in the dashboard. Every tool call resolves the signed-in user and runs the same permission checks the web app runs, on the same catalog: a tool that mirrors a dashboard action needs the permission that action needs, and a role’s app scope applies to every app-scoped tool. This server accesses the production Meridian platform only, including the staging and development environments of its apps. Apps created on the separate Meridian staging platform are not available through this server. See Environments.

Connect an AI client

There is no API key and no token to paste anywhere. The dashboard hands out a URL; your client obtains its own credentials over OAuth, and you approve the connection once in a browser.
  1. Add the server URL to your MCP client (see below).
  2. The client discovers Meridian’s OAuth endpoints and registers itself. Nothing has to be pre-created in the dashboard.
  3. The client opens Meridian’s consent screen in a browser, which names the client and what it’s asking for. Sign in if you aren’t already.
  4. On Approve, the client exchanges the authorization code for its tokens. On Deny, nothing is granted.
  5. The client appears under Connected AI clients on the Meridian MCP page, with when it connected and when it was last used.
Every client reads the same config:

Revoke a client

Connected AI clients lists every client you’ve approved. Revoking one invalidates its access token and refresh token immediately. The client stops working and has to connect and be approved again. Revoked entries stay in the list, marked as revoked, rather than disappearing. Connections are per developer, not per organization.

How tools are scoped

The server keeps no state between calls. There’s no “current app” or “current organization”, so every app-scoped tool takes explicit identifiers: The opening move for an agent is whoami, then apps_list. The identifiers every other tool needs come from those two calls. Output always uses the same public identifiers the platform API exposes; internal numeric ids never appear.

Tool catalog

Forty-nine tools. Each is annotated so a well-behaved client knows what it can run unattended: read-only (no side effects), idempotent (safe to repeat), destructive (needs confirmation), or write (creates or updates Meridian config, draft-only for emails and automations). The catalog leans towards facts your repository can’t tell you: the variables injected into the deployed runtime, the live database schema, where webhooks are routed, and the Grow config an agent needs when wiring lifecycle flows.

Orientation

Plan Builder

The highest-value surface: what an agent reads before writing SDK integration code.

Deploy

Call managed_variables_list before writing any code that reads process.env. Those variables are in neither the repository nor secrets_list, so an agent reading only your config concludes they’re unset. Use github_refs_list to feed deployment_create a real git_sha: a sha that hasn’t been pushed fails late during the build.

Webhooks

Together these separate the two failures that look identical from inside your code: no delivery row means Shopify never sent it (check the route); a 4xx/5xx response_code means it arrived and your handler rejected it. Neither tool returns the webhook body or headers. In webhook_routes_list, each route’s registration counts the stores where Shopify accepted the subscription (registered_shops) and where it did not (failed_shops, with last_error). A store Meridian could not reach at all, because its token was revoked or can’t be renewed, or Shopify refused the request, counts as failed on every topic it hasn’t registered, and its last_error starts with Could not reach followed by the store. A store that uninstalled your app drops out of these counts the next time you save the topic set. forward_host is the origin Meridian really posts to, and forward_host_source says which destination won: external (the verified external domain you selected as the forward host), environment (your app’s Meridian deployment), or platform. A platform source is Meridian’s own receiver, the last resort when an app has neither: forwarded events stop there and never reach your app, and forward_url then gives the single URL they go to. Both are null when nothing is routed at all. reconcile_available says whether Meridian can reach the stores that already installed your app, which it can only do when the app is deployed on Meridian. When it is false, Meridian can’t register topics on those stores itself: the SDK registers your topic set on each store when that store authenticates your app (see Re-registering webhooks). Managed topics are in that set from install on. A route you added reaches a store only at that store’s first sign-in after you added it, so each such route carries sign_in: installed_shops, and awaiting_shops, the installed stores that haven’t signed in since. A sign-in within five minutes of adding the route still counts as awaiting, because the SDK can serve the topic set it cached before. sign_in is null on managed topics, and on every route when reconcile_available is true.

Shopify API alerts

Both need the Shopify API alerts: View permission on the app.

Databases

Developer database tools only ever reach the caller’s own database, never a teammate’s, even for an organization owner. Read database_schema_get before writing a migration or query against a deployed environment: the live schema is whatever the last applied migration produced, and your repository may not agree with it.

CRM

Emails

Edit the body and activate in the dashboard. MCP never live-sends.

Automations

Discounts

Discounts are read-only through MCP: no create or reprice.

Resources and prompts

Two resources give the agent retrievable context: meridian://docs/{path} (Meridian’s public product documentation, the same pages at help.the-meridian.ai; empty path returns an index of .md/.mdx paths). Prefer docs_search mid-task and meridian://apps/{app}/config (an app’s whole configuration as one JSON document). Two prompts arrive pre-filled with live data:
  • integrate_sdk: a guided walkthrough for wiring @the-meridian/sdk into a Shopify embedded app, pre-filled with that app’s real feature and event keys, types, and per-plan values. Optional surface narrows it to provider, pricing, usage, or server.
  • debug_failed_deploy: a guided investigation of a failed deployment, pre-filled with its real status, error, and recent build events, followed by an ordered set of follow-up calls.

What Meridian MCP never returns

No tool ever returns a secret value, not for a secret and not for a plain environment variable. An agent can confirm a variable exists and is spelled correctly, which is what almost every “missing env var” investigation actually needs.
  • secrets_list and managed_variables_list return metadata only, never values and never the Secret Manager reference.
  • dev_database_get returns no password, connection string, or proxy token. Connect with the Meridian CLI (meridian dev).
  • emails_list / email_get return metadata only, never HTML or design.
  • webhook_deliveries_list returns no body and no request headers.
  • Internal identifiers and internal-team-only flags never appear.
Some things are intentionally absent, because doing them through an agent is a worse idea than doing them in the dashboard: reading rows from your databases, writing secrets, pricing changes (including creating or repricing discounts), live email sends, activating automations, and account administration (billing, team, roles, auth settings). Store membership exports and report runs stay dashboard-only; CRM definitions (custom fields, segments) and Grow config are the exception.

Mutations

Eleven tools write; the other thirty-eight only read. Ten of them change something, and every successful change is recorded in the organization’s activity log with the tool that made it. The eleventh, automation_test_run, is a dry trace that changes nothing and leaves no entry.
  • events_create adds one metered-usage event to the catalog. It does not touch per-plan terms.
  • deployment_create is idempotent on (environment_id, git_sha): repeating it while that deployment is in flight returns the same one. A different sha while a deployment is active is refused: one active deployment per environment. V1 targets production only.
  • deployment_rollback shifts live traffic (annotated destructive). Refused if the target didn’t succeed or the environment has another deployment in progress.
  • dev_database_migrate records a run; it does not execute one. meridian migrate runs the migration locally and records it automatically.
  • dev_database_reset destroys every table and row in your developer database schema. Requires confirm: true.
  • custom_field_values_set writes custom field values on a store and fires the automation trigger a dashboard edit would.
  • email_create writes an inactive metadata draft. email_update changes an email’s metadata and, as a dashboard save does, the snapshot that every automation sending the email sends from. Neither activates, edits the body, or sends.
  • automation_create / automation_update write inactive drafts; graph updates only while inactive; no emailHtml.
  • automation_test_run is a dry trace: no mail, no metering, no persisted run.

Plan requirements

Meridian MCP is gated on the mcp plan feature, and the deploy-related tools additionally on the deploy feature. Every tier (Lite, Pro, and Enterprise) includes both, so no plan change is needed. Lite meters MCP calls (1,000 requests a month); Pro and Enterprise don’t meter them.

Versioning

The server reports its version on connect and follows semver. New tools, new resources, and new optional fields on an existing tool’s output bump the minor version. A breaking change to an existing tool’s contract, meaning a removed or renamed field or changed semantics, bumps the major version.

Troubleshooting

Last modified on October 7, 2026