# Sanity MCP connector

The Sanity connector lets Claude, ChatGPT, Cursor and the Elaichi Agent query, create, patch and publish Sanity documents, upload assets and deploy schemas, with each person signed in as themselves and every change recorded in an audit log.

Source: https://elaichi.ai/connectors/sanity/

## Facts

| | |
| --- | --- |
| Application | Sanity |
| Category | Application Development |
| AI tools | 53 |
| Authentication | Connects over OAuth |
| Bring your own OAuth app | No |
| Native MCP | Yes. Sanity builds and runs this MCP server. Elaichi adds sign-in, access controls and an audit log on top |
| Support for its tools | www.sanity.io/help |
| MCP endpoint | https://api.elaichi.ai/mcp |
| Works with | Claude, ChatGPT, Cursor, any MCP client, and the Elaichi Agent |
| Tools advertised by name | No. Connected tools are never listed one by one, however few there are. The endpoint advertises `search_tools` and `execute_tool` instead |

## What you can ask once Sanity is connected

- Which Sanity documents are still in draft this week?
- Publish the spring campaign landing page documents.
- Upload the new hero images from these URLs to the media library.

## Connect Sanity in Elaichi

This happens once for the organization, before any client is involved.

1. Open Connections, choose Add connection, and pick Sanity.
2. Optionally set Share with, then press Connect.
3. Approve it in Sanity. Sanity's own window opens. Whoever approves it decides what this connection can reach.

Credentials are vaulted and nobody, including the AI, reads them back. The connection becomes a toolbox immediately, so you can curate which Sanity tools are exposed, rename them, or freeze arguments before anyone points a client at it.

## Sanity MCP connector for Claude

Endpoint: https://api.elaichi.ai/mcp

1. Open Customize, then Connectors.
2. Press Add.
3. Name it, paste the MCP server URL, then Continue.
4. Sign in and approve.

On Team and Enterprise, an Owner adds it once. Everyone else turns it on for themselves.

## Sanity MCP connector for ChatGPT

Endpoint: https://api.elaichi.ai/mcp

1. Open Plugins, then press the + button.
2. Name it and paste the endpoint into Server URL.
3. Leave Authentication on OAuth, then tick the risk acknowledgement.
4. Press Create, then sign in and approve.

Works on the web today. The plugin directory lives at chatgpt.com/plugins.

## Sanity MCP connector for Cursor

Endpoint: https://api.elaichi.ai/mcp

1. Open `~/.cursor/mcp.json`.
2. Add the endpoint under `mcpServers`.
3. Reload Cursor, then sign in and approve.

Set up per machine, so repeat it on each computer you work from.

## Connect Sanity to any MCP client

Endpoint: https://api.elaichi.ai/mcp

1. Add the endpoint as a remote MCP server.
2. Sign in and approve.

The Elaichi Agent already has these tools, with nothing to set up.

## What the consent screen decides

Only Read is granted by default, which is not enough to call a Sanity tool. Over MCP there is no trusted place to confirm a write in the moment, so the consent screen is the standing approval rather than a formality. Grant Read and Run tools. Think hard before granting Delete, which reaches into connected apps and cannot be undone.

## What teams do with Sanity through Elaichi

### Catch a draft up after an edit meeting

Content. Ask for the documents still in draft, patch the fields that changed in the meeting, and publish the ones that are ready in a single pass.

### Stand up a campaign page from a brief

Marketing. Create the landing page documents from a campaign brief, pull the hero images in from URLs, and keep them unpublished until launch day.

### Review and deploy a schema change

Engineering. List the workspace schemas, compare a proposed change against what is live, and deploy the schema and the studio once it is approved.

### Get images into the media library fast

Design. Upload a batch of assets from a shared folder or URL, check that each upload finished, and transform or generate variants for the pages that need them.

### Publish release notes on release day

Product. Draft the release notes document from the ticket summary, create a version for review, and publish it the moment the build ships.

### Find what still needs a translation

Localization. Query the documents published in one language that have no matching version in another, then create the translated drafts for the team to review.

## Elaichi vs Zapier MCP vs Composio for Sanity

All three can connect Sanity to an AI assistant, and all three have admin controls. They differ in where access lives and how you pay.

