Le moteur, pas seulement l'app.
La moitié « recherche » d’Umbodi est accessible depuis votre propre code : un client typé, un service HTTP, un serveur MCP, ou une version auto-hébergée sous licence tournant avec vos propres clés fournisseur. La moitié « réponses IA » est aujourd’hui disponible uniquement dans le produit hébergé. Les tableaux ci-dessous disent exactement ce qui relève de l’un ou de l’autre, car une page développeur qui surestime sa portée vous coûte une après-midi avant que vous ne le découvriez.
Six façons de le livrer.
createSeoAgent()
Une seule façade sur les cœurs. Séparation fiable/non fiable — le navigateur ne détient jamais de clés.
Service HTTP
Un routeur Request→Response, licence Bearer, secrets côté serveur.
Serveur MCP
Serveur stdio sans dépendance, sept outils — six en lecture, un qui ouvre une pull request — pour Claude et les autres clients MCP.
Compétence Claude
Compétence ascent-seo prête à l’emploi — MCP prioritaire, script en repli.
Widgets navigateur
Widgets purs build/mount — badge de rang, jauge de potentiel, carte de résultat.
Cockpit d’administration
Panneaux opérateur — propositions, mots-clés, classements — écritures via votre onAction.
Trois façons de le faire tourner — et où chacune s’arrête.
Les six surfaces ci-dessus sont COMMENT vous l’appelez. Voici ce qu’il a le droit de faire seul. Chaque mode a un plafond honnête différent, et celui que vous choisissez décide qui appuie sur le dernier bouton.
Sans accès au dépôt
Umbodi prépare le changement et une personne l’applique — copier, coller, envoyer. Il ré-explore ensuite la page en ligne et prouve que le changement y est vraiment. Complet, et ne demande aucune confiance.
Ouvre une pull request
Un commit atomique sur une branche dédiée, jamais la branche par défaut. Une personne relit et fusionne. Sûr en cas de nouvelle tentative : relancer met à jour la même pull request au lieu d’en ouvrir une seconde.
Auto-réparation
Intégré via l’API ou le SDK, la boucle se referme sans personne dedans : fusion si tout est au vert, puis vérification. La fusion est une option explicite et distincte, jamais héritée d’un curseur d’autonomie.
Ce que le moteur vous donne, et ce qui reste hébergé.
Mesuré sur le code du moteur le 30 septembre 2026, et non décrit de mémoire. Si vous évaluez Umbodi pour la partie « réponses IA », lisez ceci avant de commencer.
- Dans le moteur — six actions.
analyze·generate·rankings·competitors·content·status. Chaque surface — SDK, service HTTP, MCP, la compétence Claude, les widgets — est une façon différente d’atteindre ces mêmes six actions. Toutes les six concernent la recherche. Le moteur possède sa propre suite, rapportée par son proprenpm test— un chiffre distinct du total de la plateforme ci-dessus, et que ce dépôt ne peut pas recalculer pour vous. - Hébergé uniquement — la visibilité dans les réponses IA. Les cinq moteurs de réponse, la vérification des citations et les rapports associés ne sont pas dans le moteur sous licence et ne sont accessibles ni par le SDK ni par MCP. Ils tournent dans le produit hébergé. Le dire vous coûte moins cher que de le découvrir après une licence.
- Hébergé uniquement — le canal d’écriture. Ouvrir une pull request, la fusionner au vert et vérifier le déploiement en ligne sont des capacités hébergées ; le moteur lui-même recherche et rédige, et n’écrit jamais dans votre dépôt. Une clé de licence atteint la première via l’API hébergée —
applyouvre une pull request avec les changements que vous avez approuvés. Elle ne peut jamais en fusionner une. - Borné volontairement. Quel que soit le mode, l’agent n’écrit que du contenu et des fichiers de découvrabilité — il ne peut jamais modifier le code qui décide de ce qu’il a le droit de changer. Cette borne est vérifiée juste avant tout acte irréversible, pas seulement au moment de la proposition.
@ascent/seo-agent (son serveur MCP est le binaire seo-agent-mcp), et les variables d’environnement restent ASCENT_SERVICE_URL, ASCENT_LICENSE et ASCENT_LOCAL. Ce sont de vrais identifiants, figés jusqu’à une version majeure — copiez-les exactement tels quels. Le paquet n’est pas sur un registre public : les clients sous licence le reçoivent d’Umbodi. L’API hébergée sur https://umbodi.ai/v1 ne demande aucun paquet.Brief architecture & intégration
Le document développeur complet — profil d’exécution, les six surfaces, le cycle de vie des actions, un parcours d’adoption sûr et la checklist de production.
Analysez un site en une minute environ.
Avec une clé de licence, appelez l’API hébergée — rien à installer, et analyze est gratuit. Avec le moteur sous licence, lancez le même audit en processus avec l’adaptateur de contenu 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() (propositions de contenu IA) et run() (la boucle de tâches) utilisent les coutures fournisseur et stockage — voir la section SDK.
Le SDK — une façade, quatre profils.
createSeoAgent(config, deps) enveloppe les cœurs purs et renvoie { analyze, generate, run }. Une couche d’exécution détecte Node / Deno / edge / navigateur et sépare le fiable (serveur, détient les clés) du non fiable (navigateur, relaie les appels secrets au service). Une vérification de licence ES256 hors ligne réutilise vos droits.
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.- Quatre profils
init: headless · api · frontend · admin.
Un gestionnaire. N routes. Secrets côté serveur.
Un unique routeur standard Web handleRequest(Request) → Response sur chaque enveloppe backend, avec authentification de licence unifiée Authorization: Bearer, CORS et réponses tolérantes aux pannes. C’est le point de terminaison vers lequel le SDK navigateur relaie — ainsi les clés restent sur le serveur.
https://umbodi.ai/v1 : chaque action est un POST /v1/{action} avec votre clé de licence, les actions payantes sont débitées en crédits sur le compte de la clé, et un site doit être l’un de vos propres projets. GET /v1/status liste les actions.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"}}'
Sept outils, et l’un d’eux agit.
Un serveur Model Context Protocol fait main, sans dépendance, via stdio, exposant analyze · generate · rankings · competitors · content · status · apply. Une clé de licence seule utilise l’API hébergée d’Umbodi (umbodi.ai/v1) ; pointez-la vers votre propre service avec ASCENT_SERVICE_URL, ou exécutez un SDK local en processus.
apply demande au service d’ouvrir une pull request — relisible, réversible, visible avant tout le reste — et il ne peut jamais la fusionner. Une clé de licence est une chaîne qui finit dans des fichiers de configuration, des variables de CI et des captures d’écran, ce qu’une installation GitHub App ne fait jamais : aucune action authentifiée par licence ne peut donc fusionner : l’API hébergée n’a pas d’action de fusion, et la vérification des droits refuse une fusion avant même d’examiner la clé. La fusion reste au propriétaire du projet. Il n’y a toujours pas d’outil run ni d’action de worker, le transport est uniquement stdio, et la couche JSON-RPC est un sous-ensemble écrit à la main, pas le SDK officiel.// 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" }
}
}
}
Vous préférez l’importer? @ascent/seo-agent/mcp expose runServer, defineTools et resolveBackend.
Une compétence Claude prête à l’emploi.
La compétence ascent-seo permet à Claude d’exécuter des tâches Umbodi pour vous. Elle privilégie le serveur MCP lorsqu’il est connecté et retombe sinon sur un script CLI sans dépendance — elle fonctionne donc que MCP soit câblé ou non. Une référence d’honnêteté garde les résultats mesurés et projetés clairement séparés dans ce que Claude rapporte.
- Livrée comme
skill/ascent-seo/—SKILL.md+ référence d’honnêteté + CLI de repli. - MCP prioritaire ; le chemin script ne requiert que
ASCENT_SERVICE_URL+ASCENT_LICENSE. - Se marie naturellement avec le serveur MCP ci-dessus.
Widgets navigateur — build pur, montage léger.
Widgets navigateur sans dépendance, protégés contre le XSS : un injecteur de méta, un badge de rang (mesuré), une jauge de potentiel (projeté) et une carte de résultat honnête. Chacun est un pur buildX(data) → html plus un léger mountX(el, data), avec 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() crée un client navigateur qui dialogue avec votre service ; seul le jeton est envoyé, jamais les secrets.
Un cockpit opérateur que vous contrôlez.
Six panneaux exploitables — propositions, mots-clés, classements, concurrents, autonomie, statut — bâtis sur un petit cadre de panneaux. Les panneaux affichent les données que vous leur passez et écrivent via un rappel onAction que vous branchez, donc aucun point d’écriture caché ne fait semblant d’exister.
import { mountProposals } from '@ascent/seo-agent/admin'
mountProposals(document.querySelector('#proposals'), proposals, {
onAction: (action) => approve(action), // you own the write path
})
Deux façons de payer les opérations payantes.
Les opérations payantes (SERP + IA) ont un coût. Leur facturation dépend de l’endroit où tourne le moteur — sur votre infrastructure, ou sur l’API hébergée d’Umbodi.
Auto-hébergé / sous licence → vos clés, sans crédits Umbodi
Exécutez le moteur sur votre propre infrastructure avec vos clés Serper/Anthropic. Vous payez ces fournisseurs directement — les crédits Umbodi ne s’appliquent pas et il n’y a rien à recharger. Votre coût = votre facture fournisseur + la licence annuelle. Générez une clé via un bouton 🔒 Generate license.
API / Service hébergé → crédits Umbodi
Appelez l’API hébergée d’Umbodi sur https://umbodi.ai/v1 avec votre clé de licence (Authorization: Bearer). Umbodi exécute les opérations avec ses clés — ou les vôtres, si vous les avez connectées — et débite des crédits Umbodi sur le compte de la clé : le même portefeuille et les mêmes prix que l’app. Un appel qui échoue chez le fournisseur est remboursé ; un portefeuille vide renvoie 402 insufficient_credits, et un projet à son plafond mensuel 402 project_cap_reached. Un sujet content portant sur l’un de vos concurrents suivis est refusé avec 422 topic_refused avant tout débit.
// 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
Vos propres clés (BYOK) : connectez vos clés Serper/Claude dans les paramètres du compte et les opérations hébergées s’exécutent sur vos clés à quasi zéro crédit — idéal pour les agences et les gros volumes.
L’opérateur peut suspendre la facturation — les appels hébergés sont alors gratuits (l’usage est quand même enregistré).
Récupérez les composants gratuits.
Les éléments ouverts sont à télécharger et à utiliser dès maintenant. Le moteur sous licence — cœur du SDK, service/API, serveur MCP, cockpit d’administration — est disponible sur demande.
🔒 Sous licence · cœur du SDK · service/API · MCP · admin
Le moteur lui-même est un produit commercial sous licence — auto-hébergé ou en marque blanche. Ce n’est pas un téléchargement public — demandez un accès développeur et nous vous configurerons.