--- title: Sanity Getting Started Guide description: Use these rules when users ask to 'Get started with Sanity' or need help setting up a new Sanity project. --- # Sanity Getting Started Guide ## Overview Getting started with Sanity follows three phases: 1. **Studio & Schema** — Set up Sanity Studio and define your content model 2. **Content** — Import existing content or generate placeholder content via MCP 3. **Frontend** — Integrate with your application (framework-specific) ## Communication Style **Keep responses succinct:** - Tell the user what you did: "Created post schema with title, body, and slug" - Ask direct questions: "What kind of content are you building?" - Avoid verbose explanations of what you're about to do - Don't explain every step unless the user asks **Examples:** - **Good**: "Schema deployed. Ready to add some content?" - **Bad**: "I'm going to deploy your schema to the Content Lake so that the MCP server can recognize your new document types. This will allow..." --- ## Get Started with Sanity (Interactive Guide) **TRIGGER PHRASE:** When the user says "Get started with Sanity" or similar, follow these steps. **Before starting:** Let the user know they can pause and resume anytime by saying "Continue Sanity setup". **RESUME TRIGGER:** If the user says "Continue Sanity setup", check what's already configured: - Does `sanity.config.ts` exist? → Studio is set up - Are there files in `schemaTypes/`? → Schema exists - Is there a frontend framework in `package.json`? → May need integration Resume from where they left off. --- ## Phase 1: Studio & Schema ### Step 1: Check for Existing Studio **Look for `sanity.config.ts` or `sanity.cli.ts`:** **If NO Studio found:** - Ask: "Want to create a new Sanity Studio?" - If yes, run: ```bash npm create sanity@latest -- --template clean --typescript ``` **If Studio exists:** - Read the config to get `projectId` and `dataset` - Proceed to Step 2 ### Step 2: Check for Existing Schema **Look in `schemaTypes/`, `schemas/`, or `src/sanity/schemaTypes/`:** **If NO schema found:** - Ask: "What kind of content are you building? (e.g., Blog, E-commerce, Portfolio)" - Create appropriate schema types based on their answer - See `schema.md` for patterns **If schema exists:** - Show them what you found - Ask: "Want to add more content types or modify existing ones?" **If they want a quick example:** Create a basic blog schema: ```typescript // schemaTypes/post.ts import { defineType, defineField } from 'sanity' export const post = defineType({ name: 'post', title: 'Post', type: 'document', fields: [ defineField({ name: 'title', type: 'string' }), defineField({ name: 'slug', type: 'slug', options: { source: 'title' } }), defineField({ name: 'body', type: 'array', of: [{ type: 'block' }] }), ], }) ``` ### Step 3: Deploy Schema **Required before Phase 2:** ```bash npx sanity schema deploy ``` This uploads your schema to the Content Lake so MCP tools can work with it. --- ## Phase 2: Content ### Step 1: Check for Existing Content **Use MCP `query_documents` to check:** ``` *[_type == "post"][0...5] ``` **If content exists:** - Show them a summary - Ask: "Want to add more content or move to frontend integration?" **If NO content:** - Ask: "Do you want to: 1. Import existing content (from another CMS, markdown, etc.) 2. Generate sample content with AI 3. Skip this and add content manually in the Studio" ### Step 2a: Import Existing Content If migrating from another CMS or files: - See `migration.md` - Use MCP `migrate_content` tool for guidance ### Step 2b: Generate Sample Content (MCP) Use the Sanity MCP Server: ``` Tool: create_document Type: post Content: Create a sample blog post about getting started with Sanity ``` **If MCP fails:** Remind them to run `npx sanity schema deploy` first. ### MCP Setup (If Not Configured) **Quick start via Sanity CLI:** ```bash npx sanity@latest mcp configure ``` **Cursor:** [One-click install →](cursor://anysphere.cursor-deeplink/mcp/install?name=Sanity&config=eyJ1cmwiOiJodHRwczovL21jcC5zYW5pdHkuaW8iLCJ0eXBlIjoiaHR0cCJ9Cg==) Or add to `.cursor/mcp.json`: ```json { "mcpServers": { "Sanity": { "type": "http", "url": "https://mcp.sanity.io" } } } ``` **Claude Code:** ```bash claude mcp add Sanity -t http https://mcp.sanity.io --scope user ``` **VS Code:** Command Palette → `MCP: Open User Configuration` → add: ```json { "servers": { "Sanity": { "type": "http", "url": "https://mcp.sanity.io" } } } ``` --- ## Phase 3: Frontend Integration ### Step 1: Detect Framework **Check `package.json` dependencies:** | Dependency | Framework | Rule File | |------------|-----------|-----------| | `next` | Next.js | `nextjs.md` | | `@remix-run/react` or `react-router` | React Router / Remix | `remix.md` | | `svelte` or `@sveltejs/kit` | SvelteKit | `svelte.md` | | `nuxt` | Nuxt | `nuxt.md` | | `astro` | Astro | `astro.md` | **If NO framework found:** - Ask: "Which framework are you using, or would you like to create a new app?" - Guide them to create one or specify their choice ### Step 2: Next.js Integration (Inline) If Next.js is detected, follow these essential steps: **Install dependencies:** ```bash npm install @sanity/client @sanity/image-url @portabletext/react ``` **Create the client (`src/sanity/client.ts`):** ```typescript import { createClient } from "@sanity/client"; export const client = createClient({ projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, apiVersion: "2026-02-01", // Use current date for new projects useCdn: false, // Use API directly for server-side rendering; set true for client-side reads }); ``` **Fetch content in a Server Component:** ```typescript // app/posts/page.tsx import { client } from "@/sanity/client"; import { defineQuery } from "groq"; const POSTS_QUERY = defineQuery(`*[_type == "post"]{ _id, title, slug }`); export default async function PostsPage() { const posts = await client.fetch(POSTS_QUERY); return (