@kywi-software/mcp 0.1.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/LICENSE +661 -0
- package/README.md +77 -0
- package/dist/__tests__/auto-detect.test.d.ts +2 -0
- package/dist/__tests__/auto-detect.test.d.ts.map +1 -0
- package/dist/__tests__/auto-detect.test.js +134 -0
- package/dist/__tests__/auto-detect.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +72 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/developer-mutation.test.d.ts +2 -0
- package/dist/__tests__/developer-mutation.test.d.ts.map +1 -0
- package/dist/__tests__/developer-mutation.test.js +511 -0
- package/dist/__tests__/developer-mutation.test.js.map +1 -0
- package/dist/__tests__/developer-read-only.test.d.ts +2 -0
- package/dist/__tests__/developer-read-only.test.d.ts.map +1 -0
- package/dist/__tests__/developer-read-only.test.js +192 -0
- package/dist/__tests__/developer-read-only.test.js.map +1 -0
- package/dist/__tests__/site-content-tools.test.d.ts +2 -0
- package/dist/__tests__/site-content-tools.test.d.ts.map +1 -0
- package/dist/__tests__/site-content-tools.test.js +446 -0
- package/dist/__tests__/site-content-tools.test.js.map +1 -0
- package/dist/__tests__/site-layout-tools.test.d.ts +2 -0
- package/dist/__tests__/site-layout-tools.test.d.ts.map +1 -0
- package/dist/__tests__/site-layout-tools.test.js +316 -0
- package/dist/__tests__/site-layout-tools.test.js.map +1 -0
- package/dist/__tests__/site-other-tools.test.d.ts +2 -0
- package/dist/__tests__/site-other-tools.test.d.ts.map +1 -0
- package/dist/__tests__/site-other-tools.test.js +318 -0
- package/dist/__tests__/site-other-tools.test.js.map +1 -0
- package/dist/config.d.ts +31 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +4 -0
- package/dist/config.js.map +1 -0
- package/dist/developer/auto-detect.d.ts +17 -0
- package/dist/developer/auto-detect.d.ts.map +1 -0
- package/dist/developer/auto-detect.js +54 -0
- package/dist/developer/auto-detect.js.map +1 -0
- package/dist/developer/cli.d.ts +3 -0
- package/dist/developer/cli.d.ts.map +1 -0
- package/dist/developer/cli.js +14 -0
- package/dist/developer/cli.js.map +1 -0
- package/dist/developer/index.d.ts +4 -0
- package/dist/developer/index.d.ts.map +1 -0
- package/dist/developer/index.js +9 -0
- package/dist/developer/index.js.map +1 -0
- package/dist/developer/server.d.ts +4 -0
- package/dist/developer/server.d.ts.map +1 -0
- package/dist/developer/server.js +29 -0
- package/dist/developer/server.js.map +1 -0
- package/dist/developer/tools/api-keys.d.ts +48 -0
- package/dist/developer/tools/api-keys.d.ts.map +1 -0
- package/dist/developer/tools/api-keys.js +51 -0
- package/dist/developer/tools/api-keys.js.map +1 -0
- package/dist/developer/tools/config-mutation.d.ts +139 -0
- package/dist/developer/tools/config-mutation.d.ts.map +1 -0
- package/dist/developer/tools/config-mutation.js +277 -0
- package/dist/developer/tools/config-mutation.js.map +1 -0
- package/dist/developer/tools/content-type-tools.d.ts +32 -0
- package/dist/developer/tools/content-type-tools.d.ts.map +1 -0
- package/dist/developer/tools/content-type-tools.js +92 -0
- package/dist/developer/tools/content-type-tools.js.map +1 -0
- package/dist/developer/tools/read-only.d.ts +86 -0
- package/dist/developer/tools/read-only.d.ts.map +1 -0
- package/dist/developer/tools/read-only.js +235 -0
- package/dist/developer/tools/read-only.js.map +1 -0
- package/dist/developer/tools/scaffolding.d.ts +67 -0
- package/dist/developer/tools/scaffolding.d.ts.map +1 -0
- package/dist/developer/tools/scaffolding.js +207 -0
- package/dist/developer/tools/scaffolding.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/shared.d.ts +15 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +7 -0
- package/dist/shared.js.map +1 -0
- package/dist/site/cli.d.ts +3 -0
- package/dist/site/cli.d.ts.map +1 -0
- package/dist/site/cli.js +12 -0
- package/dist/site/cli.js.map +1 -0
- package/dist/site/index.d.ts +4 -0
- package/dist/site/index.d.ts.map +1 -0
- package/dist/site/index.js +9 -0
- package/dist/site/index.js.map +1 -0
- package/dist/site/server.d.ts +10 -0
- package/dist/site/server.d.ts.map +1 -0
- package/dist/site/server.js +73 -0
- package/dist/site/server.js.map +1 -0
- package/dist/site/tools/content.d.ts +250 -0
- package/dist/site/tools/content.d.ts.map +1 -0
- package/dist/site/tools/content.js +329 -0
- package/dist/site/tools/content.js.map +1 -0
- package/dist/site/tools/feeds.d.ts +62 -0
- package/dist/site/tools/feeds.d.ts.map +1 -0
- package/dist/site/tools/feeds.js +97 -0
- package/dist/site/tools/feeds.js.map +1 -0
- package/dist/site/tools/layout.d.ts +163 -0
- package/dist/site/tools/layout.d.ts.map +1 -0
- package/dist/site/tools/layout.js +226 -0
- package/dist/site/tools/layout.js.map +1 -0
- package/dist/site/tools/media.d.ts +38 -0
- package/dist/site/tools/media.d.ts.map +1 -0
- package/dist/site/tools/media.js +52 -0
- package/dist/site/tools/media.js.map +1 -0
- package/dist/site/tools/search.d.ts +40 -0
- package/dist/site/tools/search.d.ts.map +1 -0
- package/dist/site/tools/search.js +60 -0
- package/dist/site/tools/search.js.map +1 -0
- package/dist/site/tools/users.d.ts +60 -0
- package/dist/site/tools/users.d.ts.map +1 -0
- package/dist/site/tools/users.js +71 -0
- package/dist/site/tools/users.js.map +1 -0
- package/dist/site/tools/webhooks.d.ts +34 -0
- package/dist/site/tools/webhooks.d.ts.map +1 -0
- package/dist/site/tools/webhooks.js +44 -0
- package/dist/site/tools/webhooks.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { KywiSdkScope } from '@kywi-software/sdk';
|
|
3
|
+
interface ModuleNode {
|
|
4
|
+
id: string;
|
|
5
|
+
type: string;
|
|
6
|
+
instanceId: string;
|
|
7
|
+
props: Record<string, unknown>;
|
|
8
|
+
style: Record<string, string>;
|
|
9
|
+
}
|
|
10
|
+
interface LayoutColumn {
|
|
11
|
+
id: string;
|
|
12
|
+
width: number;
|
|
13
|
+
nodes: ModuleNode[];
|
|
14
|
+
}
|
|
15
|
+
interface LayoutSection {
|
|
16
|
+
id: string;
|
|
17
|
+
type: 'section';
|
|
18
|
+
style: Record<string, string>;
|
|
19
|
+
columns: LayoutColumn[];
|
|
20
|
+
}
|
|
21
|
+
interface LayoutDocument {
|
|
22
|
+
regions: Record<string, LayoutSection[]>;
|
|
23
|
+
}
|
|
24
|
+
declare function findSection(layout: LayoutDocument, region: string, rowId: string): LayoutSection | undefined;
|
|
25
|
+
declare function findColumn(section: LayoutSection, colId: string): LayoutColumn | undefined;
|
|
26
|
+
declare function findModule(column: LayoutColumn, instanceId: string): ModuleNode | undefined;
|
|
27
|
+
declare function parseLayout(content: Record<string, unknown>): LayoutDocument | null;
|
|
28
|
+
export declare function handleGetLayout(sdk: KywiSdkScope, args: {
|
|
29
|
+
type: string;
|
|
30
|
+
id: string;
|
|
31
|
+
}): Promise<{
|
|
32
|
+
content: [{
|
|
33
|
+
type: "text";
|
|
34
|
+
text: string;
|
|
35
|
+
}];
|
|
36
|
+
isError?: undefined;
|
|
37
|
+
} | {
|
|
38
|
+
content: [{
|
|
39
|
+
type: "text";
|
|
40
|
+
text: string;
|
|
41
|
+
}];
|
|
42
|
+
isError: true;
|
|
43
|
+
}>;
|
|
44
|
+
export declare function handleUpdateLayout(sdk: KywiSdkScope, args: {
|
|
45
|
+
type: string;
|
|
46
|
+
id: string;
|
|
47
|
+
layout: Record<string, unknown>;
|
|
48
|
+
}): Promise<{
|
|
49
|
+
content: [{
|
|
50
|
+
type: "text";
|
|
51
|
+
text: string;
|
|
52
|
+
}];
|
|
53
|
+
isError?: undefined;
|
|
54
|
+
} | {
|
|
55
|
+
content: [{
|
|
56
|
+
type: "text";
|
|
57
|
+
text: string;
|
|
58
|
+
}];
|
|
59
|
+
isError: true;
|
|
60
|
+
}>;
|
|
61
|
+
export declare function handleAddModule(sdk: KywiSdkScope, args: {
|
|
62
|
+
type: string;
|
|
63
|
+
id: string;
|
|
64
|
+
region: string;
|
|
65
|
+
rowId: string;
|
|
66
|
+
colId: string;
|
|
67
|
+
module: string;
|
|
68
|
+
props?: Record<string, unknown> | undefined;
|
|
69
|
+
}): Promise<{
|
|
70
|
+
content: [{
|
|
71
|
+
type: "text";
|
|
72
|
+
text: string;
|
|
73
|
+
}];
|
|
74
|
+
isError?: undefined;
|
|
75
|
+
} | {
|
|
76
|
+
content: [{
|
|
77
|
+
type: "text";
|
|
78
|
+
text: string;
|
|
79
|
+
}];
|
|
80
|
+
isError: true;
|
|
81
|
+
}>;
|
|
82
|
+
export declare function handleRemoveModule(sdk: KywiSdkScope, args: {
|
|
83
|
+
type: string;
|
|
84
|
+
id: string;
|
|
85
|
+
region: string;
|
|
86
|
+
rowId: string;
|
|
87
|
+
colId: string;
|
|
88
|
+
instanceId: string;
|
|
89
|
+
}): Promise<{
|
|
90
|
+
content: [{
|
|
91
|
+
type: "text";
|
|
92
|
+
text: string;
|
|
93
|
+
}];
|
|
94
|
+
isError?: undefined;
|
|
95
|
+
} | {
|
|
96
|
+
content: [{
|
|
97
|
+
type: "text";
|
|
98
|
+
text: string;
|
|
99
|
+
}];
|
|
100
|
+
isError: true;
|
|
101
|
+
}>;
|
|
102
|
+
export declare function handleUpdateModuleProps(sdk: KywiSdkScope, args: {
|
|
103
|
+
type: string;
|
|
104
|
+
id: string;
|
|
105
|
+
region: string;
|
|
106
|
+
rowId: string;
|
|
107
|
+
colId: string;
|
|
108
|
+
instanceId: string;
|
|
109
|
+
props: Record<string, unknown>;
|
|
110
|
+
}): Promise<{
|
|
111
|
+
content: [{
|
|
112
|
+
type: "text";
|
|
113
|
+
text: string;
|
|
114
|
+
}];
|
|
115
|
+
isError?: undefined;
|
|
116
|
+
} | {
|
|
117
|
+
content: [{
|
|
118
|
+
type: "text";
|
|
119
|
+
text: string;
|
|
120
|
+
}];
|
|
121
|
+
isError: true;
|
|
122
|
+
}>;
|
|
123
|
+
export declare function handleAddRow(sdk: KywiSdkScope, args: {
|
|
124
|
+
type: string;
|
|
125
|
+
id: string;
|
|
126
|
+
region: string;
|
|
127
|
+
columns: Array<{
|
|
128
|
+
width: number;
|
|
129
|
+
}>;
|
|
130
|
+
}): Promise<{
|
|
131
|
+
content: [{
|
|
132
|
+
type: "text";
|
|
133
|
+
text: string;
|
|
134
|
+
}];
|
|
135
|
+
isError?: undefined;
|
|
136
|
+
} | {
|
|
137
|
+
content: [{
|
|
138
|
+
type: "text";
|
|
139
|
+
text: string;
|
|
140
|
+
}];
|
|
141
|
+
isError: true;
|
|
142
|
+
}>;
|
|
143
|
+
export declare function handleRemoveRow(sdk: KywiSdkScope, args: {
|
|
144
|
+
type: string;
|
|
145
|
+
id: string;
|
|
146
|
+
region: string;
|
|
147
|
+
rowId: string;
|
|
148
|
+
}): Promise<{
|
|
149
|
+
content: [{
|
|
150
|
+
type: "text";
|
|
151
|
+
text: string;
|
|
152
|
+
}];
|
|
153
|
+
isError?: undefined;
|
|
154
|
+
} | {
|
|
155
|
+
content: [{
|
|
156
|
+
type: "text";
|
|
157
|
+
text: string;
|
|
158
|
+
}];
|
|
159
|
+
isError: true;
|
|
160
|
+
}>;
|
|
161
|
+
export { findSection, findColumn, findModule, parseLayout };
|
|
162
|
+
export declare function registerLayoutTools(server: McpServer, sdk: KywiSdkScope): void;
|
|
163
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/site/tools/layout.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAKtD,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC9B;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB;AAED,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,SAAS,CAAA;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,OAAO,EAAE,YAAY,EAAE,CAAA;CACxB;AAED,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAA;CACzC;AAID,iBAAS,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAIrG;AAED,iBAAS,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEnF;AAED,iBAAS,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAEpF;AAED,iBAAS,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,GAAG,IAAI,CAW5E;AAID,wBAAsB,eAAe,CACnC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;GAMnC;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE;;;;;;;;;;;;GAMpE;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;CAC5C;;;;;;;;;;;;GAyBF;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;CACnB;;;;;;;;;;;;GAsBF;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;;;;;;;;;;;;GAqBF;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAClC;;;;;;;;;;;;GA2BF;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;;;;;;;;;;;;GAoBF;AAGD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,CAAA;AAI3D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CA2E9E"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { textResult, errorResult } from '../../shared.js';
|
|
3
|
+
// ─── Pure helpers ────────────────────────────────────────────────────────────
|
|
4
|
+
function findSection(layout, region, rowId) {
|
|
5
|
+
const sections = layout.regions[region];
|
|
6
|
+
if (!sections)
|
|
7
|
+
return undefined;
|
|
8
|
+
return sections.find((s) => s.id === rowId);
|
|
9
|
+
}
|
|
10
|
+
function findColumn(section, colId) {
|
|
11
|
+
return section.columns.find((c) => c.id === colId);
|
|
12
|
+
}
|
|
13
|
+
function findModule(column, instanceId) {
|
|
14
|
+
return column.nodes.find((n) => n.instanceId === instanceId);
|
|
15
|
+
}
|
|
16
|
+
function parseLayout(content) {
|
|
17
|
+
const raw = content.layoutJson;
|
|
18
|
+
if (!raw)
|
|
19
|
+
return null;
|
|
20
|
+
if (typeof raw === 'string') {
|
|
21
|
+
try {
|
|
22
|
+
return JSON.parse(raw);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return raw;
|
|
29
|
+
}
|
|
30
|
+
// ─── Exported handler functions (testable without server) ───────────────────
|
|
31
|
+
export async function handleGetLayout(sdk, args) {
|
|
32
|
+
const item = await sdk.content.getById(args.id);
|
|
33
|
+
if (!item)
|
|
34
|
+
return errorResult('Content not found');
|
|
35
|
+
const layout = parseLayout(item);
|
|
36
|
+
return layout ? textResult(layout) : textResult({ regions: {} });
|
|
37
|
+
}
|
|
38
|
+
export async function handleUpdateLayout(sdk, args) {
|
|
39
|
+
const updated = await sdk.content.update(args.type, args.id, {
|
|
40
|
+
layoutJson: JSON.stringify(args.layout),
|
|
41
|
+
});
|
|
42
|
+
return updated ? textResult(updated) : errorResult('Content not found');
|
|
43
|
+
}
|
|
44
|
+
export async function handleAddModule(sdk, args) {
|
|
45
|
+
const item = await sdk.content.getById(args.id);
|
|
46
|
+
if (!item)
|
|
47
|
+
return errorResult('Content not found');
|
|
48
|
+
const layout = parseLayout(item) ?? { regions: {} };
|
|
49
|
+
const section = findSection(layout, args.region, args.rowId);
|
|
50
|
+
if (!section)
|
|
51
|
+
return errorResult(`Row '${args.rowId}' not found in region '${args.region}'`);
|
|
52
|
+
const column = findColumn(section, args.colId);
|
|
53
|
+
if (!column)
|
|
54
|
+
return errorResult(`Column '${args.colId}' not found in row '${args.rowId}'`);
|
|
55
|
+
const newModule = {
|
|
56
|
+
id: crypto.randomUUID(),
|
|
57
|
+
type: args.module,
|
|
58
|
+
instanceId: crypto.randomUUID(),
|
|
59
|
+
props: args.props ?? {},
|
|
60
|
+
style: {},
|
|
61
|
+
};
|
|
62
|
+
column.nodes.push(newModule);
|
|
63
|
+
const updated = await sdk.content.update(args.type, args.id, {
|
|
64
|
+
layoutJson: JSON.stringify(layout),
|
|
65
|
+
});
|
|
66
|
+
return updated ? textResult({ module: newModule, layout }) : errorResult('Failed to save layout');
|
|
67
|
+
}
|
|
68
|
+
export async function handleRemoveModule(sdk, args) {
|
|
69
|
+
const item = await sdk.content.getById(args.id);
|
|
70
|
+
if (!item)
|
|
71
|
+
return errorResult('Content not found');
|
|
72
|
+
const layout = parseLayout(item) ?? { regions: {} };
|
|
73
|
+
const section = findSection(layout, args.region, args.rowId);
|
|
74
|
+
if (!section)
|
|
75
|
+
return errorResult(`Row '${args.rowId}' not found in region '${args.region}'`);
|
|
76
|
+
const column = findColumn(section, args.colId);
|
|
77
|
+
if (!column)
|
|
78
|
+
return errorResult(`Column '${args.colId}' not found in row '${args.rowId}'`);
|
|
79
|
+
const before = column.nodes.length;
|
|
80
|
+
column.nodes = column.nodes.filter((n) => n.instanceId !== args.instanceId);
|
|
81
|
+
if (column.nodes.length === before) {
|
|
82
|
+
return errorResult(`Module '${args.instanceId}' not found in column '${args.colId}'`);
|
|
83
|
+
}
|
|
84
|
+
const updated = await sdk.content.update(args.type, args.id, {
|
|
85
|
+
layoutJson: JSON.stringify(layout),
|
|
86
|
+
});
|
|
87
|
+
return updated ? textResult({ removed: args.instanceId, layout }) : errorResult('Failed to save layout');
|
|
88
|
+
}
|
|
89
|
+
export async function handleUpdateModuleProps(sdk, args) {
|
|
90
|
+
const item = await sdk.content.getById(args.id);
|
|
91
|
+
if (!item)
|
|
92
|
+
return errorResult('Content not found');
|
|
93
|
+
const layout = parseLayout(item) ?? { regions: {} };
|
|
94
|
+
const section = findSection(layout, args.region, args.rowId);
|
|
95
|
+
if (!section)
|
|
96
|
+
return errorResult(`Row '${args.rowId}' not found in region '${args.region}'`);
|
|
97
|
+
const column = findColumn(section, args.colId);
|
|
98
|
+
if (!column)
|
|
99
|
+
return errorResult(`Column '${args.colId}' not found in row '${args.rowId}'`);
|
|
100
|
+
const mod = findModule(column, args.instanceId);
|
|
101
|
+
if (!mod)
|
|
102
|
+
return errorResult(`Module '${args.instanceId}' not found in column '${args.colId}'`);
|
|
103
|
+
mod.props = { ...mod.props, ...args.props };
|
|
104
|
+
const updated = await sdk.content.update(args.type, args.id, {
|
|
105
|
+
layoutJson: JSON.stringify(layout),
|
|
106
|
+
});
|
|
107
|
+
return updated ? textResult({ module: mod, layout }) : errorResult('Failed to save layout');
|
|
108
|
+
}
|
|
109
|
+
export async function handleAddRow(sdk, args) {
|
|
110
|
+
const item = await sdk.content.getById(args.id);
|
|
111
|
+
if (!item)
|
|
112
|
+
return errorResult('Content not found');
|
|
113
|
+
const layout = parseLayout(item) ?? { regions: {} };
|
|
114
|
+
if (!layout.regions[args.region]) {
|
|
115
|
+
layout.regions[args.region] = [];
|
|
116
|
+
}
|
|
117
|
+
const regionSections = layout.regions[args.region];
|
|
118
|
+
const newSection = {
|
|
119
|
+
id: crypto.randomUUID(),
|
|
120
|
+
type: 'section',
|
|
121
|
+
style: {},
|
|
122
|
+
columns: args.columns.map((col) => ({
|
|
123
|
+
id: crypto.randomUUID(),
|
|
124
|
+
width: col.width,
|
|
125
|
+
nodes: [],
|
|
126
|
+
})),
|
|
127
|
+
};
|
|
128
|
+
regionSections.push(newSection);
|
|
129
|
+
const updated = await sdk.content.update(args.type, args.id, {
|
|
130
|
+
layoutJson: JSON.stringify(layout),
|
|
131
|
+
});
|
|
132
|
+
return updated ? textResult({ section: newSection, layout }) : errorResult('Failed to save layout');
|
|
133
|
+
}
|
|
134
|
+
export async function handleRemoveRow(sdk, args) {
|
|
135
|
+
const item = await sdk.content.getById(args.id);
|
|
136
|
+
if (!item)
|
|
137
|
+
return errorResult('Content not found');
|
|
138
|
+
const layout = parseLayout(item) ?? { regions: {} };
|
|
139
|
+
const sections = layout.regions[args.region];
|
|
140
|
+
if (!sections)
|
|
141
|
+
return errorResult(`Region '${args.region}' not found`);
|
|
142
|
+
const before = sections.length;
|
|
143
|
+
const filtered = sections.filter((s) => s.id !== args.rowId);
|
|
144
|
+
layout.regions[args.region] = filtered;
|
|
145
|
+
if (filtered.length === before) {
|
|
146
|
+
return errorResult(`Row '${args.rowId}' not found in region '${args.region}'`);
|
|
147
|
+
}
|
|
148
|
+
const updated = await sdk.content.update(args.type, args.id, {
|
|
149
|
+
layoutJson: JSON.stringify(layout),
|
|
150
|
+
});
|
|
151
|
+
return updated ? textResult({ removed: args.rowId, layout }) : errorResult('Failed to save layout');
|
|
152
|
+
}
|
|
153
|
+
// Export helpers for testing
|
|
154
|
+
export { findSection, findColumn, findModule, parseLayout };
|
|
155
|
+
// ─── Registration ───────────────────────────────────────────────────────────
|
|
156
|
+
export function registerLayoutTools(server, sdk) {
|
|
157
|
+
server.registerTool('get_layout', {
|
|
158
|
+
description: 'Get the layout JSON for a content item',
|
|
159
|
+
inputSchema: {
|
|
160
|
+
type: z.string().describe('Content type name'),
|
|
161
|
+
id: z.string().describe('Content ID'),
|
|
162
|
+
},
|
|
163
|
+
}, async (args) => handleGetLayout(sdk, args));
|
|
164
|
+
server.registerTool('update_layout', {
|
|
165
|
+
description: 'Replace the entire layout JSON for a content item',
|
|
166
|
+
inputSchema: {
|
|
167
|
+
type: z.string().describe('Content type name'),
|
|
168
|
+
id: z.string().describe('Content ID'),
|
|
169
|
+
layout: z.record(z.unknown()).describe('Complete layout document'),
|
|
170
|
+
},
|
|
171
|
+
}, async (args) => handleUpdateLayout(sdk, args));
|
|
172
|
+
server.registerTool('add_module', {
|
|
173
|
+
description: 'Add a module to a specific column in a layout row',
|
|
174
|
+
inputSchema: {
|
|
175
|
+
type: z.string().describe('Content type name'),
|
|
176
|
+
id: z.string().describe('Content ID'),
|
|
177
|
+
region: z.string().describe('Layout region name'),
|
|
178
|
+
rowId: z.string().describe('Row/section ID'),
|
|
179
|
+
colId: z.string().describe('Column ID'),
|
|
180
|
+
module: z.string().describe('Module type name'),
|
|
181
|
+
props: z.record(z.unknown()).optional().describe('Module properties'),
|
|
182
|
+
},
|
|
183
|
+
}, async (args) => handleAddModule(sdk, args));
|
|
184
|
+
server.registerTool('remove_module', {
|
|
185
|
+
description: 'Remove a module from a layout column by instance ID',
|
|
186
|
+
inputSchema: {
|
|
187
|
+
type: z.string().describe('Content type name'),
|
|
188
|
+
id: z.string().describe('Content ID'),
|
|
189
|
+
region: z.string().describe('Layout region name'),
|
|
190
|
+
rowId: z.string().describe('Row/section ID'),
|
|
191
|
+
colId: z.string().describe('Column ID'),
|
|
192
|
+
instanceId: z.string().describe('Module instance ID to remove'),
|
|
193
|
+
},
|
|
194
|
+
}, async (args) => handleRemoveModule(sdk, args));
|
|
195
|
+
server.registerTool('update_module_props', {
|
|
196
|
+
description: 'Merge new properties into an existing module in a layout',
|
|
197
|
+
inputSchema: {
|
|
198
|
+
type: z.string().describe('Content type name'),
|
|
199
|
+
id: z.string().describe('Content ID'),
|
|
200
|
+
region: z.string().describe('Layout region name'),
|
|
201
|
+
rowId: z.string().describe('Row/section ID'),
|
|
202
|
+
colId: z.string().describe('Column ID'),
|
|
203
|
+
instanceId: z.string().describe('Module instance ID'),
|
|
204
|
+
props: z.record(z.unknown()).describe('Properties to merge'),
|
|
205
|
+
},
|
|
206
|
+
}, async (args) => handleUpdateModuleProps(sdk, args));
|
|
207
|
+
server.registerTool('add_row', {
|
|
208
|
+
description: 'Add a new row (section) with columns to a layout region',
|
|
209
|
+
inputSchema: {
|
|
210
|
+
type: z.string().describe('Content type name'),
|
|
211
|
+
id: z.string().describe('Content ID'),
|
|
212
|
+
region: z.string().describe('Layout region name'),
|
|
213
|
+
columns: z.array(z.object({ width: z.number().describe('Column width (1-12)') })).describe('Column definitions'),
|
|
214
|
+
},
|
|
215
|
+
}, async (args) => handleAddRow(sdk, args));
|
|
216
|
+
server.registerTool('remove_row', {
|
|
217
|
+
description: 'Remove a row (section) from a layout region',
|
|
218
|
+
inputSchema: {
|
|
219
|
+
type: z.string().describe('Content type name'),
|
|
220
|
+
id: z.string().describe('Content ID'),
|
|
221
|
+
region: z.string().describe('Layout region name'),
|
|
222
|
+
rowId: z.string().describe('Row/section ID to remove'),
|
|
223
|
+
},
|
|
224
|
+
}, async (args) => handleRemoveRow(sdk, args));
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/site/tools/layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { KywiSdkScope } from '@kywi-software/sdk';
|
|
3
|
+
export declare function handleUploadMedia(sdk: KywiSdkScope, args: {
|
|
4
|
+
filename: string;
|
|
5
|
+
mimeType: string;
|
|
6
|
+
data: string;
|
|
7
|
+
alt?: string | undefined;
|
|
8
|
+
caption?: string | undefined;
|
|
9
|
+
}): Promise<{
|
|
10
|
+
content: [{
|
|
11
|
+
type: "text";
|
|
12
|
+
text: string;
|
|
13
|
+
}];
|
|
14
|
+
isError?: undefined;
|
|
15
|
+
}>;
|
|
16
|
+
export declare function handleListMedia(sdk: KywiSdkScope, args: {
|
|
17
|
+
siteId?: string | undefined;
|
|
18
|
+
limit?: number | undefined;
|
|
19
|
+
page?: number | undefined;
|
|
20
|
+
mimeType?: string | undefined;
|
|
21
|
+
}): Promise<{
|
|
22
|
+
content: [{
|
|
23
|
+
type: "text";
|
|
24
|
+
text: string;
|
|
25
|
+
}];
|
|
26
|
+
isError?: undefined;
|
|
27
|
+
}>;
|
|
28
|
+
export declare function handleDeleteMedia(sdk: KywiSdkScope, args: {
|
|
29
|
+
id: string;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
content: [{
|
|
32
|
+
type: "text";
|
|
33
|
+
text: string;
|
|
34
|
+
}];
|
|
35
|
+
isError?: undefined;
|
|
36
|
+
}>;
|
|
37
|
+
export declare function registerMediaTools(server: McpServer, sdk: KywiSdkScope): void;
|
|
38
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/site/tools/media.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAKtD,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE;;;;;;GAQnH;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE;;;;;;GAQ5H;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE;;;;;;GAIrB;AAID,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CA4B7E"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { textResult } from '../../shared.js';
|
|
3
|
+
// ─── Exported handler functions (testable without server) ───────────────────
|
|
4
|
+
export async function handleUploadMedia(sdk, args) {
|
|
5
|
+
const buffer = Buffer.from(args.data, 'base64');
|
|
6
|
+
const item = await sdk.media.upload(buffer, args.filename, {
|
|
7
|
+
alt: args.alt,
|
|
8
|
+
caption: args.caption,
|
|
9
|
+
});
|
|
10
|
+
return textResult(item);
|
|
11
|
+
}
|
|
12
|
+
export async function handleListMedia(sdk, args) {
|
|
13
|
+
const result = await sdk.media.list({
|
|
14
|
+
page: args.page,
|
|
15
|
+
limit: args.limit,
|
|
16
|
+
mimeType: args.mimeType,
|
|
17
|
+
});
|
|
18
|
+
return textResult({ items: result.data, total: result.meta.total, page: result.meta.page, pageSize: result.meta.pageSize });
|
|
19
|
+
}
|
|
20
|
+
export async function handleDeleteMedia(sdk, args) {
|
|
21
|
+
await sdk.media.delete(args.id);
|
|
22
|
+
return textResult({ deleted: true, id: args.id });
|
|
23
|
+
}
|
|
24
|
+
// ─── Registration ───────────────────────────────────────────────────────────
|
|
25
|
+
export function registerMediaTools(server, sdk) {
|
|
26
|
+
server.registerTool('upload_media', {
|
|
27
|
+
description: 'Upload a media file from base64-encoded data',
|
|
28
|
+
inputSchema: {
|
|
29
|
+
filename: z.string().describe('File name'),
|
|
30
|
+
mimeType: z.string().describe('MIME type (e.g. image/png)'),
|
|
31
|
+
data: z.string().describe('Base64-encoded file data'),
|
|
32
|
+
alt: z.string().optional().describe('Alt text for the media'),
|
|
33
|
+
caption: z.string().optional().describe('Caption for the media'),
|
|
34
|
+
},
|
|
35
|
+
}, async (args) => handleUploadMedia(sdk, args));
|
|
36
|
+
server.registerTool('list_media', {
|
|
37
|
+
description: 'List media files with optional pagination and MIME type filtering',
|
|
38
|
+
inputSchema: {
|
|
39
|
+
siteId: z.string().optional().describe('Filter by site ID (informational only)'),
|
|
40
|
+
limit: z.number().optional().describe('Items per page'),
|
|
41
|
+
page: z.number().optional().describe('Page number'),
|
|
42
|
+
mimeType: z.string().optional().describe('Filter by MIME type (e.g. image/jpeg)'),
|
|
43
|
+
},
|
|
44
|
+
}, async (args) => handleListMedia(sdk, args));
|
|
45
|
+
server.registerTool('delete_media', {
|
|
46
|
+
description: 'Delete a media file by ID',
|
|
47
|
+
inputSchema: {
|
|
48
|
+
id: z.string().describe('Media file ID'),
|
|
49
|
+
},
|
|
50
|
+
}, async (args) => handleDeleteMedia(sdk, args));
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/site/tools/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { KywiSdkScope } from '@kywi-software/sdk';
|
|
3
|
+
interface TreeNode {
|
|
4
|
+
children?: TreeNode[];
|
|
5
|
+
[key: string]: unknown;
|
|
6
|
+
}
|
|
7
|
+
declare function pruneTree(nodes: TreeNode[], maxDepth: number, currentDepth?: number): TreeNode[];
|
|
8
|
+
export { pruneTree };
|
|
9
|
+
export declare function handleSearchContent(sdk: KywiSdkScope, args: {
|
|
10
|
+
q: string;
|
|
11
|
+
type?: string | undefined;
|
|
12
|
+
siteId?: string | undefined;
|
|
13
|
+
}): Promise<{
|
|
14
|
+
content: [{
|
|
15
|
+
type: "text";
|
|
16
|
+
text: string;
|
|
17
|
+
}];
|
|
18
|
+
isError?: undefined;
|
|
19
|
+
}>;
|
|
20
|
+
export declare function handleGetNav(sdk: KywiSdkScope, args: {
|
|
21
|
+
siteId?: string | undefined;
|
|
22
|
+
depth?: number | undefined;
|
|
23
|
+
}): Promise<{
|
|
24
|
+
content: [{
|
|
25
|
+
type: "text";
|
|
26
|
+
text: string;
|
|
27
|
+
}];
|
|
28
|
+
isError?: undefined;
|
|
29
|
+
}>;
|
|
30
|
+
export declare function handleGetBreadcrumbs(sdk: KywiSdkScope, args: {
|
|
31
|
+
nodeId: string;
|
|
32
|
+
}): Promise<{
|
|
33
|
+
content: [{
|
|
34
|
+
type: "text";
|
|
35
|
+
text: string;
|
|
36
|
+
}];
|
|
37
|
+
isError?: undefined;
|
|
38
|
+
}>;
|
|
39
|
+
export declare function registerSearchTools(server: McpServer, sdk: KywiSdkScope): void;
|
|
40
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/site/tools/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAKtD,UAAU,QAAQ;IAChB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAA;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,iBAAS,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAE,MAAU,GAAG,QAAQ,EAAE,CAM5F;AAGD,OAAO,EAAE,SAAS,EAAE,CAAA;AAIpB,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE;;;;;;GAW5E;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE;;;;;;GAOlE;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE;;;;;;GAIzB;AAID,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CAwB9E"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { textResult } from '../../shared.js';
|
|
3
|
+
function pruneTree(nodes, maxDepth, currentDepth = 0) {
|
|
4
|
+
if (currentDepth >= maxDepth)
|
|
5
|
+
return [];
|
|
6
|
+
return nodes.map((node) => ({
|
|
7
|
+
...node,
|
|
8
|
+
children: node.children ? pruneTree(node.children, maxDepth, currentDepth + 1) : [],
|
|
9
|
+
}));
|
|
10
|
+
}
|
|
11
|
+
// Export for testing
|
|
12
|
+
export { pruneTree };
|
|
13
|
+
// ─── Exported handler functions (testable without server) ───────────────────
|
|
14
|
+
export async function handleSearchContent(sdk, args) {
|
|
15
|
+
const query = {
|
|
16
|
+
contentType: args.type ?? 'page',
|
|
17
|
+
search: args.q,
|
|
18
|
+
};
|
|
19
|
+
if (args.siteId) {
|
|
20
|
+
query.siteId = args.siteId;
|
|
21
|
+
}
|
|
22
|
+
const result = await sdk.feeds.query(query);
|
|
23
|
+
return textResult(result);
|
|
24
|
+
}
|
|
25
|
+
export async function handleGetNav(sdk, args) {
|
|
26
|
+
const tree = await sdk.nav.getTree(args.siteId);
|
|
27
|
+
if (args.depth !== undefined) {
|
|
28
|
+
return textResult(pruneTree(tree, args.depth));
|
|
29
|
+
}
|
|
30
|
+
return textResult(tree);
|
|
31
|
+
}
|
|
32
|
+
export async function handleGetBreadcrumbs(sdk, args) {
|
|
33
|
+
const crumbs = await sdk.nav.getBreadcrumbs(args.nodeId);
|
|
34
|
+
return textResult(crumbs);
|
|
35
|
+
}
|
|
36
|
+
// ─── Registration ───────────────────────────────────────────────────────────
|
|
37
|
+
export function registerSearchTools(server, sdk) {
|
|
38
|
+
server.registerTool('search_content', {
|
|
39
|
+
description: 'Search content items by text query',
|
|
40
|
+
inputSchema: {
|
|
41
|
+
q: z.string().describe('Search query text'),
|
|
42
|
+
type: z.string().optional().describe('Content type to search (defaults to "page")'),
|
|
43
|
+
siteId: z.string().optional().describe('Filter by site ID'),
|
|
44
|
+
},
|
|
45
|
+
}, async (args) => handleSearchContent(sdk, args));
|
|
46
|
+
server.registerTool('get_nav', {
|
|
47
|
+
description: 'Get the navigation tree for a site',
|
|
48
|
+
inputSchema: {
|
|
49
|
+
siteId: z.string().optional().describe('Site ID'),
|
|
50
|
+
depth: z.number().optional().describe('Maximum tree depth to return'),
|
|
51
|
+
},
|
|
52
|
+
}, async (args) => handleGetNav(sdk, args));
|
|
53
|
+
server.registerTool('get_breadcrumbs', {
|
|
54
|
+
description: 'Get breadcrumb trail for a navigation node',
|
|
55
|
+
inputSchema: {
|
|
56
|
+
nodeId: z.string().describe('Navigation node ID'),
|
|
57
|
+
},
|
|
58
|
+
}, async (args) => handleGetBreadcrumbs(sdk, args));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/site/tools/search.ts"],"names":[],"mappings":"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"}
|