| What to check | Elaichi | Zapier MCP | Composio |
| --- | --- | --- | --- |
| Where the AI connects | One address for the whole organization. Endpoint: https://api.elaichi.ai/mcp | A server per member, created at sign-in. | An MCP endpoint per team, or an SDK. |
| Control over Sanity tools | Allow or restrict single Sanity tools, per role or user. | App and action restrictions on the account. | Role permissions, down to the action. |
| Record of calls | One audit entry per Sanity call. | A History tab of tool calls. | A log of every tool call. |
| Single sign-on | SAML or OIDC, plus SCIM, on Gold. | SAML on Enterprise. | SAML and OIDC on Enterprise. |
| Price | $15 per user per month. | 2 tasks per successful call. | Billed per tool call. |

Sources: Zapier MCP [docs](https://docs.zapier.com/mcp/get-started/quickstart), [security](https://docs.zapier.com/mcp/manage/security), [usage](https://docs.zapier.com/mcp/features/usage); Composio [docs](https://docs.composio.dev/docs/composio-connect), [gateway](https://composio.dev/mcp-gateway), [enterprise](https://composio.dev/enterprise), [pricing](https://composio.dev/pricing). Checked September 2026.

Longer take: [Zapier MCP alternative](/blog/zapier-mcp-alternative/) and [when you don't need an MCP gateway](/blog/when-you-dont-need-an-mcp-gateway/).

## Frequently asked questions

### How do I connect Sanity to Claude?

Connect Sanity in Elaichi first, which sends you to Sanity's own sign-in over OAuth; there is no OAuth application to register and no client ID or secret to generate. Then in Claude open Customize, then Connectors, then Add, and paste https://api.elaichi.ai/mcp. Once Claude signs in to Elaichi, your Sanity documents, assets and schemas are available in the conversation.

### Does Sanity work with ChatGPT and Cursor as well as Claude?

Yes. Sanity is connected once in Elaichi, and the same endpoint, https://api.elaichi.ai/mcp, is added to Claude, ChatGPT, Cursor or any other MCP client. The Elaichi Agent uses that same Sanity connection too, so there is nothing to set up a second time.

### What can an AI agent actually do with my Sanity content?

It can query and read Sanity documents, create new ones, patch fields, publish or unpublish, discard drafts and create versions. It can upload images and files into the media library from a URL or a file, check whether an upload finished, and generate or transform images. On the engineering side it can read, list and deploy schemas and deploy the studio. Short, concrete asks such as 'publish the pricing page draft' work better than long paragraphs.

### Does connecting Sanity give the AI everything in my project?

No. Every call into Sanity runs as the person who signed in, so the AI only sees the projects, datasets and documents that person can already reach in Sanity. Elaichi can narrow that further with roles and restrictions, and it never widens what Sanity itself allows.

### Can my team share one Sanity connection?

Yes. One person connects Sanity in Elaichi and shares the connection with a team, and nobody else ever handles a token or credential. Each teammate still signs in to Elaichi as themselves, so the audit log names the actual person who published or patched a Sanity document.

### Can I stop an agent from deleting or changing things in Sanity?

Yes. Restrictions in Elaichi apply per action, so you can allow reading and querying Sanity documents while blocking publish, unpublish, patch or discard. A restricted action is never advertised to Claude, ChatGPT or Cursor at all, so no prompt, however it is worded, can reach it.

### What happens to a Sanity connection when someone leaves?

Offboarding that person in Elaichi ends their access to Sanity through every client at once. A Sanity connection shared with the team keeps working for everyone else. If you want the connector gone entirely, disconnecting Sanity once in Elaichi removes it from Claude, ChatGPT, Cursor and the Elaichi Agent together.

### Does the Sanity MCP connector work with Gemini, Codex, Claude Code or other MCP clients?

Yes. Sanity is reached over the same MCP endpoint every client uses, so anything that speaks MCP can call it — Gemini, Codex, Claude Code, Windsurf, Cline, Zed and OpenCode among them — alongside Claude, ChatGPT, Cursor, and the Elaichi Agent. The tools on offer and the access behind them are identical whichever client asks. Only the setup screen differs.

### Is Elaichi an alternative to Zapier MCP for Sanity?

Yes. Both let Claude, ChatGPT or Cursor use Sanity. Zapier MCP fits a team that already automates in Zapier, since each person signs in and acts as themselves in that account. Elaichi fits when IT wants one address for the whole company, per-tool rules by role, and a record of every Sanity call.

### How is Elaichi different from Composio for Sanity?

Composio gives AI agents tools and sign-in handling across 1,000+ apps, for developers building agents or people using an assistant, billed per tool call. Elaichi gives a company's own people governed access to Sanity: one address, restrictions per role or user, and $15 per user per month. Both have role permissions and a log of every call.

## All 53 Sanity tools

Every tool below is callable through https://api.elaichi.ai/mcp once Sanity is connected, subject to the toolbox it is in and the restrictions on the caller.

- **Dataset assets upload from web chatgpt** (Upload). Upload a ChatGPT web attachment or generated file to a Content Lake dataset. Pass the file through ChatGPT web file input; ChatGPT web supplies a temporary download URL that Sanity fetches. Works when the ChatGPT web sandbox cannot make HTTP requests. Choose image or file as…
- **Dataset assets upload from URL** (Upload). Start an image or file upload from a public HTTPS URL to a Content Lake dataset. Returns an operationId immediately; use assets_upload_status to retrieve the asset and document field reference. Attach the returned reference with patch_documents, preserving existing field…
- **Media library upload from URL** (Upload). Start an image, video, or file upload from a public HTTPS URL to a Media Library. Optionally add a version to an existing asset. Returns an operationId immediately; use assets_upload_status to retrieve the asset, assetInstance, and uploadSession. Submit uploads individually…
- **Media assets upload from URL** (Upload). Deprecated. Use media_library_upload_from_url with the same arguments. This tool does not start an upload.
- **Assets upload status** (Upload). Check one to 20 asset uploads using operationIds. Wait at least pollAfterMs between checks and group running uploads in one call. Honor HTTP Retry-After when rate limited. A status lookup error does not mean the upload failed. Results include asset IDs, URLs, and references;…
- **Dataset assets upload from file** (Upload). Prepare a one-use URL for uploading an image or file up to 50 MiB to a Content Lake dataset. Works with browser-selected files, readable chat attachments, generated files, and local files. The client needs access to the bytes and HTTP POST capability; no shell or CLI is…
- **Dataset assets upload** (Upload). Provide local Sanity CLI guidance for uploading an image or file asset to a Content Lake dataset. This tool does not read or upload the file.
- **Get schema** (Get). Fetch a deployed schema. Omit workspaceName to use the sole active schema, or the default workspace when several exist. Explicit workspace names are exact. Resolves each workspace using this precedence: MCP-managed, then Studio-deployed, then legacy `system.schema`. Use…
- **List workspace schemas** (List). List every deployed schema for a project and dataset, grouped by source (MCP-managed, Studio-deployed, or legacy). Duplicate workspace names and multiple Studio applications are expected; each entry includes a schemaId for exact reads with get_schema.
- **Deploy schema** (Action). Directly deploy schema types to the cloud.
- **Deploy studio** (Action). Deploy a managed Sanity Studio bound to an MCP-managed schema. Creates a hosted Studio whose URL follows the current environment — `sanity.studio` on production, `studio.sanity.work` on staging — and returns the concrete `studioUrl` in the response.
Requires an existing…
- **Create documents** (Create). Create one or more draft documents by directly providing structured content. Creates drafts (drafts.* prefix) unless releaseId is specified for version creation.
- **Create version** (Create). Create a version document (versions.{releaseId}.* prefix) for a specific release. Versions are separate from drafts and published documents, and are used for scheduled release workflows. When adding a document to a release with content changes, call create_version before…
- **Patch documents** (Action). Update existing documents with @sanity/client patch() operations. Set documents to an object keyed by document ID, such as {"article-1":{"patches":[{"set":{"title":"New title"}}]}}.
Each document’s patches are applied as one transaction. Send at most 25 documents per call;…
- **Query documents** (Search). Query documents from Sanity using GROQ. Pass only the GROQ string in query. Do not include JavaScript imports, template wrappers, or defineQuery(). When using variables, set params to a JSON object such as {"type":"post"}.
Results are not truncated; use field projections and…
- **Generate image** (Generate). Trigger async AI image generation for a document field.
- **Transform image** (Action). Trigger async AI transformation of an existing image.
- **Get document** (Get). Fetch a single document by its exact ID. This is a direct ID lookup only - it does not search, filter, or query. Use when you have a specific document ID and need its full content.
- **Publish documents** (Publish). Publish one or more drafts. Set ids to an array such as [{"id":"article-1"}]. Use the exact IDs returned by create_documents, query_documents, or get_document.
- **Unpublish documents** (Action). Unpublish one or more published documents (moves them back to drafts)
- **Discard drafts** (Action). Discard one or more draft documents (deletes drafts while keeping published documents intact)
- **Version discard** (Action). Discard one or more document versions from a release
- **List organizations** (List). Lists all organizations the user has access to in Sanity
- **List projects** (List). Lists all Sanity projects associated with your account
- **Get project studios** (Get). Retrieves all studio applications linked to a specific Sanity project
- **Create project** (Create). Creates a new Sanity project and initializes it with a dataset and API tokens
- **Cors origins list** (List). Lists all CORS origins configured for a Sanity project
- **Add cors origin** (Add). Adds CORS origin(s) to allow client-side requests to a Sanity project
- **Cors origins delete** (Delete). Deletes a CORS origin from a Sanity project
- **Whoami** (Action). Returns the currently authenticated Sanity account. Use it first for access or account troubleshooting and report the returned name, email, provider, and MCP authentication method so the user can verify which identity is active.
- **List datasets** (List). Lists all datasets in your Sanity project
- **Create dataset** (Create). Creates a new dataset with specified name and access settings
- **Update dataset** (Update). Modifies a dataset's name or access control settings
- **Create release** (Create). Create a new release for grouping content changes. Optionally provide releaseId; if omitted, one is generated. Does not schedule the release: releaseType and intendedPublishAt are recorded as metadata only. Scheduling, publishing, archiving and deleting a release are not…
- **List releases** (List). List releases in a dataset. By default returns active and scheduled releases. Use the state filter to find published or archived releases.
- **List embeddings indices** (List). List all available embeddings indices for a dataset
- **Semantic search** (Search). Perform a semantic search on an embeddings index
- **Media library list** (List). Lists the Sanity Media Libraries in an organization. Call `list_organizations` first to get an organization ID. Returns library IDs to pass as `mediaLibraryId` to the other `media_library_*` tools.
- **Media library get schema** (Get). Get the document types of a Media Library, or the full field definitions for one type. Call this before querying or editing: the library schema is fixed (assets, collections, folders, aspects), and the organization's own asset aspects are merged onto `sanity.asset` under…
- **Media library query documents** (Search). Query a Media Library using GROQ. Assets, collections, folders, and aspect definitions are all queryable. The result count reflects the query result set, not the library total; use a `count()` query for totals.
- **Media library get document** (Get). Fetch a single Media Library document by its exact ID. This is a direct ID lookup only - it does not search, filter, or query.
- **Media library create documents** (Create). Create documents in a Media Library. Only `sanity.asset.collection` can be created — assets themselves come from uploading a binary, which is not supported here. Documents are created directly, not as drafts.
- **Media library patch documents** (Action). Edit Media Library documents. Edits are limited to the safe subset: an asset's `title` and `aspects.*`, its `cdnAccessPolicy`, and collection metadata/membership. Asset `title`/`aspects.*` edits are saved to a draft — publish them with `media_library_publish_documents`.…
- **Media library publish documents** (Publish). Publish asset drafts to make unpublished metadata edits (`title`, `aspects.*`) live, preserving published-only and system-managed fields. The draft is validated against the current aspect definitions first, as the Media Library app does: any error in `title` or `aspects`…
- **Media library discard drafts** (Action). Discard asset drafts, throwing away unpublished metadata edits and leaving the published asset intact.
- **Media library list asset references** (List). Lists documents (across project datasets) that reference a Media Library asset. Use this before replacing an asset to see what depends on it.
- **Media library link assets** (Action). Make one or more Media Library assets usable in project documents. For image/file assets this creates a local deliverable copy and returns a field value referencing it, plus a weak `media` global document reference back to the library; for video assets it returns a…
- **Run Sanity cli** (Run). Run a limited subset of Sanity CLI commands and return their output. Use `--help` to list available commands or `&lt;command&gt; --help` for command details. Commands run without a shell and cannot access the filesystem, prompt for input, run in the background, or change…
- **Search docs** (Search). Search Sanity docs
- **Read docs** (Action). Fetch a specific documentation article.
- ...and 3 more tools. Call `tools/list` via the MCP endpoint, or see the full catalog via the API, for the complete set.
