@damusix/ghost-mcp 0.1.2 → 0.2.0

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
@@ -3,13 +3,14 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
4
  import { z } from "zod";
5
5
  import { attempt } from "@logosdx/utils";
6
- import { FetchEngine } from "@logosdx/fetch";
6
+ import { FetchEngine, config, get } from "@logosdx/fetch";
7
7
  import jwt from "jsonwebtoken";
8
8
  //#region src/ghost-client.ts
9
9
  const GHOST_URL = process.env.GHOST_URL || "";
10
10
  const GHOST_ADMIN_API_KEY = process.env.GHOST_ADMIN_API_KEY || "";
11
11
  const GHOST_CONTENT_API_KEY = process.env.GHOST_CONTENT_API_KEY || "";
12
12
  const GHOST_API_VERSION = process.env.GHOST_API_VERSION || "v6.0";
13
+ const GHOST_RATE_LIMIT = Number(process.env.GHOST_RATE_LIMIT) || 50;
13
14
  function generateAdminToken() {
14
15
  const [id, secret] = GHOST_ADMIN_API_KEY.split(":");
15
16
  return jwt.sign({}, Buffer.from(secret, "hex"), {
@@ -19,13 +20,53 @@ function generateAdminToken() {
19
20
  audience: "/admin/"
20
21
  });
21
22
  }
23
+ const resilience = {
24
+ attemptTimeout: 15e3,
25
+ totalTimeout: 45e3,
26
+ retry: {
27
+ maxAttempts: 3,
28
+ baseDelay: 1e3,
29
+ maxDelay: 1e4,
30
+ useExponentialBackoff: true,
31
+ retryableStatusCodes: [
32
+ 408,
33
+ 429,
34
+ 500,
35
+ 502,
36
+ 503,
37
+ 504
38
+ ],
39
+ shouldRetry: (error, _attempt) => {
40
+ if (error.status === 429) {
41
+ const retryAfter = error.headers?.["retry-after"];
42
+ return retryAfter ? parseInt(retryAfter) * 1e3 : 5e3;
43
+ }
44
+ if (error.status >= 400 && error.status < 500) return false;
45
+ return true;
46
+ }
47
+ },
48
+ cachePolicy: {
49
+ enabled: true,
50
+ methods: ["GET"],
51
+ ttl: 36e5,
52
+ staleIn: 1e4
53
+ },
54
+ dedupePolicy: true,
55
+ rateLimitPolicy: {
56
+ maxCalls: GHOST_RATE_LIMIT,
57
+ windowMs: 6e4,
58
+ waitForToken: true
59
+ }
60
+ };
22
61
  const adminApi = new FetchEngine({
23
62
  baseUrl: `${GHOST_URL}/ghost/api/admin`,
24
63
  defaultType: "json",
25
64
  headers: {
26
65
  "Accept-Version": GHOST_API_VERSION,
66
+ "Content-Type": "application/json",
27
67
  Authorization: `Ghost ${generateAdminToken()}`
28
- }
68
+ },
69
+ ...resilience
29
70
  });
