Reputation oracle for AI agents on Base. Free score lookup. $0.25 USDC for full audit via x402. Works with every major agent stack.
Add to ~/.claude/config.json:
{
"mcpServers": {
"mainstreet": {
"command": "npx",
"args": ["-y", "@raskhaaa/mainstreet-oracle", "mainstreet-mcp"]
}
}
}
Restart Claude. New tools available: mainstreet_score, mainstreet_audit_info, mainstreet_catalog, mainstreet_leaderboard, mainstreet_compare, mainstreet_search, mainstreet_agents_of_interest, mainstreet_revenue, mainstreet_history, mainstreet_recommend.
Add to .cursor/mcp.json:
{
"mcpServers": {
"mainstreet": {
"command": "npx",
"args": ["-y", "@raskhaaa/mainstreet-oracle", "mainstreet-mcp"]
}
}
}
import requests
from langchain.tools import Tool
def mainstreet_score(address: str) -> dict:
r = requests.get(f"https://avisradar.app/api/agent/score/{address}")
return r.json()
score_tool = Tool(
name="mainstreet_score",
description="Get 0-100 reputation score for an onchain AI agent on Base.",
func=mainstreet_score,
)
import { tool } from 'ai';
import { z } from 'zod';
export const mainstreetScore = tool({
description: 'Reputation score for an onchain AI agent on Base (0-100).',
inputSchema: z.object({ address: z.string() }),
execute: async ({ address }) =>
fetch(`https://avisradar.app/api/agent/score/${address}`).then(r => r.json()),
});
Pay /audit with your smart wallet:
import { wrapAxiosWithPaymentFromConfig } from '@x402/axios';
import { ExactEvmScheme } from '@x402/evm';
import { privateKeyToAccount } from 'viem/accounts';
import axios from 'axios';
const account = privateKeyToAccount(process.env.WALLET_PRIVATE_KEY);
const api = wrapAxiosWithPaymentFromConfig(axios.create(), {
schemes: [{ network: 'eip155:8453', client: new ExactEvmScheme(account) }],
});
const result = await api.get(
'https://avisradar.app/api/agent/audit/0x...'
); // 360-degree due-diligence, settled in USDC on Base
Deployed verifier contract on Base mainnet: 0x7397adb9713934c36d22aa54b4dbbcd70263592b · basescan · ABI
Smart contracts can verify MainStreet scores onchain via ecrecover. Off-chain compute, on-chain proof. Same trust model as Chainlink CCIP-Read.
// One-line integration in your buyer contract
interface IMainStreetVerifier {
function requireMinScore(
bytes32 subject, uint8 minScore,
uint8 score, uint64 timestamp, uint64 nonce,
bytes calldata signature
) external view returns (bool);
}
contract MyBuyer {
IMainStreetVerifier constant MS = IMainStreetVerifier(0x7397adb9713934c36d22aa54b4dbbcd70263592b);
function payAgent(
address agent, uint256 amount,
bytes32 subject, uint8 score, uint64 timestamp, uint64 nonce, bytes calldata sig
) external {
MS.requireMinScore(subject, 50, score, timestamp, nonce, sig);
// ... your payment logic — only runs if MainStreet score >= 50 ...
}
}
Caller fetches { subject, score, timestamp, nonce, signature } from GET /api/agent/attestation/{address}, passes inline as tx calldata. No oracle subscription, no upkeep, no per-call fee.
// Minimal verifier — smart contract checks MainStreet score before tx
function requireMainStreetScore(
address subject, uint256 minScore,
uint256 score, uint256 timestamp, uint256 nonce,
bytes calldata signature
) external view {
bytes32 structHash = keccak256(abi.encode(
keccak256("Attestation(string version,string subjectType,address subject,uint256 score,uint256 timestamp,address operator,uint256 nonce)"),
keccak256(bytes("0.1")), keccak256(bytes("agent-onchain")),
subject, score, timestamp,
address(0xAC3ca7c5d3cDD7702fd08F9C4C28dAA22296aDa9), nonce
));
bytes32 domain = keccak256(abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId)"),
keccak256(bytes("MainStreet")), keccak256(bytes("1")), uint256(8453)
));
bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domain, structHash));
address signer = ECDSA.recover(digest, signature);
require(signer == 0xAC3ca7c5d3cDD7702fd08F9C4C28dAA22296aDa9, "MainStreet: invalid signer");
require(score >= minScore, "MainStreet: score below threshold");
require(block.timestamp - timestamp < 1 days, "MainStreet: attestation stale");
}
Caller fetches the signed payload from GET /api/agent/attestation/{address}, passes it inline as tx calldata. No oracle node, no subscription, no upkeep.
import { recoverTypedDataAddress } from 'viem';
const att = await fetch('https://avisradar.app/api/agent/attestation/0x...').then(r => r.json());
const signer = await recoverTypedDataAddress({
domain: att.eip712.domain,
types: att.eip712.types,
primaryType: 'Attestation',
message: att.payload,
signature: att.signature,
});
console.assert(signer.toLowerCase() === att.verifyHints.signer.toLowerCase());
// Trust: att.payload.score is signed by MainStreet operator
# Free — cached snapshot
curl https://avisradar.app/api/agent/score/0xAC3ca7c5d3cDD7702fd08F9C4C28dAA22296aDa9
# Paid — live re-fetch ($0.05 via x402)
curl https://avisradar.app/api/agent/score/0xAC3ca7c5d3cDD7702fd08F9C4C28dAA22296aDa9?live=1
# Paid — full audit ($0.25 via x402)
curl https://avisradar.app/api/agent/audit/0xAC3ca7c5d3cDD7702fd08F9C4C28dAA22296aDa9
Import directly from URL into Postman:
https://avisradar-production.up.railway.app/mainstreet.postman_collection.json
14 pre-configured requests covering all free + paid endpoints. Open Postman → File → Import → Link → paste.
npx @raskhaaa/mainstreet-oracle score 0xAC3ca7c5d3cDD7702fd08F9C4C28dAA22296aDa9
npx @raskhaaa/mainstreet-oracle audit 0xAC3ca7c5d3cDD7702fd08F9C4C28dAA22296aDa9
npx @raskhaaa/mainstreet-oracle catalog
npx @raskhaaa/mainstreet-oracle leaderboard 20
io.github.philpof102-svg/mainstreet53953 on Basemainstreetxyz.base.eth (12 onchain text records: agent, x402.payTo, erc8004.agentId, etc.)