@axolot-ai/mcp-server 0.0.2 → 0.0.3
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/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +43 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +613 -0
- package/dist/index.js.map +1 -0
- package/package.json +1 -1
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface McpConfig {
|
|
2
|
+
apiToken?: string;
|
|
3
|
+
siteId?: string;
|
|
4
|
+
apiUrl?: string;
|
|
5
|
+
userEmail?: string;
|
|
6
|
+
pendingHandshakeId?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class ConfigManager {
|
|
9
|
+
private config;
|
|
10
|
+
load(): Promise<McpConfig>;
|
|
11
|
+
save(newConfig: Partial<McpConfig>): Promise<void>;
|
|
12
|
+
get(): McpConfig;
|
|
13
|
+
clear(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
export declare const configManager: ConfigManager;
|
|
16
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAKD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAExB,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC;IAW1B,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxD,GAAG,IAAI,SAAS;IAIV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B;AAED,eAAO,MAAM,aAAa,eAAsB,CAAA"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
const CONFIG_DIR = join(homedir(), '.axolot');
|
|
5
|
+
const CONFIG_FILE = join(CONFIG_DIR, 'mcp-auth.json');
|
|
6
|
+
export class ConfigManager {
|
|
7
|
+
config = {};
|
|
8
|
+
async load() {
|
|
9
|
+
try {
|
|
10
|
+
const data = await readFile(CONFIG_FILE, 'utf-8');
|
|
11
|
+
this.config = JSON.parse(data);
|
|
12
|
+
return this.config;
|
|
13
|
+
}
|
|
14
|
+
catch (e) {
|
|
15
|
+
// If file doesn't exist, return empty config
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async save(newConfig) {
|
|
20
|
+
this.config = { ...this.config, ...newConfig };
|
|
21
|
+
try {
|
|
22
|
+
await mkdir(CONFIG_DIR, { recursive: true });
|
|
23
|
+
await writeFile(CONFIG_FILE, JSON.stringify(this.config, null, 2));
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
console.error(' [MCP] Error saving config:', e);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
get() {
|
|
30
|
+
return this.config;
|
|
31
|
+
}
|
|
32
|
+
async clear() {
|
|
33
|
+
this.config = {};
|
|
34
|
+
try {
|
|
35
|
+
await writeFile(CONFIG_FILE, JSON.stringify({}, null, 2));
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
console.error(' [MCP] Error clearing config:', e);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export const configManager = new ConfigManager();
|
|
43
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAUjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;AAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAA;AAErD,MAAM,OAAO,aAAa;IAChB,MAAM,GAAc,EAAE,CAAA;IAE9B,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;YACjD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC9B,OAAO,IAAI,CAAC,MAAM,CAAA;QACpB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,6CAA6C;YAC7C,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAA6B;QACtC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,EAAE,CAAA;QAC9C,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAC5C,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACpE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;IAED,GAAG;QACD,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;QAChB,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,CAAC,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* AxolotCMS MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Exposes the CMS as an MCP (Model Context Protocol) server.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { existsSync } from 'node:fs';
|
|
11
|
+
import { join, dirname } from 'node:path';
|
|
12
|
+
import { fileURLToPath } from 'node:url';
|
|
13
|
+
import { configManager } from './config.js';
|
|
14
|
+
// ── Environment Setup ────────────────────────────────────────────────────────
|
|
15
|
+
// 1. Try to load .env from the MCP package directory itself
|
|
16
|
+
const mcpDir = dirname(fileURLToPath(import.meta.url));
|
|
17
|
+
const masterEnv = join(mcpDir, '../.env');
|
|
18
|
+
if (existsSync(masterEnv)) {
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
process.loadEnvFile(masterEnv);
|
|
21
|
+
console.error(` [MCP] Loaded env from ${masterEnv}`);
|
|
22
|
+
}
|
|
23
|
+
// 2. Try to load .env from the current working directory
|
|
24
|
+
const localEnv = join(process.cwd(), '.env');
|
|
25
|
+
if (existsSync(localEnv)) {
|
|
26
|
+
try {
|
|
27
|
+
// @ts-ignore
|
|
28
|
+
process.loadEnvFile(localEnv);
|
|
29
|
+
console.error(` [MCP] Loaded env from ${localEnv}`);
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
console.error(`Warning: Failed to load .env from ${localEnv}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// 3. Load Persistent Config
|
|
36
|
+
await configManager.load();
|
|
37
|
+
const API_URL = process.env.AXOLOT_API_URL || configManager.get().apiUrl || 'http://localhost:3001';
|
|
38
|
+
function getApiToken() {
|
|
39
|
+
return configManager.get().apiToken || process.env.AXOLOT_API_TOKEN;
|
|
40
|
+
}
|
|
41
|
+
function getSiteId() {
|
|
42
|
+
return configManager.get().siteId || process.env.AXOLOT_SITE_ID;
|
|
43
|
+
}
|
|
44
|
+
console.error(` [MCP] Active Site: ${getSiteId() || '(none)'}`);
|
|
45
|
+
console.error(` [MCP] API URL: ${API_URL}`);
|
|
46
|
+
// ── HTTP helper ─────────────────────────────────────────────────────────────
|
|
47
|
+
async function api(path, options) {
|
|
48
|
+
const token = getApiToken();
|
|
49
|
+
const siteId = getSiteId();
|
|
50
|
+
if (!token && !path.includes('/handshake/')) {
|
|
51
|
+
throw new Error(' [MCP] Authentication required. Please run the "cms_auth_login" tool.');
|
|
52
|
+
}
|
|
53
|
+
// Replace :siteId placeholder in paths if present
|
|
54
|
+
const finalPath = path.replace(':siteId', siteId || '');
|
|
55
|
+
const url = `${API_URL}${finalPath}`;
|
|
56
|
+
// Ensure POST/PATCH/PUT have a body if content-type is json
|
|
57
|
+
const fetchOptions = {
|
|
58
|
+
...options,
|
|
59
|
+
headers: {
|
|
60
|
+
'Content-Type': 'application/json',
|
|
61
|
+
...(token ? { 'Authorization': `Bearer ${token}` } : {}),
|
|
62
|
+
...options?.headers,
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
if (['POST', 'PATCH', 'PUT'].includes(options?.method || '') && !fetchOptions.body) {
|
|
66
|
+
fetchOptions.body = JSON.stringify({});
|
|
67
|
+
}
|
|
68
|
+
const res = await fetch(url, fetchOptions);
|
|
69
|
+
if (!res.ok) {
|
|
70
|
+
let errorMessage = `API error ${res.status}`;
|
|
71
|
+
try {
|
|
72
|
+
const errorData = await res.json();
|
|
73
|
+
errorMessage += `: ${errorData.message || errorData.error || JSON.stringify(errorData)}`;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
errorMessage += `: ${await res.text()}`;
|
|
77
|
+
}
|
|
78
|
+
throw new Error(errorMessage);
|
|
79
|
+
}
|
|
80
|
+
return res.json();
|
|
81
|
+
}
|
|
82
|
+
// ── MCP Server setup ─────────────────────────────────────────────────────────
|
|
83
|
+
const server = new McpServer({
|
|
84
|
+
name: 'axolot-cms',
|
|
85
|
+
version: '0.1.0',
|
|
86
|
+
});
|
|
87
|
+
// ── AUTH TOOLS ───────────────────────────────────────────────────────────────
|
|
88
|
+
/**
|
|
89
|
+
* Check authentication status
|
|
90
|
+
*/
|
|
91
|
+
server.tool('cms_auth_status', 'Check if the AI is authenticated and which site is currently active.', {}, async () => {
|
|
92
|
+
const config = configManager.get();
|
|
93
|
+
let token = getApiToken();
|
|
94
|
+
const siteId = getSiteId();
|
|
95
|
+
// Si hay un handshake pendiente, intentamos completarlo para persistir la llave
|
|
96
|
+
if (config.pendingHandshakeId) {
|
|
97
|
+
try {
|
|
98
|
+
const pollUrl = `${API_URL}/api/v1/mcp/handshake/poll/${config.pendingHandshakeId}`;
|
|
99
|
+
const pollRes = await fetch(pollUrl);
|
|
100
|
+
if (pollRes.ok) {
|
|
101
|
+
const res = await pollRes.json();
|
|
102
|
+
if (res.status === 'authorized' && res.token) {
|
|
103
|
+
token = res.token;
|
|
104
|
+
await configManager.save({
|
|
105
|
+
apiToken: token,
|
|
106
|
+
siteId: res.siteId || config.siteId,
|
|
107
|
+
pendingHandshakeId: undefined
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
// Solo limpiamos si el error es de caducidad (404/410)
|
|
114
|
+
// await configManager.save({ pendingHandshakeId: undefined })
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (!token) {
|
|
118
|
+
return {
|
|
119
|
+
content: [{ type: 'text', text: ' [Auth] Status: NOT LOGGED IN\n\nPlease run "cms_auth_login" to connect your account.' }],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
const user = await api('/api/v1/auth/me');
|
|
124
|
+
return {
|
|
125
|
+
content: [{
|
|
126
|
+
type: 'text',
|
|
127
|
+
text: ` [Auth] Status: CONNECTED\nUser: ${user.name} (${user.email})\nRole: ${user.role}\n\nActive Site ID: ${siteId || 'None (Global Agency Access)'}\nAPI URL: ${API_URL}`,
|
|
128
|
+
}],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
return {
|
|
133
|
+
content: [{ type: 'text', text: ` [Auth] Status: ERROR\n${e.message}` }],
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
/**
|
|
138
|
+
* Initiate Login Handshake
|
|
139
|
+
*/
|
|
140
|
+
server.tool('cms_auth_login', 'Connect your Axolot account to this AI session. This will provide a login URL.', {}, async () => {
|
|
141
|
+
try {
|
|
142
|
+
const handshake = await api('/api/v1/mcp/handshake/init', { method: 'POST' });
|
|
143
|
+
// Guardamos el ID del handshake para poder completarlo en el siguiente check de status
|
|
144
|
+
await configManager.save({ pendingHandshakeId: handshake.handshakeId });
|
|
145
|
+
return {
|
|
146
|
+
content: [{
|
|
147
|
+
type: 'text',
|
|
148
|
+
text: ` [Auth] Handshake Initiated!\n\n1. Please visit this URL to authorize the AI:\n${handshake.loginUrl}\n\n2. After authorizing in the browser, run "cms_auth_status" to complete the connection.\n\nNote: This link expires in 10 minutes.`,
|
|
149
|
+
}],
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
catch (e) {
|
|
153
|
+
return {
|
|
154
|
+
content: [{ type: 'text', text: ` [Auth] Error initiating handshake: ${e.message}` }],
|
|
155
|
+
isError: true,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
/**
|
|
160
|
+
* Switch active site
|
|
161
|
+
*/
|
|
162
|
+
server.tool('cms_switch_site', 'Change the active site context for the AI. This will list available sites if no ID is provided.', { siteId: z.string().optional().describe('The UUID of the site to switch to') }, async ({ siteId }) => {
|
|
163
|
+
if (!siteId) {
|
|
164
|
+
const sites = await api('/api/v1/sites');
|
|
165
|
+
return {
|
|
166
|
+
content: [{
|
|
167
|
+
type: 'text',
|
|
168
|
+
text: ` [Auth] Please provide a Site ID to switch context.\n\nAvailable Sites:\n${sites.map(s => `- ${s.name} (ID: ${s.id})`).join('\n')}`,
|
|
169
|
+
}],
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
await configManager.save({ siteId });
|
|
173
|
+
return {
|
|
174
|
+
content: [{ type: 'text', text: ` [Auth] Site context switched to: ${siteId}\nAll subsequent tool calls will target this site.` }],
|
|
175
|
+
};
|
|
176
|
+
});
|
|
177
|
+
// ── CMS TOOLS ────────────────────────────────────────────────────────────────
|
|
178
|
+
/**
|
|
179
|
+
* Get site design tokens (colors, fonts, spacing)
|
|
180
|
+
*/
|
|
181
|
+
server.tool('getDesignTokens', 'Get the design tokens (colors, typography, spacing) for the current site. Always call this first when building or modifying UI components.', {}, async () => {
|
|
182
|
+
const siteId = getSiteId();
|
|
183
|
+
if (!siteId)
|
|
184
|
+
throw new Error('No active site. Use cms_switch_site to select one.');
|
|
185
|
+
const site = await api(`/api/v1/sites/${siteId}`);
|
|
186
|
+
return {
|
|
187
|
+
content: [{
|
|
188
|
+
type: 'text',
|
|
189
|
+
text: JSON.stringify({
|
|
190
|
+
siteName: site.name,
|
|
191
|
+
domain: site.domain,
|
|
192
|
+
tokens: site.designTokens ?? {},
|
|
193
|
+
}, null, 2),
|
|
194
|
+
}],
|
|
195
|
+
};
|
|
196
|
+
});
|
|
197
|
+
/**
|
|
198
|
+
* Get all media files available for the site
|
|
199
|
+
*/
|
|
200
|
+
server.tool('getMedia', 'List all media files uploaded for this client site. Returns URLs, dimensions, and AI-generated alt text.', { pageSlug: z.string().optional().describe('Filter by page usage (optional)') }, async () => {
|
|
201
|
+
const siteId = getSiteId();
|
|
202
|
+
if (!siteId)
|
|
203
|
+
throw new Error('No active site. Use cms_switch_site to select one.');
|
|
204
|
+
const media = await api(`/api/v1/sites/${siteId}/media`);
|
|
205
|
+
return {
|
|
206
|
+
content: [{
|
|
207
|
+
type: 'text',
|
|
208
|
+
text: JSON.stringify(media.map(m => ({
|
|
209
|
+
id: m.id,
|
|
210
|
+
filename: m.filename,
|
|
211
|
+
url: m.webpUrl ?? m.url, // prefer WebP
|
|
212
|
+
originalUrl: m.url,
|
|
213
|
+
alt: m.altText,
|
|
214
|
+
dimensions: m.width && m.height ? `${m.width}×${m.height}` : null,
|
|
215
|
+
type: m.mimeType,
|
|
216
|
+
})), null, 2),
|
|
217
|
+
}],
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
/**
|
|
221
|
+
* Get all pages and their slot structure
|
|
222
|
+
*/
|
|
223
|
+
server.tool('getPages', 'Get all pages for the site and their editable slots. Use this to understand the current site structure before adding new sections.', {}, async () => {
|
|
224
|
+
const siteId = getSiteId();
|
|
225
|
+
if (!siteId)
|
|
226
|
+
throw new Error('No active site. Use cms_switch_site to select one.');
|
|
227
|
+
const pages = await api(`/api/v1/sites/${siteId}/pages`);
|
|
228
|
+
return {
|
|
229
|
+
content: [{
|
|
230
|
+
type: 'text',
|
|
231
|
+
text: JSON.stringify(pages, null, 2),
|
|
232
|
+
}],
|
|
233
|
+
};
|
|
234
|
+
});
|
|
235
|
+
/**
|
|
236
|
+
* Get slots for a specific page
|
|
237
|
+
*/
|
|
238
|
+
server.tool('getSlots', 'Get all editable slots for a specific page. Slots are the content areas the client can edit via AI chat.', {
|
|
239
|
+
pageId: z.string().describe('The page ID to get slots for'),
|
|
240
|
+
}, async ({ pageId }) => {
|
|
241
|
+
const siteId = getSiteId();
|
|
242
|
+
if (!siteId)
|
|
243
|
+
throw new Error('No active site. Use cms_switch_site to select one.');
|
|
244
|
+
const slots = await api(`/api/v1/sites/${siteId}/slots?pageId=${pageId}`);
|
|
245
|
+
return {
|
|
246
|
+
content: [{
|
|
247
|
+
type: 'text',
|
|
248
|
+
text: JSON.stringify(slots, null, 2),
|
|
249
|
+
}],
|
|
250
|
+
};
|
|
251
|
+
});
|
|
252
|
+
/**
|
|
253
|
+
* Register a new editable slot — called when designer creates a new component
|
|
254
|
+
*/
|
|
255
|
+
server.tool('createSlot', 'Register a new editable slot in the CMS. Call this every time you create a section with content that the client should be able to edit via AI chat. Use a dot-notation key like "hero.title" or "about.description".', {
|
|
256
|
+
pageId: z.string().describe('The page this slot belongs to'),
|
|
257
|
+
key: z.string().describe('Unique slot key in dot notation, e.g. "hero.title", "services.cta.label"'),
|
|
258
|
+
label: z.string().describe('Human-readable label shown to client, e.g. "Título principal del hero"'),
|
|
259
|
+
type: z.enum(['text', 'richtext', 'image', 'video', 'link', 'color', 'boolean', 'number', 'json']),
|
|
260
|
+
value: z.unknown().optional().describe('Initial content value'),
|
|
261
|
+
aiHint: z.string().optional().describe('Hint for the AI about constraints, e.g. "Keep under 8 words, brand voice is professional"'),
|
|
262
|
+
required: z.boolean().optional(),
|
|
263
|
+
}, async ({ pageId, key, label, type, value, aiHint, required }) => {
|
|
264
|
+
const siteId = getSiteId();
|
|
265
|
+
if (!siteId)
|
|
266
|
+
throw new Error('No active site. Use cms_switch_site to select one.');
|
|
267
|
+
const slot = await api(`/api/v1/sites/${siteId}/slots`, {
|
|
268
|
+
method: 'POST',
|
|
269
|
+
body: JSON.stringify({ pageId, key, label, type, value, aiHint, required }),
|
|
270
|
+
});
|
|
271
|
+
return {
|
|
272
|
+
content: [{
|
|
273
|
+
type: 'text',
|
|
274
|
+
text: `✅ Slot registered: ${key}\n\nThe client can now edit "${label}" via the AI chat.\n\n${JSON.stringify(slot, null, 2)}`,
|
|
275
|
+
}],
|
|
276
|
+
};
|
|
277
|
+
});
|
|
278
|
+
/**
|
|
279
|
+
* Update design tokens for the site
|
|
280
|
+
*/
|
|
281
|
+
server.tool('setDesignTokens', 'Update the design tokens for the site (colors, fonts, spacing). Call this when establishing or refining the brand identity.', {
|
|
282
|
+
primaryColor: z.string().optional().describe('Main brand color, hex format e.g. #007AFF'),
|
|
283
|
+
secondaryColor: z.string().optional(),
|
|
284
|
+
accentColor: z.string().optional(),
|
|
285
|
+
backgroundColor: z.string().optional(),
|
|
286
|
+
textColor: z.string().optional(),
|
|
287
|
+
fontFamily: z.string().optional().describe('Body font family, e.g. "Inter"'),
|
|
288
|
+
fontFamilyHeading: z.string().optional().describe('Heading font family, e.g. "Playfair Display"'),
|
|
289
|
+
borderRadius: z.string().optional().describe('Global border radius, e.g. "8px" or "0px" for sharp'),
|
|
290
|
+
}, async (tokens) => {
|
|
291
|
+
const siteId = getSiteId();
|
|
292
|
+
if (!siteId)
|
|
293
|
+
throw new Error('No active site. Use cms_switch_site to select one.');
|
|
294
|
+
// Remove undefined values
|
|
295
|
+
const cleanTokens = Object.fromEntries(Object.entries(tokens).filter(([, v]) => v !== undefined));
|
|
296
|
+
await api(`/api/v1/sites/${siteId}`, {
|
|
297
|
+
method: 'PATCH',
|
|
298
|
+
body: JSON.stringify({ designTokens: cleanTokens }),
|
|
299
|
+
});
|
|
300
|
+
return {
|
|
301
|
+
content: [{
|
|
302
|
+
type: 'text',
|
|
303
|
+
text: `✅ Design tokens updated:\n${JSON.stringify(cleanTokens, null, 2)}`,
|
|
304
|
+
}],
|
|
305
|
+
};
|
|
306
|
+
});
|
|
307
|
+
/**
|
|
308
|
+
* Get site settings (business name, contact, social links)
|
|
309
|
+
*/
|
|
310
|
+
server.tool('getSiteSettings', 'Get the site business settings — name, contact info, social links. Use this to pre-fill content in components like headers, footers, and contact sections.', {}, async () => {
|
|
311
|
+
const siteId = getSiteId();
|
|
312
|
+
if (!siteId)
|
|
313
|
+
throw new Error('No active site. Use cms_switch_site to select one.');
|
|
314
|
+
const settings = await api(`/api/v1/sites/${siteId}/settings`);
|
|
315
|
+
return {
|
|
316
|
+
content: [{
|
|
317
|
+
type: 'text',
|
|
318
|
+
text: JSON.stringify(settings, null, 2),
|
|
319
|
+
}],
|
|
320
|
+
};
|
|
321
|
+
});
|
|
322
|
+
/**
|
|
323
|
+
* Get active modules for the site
|
|
324
|
+
*/
|
|
325
|
+
server.tool('getActiveModules', 'Get the list of active modules for this site (blog, shop, bookings, etc.). Use this to know which sections and pages you can add to the site.', {}, async () => {
|
|
326
|
+
const siteId = getSiteId();
|
|
327
|
+
if (!siteId)
|
|
328
|
+
throw new Error('No active site. Use cms_switch_site to select one.');
|
|
329
|
+
const site = await api(`/api/v1/sites/${siteId}`);
|
|
330
|
+
const modules = (site.activeModules ?? []).map((m) => m.module?.name || 'unknown');
|
|
331
|
+
return {
|
|
332
|
+
content: [{
|
|
333
|
+
type: 'text',
|
|
334
|
+
text: `Active modules for this site: ${modules.join(', ')}`,
|
|
335
|
+
}],
|
|
336
|
+
};
|
|
337
|
+
});
|
|
338
|
+
/**
|
|
339
|
+
* Get technical blueprints and capabilities for a specific module.
|
|
340
|
+
*/
|
|
341
|
+
server.tool('getModuleCapabilities', 'Get the technical requirements and blueprints for implementing a specific module in the UI. Call this when you need to build a UI section that interacts with a module (like a form or a blog list).', {
|
|
342
|
+
moduleName: z.enum(['blog', 'shop', 'submissions']).describe('The name of the module'),
|
|
343
|
+
}, async ({ moduleName }) => {
|
|
344
|
+
const capabilities = {
|
|
345
|
+
blog: {
|
|
346
|
+
type: 'content_list',
|
|
347
|
+
recommended_components: ['PostCard', 'CategoryFilter'],
|
|
348
|
+
data_structure: {
|
|
349
|
+
title: 'string',
|
|
350
|
+
excerpt: 'string',
|
|
351
|
+
image: 'url (featuredImage)',
|
|
352
|
+
slug: 'string (link to /blog/[slug])',
|
|
353
|
+
date: 'ISO string'
|
|
354
|
+
},
|
|
355
|
+
endpoint: '/api/v1/blog/:siteId/posts',
|
|
356
|
+
auth_required: true,
|
|
357
|
+
ai_instructions: 'Use fetch with Authorization: Bearer <AXOLOT_API_TOKEN>. Posts are returned as an array.'
|
|
358
|
+
},
|
|
359
|
+
shop: {
|
|
360
|
+
type: 'product_catalog',
|
|
361
|
+
recommended_components: ['ProductCard', 'PriceTag', 'CartButton'],
|
|
362
|
+
data_structure: {
|
|
363
|
+
name: 'string',
|
|
364
|
+
price: 'number (cents)',
|
|
365
|
+
image: 'url',
|
|
366
|
+
slug: 'string (link to /escapada/[slug])'
|
|
367
|
+
},
|
|
368
|
+
endpoint: '/api/v1/shop/:siteId/products',
|
|
369
|
+
auth_required: true,
|
|
370
|
+
ai_instructions: 'Use fetch with Authorization: Bearer <AXOLOT_API_TOKEN>. Products are returned as an array. Price is in cents.'
|
|
371
|
+
},
|
|
372
|
+
submissions: {
|
|
373
|
+
type: 'form_capture',
|
|
374
|
+
implementation_blueprint: {
|
|
375
|
+
tag: 'form',
|
|
376
|
+
required_attribute: 'data-form="unique-id"',
|
|
377
|
+
required_fields: [
|
|
378
|
+
{ name: 'nombre', type: 'text', label: 'Nombre Completo' },
|
|
379
|
+
{ name: 'email', type: 'email', label: 'Email' }
|
|
380
|
+
],
|
|
381
|
+
client_bridge: 'initAxolotForms(siteId)',
|
|
382
|
+
feedback_states: ['loading', 'success', 'error']
|
|
383
|
+
},
|
|
384
|
+
ai_instructions: 'Design custom forms freely using Tailwind. Just ensure the "data-form" attribute is present and inputs have the correct "name" attributes. The layout must include the Axolot Forms Bridge script.'
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
const spec = capabilities[moduleName];
|
|
388
|
+
if (!spec) {
|
|
389
|
+
return {
|
|
390
|
+
content: [{ type: 'text', text: `❌ Module capabilities not found for: ${moduleName}` }],
|
|
391
|
+
isError: true
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
return {
|
|
395
|
+
content: [{
|
|
396
|
+
type: 'text',
|
|
397
|
+
text: `Technical Blueprint for ${moduleName.toUpperCase()} module:\n\n${JSON.stringify(spec, null, 2)}`
|
|
398
|
+
}]
|
|
399
|
+
};
|
|
400
|
+
});
|
|
401
|
+
/**
|
|
402
|
+
* Get all blog posts
|
|
403
|
+
*/
|
|
404
|
+
server.tool('getBlogPosts', 'List all blog posts for the site. Use this to build blog index pages or latest post widgets.', {
|
|
405
|
+
status: z.enum(['draft', 'published', 'archived']).optional().describe('Filter by status'),
|
|
406
|
+
}, async ({ status }) => {
|
|
407
|
+
const siteId = getSiteId();
|
|
408
|
+
if (!siteId)
|
|
409
|
+
throw new Error('No active site. Use cms_switch_site to select one.');
|
|
410
|
+
const site = await api(`/api/v1/sites/${siteId}`);
|
|
411
|
+
const isBlogActive = (site.activeModules ?? []).some(m => m.module.name === 'blog');
|
|
412
|
+
if (!isBlogActive) {
|
|
413
|
+
return {
|
|
414
|
+
content: [{
|
|
415
|
+
type: 'text',
|
|
416
|
+
text: '❌ ERROR: El módulo de "Blog" no está activo para este sitio.',
|
|
417
|
+
}],
|
|
418
|
+
isError: true,
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
const posts = await api(`/api/v1/blog/${siteId}/posts`);
|
|
422
|
+
const filteredPosts = status ? posts.filter(p => p.status === status) : posts;
|
|
423
|
+
return {
|
|
424
|
+
content: [{
|
|
425
|
+
type: 'text',
|
|
426
|
+
text: JSON.stringify(filteredPosts.map(p => ({
|
|
427
|
+
id: p.id,
|
|
428
|
+
title: p.title,
|
|
429
|
+
slug: p.slug,
|
|
430
|
+
status: p.status,
|
|
431
|
+
date: p.publishedAt || p.createdAt,
|
|
432
|
+
image: p.featuredImage
|
|
433
|
+
})), null, 2),
|
|
434
|
+
}],
|
|
435
|
+
};
|
|
436
|
+
});
|
|
437
|
+
/**
|
|
438
|
+
* Get a specific blog post
|
|
439
|
+
*/
|
|
440
|
+
server.tool('getBlogPost', 'Get the full content and details of a specific blog post.', {
|
|
441
|
+
postId: z.string().optional().describe('The post ID'),
|
|
442
|
+
slug: z.string().optional().describe('The post slug'),
|
|
443
|
+
}, async ({ postId, slug }) => {
|
|
444
|
+
const siteId = getSiteId();
|
|
445
|
+
if (!siteId)
|
|
446
|
+
throw new Error('No active site. Use cms_switch_site to select one.');
|
|
447
|
+
const site = await api(`/api/v1/sites/${siteId}`);
|
|
448
|
+
const isBlogActive = (site.activeModules ?? []).some(m => m.module.name === 'blog');
|
|
449
|
+
if (!isBlogActive) {
|
|
450
|
+
return {
|
|
451
|
+
content: [{ type: 'text', text: '❌ ERROR: El módulo de "Blog" no está activo.' }],
|
|
452
|
+
isError: true,
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
const posts = await api(`/api/v1/blog/${siteId}/posts`);
|
|
456
|
+
const post = postId
|
|
457
|
+
? posts.find(p => p.id === postId)
|
|
458
|
+
: posts.find(p => p.slug === slug);
|
|
459
|
+
if (!post) {
|
|
460
|
+
return { content: [{ type: 'text', text: `❌ Post not found` }], isError: true };
|
|
461
|
+
}
|
|
462
|
+
return { content: [{ type: 'text', text: JSON.stringify(post, null, 2) }] };
|
|
463
|
+
});
|
|
464
|
+
/**
|
|
465
|
+
* Create a new blog post
|
|
466
|
+
*/
|
|
467
|
+
server.tool('createBlogPost', 'Create a new blog post in the CMS.', {
|
|
468
|
+
title: z.string().describe('The post title'),
|
|
469
|
+
slug: z.string().describe('The post slug'),
|
|
470
|
+
excerpt: z.string().optional().describe('A short summary of the post'),
|
|
471
|
+
content: z.string().describe('The full content (HTML or Markdown)'),
|
|
472
|
+
featuredImage: z.string().optional().describe('URL of the featured image'),
|
|
473
|
+
status: z.enum(['draft', 'published', 'archived']).default('published'),
|
|
474
|
+
categoryId: z.string().optional().describe('UUID of the category'),
|
|
475
|
+
}, async (data) => {
|
|
476
|
+
const siteId = getSiteId();
|
|
477
|
+
if (!siteId)
|
|
478
|
+
throw new Error('No active site. Use cms_switch_site to select one.');
|
|
479
|
+
const post = await api(`/api/v1/blog/${siteId}/posts`, {
|
|
480
|
+
method: 'POST',
|
|
481
|
+
body: JSON.stringify(data),
|
|
482
|
+
});
|
|
483
|
+
return {
|
|
484
|
+
content: [{
|
|
485
|
+
type: 'text',
|
|
486
|
+
text: `✅ Blog post created: ${data.title}\nURL: /blog/${data.slug}`,
|
|
487
|
+
}],
|
|
488
|
+
};
|
|
489
|
+
});
|
|
490
|
+
/**
|
|
491
|
+
* Update an existing blog post
|
|
492
|
+
*/
|
|
493
|
+
server.tool('updateBlogPost', 'Update an existing blog post.', {
|
|
494
|
+
postId: z.string().describe('The UUID of the post to update'),
|
|
495
|
+
title: z.string().optional(),
|
|
496
|
+
slug: z.string().optional(),
|
|
497
|
+
excerpt: z.string().optional(),
|
|
498
|
+
content: z.string().optional(),
|
|
499
|
+
featuredImage: z.string().optional(),
|
|
500
|
+
status: z.enum(['draft', 'published', 'archived']).optional(),
|
|
501
|
+
categoryId: z.string().optional(),
|
|
502
|
+
}, async ({ postId, ...data }) => {
|
|
503
|
+
const siteId = getSiteId();
|
|
504
|
+
if (!siteId)
|
|
505
|
+
throw new Error('No active site. Use cms_switch_site to select one.');
|
|
506
|
+
await api(`/api/v1/blog/${siteId}/posts/${postId}`, {
|
|
507
|
+
method: 'PATCH',
|
|
508
|
+
body: JSON.stringify(data),
|
|
509
|
+
});
|
|
510
|
+
return {
|
|
511
|
+
content: [{ type: 'text', text: `✅ Blog post updated (ID: ${postId})` }],
|
|
512
|
+
};
|
|
513
|
+
});
|
|
514
|
+
/**
|
|
515
|
+
* Get all shop products
|
|
516
|
+
*/
|
|
517
|
+
server.tool('getProducts', 'List all products (escapadas) for the site.', { status: z.enum(['draft', 'published', 'archived']).optional() }, async ({ status }) => {
|
|
518
|
+
const siteId = getSiteId();
|
|
519
|
+
if (!siteId)
|
|
520
|
+
throw new Error('No active site.');
|
|
521
|
+
const products = await api(`/api/v1/shop/${siteId}/products`);
|
|
522
|
+
const filtered = status ? products.filter(p => p.status === status) : products;
|
|
523
|
+
return { content: [{ type: 'text', text: JSON.stringify(filtered, null, 2) }] };
|
|
524
|
+
});
|
|
525
|
+
/**
|
|
526
|
+
* Get a specific product
|
|
527
|
+
*/
|
|
528
|
+
server.tool('getProduct', 'Get details of a specific product by its slug.', { slug: z.string() }, async ({ slug }) => {
|
|
529
|
+
const siteId = getSiteId();
|
|
530
|
+
if (!siteId)
|
|
531
|
+
throw new Error('No active site.');
|
|
532
|
+
const product = await api(`/api/v1/shop/${siteId}/products/slug/${slug}`);
|
|
533
|
+
return { content: [{ type: 'text', text: JSON.stringify(product, null, 2) }] };
|
|
534
|
+
});
|
|
535
|
+
/**
|
|
536
|
+
* Create a new product
|
|
537
|
+
*/
|
|
538
|
+
server.tool('createProduct', 'Create a new product in the shop.', {
|
|
539
|
+
name: z.string(),
|
|
540
|
+
slug: z.string(),
|
|
541
|
+
description: z.string(),
|
|
542
|
+
shortDescription: z.string(),
|
|
543
|
+
price: z.number(),
|
|
544
|
+
featuredImage: z.string().optional(),
|
|
545
|
+
status: z.enum(['draft', 'published']).default('published'),
|
|
546
|
+
}, async (data) => {
|
|
547
|
+
const siteId = getSiteId();
|
|
548
|
+
if (!siteId)
|
|
549
|
+
throw new Error('No active site.');
|
|
550
|
+
const product = await api(`/api/v1/shop/${siteId}/products`, {
|
|
551
|
+
method: 'POST',
|
|
552
|
+
body: JSON.stringify(data),
|
|
553
|
+
});
|
|
554
|
+
return { content: [{ type: 'text', text: `✅ Product created: ${data.name}` }] };
|
|
555
|
+
});
|
|
556
|
+
/**
|
|
557
|
+
* Create a new page
|
|
558
|
+
*/
|
|
559
|
+
server.tool('createPage', 'Create a new page in the CMS. IMPORTANT: The slug MUST start with a slash (e.g. /my-page or /).', {
|
|
560
|
+
title: z.string(),
|
|
561
|
+
slug: z.string(),
|
|
562
|
+
metaTitle: z.string().optional(),
|
|
563
|
+
metaDescription: z.string().optional(),
|
|
564
|
+
}, async (data) => {
|
|
565
|
+
const siteId = getSiteId();
|
|
566
|
+
if (!siteId)
|
|
567
|
+
throw new Error('No active site.');
|
|
568
|
+
const page = await api(`/api/v1/sites/${siteId}/pages`, {
|
|
569
|
+
method: 'POST',
|
|
570
|
+
body: JSON.stringify(data),
|
|
571
|
+
});
|
|
572
|
+
return { content: [{ type: 'text', text: `✅ Page created: ${data.title}` }] };
|
|
573
|
+
});
|
|
574
|
+
// ── RESOURCES ─────────────────────────────────────────────────────────────────
|
|
575
|
+
server.resource('site-context', 'axolot://site/context', async () => {
|
|
576
|
+
const siteId = getSiteId();
|
|
577
|
+
if (!siteId)
|
|
578
|
+
throw new Error('No active site. Use cms_switch_site to select one.');
|
|
579
|
+
const [site, settings] = await Promise.all([
|
|
580
|
+
api(`/api/v1/sites/${siteId}`),
|
|
581
|
+
api(`/api/v1/sites/${siteId}/settings`),
|
|
582
|
+
]);
|
|
583
|
+
return {
|
|
584
|
+
contents: [{
|
|
585
|
+
uri: 'axolot://site/context',
|
|
586
|
+
mimeType: 'text/plain',
|
|
587
|
+
text: `
|
|
588
|
+
# Site Context: ${site.name}
|
|
589
|
+
|
|
590
|
+
## Domain
|
|
591
|
+
${site.domain ?? 'Not set'}
|
|
592
|
+
|
|
593
|
+
## Business
|
|
594
|
+
Name: ${settings.businessName ?? site.name}
|
|
595
|
+
Email: ${settings.businessEmail ?? 'Not set'}
|
|
596
|
+
|
|
597
|
+
## Design Tokens
|
|
598
|
+
${JSON.stringify(site.designTokens ?? {}, null, 2)}
|
|
599
|
+
|
|
600
|
+
## Active Modules
|
|
601
|
+
${JSON.stringify(site.activeModules ?? [], null, 2)}
|
|
602
|
+
|
|
603
|
+
---
|
|
604
|
+
Use the tools (getMedia, getSlots, createSlot, etc.) to interact with this site's content.
|
|
605
|
+
`.trim(),
|
|
606
|
+
}],
|
|
607
|
+
};
|
|
608
|
+
});
|
|
609
|
+
// ── Start ─────────────────────────────────────────────────────────────────────
|
|
610
|
+
const transport = new StdioServerTransport();
|
|
611
|
+
await server.connect(transport);
|
|
612
|
+
console.error('AxolotCMS MCP server running — site:', getSiteId() || '(no site set)');
|
|
613
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|