El motor, no solo la app.
La mitad de búsqueda de Umbodi es accesible desde tu propio código: un cliente tipado, un servicio HTTP, un servidor MCP o una compilación autoalojada con licencia que usa tus propias claves de proveedor. La mitad de respuestas de IA hoy solo existe en el producto alojado. Las tablas de abajo dicen exactamente qué es cada cosa, porque una página para desarrolladores que exagera su alcance te cuesta una tarde antes de que lo descubras.
Seis formas de entregarlo.
createSeoAgent()
Una fachada sobre los núcleos. Separación de confianza/no confianza — el navegador nunca guarda claves.
Servicio HTTP
Un enrutador Request→Response, con licencia Bearer, secretos del lado del servidor.
Servidor MCP
Servidor stdio sin dependencias, siete herramientas —seis de lectura, una que abre una pull request— para Claude y otros clientes MCP.
Habilidad de Claude
Habilidad ascent-seo lista para usar — MCP preferido, script como reserva.
Widgets de navegador
Widgets puros build/mount — insignia de posición, medidor de potencial, tarjeta de resultado.
Cabina de administración
Paneles de operador — propuestas, palabras clave, rankings — escribe vía su onAction.
Tres formas de ejecutarlo — y dónde se detiene cada una.
Las seis superficies de arriba son CÓMO lo llamas. Esto es cuánto se le permite hacer por su cuenta. Cada modo tiene un techo honesto distinto, y el que elijas decide quién pulsa el último botón.
Sin acceso al repositorio
Umbodi prepara el cambio y una persona lo aplica: copiar, pegar, enviar. Después vuelve a rastrear la página en vivo y demuestra que el cambio está realmente ahí. Completo, y no exige confianza.
Abre una pull request
Un commit atómico en una rama con espacio de nombres propio, nunca la rama por defecto. Una persona revisa y fusiona. Seguro ante reintentos: ejecutarlo dos veces actualiza la misma pull request en lugar de abrir una segunda.
Auto-reparación
Integrado mediante la API o el SDK, el bucle se cierra sin nadie dentro: fusiona si todo está en verde y luego verifica. Fusionar es una opción explícita y separada, nunca heredada de un control de autonomía.
Qué te da el motor, y qué es solo del producto alojado.
Medido sobre el código del motor el 30 de septiembre de 2026, no descrito de memoria. Si estás evaluando Umbodi por la parte de respuestas de IA, lee esto antes de empezar.
- En el motor — seis acciones.
analyze·generate·rankings·competitors·content·status. Cada superficie —SDK, servicio HTTP, MCP, la skill de Claude, los widgets— es una forma distinta de alcanzar esas mismas seis. Las seis son del lado de búsqueda. El motor tiene su propia suite, informada por su propionpm test: una cifra distinta del total de la plataforma de arriba, y que este repositorio no puede recalcular por ti. - Solo alojado — visibilidad en respuestas de IA. Los cinco motores de respuesta, la comprobación de citas y los informes correspondientes no están en el motor con licencia ni son accesibles por SDK o MCP. Se ejecutan en el producto alojado. Decirlo te sale más barato que descubrirlo después de una licencia.
- Solo alojado — el canal de escritura. Abrir una pull request, fusionarla en verde y verificar el despliegue en vivo son capacidades del producto alojado; el motor investiga y redacta, y nunca escribe en tu repositorio. Una clave de licencia alcanza la primera a través de la API alojada:
applyabre una pull request con los cambios que aprobaste. Nunca puede fusionar una. - Acotado a propósito. Sea cual sea el modo, el agente solo escribe contenido y archivos de descubribilidad: nunca puede modificar el código que decide qué se le permite cambiar. Ese límite se comprueba justo antes de cualquier acto irreversible, no solo al proponer el cambio.
@ascent/seo-agent (su servidor MCP es el binario seo-agent-mcp), y las variables de entorno siguen siendo ASCENT_SERVICE_URL, ASCENT_LICENSE y ASCENT_LOCAL. Son identificadores reales, fijados hasta una versión mayor: cópialos exactamente como están. El paquete no está en un registro público: los clientes con licencia lo reciben de Umbodi. La API alojada en https://umbodi.ai/v1 no necesita ningún paquete.Brief de arquitectura e integración
El documento completo para desarrolladores — perfil de ejecución, las seis superficies, el ciclo de vida de las acciones, una ruta de adopción segura y la checklist de producción.
Analice un sitio en aproximadamente un minuto.
Con una clave de licencia, llama a la API alojada: nada que instalar, y analyze es gratis. Con el motor con licencia, ejecuta la misma auditoría en proceso con el adaptador de contenido de sitemap.
# hosted — your license key, nothing to install
curl -s -X POST https://umbodi.ai/v1/analyze \
-H "authorization: Bearer $ASCENT_LICENSE" -H 'content-type: application/json' \
-d '{"url":"https://acme.com"}' # → { issues: [...] }
// licensed engine, in-process (delivered to licensed customers)
import { createSeoAgent, sitemapAdapter } from '@ascent/seo-agent'
// the sitemap adapter is the no-code source of pages to audit
const { listIndexableEntities } = sitemapAdapter({ origin: 'https://acme.com' })
const seo = createSeoAgent(
{ site: { domain: 'acme.com' } },
{ listIndexableEntities },
)
const { issues } = await seo.analyze()
console.log(issues)
generate() (propuestas de contenido con IA) y run() (el bucle de tareas) usan las costuras de proveedor y almacenamiento — consulte la sección SDK.
El SDK — una fachada, cuatro perfiles.
createSeoAgent(config, deps) envuelve los núcleos puros y devuelve { analyze, generate, run }. Una capa de tiempo de ejecución detecta Node / Deno / edge / navegador y separa lo de confianza (servidor, guarda las claves) de lo no confiable (navegador, relega las llamadas secretas al servicio). Una verificación de licencia ES256 sin conexión reutiliza sus derechos.
import { createSeoAgent, sitemapAdapter, memoryStore } from '@ascent/seo-agent'
const seo = createSeoAgent(
{ site: { domain: 'acme.com' }, serviceUrl: 'https://your-service' },
{
listIndexableEntities: sitemapAdapter({ origin: 'https://acme.com' }).listIndexableEntities,
store: memoryStore(),
// callClaude, db, auth … wire the seams you need for generate()/run()
},
)
const { issues } = await seo.analyze()
const draft = await seo.generate() // human-approved content proposals
@ascent/seo-agent/license—verifyLicense(token, {publicJwk, now}), offline.@ascent/seo-agent/config·/runtime— resolve config + the runtime/trust split.- Cuatro perfiles
init: headless · api · frontend · admin.
Un manejador. N rutas. Secretos del lado del servidor.
Un único enrutador estándar de la Web handleRequest(Request) → Response sobre cada envoltura de backend, con autenticación de licencia unificada Authorization: Bearer, CORS y respuestas tolerantes a fallos. Este es el punto de conexión al que el SDK del navegador relega — de modo que las claves permanecen en el servidor.
https://umbodi.ai/v1: cada acción es un POST /v1/{action} con tu clave de licencia, las acciones de pago se cobran en créditos a la cuenta de la clave, y un sitio debe ser uno de tus propios proyectos. GET /v1/status lista las acciones.import { createSeoService, defaultHandlers, toNodeHandler } from '@ascent/seo-agent/service'
const service = createSeoService({
handlers: defaultHandlers(ctx), // ctx = your provider + storage seams
publicJwk, // verifies license keys offline
corsOrigins: ['https://your.site'],
})
// Web-standard (edge / Deno / Bun):
export default (request) => service.handleRequest(request)
// or adapt to a Node http handler:
export const nodeHandler = toNodeHandler(service)
# call it with a license
curl -X POST https://your-service/analyze \
-H "authorization: Bearer $ASCENT_LICENSE" \
-H "content-type: application/json" \
-d '{"site":{"domain":"acme.com"}}'
Siete herramientas, y una de ellas actúa.
Un servidor Model Context Protocol hecho a mano, sin dependencias, sobre stdio, que expone analyze · generate · rankings · competitors · content · status · apply. Una clave de licencia sola usa la API alojada de Umbodi (umbodi.ai/v1); apúntala a tu propio servicio con ASCENT_SERVICE_URL, o ejecuta un SDK local en proceso.
apply pide al servicio que abra una pull request —revisable, reversible, visible antes que ninguna otra cosa— y nunca puede fusionarla. Una clave de licencia es una cadena que acaba en archivos de configuración, variables de CI y capturas de pantalla, cosa que una instalación de GitHub App nunca hace: por eso ninguna acción autenticada con licencia puede fusionar: la API alojada no tiene acción de fusión, y la comprobación de permisos rechaza una fusión antes siquiera de examinar la clave. Fusionar sigue siendo del propietario del proyecto. Sigue sin haber herramienta run ni acción de worker, el transporte es solo stdio y la capa JSON-RPC es un subconjunto hecho a mano, no el SDK oficial.// add to your MCP client config (e.g. Claude Desktop)
{
"mcpServers": {
"ascent-seo": {
"command": "node",
"args": ["/path/to/seo-agent/mcp/server.mjs"],
"env": { "ASCENT_LICENSE": "your-license-key" }
}
}
}
¿Prefiere importarlo? @ascent/seo-agent/mcp expone runServer, defineTools y resolveBackend.
Una habilidad de Claude lista para usar.
La skill ascent-seo permite a Claude ejecutar tareas de Umbodi por ti. Prefiere el servidor MCP cuando está conectado y recurre a un script CLI sin dependencias en caso contrario, así que funciona esté MCP conectado o no. Una referencia de honestidad mantiene los resultados medidos y proyectados claramente separados en lo que Claude informa.
- Se entrega como
skill/ascent-seo/—SKILL.md+ referencia de honestidad + CLI de reserva. - MCP preferido; la vía del script solo necesita
ASCENT_SERVICE_URL+ASCENT_LICENSE. - Combina naturalmente con el servidor MCP de arriba.
Widgets de navegador — construcción pura, montaje ligero.
Widgets de navegador sin dependencias, protegidos contra XSS: un inyector de metadatos, una insignia de posición (medido), un medidor de potencial (proyectado) y una tarjeta de resultado honesta. Cada uno es un puro buildX(data) → html más un ligero mountX(el, data), con un theme.css de base.
import { mountRankBadge } from '@ascent/seo-agent/widgets'
import '@ascent/seo-agent/widgets/theme.css'
mountRankBadge(document.querySelector('#rank'), {
keyword: 'best crm',
position: 5, // measured on Google — not a projection
})
makeAscentClient() crea un cliente de navegador que dialoga con su servicio; solo se envía el token, nunca los secretos.
Una cabina de operador que usted controla.
Seis paneles accionables — propuestas, palabras clave, rankings, competidores, autonomía, estado — construidos sobre un pequeño marco de paneles. Los paneles muestran los datos que usted les pasa y escriben a través de una devolución de llamada onAction que usted conecta, de modo que no hay ningún punto de escritura oculto que finja existir.
import { mountProposals } from '@ascent/seo-agent/admin'
mountProposals(document.querySelector('#proposals'), proposals, {
onAction: (action) => approve(action), // you own the write path
})
Dos formas de pagar las operaciones de pago.
Las operaciones de pago (SERP + IA) cuestan dinero. Cómo se facturan depende de dónde se ejecuta el motor — en tu infraestructura o en la API alojada de Umbodi.
Autoalojado / con licencia → tus claves, sin créditos Umbodi
Ejecuta el motor en tu propia infraestructura con tus claves de Serper/Anthropic. Pagas a esos proveedores directamente — los créditos de Umbodi no aplican y no hay nada que recargar. Tu coste = tu factura del proveedor + la licencia anual. Genera una clave desde cualquier botón 🔒 Generate license.
API / Servicio alojado → créditos Umbodi
Llama a la API alojada de Umbodi en https://umbodi.ai/v1 con tu clave de licencia (Authorization: Bearer). Umbodi ejecuta las operaciones con sus claves —o con las tuyas, si las conectaste— y cobra créditos Umbodi a la cuenta de la clave: la misma cartera y los mismos precios que la app. Una llamada que falla en el proveedor se reembolsa; una cartera vacía devuelve 402 insufficient_credits, y un proyecto en su tope mensual 402 project_cap_reached. Un tema de content sobre uno de sus competidores seguidos se rechaza con 422 topic_refused antes de cobrar nada.
// a paid call: charged to the key's account, refused if the site is not yours
POST https://umbodi.ai/v1/rankings
Authorization: Bearer <license key>
{ "site": { "domain": "example.com" } } // → { results: [{ keyword, position, top }] }
// top up from the app, signed in — the account comes from your session
POST /api/payments/mips/create-payment
{ "kind": "credit_pack", "packId": "pack_5k" } // 401 signed out · 503 payments off
Tus propias claves (BYOK): conecta tus claves de Serper/Claude en la configuración de la cuenta y las operaciones alojadas se ejecutan con tus claves a casi cero créditos — ideal para agencias y alto volumen.
El operador puede pausar la medición — las llamadas alojadas se ejecutan gratis (el uso se sigue registrando).
Consiga los componentes gratuitos.
Las piezas abiertas son suyas para descargar y usar ahora. El motor con licencia — núcleo del SDK, servicio/API, servidor MCP, cabina de administración — está disponible bajo solicitud.
🔒 Con licencia · núcleo del SDK · servicio/API · MCP · admin
El motor en sí es un producto comercial con licencia — autohospedado o de marca blanca. No es una descarga pública — solicite acceso de desarrollador y le configuraremos.