Back to the catalog

com.sulvo.publisher-revenue-audit/audit

Publisher revenue audit: ads.txt and ad-stack checks, Sulvo onboarding, and Boost ad-block recovery

Open source Open in the app JSON README (API)

About

Publisher revenue audit: ads.txt and ad-stack checks, Sulvo onboarding, and Boost ad-block recovery

Details

Kind
MCP servers
Topic
Marketing & analytics
Publisher
com.sulvo.publisher-revenue-audit
Origin
official
Category
ferramentas
Transport
http
Version
0.2.1
Added
2026-08-29 03:01:24
Updated
2026-08-29 03:01:24
Origin id
com.sulvo.publisher-revenue-audit/audit

README

# Publisher Revenue Audit MCP

Public CLI and MCP adapter for running a hosted publisher revenue-readiness screen, completing Sulvo signup, and preparing a verified site for activation while Google approval is pending.

The npm package is intentionally thin. The hosted audit service performs the private analysis server-side; this package ships only the adapter code, output formatting, remote client, and unauthenticated signup helpers.

## Install

```bash
npx -y -p publisher-revenue-audit-mcp publisher-revenue-audit example.com
```

For MCP desktop clients that use stdio:

```json
{
  "mcpServers": {
    "publisher-revenue-audit": {
      "command": "npx",
      "args": ["-y", "-p", "publisher-revenue-audit-mcp", "publisher-revenue-audit-mcp"]
    }
  }
}
```

Clients that support hosted MCP can connect directly to:

`https://publisher-revenue-audit.sulvo.com/mcp`

For private/internal MCP deployments that should not be reachable from the public internet, use OpenAI Secure MCP Tunnel with a private server target.

## CLI

```bash
publisher-revenue-audit example.com --json
publisher-revenue-audit audit example.com --max-pages 2 --markdown
publisher-revenue-audit issues https example.com --csv
publisher-revenue-audit issues crawler example.com --json
publisher-revenue-audit agentic example.com --json
publisher-revenue-audit apply example.com --email publisher@example.com
```

## Boost

Set up Sulvo Boost (first-party serving from your own CDN that recovers ad-blocked impressions):

```bash
publisher-revenue-audit boost --cdn cloudflare|aws|fastly
```

The command uses the installer bundle shipped inside this package — npm has already
integrity-checked it on install — extracts it into the current directory, installs its
dependencies, and runs it. It falls back to downloading from the hosted service only when the
bundle is absent or you pass `--bundle-url` / set `SULVO_BOOST_BUNDLE_URL`; that download has
nothing to verify it against, so the packaged copy is preferred. The installer asks for your zone/host and Sulvo account id (ai). MCP clients get the same guidance from the public `get_sulvo_boost_setup` tool.

x402 agent payments and wallet/QR contributions are on by default and settle to the Treasury, automatically paid out to the publisher with their earnings at no fee — no wallet setup is needed. All three CDN bundles participate: Cloudflare and Fastly include the HTML agent gate; AWS covers x402 discovery + the paid content API (its lambdas only see `{base}/*` traffic).

Boost options:

- `--cdn cloudflare|aws|fastly`
- `--dir path`
- `--bundle-url URL`
- `--receiver 0x…` — your USDC treasury for x402 agent payments and wallet contributions
- `--contribution micropayment|paid-subscription|email-capture` — what the unblock mural asks a reader for
- `--product-name NAME` — max 60 characters, named in the paid-subscription sign-in prompt
- `--publisher-redirect-url URL` — http/https subscribe page; **required** with `--contribution paid-subscription`

### Advanced settings are dashboard settings

`--contribution`, `--product-name`, and `--publisher-redirect-url` are per-domain settings on
your Sulvo account, not installer or CDN values — the Boost worker reads them at runtime.
Saving them requires a signed-in Sulvo dashboard session, which the CLI does not hold, so
**the CLI validates these values and does not apply them.** It checks each one (and refuses
`paid-subscription` without a redirect URL, because that combination makes the mural fall
through to the pay button), then prints the exact values to enter:

```bash
publisher-revenue-audit boost --cdn cloudflare \
  --contribution paid-subscription \
  --product-name "The Daily" \
  --publisher-redirect-url https://example.com/subscribe
```

Enter them per domain in the Sulvo dashboard: Recover → Boost → choose the domain → Advanced
settings. Scripting a fleet of sites? Run the command per site to catch bad values early, then
apply the printed settings once per domain in the dashboard.

Signup commands:

```bash
publisher-revenue-audit signup start example.com --email publisher@example.com
SULVO_SIGNUP_PASSWORD="choose-a-strong-password" \
  publisher-revenue-audit signup create-account example.com \
  --email publisher@example.com \
  --first-name Jane \
  --last-name Doe \
  --password-env SULVO_SIGNUP_PASSWORD \
  --monthly-pageviews 125000
publisher-revenue-audit signup company --user-id returned-user-id --website example.com --country "United States"
publisher-revenue-audit signup ads-txt --user-id returned-user-id
publisher-revenue-audit signup verify-ads-txt --user-id returned-user-id
publisher-revenue-audit signup status --user-id returned-user-id
publisher-revenue-audit signup documents --user-id returned-user-id --adsense-file ./policy-center.png --earnings-file ./earnings.pdf --create-tagless-unit false
```

