@damusix/ghost-mcp 0.2.0 → 0.2.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/dist/index.mjs CHANGED
@@ -4,6 +4,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
4
4
  import { z } from "zod";
5
5
  import { attempt } from "@logosdx/utils";
6
6
  import { FetchEngine, config, get } from "@logosdx/fetch";
7
+ import mimeDb from "mime-db";
7
8
  import jwt from "jsonwebtoken";
8
9
  //#region src/ghost-client.ts
9
10
  const GHOST_URL = process.env.GHOST_URL || "";
@@ -1225,6 +1226,8 @@ function initRegistry() {
1225
1226
  initRegistry();
1226
1227
  //#endregion
1227
1228
  //#region src/tools/use-ghost-api.ts
1229
+ const extToMime = {};
1230
+ for (const [mime, meta] of Object.entries(mimeDb)) for (const ext of meta.extensions ?? []) extToMime[`.${ext}`] = mime;
1228
1231
  const useGhostApiSchema = z.object({
1229
1232
  api: z.enum(["admin", "content"]).describe("Which API to use: \"admin\" for full access, \"content\" for read-only public data"),
1230
1233
  action: z.string().describe("Action to execute (e.g. \"posts.browse\", \"members.add\")"),
@@ -1326,11 +1329,14 @@ async function handleFileUpload(actionName, payload, path) {
1326
1329
  fileBuffer = Buffer.from(fileInput, "base64");
1327
1330
  filename = actionName === "images.upload" ? "image.jpg" : "theme.zip";
1328
1331
  }
1332
+ const mimeType = extToMime[filename.includes(".") ? filename.slice(filename.lastIndexOf(".")).toLowerCase() : ""] || "application/octet-stream";
1329
1333
  const formData = new FormData();
1330
- const blob = new Blob([new Uint8Array(fileBuffer)]);
1334
+ const blob = new Blob([new Uint8Array(fileBuffer)], { type: mimeType });
1331
1335
  formData.append("file", blob, filename);
1332
1336
  if (ref) formData.append("ref", ref);
1333
- const [response, err] = await attempt(async () => adminApi.post(path, formData, { headers: { "Content-Type": void 0 } }));
1337
+ const [response, err] = await attempt(async () => adminApi.post(path, formData, { onBeforeReq: (opts) => {
1338
+ delete opts.headers["Content-Type"];
1339
+ } }));
1334
1340
  if (err) return JSON.stringify({ error: err.message });
1335
1341
  return JSON.stringify(response);
1336
1342
  }
@@ -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};\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};\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};\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});\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};\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});\n\nconst editSchema = z.object({\n id: z.string().describe('Offer ID (required)'),\n name: z.string().optional().describe('Internal name'),\n code: z.string().optional().describe('Unique code for the offer URL'),\n display_title: z.string().optional().describe('Title shown to users'),\n display_description: z.string().optional().describe('Description shown to users'),\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\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 lines.push(`- **${key}**${isOptional ? ' (optional)' : ' (required)'}: ${desc}`);\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 { adminApi, contentApi } from '../ghost-client.js';\nimport { getAction } from '../actions/registry.js';\nimport type { ApiType } from '../actions/registry.js';\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 formData = new FormData();\n const blob = new Blob([new Uint8Array(fileBuffer)]);\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 headers: { 'Content-Type': undefined as unknown as string },\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/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};\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};\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};\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});\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};\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});\n\nconst editSchema = z.object({\n id: z.string().describe('Offer ID (required)'),\n name: z.string().optional().describe('Internal name'),\n code: z.string().optional().describe('Unique code for the offer URL'),\n display_title: z.string().optional().describe('Title shown to users'),\n display_description: z.string().optional().describe('Description shown to users'),\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\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 lines.push(`- **${key}**${isOptional ? ' (optional)' : ' (required)'}: ${desc}`);\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@damusix/ghost-mcp",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "MCP server for Ghost CMS — manage content, members, newsletters, and more via LLMs",
5
5
  "keywords": [
6
6
  "ai",
@@ -33,6 +33,7 @@
33
33
  "@logosdx/utils": "^6.1.0",
34
34
  "@modelcontextprotocol/sdk": "^1.12.1",
35
35
  "jsonwebtoken": "^9.0.2",
36
+ "mime-db": "^1.54.0",
36
37
  "zod": "^3.24.4"
37
38
  },
38
39
  "devDependencies": {