sanity_access_ list_ usersList all users of a resource and their assigned roles.
Read your content model, find documents with GROQ or plain filters, write changes as drafts the way Sanity Studio does, add images from a link, and publish now or as part of a release, in the project you connect.
PopMCPSanity
Sanity's whole HTTP API for your agent, pinned to the project you connect, with tools that write drafts instead of changing the live site, plus releases, assets, datasets and webhooks.
250 tools in the full catalog: 119 read and 131 write. 45 load by default, and the rest are found with tool search.
sanity_access_ list_ usersList all users of a resource and their assigned roles.
sanity_create_ cors_ originCreate a CORS entry.
sanity_create_ datasetCreate a dataset.
sanity_get_ projectRetrieve a project.
sanity_list_ cors_ originsList all CORS entries.
sanity_list_ datasetsList all datasets available to the project.
sanity_list_ my_ project_ permissionsList your permissions for the project.
sanity_add_ document_ to_ releasePuts a document into a release as its own version; the draft and live site stay as they are until the release publishes.
sanity_attach_ image_ from_ urlUploads an image from a public URL and sets it on a document's image field, as a draft change.
sanity_create_ documentCreates a new document as a draft, the way Sanity Studio does; nothing goes live unless publish is true.
sanity_create_ releaseCreates a content release: a set of changes that goes live together.
sanity_delete_ documentDeletes a document and its draft, including from the live site.
sanity_discard_ draftThrows away a document's unpublished draft; the published version stays as it is.
sanity_get_ content_ modelCall this first.
sanity_list_ documentsLists documents of one type, newest change first, with no GROQ to write.
sanity_list_ releasesLists content releases, newest first, with state, title, type, intended publish time and how many documents each holds.
sanity_publish_ documentsPublishes drafts so they go live, in one all-or-nothing transaction.
sanity_publish_ releasePublishes everything in a release, now or at a set time.
sanity_read_ documentReads one document's published and draft versions side by side, always the latest write.
sanity_unpublish_ documentTakes a document off the live site and keeps its content as a draft.
sanity_update_ documentChanges named fields and leaves the rest alone.
sanity_export_ documentsExport documents in a dataset.
sanity_get_ document_ revisionGet a document revision.
sanity_get_ documentsGet one or more documents.
sanity_list_ transactionsGet all transactions.
sanity_listen_ document_ changesStream document mutation events.
sanity_mutate_ documentsMutate documents.
sanity_perform_ actionsDispatch one or more actions.
sanity_query_ documentsQuery using POST method.
sanity_query_ documents_ cdnSame as query_documents, answered from Sanity's API CDN: fast, and cached answers are not rate limited.
sanity_create_ webhookCreate a webhook.
sanity_delete_ webhookDelete a webhook.
sanity_list_ webhooksList all webhooks.
sanity_update_ webhookUpdate a webhook.
sanity_create_ commentCreate a comment.
sanity_query_ commentsQuery comments with a request body.
sanity_agent_ transformTransform a document.
sanity_create_ scheduleCreate schedule.
sanity_list_ schedulesList schedules.
sanity_copy_ datasetCopy.
sanity_upload_ file_ from_ urlUpload a file asset from a URL.
sanity_upload_ image_ from_ urlUpload an image asset from a URL.
sanity_get_ jobJob status.
sanity_list_ activityGet activity log events.
sanity_purge_ query_ cachePurge cached query responses for one dataset.
sanity_check_ application_ embeddableCheck whether an application can be embedded.
sanity_check_ studio_ host_ availabilityGet appHost availability.
sanity_create_ applicationCreate an application.
sanity_create_ project_ user_ applicationCreate an user application for a project.
sanity_create_ user_ applicationCreate an user application.
sanity_create_ user_ application_ dataCreate user application data.
sanity_delete_ all_ project_ user_ applicationsDelete all user applications.
sanity_delete_ applicationDelete an application.
sanity_delete_ installation_ configDelete an installation configuration.
sanity_delete_ project_ user_ applicationDelete an user application for a project.
sanity_delete_ user_ applicationDelete an user application.
sanity_delete_ user_ application_ dataDelete user application data.
sanity_deploy_ applicationDeploy an application.
sanity_deploy_ installation_ configDeploy installation configuration.
sanity_deploy_ project_ user_ applicationDeploy an user application for a project.
sanity_deploy_ user_ applicationDeploy an user application.
sanity_get_ applicationGet an application by ID.
sanity_get_ application_ accessGet resource access for an application.
sanity_get_ application_ interfacesGet interfaces by type for an application.
sanity_get_ application_ workspacesGet workspaces for an application.
sanity_get_ installationGet an installation by ID.
sanity_get_ installation_ accessGet resource access for an installation.
sanity_get_ installation_ interfacesGet interfaces by type for an installation.
sanity_get_ organization_ applicationGet an application in an organization by ID or slug.
sanity_get_ project_ user_ applicationGet an user application for a project.
sanity_get_ studio_ auto_ update_ versionGet studio auto-updating version status.
sanity_get_ user_ applicationGet an user application.
sanity_get_ user_ application_ workspacesGet workspaces for an user application.
sanity_install_ applicationInstall a singleton application.
sanity_install_ default_ applicationsInstall the default singletons for an organization.
sanity_list_ application_ deploymentsList deployments for an application.
sanity_list_ applicationsList applications for an organization.
sanity_list_ installation_ catalogList the singleton catalog for an organization.
sanity_list_ installation_ configsList configs for an installation.
sanity_list_ installationsList installations for an organization.
sanity_list_ project_ user_ application_ deploymentsGet user application deployments for a project.
sanity_list_ project_ user_ applicationsGet all user applications for a project.
sanity_list_ studio_ workspacesGet workspaces for studio applications.
sanity_list_ user_ application_ deploymentsGet user application deployments.
sanity_list_ user_ applicationsGet all user applications.
sanity_reconcile_ ai_ applicationsReconcile an organization's AI singletons with its AI features status.
sanity_register_ project_ user_ application_ configRegister an user application config for a project.
sanity_register_ user_ application_ configRegister an user application config.
sanity_resolve_ application_ by_ hostGet application by host.
sanity_resolve_ project_ by_ hostGet project by application.
sanity_uninstall_ applicationUninstall a singleton application.
sanity_update_ applicationUpdate an application.
sanity_update_ project_ user_ applicationUpdate an user application for a project.
sanity_update_ user_ applicationUpdate an user application.
sanity_access_ accept_ inviteAccept invite.
sanity_access_ accept_ requestAccept request.
sanity_access_ add_ user_ roleAdd a role to an user.
sanity_access_ apply_ default_ roleApply organization default role to all users.
sanity_access_ check_ invite_ eligibilityCheck invite eligibility.
sanity_access_ check_ my_ permissionsCheck if current user has specified permissions.
sanity_access_ create_ inviteCreate invite.
sanity_access_ create_ permissionCreate a permission.
sanity_access_ create_ requestCreate a new Request.
sanity_access_ create_ roleCreate a role.
sanity_access_ decline_ requestDecline request.
sanity_access_ delete_ permissionDelete a permission.
sanity_access_ delete_ robotRevoke robot token and delete robot.
sanity_access_ delete_ roleDelete a role.
sanity_access_ get_ inviteGet invite.
sanity_access_ get_ permissionGet a permission.
sanity_access_ get_ request_ stateGet access request state.
sanity_access_ get_ robotGet robot metadata.
sanity_access_ get_ roleGet a role.
sanity_access_ get_ userGet user and roles.
sanity_access_ leave_ resourceRemove own user from a resource.
sanity_access_ list_ invitesGet invites.
sanity_access_ list_ my_ invitesGet current user's invites filtered by status/resource.
sanity_access_ list_ my_ permissionsGet current user permissions.
sanity_access_ list_ my_ requestsList all request for current user.
sanity_access_ list_ permissionsGet Permissions.
sanity_access_ list_ requestsList all requests for given project/organization.
sanity_access_ list_ robotsGet robots with access to this resource.
sanity_access_ list_ rolesList roles assignable to an user on this resource.
sanity_access_ remove_ userRemove an user from a resource.
sanity_access_ remove_ user_ roleRemove a role from an user in a resource.
sanity_access_ replace_ user_ rolesReplace the role set for an user.
sanity_access_ revoke_ inviteRevoke invite.
sanity_access_ set_ robot_ expiryUpdate robot token.
sanity_access_ update_ permissionUpdate a permission.
sanity_access_ update_ roleUpdate a role.
sanity_create_ attribute_ definitionCreate Attribute Definition.
sanity_delete_ attribute_ definitionDelete Attribute Definition.
sanity_delete_ user_ attributesDelete User Attributes.
sanity_get_ my_ attributesGet My Attributes.
sanity_get_ user_ attributesGet User Attributes.
sanity_list_ attribute_ definitionsList Attribute Definitions.
sanity_update_ user_ attributesUpdate User Attributes.
sanity_add_ organization_ member_ roleGive an organization member a role.
sanity_add_ project_ member_ roleAdd a role to an user.
sanity_create_ organization_ grantCreate an organization grant.
sanity_create_ permission_ resourceCreate a permission resource.
sanity_create_ project_ grantCreate a grant.
sanity_create_ project_ roleCreate a role.
sanity_delete_ organization_ grantRemove an organization grant.
sanity_delete_ permission_ resourceDelete a permission resource.
sanity_delete_ project_ grantRemove a grant.
sanity_delete_ project_ roleDelete a role.
sanity_delete_ project_ role_ mappingsDelete project role mappings.
sanity_get_ dataset_ aclGet dataset ACL.
sanity_get_ dataset_ grantsGet dataset grants.
sanity_get_ organization_ member_ rolesGet the roles of a single organization member.
sanity_get_ permission_ resourceGet a permission resource.
sanity_get_ project_ member_ rolesGet an user's roles.
sanity_get_ project_ roleGet a role.
sanity_list_ my_ organization_ grantsGet all grants for current user.
sanity_list_ my_ project_ grantsList grants for the current user.
sanity_list_ organization_ membersList organization members.
sanity_list_ permission_ resource_ schemasList permission resource schemas.
sanity_list_ permission_ resourcesList permission resources.
sanity_list_ project_ member_ grantsList grants for a project member.
sanity_list_ project_ membersList users with roles.
sanity_list_ project_ rolesList all roles.
sanity_remove_ organization_ member_ roleRemove a role from an organization member.
sanity_remove_ project_ member_ roleDelete a role from an user.
sanity_set_ project_ role_ mappingsCreate/update project role mappings.
sanity_update_ permission_ resourceUpdate a permission resource.
sanity_update_ project_ roleUpdate a role.
sanity_assign_ dataset_ tagAssign a tag to a dataset.
sanity_create_ projectCreate a project.
sanity_create_ project_ tagCreate a new tag for the project.
sanity_delete_ cors_ originDelete a CORS entry.
sanity_delete_ datasetDelete a dataset.
sanity_delete_ projectDelete a project.
sanity_delete_ project_ tagDelete a tag by identifier.
sanity_delete_ project_ tokenDelete a token for the project.
sanity_get_ dataset_ embeddings_ settingsGet embeddings index settings for a dataset.
sanity_get_ project_ tagRetrieve a tag.
sanity_get_ project_ userRetrieve an user.
sanity_list_ dataset_ tagsList tags for a dataset.
sanity_list_ project_ featuresList active features for the project.
sanity_list_ project_ tagsList tags for the project.
sanity_list_ project_ tokensList tokens for the project.
sanity_list_ projectsList all projects.
sanity_remove_ dataset_ tagRemove a tag from a dataset.
sanity_update_ datasetUpdate a dataset.
sanity_update_ dataset_ embeddings_ settingsUpdate embeddings index settings for a dataset.
sanity_update_ projectUpdate a project.
sanity_update_ project_ tagUpdate a tag by identifier.
sanity_media_ create_ signing_ keyCreate a new signing key.
sanity_media_ delete_ signing_ keyDelete a signing key.
sanity_media_ delete_ subtitleDelete a subtitle.
sanity_media_ generate_ subtitlesGenerate subtitles using AI.
sanity_media_ get_ signing_ keyGet a specific signing key.
sanity_media_ get_ video_ playback_ infoGet video playback information.
sanity_media_ get_ video_ playback_ urlRedirect to video playback URL.
sanity_media_ get_ video_ rendition_ urlRedirect to video rendition URL.
sanity_media_ list_ asset_ referencesList references to an asset.
sanity_media_ list_ signing_ keysList all signing keys.
sanity_media_ mutateMutate media in the Media Library.
sanity_media_ queryQuery media in the Media Library with a request body.
sanity_media_ query_ getQuery media in the Media Library.
sanity_media_ searchSearch for assets and references.
sanity_media_ uploadUpload an asset to the media library.
sanity_media_ upload_ from_ urlUpload an asset to the media library from a URL.
sanity_media_ upload_ subtitlesUpload a subtitle file.
sanity_list_ document_ transactionsGet the transactions for a list of documents.
sanity_listen_ live_ eventsStream sync tag invalidation events.
sanity_query_ documents_ cdn_ getSame as query_documents_get, answered from Sanity's API CDN.
sanity_query_ documents_ getQuery using GET method.
sanity_delete_ function_ env_ varDelete an environment variable.
sanity_delete_ function_ logsDelete logs for a function.
sanity_get_ functionRead a function.
sanity_get_ function_ logsRetrieve function logs.
sanity_get_ webhookGet a webhook by ID.
sanity_get_ webhook_ attemptGet a webhook attempt by ID.
sanity_invoke_ functionInvoke a function.
sanity_list_ function_ env_ varsList environment variable keys.
sanity_list_ functionsList functions.
sanity_list_ webhook_ attemptsList webhook attempts.
sanity_list_ webhook_ message_ attemptsList attempts for a webhook message.
sanity_list_ webhook_ messagesList webhook messages.
sanity_stream_ function_ logsStream function logs.
sanity_update_ function_ env_ varUpdate an environment variable.
sanity_add_ comment_ reactionAdd a reaction to a comment.
sanity_delete_ commentDelete a comment and all its replies.
sanity_listen_ commentsListen for comment changes.
sanity_query_ comments_ getQuery comments.
sanity_remove_ comment_ reactionRemove a reaction from a comment.
sanity_update_ commentUpdate a comment.
sanity_agent_ generateSend an instruction to Generate.
sanity_agent_ patchMake a schema-aware patch to a document.
sanity_agent_ promptPrompt the LLM for a response.
sanity_agent_ translateTranslate a document.
sanity_content_ agent_ chatSend a chat message.
sanity_content_ agent_ promptSend an one-shot prompt.
sanity_get_ scheduleGet schedule by ID.
sanity_run_ scheduleRun schedule.
sanity_scheduling_ publish_ documentsPublish documents.
sanity_scheduling_ unpublish_ documentsUnpublish documents.
sanity_update_ scheduleUpdate schedule.
sanity_get_ dataset_ backupGet a backup.
sanity_link_ media_ library_ assetLink a Media Library asset to a dataset.
sanity_list_ dataset_ backupsList backups.
sanity_list_ dataset_ copy_ jobsList copy jobs.
sanity_set_ dataset_ backupsEnable or disable backups.
sanity_upload_ fileUpload a file asset.
sanity_upload_ imageUpload an image asset.
sanity_export_ activity_ csvExport activity log events as CSV.
sanity_listen_ jobListen for job updates.
sanity_purge_ asset_ cachePurge one dataset image or file.
Credentials off one Sanity screen, then an endpoint your client signs into. Nothing to deploy, and nothing to install.
In sanity.io/manage, open your project, go to Settings, then API, then Tokens, and click Add new token. Name it, pick a role (Editor for content, Developer on paid plans for datasets and webhooks), save it and copy the token, which Sanity shows once. Paste it into PopMCP, then pick the project to connect and the PopMCP workspace it goes into.
••••••••••••3f7aabc12defproductionEveryday writing tools leave changes as drafts until you ask to publish. Publishing, deleting documents, changing datasets and creating webhooks happen the moment the AI calls them, with your token's Sanity role as the ceiling. Tick Sanity on the PopMCP consent screen only for clients that should change content, and keep the rest read-only.
Drop the PopMCP URL into Claude, ChatGPT, Claude Code, Codex or any other supported client. It signs in through PopMCP with OAuth, so your Sanity credential never leaves the server.
app.popmcp.com/mcpAsk for something harmless before the agent changes anything. Writes run as soon as it calls them, so confirm it reads the right account first.
Show me the document types in our dataset, then list the blog posts with unpublished changes
sanity_get_content_modelok
Then just ask for the work
“Show me the document types in our dataset, then list the blog posts with unpublished changes”
“Fix the typo in the Pricing page title and publish it”
“Add this image from our CDN as the main image of the launch post, and leave it as a draft”
“Gather the three launch posts into a release and schedule it for Friday at 9am UTC”
“Which articles written in the last month mention our new pricing, as the live site shows them?”
“Who changed the About page last week, and what did it say before?”
“Set up a webhook that tells our build service whenever a post is published”
One hosted endpoint, registered once per client. The same tools and the same permissions, whichever window the request comes from.
Add the PopMCP URL under Customize → Connectors and the tools appear in every chat.
The same endpoint, registered in the browser. Nothing to install on the machine you are working from.
Register PopMCP as a custom connector, then let ChatGPT read and update the account.
Wire the endpoint into Codex or the Codex CLI when a task needs live business context, not a fixture.
Register the remote MCP server in OpenCode's config for terminal-first and scripted agent runs.
Add PopMCP as an MCP server in Z.ai's desktop app and work the account from the same window.
FAQ
What teams ask before putting Sanity behind an AI client.
One API token. In sanity.io/manage, open your project, go to Settings, then API, then Tokens, add a token and copy it right away, because Sanity shows it once. You need the Developer or Administrator role in the project to make one. There is no app to register. PopMCP checks the token, stores it encrypted and sends it from the server, so your AI client never sees it.
Editor reads and writes content, and Viewer only reads. On paid plans, Developer also manages datasets, webhooks and CORS origins. The token's role is the ceiling: when it does not allow something, the tool says so and names what to change. You can also keep the connection read-only in PopMCP whatever role the token has.
The everyday tools work like Sanity Studio: creating and updating leave a draft, and nothing goes live until something publishes it. Only the low-level mutate tool writes exactly what it is given, and its description tells the AI to use it only when asked. Publishing and deleting are still real actions, so keep the connection read-only for clients that should only look.
Yes. Queries can use the drafts perspective to see unpublished changes, the published perspective for what is live, or a release id to see a release as it will look. A public dataset's published content can be read by anyone, but drafts always need the token.
Sanity's server at mcp.sanity.io focuses on editing content and working with schemas, and it can deploy schemas, which PopMCP cannot because that is not in Sanity's HTTP API. PopMCP covers the HTTP API itself, including webhooks, roles and access, activity logs, scheduling, Functions and Media Library, and it connects alongside your other tools under one sign-in. You can use both.
Each project you pick becomes its own connection, so the AI cannot reach a project mapped to another workspace. Inside a project, tools use the production dataset by default and can name any other dataset in that project. An organization token can reach several projects, and a project token reaches one.
No. PopMCP hosts it and gives you a Streamable HTTP MCP URL. There is nothing to deploy, no callback URL to register, and no infrastructure to keep running or patch.
Any client that supports a remote Streamable HTTP MCP server: Claude Desktop, Claude Web, Claude Code, ChatGPT custom connectors, Codex and the Codex CLI, OpenCode and Z.ai's ZCode, as well as editors such as Cursor, Windsurf and Zed. Your client signs in to PopMCP with OAuth; the provider credential never leaves the server.
Connect Sanity in PopMCP first, then run claude mcp add --transport http popmcp https://app.popmcp.com/mcp in a terminal. Inside Claude Code, run /mcp and sign in to PopMCP in the browser window it opens, ticking Sanity on the consent screen. The Sanity tools are then available in that session, and no Sanity credential is stored on your machine.
Loading 250 tool definitions into every conversation burns context before the work starts. PopMCP loads a curated 45-tool set covering the everyday workflows and keeps the rest searchable, so your AI pulls a specialist tool only when a task needs it. Every tool stays searchable, and on Scale the owner can load the full catalog for a teammate's connection.
A tool is something your AI calls, and there are 250 here. A trigger is something PopMCP watches for you: 8 Sanity events that can start work on the PopMCP side. Triggers never enter your AI client's context, and none of them ask you to paste a callback URL into Sanity.
Launch a hosted MCP endpoint for Sanity, keep tool access under control, and start testing real workflow prompts right away.