Use Stellar Intel through AI agents via the Model Context Protocol (MCP) server.
The deployed app serves the MCP server directly over Streamable HTTP, so a client needs a URL and nothing else — no clone, no npm install, no local process:
https://stellar-intel.vercel.app/api/mcp{
"mcpServers": {
"stellar-intel": {
"type": "http",
"url": "https://stellar-intel.vercel.app/api/mcp"
}
}
}The endpoint is stateless: send JSON-RPC over POST with Accept: application/json, text/event-stream; there is no Mcp-Session-Id to track. It is built from the same createServer() in lib/mcp/server.ts as the package and the stdio dev server, so it serves the same eight tools, prompts and resources as the package. Requests are rate-limited to 60 per minute per IP.
@stellarintel/mcp is not yet on npm — running npm install @stellarintel/mcp returns 404 today. Use the hosted endpoint above, or run the server from this repository (see Installation below).
The MCP server exposes Stellar Intel's off-ramp routing and anchor intelligence to MCP-capable agents over stdio or streamable HTTP. It reuses the same routing and canonical-hashing logic as the web app.
The server ships as @stellarintel/mcp, which is not yet published to npm. It runs from this repository today.
The package is not on npm yet, so install it from this repository:
git clone https://github.com/ezedike-evan/stellar-intel
cd stellar-intel
npm install# Build and run the MCP package over stdio (from the repo root)
npm run build --workspace=@stellarintel/mcp # tsc -> dist/
npm start --workspace=@stellarintel/mcp # node dist/packages/mcp/src/index.js
# Streamable HTTP instead of stdio — binds http://127.0.0.1:3000/mcp
npx tsx packages/mcp/src/index.ts --transport http --port 3000
# In-repo dev server (stdio only)
npx tsx scripts/mcp/server.tsPoint any MCP-capable client (Claude Desktop, an agent framework, etc.) at the tsx command as a stdio server, or at the /mcp URL when using the HTTP transport. The intel.anchor.* tools call the Stellar Intel HTTP API at NEXT_PUBLIC_APP_URL (default http://localhost:3000), so they need a running app instance.
Returns the best net-received quote for a corridor + amount. The rate is sourced from the routed anchor's current price (SEP-38 firm quote, falling back to SEP-24/SEP-6 fee-adjusted live FX) — it can return RATE_UNAVAILABLE if the anchor cannot currently be quoted.
{
"from": "USDC",
"to": "NGN",
"amount": "100"
}{
"anchor": "cowrie",
"quoteId": "<64-hex sha256>",
"netReceived": "156800",
"expiresAt": "2026-…Z"
}Returns an unsigned intent envelope plus an unsigned Stellar transaction for an agent to sign. The intentHash is the canonical SHA-256 hash the agent signs.
An off-ramp intent without a signature:
{
"type": "offramp",
"sourceAsset": "USDC",
"destinationAsset": "NGN",
"amount": "100",
"sender": "GABC…",
"recipient": "GBDEST…"
}{
"unsignedEnvelope": {
"intent": { … },
"intentHash": "<sha256-hex>"
},
"unsignedTx": "<base64-xdr>"
}Carries a prepared intent through to execution. Stellar Intel never signs anything — the calling agent signs the intentHash and the unsignedTx from intel.offramp.prepare with its own wallet before calling this tool. The server verifies the signed material still matches the prepared intent, then submits the transaction to Horizon; any mismatch is rejected before anything reaches the network.
{
"unsignedEnvelope": {
"intent": { "type": "offramp", … },
"intentHash": "<64-hex sha256>"
},
"signature": "<base64 ed25519 sig over intentHash>",
"signedTx": "<base64 signed transaction XDR>"
}{
"status": "submitted",
"hash": "<64-hex tx hash>",
"ledger": 12345,
"corridorId": "usdc-ngn",
"anchorId": "cowrie"
}Returns 7/30/90-day rolling percentile scorecards for an anchor. Each scorecard shows state (ok or insufficient_data), sample size, fill rate, settlement latency percentiles (p50/p95), and slippage percentiles (p50/p95).
{ "anchor": "cowrie" }{
"anchorId": "cowrie",
"scorecards": {
"7": {
"state": "ok",
"window": 7,
"sampleSize": 42,
"fillRate": 0.97,
"settleMs": { "p50": 41000, "p95": 92000 },
"slippage": { "p50": 0.001, "p95": 0.004 },
"computedAt": "2026-…Z",
"lastPublisherTxTimestamp": "2026-…Z"
}
}
}Returns the current status, consecutive failure count, degraded flag, last check timestamp, last error message, and staleness flag for a given anchor domain and optional asset.
{
"domain": "anclap.com",
"asset": "USDC"
}{
"anchorId": "anclap",
"status": "healthy",
"consecutiveFailures": 0,
"degraded": false,
"lastCheckedAt": "2026-…Z",
"lastError": null,
"stale": false
}Answers whether the reputation data is trustworthy yet, so an agent can check before believing a score. Same payload as GET /api/reputation/probe-coverage for the same moment. Takes no input.
{
"thresholdDays": 90,
"asOfDay": "2026-…",
"fleetThresholdMet": false,
"daysUntilFleetThreshold": 47,
"anchors": [
{ "anchorId": "cowrie", "continuousDays": 43, "thresholdMet": false }
]
}Ranks anchors by corridor, delegating to GET /api/reputation/leaderboard. Each entry carries its standing label and the measured/unmeasured distinction the raw API expresses as n === 0. Omit the corridor to rank every registered anchor globally.
{
"corridor": "usdc-ngn"
}Lists every corridor Stellar Intel currently surfaces, with its id, display name, source asset, destination fiat currency, country, and the anchors that serve it. Call it before any tool that takes a corridor id rather than guessing one. Flag-gated corridors that the UI hides are omitted. Takes no input.
{
"count": 6,
"corridors": [
{
"id": "usdc-ngn",
"displayName": "Nigeria (USDC → NGN)",
"from": "USDC",
"fromIssuer": "GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN",
"fromPeg": "USD",
"to": "NGN",
"countryCode": "NG",
"countryName": "Nigeria",
"anchors": [
{ "id": "cowrie", "name": "Cowrie", "homeDomain": "cowrie.exchange" }
]
}
]
}The server also registers two prompts, so an agent can start from an intent instead of assembling the tool calls itself.
Arguments { from, to }. Compares the anchors available on a corridor so the agent can pick one before quoting.
Arguments { from, to, amount, sender, recipient }. Walks quote → prepare → execute, leaving the signature to the agent.
Non-custodial by design. The MCP server never holds signing keys. It can prepare intents and unsigned transactions, and intel.execute only verifies material the sender's own wallet has already signed — the intent hash and the transaction itself — before submitting to Horizon. Nothing can be spent without a signature produced outside this server, and signed material that no longer matches the prepared intent is rejected.
Tests are located in the main app repository:
# Unit tests
npm run test -- tests/mcp-offramp.spec.ts
# E2E tests (spawns server + real MCP client, stdio and HTTP)
npm run test -- tests/mcp-e2e.spec.ts tests/mcp-http-e2e.spec.ts