bricks-mcp-server 0.8.0 → 0.13.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/README.md +11 -1
- package/dist/contracts.js +59 -0
- package/dist/index.js +106 -1
- package/package.json +47 -45
package/README.md
CHANGED
|
@@ -66,7 +66,7 @@ WP_URL=https://yoursite.tld WP_USER=you WP_APP_PASSWORD="…" npx -y bricks-mcp-
|
|
|
66
66
|
|
|
67
67
|
## Tools
|
|
68
68
|
|
|
69
|
-
`
|
|
69
|
+
`bricks_start_here`, `bricks_ping`, page/element/media tools, `bricks_get_design_context`, `bricks_manage_global_data`, `bricks_apply_global_class_operations`, `bricks_manage_template`, `bricks_get_preview_url`, and Query Filters reindexing.
|
|
70
70
|
|
|
71
71
|
Highlights (server ≥0.5.0, plugin ≥0.7.0):
|
|
72
72
|
|
|
@@ -77,3 +77,13 @@ Highlights (server ≥0.5.0, plugin ≥0.7.0):
|
|
|
77
77
|
## License
|
|
78
78
|
|
|
79
79
|
GPL-2.0-or-later
|
|
80
|
+
|
|
81
|
+
### Media safety
|
|
82
|
+
|
|
83
|
+
Use bricks_upload_media for URL/base64 uploads, bricks_find_media_usage before deletion, and bricks_delete_media only after references are cleared. Private URLs, SVG, unsafe MIME types, and files over 10 MB are rejected.
|
|
84
|
+
### Lote 6 safety
|
|
85
|
+
|
|
86
|
+
- Call `bricks_manage_global_data` with `action: "get"`, then reuse its `hash` in `action: "replace"`.
|
|
87
|
+
- Prefer `bricks_apply_global_class_operations` over full-array replacement.
|
|
88
|
+
- `bricks_manage_template` supports get/update/clone/delete; updates require `expected_modified`.
|
|
89
|
+
- Signed preview URLs expire after 60–900 seconds and must be treated as bearer secrets.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const updatePageSchema = z.object({ id: z.number().int().positive(), expected_modified: z.string().optional(), title: z.string().optional(), status: z.enum(["draft", "publish", "private", "pending"]).optional(), post_content: z.string().optional(), excerpt: z.string().optional(), date: z.string().optional(), featured_media: z.number().int().nonnegative().optional(), terms: z.record(z.any()).optional(), acf: z.record(z.any()).optional(), meta: z.record(z.any()).optional(), content: z.array(z.any()).optional(), header: z.array(z.any()).optional(), footer: z.array(z.any()).optional(), settings: z.record(z.any()).optional() });
|
|
3
|
+
export const uploadMediaSchema = z.object({ url: z.string().url().optional(), base64: z.string().min(1).optional(), filename: z.string().min(1).optional(), title: z.string().optional(), alt: z.string().optional() }).refine(v => Boolean(v.url) !== Boolean(v.base64), "Provide exactly one source: url or base64.");
|
|
4
|
+
export const elementOperationSchema = z.discriminatedUnion("op", [z.object({ op: z.literal("insert"), element: z.record(z.any()), parent: z.union([z.string(), z.number()]).optional(), position: z.number().int().nonnegative().optional() }), z.object({ op: z.literal("update"), id: z.string().min(1), changes: z.record(z.any()) }), z.object({ op: z.literal("move"), id: z.string().min(1), parent: z.union([z.string(), z.number()]), position: z.number().int().nonnegative().optional() }), z.object({ op: z.literal("delete"), id: z.string().min(1) })]);
|
|
5
|
+
export const applyElementOperationsSchema = z.object({ id: z.number().int().positive(), expected_modified: z.string().min(1), field: z.enum(["content", "header", "footer"]).optional(), operations: z.array(elementOperationSchema).min(1) });
|
|
6
|
+
export const designContextSchema = z.object({ include: z.array(z.enum(["classes", "variables", "palettes", "theme_styles", "breakpoints", "components", "global_settings"])).optional(), compact: z.boolean().optional() });
|
|
7
|
+
export const globalScopeSchema = z.enum(["global-variables", "color-palettes", "theme-styles", "components", "breakpoints"]);
|
|
8
|
+
export const globalDataUpdateSchema = z.object({ scope: globalScopeSchema, action: z.enum(["get", "replace"]), expected_hash: z.string().length(64).optional(), value: z.array(z.any()).or(z.record(z.any())).optional() }).superRefine((v, ctx) => { if (v.action === "replace" && (!v.expected_hash || v.value === undefined))
|
|
9
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message: "expected_hash and value are required for replace" }); });
|
|
10
|
+
export const globalClassOperationSchema = z.discriminatedUnion("op", [z.object({ op: z.literal("add"), class: z.record(z.any()) }), z.object({ op: z.literal("update"), id: z.string().min(1), changes: z.record(z.any()) }), z.object({ op: z.literal("delete"), id: z.string().min(1) })]);
|
|
11
|
+
export const globalClassOperationsSchema = z.object({ expected_hash: z.string().length(64), operations: z.array(globalClassOperationSchema).min(1) });
|
|
12
|
+
export const manageTemplateSchema = z.object({ id: z.number().int().positive(), action: z.enum(["get", "update", "clone", "delete"]), expected_modified: z.string().optional(), title: z.string().optional(), status: z.enum(["draft", "publish", "private"]).optional(), type: z.string().optional(), content: z.array(z.any()).optional(), settings: z.record(z.any()).optional(), conditions: z.array(z.any()).optional(), force: z.boolean().optional() }).superRefine((v, ctx) => { if (v.action === "update" && !v.expected_modified)
|
|
13
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message: "expected_modified is required for update" }); });
|
|
14
|
+
export const previewUrlSchema = z.object({ id: z.number().int().positive(), ttl: z.number().int().min(60).max(900).optional() });
|
|
15
|
+
export function buildToolRequest(name, args) {
|
|
16
|
+
if (name === "bricks_update_page") {
|
|
17
|
+
const parsed = updatePageSchema.parse(args);
|
|
18
|
+
const { id, ...body } = parsed;
|
|
19
|
+
return { path: `/pages/${id}`, method: "PUT", body };
|
|
20
|
+
}
|
|
21
|
+
if (name === "bricks_apply_element_operations") {
|
|
22
|
+
const parsed = applyElementOperationsSchema.parse(args);
|
|
23
|
+
const { id, ...body } = parsed;
|
|
24
|
+
return { path: `/pages/${id}/element-operations`, method: "POST", body };
|
|
25
|
+
}
|
|
26
|
+
if (name === "bricks_get_element") {
|
|
27
|
+
const id = z.number().int().positive().parse(args.id);
|
|
28
|
+
const elementId = z.string().min(1).parse(args.element_id);
|
|
29
|
+
return { path: `/pages/${id}/elements/${elementId}`, method: "GET", query: args.field ? { field: String(args.field) } : undefined };
|
|
30
|
+
}
|
|
31
|
+
if (name === "bricks_get_design_context") {
|
|
32
|
+
const parsed = designContextSchema.parse(args);
|
|
33
|
+
return { path: "/design-context", method: "GET", query: { ...(parsed.include ? { include: parsed.include.join(",") } : {}), ...(parsed.compact ? { compact: "true" } : {}) } };
|
|
34
|
+
}
|
|
35
|
+
if (name === "bricks_manage_global_data") {
|
|
36
|
+
const parsed = globalDataUpdateSchema.parse(args);
|
|
37
|
+
const { scope, action, ...body } = parsed;
|
|
38
|
+
return action === "get" ? { path: `/global-data/${scope}`, method: "GET" } : { path: `/global-data/${scope}`, method: "PUT", body };
|
|
39
|
+
}
|
|
40
|
+
if (name === "bricks_apply_global_class_operations")
|
|
41
|
+
return { path: "/global-classes/operations", method: "POST", body: globalClassOperationsSchema.parse(args) };
|
|
42
|
+
if (name === "bricks_manage_template") {
|
|
43
|
+
const parsed = manageTemplateSchema.parse(args);
|
|
44
|
+
const { id, ...body } = parsed;
|
|
45
|
+
return { path: `/templates/${id}/manage`, method: "POST", body };
|
|
46
|
+
}
|
|
47
|
+
if (name === "bricks_get_preview_url") {
|
|
48
|
+
const parsed = previewUrlSchema.parse(args);
|
|
49
|
+
return { path: `/preview/${parsed.id}`, method: "GET", query: parsed.ttl ? { ttl: String(parsed.ttl) } : undefined };
|
|
50
|
+
}
|
|
51
|
+
if (name === "bricks_upload_media")
|
|
52
|
+
return { path: "/media", method: "POST", body: uploadMediaSchema.parse(args) };
|
|
53
|
+
if (name === "bricks_find_media_usage")
|
|
54
|
+
return { path: `/media/${z.number().int().positive().parse(args.id)}/usage`, method: "GET" };
|
|
55
|
+
if (name === "bricks_delete_media")
|
|
56
|
+
return { path: `/media/${z.number().int().positive().parse(args.id)}`, method: "DELETE", query: args.force ? { force: "true" } : undefined };
|
|
57
|
+
throw new Error(`Unsupported tool request: ${name}`);
|
|
58
|
+
}
|
|
59
|
+
export function negotiateCapabilities(startHere) { const c = startHere.capabilities ?? {}; return { canWrite: !c.dry_run && !c.allowlist?.read_only, canUploadMedia: c.media_upload !== false, canForceDelete: c.force_delete_allowed === true, acf: c.acf_active === true, queryFilters: c.query_filters === true }; }
|
package/dist/index.js
CHANGED
|
@@ -33,8 +33,15 @@ if (subcommand === "doctor" || subcommand === "diagnose") {
|
|
|
33
33
|
if (process.env.WP_URL) {
|
|
34
34
|
console.error(`[bricks-mcp] target WP_URL=${process.env.WP_URL} WP_USER=${process.env.WP_USER ?? "?"}`);
|
|
35
35
|
}
|
|
36
|
-
const server = new Server({ name: "bricks-mcp-server", version: "0.
|
|
36
|
+
const server = new Server({ name: "bricks-mcp-server", version: "0.13.0" }, { capabilities: { tools: {} } });
|
|
37
37
|
const tools = [
|
|
38
|
+
{
|
|
39
|
+
name: "bricks_start_here",
|
|
40
|
+
description: "CALL THIS FIRST, once per session, before any other bricks_* tool. Returns everything needed to work on this site safely: site identity, capabilities (dry-run state, ACF, query filters), the content model (post types + taxonomies + ACF fields), a design-system summary, existing templates, and the working rules that prevent the classic Bricks failure modes (write conflicts, wrong template fields, un-indexed filters, clobbered global classes).",
|
|
41
|
+
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
42
|
+
schema: z.object({}),
|
|
43
|
+
handler: async () => wpRequest("/start-here"),
|
|
44
|
+
},
|
|
38
45
|
{
|
|
39
46
|
name: "bricks_ping",
|
|
40
47
|
description: "Verify the WordPress connection and report which site you're connected to (wp_url + site that answered), Bricks + WP version.",
|
|
@@ -289,6 +296,45 @@ const tools = [
|
|
|
289
296
|
handler: async (args) => wpRequest("/media", { query: args }),
|
|
290
297
|
},
|
|
291
298
|
{
|
|
299
|
+
name: "bricks_upload_media",
|
|
300
|
+
description: "Upload media from one public URL or base64. Blocks SSRF, unsafe MIME, files over 10 MB, and SVG.",
|
|
301
|
+
inputSchema: { type: "object", properties: { url: { type: "string" }, base64: { type: "string" }, filename: { type: "string" }, title: { type: "string" }, alt: { type: "string" } }, additionalProperties: false },
|
|
302
|
+
schema: z.object({ url: z.string().url().optional(), base64: z.string().min(1).optional(), filename: z.string().min(1).optional(), title: z.string().optional(), alt: z.string().optional() }).refine(v => Boolean(v.url) !== Boolean(v.base64), "Provide exactly one source."),
|
|
303
|
+
handler: async (args) => wpRequest("/media", { method: "POST", body: args }),
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
name: "bricks_find_media_usage",
|
|
307
|
+
description: "Find posts and Bricks data that reference an attachment. Call before deletion.",
|
|
308
|
+
inputSchema: { type: "object", properties: { id: { type: "number" } }, required: ["id"], additionalProperties: false },
|
|
309
|
+
schema: z.object({ id: z.number().int().positive() }),
|
|
310
|
+
handler: async (args) => wpRequest(`/media/${args.id}/usage`),
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
name: "bricks_delete_media",
|
|
314
|
+
description: "Delete an unused attachment. Trash by default; force:true is permanent and default-off.",
|
|
315
|
+
inputSchema: { type: "object", properties: { id: { type: "number" }, force: { type: "boolean" } }, required: ["id"], additionalProperties: false },
|
|
316
|
+
schema: z.object({ id: z.number().int().positive(), force: z.boolean().optional() }),
|
|
317
|
+
handler: async (args) => wpRequest(`/media/${args.id}`, { method: "DELETE", query: args.force ? { force: "true" } : undefined }),
|
|
318
|
+
}, {
|
|
319
|
+
name: "bricks_get_element",
|
|
320
|
+
description: "Read one Bricks element and its complete descendant subtree without loading the full page tree.",
|
|
321
|
+
inputSchema: { type: "object", properties: { id: { type: "number" }, element_id: { type: "string" }, field: { type: "string", description: "content (default), header, or footer" } }, required: ["id", "element_id"], additionalProperties: false },
|
|
322
|
+
schema: z.object({ id: z.number().int().positive(), element_id: z.string().min(1), field: z.enum(["content", "header", "footer"]).optional() }),
|
|
323
|
+
handler: async (args) => wpRequest(`/pages/${args.id}/elements/${args.element_id}`, { query: args.field ? { field: args.field } : undefined }),
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
name: "bricks_apply_element_operations",
|
|
327
|
+
description: "Atomically apply insert/update/move/delete operations to one Bricks element tree. Requires expected_modified. The whole batch validates before one snapshot and one write; dry-run returns the diff without persistence.",
|
|
328
|
+
inputSchema: { type: "object", properties: { id: { type: "number" }, expected_modified: { type: "string" }, field: { type: "string" }, operations: { type: "array", items: { type: "object" } } }, required: ["id", "expected_modified", "operations"], additionalProperties: false },
|
|
329
|
+
schema: z.object({ id: z.number().int().positive(), expected_modified: z.string().min(1), field: z.enum(["content", "header", "footer"]).optional(), operations: z.array(z.object({ op: z.enum(["insert", "update", "move", "delete"]) }).passthrough()).min(1) }),
|
|
330
|
+
handler: async (args) => { const { id, ...body } = args; return wpRequest(`/pages/${id}/element-operations`, { method: "POST", body }); },
|
|
331
|
+
}, {
|
|
332
|
+
name: "bricks_get_design_context",
|
|
333
|
+
description: "Read selected Bricks design-system sections: classes, variables, palettes, theme styles, breakpoints, components, and global settings. Use compact:true for counts/names only and include to control token usage.",
|
|
334
|
+
inputSchema: { type: "object", properties: { include: { type: "array", items: { type: "string" } }, compact: { type: "boolean" } }, additionalProperties: false },
|
|
335
|
+
schema: z.object({ include: z.array(z.enum(["classes", "variables", "palettes", "theme_styles", "breakpoints", "components", "global_settings"])).optional(), compact: z.boolean().optional() }),
|
|
336
|
+
handler: async (args) => wpRequest("/design-context", { query: { include: args.include?.join(","), compact: args.compact ? "true" : undefined } }),
|
|
337
|
+
}, {
|
|
292
338
|
name: "bricks_reindex_query_filters",
|
|
293
339
|
description: "Regenerate the Bricks Query Filters index. Call this after writing/editing any filter-* element via MCP — filters don't render until the index is rebuilt.",
|
|
294
340
|
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
@@ -327,6 +373,33 @@ const tools = [
|
|
|
327
373
|
handler: async (args) => wpRequest("/templates", { method: "POST", body: args }),
|
|
328
374
|
},
|
|
329
375
|
{
|
|
376
|
+
name: "bricks_manage_global_data",
|
|
377
|
+
description: "Read or safely replace one versioned Bricks global-data scope. Call action:get first for the current value/hash, then action:replace with expected_hash; dry-run and snapshot policy apply.",
|
|
378
|
+
inputSchema: { type: "object", properties: { scope: { type: "string", enum: ["global-variables", "color-palettes", "theme-styles", "components", "breakpoints"] }, action: { type: "string", enum: ["get", "replace"] }, expected_hash: { type: "string" }, value: { type: ["array", "object"] } }, required: ["scope", "action"], additionalProperties: false },
|
|
379
|
+
schema: z.object({ scope: z.enum(["global-variables", "color-palettes", "theme-styles", "components", "breakpoints"]), action: z.enum(["get", "replace"]), expected_hash: z.string().length(64).optional(), value: z.union([z.array(z.any()), z.record(z.any())]).optional() }).refine(v => v.action !== "replace" || (Boolean(v.expected_hash) && v.value !== undefined), "expected_hash and value are required for replace"),
|
|
380
|
+
handler: async (args) => { const { scope, action, ...body } = args; return action === "get" ? wpRequest(`/global-data/${scope}`) : wpRequest(`/global-data/${scope}`, { method: "PUT", body }); },
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
name: "bricks_apply_global_class_operations",
|
|
384
|
+
description: "Atomically add, update, or delete individual global classes without replacing the entire class library. Requires the hash from bricks_get_global_classes and rejects duplicate names or IDs.",
|
|
385
|
+
inputSchema: { type: "object", properties: { expected_hash: { type: "string" }, operations: { type: "array", items: { type: "object" } } }, required: ["expected_hash", "operations"], additionalProperties: false },
|
|
386
|
+
schema: z.object({ expected_hash: z.string().length(64), operations: z.array(z.object({ op: z.enum(["add", "update", "delete"]) }).passthrough()).min(1) }),
|
|
387
|
+
handler: async (args) => wpRequest("/global-classes/operations", { method: "POST", body: args }),
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
name: "bricks_manage_template",
|
|
391
|
+
description: "Long-tail template dispatcher: get full template data, update atomically with expected_modified, clone, or trash/delete. Updates create a Bricks-compatible WordPress revision and snapshots.",
|
|
392
|
+
inputSchema: { type: "object", properties: { id: { type: "number" }, action: { type: "string", enum: ["get", "update", "clone", "delete"] }, expected_modified: { type: "string" }, title: { type: "string" }, status: { type: "string" }, type: { type: "string" }, content: { type: "array" }, settings: { type: "object" }, conditions: { type: "array" }, force: { type: "boolean" } }, required: ["id", "action"], additionalProperties: false },
|
|
393
|
+
schema: z.object({ id: z.number().int().positive(), action: z.enum(["get", "update", "clone", "delete"]), expected_modified: z.string().optional(), title: z.string().optional(), status: z.enum(["draft", "publish", "private"]).optional(), type: z.string().optional(), content: z.array(z.any()).optional(), settings: z.record(z.any()).optional(), conditions: z.array(z.any()).optional(), force: z.boolean().optional() }).refine(v => v.action !== "update" || Boolean(v.expected_modified), "expected_modified is required for update"),
|
|
394
|
+
handler: async (args) => { const { id, action, ...body } = args; return action === "get" ? wpRequest(`/templates/${id}`) : wpRequest(`/templates/${id}/manage`, { method: "POST", body: { action, ...body } }); },
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
name: "bricks_get_preview_url",
|
|
398
|
+
description: "Generate a short-lived signed bearer URL (60–900 seconds) for visually checking a draft, private page, or template in a browser. Treat the URL as a secret until it expires.",
|
|
399
|
+
inputSchema: { type: "object", properties: { id: { type: "number" }, ttl: { type: "number", minimum: 60, maximum: 900 } }, required: ["id"], additionalProperties: false },
|
|
400
|
+
schema: z.object({ id: z.number().int().positive(), ttl: z.number().int().min(60).max(900).optional() }),
|
|
401
|
+
handler: async (args) => wpRequest(`/preview/${args.id}`, { query: args.ttl ? { ttl: String(args.ttl) } : undefined }),
|
|
402
|
+
}, {
|
|
330
403
|
name: "bricks_get_global_classes",
|
|
331
404
|
description: "Read Bricks global classes and their categories — useful before editing pages so styling stays consistent.",
|
|
332
405
|
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
@@ -358,11 +431,43 @@ const tools = [
|
|
|
358
431
|
handler: async () => wpRequest("/theme-styles"),
|
|
359
432
|
},
|
|
360
433
|
];
|
|
434
|
+
// MCP tool annotations (readOnlyHint / destructiveHint / idempotentHint) so
|
|
435
|
+
// clients can calibrate approval prompts. "Destructive" here means the write
|
|
436
|
+
// overwrites or removes existing data (even though the plugin snapshots first);
|
|
437
|
+
// additive creates are non-destructive.
|
|
438
|
+
const TOOL_ANNOTATIONS = {
|
|
439
|
+
bricks_start_here: { readOnlyHint: true },
|
|
440
|
+
bricks_ping: { readOnlyHint: true },
|
|
441
|
+
bricks_get_schema: { readOnlyHint: true },
|
|
442
|
+
bricks_list_pages: { readOnlyHint: true },
|
|
443
|
+
bricks_get_page: { readOnlyHint: true },
|
|
444
|
+
bricks_list_templates: { readOnlyHint: true },
|
|
445
|
+
bricks_manage_global_data: { readOnlyHint: false, destructiveHint: true },
|
|
446
|
+
bricks_apply_global_class_operations: { readOnlyHint: false, destructiveHint: true },
|
|
447
|
+
bricks_manage_template: { readOnlyHint: false, destructiveHint: true },
|
|
448
|
+
bricks_get_preview_url: { readOnlyHint: true },
|
|
449
|
+
bricks_get_global_classes: { readOnlyHint: true },
|
|
450
|
+
bricks_get_theme_styles: { readOnlyHint: true },
|
|
451
|
+
bricks_get_design_context: { readOnlyHint: true },
|
|
452
|
+
bricks_get_element: { readOnlyHint: true },
|
|
453
|
+
bricks_apply_element_operations: { readOnlyHint: false, destructiveHint: true },
|
|
454
|
+
bricks_list_media: { readOnlyHint: true },
|
|
455
|
+
bricks_find_media_usage: { readOnlyHint: true },
|
|
456
|
+
bricks_upload_media: { readOnlyHint: false, destructiveHint: false },
|
|
457
|
+
bricks_delete_media: { readOnlyHint: false, destructiveHint: true },
|
|
458
|
+
bricks_create_page: { readOnlyHint: false, destructiveHint: false },
|
|
459
|
+
bricks_create_template: { readOnlyHint: false, destructiveHint: false },
|
|
460
|
+
bricks_reindex_query_filters: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
|
|
461
|
+
bricks_update_page: { readOnlyHint: false, destructiveHint: true },
|
|
462
|
+
bricks_update_global_classes: { readOnlyHint: false, destructiveHint: true },
|
|
463
|
+
bricks_delete_page: { readOnlyHint: false, destructiveHint: true },
|
|
464
|
+
};
|
|
361
465
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
362
466
|
tools: tools.map(({ name, description, inputSchema }) => ({
|
|
363
467
|
name,
|
|
364
468
|
description,
|
|
365
469
|
inputSchema,
|
|
470
|
+
annotations: TOOL_ANNOTATIONS[name],
|
|
366
471
|
})),
|
|
367
472
|
}));
|
|
368
473
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
package/package.json
CHANGED
|
@@ -1,45 +1,47 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "bricks-mcp-server",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Provider-agnostic MCP server that exposes Bricks Builder pages, templates, global classes and theme styles as tools. Works with any MCP-compatible client (Claude Code, Codex CLI, etc.).",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
"bricks-mcp-server": "dist/index.js",
|
|
8
|
-
"bricks-mcp": "dist/index.js"
|
|
9
|
-
},
|
|
10
|
-
"files": [
|
|
11
|
-
"dist",
|
|
12
|
-
"README.md"
|
|
13
|
-
],
|
|
14
|
-
"scripts": {
|
|
15
|
-
"build": "tsc",
|
|
16
|
-
"start": "node dist/index.js",
|
|
17
|
-
"dev": "tsc --watch",
|
|
18
|
-
"setup": "node dist/index.js setup",
|
|
19
|
-
"doctor": "node dist/index.js doctor",
|
|
20
|
-
"prepublishOnly": "npm run build"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"bricks
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"claude
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
"
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "bricks-mcp-server",
|
|
3
|
+
"version": "0.13.0",
|
|
4
|
+
"description": "Provider-agnostic MCP server that exposes Bricks Builder pages, templates, global classes and theme styles as tools. Works with any MCP-compatible client (Claude Code, Codex CLI, etc.).",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"bricks-mcp-server": "dist/index.js",
|
|
8
|
+
"bricks-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"start": "node dist/index.js",
|
|
17
|
+
"dev": "tsc --watch",
|
|
18
|
+
"setup": "node dist/index.js setup",
|
|
19
|
+
"doctor": "node dist/index.js doctor",
|
|
20
|
+
"prepublishOnly": "npm run build",
|
|
21
|
+
"test": "npm run build && node --test test/*.test.mjs"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"mcp",
|
|
25
|
+
"model-context-protocol",
|
|
26
|
+
"bricks",
|
|
27
|
+
"bricks-builder",
|
|
28
|
+
"wordpress",
|
|
29
|
+
"claude",
|
|
30
|
+
"claude-code",
|
|
31
|
+
"ai"
|
|
32
|
+
],
|
|
33
|
+
"author": "Juan Leonardo",
|
|
34
|
+
"license": "GPL-2.0-or-later",
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
40
|
+
"bricks-ai-workspace": "file:..",
|
|
41
|
+
"zod": "^3.23.8"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@types/node": "^20.12.0",
|
|
45
|
+
"typescript": "^5.5.0"
|
|
46
|
+
}
|
|
47
|
+
}
|