Referencia de herramientas MCP
Hay 31 herramientas registradas. ? indica campo opcional; los demás son obligatorios. ID es una cadena de 1–180 caracteres de [A-Za-z0-9_-]; R es entero no negativo. P = {projectId:ID}; M = P + {expectedRevision:R,idempotencyKey:ID}. Los objetos de entrada son estrictos salvo la extensión createInput de estudio; no envíes campos inventados. Los esquemas exactos y validaciones semánticas están enlazados debajo.
Cada éxito usa {content:[{type:"text",text:JSON.stringify(resultado)}],structuredContent:resultado}. No hay un outputSchema registrado: las formas de salida siguientes proceden de los servicios y no son un esquema JSON publicado. Las propiedades opcionales indefinidas no aparecen en el texto JSON. Los errores de herramienta usan isError:true y {error,message} en el texto; el transporte también puede rechazar antes de ejecutar.
E representa {project,revision,editorUrl,publishedUrl}; project es la instantánea completa, no solo document; publishedUrl depende de la publicación. L representa {items,nextCursor}. S representa {sessionId,version,status,question,summary?,nextAction,projectId?}: estado collecting|ready|created, pregunta {field,text,choices?} o null; resumen con type,businessName,businessDescription,audience,offer,contact,brandColor,products,missingPhotos.
Catálogo (sin autenticación)
| Herramienta | Entrada | Resultado |
|---|---|---|
builder_get_capabilities |
{} |
schemaVersion:3, limits, esquema JSON operations, desktopSafeArea, arrangement, responsiveReset, elementShadows, editorSettings, siteLanguage, componentDesign, sharedNavigation, blog, projectStore, publication, forms, commerce, studioMode, vercelExport, interactiveForms, academy |
builder_list_components |
{query?:string≤300,category?:string≤80,cursor?:ID,limit?:1..50} |
L; cada entrada: id,name,description,category,type,width,height?,properties,source (autor y URL/SHA cuando existen); límite por defecto 25 |
builder_get_component |
{componentId:ID} |
Componente original: id,name,description,type,data,category y section?; conserva atribución original |
Proyectos
| Herramienta | Alcance | Entrada | Resultado |
|---|---|---|---|
builder_list_projects |
projects:read |
{cursor?:ID,limit?:1..50} |
L; entradas {id,name,revision,editorUrl,publishedUrl}; límite por defecto 25 |
builder_get_project |
projects:read |
P |
E |
builder_create_project |
projects:write |
{name:string(1..300),document?:Documento,expectedRevision:0,idempotencyKey:ID} |
E; borrador sin publicación automática; requiere allowCreate |
builder_apply_operations |
projects:write |
M + {operations:Operación[1..100]} |
E; lote atómico |
builder_duplicate_project |
projects:write |
M + {name:string(1..300)} |
E; copia independiente sin publicar; requiere creación autorizada |
builder_get_changes |
projects:read |
P + {cursor?:ID} |
L; hasta 50 entradas {id,revision,operation,at,source} |
builder_restore_revision |
projects:write |
M + {revision:R} |
E; restaura como nueva revisión y conserva la sustituida |
builder_get_links |
projects:read |
P |
{projectId,revision,editorUrl,publishedUrl} |
builder_publish_project |
sites:publish |
M |
E; publicación explícita, puede exigir acceso comercial |
Fuente: esquemas y materialización, servicio, instantánea y repositorio. Un conflicto de revisión devuelve revision_conflict; vuelve a leer antes de preparar otra operación.
Las 17 operaciones
T={scope:"header"|"page",pageId?:ID,sectionId:ID}: página exige pageId; cabecera lo omite. TE=T+{elementId:ID}.
op |
Campos adicionales |
|---|---|
arrange_elements |
`target:T,elementIds:ID[1..1000],mode:row |
create_page |
page:Página |
update_page |
pageId:ID,page:parche de página sin id ni sections |
delete_page |
pageId:ID |
reorder_pages |
pageIds:ID[0..200] |
upsert_section |
target:T,section:SecciónEntrada |
delete_section |
target:T |
reorder_sections |
`scope:header |
move_section |
`target:T,to:{scope:header |
upsert_element |
target:TE,element:ElementoEntrada |
delete_element |
target:TE |
reset_element_layout |
`target:TE,breakpoint:mobile |
reorder_elements |
target:T,elementIds:ID[0..1000] |
update_theme |
theme:parche de tema |
update_metadata |
metadata:parche de metadatos |
update_editor_settings |
settings:parche; automaticPublication solo false |
update_store |
store:instantánea completa de tienda |
Documento={pages,headerSections,theme,metadata,editorSettings,funnels?,store?}. Requiere 1–200 páginas, exactamente una de inicio, identificadores y slugs únicos, hasta 100 secciones de cabecera y destinos internos válidos. Página={id,name,pageKind?,popupSettings?,slug,isHome,seoTitle,seoDescription,sections}; pageKind=article|blog-index|popup, hasta 200 secciones. Una sección tiene id,name,category,height,styles,elements,columns?,columnGap?,locked?,hidden?,hiddenOn?; hasta 1000 elementos. SecciónEntrada admite campos parciales, exige id y acepta catalogComponentId. Un elemento tiene id,type,name,x,y,width,height,styles,content,zIndex?,locked?,hidden?,hiddenOn?,mobileLayout?,tabletLayout?; ElementoEntrada exige solo id, admite campos parciales y catalogComponentId. El servicio materializa los valores del catálogo o valida una definición completa. styles y content son objetos de propiedades permitidas, no CSS/HTML arbitrario. La escritura de elementos nuevos usa contenido nativo; el markup histórico tiene su propia validación de lectura/restauración.
El contrato completo de cada propiedad y límite (incluidos tema, diseño de componentes, popups, media, formularios clásicos, código y funnels) está en el esquema canónico, espacio de código, funnels y tienda. Usa también builder_get_capabilities.operations para obtener el esquema JSON real en tiempo de ejecución. Las validaciones refinadas (seguridad de URL/CSS, IDs, estructura e integridad de enlaces) se ejecutan además del esquema JSON.
Modo estudio (projects:write)
| Herramienta | Entrada | Resultado |
|---|---|---|
builder_studio_start |
{idempotencyKey:ID} |
S |
builder_studio_get |
{sessionId} |
S |
builder_studio_answer |
{sessionId,expectedVersion:R,value?:string≤3000,product?:Producto} |
S |
builder_studio_create |
{sessionId,expectedVersion:R} |
E; solo resumen listo y confirmado por el usuario |
builder_studio_revise |
`{sessionId,expectedVersion:R,field:businessName | businessDescription |
sessionId cumple ^studio-[a-f0-9]{32}$. Producto={name,description,price,stock,category,imageUrl}: nombre recortado 1–200; descripción 1–3000; precio finito 0–1000000; existencias enteras 0–100000; categoría 1–100; imagen string hasta 120000 y validación adicional HTTPS o data URI PNG/JPEG/WebP hasta 80000 bytes, o vacío. Haz una pregunta por turno y conserva los datos reales. Las elecciones iniciales son ecommerce|ventas|aterrizaje|funnel. No crear sin confirmación ni publicar por haber creado.
Fuente: esquemas, flujo y salida visible, pruebas.
Exportación (projects:read)
| Herramienta | Entrada | Resultado |
|---|---|---|
builder_export_vercel_manifest |
P + {expectedRevision:R} |
{projectId,revision,target:"preview",suggestedName,files:[{file,sha,size}],instructions,limitations} |
builder_export_vercel_file |
P + {expectedRevision:R,path:string(1..180)} |
{file,sha,size,xVercelDigest,contentLength,requestBody,encoding:"base64"} |
SHA1 y longitud corresponden a los bytes UTF-8; requestBody es base64. Lee cada ruta del manifiesto con la misma revisión. No se requiere ni acepta clave de idempotencia. No muestra ni transfiere credenciales Vercel. Componentes incompatibles pueden impedir exportar; cursos y formularios consultan Firebase, requieren reglas desplegadas y dominios autorizados para Google Sign-In. Fuente: exportación, pruebas.
Formularios
| Herramienta | Alcance | Entrada | Resultado |
|---|---|---|---|
builder_list_forms |
projects:read |
P |
{items:[{id,...datosGuardados}],limit:100} |
builder_save_form |
projects:write |
P + {form:Formulario} |
{formId,updated:true,published} |
builder_delete_form |
projects:write |
P + {formId:ID} |
{formId,deleted:true}; elimina también envíos privados |
builder_list_form_responses |
projects:read |
P + {formId:ID} |
{items:[{id,...datosGuardados}],limit:100}; sin cursor |
Formulario={id:ID,title:string≤120,description:string≤600,presentation?:conversational|standard,published:boolean,welcomeTitle:string≤120,welcomeText:string≤500,endingTitle:string≤120,endingText:string≤500,completionUrl:string≤1000,questions:Pregunta[0..80]}. La validación semántica exige título no vacío y al menos una pregunta.
Pregunta={id:ID,title:string≤180,description:string≤500,type,required:boolean,placeholder:string≤100,options:string≤120[0..40],branches:Rama[0..30]}. Tipos: short|long|email|phone|number|single|multiple|yesno|date|rating|statement. Rama={id:ID,condition:equals|notEquals|contains|greaterThan|lessThan,value:string≤120,target:string≤1000}. Opciones obligatorias semánticamente en selección simple/múltiple; título de pregunta y condición no vacíos; IDs de pregunta únicos. El destino es una pregunta posterior, end o url:HTTPS. Se evalúa la primera coincidencia. Sin presentation, el renderizado conserva modo conversacional. Añade un elemento form-widget con content.formId; guardar la definición no coloca el widget ni publica el sitio. published sí controla la disponibilidad pública de la definición para respuestas.
Fuente: servicio y esquemas, validación semántica, pruebas. Las filas de respuesta son registros almacenados; no se declara un esquema de salida cerrado en el servidor MCP.
Academia
| Herramienta | Alcance | Entrada | Resultado |
|---|---|---|---|
builder_list_courses |
projects:read |
P |
{academyName,academyLogo,courses,invites,members,requests,limit:50} |
builder_rename_academy |
projects:write |
P + {name:string(1..80),logoUrl?:string} |
{name,updated:true} |
builder_list_course_lessons |
projects:read |
P + {courseId:ID} |
{items:[{id,...datosGuardados}],limit:50} |
builder_save_course |
projects:write |
P + {courseId:ID,title:string(1..120),summary:string≤600,published:boolean,order:entero(0..100000)} |
{courseId,updated:true} |
builder_delete_course |
projects:write |
P + {courseId:ID} |
{courseId,deleted:true}; elimina lecciones y referencias de invitaciones/miembros |
builder_save_course_lesson |
projects:write |
P + {courseId:ID,lessonId:ID,title:string(1..120),body:string≤30000,videoUrl:string,materials?:Material[0..30],order:entero(0..100000)} |
{lessonId,updated:true} |
builder_set_course_invite |
projects:write |
P + {email:correo,courseIds:ID[1..100],active:boolean,duration?:Duración} |
{email,active} |
builder_review_course_request |
projects:write |
P + {uid:ID,courseIds:ID[0..100],approve:boolean,duration?:Duración} |
{uid,approved}; elimina solicitud pendiente |
Material={id:ID,name:string(1..120),url:HTTPS}. El vídeo admite vacío o URL HTTPS; el logo vacío o data URI PNG/JPEG/WebP hasta 90000 caracteres. Los títulos y el nombre se recortan. Duración={unit:days|months|years|unlimited,amount:entero(1..3650)}: incluso unlimited exige amount, aunque el plazo no lo use. El email se normaliza a minúsculas. Aprobar exige al menos un curso; cursos referenciados deben existir. Omitir duración en invitación conserva vencimiento previo; al aprobar una solicitud, omitirla concede sin vencimiento. Omitir materiales conserva los anteriores.
Los listados son hasta 50 filas por colección sin cursor; cursos y lecciones añaden id, invitaciones email, miembros/solicitudes uid a los datos almacenados. No hay esquema de salida cerrado para esos registros. Los contenidos privados viven fuera del documento público; vídeos externos enlazados no adquieren privacidad. Añade course-widget al proyecto para presentar la academia. Invitar, activar y eliminar requieren petición explícita del usuario.
Fuente: servicio y esquemas, pruebas.
