Building an MCP Server for Sanity CMSβββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώβββββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώββββο»Ώο»Ώββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββο»Ώββββββο»Ώβββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββο»Ώβββββββββββο»Ώο»Ώβο»Ώββββο»Ώβββο»Ώββο»Ώβββο»Ώβο»Ώβββββο»Ώβο»Ώβο»Ώβββο»Ώββββο»Ώββββββο»Ώβββββο»Ώβββββββο»Ώβββββββββββββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββο»Ώββββο»Ώββββββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβββββββββββο»Ώββββββββο»Ώβββο»Ώο»Ώβββο»Ώββββββο»Ώβββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβο»Ώβββββο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβββββββββββββο»Ώο»Ώβββο»Ώβββββββββββο»Ώο»Ώβο»Ώββββο»Ώβββο»Ώββο»Ώβββο»Ώβο»Ώβββββο»Ώβο»Ώβο»Ώβββο»Ώββββο»Ώββββββο»Ώβββββο»Ώβββββββο»Ώβββββββββββββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββο»Ώββββο»Ώββββββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ

Building an MCP Server for Sanity CMS
I recently built a Model Context Protocol (MCP) server that enables AI assistants like Claude to directly manage content in Sanity CMS. Here's what I learned and how you can build one too.
What is MCP?
Model Context Protocol is Anthropic's open standard for connecting AI assistants to external tools and data sources. It allows Claude to interact with databases, APIs, and content management systems in a structured, safe way.
Why Build This?
Managing content through a CMS dashboard is fine for occasional updates, but when you're working with an AI assistant on content creation, the back-and-forth becomes tedious. With an MCP server, Claude can:
- Create and publish blog posts directly - Manage categories and tags - Upload images and media - Update existing content
The Architecture
The server is built with TypeScript and uses:
@modelcontextprotocol/sdk - The official MCP SDK
@sanity/client - Sanity's JavaScript client with write capabilities
Zod - For input validation and type safety
Key Features
Full CRUD Operations
Every content type has complete create, read, update, and delete operations. The tools are designed to be intuitive for AI assistants while maintaining data integrity.
Portable Text Conversion
One challenge was converting markdown content to Sanity's Portable Text format. The server includes a utility that transforms markdown headers, paragraphs, and blockquotes into proper Portable Text blocks.
Media Upload
The server supports uploading images both from base64 data and from URLs, making it easy to attach cover images to posts.

Toms Veidemanisβββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώβββββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώββββο»Ώο»Ώββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββο»Ώββββββο»Ώβββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώββββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώββββο»Ώββββββο»Ώβββο»Ώβββο»Ώβο»Ώββο»Ώββο»Ώβββο»Ώβββββββο»Ώββββο»Ώββο»Ώβββββββο»Ώβββββο»Ώββο»Ώββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώββββββο»Ώβββο»Ώββββββββο»Ώο»Ώβο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώβββο»Ώβββββββο»Ώββββββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβββββββββββο»Ώββββββββο»Ώβββο»Ώο»Ώβββο»Ώββββββο»Ώβββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβο»Ώβββββο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβββββββββββββο»Ώο»Ώββββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώββββο»Ώββββββο»Ώβββο»Ώβββο»Ώβο»Ώββο»Ώββο»Ώβββο»Ώβββββββο»Ώββββο»Ώββο»Ώβββββββο»Ώβββββο»Ώββο»Ώββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώββββββο»Ώβββο»Ώββββββββο»Ώο»Ώβο»Ώβββββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώβββο»Ώβββββββο»Ώββββββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ
I write about engineering, technology, and problem-solving from a practical, systems-driven perspective. My background spans construction, energy efficiency, and software projects, with a focus on turning complex ideas into decisions that actually work in the real world. This blog is where I document what Iβm building, testing, and learningβwithout hype or shortcuts.βββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώβββββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώββββο»Ώο»Ώββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββο»Ώββββββο»Ώβββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώββββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώββββο»Ώββββββο»Ώβββο»Ώβββο»Ώβο»Ώββο»Ώββο»Ώβββο»Ώβββββββο»Ώββββο»Ώββο»Ώβββββββο»Ώβββββο»Ώββο»Ώββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώββββββο»Ώβββο»Ώββββββββο»Ώο»Ώβο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώβββββββββββο»Ώο»Ώβο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβββββββββββο»Ώββββββββο»Ώβββο»Ώο»Ώβββο»Ώββββββο»Ώβββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβο»Ώβββββο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβο»Ώβββββββββββββο»Ώο»Ώββββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώββββο»Ώββββββο»Ώβββο»Ώβββο»Ώβο»Ώββο»Ώββο»Ώβββο»Ώβββββββο»Ώββββο»Ώββο»Ώβββββββο»Ώβββββο»Ώββο»Ώββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώββββββο»Ώβββο»Ώββββββββο»Ώο»Ώβο»Ώβββββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώβββββββββββο»Ώο»Ώβββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ
