XentFi MCP Server
Enables AI agents to interact with the XentFi API for Bitcoin and stablecoin payment operations, including deposit addresses, transfers, signing, and AML screening. Supports read-only mode to prevent irreversible on-chain actions.
README
XentFi MCP Server
An open-source Model Context Protocol (MCP) server for the XentFi API — Bitcoin and stablecoin payment infrastructure (deposit addresses, master wallets, transfers, asset recovery, transaction/message signing, AML screening, payment links, and webhooks).
It exposes all 61 operations from the official XentFi OpenAPI specification as MCP tools, so any MCP-compatible client (Claude, Claude Code, Claude Desktop, or any other MCP host) can call the XentFi API directly on your behalf.
This project is generated from the spec, not hand-maintained: openapi/xentfi.openapi.json is the single source of truth, and npm run generate regenerates every tool definition from it. This keeps tool names, input schemas, and descriptions in sync with the official API reference instead of drifting over time. See Architecture below.
⚠️ Before you start: this server can move real funds
Several tools in this server call XentFi endpoints that are irreversible on-chain actions: transferring assets, recovering assets from a wallet, and signing transactions/messages/typed data. There is no "undo" for a blockchain transaction.
- Start with
XENTFI_READ_ONLY=true(see Configuration) while you evaluate the server. This registers only the 28 read-only (GET) tools and completely omits transfer, recovery, and signing tools. - Only point the server at a sandbox/testnet XentFi environment until you're confident in your client's behavior.
- Review Safety & read-only mode before connecting this to an agent that can act autonomously.
- The
whitelist_deposit_addresstool has an optionalprivatekeyfield defined by the API. Avoid ever putting a real private key in front of an LLM if you can avoid it — see the inline warning on that tool.
Quick start
1. Install
git clone https://github.com/xentfi/xentfi-mcp-server.git
cd xentfi-mcp-server
npm install
npm run build
2. Configure credentials
Copy .env.example to .env and fill in your XentFi API credentials (found in your XentFi dashboard), or set the equivalent environment variables directly in your MCP client config (see below).
| Variable | Required | Description |
|---|---|---|
XENTFI_API_KEY |
Yes | Sent as the apiKey header on every request. |
XENTFI_ORG_ID |
Yes | Sent as the orgId header on every request. |
XENTFI_API_BASE_URL |
No | XentFi API base URL. Defaults to https://api.xentfi.com |
XENTFI_TIMEOUT_MS |
No | Request timeout in ms. Default 30000. |
XENTFI_READ_ONLY |
No | true to register only GET tools. Default false. |
XENTFI_DEBUG |
No | true for verbose stderr request/response logging (secrets are redacted). Default false. |
3. Connect it to an MCP client
Claude Desktop / Claude Code — add to your MCP config (e.g. claude_desktop_config.json):
{
"mcpServers": {
"xentfi": {
"command": "node",
"args": ["/absolute/path/to/xentfi-mcp-server/dist/index.js"],
"env": {
"XENTFI_API_KEY": "your-api-key",
"XENTFI_ORG_ID": "your-org-id",
"XENTFI_API_BASE_URL": "https://api.xentfi.com",
"XENTFI_READ_ONLY": "true"
}
}
}
}
A ready-to-copy version of this lives in examples/claude_desktop_config.json.
Any other MCP client: point it at node dist/index.js with the same environment variables — the server speaks standard MCP over stdio.
4. Verify it's working
npx @modelcontextprotocol/inspector node dist/index.js
This opens the official MCP Inspector so you can browse and manually test every tool before wiring up a real client.
Architecture
openapi/xentfi.openapi.json <- source of truth: the official XentFi API spec
│
▼ npm run generate (scripts/generate-tools.cjs)
src/tools/*.ts <- generated declarative ToolDefinition[] per resource
│
▼
src/toolEngine.ts <- generic engine: ToolDefinition -> live MCP tool
│
▼
src/server.ts, src/client.ts <- MCP server wiring + XentFi HTTP client
│
▼
src/index.ts <- stdio entrypoint
openapi/xentfi.openapi.json— the canonical XentFi OpenAPI 3 spec. Replace this file with an updated spec whenever the XentFi API changes.scripts/generate-tools.cjs— reads the spec and writes onesrc/tools/<resource>.tsfile per resource group (Addresses, Master Wallets, Signing, Payment Links, Assets, AML, Webhooks), each exporting aToolDefinition[]. Also writessrc/tools/index.ts, which aggregates everything intoallTools.src/toolEngine.ts— a single generic function (registerTools) turns everyToolDefinitioninto a liveserver.registerTool(...)call: building the request from path/query/body params, calling the XentFi API, and mapping the response (or error) into MCP tool content. There is exactly one code path for all 61 tools — no per-endpoint handler code to maintain.src/client.ts— a small dependency-freefetch-based HTTP client that adds theapiKey/orgIdauth headers, handles timeouts, and normalizes errors intoXentfiApiError.
Because tool generation is a build step, the generated src/tools/*.ts files are committed to the repo — you get readable, reviewable TypeScript in pull requests, while still getting spec-driven regeneration whenever openapi/xentfi.openapi.json changes.
Regenerating after a spec update
# replace openapi/xentfi.openapi.json with the new spec, then:
npm run generate # rewrites src/tools/*.ts
npm run typecheck # confirm nothing broke
npm run build
Safety & read-only mode
Every tool is annotated per the MCP tool annotations spec (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) so MCP clients that respect these hints can prompt for confirmation appropriately. In addition:
- Setting
XENTFI_READ_ONLY=trueprevents any non-GETtool from being registered at all — the model literally cannot callcreate_master_transfer,recover_assets_from_address,sign_master_transaction, etc., because they don't exist in the tool list. - Tools under
.../transfer/...,.../recover, and.../signing/...are markeddestructiveHint: trueregardless of read-only mode, since they represent irreversible on-chain actions. - The server's MCP
instructionsfield tells the connecting model to confirm details with the user before calling fund-moving or signing tools, and to prefer read-only tools to gather context first. (This is guidance to the model, not an enforcement mechanism —XENTFI_READ_ONLYis the actual enforcement mechanism.) - All logging goes to stderr only. The stdio MCP transport uses stdout exclusively for the JSON-RPC protocol stream; nothing else may write there.
Tool reference
All 61 XentFi API operations are available as tools, grouped by resource. Descriptions below are summaries — each tool's full MCP description (visible to the connecting model) includes the complete OpenAPI description, HTTP method/path, and tags.
Note on spec quirk: the official spec's
summaryfields forPOST /v1/addresses/{addressId}/transfer/execute("Create address transfer quote") andPOST /v1/addresses/{addressId}/transfer/estimate-gas("Execute address transfer quote") appear to be swapped relative to their path names. This server mirrors the spec exactly rather than silently reinterpreting it — verify behavior against your XentFi environment before relying on either tool, and consider filing this with the XentFi API team.
Addresses
| Tool name | Method | Path | Description |
|---|---|---|---|
list_deposit_addresses |
GET | /v1/addresses |
List deposit addresses |
create_depositeaddress |
POST | /v1/addresses |
Create deposit address |
whitelist_deposit_address |
POST | /v1/addresses/whitelist |
Whitelist an existing deposit address |
get_deposit_address |
GET | /v1/addresses/{addressId} |
Get single deposit address |
enable_address_monitoring |
POST | /v1/addresses/{addressId}/monitoring/{blockchainId}/enable |
Enable address monitoring |
disable_address_monitoring |
POST | /v1/addresses/{addressId}/monitoring/{blockchainId}/disable |
Disable address monitoring |
list_address_transfers |
GET | /v1/addresses/{addressId}/transfers |
List address transfers |
get_address_token_balance |
GET | /v1/addresses/{addressId}/balance |
Get address token balance |
list_address_settlement_rules |
GET | /v1/addresses/{addressId}/settlement-rules |
List address settlement rules |
create_address_settlement_rule |
POST | /v1/addresses/{addressId}/settlement-rules |
Create address settlement rule |
get_address_settlement_rule |
GET | /v1/addresses/settlement-rules/{ruleId} |
Get single settlement rule |
update_addres_settlement_rule |
PUT | /v1/addresses/settlement-rules/{ruleId} |
Update settlement rule |
delete_address_settlement_rule |
DELETE | /v1/addresses/settlement-rules/{ruleId} |
Delete settlement rule |
create_address_quote_transfer |
POST | /v1/addresses/{addressId}/transfer/execute |
Create address transfer quote |
execute_address_quote_transfer |
POST | /v1/addresses/{addressId}/transfer/estimate-gas |
Execute address transfer quote |
recover_assets_from_address |
POST | /v1/addresses/{addressId}/recover |
Recover assets from an address |
get_recoverable_assets_for_address |
GET | /v1/addresses/{addressId}/recoverable-assets |
Get recoverable assets for an address |
Master Wallets
| Tool name | Method | Path | Description |
|---|---|---|---|
list_master_wallets |
GET | /v1/master-wallets |
List master wallets |
create_master_wallet |
POST | /v1/master-wallets |
Create master wallet |
get_master_wallet |
GET | /v1/master-wallets/{masterId} |
Get single master wallet |
enable_master_monitoring |
POST | /v1/master-wallets/{masterId}/monitoring/{blockchainId}/enable |
Enable monitoring |
disable_master_monitoring |
POST | /v1/master-wallets/{masterId}/monitoring/{blockchainId}/disable |
Disable monitoring |
list_master_wallet_transfers |
GET | /v1/master-wallets/{masterId}/transactions |
List master wallet transfers |
get_master_token_balance |
GET | /v1/master-wallets/{masterId}/balance |
Get master wallet token balance |
list_master_settlement_rules |
GET | /v1/master-wallets/{masterId}/settlement-rules |
List master settlement rules |
create_master_settlement_rule |
POST | /v1/master-wallets/{masterId}/settlement-rules |
Create master settlement rule |
get_master_settlement_rule |
GET | /v1/master-wallets/settlement-rules/{ruleId} |
Get single settlement rule |
update_master_settlement_rule |
PUT | /v1/master-wallets/settlement-rules/{ruleId} |
Update settlement rule |
delete_master_settlement_rule |
DELETE | /v1/master-wallets/settlement-rules/{ruleId} |
Delete settlement rule |
create_master_transfer |
POST | /v1/master-wallets/{masterId}/transfer/execute |
Create and execute master transfer |
estimate_master_transfer_gas |
POST | /v1/master-wallets/{masterId}/transfer/estimate-gas |
Estimate gas fee for master transfer |
recover_assets_from_master |
POST | /v1/master-wallets/{masterId}/recover |
Recover assets from a master wallet |
get_recoverable_assets_for_master |
GET | /v1/master-wallets/{masterId}/recoverable-assets |
Get recoverable assets for a master wallet |
Signing
| Tool name | Method | Path | Description |
|---|---|---|---|
sign_master_transaction |
POST | /v1/master-wallets/{masterId}/signing/transaction |
Sign a transaction using a master wallet |
sign_master_message |
POST | /v1/master-wallets/{masterId}/signing/message |
Sign a message using a master wallet |
sign_master_typed_data |
POST | /v1/master-wallets/{masterId}/signing/typed-data |
Sign typed data (EIP-712) using a master wallet |
sign_address_transaction |
POST | /v1/addresses/{addressId}/signing/transaction |
Sign a transaction using an address wallet |
sign_address_message |
POST | /v1/addresses/{addressId}/signing/message |
Sign a message using an address wallet |
sign_address_typed_data |
POST | /v1/addresses/{addressId}/signing/typed-data |
Sign typed data (EIP-712) using an address wallet |
Payment Links
| Tool name | Method | Path | Description |
|---|---|---|---|
list_payment_links |
GET | /v1/payment-links |
List payment links |
create_payment_link |
POST | /v1/payment-links |
Create payment link |
get_payment_link |
GET | /v1/payment-links/{id} |
Get single payment link |
update_payment_link |
PUT | /v1/payment-links/{id} |
Update payment link |
list_payment_transfers |
GET | /v1/payment-transfers |
List payment transfers |
get_payment_transfer |
GET | /v1/payment-transfers/{id} |
Get single payment transfer |
Assets
| Tool name | Method | Path | Description |
|---|---|---|---|
list_supported_blockchains |
GET | /v1/assets/blockchains |
List supported blockchains |
get_blockchain |
GET | /v1/assets/blockchains/{id} |
Get blockchain by ID or slug |
list_supported_tokens |
GET | /v1/assets/tokens |
List supported tokens with optional filtering |
get_token |
GET | /v1/assets/tokens/{id} |
Get token by ID or symbol |
get_token_price |
GET | /v1/assets/prices/tokens/{symbol} |
Get token price by symbol |
get_token_prices |
POST | /v1/assets/prices/tokens |
Get prices for multiple tokens |
AML
| Tool name | Method | Path | Description |
|---|---|---|---|
check_sanctions |
GET | /v1/aml/check/{address} |
Check if an address is sanctioned |
check_multiple_sanctions |
POST | /v1/aml/check-batch |
Check multiple addresses for sanctions |
Webhooks
| Tool name | Method | Path | Description |
|---|---|---|---|
list_webhook_subs |
GET | /v1/webhooks |
List webhook subscriptions |
create_webhook |
POST | /v1/webhooks |
Create webhook subscription |
get_webhook_sub |
GET | /v1/webhooks/{subscriptionId} |
Get webhook subscription details |
update_webhook |
PUT | /v1/webhooks/{subscriptionId} |
Update webhook subscription |
rotate_webhook_secret |
POST | /v1/webhooks/{subscriptionId}/secret/rotate |
Rotate webhook secret |
listt_webhook_events |
GET | /v1/webhook-events |
List webhook events |
get_webhook_event |
GET | /v1/webhook-events/{eventId} |
Get webhook event details |
send_test_webhook_event |
POST | /v1/webhooks/{subscriptionId}/test |
Send a test webhook event |
Development
npm install
npm run generate # regenerate src/tools/*.ts from openapi/xentfi.openapi.json
npm run typecheck # tsc --noEmit
npm run build # compile to dist/
npm run inspector # launch MCP Inspector against the built server
Project layout:
openapi/xentfi.openapi.json Canonical API spec (source of truth)
scripts/generate-tools.cjs Codegen: spec -> src/tools/*.ts
src/
types.ts ToolDefinition type
config.ts Env var loading/validation
client.ts XentFi HTTP client (auth, timeouts, errors)
logger.ts stderr-only logger with secret redaction
toolEngine.ts Generic ToolDefinition -> MCP tool registration
server.ts McpServer construction
index.ts stdio entrypoint
tools/*.ts Generated tool definitions (committed, not hand-edited)
examples/ Sample MCP client configs
See CONTRIBUTING.md for how to propose changes.
License
MIT — this is an independent, community-maintained integration and is not an official XentFi release artifact unless stated otherwise by XentFi. Contributions welcome.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.