@damusix/ghost-mcp 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -1
- package/bin/ghost-keys.sh +58 -0
- package/dist/index.mjs +1071 -26
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["globalFetchConfig","browseParams","readParams","readBySlugParams","addSchema","editSchema","copySchema","deleteSchema","browseParams","readParams","readBySlugParams","addSchema","editSchema","deleteSchema","browseParams","readParams","addSchema","editSchema","deleteSchema","browseParams","readParams","addSchema","editSchema","browseParams","readParams","addSchema","editSchema","browseParams","readParams","addSchema","editSchema","browseParams","readParams","addSchema","editSchema","browseParams","readParams","uploadSchema","readParams","browseParams","readParams","readBySlugParams","browseParams","readParams","readBySlugParams","browseParams","readParams","readBySlugParams","browseParams","readParams","fetchGet"],"sources":["../src/ghost-client.ts","../src/actions/admin/posts.ts","../src/actions/admin/pages.ts","../src/actions/admin/tags.ts","../src/actions/admin/tiers.ts","../src/actions/admin/newsletters.ts","../src/actions/admin/offers.ts","../src/actions/admin/members.ts","../src/actions/admin/users.ts","../src/actions/admin/images.ts","../src/actions/admin/themes.ts","../src/actions/admin/webhooks.ts","../src/actions/admin/site.ts","../src/actions/content/posts.ts","../src/actions/content/pages.ts","../src/actions/content/tags.ts","../src/actions/content/authors.ts","../src/actions/content/tiers.ts","../src/actions/content/settings.ts","../src/actions/registry.ts","../src/tools/use-ghost-api.ts","../src/tools/ghost-api-help.ts","../src/tools/ghost-docs.ts","../src/index.ts"],"sourcesContent":["import { FetchEngine, config as globalFetchConfig } from '@logosdx/fetch';\nimport type { FetchError } from '@logosdx/fetch';\nimport jwt from 'jsonwebtoken';\n\nconst GHOST_URL = process.env.GHOST_URL || '';\nconst GHOST_ADMIN_API_KEY = process.env.GHOST_ADMIN_API_KEY || '';\nconst GHOST_CONTENT_API_KEY = process.env.GHOST_CONTENT_API_KEY || '';\nconst GHOST_API_VERSION = process.env.GHOST_API_VERSION || 'v6.0';\nconst GHOST_RATE_LIMIT = Number(process.env.GHOST_RATE_LIMIT) || 50;\n\nfunction generateAdminToken(): string {\n const [id, secret] = GHOST_ADMIN_API_KEY.split(':');\n const token = jwt.sign({}, Buffer.from(secret, 'hex'), {\n keyid: id,\n algorithm: 'HS256',\n expiresIn: '5m',\n audience: '/admin/',\n });\n return token;\n}\n\nconst resilience = {\n attemptTimeout: 15000,\n totalTimeout: 45000,\n\n retry: {\n maxAttempts: 3,\n baseDelay: 1000,\n maxDelay: 10000,\n useExponentialBackoff: true,\n retryableStatusCodes: [408, 429, 500, 502, 503, 504],\n shouldRetry: (error: FetchError, _attempt: number) => {\n if (error.status === 429) {\n const retryAfter = error.headers?.['retry-after'];\n return retryAfter ? parseInt(retryAfter as string) * 1000 : 5000;\n }\n if (error.status >= 400 && error.status < 500) {\n return false;\n }\n return true;\n },\n },\n\n cachePolicy: {\n enabled: true,\n methods: ['GET'] as const,\n ttl: 3_600_000,\n staleIn: 10_000,\n },\n\n dedupePolicy: true as const,\n\n rateLimitPolicy: {\n maxCalls: GHOST_RATE_LIMIT,\n windowMs: 60_000,\n waitForToken: true,\n },\n};\n\nexport const adminApi = new FetchEngine({\n baseUrl: `${GHOST_URL}/ghost/api/admin`,\n defaultType: 'json',\n headers: {\n 'Accept-Version': GHOST_API_VERSION,\n 'Content-Type': 'application/json',\n Authorization: `Ghost ${generateAdminToken()}`,\n },\n ...resilience,\n});\n\nadminApi.hooks.add('beforeRequest', (url, opts) => {\n opts.headers.Authorization = `Ghost ${generateAdminToken()}`;\n});\n\nexport const contentApi = new FetchEngine({\n baseUrl: `${GHOST_URL}/ghost/api/content`,\n defaultType: 'json',\n headers: {\n 'Accept-Version': GHOST_API_VERSION,\n 'Content-Type': 'application/json',\n },\n params: {\n key: GHOST_CONTENT_API_KEY,\n },\n ...resilience,\n});\n\nexport const docsApi = new FetchEngine({\n baseUrl: 'https://docs.ghost.org',\n defaultType: 'text',\n attemptTimeout: 15000,\n totalTimeout: 45000,\n retry: {\n maxAttempts: 3,\n baseDelay: 1000,\n maxDelay: 10000,\n useExponentialBackoff: true,\n },\n cachePolicy: {\n enabled: true,\n methods: ['GET'] as const,\n ttl: 3_600_000,\n staleIn: 10_000,\n },\n dedupePolicy: true as const,\n});\n\n// Configure global fetch instance for raw downloads (image/theme uploads)\n// No auth, no cache — just retry and dedupe\nglobalFetchConfig.set({\n attemptTimeout: 15000,\n totalTimeout: 45000,\n retry: {\n maxAttempts: 3,\n baseDelay: 1000,\n maxDelay: 10000,\n useExponentialBackoff: true,\n },\n dedupePolicy: true,\n});\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z\n .string()\n .optional()\n .describe('Comma-separated list of related data to include (e.g. \"authors,tags\")'),\n formats: z\n .string()\n .optional()\n .describe('Content formats to return: \"html\", \"lexical\", \"plaintext\" (comma-separated)'),\n filter: z\n .string()\n .optional()\n .describe('NQL filter expression (e.g. \"status:published+tag:news\")'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page (default: 15, or \"all\")'),\n page: z.number().optional().describe('Page number for pagination'),\n order: z.string().optional().describe('Sort order (e.g. \"published_at DESC\")'),\n fields: z.string().optional().describe('Comma-separated list of fields to return'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Post ID'),\n include: z.string().optional().describe('Comma-separated list of related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nconst readBySlugParams = z.object({\n slug: z.string().describe('Post slug'),\n include: z.string().optional().describe('Comma-separated list of related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nconst postWriteFields = {\n title: z.string().describe('Post title'),\n lexical: z.string().optional().describe('Post content in Lexical JSON format'),\n status: z.enum(['published', 'draft', 'scheduled']).optional().describe('Post status'),\n tags: z\n .array(z.union([z.object({ id: z.string() }), z.object({ name: z.string() })]))\n .optional()\n .describe('Tags to assign (by id or name)'),\n authors: z\n .array(z.object({ id: z.string() }))\n .optional()\n .describe('Authors to assign (by id)'),\n featured: z.boolean().optional().describe('Whether the post is featured'),\n visibility: z.string().optional().describe('Post visibility (public, members, paid, tiers)'),\n published_at: z.string().optional().describe('Publication date (ISO 8601 format)'),\n custom_excerpt: z.string().optional().describe('Custom excerpt for the post'),\n meta_title: z.string().optional().describe('SEO meta title'),\n meta_description: z.string().optional().describe('SEO meta description'),\n og_image: z.string().optional().describe('Open Graph image URL'),\n og_title: z.string().optional().describe('Open Graph title'),\n og_description: z.string().optional().describe('Open Graph description'),\n twitter_image: z.string().optional().describe('Twitter card image URL'),\n twitter_title: z.string().optional().describe('Twitter card title'),\n twitter_description: z.string().optional().describe('Twitter card description'),\n codeinjection_head: z.string().optional().describe('Code injection for the post head'),\n codeinjection_foot: z.string().optional().describe('Code injection for the post footer'),\n canonical_url: z.string().optional().describe('Canonical URL for the post'),\n feature_image: z.string().optional().describe('Feature image URL'),\n feature_image_alt: z.string().optional().describe('Feature image alt text'),\n feature_image_caption: z.string().optional().describe('Feature image caption (HTML)'),\n custom_template: z.string().optional().describe('Custom template for the post'),\n newsletter: z.object({ id: z.string() }).optional().describe('Newsletter to send the post to'),\n email_subject: z\n .string()\n .optional()\n .describe('Custom email subject when sending as newsletter'),\n slug: z.string().optional().describe('Custom URL slug for the post'),\n email_only: z.boolean().optional().describe('Whether the post is email-only (not published to web)'),\n email_segment: z\n .string()\n .optional()\n .describe(\"NQL filter for email recipient segment (e.g. 'status:free', 'status:-free')\"),\n};\n\nconst addSchema = z.object({\n ...postWriteFields,\n title: z.string().describe('Post title (required)'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Post ID (required)'),\n updated_at: z\n .string()\n .describe('Last known updated_at value for collision detection (required)'),\n ...postWriteFields,\n title: z.string().optional().describe('Post title'),\n});\n\nconst copySchema = z.object({\n id: z.string().describe('Post ID to copy'),\n});\n\nconst deleteSchema = z.object({\n id: z.string().describe('Post ID to delete'),\n});\n\nexport const adminPostActions: ActionDefinition[] = [\n {\n name: 'posts.browse',\n api: 'admin',\n method: 'GET',\n path: '/posts/',\n inputSchema: browseParams,\n description: 'Browse all posts with filtering, pagination, and sorting',\n example: { filter: 'status:published', limit: 10, include: 'authors,tags' },\n },\n {\n name: 'posts.read',\n api: 'admin',\n method: 'GET',\n path: '/posts/{id}/',\n inputSchema: readParams,\n description: 'Read a single post by ID',\n example: {\n id: '5ddc9141c35e7700383b2937',\n include: 'authors,tags',\n formats: 'html,lexical',\n },\n },\n {\n name: 'posts.read_by_slug',\n api: 'admin',\n method: 'GET',\n path: '/posts/slug/{slug}/',\n inputSchema: readBySlugParams,\n description: 'Read a single post by slug',\n example: { slug: 'my-post', include: 'authors,tags' },\n },\n {\n name: 'posts.add',\n api: 'admin',\n method: 'POST',\n path: '/posts/',\n inputSchema: addSchema,\n description: 'Create a new post',\n example: { title: 'My New Post', status: 'draft', tags: [{ name: 'News' }] },\n },\n {\n name: 'posts.edit',\n api: 'admin',\n method: 'PUT',\n path: '/posts/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing post. Requires updated_at for collision detection.',\n example: {\n id: '5ddc9141c35e7700383b2937',\n updated_at: '2024-01-01T00:00:00.000Z',\n title: 'Updated Title',\n },\n },\n {\n name: 'posts.copy',\n api: 'admin',\n method: 'POST',\n path: '/posts/{id}/copy/',\n inputSchema: copySchema,\n description: 'Copy an existing post',\n example: { id: '5ddc9141c35e7700383b2937' },\n },\n {\n name: 'posts.delete',\n api: 'admin',\n method: 'DELETE',\n path: '/posts/{id}/',\n inputSchema: deleteSchema,\n description: 'Delete a post by ID',\n example: { id: '5ddc9141c35e7700383b2937' },\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z\n .string()\n .optional()\n .describe('Comma-separated list of related data to include (e.g. \"authors,tags\")'),\n formats: z\n .string()\n .optional()\n .describe('Content formats to return: \"html\", \"lexical\", \"plaintext\" (comma-separated)'),\n filter: z.string().optional().describe('NQL filter expression'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page (default: 15, or \"all\")'),\n page: z.number().optional().describe('Page number for pagination'),\n order: z.string().optional().describe('Sort order (e.g. \"published_at DESC\")'),\n fields: z.string().optional().describe('Comma-separated list of fields to return'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Page ID'),\n include: z.string().optional().describe('Comma-separated list of related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nconst readBySlugParams = z.object({\n slug: z.string().describe('Page slug'),\n include: z.string().optional().describe('Comma-separated list of related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nconst pageWriteFields = {\n title: z.string().describe('Page title'),\n lexical: z.string().optional().describe('Page content in Lexical JSON format'),\n status: z.enum(['published', 'draft', 'scheduled']).optional().describe('Page status'),\n tags: z\n .array(z.union([z.object({ id: z.string() }), z.object({ name: z.string() })]))\n .optional()\n .describe('Tags to assign (by id or name)'),\n authors: z\n .array(z.object({ id: z.string() }))\n .optional()\n .describe('Authors to assign (by id)'),\n featured: z.boolean().optional().describe('Whether the page is featured'),\n visibility: z.string().optional().describe('Page visibility'),\n published_at: z.string().optional().describe('Publication date (ISO 8601)'),\n custom_excerpt: z.string().optional().describe('Custom excerpt'),\n meta_title: z.string().optional().describe('SEO meta title'),\n meta_description: z.string().optional().describe('SEO meta description'),\n og_image: z.string().optional().describe('Open Graph image URL'),\n og_title: z.string().optional().describe('Open Graph title'),\n og_description: z.string().optional().describe('Open Graph description'),\n twitter_image: z.string().optional().describe('Twitter card image URL'),\n twitter_title: z.string().optional().describe('Twitter card title'),\n twitter_description: z.string().optional().describe('Twitter card description'),\n codeinjection_head: z.string().optional().describe('Code injection for head'),\n codeinjection_foot: z.string().optional().describe('Code injection for footer'),\n canonical_url: z.string().optional().describe('Canonical URL'),\n feature_image: z.string().optional().describe('Feature image URL'),\n feature_image_alt: z.string().optional().describe('Feature image alt text'),\n feature_image_caption: z.string().optional().describe('Feature image caption (HTML)'),\n custom_template: z.string().optional().describe('Custom template'),\n slug: z.string().optional().describe('Custom URL slug for the page'),\n};\n\nconst addSchema = z.object({\n ...pageWriteFields,\n title: z.string().describe('Page title (required)'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Page ID (required)'),\n updated_at: z.string().describe('Last known updated_at for collision detection (required)'),\n ...pageWriteFields,\n title: z.string().optional().describe('Page title'),\n});\n\nconst copySchema = z.object({ id: z.string().describe('Page ID to copy') });\nconst deleteSchema = z.object({ id: z.string().describe('Page ID to delete') });\n\nexport const adminPageActions: ActionDefinition[] = [\n {\n name: 'pages.browse',\n api: 'admin',\n method: 'GET',\n path: '/pages/',\n inputSchema: browseParams,\n description: 'Browse all pages with filtering, pagination, and sorting',\n example: { filter: 'status:published', limit: 10 },\n },\n {\n name: 'pages.read',\n api: 'admin',\n method: 'GET',\n path: '/pages/{id}/',\n inputSchema: readParams,\n description: 'Read a single page by ID',\n },\n {\n name: 'pages.read_by_slug',\n api: 'admin',\n method: 'GET',\n path: '/pages/slug/{slug}/',\n inputSchema: readBySlugParams,\n description: 'Read a single page by slug',\n },\n {\n name: 'pages.add',\n api: 'admin',\n method: 'POST',\n path: '/pages/',\n inputSchema: addSchema,\n description: 'Create a new page',\n example: { title: 'About Us', status: 'draft' },\n },\n {\n name: 'pages.edit',\n api: 'admin',\n method: 'PUT',\n path: '/pages/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing page. Requires updated_at for collision detection.',\n },\n {\n name: 'pages.copy',\n api: 'admin',\n method: 'POST',\n path: '/pages/{id}/copy/',\n inputSchema: copySchema,\n description: 'Copy an existing page',\n },\n {\n name: 'pages.delete',\n api: 'admin',\n method: 'DELETE',\n path: '/pages/{id}/',\n inputSchema: deleteSchema,\n description: 'Delete a page by ID',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n filter: z.string().optional().describe('NQL filter expression'),\n include: z.string().optional().describe('Related data to include (e.g. \"count.posts\")'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Tag ID'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nconst tagWriteFields = {\n name: z.string().describe('Tag name'),\n slug: z.string().optional().describe('Tag slug (auto-generated from name if omitted)'),\n description: z.string().optional().describe('Tag description'),\n feature_image: z.string().optional().describe('Feature image URL'),\n visibility: z.string().optional().describe('Tag visibility (public or internal)'),\n meta_title: z.string().optional().describe('SEO meta title'),\n meta_description: z.string().optional().describe('SEO meta description'),\n og_image: z.string().optional().describe('Open Graph image URL'),\n og_title: z.string().optional().describe('Open Graph title'),\n og_description: z.string().optional().describe('Open Graph description'),\n twitter_image: z.string().optional().describe('Twitter card image URL'),\n twitter_title: z.string().optional().describe('Twitter card title'),\n twitter_description: z.string().optional().describe('Twitter card description'),\n codeinjection_head: z.string().optional().describe('Code injection for head'),\n codeinjection_foot: z.string().optional().describe('Code injection for footer'),\n canonical_url: z.string().optional().describe('Canonical URL'),\n accent_color: z.string().optional().describe('Accent color hex code'),\n};\n\nconst addSchema = z.object({\n ...tagWriteFields,\n name: z.string().describe('Tag name (required)'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Tag ID (required)'),\n updated_at: z.string().describe('Last known updated_at for collision detection (required)'),\n ...tagWriteFields,\n name: z.string().optional().describe('Tag name'),\n});\n\nconst deleteSchema = z.object({\n id: z.string().describe('Tag ID to delete'),\n});\n\nexport const adminTagActions: ActionDefinition[] = [\n {\n name: 'tags.browse',\n api: 'admin',\n method: 'GET',\n path: '/tags/',\n inputSchema: browseParams,\n description: 'Browse all tags with filtering and pagination',\n example: { limit: 'all', include: 'count.posts' },\n },\n {\n name: 'tags.read',\n api: 'admin',\n method: 'GET',\n path: '/tags/{id}/',\n inputSchema: readParams,\n description: 'Read a single tag by ID',\n },\n {\n name: 'tags.add',\n api: 'admin',\n method: 'POST',\n path: '/tags/',\n inputSchema: addSchema,\n description: 'Create a new tag',\n example: { name: 'News', description: 'Latest news articles' },\n },\n {\n name: 'tags.edit',\n api: 'admin',\n method: 'PUT',\n path: '/tags/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing tag',\n },\n {\n name: 'tags.delete',\n api: 'admin',\n method: 'DELETE',\n path: '/tags/{id}/',\n inputSchema: deleteSchema,\n description: 'Delete a tag by ID',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n filter: z.string().optional().describe('NQL filter expression (e.g. \"type:paid+active:true\")'),\n include: z\n .string()\n .optional()\n .describe('Related data to include (e.g. \"monthly_price,yearly_price,benefits\")'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Tier ID'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nconst tierWriteFields = {\n name: z.string().describe('Tier name'),\n description: z.string().optional().describe('Tier description'),\n welcome_page_url: z.string().optional().describe('URL of the welcome page for new subscribers'),\n visibility: z.enum(['public', 'none']).optional().describe('Tier visibility'),\n monthly_price: z\n .number()\n .optional()\n .describe('Monthly price in smallest currency unit (e.g. cents)'),\n yearly_price: z.number().optional().describe('Yearly price in smallest currency unit'),\n currency: z.string().optional().describe('Three-letter ISO currency code (e.g. \"usd\")'),\n benefits: z.array(z.string()).optional().describe('List of benefits for this tier'),\n trial_days: z.number().optional().describe('Number of free trial days for new subscribers'),\n};\n\nconst addSchema = z.object({\n ...tierWriteFields,\n name: z.string().describe('Tier name (required)'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Tier ID (required)'),\n ...tierWriteFields,\n name: z.string().optional().describe('Tier name'),\n});\n\nexport const adminTierActions: ActionDefinition[] = [\n {\n name: 'tiers.browse',\n api: 'admin',\n method: 'GET',\n path: '/tiers/',\n inputSchema: browseParams,\n description: 'Browse all tiers with filtering and pagination',\n example: {\n filter: 'type:paid+active:true',\n include: 'monthly_price,yearly_price,benefits',\n },\n },\n {\n name: 'tiers.read',\n api: 'admin',\n method: 'GET',\n path: '/tiers/{id}/',\n inputSchema: readParams,\n description: 'Read a single tier by ID',\n },\n {\n name: 'tiers.add',\n api: 'admin',\n method: 'POST',\n path: '/tiers/',\n inputSchema: addSchema,\n description: 'Create a new tier',\n example: { name: 'Premium', monthly_price: 500, yearly_price: 5000, currency: 'usd' },\n },\n {\n name: 'tiers.edit',\n api: 'admin',\n method: 'PUT',\n path: '/tiers/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing tier',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n filter: z.string().optional().describe('NQL filter expression'),\n include: z\n .string()\n .optional()\n .describe(\"Related data to include (e.g. 'count.posts,count.members,count.active_members')\"),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Newsletter ID'),\n});\n\nconst newsletterWriteFields = {\n name: z.string().describe('Newsletter name'),\n description: z.string().optional().describe('Newsletter description'),\n slug: z.string().optional().describe('Newsletter slug'),\n sender_name: z.string().optional().describe('Sender name in emails'),\n sender_email: z.string().optional().describe('Sender email address (must be validated)'),\n sender_reply_to: z.enum(['newsletter', 'support']).optional().describe('Reply-to address type'),\n status: z.enum(['active', 'archived']).optional().describe('Newsletter status'),\n visibility: z.string().optional().describe('Newsletter visibility'),\n subscribe_on_signup: z.boolean().optional().describe('Auto-subscribe new members'),\n sort_order: z.number().optional().describe('Sort order position'),\n header_image: z.string().optional().describe('Header image URL'),\n show_header_icon: z.boolean().optional().describe('Show site icon in header'),\n show_header_title: z.boolean().optional().describe('Show site title in header'),\n show_header_name: z.boolean().optional().describe('Show newsletter name in header'),\n title_font_category: z.enum(['serif', 'sans_serif']).optional().describe('Title font category'),\n title_alignment: z.enum(['left', 'center']).optional().describe('Title alignment'),\n show_feature_image: z.boolean().optional().describe('Show feature image in emails'),\n body_font_category: z.enum(['serif', 'sans_serif']).optional().describe('Body font category'),\n footer_content: z.string().optional().describe('Footer content (HTML)'),\n show_badge: z.boolean().optional().describe('Show Ghost badge in footer'),\n feedback_enabled: z.boolean().optional().describe('Enable email feedback/reactions'),\n show_excerpt: z.boolean().optional().describe('Show post excerpt in emails'),\n show_post_title_section: z.boolean().optional().describe('Show post title section'),\n show_comment_cta: z.boolean().optional().describe('Show comment call-to-action'),\n show_subscription_details: z.boolean().optional().describe('Show subscription details'),\n show_latest_posts: z.boolean().optional().describe('Show latest posts section'),\n show_share_button: z.boolean().optional().describe('Show share button'),\n background_color: z.string().optional().describe(\"Background color (e.g. 'light', 'dark', or hex)\"),\n post_title_color: z.string().nullable().optional().describe('Post title color (hex)'),\n button_corners: z\n .enum(['square', 'rounded', 'pill'])\n .optional()\n .describe('Button corner style'),\n button_style: z.enum(['fill', 'outline']).optional().describe('Button style'),\n title_font_weight: z\n .enum(['normal', 'medium', 'semibold', 'bold'])\n .optional()\n .describe('Title font weight'),\n link_style: z.enum(['underline', 'regular', 'bold']).optional().describe('Link style in emails'),\n image_corners: z.enum(['square', 'rounded']).optional().describe('Image corner style'),\n header_background_color: z\n .string()\n .optional()\n .describe(\"Header background color (e.g. 'transparent', hex, 'accent')\"),\n section_title_color: z.string().nullable().optional().describe('Section title color (hex)'),\n divider_color: z.string().nullable().optional().describe('Divider color (hex)'),\n button_color: z.string().optional().describe(\"Button color (e.g. 'accent', hex)\"),\n link_color: z.string().optional().describe(\"Link color (e.g. 'accent', hex)\"),\n};\n\nconst addSchema = z.object({\n ...newsletterWriteFields,\n name: z.string().describe('Newsletter name (required)'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Newsletter ID (required)'),\n ...newsletterWriteFields,\n name: z.string().optional().describe('Newsletter name'),\n});\n\nexport const adminNewsletterActions: ActionDefinition[] = [\n {\n name: 'newsletters.browse',\n api: 'admin',\n method: 'GET',\n path: '/newsletters/',\n inputSchema: browseParams,\n description: 'Browse all newsletters',\n example: { limit: 'all' },\n },\n {\n name: 'newsletters.read',\n api: 'admin',\n method: 'GET',\n path: '/newsletters/{id}/',\n inputSchema: readParams,\n description: 'Read a single newsletter by ID',\n },\n {\n name: 'newsletters.add',\n api: 'admin',\n method: 'POST',\n path: '/newsletters/',\n inputSchema: addSchema,\n description: 'Create a new newsletter',\n example: { name: 'Weekly Digest', sender_name: 'My Blog' },\n },\n {\n name: 'newsletters.edit',\n api: 'admin',\n method: 'PUT',\n path: '/newsletters/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing newsletter',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({}).describe('No parameters required');\n\nconst readParams = z.object({\n id: z.string().describe('Offer ID'),\n});\n\nconst addSchema = z.object({\n name: z.string().describe('Internal name for the offer (required)'),\n code: z.string().describe('Unique code for the offer URL (required)'),\n display_title: z.string().describe('Title shown to users (required)'),\n display_description: z.string().describe('Description shown to users (required)'),\n type: z\n .enum(['percent', 'fixed'])\n .describe('Discount type: percentage or fixed amount (required)'),\n cadence: z.enum(['month', 'year']).describe('Billing cadence the offer applies to (required)'),\n amount: z\n .number()\n .describe('Discount amount: percentage (1-100) or fixed amount in cents (required)'),\n duration: z\n .enum(['once', 'forever', 'repeating'])\n .describe('How long the discount lasts (required)'),\n duration_in_months: z.number().optional().describe('Number of months for repeating duration'),\n currency_restriction: z\n .boolean()\n .optional()\n .describe('Whether the offer is restricted to a specific currency'),\n currency: z\n .string()\n .optional()\n .describe('Three-letter ISO currency code (required for fixed type)'),\n tier: z\n .object({ id: z.string().describe('Tier ID') })\n .describe('Tier this offer applies to (required)'),\n redemption_type: z\n .enum(['signup', 'retention'])\n .optional()\n .describe('Whether the offer is for new signups or existing member retention'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Offer ID (required)'),\n name: z.string().optional().describe('Internal name'),\n});\n\nexport const adminOfferActions: ActionDefinition[] = [\n {\n name: 'offers.browse',\n api: 'admin',\n method: 'GET',\n path: '/offers/',\n inputSchema: browseParams,\n description: 'Browse all offers',\n },\n {\n name: 'offers.read',\n api: 'admin',\n method: 'GET',\n path: '/offers/{id}/',\n inputSchema: readParams,\n description: 'Read a single offer by ID',\n },\n {\n name: 'offers.add',\n api: 'admin',\n method: 'POST',\n path: '/offers/',\n inputSchema: addSchema,\n description: 'Create a new offer (discount code)',\n example: {\n name: 'Black Friday',\n code: 'black-friday',\n display_title: '20% Off',\n display_description: 'Black Friday special',\n type: 'percent',\n cadence: 'year',\n amount: 20,\n duration: 'once',\n tier: { id: 'tier-id' },\n },\n },\n {\n name: 'offers.edit',\n api: 'admin',\n method: 'PUT',\n path: '/offers/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing offer (limited fields)',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z.string().optional().describe('Related data to include (e.g. \"newsletters,labels\")'),\n filter: z.string().optional().describe('NQL filter expression (e.g. \"status:paid\")'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Member ID'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nconst memberWriteFields = {\n email: z.string().describe('Member email address'),\n name: z.string().optional().describe('Member name'),\n note: z.string().optional().describe('Private note about the member'),\n labels: z\n .array(z.union([z.object({ id: z.string() }), z.object({ name: z.string() })]))\n .optional()\n .describe('Labels to assign'),\n newsletters: z\n .array(z.object({ id: z.string() }))\n .optional()\n .describe('Newsletters to subscribe the member to'),\n comped: z.boolean().optional().describe('Whether the member has a complimentary subscription'),\n};\n\nconst addSchema = z.object({\n ...memberWriteFields,\n email: z.string().describe('Member email address (required)'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Member ID (required)'),\n ...memberWriteFields,\n email: z.string().optional().describe('Member email address'),\n});\n\nexport const adminMemberActions: ActionDefinition[] = [\n {\n name: 'members.browse',\n api: 'admin',\n method: 'GET',\n path: '/members/',\n inputSchema: browseParams,\n description: 'Browse all members with filtering and pagination',\n example: { filter: 'status:paid', include: 'newsletters', limit: 20 },\n },\n {\n name: 'members.read',\n api: 'admin',\n method: 'GET',\n path: '/members/{id}/',\n inputSchema: readParams,\n description: 'Read a single member by ID',\n },\n {\n name: 'members.add',\n api: 'admin',\n method: 'POST',\n path: '/members/',\n inputSchema: addSchema,\n description: 'Create a new member',\n example: { email: 'member@example.com', name: 'New Member', labels: [{ name: 'VIP' }] },\n },\n {\n name: 'members.edit',\n api: 'admin',\n method: 'PUT',\n path: '/members/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing member',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z.string().optional().describe('Related data to include (e.g. \"roles,count.posts\")'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('User ID'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nexport const adminUserActions: ActionDefinition[] = [\n {\n name: 'users.browse',\n api: 'admin',\n method: 'GET',\n path: '/users/',\n inputSchema: browseParams,\n description: 'Browse all users (staff members)',\n example: { include: 'roles', limit: 'all' },\n },\n {\n name: 'users.read',\n api: 'admin',\n method: 'GET',\n path: '/users/{id}/',\n inputSchema: readParams,\n description: 'Read a single user by ID',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst uploadSchema = z.object({\n file: z.string().describe('Image URL to download and upload, or base64-encoded image data'),\n ref: z.string().optional().describe('Optional reference name for the uploaded image'),\n});\n\nexport const adminImageActions: ActionDefinition[] = [\n {\n name: 'images.upload',\n api: 'admin',\n method: 'POST',\n path: '/images/upload/',\n inputSchema: uploadSchema,\n description:\n 'Upload an image to Ghost. Provide a URL (which will be downloaded) or base64-encoded image data.',\n example: { file: 'https://example.com/photo.jpg', ref: 'hero-image' },\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst uploadSchema = z.object({\n file: z.string().describe('URL to a theme ZIP file to download and upload'),\n});\n\nconst activateSchema = z.object({\n name: z.string().describe('Theme name to activate'),\n});\n\nexport const adminThemeActions: ActionDefinition[] = [\n {\n name: 'themes.upload',\n api: 'admin',\n method: 'POST',\n path: '/themes/upload/',\n inputSchema: uploadSchema,\n description: 'Upload a theme ZIP file to Ghost. Provide a URL to the ZIP file.',\n example: { file: 'https://example.com/theme.zip' },\n },\n {\n name: 'themes.activate',\n api: 'admin',\n method: 'PUT',\n path: '/themes/{name}/activate/',\n inputSchema: activateSchema,\n description: 'Activate an installed theme by name',\n example: { name: 'casper' },\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst webhookEvents = z.enum([\n 'site.changed',\n 'post.added',\n 'post.deleted',\n 'post.edited',\n 'post.published',\n 'post.published.edited',\n 'post.unpublished',\n 'post.scheduled',\n 'post.unscheduled',\n 'post.rescheduled',\n 'page.added',\n 'page.deleted',\n 'page.edited',\n 'page.published',\n 'page.published.edited',\n 'page.unpublished',\n 'page.scheduled',\n 'page.unscheduled',\n 'page.rescheduled',\n 'tag.added',\n 'tag.edited',\n 'tag.deleted',\n 'post.tag.attached',\n 'post.tag.detached',\n 'page.tag.attached',\n 'page.tag.detached',\n 'member.added',\n 'member.edited',\n 'member.deleted',\n]);\n\nconst addSchema = z.object({\n event: webhookEvents.describe('Webhook event to listen for (required)'),\n target_url: z.string().describe('URL to receive webhook POST requests (required)'),\n name: z.string().optional().describe('Human-readable name for the webhook'),\n secret: z.string().optional().describe('Shared secret for HMAC signature verification'),\n api_version: z.string().optional().describe('Target API version'),\n integration_id: z.string().optional().describe('Associated integration ID'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Webhook ID (required)'),\n event: webhookEvents.optional().describe('Webhook event'),\n target_url: z.string().optional().describe('URL to receive webhook POST requests'),\n name: z.string().optional().describe('Human-readable name'),\n secret: z.string().optional().describe('Shared secret for HMAC verification'),\n api_version: z.string().optional().describe('Target API version'),\n integration_id: z.string().optional().describe('Associated integration ID'),\n});\n\nconst deleteSchema = z.object({\n id: z.string().describe('Webhook ID to delete'),\n});\n\nexport const adminWebhookActions: ActionDefinition[] = [\n {\n name: 'webhooks.add',\n api: 'admin',\n method: 'POST',\n path: '/webhooks/',\n inputSchema: addSchema,\n description: 'Create a new webhook',\n example: {\n event: 'post.published',\n target_url: 'https://example.com/webhook',\n name: 'Post published',\n },\n },\n {\n name: 'webhooks.edit',\n api: 'admin',\n method: 'PUT',\n path: '/webhooks/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing webhook',\n },\n {\n name: 'webhooks.delete',\n api: 'admin',\n method: 'DELETE',\n path: '/webhooks/{id}/',\n inputSchema: deleteSchema,\n description: 'Delete a webhook by ID',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst readParams = z.object({}).describe('No parameters required');\n\nexport const adminSiteActions: ActionDefinition[] = [\n {\n name: 'site.read',\n api: 'admin',\n method: 'GET',\n path: '/site/',\n inputSchema: readParams,\n description: 'Read site configuration and metadata',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z\n .string()\n .optional()\n .describe('Comma-separated list of related data (e.g. \"authors,tags\")'),\n formats: z\n .string()\n .optional()\n .describe('Content formats: \"html\", \"plaintext\" (comma-separated)'),\n filter: z.string().optional().describe('NQL filter expression (e.g. \"tag:news+featured:true\")'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page (default: 15, max: 100, or \"all\")'),\n page: z.number().optional().describe('Page number for pagination'),\n order: z.string().optional().describe('Sort order (e.g. \"published_at DESC\")'),\n fields: z.string().optional().describe('Comma-separated list of fields to return'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Post ID'),\n include: z.string().optional().describe('Related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nconst readBySlugParams = z.object({\n slug: z.string().describe('Post slug'),\n include: z.string().optional().describe('Related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nexport const contentPostActions: ActionDefinition[] = [\n {\n name: 'posts.browse',\n api: 'content',\n method: 'GET',\n path: '/posts/',\n inputSchema: browseParams,\n description: 'Browse published posts (Content API — read-only)',\n example: { filter: 'tag:news', include: 'authors,tags', limit: 10 },\n },\n {\n name: 'posts.read',\n api: 'content',\n method: 'GET',\n path: '/posts/{id}/',\n inputSchema: readParams,\n description: 'Read a published post by ID (Content API)',\n },\n {\n name: 'posts.read_by_slug',\n api: 'content',\n method: 'GET',\n path: '/posts/slug/{slug}/',\n inputSchema: readBySlugParams,\n description: 'Read a published post by slug (Content API)',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z\n .string()\n .optional()\n .describe('Comma-separated list of related data (e.g. \"authors,tags\")'),\n formats: z\n .string()\n .optional()\n .describe('Content formats: \"html\", \"plaintext\" (comma-separated)'),\n filter: z.string().optional().describe('NQL filter expression'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n fields: z.string().optional().describe('Comma-separated list of fields to return'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Page ID'),\n include: z.string().optional().describe('Related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nconst readBySlugParams = z.object({\n slug: z.string().describe('Page slug'),\n include: z.string().optional().describe('Related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nexport const contentPageActions: ActionDefinition[] = [\n {\n name: 'pages.browse',\n api: 'content',\n method: 'GET',\n path: '/pages/',\n inputSchema: browseParams,\n description: 'Browse published pages (Content API — read-only)',\n },\n {\n name: 'pages.read',\n api: 'content',\n method: 'GET',\n path: '/pages/{id}/',\n inputSchema: readParams,\n description: 'Read a published page by ID (Content API)',\n },\n {\n name: 'pages.read_by_slug',\n api: 'content',\n method: 'GET',\n path: '/pages/slug/{slug}/',\n inputSchema: readBySlugParams,\n description: 'Read a published page by slug (Content API)',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z.string().optional().describe('Related data to include (e.g. \"count.posts\")'),\n filter: z.string().optional().describe('NQL filter expression'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n fields: z.string().optional().describe('Comma-separated list of fields to return'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Tag ID'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nconst readBySlugParams = z.object({\n slug: z.string().describe('Tag slug'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nexport const contentTagActions: ActionDefinition[] = [\n {\n name: 'tags.browse',\n api: 'content',\n method: 'GET',\n path: '/tags/',\n inputSchema: browseParams,\n description: 'Browse all tags (Content API — read-only)',\n example: { include: 'count.posts', limit: 'all' },\n },\n {\n name: 'tags.read',\n api: 'content',\n method: 'GET',\n path: '/tags/{id}/',\n inputSchema: readParams,\n description: 'Read a tag by ID (Content API)',\n },\n {\n name: 'tags.read_by_slug',\n api: 'content',\n method: 'GET',\n path: '/tags/slug/{slug}/',\n inputSchema: readBySlugParams,\n description: 'Read a tag by slug (Content API)',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z.string().optional().describe('Related data to include (e.g. \"count.posts\")'),\n filter: z.string().optional().describe('NQL filter expression'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n fields: z.string().optional().describe('Comma-separated list of fields to return'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Author ID'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nconst readBySlugParams = z.object({\n slug: z.string().describe('Author slug'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nexport const contentAuthorActions: ActionDefinition[] = [\n {\n name: 'authors.browse',\n api: 'content',\n method: 'GET',\n path: '/authors/',\n inputSchema: browseParams,\n description: 'Browse all authors (Content API — read-only)',\n example: { include: 'count.posts' },\n },\n {\n name: 'authors.read',\n api: 'content',\n method: 'GET',\n path: '/authors/{id}/',\n inputSchema: readParams,\n description: 'Read an author by ID (Content API)',\n },\n {\n name: 'authors.read_by_slug',\n api: 'content',\n method: 'GET',\n path: '/authors/slug/{slug}/',\n inputSchema: readBySlugParams,\n description: 'Read an author by slug (Content API)',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z\n .string()\n .optional()\n .describe('Related data to include (e.g. \"monthly_price,yearly_price,benefits\")'),\n filter: z\n .string()\n .optional()\n .describe('NQL filter expression (e.g. \"type:paid+active:true+visibility:public\")'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n});\n\nexport const contentTierActions: ActionDefinition[] = [\n {\n name: 'tiers.browse',\n api: 'content',\n method: 'GET',\n path: '/tiers/',\n inputSchema: browseParams,\n description: 'Browse all tiers (Content API — read-only)',\n example: { include: 'monthly_price,yearly_price,benefits' },\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst readParams = z.object({}).describe('No parameters required');\n\nexport const contentSettingsActions: ActionDefinition[] = [\n {\n name: 'settings.read',\n api: 'content',\n method: 'GET',\n path: '/settings/',\n inputSchema: readParams,\n description: 'Read site settings (Content API — read-only)',\n },\n];\n","import { z } from 'zod';\n\n// Admin actions\nimport { adminPostActions } from './admin/posts.js';\nimport { adminPageActions } from './admin/pages.js';\nimport { adminTagActions } from './admin/tags.js';\nimport { adminTierActions } from './admin/tiers.js';\nimport { adminNewsletterActions } from './admin/newsletters.js';\nimport { adminOfferActions } from './admin/offers.js';\nimport { adminMemberActions } from './admin/members.js';\nimport { adminUserActions } from './admin/users.js';\nimport { adminImageActions } from './admin/images.js';\nimport { adminThemeActions } from './admin/themes.js';\nimport { adminWebhookActions } from './admin/webhooks.js';\nimport { adminSiteActions } from './admin/site.js';\n\n// Content actions\nimport { contentPostActions } from './content/posts.js';\nimport { contentPageActions } from './content/pages.js';\nimport { contentTagActions } from './content/tags.js';\nimport { contentAuthorActions } from './content/authors.js';\nimport { contentTierActions } from './content/tiers.js';\nimport { contentSettingsActions } from './content/settings.js';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';\nexport type ApiType = 'admin' | 'content';\n\nexport interface ActionDefinition {\n name: string;\n api: ApiType;\n method: HttpMethod;\n path: string;\n inputSchema: z.ZodType;\n description: string;\n example?: Record<string, unknown>;\n}\n\nconst registry = new Map<string, ActionDefinition>();\n\nexport function registerAction(action: ActionDefinition): void {\n registry.set(`${action.api}:${action.name}`, action);\n}\n\nexport function registerActions(actions: ActionDefinition[]): void {\n for (const action of actions) {\n registerAction(action);\n }\n}\n\nexport function getAction(name: string, api?: ApiType): ActionDefinition | undefined {\n if (api) {\n return registry.get(`${api}:${name}`);\n }\n // Try admin first, then content\n return registry.get(`admin:${name}`) || registry.get(`content:${name}`);\n}\n\nexport function listActions(api?: ApiType): ActionDefinition[] {\n const actions = Array.from(registry.values());\n if (api) {\n return actions.filter((a) => a.api === api);\n }\n return actions;\n}\n\nfunction unwrapZodType(field: z.ZodType): z.ZodType {\n if (field instanceof z.ZodOptional || field instanceof z.ZodNullable) {\n return unwrapZodType((field as z.ZodOptional<z.ZodType> | z.ZodNullable<z.ZodType>)._def.innerType);\n }\n if (field instanceof z.ZodDefault) {\n return unwrapZodType((field as z.ZodDefault<z.ZodType>)._def.innerType);\n }\n return field;\n}\n\nfunction describeZodType(field: z.ZodType): string {\n const inner = unwrapZodType(field);\n\n if (inner instanceof z.ZodEnum) {\n const values = (inner._def as z.ZodEnumDef).values as string[];\n return `values: ${values.map((v) => `\\`${v}\\``).join(', ')}`;\n }\n\n if (inner instanceof z.ZodObject) {\n const shape = inner.shape as Record<string, z.ZodType>;\n const fields = Object.entries(shape).map(([k, v]) => {\n const t = describeZodType(v);\n return t ? `${k}${t.startsWith('values:') ? ` (${t})` : `: ${t}`}` : k;\n });\n return `object: { ${fields.join(', ')} }`;\n }\n\n if (inner instanceof z.ZodArray) {\n const itemType = describeZodType((inner._def as z.ZodArrayDef).type);\n return itemType ? `array of [${itemType}]` : 'array';\n }\n\n if (inner instanceof z.ZodUnion) {\n const options = (inner._def as z.ZodUnionDef).options as z.ZodType[];\n const parts = options.map((o) => describeZodType(o)).filter(Boolean);\n return parts.length > 0 ? parts.join(' | ') : '';\n }\n\n if (inner instanceof z.ZodLiteral) {\n return `\\`${String((inner._def as z.ZodLiteralDef).value)}\\``;\n }\n\n if (inner instanceof z.ZodString) return 'string';\n if (inner instanceof z.ZodNumber) return 'number';\n if (inner instanceof z.ZodBoolean) return 'boolean';\n\n return '';\n}\n\nexport function getActionHelp(name: string, api?: ApiType): string | undefined {\n const action = getAction(name, api);\n if (!action) {\n return undefined;\n }\n\n const schema = action.inputSchema;\n const lines: string[] = [\n `## ${action.name}`,\n '',\n action.description,\n '',\n `- **API:** ${action.api}`,\n `- **Method:** ${action.method}`,\n `- **Path:** ${action.path}`,\n '',\n ];\n\n // Extract schema info\n if (schema instanceof z.ZodObject) {\n lines.push('### Parameters', '');\n const shape = schema.shape as Record<string, z.ZodType>;\n for (const [key, field] of Object.entries(shape)) {\n const isOptional = field.isOptional();\n const desc = field.description || '';\n const typeInfo = describeZodType(field);\n const suffix = typeInfo ? ` — ${typeInfo}` : '';\n lines.push(`- **${key}**${isOptional ? ' (optional)' : ' (required)'}: ${desc}${suffix}`);\n }\n lines.push('');\n }\n\n if (action.example) {\n lines.push(\n '### Example Payload',\n '',\n '```json',\n JSON.stringify(action.example, null, 2),\n '```',\n '',\n );\n }\n\n return lines.join('\\n');\n}\n\n// Register all actions\nfunction initRegistry(): void {\n const allActions = [\n ...adminPostActions,\n ...adminPageActions,\n ...adminTagActions,\n ...adminTierActions,\n ...adminNewsletterActions,\n ...adminOfferActions,\n ...adminMemberActions,\n ...adminUserActions,\n ...adminImageActions,\n ...adminThemeActions,\n ...adminWebhookActions,\n ...adminSiteActions,\n ...contentPostActions,\n ...contentPageActions,\n ...contentTagActions,\n ...contentAuthorActions,\n ...contentTierActions,\n ...contentSettingsActions,\n ];\n registerActions(allActions);\n}\n\ninitRegistry();\n","import { z } from 'zod';\nimport { attempt } from '@logosdx/utils';\nimport { get as fetchGet } from '@logosdx/fetch';\nimport mimeDb from 'mime-db';\nimport { adminApi, contentApi } from '../ghost-client.js';\nimport { getAction } from '../actions/registry.js';\nimport type { ApiType } from '../actions/registry.js';\n\nconst extToMime: Record<string, string> = {};\nfor (const [mime, meta] of Object.entries(mimeDb)) {\n for (const ext of (meta as any).extensions ?? []) {\n extToMime[`.${ext}`] = mime;\n }\n}\n\nexport const useGhostApiSchema = z.object({\n api: z\n .enum(['admin', 'content'])\n .describe('Which API to use: \"admin\" for full access, \"content\" for read-only public data'),\n action: z.string().describe('Action to execute (e.g. \"posts.browse\", \"members.add\")'),\n payload: z\n .record(z.unknown())\n .optional()\n .describe(\n 'Action payload — fields depend on the action. Use ghost_api_help to see available fields.',\n ),\n});\n\nexport type UseGhostApiInput = z.infer<typeof useGhostApiSchema>;\n\nconst PATH_PARAMS = ['id', 'slug', 'name'] as const;\n\nfunction getUsedPathParams(template: string): Set<string> {\n const used = new Set<string>();\n for (const param of PATH_PARAMS) {\n if (template.includes(`{${param}}`)) {\n used.add(param);\n }\n }\n return used;\n}\n\nfunction buildPath(template: string, payload: Record<string, unknown>): string {\n let path = template;\n for (const param of PATH_PARAMS) {\n const placeholder = `{${param}}`;\n if (path.includes(placeholder) && payload[param]) {\n path = path.replace(placeholder, encodeURIComponent(String(payload[param])));\n }\n }\n return path;\n}\n\nfunction extractQueryParams(\n payload: Record<string, unknown>,\n usedPathParams: Set<string>,\n): Record<string, string> {\n const params: Record<string, string> = {};\n for (const [key, value] of Object.entries(payload)) {\n if (usedPathParams.has(key)) {\n continue;\n }\n if (value !== undefined && value !== null) {\n params[key] = String(value);\n }\n }\n return params;\n}\n\nfunction extractBodyPayload(\n payload: Record<string, unknown>,\n usedPathParams: Set<string>,\n): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(payload)) {\n if (usedPathParams.has(key)) {\n continue;\n }\n if (value !== undefined) {\n body[key] = value;\n }\n }\n return body;\n}\n\nexport async function handleUseGhostApi(input: UseGhostApiInput, mode: string): Promise<string> {\n const { api, action, payload = {} } = input;\n\n // Validate mode restrictions\n if (mode === 'content' && api === 'admin') {\n return JSON.stringify({\n error: 'Admin API is not available in content mode. Set GHOST_API_MODE=admin and provide GHOST_ADMIN_API_KEY to use admin actions.',\n });\n }\n\n // Look up the action\n const actionDef = getAction(action, api as ApiType);\n if (!actionDef) {\n return JSON.stringify({\n error: `Unknown action \"${action}\" for ${api} API. Use ghost_api_help to see available actions.`,\n });\n }\n\n // Validate payload\n const validation = actionDef.inputSchema.safeParse(payload);\n if (!validation.success) {\n return JSON.stringify({\n error: 'Invalid payload',\n details: validation.error.issues.map((i) => ({\n path: i.path.join('.'),\n message: i.message,\n })),\n });\n }\n\n const validPayload = validation.data as Record<string, unknown>;\n const engine = api === 'admin' ? adminApi : contentApi;\n const usedPathParams = getUsedPathParams(actionDef.path);\n const path = buildPath(actionDef.path, validPayload);\n\n // Handle special cases: image/theme upload\n if (actionDef.name === 'images.upload' || actionDef.name === 'themes.upload') {\n return await handleFileUpload(actionDef.name, validPayload, path);\n }\n\n if (actionDef.method === 'GET') {\n const queryParams = extractQueryParams(validPayload, usedPathParams);\n const [response, err] = await attempt(async () =>\n engine.get(path, { params: queryParams }),\n );\n if (err) {\n return JSON.stringify({ error: err.message });\n }\n return JSON.stringify(response);\n }\n\n if (actionDef.method === 'DELETE') {\n const [response, err] = await attempt(async () => engine.delete(path));\n if (err) {\n return JSON.stringify({ error: err.message });\n }\n const resourcePrefix = `/${actionDef.name.split('.')[0]}`;\n await engine.invalidatePath(resourcePrefix);\n return JSON.stringify(response ?? { success: true });\n }\n\n // POST or PUT — build body wrapped in resource key\n const resourceKey = actionDef.name.split('.')[0];\n const body = extractBodyPayload(validPayload, usedPathParams);\n const wrappedBody = { [resourceKey]: [body] };\n\n if (actionDef.method === 'POST') {\n const [response, err] = await attempt(async () => engine.post(path, wrappedBody));\n if (err) {\n return JSON.stringify({ error: err.message });\n }\n return JSON.stringify(response);\n }\n\n if (actionDef.method === 'PUT') {\n const [response, err] = await attempt(async () => engine.put(path, wrappedBody));\n if (err) {\n return JSON.stringify({ error: err.message });\n }\n const resourcePrefix = `/${actionDef.name.split('.')[0]}`;\n await engine.invalidatePath(resourcePrefix);\n return JSON.stringify(response);\n }\n\n return JSON.stringify({ error: `Unsupported method: ${actionDef.method}` });\n}\n\nasync function handleFileUpload(\n actionName: string,\n payload: Record<string, unknown>,\n path: string,\n): Promise<string> {\n const fileInput = payload.file as string;\n const ref = payload.ref as string | undefined;\n\n // Download file if URL\n let fileBuffer: Buffer;\n let filename: string;\n\n if (fileInput.startsWith('http://') || fileInput.startsWith('https://')) {\n const [response, err] = await attempt(async () => fetchGet(fileInput).arrayBuffer());\n if (err) {\n return JSON.stringify({ error: `Failed to download file: ${err.message}` });\n }\n fileBuffer = Buffer.from(response!.data);\n const urlPath = new URL(fileInput).pathname;\n filename =\n urlPath.split('/').pop() ||\n (actionName === 'images.upload' ? 'image.jpg' : 'theme.zip');\n } else {\n // Base64\n fileBuffer = Buffer.from(fileInput, 'base64');\n filename = actionName === 'images.upload' ? 'image.jpg' : 'theme.zip';\n }\n\n // Build multipart form\n const ext = filename.includes('.')\n ? filename.slice(filename.lastIndexOf('.')).toLowerCase()\n : '';\n const mimeType = extToMime[ext] || 'application/octet-stream';\n\n const formData = new FormData();\n const blob = new Blob([new Uint8Array(fileBuffer)], { type: mimeType });\n formData.append('file', blob, filename);\n if (ref) {\n formData.append('ref', ref);\n }\n\n const [response, err] = await attempt(async () =>\n adminApi.post(path, formData, {\n onBeforeReq: (opts) => {\n delete opts.headers!['Content-Type'];\n },\n }),\n );\n if (err) {\n return JSON.stringify({ error: err.message });\n }\n return JSON.stringify(response);\n}\n","import { z } from 'zod';\nimport { listActions, getActionHelp } from '../actions/registry.js';\nimport type { ApiType } from '../actions/registry.js';\n\nexport const ghostApiHelpSchema = z.object({\n action: z\n .string()\n .optional()\n .describe(\n 'Specific action name to get detailed help for (e.g. \"posts.add\"). Omit to see all available actions.',\n ),\n api: z.enum(['admin', 'content']).optional().describe('Filter actions by API type'),\n});\n\nexport type GhostApiHelpInput = z.infer<typeof ghostApiHelpSchema>;\n\nexport function handleGhostApiHelp(input: GhostApiHelpInput): string {\n const { action, api } = input;\n\n if (action) {\n const help = getActionHelp(action, api as ApiType | undefined);\n if (!help) {\n return `Unknown action \"${action}\". Use ghost_api_help without arguments to see all available actions.`;\n }\n return help;\n }\n\n // List all actions grouped by resource and API\n const actions = listActions(api as ApiType | undefined);\n const grouped: Record<string, Record<string, typeof actions>> = {};\n\n for (const a of actions) {\n if (!grouped[a.api]) {\n grouped[a.api] = {};\n }\n const resource = a.name.split('.')[0];\n if (!grouped[a.api][resource]) {\n grouped[a.api][resource] = [];\n }\n grouped[a.api][resource].push(a);\n }\n\n const lines: string[] = ['# Ghost API Actions', ''];\n\n for (const [apiType, resources] of Object.entries(grouped)) {\n lines.push(`## ${apiType.charAt(0).toUpperCase() + apiType.slice(1)} API`, '');\n for (const [resource, resourceActions] of Object.entries(resources)) {\n lines.push(`### ${resource}`);\n for (const a of resourceActions) {\n lines.push(`- **${a.name}** — ${a.description}`);\n }\n lines.push('');\n }\n }\n\n lines.push(\n '---',\n '',\n 'Use `ghost_api_help` with `action` parameter for detailed schema info on any action.',\n );\n return lines.join('\\n');\n}\n","import { z } from 'zod';\nimport { attempt } from '@logosdx/utils';\nimport { docsApi } from '../ghost-client.js';\n\nexport const ghostDocsSchema = z.object({\n all: z.boolean().optional().describe('Return the full Ghost documentation (llms.txt)'),\n search: z\n .string()\n .optional()\n .describe('Case-insensitive substring search across the documentation'),\n regex: z.string().optional().describe('Regex pattern string to match (e.g. \"/pattern/i\")'),\n});\n\nexport type GhostDocsInput = z.infer<typeof ghostDocsSchema>;\n\nasync function fetchDocs(): Promise<string> {\n const [response, err] = await attempt(async () => docsApi.get('/llms.txt'));\n if (err) {\n throw new Error(`Failed to fetch Ghost docs: ${err.message}`);\n }\n return response!.data as string;\n}\n\nexport async function handleGhostDocs(input: GhostDocsInput): Promise<string> {\n const { all, search, regex } = input;\n\n if (!all && !search && !regex) {\n return 'Provide one of: `all: true` to get full docs, `search` for text search, or `regex` for pattern matching.';\n }\n\n let content: string;\n try {\n content = await fetchDocs();\n } catch (error) {\n return `Error: ${(error as Error).message}`;\n }\n\n if (all) {\n return content;\n }\n\n const lines = content.split('\\n');\n const matchedLines: string[] = [];\n\n if (search) {\n const searchLower = search.toLowerCase();\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].toLowerCase().includes(searchLower)) {\n // Include context: 1 line before and after\n const start = Math.max(0, i - 1);\n const end = Math.min(lines.length - 1, i + 1);\n for (let j = start; j <= end; j++) {\n const line = `${j + 1}: ${lines[j]}`;\n if (!matchedLines.includes(line)) {\n matchedLines.push(line);\n }\n }\n }\n }\n }\n\n if (regex) {\n // Parse regex string: /pattern/flags or just pattern\n let pattern: RegExp;\n const regexMatch = regex.match(/^\\/(.+)\\/([gimsuy]*)$/);\n if (regexMatch) {\n pattern = new RegExp(regexMatch[1], regexMatch[2]);\n } else {\n pattern = new RegExp(regex);\n }\n\n for (let i = 0; i < lines.length; i++) {\n if (pattern.test(lines[i])) {\n const start = Math.max(0, i - 1);\n const end = Math.min(lines.length - 1, i + 1);\n for (let j = start; j <= end; j++) {\n const line = `${j + 1}: ${lines[j]}`;\n if (!matchedLines.includes(line)) {\n matchedLines.push(line);\n }\n }\n }\n }\n }\n\n if (matchedLines.length === 0) {\n return 'No matches found.';\n }\n\n return matchedLines.join('\\n');\n}\n","#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { useGhostApiSchema, handleUseGhostApi } from './tools/use-ghost-api.js';\nimport { ghostApiHelpSchema, handleGhostApiHelp } from './tools/ghost-api-help.js';\nimport { ghostDocsSchema, handleGhostDocs } from './tools/ghost-docs.js';\n\nconst GHOST_API_MODE = process.env.GHOST_API_MODE || 'admin';\n\nconst server = new McpServer({\n name: 'ghost-mcp',\n version: '0.1.0',\n});\n\nserver.tool(\n 'use_ghost_api',\n 'Execute a Ghost API action (browse, read, add, edit, delete posts, pages, tags, members, newsletters, and more)',\n useGhostApiSchema.shape,\n async ({ api, action, payload }) => {\n const result = await handleUseGhostApi({ api, action, payload }, GHOST_API_MODE);\n return { content: [{ type: 'text' as const, text: result }] };\n },\n);\n\nserver.tool(\n 'ghost_api_help',\n 'Get help on available Ghost API actions — list all actions or get detailed schema info for a specific action',\n ghostApiHelpSchema.shape,\n async ({ action, api }) => {\n const result = handleGhostApiHelp({ action, api });\n return { content: [{ type: 'text' as const, text: result }] };\n },\n);\n\nserver.tool(\n 'ghost_docs',\n 'Search Ghost CMS documentation — fetch full docs, search by text, or match with regex',\n ghostDocsSchema.shape,\n async ({ all, search, regex }) => {\n const result = await handleGhostDocs({ all, search, regex });\n return { content: [{ type: 'text' as const, text: result }] };\n },\n);\n\nasync function main(): Promise<void> {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["globalFetchConfig","browseParams","readParams","readBySlugParams","addSchema","editSchema","copySchema","deleteSchema","browseParams","readParams","readBySlugParams","addSchema","editSchema","deleteSchema","browseParams","readParams","addSchema","editSchema","deleteSchema","browseParams","readParams","addSchema","editSchema","browseParams","readParams","addSchema","editSchema","browseParams","readParams","addSchema","editSchema","browseParams","readParams","addSchema","editSchema","browseParams","readParams","uploadSchema","readParams","browseParams","readParams","readBySlugParams","browseParams","readParams","readBySlugParams","browseParams","readParams","readBySlugParams","browseParams","readParams","fetchGet"],"sources":["../src/ghost-client.ts","../src/actions/admin/posts.ts","../src/actions/admin/pages.ts","../src/actions/admin/tags.ts","../src/actions/admin/tiers.ts","../src/actions/admin/newsletters.ts","../src/actions/admin/offers.ts","../src/actions/admin/members.ts","../src/actions/admin/users.ts","../src/actions/admin/images.ts","../src/actions/admin/themes.ts","../src/actions/admin/webhooks.ts","../src/actions/admin/site.ts","../src/actions/content/posts.ts","../src/actions/content/pages.ts","../src/actions/content/tags.ts","../src/actions/content/authors.ts","../src/actions/content/tiers.ts","../src/actions/content/settings.ts","../src/actions/registry.ts","../src/koenig/util.ts","../src/tools/use-ghost-api.ts","../src/tools/ghost-api-help.ts","../src/tools/ghost-docs.ts","../src/koenig/inline.ts","../src/koenig/node-specs.ts","../src/koenig/cards.ts","../src/koenig/blocks.ts","../src/koenig/compose.ts","../src/koenig/help.ts","../src/tools/blocks-source.ts","../src/tools/compose-post.ts","../src/tools/compose-lexical.ts","../src/tools/koenig-help.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import { FetchEngine, config as globalFetchConfig } from '@logosdx/fetch';\nimport type { FetchError } from '@logosdx/fetch';\nimport jwt from 'jsonwebtoken';\n\nconst GHOST_URL = process.env.GHOST_URL || '';\nconst GHOST_ADMIN_API_KEY = process.env.GHOST_ADMIN_API_KEY || '';\nconst GHOST_CONTENT_API_KEY = process.env.GHOST_CONTENT_API_KEY || '';\nconst GHOST_API_VERSION = process.env.GHOST_API_VERSION || 'v6.0';\nconst GHOST_RATE_LIMIT = Number(process.env.GHOST_RATE_LIMIT) || 50;\n\nfunction generateAdminToken(): string {\n const [id, secret] = GHOST_ADMIN_API_KEY.split(':');\n const token = jwt.sign({}, Buffer.from(secret, 'hex'), {\n keyid: id,\n algorithm: 'HS256',\n expiresIn: '5m',\n audience: '/admin/',\n });\n return token;\n}\n\nconst resilience = {\n attemptTimeout: 15000,\n totalTimeout: 45000,\n\n retry: {\n maxAttempts: 3,\n baseDelay: 1000,\n maxDelay: 10000,\n useExponentialBackoff: true,\n retryableStatusCodes: [408, 429, 500, 502, 503, 504],\n shouldRetry: (error: FetchError, _attempt: number) => {\n if (error.status === 429) {\n const retryAfter = error.headers?.['retry-after'];\n return retryAfter ? parseInt(retryAfter as string) * 1000 : 5000;\n }\n if (error.status >= 400 && error.status < 500) {\n return false;\n }\n return true;\n },\n },\n\n cachePolicy: {\n enabled: true,\n methods: ['GET'] as const,\n ttl: 3_600_000,\n staleIn: 10_000,\n },\n\n dedupePolicy: true as const,\n\n rateLimitPolicy: {\n maxCalls: GHOST_RATE_LIMIT,\n windowMs: 60_000,\n waitForToken: true,\n },\n};\n\nexport const adminApi = new FetchEngine({\n baseUrl: `${GHOST_URL}/ghost/api/admin`,\n defaultType: 'json',\n headers: {\n 'Accept-Version': GHOST_API_VERSION,\n 'Content-Type': 'application/json',\n Authorization: `Ghost ${generateAdminToken()}`,\n },\n ...resilience,\n});\n\nadminApi.hooks.add('beforeRequest', (url, opts) => {\n opts.headers.Authorization = `Ghost ${generateAdminToken()}`;\n});\n\nexport const contentApi = new FetchEngine({\n baseUrl: `${GHOST_URL}/ghost/api/content`,\n defaultType: 'json',\n headers: {\n 'Accept-Version': GHOST_API_VERSION,\n 'Content-Type': 'application/json',\n },\n params: {\n key: GHOST_CONTENT_API_KEY,\n },\n ...resilience,\n});\n\nexport const docsApi = new FetchEngine({\n baseUrl: 'https://docs.ghost.org',\n defaultType: 'text',\n attemptTimeout: 15000,\n totalTimeout: 45000,\n retry: {\n maxAttempts: 3,\n baseDelay: 1000,\n maxDelay: 10000,\n useExponentialBackoff: true,\n },\n cachePolicy: {\n enabled: true,\n methods: ['GET'] as const,\n ttl: 3_600_000,\n staleIn: 10_000,\n },\n dedupePolicy: true as const,\n});\n\n// Configure global fetch instance for raw downloads (image/theme uploads)\n// No auth, no cache — just retry and dedupe\nglobalFetchConfig.set({\n attemptTimeout: 15000,\n totalTimeout: 45000,\n retry: {\n maxAttempts: 3,\n baseDelay: 1000,\n maxDelay: 10000,\n useExponentialBackoff: true,\n },\n dedupePolicy: true,\n});\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z\n .string()\n .optional()\n .describe('Comma-separated list of related data to include (e.g. \"authors,tags\")'),\n formats: z\n .string()\n .optional()\n .describe('Content formats to return: \"html\", \"lexical\", \"plaintext\" (comma-separated)'),\n filter: z\n .string()\n .optional()\n .describe('NQL filter expression (e.g. \"status:published+tag:news\")'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page (default: 15, or \"all\")'),\n page: z.number().optional().describe('Page number for pagination'),\n order: z.string().optional().describe('Sort order (e.g. \"published_at DESC\")'),\n fields: z.string().optional().describe('Comma-separated list of fields to return'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Post ID'),\n include: z.string().optional().describe('Comma-separated list of related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nconst readBySlugParams = z.object({\n slug: z.string().describe('Post slug'),\n include: z.string().optional().describe('Comma-separated list of related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nconst postWriteFields = {\n title: z.string().describe('Post title'),\n lexical: z.string().optional().describe('Post content in Lexical JSON format'),\n status: z.enum(['published', 'draft', 'scheduled']).optional().describe('Post status'),\n tags: z\n .array(z.union([z.string(), z.object({ id: z.string() }), z.object({ name: z.string() })]))\n .optional()\n .describe('Tags to assign — a tag name string, or an object { id } or { name }'),\n authors: z\n .array(z.object({ id: z.string() }))\n .optional()\n .describe('Authors to assign (by id)'),\n featured: z.boolean().optional().describe('Whether the post is featured'),\n visibility: z.string().optional().describe('Post visibility (public, members, paid, tiers)'),\n published_at: z.string().optional().describe('Publication date (ISO 8601 format)'),\n custom_excerpt: z.string().optional().describe('Custom excerpt for the post'),\n meta_title: z.string().optional().describe('SEO meta title'),\n meta_description: z.string().optional().describe('SEO meta description'),\n og_image: z.string().optional().describe('Open Graph image URL'),\n og_title: z.string().optional().describe('Open Graph title'),\n og_description: z.string().optional().describe('Open Graph description'),\n twitter_image: z.string().optional().describe('Twitter card image URL'),\n twitter_title: z.string().optional().describe('Twitter card title'),\n twitter_description: z.string().optional().describe('Twitter card description'),\n codeinjection_head: z.string().optional().describe('Code injection for the post head'),\n codeinjection_foot: z.string().optional().describe('Code injection for the post footer'),\n canonical_url: z.string().optional().describe('Canonical URL for the post'),\n feature_image: z.string().optional().describe('Feature image URL'),\n feature_image_alt: z.string().optional().describe('Feature image alt text'),\n feature_image_caption: z.string().optional().describe('Feature image caption (HTML)'),\n custom_template: z.string().optional().describe('Custom template for the post'),\n newsletter: z.object({ id: z.string() }).optional().describe('Newsletter to send the post to'),\n email_subject: z\n .string()\n .optional()\n .describe('Custom email subject when sending as newsletter'),\n slug: z.string().optional().describe('Custom URL slug for the post'),\n email_only: z.boolean().optional().describe('Whether the post is email-only (not published to web)'),\n email_segment: z\n .string()\n .optional()\n .describe(\"NQL filter for email recipient segment (e.g. 'status:free', 'status:-free')\"),\n};\n\nconst addSchema = z.object({\n ...postWriteFields,\n title: z.string().describe('Post title (required)'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Post ID (required)'),\n updated_at: z\n .string()\n .describe('Last known updated_at value for collision detection (required)'),\n ...postWriteFields,\n title: z.string().optional().describe('Post title'),\n});\n\nconst copySchema = z.object({\n id: z.string().describe('Post ID to copy'),\n});\n\nconst deleteSchema = z.object({\n id: z.string().describe('Post ID to delete'),\n});\n\nexport const adminPostActions: ActionDefinition[] = [\n {\n name: 'posts.browse',\n api: 'admin',\n method: 'GET',\n path: '/posts/',\n inputSchema: browseParams,\n description: 'Browse all posts with filtering, pagination, and sorting',\n example: { filter: 'status:published', limit: 10, include: 'authors,tags' },\n },\n {\n name: 'posts.read',\n api: 'admin',\n method: 'GET',\n path: '/posts/{id}/',\n inputSchema: readParams,\n description: 'Read a single post by ID',\n example: {\n id: '5ddc9141c35e7700383b2937',\n include: 'authors,tags',\n formats: 'html,lexical',\n },\n },\n {\n name: 'posts.read_by_slug',\n api: 'admin',\n method: 'GET',\n path: '/posts/slug/{slug}/',\n inputSchema: readBySlugParams,\n description: 'Read a single post by slug',\n example: { slug: 'my-post', include: 'authors,tags' },\n },\n {\n name: 'posts.add',\n api: 'admin',\n method: 'POST',\n path: '/posts/',\n inputSchema: addSchema,\n description: 'Create a new post',\n example: { title: 'My New Post', status: 'draft', tags: [{ name: 'News' }] },\n },\n {\n name: 'posts.edit',\n api: 'admin',\n method: 'PUT',\n path: '/posts/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing post. Requires updated_at for collision detection.',\n example: {\n id: '5ddc9141c35e7700383b2937',\n updated_at: '2024-01-01T00:00:00.000Z',\n title: 'Updated Title',\n },\n },\n {\n name: 'posts.copy',\n api: 'admin',\n method: 'POST',\n path: '/posts/{id}/copy/',\n inputSchema: copySchema,\n description: 'Copy an existing post',\n example: { id: '5ddc9141c35e7700383b2937' },\n },\n {\n name: 'posts.delete',\n api: 'admin',\n method: 'DELETE',\n path: '/posts/{id}/',\n inputSchema: deleteSchema,\n description: 'Delete a post by ID',\n example: { id: '5ddc9141c35e7700383b2937' },\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z\n .string()\n .optional()\n .describe('Comma-separated list of related data to include (e.g. \"authors,tags\")'),\n formats: z\n .string()\n .optional()\n .describe('Content formats to return: \"html\", \"lexical\", \"plaintext\" (comma-separated)'),\n filter: z.string().optional().describe('NQL filter expression'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page (default: 15, or \"all\")'),\n page: z.number().optional().describe('Page number for pagination'),\n order: z.string().optional().describe('Sort order (e.g. \"published_at DESC\")'),\n fields: z.string().optional().describe('Comma-separated list of fields to return'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Page ID'),\n include: z.string().optional().describe('Comma-separated list of related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nconst readBySlugParams = z.object({\n slug: z.string().describe('Page slug'),\n include: z.string().optional().describe('Comma-separated list of related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nconst pageWriteFields = {\n title: z.string().describe('Page title'),\n lexical: z.string().optional().describe('Page content in Lexical JSON format'),\n status: z.enum(['published', 'draft', 'scheduled']).optional().describe('Page status'),\n tags: z\n .array(z.union([z.string(), z.object({ id: z.string() }), z.object({ name: z.string() })]))\n .optional()\n .describe('Tags to assign — a tag name string, or an object { id } or { name }'),\n authors: z\n .array(z.object({ id: z.string() }))\n .optional()\n .describe('Authors to assign (by id)'),\n featured: z.boolean().optional().describe('Whether the page is featured'),\n visibility: z.string().optional().describe('Page visibility'),\n published_at: z.string().optional().describe('Publication date (ISO 8601)'),\n custom_excerpt: z.string().optional().describe('Custom excerpt'),\n meta_title: z.string().optional().describe('SEO meta title'),\n meta_description: z.string().optional().describe('SEO meta description'),\n og_image: z.string().optional().describe('Open Graph image URL'),\n og_title: z.string().optional().describe('Open Graph title'),\n og_description: z.string().optional().describe('Open Graph description'),\n twitter_image: z.string().optional().describe('Twitter card image URL'),\n twitter_title: z.string().optional().describe('Twitter card title'),\n twitter_description: z.string().optional().describe('Twitter card description'),\n codeinjection_head: z.string().optional().describe('Code injection for head'),\n codeinjection_foot: z.string().optional().describe('Code injection for footer'),\n canonical_url: z.string().optional().describe('Canonical URL'),\n feature_image: z.string().optional().describe('Feature image URL'),\n feature_image_alt: z.string().optional().describe('Feature image alt text'),\n feature_image_caption: z.string().optional().describe('Feature image caption (HTML)'),\n custom_template: z.string().optional().describe('Custom template'),\n slug: z.string().optional().describe('Custom URL slug for the page'),\n};\n\nconst addSchema = z.object({\n ...pageWriteFields,\n title: z.string().describe('Page title (required)'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Page ID (required)'),\n updated_at: z.string().describe('Last known updated_at for collision detection (required)'),\n ...pageWriteFields,\n title: z.string().optional().describe('Page title'),\n});\n\nconst copySchema = z.object({ id: z.string().describe('Page ID to copy') });\nconst deleteSchema = z.object({ id: z.string().describe('Page ID to delete') });\n\nexport const adminPageActions: ActionDefinition[] = [\n {\n name: 'pages.browse',\n api: 'admin',\n method: 'GET',\n path: '/pages/',\n inputSchema: browseParams,\n description: 'Browse all pages with filtering, pagination, and sorting',\n example: { filter: 'status:published', limit: 10 },\n },\n {\n name: 'pages.read',\n api: 'admin',\n method: 'GET',\n path: '/pages/{id}/',\n inputSchema: readParams,\n description: 'Read a single page by ID',\n },\n {\n name: 'pages.read_by_slug',\n api: 'admin',\n method: 'GET',\n path: '/pages/slug/{slug}/',\n inputSchema: readBySlugParams,\n description: 'Read a single page by slug',\n },\n {\n name: 'pages.add',\n api: 'admin',\n method: 'POST',\n path: '/pages/',\n inputSchema: addSchema,\n description: 'Create a new page',\n example: { title: 'About Us', status: 'draft' },\n },\n {\n name: 'pages.edit',\n api: 'admin',\n method: 'PUT',\n path: '/pages/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing page. Requires updated_at for collision detection.',\n },\n {\n name: 'pages.copy',\n api: 'admin',\n method: 'POST',\n path: '/pages/{id}/copy/',\n inputSchema: copySchema,\n description: 'Copy an existing page',\n },\n {\n name: 'pages.delete',\n api: 'admin',\n method: 'DELETE',\n path: '/pages/{id}/',\n inputSchema: deleteSchema,\n description: 'Delete a page by ID',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n filter: z.string().optional().describe('NQL filter expression'),\n include: z.string().optional().describe('Related data to include (e.g. \"count.posts\")'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Tag ID'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nconst tagWriteFields = {\n name: z.string().describe('Tag name'),\n slug: z.string().optional().describe('Tag slug (auto-generated from name if omitted)'),\n description: z.string().optional().describe('Tag description'),\n feature_image: z.string().optional().describe('Feature image URL'),\n visibility: z.string().optional().describe('Tag visibility (public or internal)'),\n meta_title: z.string().optional().describe('SEO meta title'),\n meta_description: z.string().optional().describe('SEO meta description'),\n og_image: z.string().optional().describe('Open Graph image URL'),\n og_title: z.string().optional().describe('Open Graph title'),\n og_description: z.string().optional().describe('Open Graph description'),\n twitter_image: z.string().optional().describe('Twitter card image URL'),\n twitter_title: z.string().optional().describe('Twitter card title'),\n twitter_description: z.string().optional().describe('Twitter card description'),\n codeinjection_head: z.string().optional().describe('Code injection for head'),\n codeinjection_foot: z.string().optional().describe('Code injection for footer'),\n canonical_url: z.string().optional().describe('Canonical URL'),\n accent_color: z.string().optional().describe('Accent color hex code'),\n};\n\nconst addSchema = z.object({\n ...tagWriteFields,\n name: z.string().describe('Tag name (required)'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Tag ID (required)'),\n updated_at: z.string().describe('Last known updated_at for collision detection (required)'),\n ...tagWriteFields,\n name: z.string().optional().describe('Tag name'),\n});\n\nconst deleteSchema = z.object({\n id: z.string().describe('Tag ID to delete'),\n});\n\nexport const adminTagActions: ActionDefinition[] = [\n {\n name: 'tags.browse',\n api: 'admin',\n method: 'GET',\n path: '/tags/',\n inputSchema: browseParams,\n description: 'Browse all tags with filtering and pagination',\n example: { limit: 'all', include: 'count.posts' },\n },\n {\n name: 'tags.read',\n api: 'admin',\n method: 'GET',\n path: '/tags/{id}/',\n inputSchema: readParams,\n description: 'Read a single tag by ID',\n },\n {\n name: 'tags.add',\n api: 'admin',\n method: 'POST',\n path: '/tags/',\n inputSchema: addSchema,\n description: 'Create a new tag',\n example: { name: 'News', description: 'Latest news articles' },\n },\n {\n name: 'tags.edit',\n api: 'admin',\n method: 'PUT',\n path: '/tags/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing tag',\n },\n {\n name: 'tags.delete',\n api: 'admin',\n method: 'DELETE',\n path: '/tags/{id}/',\n inputSchema: deleteSchema,\n description: 'Delete a tag by ID',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n filter: z.string().optional().describe('NQL filter expression (e.g. \"type:paid+active:true\")'),\n include: z\n .string()\n .optional()\n .describe('Related data to include (e.g. \"monthly_price,yearly_price,benefits\")'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Tier ID'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nconst tierWriteFields = {\n name: z.string().describe('Tier name'),\n description: z.string().optional().describe('Tier description'),\n welcome_page_url: z.string().optional().describe('URL of the welcome page for new subscribers'),\n visibility: z.enum(['public', 'none']).optional().describe('Tier visibility'),\n monthly_price: z\n .number()\n .optional()\n .describe('Monthly price in smallest currency unit (e.g. cents)'),\n yearly_price: z.number().optional().describe('Yearly price in smallest currency unit'),\n currency: z.string().optional().describe('Three-letter ISO currency code (e.g. \"usd\")'),\n benefits: z.array(z.string()).optional().describe('List of benefits for this tier'),\n trial_days: z.number().optional().describe('Number of free trial days for new subscribers'),\n};\n\nconst addSchema = z.object({\n ...tierWriteFields,\n name: z.string().describe('Tier name (required)'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Tier ID (required)'),\n ...tierWriteFields,\n name: z.string().optional().describe('Tier name'),\n});\n\nexport const adminTierActions: ActionDefinition[] = [\n {\n name: 'tiers.browse',\n api: 'admin',\n method: 'GET',\n path: '/tiers/',\n inputSchema: browseParams,\n description: 'Browse all tiers with filtering and pagination',\n example: {\n filter: 'type:paid+active:true',\n include: 'monthly_price,yearly_price,benefits',\n },\n },\n {\n name: 'tiers.read',\n api: 'admin',\n method: 'GET',\n path: '/tiers/{id}/',\n inputSchema: readParams,\n description: 'Read a single tier by ID',\n },\n {\n name: 'tiers.add',\n api: 'admin',\n method: 'POST',\n path: '/tiers/',\n inputSchema: addSchema,\n description: 'Create a new tier',\n example: { name: 'Premium', monthly_price: 500, yearly_price: 5000, currency: 'usd' },\n },\n {\n name: 'tiers.edit',\n api: 'admin',\n method: 'PUT',\n path: '/tiers/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing tier',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n filter: z.string().optional().describe('NQL filter expression'),\n include: z\n .string()\n .optional()\n .describe(\"Related data to include (e.g. 'count.posts,count.members,count.active_members')\"),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Newsletter ID'),\n});\n\nconst newsletterWriteFields = {\n name: z.string().describe('Newsletter name'),\n description: z.string().optional().describe('Newsletter description'),\n slug: z.string().optional().describe('Newsletter slug'),\n sender_name: z.string().optional().describe('Sender name in emails'),\n sender_email: z.string().optional().describe('Sender email address (must be validated)'),\n sender_reply_to: z.enum(['newsletter', 'support']).optional().describe('Reply-to address type'),\n status: z.enum(['active', 'archived']).optional().describe('Newsletter status'),\n visibility: z.string().optional().describe('Newsletter visibility'),\n subscribe_on_signup: z.boolean().optional().describe('Auto-subscribe new members'),\n sort_order: z.number().optional().describe('Sort order position'),\n header_image: z.string().optional().describe('Header image URL'),\n show_header_icon: z.boolean().optional().describe('Show site icon in header'),\n show_header_title: z.boolean().optional().describe('Show site title in header'),\n show_header_name: z.boolean().optional().describe('Show newsletter name in header'),\n title_font_category: z.enum(['serif', 'sans_serif']).optional().describe('Title font category'),\n title_alignment: z.enum(['left', 'center']).optional().describe('Title alignment'),\n show_feature_image: z.boolean().optional().describe('Show feature image in emails'),\n body_font_category: z.enum(['serif', 'sans_serif']).optional().describe('Body font category'),\n footer_content: z.string().optional().describe('Footer content (HTML)'),\n show_badge: z.boolean().optional().describe('Show Ghost badge in footer'),\n feedback_enabled: z.boolean().optional().describe('Enable email feedback/reactions'),\n show_excerpt: z.boolean().optional().describe('Show post excerpt in emails'),\n show_post_title_section: z.boolean().optional().describe('Show post title section'),\n show_comment_cta: z.boolean().optional().describe('Show comment call-to-action'),\n show_subscription_details: z.boolean().optional().describe('Show subscription details'),\n show_latest_posts: z.boolean().optional().describe('Show latest posts section'),\n show_share_button: z.boolean().optional().describe('Show share button'),\n background_color: z.string().optional().describe(\"Background color (e.g. 'light', 'dark', or hex)\"),\n post_title_color: z.string().nullable().optional().describe('Post title color (hex)'),\n button_corners: z\n .enum(['square', 'rounded', 'pill'])\n .optional()\n .describe('Button corner style'),\n button_style: z.enum(['fill', 'outline']).optional().describe('Button style'),\n title_font_weight: z\n .enum(['normal', 'medium', 'semibold', 'bold'])\n .optional()\n .describe('Title font weight'),\n link_style: z.enum(['underline', 'regular', 'bold']).optional().describe('Link style in emails'),\n image_corners: z.enum(['square', 'rounded']).optional().describe('Image corner style'),\n header_background_color: z\n .string()\n .optional()\n .describe(\"Header background color (e.g. 'transparent', hex, 'accent')\"),\n section_title_color: z.string().nullable().optional().describe('Section title color (hex)'),\n divider_color: z.string().nullable().optional().describe('Divider color (hex)'),\n button_color: z.string().optional().describe(\"Button color (e.g. 'accent', hex)\"),\n link_color: z.string().optional().describe(\"Link color (e.g. 'accent', hex)\"),\n};\n\nconst addSchema = z.object({\n ...newsletterWriteFields,\n name: z.string().describe('Newsletter name (required)'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Newsletter ID (required)'),\n ...newsletterWriteFields,\n name: z.string().optional().describe('Newsletter name'),\n});\n\nexport const adminNewsletterActions: ActionDefinition[] = [\n {\n name: 'newsletters.browse',\n api: 'admin',\n method: 'GET',\n path: '/newsletters/',\n inputSchema: browseParams,\n description: 'Browse all newsletters',\n example: { limit: 'all' },\n },\n {\n name: 'newsletters.read',\n api: 'admin',\n method: 'GET',\n path: '/newsletters/{id}/',\n inputSchema: readParams,\n description: 'Read a single newsletter by ID',\n },\n {\n name: 'newsletters.add',\n api: 'admin',\n method: 'POST',\n path: '/newsletters/',\n inputSchema: addSchema,\n description: 'Create a new newsletter',\n example: { name: 'Weekly Digest', sender_name: 'My Blog' },\n },\n {\n name: 'newsletters.edit',\n api: 'admin',\n method: 'PUT',\n path: '/newsletters/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing newsletter',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\n// Ghost's offers endpoint returns the full list without pagination meta;\n// filter is the only browse option it honors (e.g. \"status:active\").\nconst browseParams = z.object({\n filter: z\n .string()\n .optional()\n .describe('NQL filter expression (e.g. \"status:active\" or \"status:archived\")'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Offer ID'),\n});\n\nconst addSchema = z.object({\n name: z.string().describe('Internal name for the offer (required)'),\n code: z.string().describe('Unique code for the offer URL (required)'),\n display_title: z.string().describe('Title shown to users (required)'),\n display_description: z.string().describe('Description shown to users (required)'),\n type: z\n .enum(['percent', 'fixed'])\n .describe('Discount type: percentage or fixed amount (required)'),\n cadence: z.enum(['month', 'year']).describe('Billing cadence the offer applies to (required)'),\n amount: z\n .number()\n .describe('Discount amount: percentage (1-100) or fixed amount in cents (required)'),\n duration: z\n .enum(['once', 'forever', 'repeating'])\n .describe('How long the discount lasts (required)'),\n duration_in_months: z.number().optional().describe('Number of months for repeating duration'),\n currency_restriction: z\n .boolean()\n .optional()\n .describe('Whether the offer is restricted to a specific currency'),\n currency: z\n .string()\n .optional()\n .describe('Three-letter ISO currency code (required for fixed type)'),\n tier: z\n .object({ id: z.string().describe('Tier ID') })\n .describe('Tier this offer applies to (required)'),\n redemption_type: z\n .enum(['signup', 'retention'])\n .optional()\n .describe('Whether the offer is for new signups or existing member retention'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Offer ID (required)'),\n name: z.string().optional().describe('Internal name'),\n});\n\nexport const adminOfferActions: ActionDefinition[] = [\n {\n name: 'offers.browse',\n api: 'admin',\n method: 'GET',\n path: '/offers/',\n inputSchema: browseParams,\n description: 'Browse all offers (Ghost returns the full list; filter by status)',\n example: { filter: 'status:active' },\n },\n {\n name: 'offers.read',\n api: 'admin',\n method: 'GET',\n path: '/offers/{id}/',\n inputSchema: readParams,\n description: 'Read a single offer by ID',\n },\n {\n name: 'offers.add',\n api: 'admin',\n method: 'POST',\n path: '/offers/',\n inputSchema: addSchema,\n description: 'Create a new offer (discount code)',\n example: {\n name: 'Black Friday',\n code: 'black-friday',\n display_title: '20% Off',\n display_description: 'Black Friday special',\n type: 'percent',\n cadence: 'year',\n amount: 20,\n duration: 'once',\n tier: { id: 'tier-id' },\n },\n },\n {\n name: 'offers.edit',\n api: 'admin',\n method: 'PUT',\n path: '/offers/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing offer (limited fields)',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z.string().optional().describe('Related data to include (e.g. \"newsletters,labels\")'),\n filter: z.string().optional().describe('NQL filter expression (e.g. \"status:paid\")'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Member ID'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nconst memberWriteFields = {\n email: z.string().describe('Member email address'),\n name: z.string().optional().describe('Member name'),\n note: z.string().optional().describe('Private note about the member'),\n labels: z\n .array(z.union([z.object({ id: z.string() }), z.object({ name: z.string() })]))\n .optional()\n .describe('Labels to assign'),\n newsletters: z\n .array(z.object({ id: z.string() }))\n .optional()\n .describe('Newsletters to subscribe the member to'),\n comped: z.boolean().optional().describe('Whether the member has a complimentary subscription'),\n};\n\nconst addSchema = z.object({\n ...memberWriteFields,\n email: z.string().describe('Member email address (required)'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Member ID (required)'),\n ...memberWriteFields,\n email: z.string().optional().describe('Member email address'),\n});\n\nexport const adminMemberActions: ActionDefinition[] = [\n {\n name: 'members.browse',\n api: 'admin',\n method: 'GET',\n path: '/members/',\n inputSchema: browseParams,\n description: 'Browse all members with filtering and pagination',\n example: { filter: 'status:paid', include: 'newsletters', limit: 20 },\n },\n {\n name: 'members.read',\n api: 'admin',\n method: 'GET',\n path: '/members/{id}/',\n inputSchema: readParams,\n description: 'Read a single member by ID',\n },\n {\n name: 'members.add',\n api: 'admin',\n method: 'POST',\n path: '/members/',\n inputSchema: addSchema,\n description: 'Create a new member',\n example: { email: 'member@example.com', name: 'New Member', labels: [{ name: 'VIP' }] },\n },\n {\n name: 'members.edit',\n api: 'admin',\n method: 'PUT',\n path: '/members/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing member',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z.string().optional().describe('Related data to include (e.g. \"roles,count.posts\")'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('User ID'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nexport const adminUserActions: ActionDefinition[] = [\n {\n name: 'users.browse',\n api: 'admin',\n method: 'GET',\n path: '/users/',\n inputSchema: browseParams,\n description: 'Browse all users (staff members)',\n example: { include: 'roles', limit: 'all' },\n },\n {\n name: 'users.read',\n api: 'admin',\n method: 'GET',\n path: '/users/{id}/',\n inputSchema: readParams,\n description: 'Read a single user by ID',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst uploadSchema = z.object({\n file: z.string().describe('Image URL to download and upload, or base64-encoded image data'),\n ref: z.string().optional().describe('Optional reference name for the uploaded image'),\n});\n\nexport const adminImageActions: ActionDefinition[] = [\n {\n name: 'images.upload',\n api: 'admin',\n method: 'POST',\n path: '/images/upload/',\n inputSchema: uploadSchema,\n description:\n 'Upload an image to Ghost. Provide a URL (which will be downloaded) or base64-encoded image data.',\n example: { file: 'https://example.com/photo.jpg', ref: 'hero-image' },\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst uploadSchema = z.object({\n file: z.string().describe('URL to a theme ZIP file to download and upload'),\n});\n\nconst activateSchema = z.object({\n name: z.string().describe('Theme name to activate'),\n});\n\nexport const adminThemeActions: ActionDefinition[] = [\n {\n name: 'themes.upload',\n api: 'admin',\n method: 'POST',\n path: '/themes/upload/',\n inputSchema: uploadSchema,\n description: 'Upload a theme ZIP file to Ghost. Provide a URL to the ZIP file.',\n example: { file: 'https://example.com/theme.zip' },\n },\n {\n name: 'themes.activate',\n api: 'admin',\n method: 'PUT',\n path: '/themes/{name}/activate/',\n inputSchema: activateSchema,\n description: 'Activate an installed theme by name',\n example: { name: 'casper' },\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst webhookEvents = z.enum([\n 'site.changed',\n 'post.added',\n 'post.deleted',\n 'post.edited',\n 'post.published',\n 'post.published.edited',\n 'post.unpublished',\n 'post.scheduled',\n 'post.unscheduled',\n 'post.rescheduled',\n 'page.added',\n 'page.deleted',\n 'page.edited',\n 'page.published',\n 'page.published.edited',\n 'page.unpublished',\n 'page.scheduled',\n 'page.unscheduled',\n 'page.rescheduled',\n 'tag.added',\n 'tag.edited',\n 'tag.deleted',\n 'post.tag.attached',\n 'post.tag.detached',\n 'page.tag.attached',\n 'page.tag.detached',\n 'member.added',\n 'member.edited',\n 'member.deleted',\n]);\n\nconst addSchema = z.object({\n event: webhookEvents.describe('Webhook event to listen for (required)'),\n target_url: z.string().describe('URL to receive webhook POST requests (required)'),\n name: z.string().optional().describe('Human-readable name for the webhook'),\n secret: z.string().optional().describe('Shared secret for HMAC signature verification'),\n api_version: z.string().optional().describe('Target API version'),\n integration_id: z.string().optional().describe('Associated integration ID'),\n});\n\nconst editSchema = z.object({\n id: z.string().describe('Webhook ID (required)'),\n event: webhookEvents.optional().describe('Webhook event'),\n target_url: z.string().optional().describe('URL to receive webhook POST requests'),\n name: z.string().optional().describe('Human-readable name'),\n secret: z.string().optional().describe('Shared secret for HMAC verification'),\n api_version: z.string().optional().describe('Target API version'),\n integration_id: z.string().optional().describe('Associated integration ID'),\n});\n\nconst deleteSchema = z.object({\n id: z.string().describe('Webhook ID to delete'),\n});\n\nexport const adminWebhookActions: ActionDefinition[] = [\n {\n name: 'webhooks.add',\n api: 'admin',\n method: 'POST',\n path: '/webhooks/',\n inputSchema: addSchema,\n description: 'Create a new webhook',\n example: {\n event: 'post.published',\n target_url: 'https://example.com/webhook',\n name: 'Post published',\n },\n },\n {\n name: 'webhooks.edit',\n api: 'admin',\n method: 'PUT',\n path: '/webhooks/{id}/',\n inputSchema: editSchema,\n description: 'Update an existing webhook',\n },\n {\n name: 'webhooks.delete',\n api: 'admin',\n method: 'DELETE',\n path: '/webhooks/{id}/',\n inputSchema: deleteSchema,\n description: 'Delete a webhook by ID',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst readParams = z.object({}).describe('No parameters required');\n\nexport const adminSiteActions: ActionDefinition[] = [\n {\n name: 'site.read',\n api: 'admin',\n method: 'GET',\n path: '/site/',\n inputSchema: readParams,\n description: 'Read site configuration and metadata',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z\n .string()\n .optional()\n .describe('Comma-separated list of related data (e.g. \"authors,tags\")'),\n formats: z\n .string()\n .optional()\n .describe('Content formats: \"html\", \"plaintext\" (comma-separated)'),\n filter: z.string().optional().describe('NQL filter expression (e.g. \"tag:news+featured:true\")'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page (default: 15, max: 100, or \"all\")'),\n page: z.number().optional().describe('Page number for pagination'),\n order: z.string().optional().describe('Sort order (e.g. \"published_at DESC\")'),\n fields: z.string().optional().describe('Comma-separated list of fields to return'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Post ID'),\n include: z.string().optional().describe('Related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nconst readBySlugParams = z.object({\n slug: z.string().describe('Post slug'),\n include: z.string().optional().describe('Related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nexport const contentPostActions: ActionDefinition[] = [\n {\n name: 'posts.browse',\n api: 'content',\n method: 'GET',\n path: '/posts/',\n inputSchema: browseParams,\n description: 'Browse published posts (Content API — read-only)',\n example: { filter: 'tag:news', include: 'authors,tags', limit: 10 },\n },\n {\n name: 'posts.read',\n api: 'content',\n method: 'GET',\n path: '/posts/{id}/',\n inputSchema: readParams,\n description: 'Read a published post by ID (Content API)',\n },\n {\n name: 'posts.read_by_slug',\n api: 'content',\n method: 'GET',\n path: '/posts/slug/{slug}/',\n inputSchema: readBySlugParams,\n description: 'Read a published post by slug (Content API)',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z\n .string()\n .optional()\n .describe('Comma-separated list of related data (e.g. \"authors,tags\")'),\n formats: z\n .string()\n .optional()\n .describe('Content formats: \"html\", \"plaintext\" (comma-separated)'),\n filter: z.string().optional().describe('NQL filter expression'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n fields: z.string().optional().describe('Comma-separated list of fields to return'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Page ID'),\n include: z.string().optional().describe('Related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nconst readBySlugParams = z.object({\n slug: z.string().describe('Page slug'),\n include: z.string().optional().describe('Related data to include'),\n formats: z.string().optional().describe('Content formats to return'),\n});\n\nexport const contentPageActions: ActionDefinition[] = [\n {\n name: 'pages.browse',\n api: 'content',\n method: 'GET',\n path: '/pages/',\n inputSchema: browseParams,\n description: 'Browse published pages (Content API — read-only)',\n },\n {\n name: 'pages.read',\n api: 'content',\n method: 'GET',\n path: '/pages/{id}/',\n inputSchema: readParams,\n description: 'Read a published page by ID (Content API)',\n },\n {\n name: 'pages.read_by_slug',\n api: 'content',\n method: 'GET',\n path: '/pages/slug/{slug}/',\n inputSchema: readBySlugParams,\n description: 'Read a published page by slug (Content API)',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z.string().optional().describe('Related data to include (e.g. \"count.posts\")'),\n filter: z.string().optional().describe('NQL filter expression'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n fields: z.string().optional().describe('Comma-separated list of fields to return'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Tag ID'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nconst readBySlugParams = z.object({\n slug: z.string().describe('Tag slug'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nexport const contentTagActions: ActionDefinition[] = [\n {\n name: 'tags.browse',\n api: 'content',\n method: 'GET',\n path: '/tags/',\n inputSchema: browseParams,\n description: 'Browse all tags (Content API — read-only)',\n example: { include: 'count.posts', limit: 'all' },\n },\n {\n name: 'tags.read',\n api: 'content',\n method: 'GET',\n path: '/tags/{id}/',\n inputSchema: readParams,\n description: 'Read a tag by ID (Content API)',\n },\n {\n name: 'tags.read_by_slug',\n api: 'content',\n method: 'GET',\n path: '/tags/slug/{slug}/',\n inputSchema: readBySlugParams,\n description: 'Read a tag by slug (Content API)',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z.string().optional().describe('Related data to include (e.g. \"count.posts\")'),\n filter: z.string().optional().describe('NQL filter expression'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n order: z.string().optional().describe('Sort order'),\n fields: z.string().optional().describe('Comma-separated list of fields to return'),\n});\n\nconst readParams = z.object({\n id: z.string().describe('Author ID'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nconst readBySlugParams = z.object({\n slug: z.string().describe('Author slug'),\n include: z.string().optional().describe('Related data to include'),\n});\n\nexport const contentAuthorActions: ActionDefinition[] = [\n {\n name: 'authors.browse',\n api: 'content',\n method: 'GET',\n path: '/authors/',\n inputSchema: browseParams,\n description: 'Browse all authors (Content API — read-only)',\n example: { include: 'count.posts' },\n },\n {\n name: 'authors.read',\n api: 'content',\n method: 'GET',\n path: '/authors/{id}/',\n inputSchema: readParams,\n description: 'Read an author by ID (Content API)',\n },\n {\n name: 'authors.read_by_slug',\n api: 'content',\n method: 'GET',\n path: '/authors/slug/{slug}/',\n inputSchema: readBySlugParams,\n description: 'Read an author by slug (Content API)',\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst browseParams = z.object({\n include: z\n .string()\n .optional()\n .describe('Related data to include (e.g. \"monthly_price,yearly_price,benefits\")'),\n filter: z\n .string()\n .optional()\n .describe('NQL filter expression (e.g. \"type:paid+active:true+visibility:public\")'),\n limit: z\n .union([z.number(), z.literal('all')])\n .optional()\n .describe('Number of results per page'),\n page: z.number().optional().describe('Page number'),\n});\n\nexport const contentTierActions: ActionDefinition[] = [\n {\n name: 'tiers.browse',\n api: 'content',\n method: 'GET',\n path: '/tiers/',\n inputSchema: browseParams,\n description: 'Browse all tiers (Content API — read-only)',\n example: { include: 'monthly_price,yearly_price,benefits' },\n },\n];\n","import { z } from 'zod';\nimport type { ActionDefinition } from '../registry.js';\n\nconst readParams = z.object({}).describe('No parameters required');\n\nexport const contentSettingsActions: ActionDefinition[] = [\n {\n name: 'settings.read',\n api: 'content',\n method: 'GET',\n path: '/settings/',\n inputSchema: readParams,\n description: 'Read site settings (Content API — read-only)',\n },\n];\n","import { z } from 'zod';\n\n// Admin actions\nimport { adminPostActions } from './admin/posts.js';\nimport { adminPageActions } from './admin/pages.js';\nimport { adminTagActions } from './admin/tags.js';\nimport { adminTierActions } from './admin/tiers.js';\nimport { adminNewsletterActions } from './admin/newsletters.js';\nimport { adminOfferActions } from './admin/offers.js';\nimport { adminMemberActions } from './admin/members.js';\nimport { adminUserActions } from './admin/users.js';\nimport { adminImageActions } from './admin/images.js';\nimport { adminThemeActions } from './admin/themes.js';\nimport { adminWebhookActions } from './admin/webhooks.js';\nimport { adminSiteActions } from './admin/site.js';\n\n// Content actions\nimport { contentPostActions } from './content/posts.js';\nimport { contentPageActions } from './content/pages.js';\nimport { contentTagActions } from './content/tags.js';\nimport { contentAuthorActions } from './content/authors.js';\nimport { contentTierActions } from './content/tiers.js';\nimport { contentSettingsActions } from './content/settings.js';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';\nexport type ApiType = 'admin' | 'content';\n\nexport interface ActionDefinition {\n name: string;\n api: ApiType;\n method: HttpMethod;\n path: string;\n inputSchema: z.ZodType;\n description: string;\n example?: Record<string, unknown>;\n}\n\nconst registry = new Map<string, ActionDefinition>();\n\nexport function registerAction(action: ActionDefinition): void {\n registry.set(`${action.api}:${action.name}`, action);\n}\n\nexport function registerActions(actions: ActionDefinition[]): void {\n for (const action of actions) {\n registerAction(action);\n }\n}\n\nexport function getAction(name: string, api?: ApiType): ActionDefinition | undefined {\n if (api) {\n return registry.get(`${api}:${name}`);\n }\n // Try admin first, then content\n return registry.get(`admin:${name}`) || registry.get(`content:${name}`);\n}\n\nexport function listActions(api?: ApiType): ActionDefinition[] {\n const actions = Array.from(registry.values());\n if (api) {\n return actions.filter((a) => a.api === api);\n }\n return actions;\n}\n\nfunction unwrapZodType(field: z.ZodType): z.ZodType {\n if (field instanceof z.ZodOptional || field instanceof z.ZodNullable) {\n return unwrapZodType((field as z.ZodOptional<z.ZodType> | z.ZodNullable<z.ZodType>)._def.innerType);\n }\n if (field instanceof z.ZodDefault) {\n return unwrapZodType((field as z.ZodDefault<z.ZodType>)._def.innerType);\n }\n return field;\n}\n\nfunction describeZodType(field: z.ZodType): string {\n const inner = unwrapZodType(field);\n\n if (inner instanceof z.ZodEnum) {\n const values = (inner._def as z.ZodEnumDef).values as string[];\n return `values: ${values.map((v) => `\\`${v}\\``).join(', ')}`;\n }\n\n if (inner instanceof z.ZodObject) {\n const shape = inner.shape as Record<string, z.ZodType>;\n const fields = Object.entries(shape).map(([k, v]) => {\n const t = describeZodType(v);\n return t ? `${k}${t.startsWith('values:') ? ` (${t})` : `: ${t}`}` : k;\n });\n return `object: { ${fields.join(', ')} }`;\n }\n\n if (inner instanceof z.ZodArray) {\n const itemType = describeZodType((inner._def as z.ZodArrayDef).type);\n return itemType ? `array of [${itemType}]` : 'array';\n }\n\n if (inner instanceof z.ZodUnion) {\n const options = (inner._def as z.ZodUnionDef).options as z.ZodType[];\n const parts = options.map((o) => describeZodType(o)).filter(Boolean);\n return parts.length > 0 ? parts.join(' | ') : '';\n }\n\n if (inner instanceof z.ZodLiteral) {\n return `\\`${String((inner._def as z.ZodLiteralDef).value)}\\``;\n }\n\n if (inner instanceof z.ZodString) {return 'string';}\n if (inner instanceof z.ZodNumber) {return 'number';}\n if (inner instanceof z.ZodBoolean) {return 'boolean';}\n\n return '';\n}\n\nexport function getActionHelp(name: string, api?: ApiType): string | undefined {\n const action = getAction(name, api);\n if (!action) {\n return undefined;\n }\n\n const schema = action.inputSchema;\n const lines: string[] = [\n `## ${action.name}`,\n '',\n action.description,\n '',\n `- **API:** ${action.api}`,\n `- **Method:** ${action.method}`,\n `- **Path:** ${action.path}`,\n '',\n ];\n\n // Extract schema info\n if (schema instanceof z.ZodObject) {\n lines.push('### Parameters', '');\n const shape = schema.shape as Record<string, z.ZodType>;\n for (const [key, field] of Object.entries(shape)) {\n const isOptional = field.isOptional();\n const desc = field.description || '';\n const typeInfo = describeZodType(field);\n const suffix = typeInfo ? ` — ${typeInfo}` : '';\n lines.push(`- **${key}**${isOptional ? ' (optional)' : ' (required)'}: ${desc}${suffix}`);\n }\n lines.push('');\n }\n\n if (action.example) {\n lines.push(\n '### Example Payload',\n '',\n '```json',\n JSON.stringify(action.example, null, 2),\n '```',\n '',\n );\n }\n\n return lines.join('\\n');\n}\n\n// Register all actions\nfunction initRegistry(): void {\n const allActions = [\n ...adminPostActions,\n ...adminPageActions,\n ...adminTagActions,\n ...adminTierActions,\n ...adminNewsletterActions,\n ...adminOfferActions,\n ...adminMemberActions,\n ...adminUserActions,\n ...adminImageActions,\n ...adminThemeActions,\n ...adminWebhookActions,\n ...adminSiteActions,\n ...contentPostActions,\n ...contentPageActions,\n ...contentTagActions,\n ...contentAuthorActions,\n ...contentTierActions,\n ...contentSettingsActions,\n ];\n registerActions(allActions);\n}\n\ninitRegistry();\n","export function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import { z } from 'zod';\nimport { attempt } from '@logosdx/utils';\nimport { get as fetchGet } from '@logosdx/fetch';\nimport mimeDb from 'mime-db';\nimport { adminApi, contentApi } from '../ghost-client.js';\nimport { getAction } from '../actions/registry.js';\nimport type { ApiType } from '../actions/registry.js';\nimport { isRecord } from '../koenig/util.js';\n\n/**\n * Surface the Ghost API error body instead of just the HTTP status text.\n * `@logosdx/fetch` puts the parsed response on `err.data`; Ghost returns\n * `{ errors: [{ message, context, type, property, ... }] }`. Without this the\n * caller only sees \"Unprocessable Entity\" and cannot tell what actually failed.\n */\nfunction formatApiError(err: unknown): string {\n if (isRecord(err)) {\n const status = typeof err.status === 'number' ? err.status : undefined;\n if (isRecord(err.data) && Array.isArray(err.data.errors) && err.data.errors.length > 0) {\n return JSON.stringify({ status, errors: err.data.errors });\n }\n if (typeof err.message === 'string') {\n return JSON.stringify({ status, error: err.message });\n }\n }\n return JSON.stringify({ error: String(err) });\n}\n\nconst extToMime: Record<string, string> = {};\nfor (const [mime, meta] of Object.entries(mimeDb)) {\n for (const ext of (meta as any).extensions ?? []) {\n extToMime[`.${ext}`] = mime;\n }\n}\n\nexport const useGhostApiSchema = z.object({\n api: z\n .enum(['admin', 'content'])\n .describe('Which API to use: \"admin\" for full access, \"content\" for read-only public data'),\n action: z.string().describe('Action to execute (e.g. \"posts.browse\", \"members.add\")'),\n payload: z\n .record(z.unknown())\n .optional()\n .describe(\n 'Action payload — fields depend on the action. Use ghost_api_help to see available fields.',\n ),\n});\n\nexport type UseGhostApiInput = z.infer<typeof useGhostApiSchema>;\n\nconst PATH_PARAMS = ['id', 'slug', 'name'] as const;\n\nfunction getUsedPathParams(template: string): Set<string> {\n const used = new Set<string>();\n for (const param of PATH_PARAMS) {\n if (template.includes(`{${param}}`)) {\n used.add(param);\n }\n }\n return used;\n}\n\nfunction buildPath(template: string, payload: Record<string, unknown>): string {\n let path = template;\n for (const param of PATH_PARAMS) {\n const placeholder = `{${param}}`;\n if (path.includes(placeholder) && payload[param]) {\n path = path.replace(placeholder, encodeURIComponent(String(payload[param])));\n }\n }\n return path;\n}\n\nfunction extractQueryParams(\n payload: Record<string, unknown>,\n usedPathParams: Set<string>,\n): Record<string, string> {\n const params: Record<string, string> = {};\n for (const [key, value] of Object.entries(payload)) {\n if (usedPathParams.has(key)) {\n continue;\n }\n if (value !== undefined && value !== null) {\n params[key] = String(value);\n }\n }\n return params;\n}\n\nfunction extractBodyPayload(\n payload: Record<string, unknown>,\n usedPathParams: Set<string>,\n): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(payload)) {\n if (usedPathParams.has(key)) {\n continue;\n }\n if (value !== undefined) {\n body[key] = value;\n }\n }\n return body;\n}\n\nexport async function handleUseGhostApi(input: UseGhostApiInput, mode: string): Promise<string> {\n const { api, action, payload = {} } = input;\n\n // Validate mode restrictions\n if (mode === 'content' && api === 'admin') {\n return JSON.stringify({\n error: 'Admin API is not available in content mode. Set GHOST_API_MODE=admin and provide GHOST_ADMIN_API_KEY to use admin actions.',\n });\n }\n\n // Look up the action\n const actionDef = getAction(action, api as ApiType);\n if (!actionDef) {\n return JSON.stringify({\n error: `Unknown action \"${action}\" for ${api} API. Use ghost_api_help to see available actions.`,\n });\n }\n\n // Validate payload\n const validation = actionDef.inputSchema.safeParse(payload);\n if (!validation.success) {\n return JSON.stringify({\n error: 'Invalid payload',\n details: validation.error.issues.map((i) => ({\n path: i.path.join('.'),\n message: i.message,\n })),\n });\n }\n\n const validPayload = validation.data as Record<string, unknown>;\n const engine = api === 'admin' ? adminApi : contentApi;\n const usedPathParams = getUsedPathParams(actionDef.path);\n const path = buildPath(actionDef.path, validPayload);\n\n // Handle special cases: image/theme upload\n if (actionDef.name === 'images.upload' || actionDef.name === 'themes.upload') {\n return await handleFileUpload(actionDef.name, validPayload, path);\n }\n\n if (actionDef.method === 'GET') {\n const queryParams = extractQueryParams(validPayload, usedPathParams);\n const [response, err] = await attempt(async () =>\n engine.get(path, { params: queryParams }),\n );\n if (err) {\n return formatApiError(err);\n }\n return JSON.stringify(response!.data);\n }\n\n if (actionDef.method === 'DELETE') {\n const [response, err] = await attempt(async () => engine.delete(path));\n if (err) {\n return formatApiError(err);\n }\n const resourcePrefix = `/${actionDef.name.split('.')[0]}`;\n await engine.invalidatePath(resourcePrefix);\n return JSON.stringify(response?.data ?? { success: true });\n }\n\n // POST or PUT — build body wrapped in resource key\n const resourceKey = actionDef.name.split('.')[0];\n const body = extractBodyPayload(validPayload, usedPathParams);\n const wrappedBody = { [resourceKey]: [body] };\n\n if (actionDef.method === 'POST') {\n const [response, err] = await attempt(async () => engine.post(path, wrappedBody));\n if (err) {\n return formatApiError(err);\n }\n return JSON.stringify(response!.data);\n }\n\n if (actionDef.method === 'PUT') {\n const [response, err] = await attempt(async () => engine.put(path, wrappedBody));\n if (err) {\n return formatApiError(err);\n }\n const resourcePrefix = `/${actionDef.name.split('.')[0]}`;\n await engine.invalidatePath(resourcePrefix);\n return JSON.stringify(response!.data);\n }\n\n return JSON.stringify({ error: `Unsupported method: ${actionDef.method}` });\n}\n\nasync function handleFileUpload(\n actionName: string,\n payload: Record<string, unknown>,\n path: string,\n): Promise<string> {\n const fileInput = payload.file as string;\n const ref = payload.ref as string | undefined;\n\n // Download file if URL\n let fileBuffer: Buffer;\n let filename: string;\n\n if (fileInput.startsWith('http://') || fileInput.startsWith('https://')) {\n const [response, err] = await attempt(async () => fetchGet(fileInput).arrayBuffer());\n if (err) {\n return JSON.stringify({ error: `Failed to download file: ${err.message}` });\n }\n fileBuffer = Buffer.from(response!.data);\n const urlPath = new URL(fileInput).pathname;\n filename =\n urlPath.split('/').pop() ||\n (actionName === 'images.upload' ? 'image.jpg' : 'theme.zip');\n } else {\n // Base64\n fileBuffer = Buffer.from(fileInput, 'base64');\n filename = actionName === 'images.upload' ? 'image.jpg' : 'theme.zip';\n }\n\n // Build multipart form\n const ext = filename.includes('.')\n ? filename.slice(filename.lastIndexOf('.')).toLowerCase()\n : '';\n const mimeType = extToMime[ext] || 'application/octet-stream';\n\n const formData = new FormData();\n const blob = new Blob([new Uint8Array(fileBuffer)], { type: mimeType });\n formData.append('file', blob, filename);\n if (ref) {\n formData.append('ref', ref);\n }\n\n const [response, err] = await attempt(async () =>\n adminApi.post(path, formData, {\n onBeforeReq: (opts) => {\n delete opts.headers!['Content-Type'];\n },\n }),\n );\n if (err) {\n return formatApiError(err);\n }\n return JSON.stringify(response!.data);\n}\n","import { z } from 'zod';\nimport { listActions, getActionHelp } from '../actions/registry.js';\nimport type { ApiType } from '../actions/registry.js';\n\nexport const ghostApiHelpSchema = z.object({\n action: z\n .string()\n .optional()\n .describe(\n 'Specific action name to get detailed help for (e.g. \"posts.add\"). Omit to see all available actions.',\n ),\n api: z.enum(['admin', 'content']).optional().describe('Filter actions by API type'),\n});\n\nexport type GhostApiHelpInput = z.infer<typeof ghostApiHelpSchema>;\n\nexport function handleGhostApiHelp(input: GhostApiHelpInput): string {\n const { action, api } = input;\n\n if (action) {\n const help = getActionHelp(action, api as ApiType | undefined);\n if (!help) {\n return `Unknown action \"${action}\". Use ghost_api_help without arguments to see all available actions.`;\n }\n return help;\n }\n\n // List all actions grouped by resource and API\n const actions = listActions(api as ApiType | undefined);\n const grouped: Record<string, Record<string, typeof actions>> = {};\n\n for (const a of actions) {\n if (!grouped[a.api]) {\n grouped[a.api] = {};\n }\n const resource = a.name.split('.')[0];\n if (!grouped[a.api][resource]) {\n grouped[a.api][resource] = [];\n }\n grouped[a.api][resource].push(a);\n }\n\n const lines: string[] = ['# Ghost API Actions', ''];\n\n for (const [apiType, resources] of Object.entries(grouped)) {\n lines.push(`## ${apiType.charAt(0).toUpperCase() + apiType.slice(1)} API`, '');\n for (const [resource, resourceActions] of Object.entries(resources)) {\n lines.push(`### ${resource}`);\n for (const a of resourceActions) {\n lines.push(`- **${a.name}** — ${a.description}`);\n }\n lines.push('');\n }\n }\n\n lines.push(\n '---',\n '',\n 'Use `ghost_api_help` with `action` parameter for detailed schema info on any action.',\n );\n return lines.join('\\n');\n}\n","import { z } from 'zod';\nimport { docsApi } from '../ghost-client.js';\n\nexport const ghostDocsSchema = z.object({\n all: z.boolean().optional().describe('Return the full Ghost documentation (llms.txt)'),\n search: z\n .string()\n .optional()\n .describe('Case-insensitive substring search across the documentation'),\n regex: z.string().optional().describe('Regex pattern string to match (e.g. \"/pattern/i\")'),\n});\n\nexport type GhostDocsInput = z.infer<typeof ghostDocsSchema>;\n\nexport async function handleGhostDocs(input: GhostDocsInput): Promise<string> {\n const { all, search, regex } = input;\n\n if (!all && !search && !regex) {\n return 'Provide one of: `all: true` to get full docs, `search` for text search, or `regex` for pattern matching.';\n }\n\n const response = await docsApi.get('/llms.txt');\n const content = String(response.data);\n\n if (all) {\n return content;\n }\n\n const lines = content.split('\\n');\n const matchedLines: string[] = [];\n\n if (search) {\n const searchLower = search.toLowerCase();\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].toLowerCase().includes(searchLower)) {\n // Include context: 1 line before and after\n const start = Math.max(0, i - 1);\n const end = Math.min(lines.length - 1, i + 1);\n for (let j = start; j <= end; j++) {\n const line = `${j + 1}: ${lines[j]}`;\n if (!matchedLines.includes(line)) {\n matchedLines.push(line);\n }\n }\n }\n }\n }\n\n if (regex) {\n // Parse regex string: /pattern/flags or just pattern\n let pattern: RegExp;\n const regexMatch = regex.match(/^\\/(.+)\\/([gimsuy]*)$/);\n if (regexMatch) {\n pattern = new RegExp(regexMatch[1], regexMatch[2]);\n } else {\n pattern = new RegExp(regex);\n }\n\n for (let i = 0; i < lines.length; i++) {\n if (pattern.test(lines[i])) {\n const start = Math.max(0, i - 1);\n const end = Math.min(lines.length - 1, i + 1);\n for (let j = start; j <= end; j++) {\n const line = `${j + 1}: ${lines[j]}`;\n if (!matchedLines.includes(line)) {\n matchedLines.push(line);\n }\n }\n }\n }\n }\n\n if (matchedLines.length === 0) {\n return 'No matches found.';\n }\n\n return matchedLines.join('\\n');\n}\n","// Converts a small subset of inline markdown into Lexical inline nodes so prose\n// blocks render as native, editable text in Koenig (not raw HTML).\n//\n// Supported: **bold**, *italic* / _italic_, `code`, [label](url). Anything else\n// is preserved as plain text. Lexical text `format` is a bitmask:\n// 1=bold, 2=italic, 4=strikethrough, 8=underline, 16=code.\n\nexport interface TextNode {\n type: 'extended-text';\n version: 1;\n text: string;\n format: number;\n mode: 'normal';\n style: '';\n detail: 0;\n}\n\nexport interface LinkNode {\n type: 'link';\n version: 1;\n direction: 'ltr';\n format: '';\n indent: 0;\n rel: null;\n target: null;\n title: null;\n url: string;\n children: TextNode[];\n}\n\nexport type InlineNode = TextNode | LinkNode;\n\nexport const FORMAT = { bold: 1, italic: 2, strikethrough: 4, underline: 8, code: 16 } as const;\n\nfunction textNode(text: string, format = 0): TextNode {\n return {\n type: 'extended-text',\n version: 1,\n text,\n format,\n mode: 'normal',\n style: '',\n detail: 0,\n };\n}\n\nfunction linkNode(url: string, label: string): LinkNode {\n return {\n type: 'link',\n version: 1,\n direction: 'ltr',\n format: '',\n indent: 0,\n rel: null,\n target: null,\n title: null,\n url,\n children: [textNode(label)],\n };\n}\n\n// link | code | bold | italic(*) | italic(_) — ordered so ** is tried before *\nconst TOKEN =\n /\\[([^\\]]+)\\]\\(([^)\\s]+)\\)|`([^`]+)`|\\*\\*([^*]+)\\*\\*|\\*([^*]+)\\*|(?<![\\w])_([^_]+)_(?![\\w])/g;\n\nexport function parseInline(input: string): InlineNode[] {\n const nodes: InlineNode[] = [];\n let last = 0;\n let m: RegExpExecArray | null;\n TOKEN.lastIndex = 0;\n while ((m = TOKEN.exec(input)) !== null) {\n if (m.index > last) {\n nodes.push(textNode(input.slice(last, m.index)));\n }\n if (m[1] !== undefined) {\n nodes.push(linkNode(m[2], m[1]));\n } else if (m[3] !== undefined) {\n nodes.push(textNode(m[3], FORMAT.code));\n } else if (m[4] !== undefined) {\n nodes.push(textNode(m[4], FORMAT.bold));\n } else if (m[5] !== undefined) {\n nodes.push(textNode(m[5], FORMAT.italic));\n } else if (m[6] !== undefined) {\n nodes.push(textNode(m[6], FORMAT.italic));\n }\n last = m.index + m[0].length;\n }\n if (last < input.length) {\n nodes.push(textNode(input.slice(last)));\n }\n // a non-empty input must yield at least one node\n if (nodes.length === 0) {\n nodes.push(textNode(input));\n }\n return nodes;\n}\n","// AUTO-GENERATED from docs/koenig-node-specs.json by scripts/koenig/extract-specs.mjs.\n// Field/default/visibility schema for Koenig decorator (card) nodes. Do not edit by hand.\n\nexport interface KoenigNodeSpec {\n nodeType: string;\n hasVisibility: boolean;\n fields: Record<string, string | number | boolean | null>;\n}\n\nexport const NODE_SPECS: Record<string, KoenigNodeSpec> = {\n audio: {\n nodeType: 'audio',\n hasVisibility: false,\n fields: {\n duration: 0,\n mimeType: '',\n src: '',\n title: '',\n thumbnailSrc: '',\n },\n },\n bookmark: {\n nodeType: 'bookmark',\n hasVisibility: false,\n fields: {\n title: '',\n description: '',\n url: '',\n caption: '',\n author: '',\n publisher: '',\n },\n },\n button: {\n nodeType: 'button',\n hasVisibility: false,\n fields: {\n buttonText: '',\n alignment: 'center',\n buttonUrl: '',\n },\n },\n 'call-to-action': {\n nodeType: 'call-to-action',\n hasVisibility: true,\n fields: {\n layout: 'minimal',\n alignment: 'left',\n textValue: '',\n showButton: true,\n showDividers: true,\n buttonText: 'Learn more',\n buttonUrl: '',\n buttonColor: '#000000',\n buttonTextColor: '#ffffff',\n hasSponsorLabel: true,\n sponsorLabel: '<p><span style=\"white-space: pre-wrap;\">SPONSORED</span></p>',\n backgroundColor: 'grey',\n linkColor: 'text',\n imageUrl: '',\n imageWidth: null,\n imageHeight: null,\n },\n },\n callout: {\n nodeType: 'callout',\n hasVisibility: false,\n fields: {\n calloutText: '',\n calloutEmoji: '💡',\n backgroundColor: 'blue',\n },\n },\n codeblock: {\n nodeType: 'codeblock',\n hasVisibility: false,\n fields: {\n code: '',\n language: '',\n caption: '',\n },\n },\n email: {\n nodeType: 'email',\n hasVisibility: false,\n fields: {\n html: '',\n },\n },\n 'email-cta': {\n nodeType: 'email-cta',\n hasVisibility: false,\n fields: {\n alignment: 'left',\n buttonText: '',\n buttonUrl: '',\n html: '',\n segment: 'status:free',\n showButton: false,\n showDividers: true,\n },\n },\n embed: {\n nodeType: 'embed',\n hasVisibility: false,\n fields: {\n url: '',\n embedType: '',\n html: '',\n caption: '',\n },\n },\n file: {\n nodeType: 'file',\n hasVisibility: false,\n fields: {\n src: '',\n fileTitle: '',\n fileCaption: '',\n fileName: '',\n fileSize: 0,\n },\n },\n gallery: {\n nodeType: 'gallery',\n hasVisibility: false,\n fields: {\n images: '[]',\n caption: '',\n },\n },\n header: {\n nodeType: 'header',\n hasVisibility: false,\n fields: {\n size: 'small',\n style: 'dark',\n buttonEnabled: false,\n buttonUrl: '',\n buttonText: '',\n header: '',\n subheader: '',\n backgroundImageSrc: '',\n version: 1,\n accentColor: '#FF1A75',\n alignment: 'center',\n backgroundColor: '#000000',\n backgroundImageWidth: null,\n backgroundImageHeight: null,\n backgroundSize: 'cover',\n textColor: '#FFFFFF',\n buttonColor: '#ffffff',\n buttonTextColor: '#000000',\n layout: 'full',\n swapped: false,\n },\n },\n html: {\n nodeType: 'html',\n hasVisibility: true,\n fields: {\n html: '',\n },\n },\n image: {\n nodeType: 'image',\n hasVisibility: false,\n fields: {\n src: '',\n caption: '',\n title: '',\n alt: '',\n cardWidth: 'regular',\n width: null,\n height: null,\n href: '',\n },\n },\n markdown: {\n nodeType: 'markdown',\n hasVisibility: false,\n fields: {\n markdown: '',\n },\n },\n product: {\n nodeType: 'product',\n hasVisibility: false,\n fields: {\n productImageSrc: '',\n productImageWidth: null,\n productImageHeight: null,\n productTitle: '',\n productDescription: '',\n productRatingEnabled: false,\n productStarRating: 5,\n productButtonEnabled: false,\n productButton: '',\n productUrl: '',\n },\n },\n signup: {\n nodeType: 'signup',\n hasVisibility: false,\n fields: {\n alignment: 'left',\n backgroundColor: '#F0F0F0',\n backgroundImageSrc: '',\n backgroundSize: 'cover',\n textColor: '',\n buttonColor: 'accent',\n buttonTextColor: '#FFFFFF',\n buttonText: 'Subscribe',\n disclaimer: '',\n header: '',\n layout: 'wide',\n subheader: '',\n successMessage: 'Email sent! Check your inbox to complete your signup.',\n swapped: false,\n },\n },\n toggle: {\n nodeType: 'toggle',\n hasVisibility: false,\n fields: {\n heading: '',\n content: '',\n },\n },\n transistor: {\n nodeType: 'transistor',\n hasVisibility: true,\n fields: {\n accentColor: '',\n backgroundColor: '',\n },\n },\n video: {\n nodeType: 'video',\n hasVisibility: false,\n fields: {\n src: '',\n caption: '',\n fileName: '',\n mimeType: '',\n width: null,\n height: null,\n duration: 0,\n thumbnailSrc: '',\n customThumbnailSrc: '',\n thumbnailWidth: null,\n thumbnailHeight: null,\n cardWidth: 'regular',\n loop: false,\n },\n },\n};\n","// Friendly block -> Lexical decorator (card) node builders. Each entry maps an\n// LLM-facing block shape to the exact Koenig node validated in docs/koenig-cards.\n// Field aliases keep the block API readable (text/emoji/color) while emitting the\n// real lexical field names (calloutText/calloutEmoji/backgroundColor).\nimport { NODE_SPECS } from './node-specs.js';\nimport { isRecord } from './util.js';\n\nexport type Fields = Record<string, unknown>;\nexport type LexicalNode = Record<string, unknown>;\n\nexport interface CardDef {\n /** lexical node `type` */\n nodeType: string;\n version: number;\n group: string;\n description: string;\n /** friendly field names that must be present */\n required: string[];\n /** friendly field name -> lexical field name */\n aliases: Record<string, string>;\n /** friendly-shaped example block (without `type`) */\n example: Fields;\n /** custom builder; default applies aliases + passes through known lexical fields */\n build?: (fields: Fields) => LexicalNode;\n}\n\nfunction passthrough(def: CardDef, fields: Fields): LexicalNode {\n const spec = NODE_SPECS[def.nodeType];\n const validFields = spec ? new Set(Object.keys(spec.fields)) : null;\n const node: LexicalNode = {};\n for (const [key, value] of Object.entries(fields)) {\n const target = def.aliases[key] ?? key;\n if (validFields && !validFields.has(target)) {\n const allowed = [...Object.keys(def.aliases), ...(validFields ?? [])].join(', ');\n throw new Error(\n `unknown field \"${key}\" for card \"${def.nodeType}\". allowed: ${allowed}`,\n );\n }\n node[target] = value;\n }\n return node;\n}\n\n/** keyed by the friendly block `type` the LLM writes */\nexport const CARDS: Record<string, CardDef> = {\n image: {\n nodeType: 'image',\n version: 1,\n group: 'media',\n description: 'An image with optional caption, alt text, and link.',\n required: ['src'],\n aliases: {},\n example: { src: 'https://example.com/photo.jpg', alt: 'A photo', caption: 'My caption' },\n },\n gallery: {\n nodeType: 'gallery',\n version: 1,\n group: 'media',\n description:\n 'A grid of images. Provide `images` as an array of { src, alt?, width?, height? }.',\n required: ['images'],\n aliases: {},\n example: {\n images: [{ src: 'https://example.com/1.jpg' }, { src: 'https://example.com/2.jpg' }],\n caption: 'Trip photos',\n },\n build(fields) {\n const images = Array.isArray(fields.images) ? fields.images : [];\n const built = images.map((img, i) => {\n const o = isRecord(img) ? img : {};\n return {\n fileName: o.fileName ?? `image-${i}.jpg`,\n row: o.row ?? 0,\n src: o.src ?? '',\n width: o.width ?? 0,\n height: o.height ?? 0,\n title: o.title ?? '',\n alt: o.alt ?? '',\n };\n });\n const node: LexicalNode = { images: built };\n if (typeof fields.caption === 'string') {\n node.caption = fields.caption;\n }\n return node;\n },\n },\n video: {\n nodeType: 'video',\n version: 1,\n group: 'media',\n description: 'A video file. Needs `src`; `thumbnailSrc` sets the poster.',\n required: ['src'],\n aliases: { thumbnail: 'thumbnailSrc' },\n example: {\n src: 'https://example.com/clip.mp4',\n caption: 'A clip',\n thumbnail: 'https://example.com/poster.jpg',\n },\n },\n audio: {\n nodeType: 'audio',\n version: 1,\n group: 'media',\n description: 'An audio file with a title.',\n required: ['src'],\n aliases: { thumbnail: 'thumbnailSrc' },\n example: { src: 'https://example.com/track.mp3', title: 'Episode 1', duration: 320 },\n },\n file: {\n nodeType: 'file',\n version: 1,\n group: 'media',\n description: 'A downloadable file card.',\n required: ['src'],\n aliases: { title: 'fileTitle', name: 'fileName', caption: 'fileCaption', size: 'fileSize' },\n example: {\n src: 'https://example.com/guide.pdf',\n title: 'Whitepaper',\n caption: 'Download our guide',\n },\n },\n bookmark: {\n nodeType: 'bookmark',\n version: 1,\n group: 'embed',\n description:\n 'A rich link preview. Provide `url`; optionally title/description/author/publisher/icon/thumbnail.',\n required: ['url'],\n aliases: {},\n example: { url: 'https://ghost.org', title: 'Ghost', description: 'Publishing platform' },\n build(fields) {\n const metaKeys = [\n 'title',\n 'description',\n 'author',\n 'publisher',\n 'icon',\n 'thumbnail',\n ] as const;\n const metadata: Record<string, unknown> = { url: fields.url };\n for (const k of metaKeys) {\n metadata[k] = fields[k] ?? (k === 'author' ? null : '');\n }\n const node: LexicalNode = { url: fields.url, caption: fields.caption ?? '', metadata };\n return node;\n },\n },\n embed: {\n nodeType: 'embed',\n version: 1,\n group: 'embed',\n description:\n 'An external embed (YouTube, Twitter, etc.). Provide `url` and the embed `html`.',\n required: ['url'],\n aliases: {},\n example: {\n url: 'https://youtube.com/watch?v=abc',\n embedType: 'video',\n html: '<iframe src=\"...\"></iframe>',\n },\n },\n html: {\n nodeType: 'html',\n version: 1,\n group: 'embed',\n description: 'Raw HTML passthrough. Use only when no native card fits.',\n required: ['html'],\n aliases: {},\n example: { html: '<div class=\"custom\">Raw HTML</div>' },\n },\n markdown: {\n nodeType: 'markdown',\n version: 1,\n group: 'embed',\n description:\n 'A markdown block (rendered as one unit). Prefer paragraph/heading/list blocks for editable prose.',\n required: ['markdown'],\n aliases: { text: 'markdown' },\n example: { markdown: '## Heading\\n\\nSome **markdown**.' },\n },\n codeblock: {\n nodeType: 'codeblock',\n version: 1,\n group: 'embed',\n description: 'A syntax-highlighted code block.',\n required: ['code'],\n aliases: { lang: 'language' },\n example: { code: 'const x = 1;', language: 'javascript', caption: 'snippet' },\n },\n callout: {\n nodeType: 'callout',\n version: 1,\n group: 'layout',\n description: 'A highlighted callout box with an emoji and background color.',\n required: ['text'],\n aliases: { text: 'calloutText', emoji: 'calloutEmoji', color: 'backgroundColor' },\n example: { text: 'Heads up!', emoji: '💡', color: 'blue' },\n },\n toggle: {\n nodeType: 'toggle',\n version: 1,\n group: 'layout',\n description: 'A collapsible accordion. `content` is HTML. (No-op in email.)',\n required: ['heading'],\n aliases: {},\n example: { heading: 'Click to expand', content: '<p>Hidden content.</p>' },\n },\n button: {\n nodeType: 'button',\n version: 1,\n group: 'layout',\n description: 'A call-to-action button.',\n required: ['text', 'url'],\n aliases: { text: 'buttonText', url: 'buttonUrl' },\n example: { text: 'Subscribe', url: 'https://example.com', alignment: 'center' },\n },\n header: {\n nodeType: 'header',\n version: 2,\n group: 'layout',\n description: 'A large hero header with optional background image and button.',\n required: [],\n aliases: { title: 'header' },\n example: {\n header: 'Big Header',\n subheader: 'A subheader',\n buttonEnabled: true,\n buttonText: 'Start',\n buttonUrl: 'https://example.com',\n },\n },\n cta: {\n nodeType: 'call-to-action',\n version: 1,\n group: 'layout',\n description:\n 'A call-to-action card with text, optional image and button. `text` accepts HTML or plain text.',\n required: [],\n aliases: { buttonColor: 'buttonColor' },\n example: {\n text: 'Subscribe for more.',\n buttonText: 'Join',\n buttonUrl: 'https://example.com',\n showButton: true,\n },\n build(fields) {\n const node: LexicalNode = {};\n const passKeys = [\n 'layout',\n 'alignment',\n 'showButton',\n 'showDividers',\n 'buttonText',\n 'buttonUrl',\n 'buttonColor',\n 'buttonTextColor',\n 'hasSponsorLabel',\n 'sponsorLabel',\n 'backgroundColor',\n 'linkColor',\n 'imageUrl',\n 'imageWidth',\n 'imageHeight',\n 'visibility',\n ] as const;\n for (const k of passKeys) {\n if (k in fields) {\n node[k] = fields[k];\n }\n }\n if (typeof fields.text === 'string') {\n node.textValue = /^\\s*</.test(fields.text) ? fields.text : `<p>${fields.text}</p>`;\n }\n return node;\n },\n },\n signup: {\n nodeType: 'signup',\n version: 1,\n group: 'membership',\n description: 'A member signup form. (No-op in email.)',\n required: [],\n aliases: {},\n example: { header: 'Subscribe', subheader: 'Join the newsletter', disclaimer: 'No spam.' },\n },\n product: {\n nodeType: 'product',\n version: 1,\n group: 'layout',\n description: 'A product card with image, rating, and button.',\n required: ['productTitle'],\n aliases: {\n title: 'productTitle',\n description: 'productDescription',\n image: 'productImageSrc',\n button: 'productButton',\n url: 'productUrl',\n rating: 'productStarRating',\n },\n example: {\n title: 'The Product',\n description: 'A great product.',\n rating: 5,\n button: 'Buy',\n url: 'https://example.com',\n productButtonEnabled: true,\n productRatingEnabled: true,\n },\n },\n divider: {\n nodeType: 'horizontalrule',\n version: 1,\n group: 'divider',\n description: 'A horizontal rule / divider.',\n required: [],\n aliases: {},\n example: {},\n build() {\n return {};\n },\n },\n paywall: {\n nodeType: 'paywall',\n version: 1,\n group: 'membership',\n description: 'Splits free vs members-only content. Everything after it is members-only.',\n required: [],\n aliases: {},\n example: {},\n build() {\n return {};\n },\n },\n email: {\n nodeType: 'email',\n version: 1,\n group: 'email-only',\n description:\n 'Content shown ONLY in the email newsletter (empty on web). `html` supports {first_name, \"fallback\"}.',\n required: ['html'],\n aliases: {},\n example: { html: '<p>Hello {first_name, \"there\"}!</p>' },\n },\n 'email-cta': {\n nodeType: 'email-cta',\n version: 1,\n group: 'email-only',\n description: 'A newsletter-only call to action targeting a member segment.',\n required: [],\n aliases: {},\n example: {\n html: '<p>Read more.</p>',\n buttonText: 'Read',\n buttonUrl: 'https://example.com',\n segment: 'status:free',\n },\n },\n};\n\nexport function buildCardNode(blockType: string, fields: Fields): LexicalNode {\n const def = CARDS[blockType];\n if (!def) {\n throw new Error(`unknown card type \"${blockType}\"`);\n }\n for (const r of def.required) {\n if (fields[r] === undefined || fields[r] === null || fields[r] === '') {\n throw new Error(`card \"${blockType}\" requires field \"${r}\"`);\n }\n }\n const data = def.build ? def.build(fields) : passthrough(def, fields);\n return { type: def.nodeType, version: def.version, ...data };\n}\n\nexport function isCardType(blockType: string): boolean {\n return blockType in CARDS;\n}\n","// Turns a friendly block into a Lexical node. Prose blocks (paragraph, heading,\n// list, quote, aside) become native element nodes with inline-markdown children\n// so they stay editable in Koenig; everything else dispatches to a card builder.\nimport { parseInline } from './inline.js';\nimport type { InlineNode } from './inline.js';\nimport { buildCardNode, isCardType, CARDS } from './cards.js';\nimport type { LexicalNode } from './cards.js';\nimport { isRecord } from './util.js';\n\nexport interface Block {\n type: string;\n [key: string]: unknown;\n}\n\nconst ELEMENT = { direction: 'ltr', format: '', indent: 0 } as const;\n\nfunction element(type: string, extra: LexicalNode, children: unknown[]): LexicalNode {\n return { type, version: 1, ...ELEMENT, ...extra, children };\n}\n\nfunction asString(value: unknown, field: string, blockType: string): string {\n if (typeof value !== 'string') {\n throw new Error(`block \"${blockType}\" field \"${field}\" must be a string`);\n }\n return value;\n}\n\nfunction buildProse(block: Block): LexicalNode | null {\n switch (block.type) {\n case 'paragraph': {\n return element('paragraph', {}, parseInline(asString(block.text, 'text', 'paragraph')));\n }\n case 'heading': {\n const level =\n typeof block.level === 'number' ? Math.min(6, Math.max(1, block.level)) : 2;\n return element(\n 'extended-heading',\n { tag: `h${level}` },\n parseInline(asString(block.text, 'text', 'heading')),\n );\n }\n case 'quote': {\n return element(\n 'extended-quote',\n {},\n parseInline(asString(block.text, 'text', 'quote')),\n );\n }\n case 'aside': {\n return element('aside', {}, parseInline(asString(block.text, 'text', 'aside')));\n }\n case 'list': {\n const items = Array.isArray(block.items) ? block.items : [];\n if (items.length === 0) {\n throw new Error('block \"list\" requires a non-empty \"items\" array');\n }\n const ordered = block.style === 'number' || block.style === 'ordered';\n const children = items.map(\n (item, i): LexicalNode =>\n element('listitem', { value: i + 1 }, parseInline(String(item))),\n );\n return element(\n 'list',\n {\n listType: ordered ? 'number' : 'bullet',\n tag: ordered ? 'ol' : 'ul',\n start: 1,\n },\n children,\n );\n }\n default: {\n return null;\n }\n }\n}\n\nfunction isBlock(value: unknown): value is Block {\n return isRecord(value) && typeof value.type === 'string';\n}\n\nexport function buildBlock(block: unknown): LexicalNode {\n if (!isBlock(block)) {\n throw new Error('each block must be an object with a string \"type\"');\n }\n const prose = buildProse(block);\n if (prose) {\n return prose;\n }\n if (isCardType(block.type)) {\n const { type, ...fields } = block;\n return buildCardNode(type, fields);\n }\n throw new Error(\n `unknown block type \"${block.type}\". valid types: ${[...PROSE_TYPES, ...Object.keys(CARDS)].join(', ')}`,\n );\n}\n\nexport const PROSE_TYPES = ['paragraph', 'heading', 'list', 'quote', 'aside'] as const;\n\nexport type { InlineNode };\n","// compose(blocks) -> a valid Lexical document string for the Ghost `lexical`\n// field. Aggregates per-block errors so the LLM gets actionable feedback.\nimport { buildBlock } from './blocks.js';\nimport type { LexicalNode } from './cards.js';\nimport { isRecord } from './util.js';\n\nexport interface ComposeIssue {\n index: number;\n type: string;\n message: string;\n}\n\nexport class ComposeError extends Error {\n constructor(public issues: ComposeIssue[]) {\n const detail = issues.map((i) => `[#${i.index} ${i.type}] ${i.message}`).join('; ');\n super(\n `composition failed (${issues.length} issue${issues.length === 1 ? '' : 's'}): ${detail}`,\n );\n this.name = 'ComposeError';\n }\n}\n\nexport function composeRoot(blocks: unknown[]): LexicalNode {\n if (!Array.isArray(blocks) || blocks.length === 0) {\n throw new ComposeError([\n { index: -1, type: '(none)', message: 'blocks must be a non-empty array' },\n ]);\n }\n const children: LexicalNode[] = [];\n const issues: ComposeIssue[] = [];\n blocks.forEach((block, index) => {\n try {\n children.push(buildBlock(block));\n } catch (error) {\n issues.push({\n index,\n type: isRecord(block) && typeof block.type === 'string' ? block.type : '(invalid)',\n message: error instanceof Error ? error.message : String(error),\n });\n }\n });\n if (issues.length > 0) {\n throw new ComposeError(issues);\n }\n return {\n root: { type: 'root', version: 1, direction: 'ltr', format: '', indent: 0, children },\n };\n}\n\nexport function compose(blocks: unknown[]): string {\n return JSON.stringify(composeRoot(blocks));\n}\n","// Human/LLM-readable catalog of block types for the koenig help tool. Built from\n// the same registry the composer uses, so help can never drift from behavior.\nimport { CARDS } from './cards.js';\n\ninterface ProseHelp {\n type: string;\n description: string;\n example: Record<string, unknown>;\n}\n\nconst PROSE: ProseHelp[] = [\n {\n type: 'paragraph',\n description:\n 'A text paragraph. `text` supports inline **bold**, _italic_, `code`, [links](url).',\n example: { type: 'paragraph', text: 'Some **bold** and a [link](https://x.com).' },\n },\n {\n type: 'heading',\n description: 'A heading. `level` 1–6 (default 2). `text` supports inline markdown.',\n example: { type: 'heading', level: 2, text: 'Section title' },\n },\n {\n type: 'list',\n description:\n 'A bullet or numbered list. `style`: \"bullet\" (default) or \"number\". `items` is a string array (inline markdown supported).',\n example: { type: 'list', style: 'bullet', items: ['First', 'Second'] },\n },\n {\n type: 'quote',\n description: 'A blockquote. `text` supports inline markdown.',\n example: { type: 'quote', text: 'A memorable quote.' },\n },\n {\n type: 'aside',\n description: 'A pull-quote / aside.',\n example: { type: 'aside', text: 'An aside.' },\n },\n];\n\nexport function listBlockTypes(): string[] {\n return [...PROSE.map((p) => p.type), ...Object.keys(CARDS)];\n}\n\nexport function blockHelp(blockType?: string): string {\n if (blockType) {\n const prose = PROSE.find((p) => p.type === blockType);\n if (prose) {\n return [\n `# block: ${prose.type}`,\n '',\n prose.description,\n '',\n '```json',\n JSON.stringify(prose.example, null, 2),\n '```',\n ].join('\\n');\n }\n const card = CARDS[blockType];\n if (!card) {\n return `Unknown block type \"${blockType}\". Run koenig_help with no argument to list all block types.`;\n }\n const example = { type: blockType, ...card.example };\n const lines = [\n `# block: ${blockType}`,\n '',\n `${card.description}`,\n '',\n `- Lexical node: \\`${card.nodeType}\\` (version ${card.version})`,\n card.required.length\n ? `- Required fields: ${card.required.map((r) => `\\`${r}\\``).join(', ')}`\n : '- Required fields: none',\n ];\n if (Object.keys(card.aliases).length) {\n lines.push(\n `- Aliases: ${Object.entries(card.aliases)\n .map(([f, t]) => `\\`${f}\\`→\\`${t}\\``)\n .join(', ')}`,\n );\n }\n lines.push('', '```json', JSON.stringify(example, null, 2), '```');\n return lines.join('\\n');\n }\n\n const lines = [\n '# Koenig block types',\n '',\n 'Compose posts from these blocks instead of raw HTML — they produce clean, natively-editable Ghost content.',\n '',\n '## Prose (native, inline markdown in `text`)',\n ];\n for (const p of PROSE) {\n lines.push(`- **${p.type}** — ${p.description}`);\n }\n\n const byGroup: Record<string, string[]> = {};\n for (const [type, def] of Object.entries(CARDS)) {\n (byGroup[def.group] ??= []).push(`- **${type}** — ${def.description}`);\n }\n for (const [group, entries] of Object.entries(byGroup)) {\n lines.push('', `## ${group}`);\n lines.push(...entries);\n }\n lines.push(\n '',\n 'Use `koenig_help` with a `block` name for fields + a JSON example. Then call `compose_post` (creates the post) or `compose_lexical` (returns the lexical string).',\n );\n return lines.join('\\n');\n}\n","// Resolve a block list from either an inline array or an absolute JSON file.\n// File mode lets a client compose long posts in its own working file (validating\n// as it edits) and pass just the path, instead of re-emitting the whole array.\nimport { readFileSync } from 'node:fs';\nimport { isAbsolute } from 'node:path';\nimport { isRecord } from '../koenig/util.js';\n\nexport interface BlocksSource {\n blocks?: unknown[];\n blockFile?: string;\n}\n\nfunction extractBlocks(parsed: unknown): unknown[] | null {\n if (Array.isArray(parsed)) {\n return parsed;\n }\n if (isRecord(parsed) && Array.isArray(parsed.blocks)) {\n return parsed.blocks;\n }\n return null;\n}\n\nexport function resolveBlocks(src: BlocksSource): unknown[] {\n const hasFile = typeof src.blockFile === 'string' && src.blockFile.trim() !== '';\n\n if (Array.isArray(src.blocks)) {\n if (hasFile) {\n throw new Error('provide either \"blocks\" or \"blockFile\", not both');\n }\n return src.blocks;\n }\n\n if (!hasFile) {\n throw new Error(\n 'provide \"blocks\" (inline array) or \"blockFile\" (absolute path to a JSON file of blocks)',\n );\n }\n\n const file = src.blockFile;\n if (typeof file !== 'string') {\n throw new Error('blockFile must be a string path');\n }\n if (!isAbsolute(file)) {\n throw new Error(\n `blockFile must be an absolute path (got \"${file}\"). Write the JSON to an absolute path, e.g. under your tmp/ directory.`,\n );\n }\n\n let raw: string;\n try {\n raw = readFileSync(file, 'utf8');\n } catch {\n throw new Error(`could not read blockFile: ${file}`);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`blockFile is not valid JSON: ${file}`);\n }\n\n const blocks = extractBlocks(parsed);\n if (!blocks) {\n throw new Error(\n `blockFile must contain a JSON array of blocks, or { \"blocks\": [...] }: ${file}`,\n );\n }\n return blocks;\n}\n","import { z } from 'zod';\nimport { compose, ComposeError } from '../koenig/index.js';\nimport { handleUseGhostApi } from './use-ghost-api.js';\nimport { resolveBlocks } from './blocks-source.js';\n\nconst blockSchema = z\n .object({\n type: z\n .string()\n .describe(\n 'Block type: paragraph, heading, list, quote, aside, image, gallery, video, audio, file, bookmark, embed, html, markdown, codeblock, callout, toggle, button, header, cta, signup, product, divider, paywall, email, email-cta. Run koenig_help for fields.',\n ),\n })\n .passthrough();\n\nconst composeFields = {\n blocks: z\n .array(blockSchema)\n .optional()\n .describe(\n 'Ordered content blocks (inline). Prefer native blocks (paragraph/heading/list/quote) and cards over raw html. Prose `text` supports inline **bold**, _italic_, `code`, [links](url). Use koenig_help to discover block fields. For long posts, write the blocks to a JSON file and pass `blockFile` instead.',\n ),\n blockFile: z\n .string()\n .optional()\n .describe(\n 'Absolute path to a local JSON file containing the blocks — either a bare array `[...]` or `{ \"blocks\": [...] }`. Use this for long posts: compose/edit the file (validating with compose_lexical), then pass the path instead of re-sending the whole array. Provide exactly one of `blocks` or `blockFile`. Writing to an absolute path under tmp/ is recommended.',\n ),\n title: z.string().optional().describe('Post title (required when creating a new post)'),\n id: z.string().optional().describe('Post ID to update. Omit to create a new post.'),\n updated_at: z\n .string()\n .optional()\n .describe(\n \"Required when updating (id set): the post's current updated_at, for collision detection. Get it via posts.read.\",\n ),\n status: z\n .enum(['published', 'draft', 'scheduled'])\n .optional()\n .describe('Post status (default draft)'),\n tags: z\n .array(z.union([z.object({ id: z.string() }), z.object({ name: z.string() })]))\n .optional()\n .describe('Tags to assign (by id or name)'),\n feature_image: z.string().optional().describe('Feature image URL'),\n excerpt: z.string().optional().describe('Custom excerpt (maps to custom_excerpt)'),\n slug: z.string().optional().describe('Custom URL slug'),\n visibility: z.string().optional().describe('public, members, paid, or tiers'),\n};\n\nexport const composePostSchema = z.object(composeFields);\n\nexport type ComposePostInput = z.infer<typeof composePostSchema>;\n\nexport async function handleComposePost(input: ComposePostInput, mode: string): Promise<string> {\n let lexical: string;\n try {\n const blocks = resolveBlocks({ blocks: input.blocks, blockFile: input.blockFile });\n lexical = compose(blocks);\n } catch (error) {\n if (error instanceof ComposeError) {\n return JSON.stringify({ error: 'composition failed', issues: error.issues });\n }\n return JSON.stringify({\n error: 'invalid blocks input',\n message: error instanceof Error ? error.message : String(error),\n });\n }\n\n const { blocks: _blocks, blockFile: _blockFile, id, excerpt, ...rest } = input;\n const payload: Record<string, unknown> = { ...rest, lexical };\n if (excerpt !== undefined) {\n payload.custom_excerpt = excerpt;\n }\n\n if (id) {\n return handleUseGhostApi(\n { api: 'admin', action: 'posts.edit', payload: { id, ...payload } },\n mode,\n );\n }\n return handleUseGhostApi({ api: 'admin', action: 'posts.add', payload }, mode);\n}\n","import { z } from 'zod';\nimport { compose, ComposeError } from '../koenig/index.js';\nimport { resolveBlocks } from './blocks-source.js';\n\nexport const composeLexicalSchema = z.object({\n blocks: z\n .array(z.object({ type: z.string() }).passthrough())\n .optional()\n .describe('Ordered content blocks (same shape as compose_post), inline.'),\n blockFile: z\n .string()\n .optional()\n .describe(\n 'Absolute path to a JSON file of blocks. Use to validate a file you are building before calling compose_post. Provide exactly one of `blocks` or `blockFile`.',\n ),\n});\n\nexport type ComposeLexicalInput = z.infer<typeof composeLexicalSchema>;\n\nexport function handleComposeLexical(input: ComposeLexicalInput): string {\n try {\n const blocks = resolveBlocks({ blocks: input.blocks, blockFile: input.blockFile });\n const lexical = compose(blocks);\n return JSON.stringify({ lexical });\n } catch (error) {\n if (error instanceof ComposeError) {\n return JSON.stringify({ error: 'composition failed', issues: error.issues });\n }\n return JSON.stringify({\n error: 'invalid blocks input',\n message: error instanceof Error ? error.message : String(error),\n });\n }\n}\n","import { z } from 'zod';\nimport { blockHelp } from '../koenig/index.js';\n\nexport const koenigHelpSchema = z.object({\n block: z\n .string()\n .optional()\n .describe(\n 'A block type (e.g. \"callout\", \"image\") for its fields + a JSON example. Omit to list all block types.',\n ),\n});\n\nexport type KoenigHelpInput = z.infer<typeof koenigHelpSchema>;\n\nexport function handleKoenigHelp(input: KoenigHelpInput): string {\n return blockHelp(input.block);\n}\n","import { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\nconst packageJson = require('../package.json') as { version: string };\n\nexport const VERSION = packageJson.version;\n","#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { useGhostApiSchema, handleUseGhostApi } from './tools/use-ghost-api.js';\nimport { ghostApiHelpSchema, handleGhostApiHelp } from './tools/ghost-api-help.js';\nimport { ghostDocsSchema, handleGhostDocs } from './tools/ghost-docs.js';\nimport { composePostSchema, handleComposePost } from './tools/compose-post.js';\nimport { composeLexicalSchema, handleComposeLexical } from './tools/compose-lexical.js';\nimport { koenigHelpSchema, handleKoenigHelp } from './tools/koenig-help.js';\nimport { blockHelp } from './koenig/index.js';\nimport { VERSION } from './version.js';\n\nconst GHOST_API_MODE = process.env.GHOST_API_MODE || 'admin';\n\nconst server = new McpServer({\n name: 'ghost-mcp',\n version: VERSION,\n});\n\nserver.tool(\n 'use_ghost_api',\n 'Execute a Ghost API action (browse, read, add, edit, delete posts, pages, tags, members, newsletters, and more)',\n useGhostApiSchema.shape,\n async ({ api, action, payload }) => {\n const result = await handleUseGhostApi({ api, action, payload }, GHOST_API_MODE);\n return { content: [{ type: 'text' as const, text: result }] };\n },\n);\n\nserver.tool(\n 'ghost_api_help',\n 'Get help on available Ghost API actions — list all actions or get detailed schema info for a specific action',\n ghostApiHelpSchema.shape,\n async ({ action, api }) => {\n const result = handleGhostApiHelp({ action, api });\n return { content: [{ type: 'text' as const, text: result }] };\n },\n);\n\nserver.tool(\n 'ghost_docs',\n 'Search Ghost CMS documentation — fetch full docs, search by text, or match with regex',\n ghostDocsSchema.shape,\n async ({ all, search, regex }) => {\n const result = await handleGhostDocs({ all, search, regex });\n return { content: [{ type: 'text' as const, text: result }] };\n },\n);\n\nserver.tool(\n 'compose_post',\n 'Create or update a Ghost post from structured Koenig content blocks (paragraphs, headings, lists, callouts, images, buttons, etc.). PREFER THIS over use_ghost_api with raw html/lexical — it produces clean, natively-editable posts. Pass blocks inline for short posts, or write them to a JSON file and pass `blockFile` (absolute path) for long posts. Omit `id` to create, set `id`+`updated_at` to update. Call koenig_help to discover block types and fields.',\n composePostSchema.shape,\n async (input) => {\n const result = await handleComposePost(input, GHOST_API_MODE);\n return { content: [{ type: 'text' as const, text: result }] };\n },\n);\n\nserver.tool(\n 'compose_lexical',\n 'Compile Koenig content blocks into a Lexical JSON string without creating a post (for preview/inspection). Same block shape as compose_post.',\n composeLexicalSchema.shape,\n async (input) => {\n const result = handleComposeLexical(input);\n return { content: [{ type: 'text' as const, text: result }] };\n },\n);\n\nserver.tool(\n 'koenig_help',\n 'List Koenig content block types, or get the fields and a JSON example for one block. Use before compose_post to build clean, editable posts instead of raw HTML.',\n koenigHelpSchema.shape,\n async ({ block }) => {\n const result = handleKoenigHelp({ block });\n return { content: [{ type: 'text' as const, text: result }] };\n },\n);\n\nserver.registerPrompt(\n 'compose_ghost_post',\n {\n description:\n 'Guidance for composing clean, editable Ghost posts from Koenig blocks instead of raw HTML.',\n },\n () => ({\n messages: [\n {\n role: 'assistant' as const,\n content: {\n type: 'text' as const,\n text: [\n 'When writing Ghost post content, do NOT push raw HTML into the API. Compose the post from structured Koenig blocks via the `compose_post` tool — this yields clean, natively-editable posts.',\n 'Workflow: (1) call `koenig_help` to see block types; (2) build a `blocks` array — prose as paragraph/heading/list/quote blocks (their `text` supports inline **bold**, _italic_, `code`, [links](url)), and rich features as cards (callout, image, button, bookmark, embed, codeblock, toggle, gallery, etc.); (3) call `compose_post`. Use the `html` block ONLY when no native block fits.',\n 'For a short post, pass `blocks` inline. For a long post, write the blocks JSON to an absolute path (e.g. under tmp/), optionally validate it with `compose_lexical` (`blockFile`), then call `compose_post` with `blockFile` — this avoids re-sending the whole array on each edit.',\n blockHelp(),\n ].join('\\n\\n'),\n },\n },\n ],\n }),\n);\n\nasync function main(): Promise<void> {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n"],"mappings":"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"}
|