Agent-ready web intelligence as a pay-per-call MCP server. Licensing and credits are handled by KeyFlint (offline Ed25519 license check + credit ledger), used here only as the billing backend. Failed fetches are refunded automatically; invalid input is rejected before any debit.
| Tool | Credits | Returns |
|---|---|---|
read_url |
1 | Main content as clean Markdown (nav, footer, cookie banners removed) |
page_metadata |
1 | Title, description, canonical, lang, robots, Open Graph, JSON-LD types, H1-H3, image alt stats |
extract_links |
1 | Deduplicated internal / external links with anchor text |
tech_stack |
2 | Frameworks, CMS, analytics, payments, CDN/hosting, security headers |
seo_audit |
3 | 0-100 score, A-F grade, 16 weighted checks, top 5 fixes |
compare_seo |
3 x URLs | Ranks 2-5 pages (you vs competitors); only fetched URLs are billed |
pricing, credits_balance |
free | Price list, remaining credits |
Prices are overridable: WEB_INTEL_PRICES="seo_audit=5,read_url=2".
All you need is your KeyFlint license (LIC-...). The gateway URL, its public key and the checkout link have defaults.
Claude Desktop, one click: download web-intel-mcp-X.Y.Z.mcpb from the latest release, double-click it and paste your license. No terminal, no JSON.
Claude Code:
claude mcp add web-intel -e KEYFLINT_LICENSE=LIC-... -- uvx web-intel-mcpCursor, Windsurf, Claude Desktop (JSON):
{
"mcpServers": {
"web-intel": {
"command": "uvx",
"args": ["web-intel-mcp"],
"env": { "KEYFLINT_LICENSE": "LIC-..." }
}
}
}Optional: KEYFLINT_URL, KEYFLINT_PUBLIC_KEYS (fetched from the gateway and cached in ~/.keyflint/keyring.json when unset), KEYFLINT_CHECKOUT_URL.
In Claude, ChatGPT, VS Code and Goose every paid tool and credits_balance renders as an interactive card in the
chat: credit balance with a refill bar and a buy button, or a result summary (key figures, issues, table preview and
credits charged). It is the ui://web-intel/card.html resource, self-contained with no network access. Other clients
keep getting the same JSON as before.
Paid logic stays on your server. One process bills many buyers; each request carries the buyer's license.
docker build -t web-intel .
docker run -p 8080:8080 \
web-intelBuyers connect to https://<host>/mcp (Streamable HTTP, stateless) with
Authorization: Bearer LIC-... (or X-License-Key). Missing or forged licenses get -32060.
- URL validated (http/https only). Bad input: error, nothing charged.
- Offline Ed25519 license check (
keyflint-verify), cached 60 s. POST /api/v1/quota/deductwith a fresh idempotency key. Out of credits:-32062with the checkout link.- Fetch + analysis. If anything fails:
POST /api/v1/quota/refund(same key), the client getsisError.
Requests to private, loopback and link-local addresses are refused (checked on every redirect hop),
responses are capped at 3 MB (WEB_INTEL_MAX_BYTES), 15 s timeout (WEB_INTEL_TIMEOUT), max 5 redirects.
WEB_INTEL_ALLOW_PRIVATE=1 disables the address check (tests only).
End-to-end with a fake KeyFlint quota gateway, locally signed licenses and a local test site (no network needed):
pip install -e ".[test]"
python -m pytest -qBusiness Source License 1.1. Source available; production use needs a KeyFlint license (or must be non-commercial). Each version becomes Apache 2.0 four years after release. See LICENSE.