gearvn-pages-mcp-server 1.3.0 → 1.5.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.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/delete-page.d.ts +9 -0
- package/dist/tools/delete-page.d.ts.map +1 -0
- package/dist/tools/delete-page.js +39 -0
- package/dist/tools/delete-page.js.map +1 -0
- package/dist/tools/deploy-page.d.ts.map +1 -1
- package/dist/tools/deploy-page.js +18 -4
- package/dist/tools/deploy-page.js.map +1 -1
- package/dist/tools/update-page.d.ts +9 -0
- package/dist/tools/update-page.d.ts.map +1 -0
- package/dist/tools/update-page.js +69 -0
- package/dist/tools/update-page.js.map +1 -0
- package/dist/types.d.ts +18 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -7
- package/src/index.ts +7 -1
- package/src/tools/delete-page.ts +55 -0
- package/src/tools/deploy-page.ts +25 -4
- package/src/tools/update-page.ts +92 -0
- package/src/types.ts +22 -0
package/dist/index.js
CHANGED
|
@@ -4,6 +4,8 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
4
4
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
5
|
import { DEPLOY_PAGE_TOOL, handleDeployPage } from "./tools/deploy-page.js";
|
|
6
6
|
import { LIST_PAGES_TOOL, handleListPages } from "./tools/list-pages.js";
|
|
7
|
+
import { UPDATE_PAGE_TOOL, handleUpdatePage } from "./tools/update-page.js";
|
|
8
|
+
import { DELETE_PAGE_TOOL, handleDeletePage } from "./tools/delete-page.js";
|
|
7
9
|
// Create MCP server
|
|
8
10
|
const server = new Server({
|
|
9
11
|
name: "gearvn-pages-mcp-server",
|
|
@@ -16,7 +18,7 @@ const server = new Server({
|
|
|
16
18
|
// Handler for listing available tools
|
|
17
19
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
18
20
|
return {
|
|
19
|
-
tools: [DEPLOY_PAGE_TOOL, LIST_PAGES_TOOL],
|
|
21
|
+
tools: [DEPLOY_PAGE_TOOL, LIST_PAGES_TOOL, UPDATE_PAGE_TOOL, DELETE_PAGE_TOOL],
|
|
20
22
|
};
|
|
21
23
|
});
|
|
22
24
|
// Handler for tool calls
|
|
@@ -29,6 +31,12 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
29
31
|
else if (name === "list-pages") {
|
|
30
32
|
return await handleListPages();
|
|
31
33
|
}
|
|
34
|
+
else if (name === "update-page") {
|
|
35
|
+
return await handleUpdatePage(args);
|
|
36
|
+
}
|
|
37
|
+
else if (name === "delete-page") {
|
|
38
|
+
return await handleDeletePage(args);
|
|
39
|
+
}
|
|
32
40
|
else {
|
|
33
41
|
throw new Error(`Unknown tool: ${name}`);
|
|
34
42
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE5E,oBAAoB;AACpB,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,yBAAyB;IAC/B,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,sCAAsC;AACtC,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO;QACL,KAAK,EAAE,CAAC,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,CAAC;KAC/E,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,yBAAyB;AACzB,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAEjD,IAAI,CAAC;QACH,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,OAAO,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YACjC,OAAO,MAAM,eAAe,EAAE,CAAC;QACjC,CAAC;aAAM,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAClC,OAAO,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAClC,OAAO,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,YAAY;qBACpB,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC5D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export declare const DELETE_PAGE_TOOL: Tool;
|
|
3
|
+
export declare function handleDeletePage(args: unknown): Promise<{
|
|
4
|
+
content: {
|
|
5
|
+
type: "text";
|
|
6
|
+
text: string;
|
|
7
|
+
}[];
|
|
8
|
+
}>;
|
|
9
|
+
//# sourceMappingURL=delete-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-page.d.ts","sourceRoot":"","sources":["../../src/tools/delete-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAI1D,eAAO,MAAM,gBAAgB,EAAE,IAe9B,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,OAAO;;;;;GAiCnD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { callAPI } from "../api.js";
|
|
2
|
+
export const DELETE_PAGE_TOOL = {
|
|
3
|
+
name: "delete-page",
|
|
4
|
+
description: "Delete a page by its slug. IMPORTANT: You must use the EXACT slug from list-pages response, including the timestamp suffix (e.g., 'my-page-1730229600'). Only pages owned by your API key can be deleted. Returns success message on successful deletion.",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
slug: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "The exact slug of the page to delete. Must match the slug from list-pages response, including timestamp suffix.",
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
required: ["slug"],
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
export async function handleDeletePage(args) {
|
|
17
|
+
const { slug } = args;
|
|
18
|
+
// Validate inputs
|
|
19
|
+
if (!slug) {
|
|
20
|
+
throw new Error("Missing required parameter: slug is required");
|
|
21
|
+
}
|
|
22
|
+
// Call the delete API
|
|
23
|
+
const response = await callAPI("/v1/pages", "DELETE", {
|
|
24
|
+
slug,
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
content: [
|
|
28
|
+
{
|
|
29
|
+
type: "text",
|
|
30
|
+
text: JSON.stringify({
|
|
31
|
+
success: true,
|
|
32
|
+
message: response.message,
|
|
33
|
+
slug: slug,
|
|
34
|
+
}, null, 2),
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=delete-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-page.js","sourceRoot":"","sources":["../../src/tools/delete-page.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,2PAA2P;IAC7P,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,iHAAiH;aACpH;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAa;IAClD,MAAM,EAAE,IAAI,EAAE,GAAG,IAAsB,CAAC;IAExC,kBAAkB;IAClB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,sBAAsB;IACtB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,WAAW,EACX,QAAQ,EACR;QACE,IAAI;KACL,CACF,CAAC;IAEF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,IAAI,EAAE,IAAI;iBACX,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-page.d.ts","sourceRoot":"","sources":["../../src/tools/deploy-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAI1D,eAAO,MAAM,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"deploy-page.d.ts","sourceRoot":"","sources":["../../src/tools/deploy-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAI1D,eAAO,MAAM,gBAAgB,EAAE,IAmC9B,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,OAAO;;;;;GA8CnD"}
|
|
@@ -19,22 +19,35 @@ export const DEPLOY_PAGE_TOOL = {
|
|
|
19
19
|
"Generate a simple kebab-case slug (e.g., 'quan-ly-thu-chi', 'landing-page')." +
|
|
20
20
|
"FOR UPDATING EXISTING PAGES: Use the EXACT full slug including timestamp (e.g., 'quan-ly-thu-chi-1730229600') from the backend response. ",
|
|
21
21
|
},
|
|
22
|
+
tags: {
|
|
23
|
+
type: "array",
|
|
24
|
+
items: {
|
|
25
|
+
type: "string",
|
|
26
|
+
},
|
|
27
|
+
description: "Optional array of tags to categorize the page (e.g., ['dashboard', 'finance']). Tags are case-insensitive for filtering.",
|
|
28
|
+
},
|
|
22
29
|
},
|
|
23
30
|
required: ["title", "content", "slug"],
|
|
24
31
|
},
|
|
25
32
|
};
|
|
26
33
|
export async function handleDeployPage(args) {
|
|
27
|
-
const { title, content, slug } = args;
|
|
34
|
+
const { title, content, slug, tags } = args;
|
|
28
35
|
// Validate inputs
|
|
29
36
|
if (!title || !content || !slug) {
|
|
30
37
|
throw new Error("Missing required parameters: title, content, and slug are required");
|
|
31
38
|
}
|
|
32
|
-
//
|
|
33
|
-
const
|
|
39
|
+
// Build request body
|
|
40
|
+
const requestBody = {
|
|
34
41
|
title,
|
|
35
42
|
content,
|
|
36
43
|
slug,
|
|
37
|
-
}
|
|
44
|
+
};
|
|
45
|
+
// Add tags if provided
|
|
46
|
+
if (tags && tags.length > 0) {
|
|
47
|
+
requestBody.tags = tags;
|
|
48
|
+
}
|
|
49
|
+
// Call the deploy API
|
|
50
|
+
const response = await callAPI("/v1/deploy", "POST", requestBody);
|
|
38
51
|
return {
|
|
39
52
|
content: [
|
|
40
53
|
{
|
|
@@ -43,6 +56,7 @@ export async function handleDeployPage(args) {
|
|
|
43
56
|
success: true,
|
|
44
57
|
message: "Page deployed successfully",
|
|
45
58
|
url: response.url,
|
|
59
|
+
tags: tags || [],
|
|
46
60
|
}, null, 2),
|
|
47
61
|
},
|
|
48
62
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-page.js","sourceRoot":"","sources":["../../src/tools/deploy-page.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,6sBAA6sB;IAC/sB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,6FAA6F;aAChG;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,ypBAAypB;aAC5pB;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,iDAAiD;oBACjD,8EAA8E;oBAC9E,2IAA2I;aAC9I;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;KACvC;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAa;IAClD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"deploy-page.js","sourceRoot":"","sources":["../../src/tools/deploy-page.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,6sBAA6sB;IAC/sB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,6FAA6F;aAChG;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,ypBAAypB;aAC5pB;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,iDAAiD;oBACjD,8EAA8E;oBAC9E,2IAA2I;aAC9I;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;iBACf;gBACD,WAAW,EACT,0HAA0H;aAC7H;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;KACvC;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAa;IAClD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAsB,CAAC;IAE9D,kBAAkB;IAClB,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;IACJ,CAAC;IAED,qBAAqB;IACrB,MAAM,WAAW,GAAmB;QAClC,KAAK;QACL,OAAO;QACP,IAAI;KACL,CAAC;IAEF,uBAAuB;IACvB,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,sBAAsB;IACtB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,YAAY,EACZ,MAAM,EACN,WAAW,CACZ,CAAC;IAEF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,4BAA4B;oBACrC,GAAG,EAAE,QAAQ,CAAC,GAAG;oBACjB,IAAI,EAAE,IAAI,IAAI,EAAE;iBACjB,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export declare const UPDATE_PAGE_TOOL: Tool;
|
|
3
|
+
export declare function handleUpdatePage(args: unknown): Promise<{
|
|
4
|
+
content: {
|
|
5
|
+
type: "text";
|
|
6
|
+
text: string;
|
|
7
|
+
}[];
|
|
8
|
+
}>;
|
|
9
|
+
//# sourceMappingURL=update-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-page.d.ts","sourceRoot":"","sources":["../../src/tools/update-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAI1D,eAAO,MAAM,gBAAgB,EAAE,IAgC9B,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,OAAO;;;;;GAqDnD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { callAPI } from "../api.js";
|
|
2
|
+
export const UPDATE_PAGE_TOOL = {
|
|
3
|
+
name: "update-page",
|
|
4
|
+
description: "Update an existing page by slug. You can update title, content, or tags individually or in combination. IMPORTANT: You must use the EXACT slug from list-pages response, including the timestamp suffix (e.g., 'my-page-1730229600'). At least one field (title, content, or tags) must be provided for update.",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
slug: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "The exact slug of the page to update. Must match the slug from list-pages response, including timestamp suffix.",
|
|
11
|
+
},
|
|
12
|
+
title: {
|
|
13
|
+
type: "string",
|
|
14
|
+
description: "Optional new title for the page.",
|
|
15
|
+
},
|
|
16
|
+
content: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Optional new HTML content for the page. Must be complete, valid HTML document with TailwindCSS for styling.",
|
|
19
|
+
},
|
|
20
|
+
tags: {
|
|
21
|
+
type: "array",
|
|
22
|
+
items: {
|
|
23
|
+
type: "string",
|
|
24
|
+
},
|
|
25
|
+
description: "Optional new array of tags to categorize the page (e.g., ['dashboard', 'finance']). This will replace existing tags. Tags are case-insensitive for filtering.",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
required: ["slug"],
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
export async function handleUpdatePage(args) {
|
|
32
|
+
const { slug, title, content, tags } = args;
|
|
33
|
+
// Validate inputs
|
|
34
|
+
if (!slug) {
|
|
35
|
+
throw new Error("Missing required parameter: slug is required");
|
|
36
|
+
}
|
|
37
|
+
// Check if at least one field is provided
|
|
38
|
+
if (!title && !content && (!tags || tags.length === 0)) {
|
|
39
|
+
throw new Error("At least one field (title, content, or tags) must be provided for update");
|
|
40
|
+
}
|
|
41
|
+
// Build request body
|
|
42
|
+
const requestBody = {
|
|
43
|
+
slug,
|
|
44
|
+
};
|
|
45
|
+
if (title) {
|
|
46
|
+
requestBody.title = title;
|
|
47
|
+
}
|
|
48
|
+
if (content) {
|
|
49
|
+
requestBody.content = content;
|
|
50
|
+
}
|
|
51
|
+
if (tags && tags.length > 0) {
|
|
52
|
+
requestBody.tags = tags;
|
|
53
|
+
}
|
|
54
|
+
// Call the update API
|
|
55
|
+
const response = await callAPI("/v1/pages", "PUT", requestBody);
|
|
56
|
+
return {
|
|
57
|
+
content: [
|
|
58
|
+
{
|
|
59
|
+
type: "text",
|
|
60
|
+
text: JSON.stringify({
|
|
61
|
+
success: true,
|
|
62
|
+
message: response.message,
|
|
63
|
+
slug: response.slug,
|
|
64
|
+
}, null, 2),
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=update-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-page.js","sourceRoot":"","sources":["../../src/tools/update-page.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,iTAAiT;IACnT,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,iHAAiH;aACpH;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kCAAkC;aAChD;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,6GAA6G;aAChH;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;iBACf;gBACD,WAAW,EACT,+JAA+J;aAClK;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAa;IAClD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAsB,CAAC;IAE9D,kBAAkB;IAClB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,0CAA0C;IAC1C,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,0EAA0E,CAC3E,CAAC;IACJ,CAAC;IAED,qBAAqB;IACrB,MAAM,WAAW,GAAmB;QAClC,IAAI;KACL,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;IAC5B,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC;IAChC,CAAC;IACD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,sBAAsB;IACtB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,WAAW,EACX,KAAK,EACL,WAAW,CACZ,CAAC;IAEF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;iBACpB,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export interface DeployPageArgs {
|
|
|
2
2
|
title: string;
|
|
3
3
|
content: string;
|
|
4
4
|
slug: string;
|
|
5
|
+
tags?: string[];
|
|
5
6
|
}
|
|
6
7
|
export interface DeployPageResponse {
|
|
7
8
|
url: string;
|
|
@@ -10,6 +11,7 @@ export interface PageSummary {
|
|
|
10
11
|
id: number;
|
|
11
12
|
slug: string;
|
|
12
13
|
title: string;
|
|
14
|
+
tags?: string[];
|
|
13
15
|
created_at: string;
|
|
14
16
|
updated_at: string;
|
|
15
17
|
}
|
|
@@ -17,4 +19,20 @@ export interface ListPagesResponse {
|
|
|
17
19
|
count: number;
|
|
18
20
|
pages: PageSummary[];
|
|
19
21
|
}
|
|
22
|
+
export interface UpdatePageArgs {
|
|
23
|
+
slug: string;
|
|
24
|
+
title?: string;
|
|
25
|
+
content?: string;
|
|
26
|
+
tags?: string[];
|
|
27
|
+
}
|
|
28
|
+
export interface UpdatePageResponse {
|
|
29
|
+
message: string;
|
|
30
|
+
slug: string;
|
|
31
|
+
}
|
|
32
|
+
export interface DeletePageArgs {
|
|
33
|
+
slug: string;
|
|
34
|
+
}
|
|
35
|
+
export interface DeletePageResponse {
|
|
36
|
+
message: string;
|
|
37
|
+
}
|
|
20
38
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gearvn-pages-mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "MCP Server for GearVN Pages deployment and management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
8
8
|
"gearvn-pages-mcp": "dist/index.js"
|
|
9
9
|
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"watch": "tsc --watch",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"prepublishOnly": "npm run build"
|
|
15
|
+
},
|
|
10
16
|
"keywords": [
|
|
11
17
|
"mcp",
|
|
12
18
|
"model-context-protocol",
|
|
@@ -20,10 +26,5 @@
|
|
|
20
26
|
"devDependencies": {
|
|
21
27
|
"@types/node": "^22.10.2",
|
|
22
28
|
"typescript": "^5.7.2"
|
|
23
|
-
},
|
|
24
|
-
"scripts": {
|
|
25
|
-
"build": "tsc",
|
|
26
|
-
"watch": "tsc --watch",
|
|
27
|
-
"start": "node dist/index.js"
|
|
28
29
|
}
|
|
29
|
-
}
|
|
30
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -8,6 +8,8 @@ import {
|
|
|
8
8
|
} from "@modelcontextprotocol/sdk/types.js";
|
|
9
9
|
import { DEPLOY_PAGE_TOOL, handleDeployPage } from "./tools/deploy-page.js";
|
|
10
10
|
import { LIST_PAGES_TOOL, handleListPages } from "./tools/list-pages.js";
|
|
11
|
+
import { UPDATE_PAGE_TOOL, handleUpdatePage } from "./tools/update-page.js";
|
|
12
|
+
import { DELETE_PAGE_TOOL, handleDeletePage } from "./tools/delete-page.js";
|
|
11
13
|
|
|
12
14
|
// Create MCP server
|
|
13
15
|
const server = new Server(
|
|
@@ -25,7 +27,7 @@ const server = new Server(
|
|
|
25
27
|
// Handler for listing available tools
|
|
26
28
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
27
29
|
return {
|
|
28
|
-
tools: [DEPLOY_PAGE_TOOL, LIST_PAGES_TOOL],
|
|
30
|
+
tools: [DEPLOY_PAGE_TOOL, LIST_PAGES_TOOL, UPDATE_PAGE_TOOL, DELETE_PAGE_TOOL],
|
|
29
31
|
};
|
|
30
32
|
});
|
|
31
33
|
|
|
@@ -38,6 +40,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
38
40
|
return await handleDeployPage(args);
|
|
39
41
|
} else if (name === "list-pages") {
|
|
40
42
|
return await handleListPages();
|
|
43
|
+
} else if (name === "update-page") {
|
|
44
|
+
return await handleUpdatePage(args);
|
|
45
|
+
} else if (name === "delete-page") {
|
|
46
|
+
return await handleDeletePage(args);
|
|
41
47
|
} else {
|
|
42
48
|
throw new Error(`Unknown tool: ${name}`);
|
|
43
49
|
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import { callAPI } from "../api.js";
|
|
3
|
+
import { DeletePageArgs, DeletePageResponse } from "../types.js";
|
|
4
|
+
|
|
5
|
+
export const DELETE_PAGE_TOOL: Tool = {
|
|
6
|
+
name: "delete-page",
|
|
7
|
+
description:
|
|
8
|
+
"Delete a page by its slug. IMPORTANT: You must use the EXACT slug from list-pages response, including the timestamp suffix (e.g., 'my-page-1730229600'). Only pages owned by your API key can be deleted. Returns success message on successful deletion.",
|
|
9
|
+
inputSchema: {
|
|
10
|
+
type: "object",
|
|
11
|
+
properties: {
|
|
12
|
+
slug: {
|
|
13
|
+
type: "string",
|
|
14
|
+
description:
|
|
15
|
+
"The exact slug of the page to delete. Must match the slug from list-pages response, including timestamp suffix.",
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
required: ["slug"],
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export async function handleDeletePage(args: unknown) {
|
|
23
|
+
const { slug } = args as DeletePageArgs;
|
|
24
|
+
|
|
25
|
+
// Validate inputs
|
|
26
|
+
if (!slug) {
|
|
27
|
+
throw new Error("Missing required parameter: slug is required");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Call the delete API
|
|
31
|
+
const response = await callAPI<DeletePageResponse>(
|
|
32
|
+
"/v1/pages",
|
|
33
|
+
"DELETE",
|
|
34
|
+
{
|
|
35
|
+
slug,
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
content: [
|
|
41
|
+
{
|
|
42
|
+
type: "text" as const,
|
|
43
|
+
text: JSON.stringify(
|
|
44
|
+
{
|
|
45
|
+
success: true,
|
|
46
|
+
message: response.message,
|
|
47
|
+
slug: slug,
|
|
48
|
+
},
|
|
49
|
+
null,
|
|
50
|
+
2
|
|
51
|
+
),
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
}
|
package/src/tools/deploy-page.ts
CHANGED
|
@@ -26,13 +26,21 @@ export const DEPLOY_PAGE_TOOL: Tool = {
|
|
|
26
26
|
"Generate a simple kebab-case slug (e.g., 'quan-ly-thu-chi', 'landing-page')." +
|
|
27
27
|
"FOR UPDATING EXISTING PAGES: Use the EXACT full slug including timestamp (e.g., 'quan-ly-thu-chi-1730229600') from the backend response. ",
|
|
28
28
|
},
|
|
29
|
+
tags: {
|
|
30
|
+
type: "array",
|
|
31
|
+
items: {
|
|
32
|
+
type: "string",
|
|
33
|
+
},
|
|
34
|
+
description:
|
|
35
|
+
"Optional array of tags to categorize the page (e.g., ['dashboard', 'finance']). Tags are case-insensitive for filtering.",
|
|
36
|
+
},
|
|
29
37
|
},
|
|
30
38
|
required: ["title", "content", "slug"],
|
|
31
39
|
},
|
|
32
40
|
};
|
|
33
41
|
|
|
34
42
|
export async function handleDeployPage(args: unknown) {
|
|
35
|
-
const { title, content, slug } = args as DeployPageArgs;
|
|
43
|
+
const { title, content, slug, tags } = args as DeployPageArgs;
|
|
36
44
|
|
|
37
45
|
// Validate inputs
|
|
38
46
|
if (!title || !content || !slug) {
|
|
@@ -41,12 +49,24 @@ export async function handleDeployPage(args: unknown) {
|
|
|
41
49
|
);
|
|
42
50
|
}
|
|
43
51
|
|
|
44
|
-
//
|
|
45
|
-
const
|
|
52
|
+
// Build request body
|
|
53
|
+
const requestBody: DeployPageArgs = {
|
|
46
54
|
title,
|
|
47
55
|
content,
|
|
48
56
|
slug,
|
|
49
|
-
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// Add tags if provided
|
|
60
|
+
if (tags && tags.length > 0) {
|
|
61
|
+
requestBody.tags = tags;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Call the deploy API
|
|
65
|
+
const response = await callAPI<DeployPageResponse>(
|
|
66
|
+
"/v1/deploy",
|
|
67
|
+
"POST",
|
|
68
|
+
requestBody
|
|
69
|
+
);
|
|
50
70
|
|
|
51
71
|
return {
|
|
52
72
|
content: [
|
|
@@ -57,6 +77,7 @@ export async function handleDeployPage(args: unknown) {
|
|
|
57
77
|
success: true,
|
|
58
78
|
message: "Page deployed successfully",
|
|
59
79
|
url: response.url,
|
|
80
|
+
tags: tags || [],
|
|
60
81
|
},
|
|
61
82
|
null,
|
|
62
83
|
2
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import { callAPI } from "../api.js";
|
|
3
|
+
import { UpdatePageArgs, UpdatePageResponse } from "../types.js";
|
|
4
|
+
|
|
5
|
+
export const UPDATE_PAGE_TOOL: Tool = {
|
|
6
|
+
name: "update-page",
|
|
7
|
+
description:
|
|
8
|
+
"Update an existing page by slug. You can update title, content, or tags individually or in combination. IMPORTANT: You must use the EXACT slug from list-pages response, including the timestamp suffix (e.g., 'my-page-1730229600'). At least one field (title, content, or tags) must be provided for update.",
|
|
9
|
+
inputSchema: {
|
|
10
|
+
type: "object",
|
|
11
|
+
properties: {
|
|
12
|
+
slug: {
|
|
13
|
+
type: "string",
|
|
14
|
+
description:
|
|
15
|
+
"The exact slug of the page to update. Must match the slug from list-pages response, including timestamp suffix.",
|
|
16
|
+
},
|
|
17
|
+
title: {
|
|
18
|
+
type: "string",
|
|
19
|
+
description: "Optional new title for the page.",
|
|
20
|
+
},
|
|
21
|
+
content: {
|
|
22
|
+
type: "string",
|
|
23
|
+
description:
|
|
24
|
+
"Optional new HTML content for the page. Must be complete, valid HTML document with TailwindCSS for styling.",
|
|
25
|
+
},
|
|
26
|
+
tags: {
|
|
27
|
+
type: "array",
|
|
28
|
+
items: {
|
|
29
|
+
type: "string",
|
|
30
|
+
},
|
|
31
|
+
description:
|
|
32
|
+
"Optional new array of tags to categorize the page (e.g., ['dashboard', 'finance']). This will replace existing tags. Tags are case-insensitive for filtering.",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
required: ["slug"],
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export async function handleUpdatePage(args: unknown) {
|
|
40
|
+
const { slug, title, content, tags } = args as UpdatePageArgs;
|
|
41
|
+
|
|
42
|
+
// Validate inputs
|
|
43
|
+
if (!slug) {
|
|
44
|
+
throw new Error("Missing required parameter: slug is required");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Check if at least one field is provided
|
|
48
|
+
if (!title && !content && (!tags || tags.length === 0)) {
|
|
49
|
+
throw new Error(
|
|
50
|
+
"At least one field (title, content, or tags) must be provided for update"
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Build request body
|
|
55
|
+
const requestBody: UpdatePageArgs = {
|
|
56
|
+
slug,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
if (title) {
|
|
60
|
+
requestBody.title = title;
|
|
61
|
+
}
|
|
62
|
+
if (content) {
|
|
63
|
+
requestBody.content = content;
|
|
64
|
+
}
|
|
65
|
+
if (tags && tags.length > 0) {
|
|
66
|
+
requestBody.tags = tags;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Call the update API
|
|
70
|
+
const response = await callAPI<UpdatePageResponse>(
|
|
71
|
+
"/v1/pages",
|
|
72
|
+
"PUT",
|
|
73
|
+
requestBody
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
content: [
|
|
78
|
+
{
|
|
79
|
+
type: "text" as const,
|
|
80
|
+
text: JSON.stringify(
|
|
81
|
+
{
|
|
82
|
+
success: true,
|
|
83
|
+
message: response.message,
|
|
84
|
+
slug: response.slug,
|
|
85
|
+
},
|
|
86
|
+
null,
|
|
87
|
+
2
|
|
88
|
+
),
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -2,6 +2,7 @@ export interface DeployPageArgs {
|
|
|
2
2
|
title: string;
|
|
3
3
|
content: string;
|
|
4
4
|
slug: string;
|
|
5
|
+
tags?: string[];
|
|
5
6
|
}
|
|
6
7
|
|
|
7
8
|
export interface DeployPageResponse {
|
|
@@ -12,6 +13,7 @@ export interface PageSummary {
|
|
|
12
13
|
id: number;
|
|
13
14
|
slug: string;
|
|
14
15
|
title: string;
|
|
16
|
+
tags?: string[];
|
|
15
17
|
created_at: string;
|
|
16
18
|
updated_at: string;
|
|
17
19
|
}
|
|
@@ -20,3 +22,23 @@ export interface ListPagesResponse {
|
|
|
20
22
|
count: number;
|
|
21
23
|
pages: PageSummary[];
|
|
22
24
|
}
|
|
25
|
+
|
|
26
|
+
export interface UpdatePageArgs {
|
|
27
|
+
slug: string;
|
|
28
|
+
title?: string;
|
|
29
|
+
content?: string;
|
|
30
|
+
tags?: string[];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface UpdatePageResponse {
|
|
34
|
+
message: string;
|
|
35
|
+
slug: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface DeletePageArgs {
|
|
39
|
+
slug: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface DeletePageResponse {
|
|
43
|
+
message: string;
|
|
44
|
+
}
|