Ascent
For developers

The engine, not just the app.

Everything the hosted product does is reachable from your own code. How do I call Ascent? A typed client or the HTTP service. Can my own agent drive it? An MCP server. Can I self-host Ascent? A licensed build, on your own infrastructure with your own provider keys.

Pure ESM · no build step Zero runtime deps Node · Deno · edge · browser node --test · 5,000+ tests

Six ways to ship it.

Honest by designNumbers are always tagged measured on Google (a real rank) vs Ascent estimate (a projection) — the two are never blurred, in every channel.
Deep dive

Architecture & integration brief

The full developer document — runtime profile, the six surfaces, the action lifecycle, a safe adoption path and the production checklist.

Quickstart

Analyze a site in about a minute.

Install the SDK, point it at a site with the sitemap content adapter, and run an audit. No keys needed for analyze().

# install (licensed — see the access note below)
npm i @ascent/seo-agent
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() (AI content proposals) and run() (the job loop) take the provider and storage seams — see the SDK section.

Licensed · request accessAscent is a commercial engine and isn’t on a public registry yet. The install line shows the intended flow; start in the app or reach out to request developer access.
SP0 · SDK core

The SDK — one facade, four profiles.

createSeoAgent(config, deps) wraps the pure cores and returns { analyze, generate, run }. A runtime layer detects Node / Deno / edge / browser and splits trusted (server, holds keys) from untrusted (browser, proxies secret calls to the service). An offline ES256 license gate reuses your entitlements.

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/licenseverifyLicense(token, {now, publicKey}), offline.
  • @ascent/seo-agent/config · /runtime — resolve config + the runtime/trust split.
  • Four init profiles: headless · api · frontend · admin.
SP1 · Service / API

One handler. N routes. Server-side secrets.

A single Web-standard handleRequest(Request) → Response router over every backend shell, with unified Authorization: Bearer license auth, CORS, and fail-soft responses. This is the endpoint the browser SDK proxies to — so keys stay on the server.

import { createSeoService, defaultHandlers, toNodeHandler } from '@ascent/seo-agent/service'

const service = createSeoService({ handlers: defaultHandlers, secrets: process.env })

// 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"}}'
Reference & downloads
Get it
SP2 · MCP server

Six SEO tools, over MCP.

A hand-rolled, zero-dependency Model Context Protocol server over stdio, exposing analyze · generate · rankings · competitors · content · status. Runs against a remote service (SP1) or a local in-process SDK.

// add to your MCP client config (e.g. Claude Desktop)
{
  "mcpServers": {
    "ascent-seo": {
      "command": "npx",
      "args": ["-y", "@ascent/seo-agent-mcp"],
      "env": {
        "ASCENT_SERVICE_URL": "https://your-service",
        "ASCENT_LICENSE": "your-license-token"
      }
    }
  }
}

Prefer to import it? @ascent/seo-agent/mcp exposes runServer, defineTools, and resolveBackend.

Reference & downloads
Get itnpx @ascent/seo-agent-mcp
SP3 · Claude skill

A drop-in Claude skill.

The ascent-seo skill lets Claude run SEO tasks for you. It prefers the MCP server when it’s connected and falls back to a zero-dep CLI script otherwise — so it works whether or not MCP is wired up. An honesty reference keeps measured and projected results clearly separated in what Claude reports back.

  • Ships as skill/ascent-seo/SKILL.md + honesty reference + fallback CLI.
  • MCP-preferred; the script path needs only ASCENT_SERVICE_URL + ASCENT_LICENSE.
  • Pairs naturally with the MCP server above.
Reference & downloads
SP4 · Frontend widgets

Browser widgets — pure build, thin mount.

Zero-dependency, XSS-escaped browser widgets: a meta injector, a rank badge (measured), a potential gauge (projected), and an honest result card. Each is a pure buildX(data) → html plus a thin mountX(el, data), with a base theme.css.

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
})

A browser ascentClient talks to your SP1 service; only the token is sent, never secrets.

Reference & downloads
Get it↓ Widget kit .zipfree · includes theme.css
SP5 · Admin cockpit

An operator cockpit you control.

