Integration · Remote MCP · xAI
Grok-ready website intelligence in one line
Grok supports Remote MCP tools. Santos publishes a public MCP server over Streamable HTTP. Point Grok at it and seven website-intelligence tools appear in the model’s tool list — no account, no API key, no server to run. Free previews need no wallet. Paid tools return a canonical x402 request that settles in USDC on Base, and only on success.
Step one
Add the server
Register the endpoint as a Remote MCP tool in the xAI SDK. Grok performs discovery itself — it calls tools/list, reads the strict input schemas, and decides when to invoke. Nothing else is required to get the tools in front of the model.
from xai_sdk.tools import mcp
tools = [
mcp(
server_url="https://api.santosautomation.com/mcp",
server_label="santos",
)
]The server_labelis how the tools are namespaced in the model’s context; santos keeps traces readable. Verify the same list the model sees, from your own shell:
curl -X POST https://api.santosautomation.com/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Step two
Ask Grok to use it
Nothing else to configure. Paste this into Grok with the server registered — it audits this very page, so you can check the answer against what is in front of you.
audit https://www.santosautomation.com/integrations/grok with the Santos tools.Grok picks audit_website_preview on its own — a free tool, so no wallet is involved — and returns scores across the four dimensions, the individual pass/fail checks, and prioritized fixes. If that comes back, your wiring is correct and everything else on this page is a variation on it.
Step three
What Grok sees
Seven tools. The three free previews execute and return a full result inline. The four paid tools validate the target and return the canonical x402 HTTP request — they never move funds themselves.
| Tool | Cost | Behavior |
|---|---|---|
audit_website_preview | Free | Runs a Quick Intelligence Audit and returns the report inline |
extract_page_markdown | Free | Returns one page as clean Markdown with title, links, and word count |
extract_structured_data | Free | Returns JSON extracted against your own JSON Schema, re-validated before return |
audit_agent_readiness | $0.075 | Returns the x402 handoff for the full Agent Readiness audit |
feed_parse | $0.003 | Returns the x402 handoff for RSS / Atom / JSON Feed normalization |
link_map | $0.003 | Returns the x402 handoff for a categorized link map |
summarize | $0.033 | Returns the x402 handoff for a structured page summary |
All prices are USDC on Base mainnet (eip155:8453). The three free previews share one quota: one call per day per identity.
That identity matters when Grok is the caller. Without a token the quota is keyed on the calling IP — and a hosted agent reaches this server from xAI infrastructure, so a single daily call is shared by every Grok user at once. Pass a token and the quota moves onto that individual user instead. Every free tool accepts one:
# once per user — 6-digit code by email, token valid 30 days
curl -X POST https://api.santosautomation.com/api/leads/verify/request \
-H 'Content-Type: application/json' \
-d '{"email":"you@example.com","url":"https://example.com"}'
curl -X POST https://api.santosautomation.com/api/leads/verify/confirm \
-H 'Content-Type: application/json' \
-d '{"email":"you@example.com","code":"123456"}'
# then pass it as a tool argument
{"name":"audit_website_preview","arguments":{"url":"https://example.com","token":"<token>"}}An invalid token is rejected outright rather than silently falling back to the shared IP allowance. For anything beyond evaluation, pay per call — there is no quota on the paid endpoints.
Start free, no wallet
Ask Grok to audit a URL and it will reach for audit_website_preview on its own. That call executes end to end and returns scores, pass/fail checks, and remediation guidance inline — no payment, no wallet, no configuration beyond the one line above. Same for extract_page_markdown and extract_structured_data. This is the fastest way to confirm the wiring works before a key is ever involved.
Then pay per call
Paid tools need a funded EVM wallet holding USDC on Base mainnet. Fund a dedicated key with only what you expect to spend — never a treasury or personal key. There is still no account and no API key: authorization is the signed payment itself, carried in the HTTP request. A failed call is never charged.
Step four
The handoff pattern
This is the part worth understanding. A paid MCP tool does not settle payment. It validates the target, then returns the exact HTTP request to pay for — method, URL, price, network, and protocol. Your agent, or a thin wrapper around it, performs the settlement. Santos never holds a key of yours and never signs on your behalf.
Grok → santos.audit_agent_readiness(url)
← canonical x402 request + price + network
→ your wrapper retries that URL with a PAYMENT-SIGNATURE header
← 200 · versioned evidence + PAYMENT-RESPONSE receipt
The tool result comes back on MCP’s error channel — isError: true with one text block. That is deliberate: a payment-required result is not a finished answer, and signalling it as an error keeps the model from reporting a price quote as though it were an audit. The text names the price, the exact URL to pay for, and the free preview:
{
"isError": true,
"content": [
{
"type": "text",
"text": "PAYMENT_REQUIRED: Agent Readiness costs $0.075 USDC per successful
audit on Base mainnet via x402 v2. Request
https://api.santosautomation.com/api/agent-readiness?url=https%3A%2F%2Fexample.com%2F&depth=quick
without a signature to receive PAYMENT-REQUIRED terms, then sign and
retry with PAYMENT-SIGNATURE. Free preview: GET
https://api.santosautomation.com/api/agent-readiness/demo?url=https%3A%2F%2Fexample.com%2F
(1/day per IP, shared quota, same result shape)."
}
]
}Settling it is a single wrapped fetch against that URL. Any x402 v2 client works; the payment step is identical to the one in the CI recipe.
// Any x402 v2 client settles the URL named in the handoff text.
import { privateKeyToAccount } from "viem/accounts";
import { wrapFetchWithPaymentFromConfig } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm";
const fetchWithPay = wrapFetchWithPaymentFromConfig(fetch, {
schemes: [{
network: "eip155:8453",
client: new ExactEvmScheme(privateKeyToAccount(process.env.X402_PRIVATE_KEY)),
}],
});
// Build the same URL the handoff names — the 402, signing, and retry are automatic.
const target = "https://example.com";
const res = await fetchWithPay(
`https://api.santosautomation.com/api/agent-readiness?url=${encodeURIComponent(target)}&depth=quick`
);
const report = await res.json();
console.log(report.website_intelligence_score);Rationale
Why this works
MCP does the discovery
Tools carry strict JSON Schemas for both input and output, so Grok selects and calls them without glue code or prompt scaffolding. Registered in the official MCP Registry as com.santosautomation/site-audit.
x402 removes onboarding
Payment travels inside the HTTP request. No signup, no key rotation, no invoice, no per-seat plan — an autonomous agent can transact without a human provisioning anything first.
Settlement only on success
Funds move only on a 2xx response. A timeout, an unreachable target, or a target that fails validation costs nothing, so a retrying agent cannot burn money on failures.
Applicability-aware scoring
An informational site is not penalized for lacking an API, MCP, or machine commerce. Checks that do not apply are marked non-applicable rather than failed, and every report states its own evidence coverage.
Verifiable output
Every report is HMAC-SHA256 signed and independently checkable at /verify. An agent can prove a score came from Santos and was not altered in transit.
We hold ourselves to it
Santos scores 100/100 on its own Agent Readiness audit — first of 311 public reports, against an index average of 59.6. The report is public, signed, and re-runnable.
Contracts
Machine surfaces
Everything Grok needs to reason about this service is public and versioned. Current release and live status are always machine-readable.