30
71
  adminApi.hooks.add("beforeRequest", (url, opts) => {
31
72
  opts.headers.Authorization = `Ghost ${generateAdminToken()}`;
@@ -33,8 +74,42 @@ adminApi.hooks.add("beforeRequest", (url, opts) => {
33
74
  const contentApi = new FetchEngine({
34
75
  baseUrl: `${GHOST_URL}/ghost/api/content`,
35
76
  defaultType: "json",
36
- headers: { "Accept-Version": GHOST_API_VERSION },
37
- params: { key: GHOST_CONTENT_API_KEY }
77
+ headers: {
78
+ "Accept-Version": GHOST_API_VERSION,
79
+ "Content-Type": "application/json"
80
+ },
81
+ params: { key: GHOST_CONTENT_API_KEY },
82
+ ...resilience
83
+ });
84
+ const docsApi = new FetchEngine({
85
+ baseUrl: "https://docs.ghost.org",
86
+ defaultType: "text",
87
+ attemptTimeout: 15e3,
88
+ totalTimeout: 45e3,
89
+ retry: {
90
+ maxAttempts: 3,
91
+ baseDelay: 1e3,
92
+ maxDelay: 1e4,
93
+ useExponentialBackoff: true
94
+ },
95
+ cachePolicy: {
96
+ enabled: true,
97
+ methods: ["GET"],
98
+ ttl: 36e5,
99
+ staleIn: 1e4
100
+ },
101
+ dedupePolicy: true
102
+ });
103
+ config.set({
104
+ attemptTimeout: 15e3,
105
+ totalTimeout: 45e3,
106
+ retry: {
107
+ maxAttempts: 3,
108
+ baseDelay: 1e3,
109
+ maxDelay: 1e4,
110
+ useExponentialBackoff: true
111
+ },
112
+ dedupePolicy: true
38
113
  });
39
114
  //#endregion
40
115
  //#region src/actions/admin/posts.ts
@@ -1160,6 +1235,11 @@ const PATH_PARAMS = [
1160
1235
  "slug",
1161
1236
  "name"
1162
1237
  ];
1238
+ function getUsedPathParams(template) {
1239
+ const used = /* @__PURE__ */ new Set();
1240
+ for (const param of PATH_PARAMS) if (template.includes(`{${param}}`)) used.add(param);
1241
+ return used;
1242
+ }
1163
1243
  function buildPath(template, payload) {
1164
1244
  let path = template;
1165
1245
  for (const param of PATH_PARAMS) {
@@ -1168,22 +1248,18 @@ function buildPath(template, payload) {
1168
1248
  }
1169
1249
  return path;
1170
1250
  }
1171
- function extractQueryParams(payload) {
1251
+ function extractQueryParams(payload, usedPathParams) {
1172
1252
  const params = {};
1173
1253
  for (const [key, value] of Object.entries(payload)) {
1174
- if (PATH_PARAMS.includes(key)) continue;
1254
+ if (usedPathParams.has(key)) continue;
1175
1255
  if (value !== void 0 && value !== null) params[key] = String(value);
1176
1256
  }
1177
1257
  return params;
1178
1258
  }
1179
- function extractBodyPayload(payload) {
1259
+ function extractBodyPayload(payload, usedPathParams) {
1180
1260
  const body = {};
1181
1261
  for (const [key, value] of Object.entries(payload)) {
1182
- if (PATH_PARAMS.includes(key)) continue;
1183
- if (key === "updated_at") {
1184
- body[key] = value;
1185
- continue;
1186
- }
1262
+ if (usedPathParams.has(key)) continue;
1187
1263
  if (value !== void 0) body[key] = value;
1188
1264
  }
1189
1265
  return body;
@@ -1203,10 +1279,11 @@ async function handleUseGhostApi(input, mode) {
1203
1279
  });
1204
1280
  const validPayload = validation.data;
1205
1281
  const engine = api === "admin" ? adminApi : contentApi;
1282
+ const usedPathParams = getUsedPathParams(actionDef.path);
1206
1283
  const path = buildPath(actionDef.path, validPayload);
1207
1284
  if (actionDef.name === "images.upload" || actionDef.name === "themes.upload") return await handleFileUpload(actionDef.name, validPayload, path);
1208
1285
  if (actionDef.method === "GET") {
1209
- const queryParams = extractQueryParams(validPayload);
1286
+ const queryParams = extractQueryParams(validPayload, usedPathParams);
1210
1287
  const [response, err] = await attempt(async () => engine.get(path, { params: queryParams }));
1211
1288
  if (err) return JSON.stringify({ error: err.message });
1212
1289
  return JSON.stringify(response);
@@ -1214,10 +1291,12 @@ async function handleUseGhostApi(input, mode) {
1214
1291
  if (actionDef.method === "DELETE") {
1215
1292
  const [response, err] = await attempt(async () => engine.delete(path));
1216
1293
  if (err) return JSON.stringify({ error: err.message });
1294
+ const resourcePrefix = `/${actionDef.name.split(".")[0]}`;
1295
+ await engine.invalidatePath(resourcePrefix);
1217
1296
  return JSON.stringify(response ?? { success: true });
1218
1297
  }
1219
1298
  const resourceKey = actionDef.name.split(".")[0];
1220
- const body = extractBodyPayload(validPayload);
1299
+ const body = extractBodyPayload(validPayload, usedPathParams);
1221
1300
  const wrappedBody = { [resourceKey]: [body] };
1222
1301
  if (actionDef.method === "POST") {
1223
1302
  const [response, err] = await attempt(async () => engine.post(path, wrappedBody));
@@ -1227,6 +1306,8 @@ async function handleUseGhostApi(input, mode) {
1227
1306
  if (actionDef.method === "PUT") {
1228
1307
  const [response, err] = await attempt(async () => engine.put(path, wrappedBody));
1229
1308
  if (err) return JSON.stringify({ error: err.message });
1309
+ const resourcePrefix = `/${actionDef.name.split(".")[0]}`;
1310
+ await engine.invalidatePath(resourcePrefix);
1230
1311
  return JSON.stringify(response);
1231
1312
  }
1232
1313
  return JSON.stringify({ error: `Unsupported method: ${actionDef.method}` });
@@ -1237,10 +1318,9 @@ async function handleFileUpload(actionName, payload, path) {
1237
1318
  let fileBuffer;
1238
1319
  let filename;
1239
1320
  if (fileInput.startsWith("http://") || fileInput.startsWith("https://")) {
1240
- const [response, err] = await attempt(async () => fetch(fileInput));
1321
+ const [response, err] = await attempt(async () => get(fileInput).arrayBuffer());
1241
1322
  if (err) return JSON.stringify({ error: `Failed to download file: ${err.message}` });
1242
- if (!response.ok) return JSON.stringify({ error: `Failed to download file: ${response.status} ${response.statusText}` });
1243
- fileBuffer = Buffer.from(await response.arrayBuffer());
1323
+ fileBuffer = Buffer.from(response.data);
1244
1324
  filename = new URL(fileInput).pathname.split("/").pop() || (actionName === "images.upload" ? "image.jpg" : "theme.zip");
1245
1325
  } else {
1246
1326
  fileBuffer = Buffer.from(fileInput, "base64");
@@ -1294,19 +1374,10 @@ const ghostDocsSchema = z.object({
1294
1374
  search: z.string().optional().describe("Case-insensitive substring search across the documentation"),
1295
1375
  regex: z.string().optional().describe("Regex pattern string to match (e.g. \"/pattern/i\")")
1296
1376
  });
1297
- const GHOST_LLMS_TXT_URL = "https://docs.ghost.org/llms.txt";
1298
- const CACHE_TTL = 900 * 1e3;
1299
- let cachedContent = null;
1300
- let cacheTimestamp = 0;
1301
1377
  async function fetchDocs() {
1302
- const now = Date.now();
1303
- if (cachedContent && now - cacheTimestamp < CACHE_TTL) return cachedContent;
1304
- const [response, err] = await attempt(async () => fetch(GHOST_LLMS_TXT_URL));
1378
+ const [response, err] = await attempt(async () => docsApi.get("/llms.txt"));
1305
1379
  if (err) throw new Error(`Failed to fetch Ghost docs: ${err.message}`);
1306
- if (!response.ok) throw new Error(`Failed to fetch Ghost docs: ${response.status}`);
1307
- cachedContent = await response.text();
1308
- cacheTimestamp = now;
1309
- return cachedContent;
1380
+ return response.data;
1310
1381
  }
1311
1382
  async function handleGhostDocs(input) {
1312
1383
  const { all, search, regex } = input;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["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"],"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 } 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';\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\nexport const adminApi = new FetchEngine({\n baseUrl: `${GHOST_URL}/ghost/api/admin`,\n defaultType: 'json',\n headers: {\n 'Accept-Version': GHOST_API_VERSION,\n Authorization: `Ghost ${generateAdminToken()}`,\n },\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 },\n params: {\n key: GHOST_CONTENT_API_KEY,\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\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 { 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 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(payload: Record<string, unknown>): Record<string, string> {\n const params: Record<string, string> = {};\n for (const [key, value] of Object.entries(payload)) {\n if (PATH_PARAMS.includes(key as (typeof PATH_PARAMS)[number])) {\n continue;\n }\n if (value !== undefined && value !== null) {\n params[key] = String(value);\n }\n }\n return params;\n}\n\nfunction extractBodyPayload(payload: Record<string, unknown>): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(payload)) {\n if (PATH_PARAMS.includes(key as (typeof PATH_PARAMS)[number])) {\n continue;\n }\n if (key === 'updated_at') {\n body[key] = value;\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 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);\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 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);\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 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 () => fetch(fileInput));\n if (err) {\n return JSON.stringify({ error: `Failed to download file: ${err.message}` });\n }\n if (!response!.ok) {\n return JSON.stringify({\n error: `Failed to download file: ${response!.status} ${response!.statusText}`,\n });\n }\n fileBuffer = Buffer.from(await response!.arrayBuffer());\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';\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\nconst GHOST_LLMS_TXT_URL = 'https://docs.ghost.org/llms.txt';\nconst CACHE_TTL = 15 * 60 * 1000; // 15 minutes\n\nlet cachedContent: string | null = null;\nlet cacheTimestamp = 0;\n\n// Exported for testing\nexport function clearCache(): void {\n cachedContent = null;\n cacheTimestamp = 0;\n}\n\nasync function fetchDocs(): Promise<string> {\n const now = Date.now();\n if (cachedContent && now - cacheTimestamp < CACHE_TTL) {\n return cachedContent;\n }\n\n const [response, err] = await attempt(async () => fetch(GHOST_LLMS_TXT_URL));\n if (err) {\n throw new Error(`Failed to fetch Ghost docs: ${err.message}`);\n }\n if (!response!.ok) {\n throw new Error(`Failed to fetch Ghost docs: ${response!.status}`);\n }\n\n cachedContent = await response!.text();\n cacheTimestamp = now;\n return cachedContent;\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 { 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@damusix/ghost-mcp",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "MCP server for Ghost CMS — manage content, members, newsletters, and more via LLMs",
5
5
  "keywords": [
6
6
  "ai",
@@ -39,6 +39,7 @@
39
39
  "@changesets/changelog-github": "^0.5.1",
40
40
  "@changesets/cli": "^2.29.4",
41
41
  "@types/jsonwebtoken": "^9.0.9",
42
+ "tsx": "^4.21.0",
42
43
  "typescript": "^5.8.2",
43
44
  "vite-plus": "^0.1.15-alpha.5",
44
45
  "vitest": "^3.1.1"