Six actionable panels — proposals, keywords, rankings, competitors, autonomy, status — built on a small panel framework. Panels read through the ascentClient and write through an onAction callback you wire, so there’s no hidden write endpoint pretending to exist.

import { mountProposals } from '@ascent/seo-agent/admin'

mountProposals(document.querySelector('#proposals'), {
  client,                              // reads via SP1
  onAction: (action) => approve(action) // you own the write path,
})
Reference & downloads
Get it
Ascent credits & billing

Two ways to pay for paid ops.

Paid operations (SERP + AI) cost money to run. How they’re billed depends on where the engine runs — on your infrastructure, or on Ascent’s hosted API.

Self-hosted / licensed → your keys, no Ascent credits

Run the engine on your own infrastructure with your own Serper/Anthropic keys. You pay those providers directly — Ascent credits don’t apply and there’s nothing to top up. Your cost is your provider bill plus the annual license. Generate a key from any 🔒 Generate license button.

Hosted API / Service → Ascent credits

Call Ascent’s hosted Service (Authorization: Bearer). Ascent runs the ops on its keys and meters them in Ascent credits — the same wallet as the app. Each dispatched run debits credits (refunded on provider failure); an empty wallet returns 402 insufficient_credits.

// check your balance (Bearer = your session token)
POST /rest/v1/rpc/credit_balance
{ "p_account": "<account_id>" }   // → { total, planRemaining, topupBalance, resetsAt }

// top up: buy a credit pack (redirects to the hosted card page)
POST /api/payments/mips/create-payment
{ "kind": "credit_pack", "packId": "pack_5k", "accountId": "<account_id>" }

Bring your own keys (BYOK): connect your Serper/Claude keys in Account settings and hosted ops run on your keys at near-zero credits — the natural fit for agencies and high-volume dispatch.

During an open beta the operator may pause metering — hosted calls then run free (usage is still recorded).

← Back Docs
Downloads

Grab the free components.

The open pieces are yours to download and use now. The licensed engine — SDK core, service/API, MCP server, admin cockpit — is available on request.

Widget kit

Browser widgets + theme.css — rank badge, potential gauge, result card, meta injector.

↓ .zip

Claude skill

The ascent-seo skill — SKILL.md, honesty reference, fallback CLI.

↓ .zip

Type definitions

The .d.ts API surface — entities, adapters, storage, providers.

↓ .zip

Examples

Runnable SDK usage examples.

↓ .zip

🔒 Licensed · SDK core · service/API · MCP · admin

The engine itself is a commercial, licensed product — self-host or white-label. It isn’t a public download — request developer access and we’ll set you up.

Honest by designOnly the free pieces above are downloadable here. Nothing on this page ships the licensed engine — the request-access path is the only way to it.
Watch it

The integration, end to end.

One pass over the surfaces a developer actually touches: where the origin and the SERP provider are set, which researchers run, the GitHub App that lets Ascent open a pull request, and the worklist where a change is handed back as text to paste rather than written to your site behind your back.

The configuration screen showing the site origin, the SERP provider, the researchers that run, fleet learning, and the GitHub repository pull requests are opened against, followed by the apply worklist handing back a page to paste.
Configuration, the GitHub App, and the worklist — recorded on the live app, read-only.

More walkthroughs, one per surface, as the integration surface grows. See all walkthroughs.

Straight answers

Questions people ask.

How do I call Ascent from my own code?

Use the typed client or call the HTTP service directly. Both hit the same routes the hosted app uses, and both are metered against your account, so what you build behaves exactly like the product does.

Can my own agent drive Ascent?

Yes. Ascent ships an MCP server that exposes the audit, proposal and publish operations as tools, so an agent you control can run the loop and decide what to apply within the autonomy you configure.

Can I self-host Ascent?

Yes. A licensed build runs on your own infrastructure with your own provider keys and an offline-signed licence key, and can be white-labelled under your own brand. Nothing calls back to us to authorise a run.

Ascent — an autonomous agent for search and AI-answer visibility. It finds the work, ships the work, and proves it worked.
Proposed positioning, running beside the live homepage. Same design system, same engine, different argument.