Solana X402 Compliance

io.github.msantagiulianabPublished by GitHub account msantagiulianabv1.0.7Updated Oct 25, 2026

RFC 9110 x402 Solana compliance screening and micropayments gateway for AI agents.

VerifiedSTDIODesktop onlyFinanceSecurity & Monitoring

Overview

AI-generated overview

Screens Solana addresses and transactions against sanctions and threat lists, settling x402 micropayments automatically through a payment gateway.

What you can do
Screen a Solana address against sanctions and threat intelligence, returning a verdict, risk score and flags, with the x402 micropayment negotiated and settled automatically on each call. Generate an immutable compliance report for a wallet address or transaction signature, which stays UNSCREENED until that identifier has been live-screened in the same session. Check the status, limits and settlement state of an x402 payment channel.
When to use it
Useful when an assistant needs on-demand Solana compliance checks or audit-style reports before transacting with a wallet, and when the caller is set up to pay per-call x402 micropayments through a gateway.
Requirements
Runs locally over stdio via npx, so Node.js is needed. It talks to a remote payment gateway; the gateway URL and channel id are set through the X402_GATEWAY_URL and X402_CHANNEL_ID environment variables. An optional X402_PRIVATE_KEY_SEED supplies the signing key material and otherwise falls back to a deterministic smoke-test seed.
Before you install
Each screening call settles a real x402 micropayment in USDC, so calls spend funds. The signing seed (X402_PRIVATE_KEY_SEED) is key material and should not be left at the public default for anything beyond testing. Addresses and transaction signatures are sent to the remote gateway. Reports are held in an in-memory session ledger and fail closed as UNSCREENED until screened.

Installation

In SourceWeft

  1. Open Solana X402 Compliance in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

x402 MCP Server

A lightweight, zero-bloat Model Context Protocol (MCP) server that exposes the Solana Enterprise Payment Gateway's POST /api/v1/compliance/screen-address endpoint as an autonomous tool for AI agents (Claude Desktop, Cursor, VS Code Cline, ElizaOS).

The agent transparently negotiates and settles the x402 micro-payment on every screen: it receives the HTTP 402 Payment Required challenge, signs an Ed25519 channel voucher in-memory (Node.js built-in crypto, no Web3 SDK), and retries with a PAYMENT-SIGNATURE header.

Standalone npm package

The server is published to the npm registry as a standalone package — no clone or build step is required to run it:

bash
npx -y @msantagiulianab/x402-mcp-server

See package.json for the current version and metadata. The package ships the compiled ESM dist/ bundle plus this README and the LICENSE.

Layout

agent-tools/mcp-server/├── src/│   ├── base58.ts          # zero-dependency Base58 codec│   ├── ed25519.ts         # Node crypto Ed25519 keypair + canonical payload│   ├── x402-client.ts     # autonomous X402Client (402 -> sign -> retry)│   └── index.ts           # MCP server + tool registration├── test/                  # offline unit + stdio integration tests├── test-agent-call.js     # live verification against the running Docker stack├── package.json├── smithery.yaml          # Smithery registry manifest└── tsconfig.json

Install & build

bash
cd agent-tools/mcp-servernpm installnpm run build          # tsc -> dist/ (ESM)

Run (stdio transport)

bash
npx -y @msantagiulianab/x402-mcp-server   # published package# or, from a local checkout:npm start# or: node dist/index.js

Environment variables:

VariableDefaultPurpose
X402_GATEWAY_URLhttps://msb-solana-enterprise-payment-gateway.duckdns.orgGateway root URL
X402_CHANNEL_IDchan_smoke_test_001x402 payment channel id
X402_PRIVATE_KEY_SEEDsha256 of smoke-test-payer-seed-v164-hex or UTF-8 material seed

X402_GATEWAY_URL and X402_CHANNEL_ID are injected by the MCP host (Claude Desktop, Cline, Smithery, etc.); X402_PRIVATE_KEY_SEED is optional and defaults to the deterministic smoke-test payer.

The tool screen_solana_address:

  • Description: Inspect a Solana address against sanctions and threat intelligence databases. Automatically negotiates and settles micro-payments via x402.
  • Input: address — a valid Base58 Solana public key (decodes to 32 bytes).
  • Output: formatted JSON text containing verdict, riskScore, flags, and the evaluation timestamp.

The tool get_channel_status:

  • Description: Retrieve current operational status, limits, and settlement state of a given x402 payment channel.
  • Input: channel_id — the unique identifier of the payment channel.
  • Output: formatted JSON text containing status ("ACTIVE"), currency ("USDC"), network ("solana-devnet"), capacity ("10000.00"), and lastSettlementBlock.

