Funciones de IA
Cada acción de IA en cmssy es una definición de herramienta con control de permisos, compartida por el servidor MCP y el asistente del panel.
cmssy tiene dos vías para que una IA actúe sobre tu contenido: el servidor MCP, al que se conectan clientes externos como Claude, y el asistente del panel de cmssy.
No son dos implementaciones. Ambos son transportes sobre el mismo núcleo de herramientas, así que una capacidad añadida una vez aparece en los dos, con el mismo comportamiento y las mismas comprobaciones de permisos.
Qué es una herramienta
Una herramienta es un objeto corriente. Aquí hay una real, entera:
import { z } from "zod";
import type { AiTool, PageSummary } from "../types.js";
const inputSchema = z.object({
search: z
.string()
.optional()
.describe("Optional text to filter pages by name or slug"),
});
export const listPagesTool: AiTool<Input, Output> = {
name: "list_pages",
description:
"List the workspace's pages (id, name, slug, published), optionally filtered by a search string.",
inputSchema,
requiredPermissions: ["pages:view"],
execute: async ({ search }, ops) => {
const items = await ops.pages.list(search);
return { count: items.length, items };
},
};Cinco campos, y cada uno se gana su sitio:
name: lo que llama el modelo.description: lo que el modelo lee para decidir si llamar. Es superficie de prompt, no un comentario de código; una descripción vaga produce una herramienta que nadie usa bien.inputSchema: un esquema zod. Valida la llamada y a la vez sirve como el JSON Schema que ve el cliente, así que no pueden divergir.requiredPermissions: se comprueba antes de ejecutar.execute: el trabajo real, con la entrada validada y un objetoops.
Por qué se inyecta ops
execute nunca importa un cliente, ni abre una conexión, ni lee una variable de entorno. Recibe ops y llama a sus métodos.
Esa sola decisión hace el núcleo neutral respecto al transporte. El servidor MCP aporta un ops respaldado por un token de API; el asistente del panel aporta uno respaldado por la sesión del usuario conectado. La herramienta no nota la diferencia, y ninguno puede recibir por accidente capacidades que el otro no tiene.
Los permisos se aplican aquí, no en el borde
requiredPermissions vive en la herramienta, así que la comprobación ocurre en un solo sitio sin importar quién llame.
Importa porque los dos transportes se autentican distinto. Un cliente MCP presenta un token con scopes; el asistente actúa como un miembro conectado con un rol. Si cada transporte llevara su propia lógica de permisos, divergirían, y esa divergencia sería una escalada de privilegios, no un fallo de renderizado.
La consecuencia práctica: un cliente de IA nunca puede hacer más que la credencial que hay detrás. Dale a Claude un token de solo lectura y listará y leerá; se negará a publicar porque la herramienta se niega, no porque al modelo se le pidiera con buenos modales.
Qué cubren las herramientas
El registro es amplio: páginas y bloques, modelos y registros, medios y carpetas, formularios y envíos, miembros y roles, webhooks, y toda la superficie de comercio con productos, carritos, pedidos, descuentos y pipelines de pedidos.
La forma es consistente: list_* y get_* para leer, create_* / update_* / delete_* para escribir, más verbos para transiciones de estado como publish_page, unpublish_page, revert_to_published y promote_dev_draft.
Nada del conjunto toca tu código. No hay herramienta que escriba un archivo, edite un componente o abra un pull request: la IA edita contenido, y los esquemas de bloques se quedan en tu repositorio, bajo revisión.
Borradores de desarrollo
Para un problema concreto -probar un tipo de bloque que aún no está desplegado- existen un parámetro y una herramienta.
Las herramientas de escritura aceptan un target con valor "devDraft", que edita tu capa personal en vez del borrador compartido de la página. A nadie más le cambia la vista previa. Cuando el bloque se despliega, promote_dev_draft mueve tu capa al borrador compartido.
Sin esto, experimentar con un bloque sin desplegar significaría poner en un borrador compartido contenido que a cada compañero se le renderiza como nada.
Siguientes pasos
- Servidor MCP: conectar un cliente de IA externo.
- Tokens de API: los scopes tras
requiredPermissions. - Miembros y roles: lo que hereda el asistente del panel.