After signup and email verification, start the resumable setup journey:

```bash
publisher-revenue-audit onboarding login
publisher-revenue-audit onboarding start example.com --audit-artifact-id returned-audit-id --goal demand --retag after-approval
publisher-revenue-audit onboarding status returned-workspace-id
publisher-revenue-audit onboarding connect-provider returned-workspace-id --provider gam
publisher-revenue-audit onboarding import-units returned-workspace-id --provider gam --expected-version 1
publisher-revenue-audit onboarding review-recommendations returned-workspace-id --expected-version 2 --data-json '{"decisions":[]}'
publisher-revenue-audit onboarding save-plan returned-workspace-id --expected-version 3 --data-json '{"payload":{"placements":[{"key":"hero","sizes":[[300,250]]}]}}'
publisher-revenue-audit onboarding map-backup returned-workspace-id --expected-version 4 --stable-placement-id placement-1 --provider gam --provider-id unit-1
publisher-revenue-audit onboarding lock returned-workspace-id --expected-version 5 --revision-id revision-id
publisher-revenue-audit onboarding installation returned-workspace-id
publisher-revenue-audit onboarding verify-installation returned-workspace-id
publisher-revenue-audit onboarding preflight returned-workspace-id
publisher-revenue-audit onboarding verify-ownership returned-workspace-id
publisher-revenue-audit onboarding submit returned-workspace-id --expected-version 6 --revision-id revision-id
```

The `--goal` flag records the publisher's #1 goal (`demand` for higher CPMs, `adblock-recovery` for Boost first-party recovery). With the demand goal, `--retag now` runs the full passback wizard immediately, while `--retag after-approval` submits the bare site for approval first (`onboarding submit-site` after a tag-free `verify-ownership`) and defers tagging until demand partners approve. Use `onboarding set-journey` to adjust the answers while the workspace is still in draft.

`onboarding login` uses browser authorization-code PKCE with a local loopback callback. Use `--headless` only when a browser callback is unavailable; it starts the device flow explicitly. The scoped refreshable grant is stored only in the operating system credential store, never in a plaintext file. If secure storage is unavailable, set `SULVO_CONNECTOR_TOKEN` for that process or install the optional `keytar` dependency. The CLI and local stdio MCP adapter reuse the grant, refresh it 30 seconds before expiry, and retry one unauthorized request with the same idempotency key. They do not collect or store the Sulvo password.

While Google approval is pending, the journey's demand-activation step (Relabe special connectors + Amazon) happens in the Sulvo dashboard under Revenue Setup → Activate demand; the CLI and MCP direct you there. Approval is the passive final gate — serving switches on automatically when it lands.

Every onboarding mutation returns its retry key. Reuse it with `--idempotency-key` after a timeout or disconnected client so the backend can return the original result instead of duplicating the operation.

Audit options:

- `--json`, `--markdown`, or `--markdown-and-json`
- `--compact`
- `--max-pages 1..5`
- `--include-evidence` or `--no-evidence`
- `--api-url URL`
- `--api-timeout-ms MS`
- `--out path`

Signup options:

- `--json` or `--markdown`
- `--signup-api-url URL`
- `--signup-timeout-ms MS`
- `--out path`

## MCP Tools

The public stdio MCP server exposes:

- `run_publisher_revenue_audit`
- `check_https_certificate`
- `check_crawler_blocks`
- `run_agentic_readiness_audit`
- `get_sulvo_boost_setup`
- `apply_for_sulvo_account`
- `start_sulvo_signup`
- `create_sulvo_signup_account`
- `update_sulvo_signup_company`
- `get_sulvo_signup_ads_txt`
- `verify_sulvo_signup_ads_txt`
- `get_sulvo_signup_status`
- `submit_sulvo_signup_documents`
- `start_sulvo_revenue_onboarding`
- `get_sulvo_revenue_onboarding_status`
- guided provider, placement, installation, preflight, ownership, submission, rollback, and smoke-status tools

The public MCP server does not read arbitrary local files. Document review from MCP returns dashboard instructions. The CLI document command reads only explicit paths supplied by the operator and enforces file-count and byte limits before upload.

## Distribution Boundary

The npm package does not include the private local audit engine, private analysis modules, hosted HTTP backend, authenticated account/report clients, source maps, tests, or private docs.

Public installs call hosted Sulvo APIs. Audits, checklists, benchmarks, account applications, and signup remain unauthenticated. Saving site configuration requires a verified Sulvo account and narrow `onboarding:read`/`onboarding:write` consent. Production inventory and Sulvo demand remain disabled until the account, MCM relationship, and site are approved.

## Development

```bash
npm run build
npm test
npm run smoke:cli
npm run smoke:mcp
npm run check:public-package
```

More