The tool generate_compliance_report:

  • Description: Generate an immutable audit summary report for a Solana wallet address or transaction signature against sanctions and threat intelligence logs.
  • Input: identifier — a Solana wallet address (32-byte Base58) or a transaction signature (64-byte Base58).
  • Output: formatted JSON text containing complianceStatus ("PASSED" | "FLAGGED" | "UNSCREENED"), riskScore (a number for screened identifiers, null when unscreened), flags, sanctionsMatch, checkedLists ([] when unscreened, otherwise ["OFAC", "EU_SANCTIONS", "CHAIN_REPUTATION"]), lastEvaluated, evaluationTimestamp, timestamp, and reportId. The report fails closed: it references the session's in-memory screening ledger and returns "UNSCREENED" until the identifier has been live-screened via screen_solana_address.

Architecture & Sync Workflow

This component is one of three independently deployable surfaces in the repository. Changes flow differently depending on where they live:

Where the change livesSync / deploy action
Java backend (src/main/...)Push to GitHub, then git pull on the Hetzner VPS to rebuild/restart the container or jar.
MCP server (agent-tools/mcp-server/src/...)Bump version in package.json, then npm publish.
Documentation / smithery.yaml (README.md, smithery.yaml)Push to GitHub only — no VPS reload and no npm publish required.

The backend and the MCP server deploy independently: a Java change does not require an npm publish, and an MCP change does not require a VPS reload. Documentation and registry metadata (smithery.yaml) ship purely via GitHub.

smithery.yaml

smithery.yaml is the Smithery registry manifest. It declares the stdio startCommand (npx -y @msantagiulianab/x402-mcp-server) and exposes two configurable fields — gatewayUrl and channelId — which map onto the X402_GATEWAY_URL and X402_CHANNEL_ID environment variables. Updating it only requires a GitHub push; the Smithery registry indexes it directly from the repository.

Tests

bash
npm test

This compiles the project and runs:

  • base58.test.js — Base58 codec round-trips and 32-byte address validation.
  • ed25519.test.js — golden-vector check that the canonical payload and Ed25519 signature exactly match smoke-test.sh / the JVM PaymentVoucher layout.
  • x402-client.test.js — full 402→sign→retry negotiation against a mock gateway, with independent Ed25519 signature verification of the emitted voucher.
  • mcp-server.test.js — spawns the real server and drives it with an MCP client over stdio (list tools + call screen_solana_address).

Live verification against the running stack

With the Docker stack up (docker compose up -d --build):

bash
npm run test:tool

This exercises the tool handler against http://localhost:8080:

  • Clean address 4Nd1mBQtrMJVYVfKf2PJy9NZGibCcTRxpETqdrBHu19Y → CLEAR_TO_TRANSACT.
  • Flagged address Fc1EwQUZyTEagaDvA1utHXCcZNyG1x2PLt2DfNu1cJdH → BLOCKED.

Client configuration

Claude Desktop

Add to claude_desktop_config.json:

macOS / Linux

json
{  "mcpServers": {    "solana-x402-compliance": {      "command": "npx",      "args": ["-y", "@msantagiulianab/x402-mcp-server"],      "env": {        "X402_GATEWAY_URL": "https://msb-solana-enterprise-payment-gateway.duckdns.org",        "X402_CHANNEL_ID": "chan_smoke_test_001"      }    }  }}

Windows

json
{  "mcpServers": {    "solana-x402-compliance": {      "command": "cmd",      "args": ["/c", "npx", "-y", "@msantagiulianab/x402-mcp-server"],      "env": {        "X402_GATEWAY_URL": "https://msb-solana-enterprise-payment-gateway.duckdns.org",        "X402_CHANNEL_ID": "chan_smoke_test_001"      }    }  }}

VS Code Cline

Add to cline_mcp_settings.json:

json
{  "mcpServers": {    "solana-x402-compliance": {      "command": "npx",      "args": ["-y", "@msantagiulianab/x402-mcp-server"],      "env": {        "X402_GATEWAY_URL": "https://msb-solana-enterprise-payment-gateway.duckdns.org",        "X402_CHANNEL_ID": "chan_smoke_test_001"      }    }  }}

Cursor

Add an MCP server entry (Settings → MCP) pointing at the same npx -y @msantagiulianab/x402-mcp-server command with the environment variables above.

ElizaOS

Register a stdio-based MCP client plugin using the same npx -y @msantagiulianab/x402-mcp-server command; the tool screen_solana_address becomes callable by the agent.

Source: agent-tools/mcp-server/README.md at commit 6b2749f

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v1.0.7LatestSep 23, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts