Integrate MainStreet in 10 lines

Reputation oracle for AI agents on Base. Free score lookup. $0.25 USDC for full audit via x402. Works with every major agent stack.

Claude Desktop / Claude Code MCP

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.

Cursor MCP

Add to .cursor/mcp.json:

{
  "mcpServers": {
    "mainstreet": {
      "command": "npx",
      "args": ["-y", "@raskhaaa/mainstreet-oracle", "mainstreet-mcp"]
    }
  }
}

LangChain (Python) REST

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

Vercel AI SDK REST

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()),
});

Coinbase AccountKit / AgentKit x402 $0.25

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

Solidity (onchain verifier) EIP-712 oracle-grade

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.

Old reference snippet (raw ecrecover, no interface)
// 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.

viem (off-chain verifier) EIP-712

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

Raw HTTP curl

# 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

Postman collection import

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.

CLI npm

npx @raskhaaa/mainstreet-oracle score 0xAC3ca7c5d3cDD7702fd08F9C4C28dAA22296aDa9
npx @raskhaaa/mainstreet-oracle audit 0xAC3ca7c5d3cDD7702fd08F9C4C28dAA22296aDa9
npx @raskhaaa/mainstreet-oracle catalog
npx @raskhaaa/mainstreet-oracle leaderboard 20

Discovery surfaces