Bit2Me MCP Server
Bit2Me MCP Server
An MCP (Model Context Protocol) server to interact with the Bit2Me ecosystem. This server allows AI assistants like Claude to access real-time market data, manage wallets, execute trading operations, and query products like Earn and Loans.
For more information, visit: https://mcp.bit2me.com
Bit2Me is a leading cryptocurrency exchange based in Spain, offering a wide range of services including trading, staking (Earn), and loans. This MCP server acts as a bridge, enabling LLMs to perform actions and retrieve data securely from your Bit2Me account.
๐ Features
General: Asset information, account details, portfolio valuation, and self-introspection (
general_describe_toolreturns description, schema, and examples for an enabled tool โ useful for LLMs encountering a tool for the first time).Wallet Management: Query balances, transactions, and wallet (Pockets) details.
Pro Trading: Manage orders (Limit, Market, Stop), query open orders, and transfer funds between Wallet and Pro.
Earn & Loans: Manage Earn (Staking) strategies and collateralized loans.
Operations: Execute trades, transfers, and withdrawals securely.
Write safeguards: Irreversible writes (Pro / Earn / Loan /
broker_confirm_quote) first return aneeds_confirmationpreview unlessconfirmis the booleantrue. Broker quote tools (broker_quote_*) do not require confirm. The preview includes the stampedidempotency_keyso a retry reuses it. Failed POST/DELETE calls retry with exponential backoff + jitter when that key is present.Category allow-list: Optional
BIT2ME_ENABLED_CATEGORIES(comma-separated:general,broker,wallet,pro,earn,loan) filterstools/listand dispatch. Unset = all. An unknown id is a startup/parse error.MCP tool annotations:
tools/listexposes hints fromtypeindata/tools.jsonโreadOnlyHinton READ/META,destructiveHinton irreversible WRITE (notbroker_quote_*),idempotentHinton cancel-order tools.structuredContent: Tool results include a
structuredContentobject alongside the existing text JSON (the text payload is unchanged).Resources:
bit2me://health,bit2me://server, andbit2me://catalog(enabled tools; no Bit2Me I/O). Same catalogue on stdio and HTTPresources/list/resources/read.Decimal Precision: Portfolio valuation uses
decimal.jsโ no floating-point drift on large balances or high-precision assets.Expanded PII Redaction: Logs automatically scrub email addresses, IBANs, phone numbers, KYC fields, JWT-shaped tokens, and long base64 blobs, in addition to API keys and signatures.
Monotonic Nonces: API-key signing uses a strictly-increasing nonce counter, preventing replay attacks even under high concurrency.
Audit Log: Every write tool (order creation, withdrawals, earn deposits, loan operations, โฆ) appends a tamper-evident JSON line on both success and failure. Set
AUDIT_LOG_PATHto write to a dedicated file; otherwise audit lines are emitted via the logger withaudit: true.Parametrized Prompts:
analyze_portfolioandmarket_summaryaccept arguments. Extra prompts:tax_report,dca_plan,loan_health_check, andconfirm_write(optionaltoolargument) for irreversible writes.
๐ ๏ธ Available Tools & API Endpoints
The server currently exposes 48 tools grouped as follows:
4 General tools (including
general_describe_toolfor self-introspection)8 Broker (Simple Trading) tools โ includes
wallet_get_cards(Bit2Me Teller). It stays inbrokerso the allow-list id does not change.4 Wallet tools
14 Pro Trading tools
11 Earn (Staking) tools
7 Loan tools
Full descriptions, response schemas, Bit2Me REST endpoints and usage notes live in TOOLS_DOCUMENTATION.md.
๐ Documentation & Schemas
All tool responses are normalised for LLM consumption (consistent naming, flattened payloads, concise metadata). Use the following references when developing new tooling:
docs/README.mdโ Map of every canonical doc (what to edit vs what is generated).TOOLS_DOCUMENTATION.mdโ Auto-generated catalogue (pnpm build:docsfromdata/tools.json).data/tools.jsonโ Source of truth for tool metadata, schemas and examples.
โ๏ธ Installation and Configuration
Prerequisites
Node.js: v20 or higher.
Bit2Me Account: You need a verified Bit2Me account.
๐ Authentication Methods
API Keys (Recommended)
The recommended way to authenticate is using API Keys. This method is secure, granular, and designed for programmatic access.
Go to your Bit2Me API Dashboard.
Click on "New Key".
Select the permissions you need (e.g., Wallets, Trading, Earn, Loans).
โ ๏ธ Security Note: This MCP server does NOT support crypto withdrawals to external blockchain addresses or transfers to other users. For security best practices, please DO NOT enable "Withdrawal" permissions on your API Key. Internal transfers between your own Bit2Me wallets (Wallet โ Pro โ Earn) are fully supported.
JWT Session Token (Alternative)
All tools accept an optional jwt argument (session cookie toward Bit2Me). Typical local use does not need it.
stdio / Claude Desktop: prefer API keys in
.env.jwtis only for a one-off session token.HTTP binary: send
Authorization: Bearer <jwt>(or API-key headers) per request โ see ADR 0001.
When jwt is provided on a stdio call (and HTTP has not already authenticated the request), the server uses session-cookie auth toward Bit2Me instead of the process API keys.
// Example: optional session token on a tool call
const result = await mcpClient.callTool("wallet_get_pockets", {
symbol: "BTC",
jwt: "user_session_token_here", // omitted โ API keys from the environment
});Note: For local Claude Desktop / Cursor, API keys in
.envare enough. Per-request JWT or API-key headers belong to the HTTP binary (bit2me-mcp-http). See docs/adr/0001-valet-key-http-credentials.md and the documentation map.
Steps
Clone the repository:
git clone https://github.com/bit2me-devs/bit2me-mcp.git cd bit2me-mcpInstall dependencies:
pnpm installConfigure environment variables: Create a
.envfile in the root directory:cp .env.example .envEdit
.envand add your keys:BIT2ME_API_KEY=YOUR_BIT2ME_ACCOUNT_API_KEY BIT2ME_API_SECRET=YOUR_BIT2ME_ACCOUNT_API_SECRET # Optional Configuration BIT2ME_GATEWAY_URL=https://gateway.bit2me.com # Must be HTTPS (localhost/127.x are exempt) BIT2ME_REQUEST_TIMEOUT=30000 # Request timeout in ms (default: 30000) BIT2ME_MAX_RETRIES=3 # Max retries for rate limits (default: 3) BIT2ME_RETRY_BASE_DELAY=1000 # Base delay for backoff in ms (default: 1000) BIT2ME_LOG_LEVEL=info # Log level: debug, info, warn, error (default: info) LOG_FORMAT=json # Optional: "json" for log aggregators; default is human-readable # AUDIT_LOG_PATH=/var/log/bit2me-mcp/audit.log # Append-only write-tool audit log # BIT2ME_ENABLED_CATEGORIES=wallet,broker,general # Optional allow-list; unset = all๐ก QA/Staging: Use
BIT2ME_GATEWAY_URLto point to different environments (e.g.,https://qa-gateway.bit2me.comfor QA testing).๐ File permissions: The
.envfile holds API credentials. Restrict it to the owner only:chmod 600 .envA pre-commit hook (
.husky/check-env-perms.sh) prints a warning when the local.envmode is more permissive than600.Build the project:
pnpm run build
๐ฅ๏ธ Usage with Claude Desktop
To use this server with the Claude Desktop application, add the following configuration to your claude_desktop_config.json file:
MacOS
~/Library/Application Support/Claude/claude_desktop_config.json
Windows
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"bit2me": {
"command": "node",
"args": ["/absolute/path/to/bit2me-mcp/build/index.js"],
"env": {
"BIT2ME_API_KEY": "YOUR_BIT2ME_ACCOUNT_API_KEY",
"BIT2ME_API_SECRET": "YOUR_BIT2ME_ACCOUNT_API_SECRET"
}
}
}
}Note: Replace
/absolute/path/to/...with the actual full path to your project.
Using a Custom Gateway (QA/Staging)
For testing against different environments, add the BIT2ME_GATEWAY_URL variable:
{
"mcpServers": {
"bit2me": {
"command": "node",
"args": ["/absolute/path/to/bit2me-mcp/build/index.js"],
"env": {
"BIT2ME_API_KEY": "YOUR_BIT2ME_ACCOUNT_API_KEY",
"BIT2ME_API_SECRET": "YOUR_BIT2ME_ACCOUNT_API_SECRET",
"BIT2ME_GATEWAY_URL": "https://qa-gateway.bit2me.com"
}
}
}
}๐ก๏ธ Security
Security Policy
For detailed information about reporting vulnerabilities and our security policy, please see SECURITY.md.
Best Practices
API Keys: Never commit API keys to version control. The pre-commit hook runs
gitleaks(if installed) to block accidental secret commits.Permissions: Use minimal permissions. Avoid "Withdrawal" permissions for MCP usage.
HTTPS Gateway:
BIT2ME_GATEWAY_URLis validated at startup โ onlyhttps://URLs are accepted. Plainhttp://is rejected except forlocalhost/127.xaddresses (local development only).Monotonic Nonces: API-key signing uses a strictly-increasing nonce counter so concurrent requests cannot generate replay-vulnerable signatures.
Expanded PII Redaction: The logger scrubs API keys, signatures, JWTs, emails, IBANs, phone numbers, KYC fields, and long base64 blobs before writing any line to stderr.
Audit Log: Every write tool appends an append-only JSON entry (tool name, sanitised args, outcome, correlation ID, SHA-256 fingerprint of the session token โ never the token itself). Set
AUDIT_LOG_PATHto persist to a file.
โ ๏ธ Rate Limits & Error Handling
The Bit2Me API enforces rate limits to ensure stability.
429 Too Many Requests: The client retries with exponential backoff and full jitter (
BIT2ME_RETRY_BASE_DELAY, default 1000 ms, up toBIT2ME_MAX_RETRIES).Console Warnings: You may see warnings in the logs if rate limits are hit.
Best Practice: Avoid asking for massive amounts of data in a very short loop.
๐ Logging
The server implements a structured logging system that automatically sanitizes sensitive data (API keys, signatures, JWTs, emails, IBANs, and other PII).
You can control the verbosity using the BIT2ME_LOG_LEVEL environment variable:
debug: Detailed request/response logs (useful for development)info: Startup and operational events (default)warn: Rate limits and non-critical issueserror: API errors and failures
Set LOG_FORMAT=json to switch the logger to a single-JSON-object-per-line format suitable for log aggregators (Loki, Datadog, CloudWatch, etc.). The default is human-readable.
All logs are written to stderr; stdout is reserved for the MCP JSON-RPC frame.
๐งต Concurrency Model
Each incoming tool call runs inside its own AsyncLocalStorage boundary. The store carries:
correlationId: a UUID generated per request, included in every log linesessionToken(jwt): the optional per-call session token, never logged in the cleartoolName,startTime: useful for metrics / audit
Two concurrent HTTP requests (for example two JWTs in flight on the same local process) never share ALS state. That is request isolation, not a multi-user product โ see ADR 0003. Tests outside runWithContext fall back to a safe default. See tests/concurrency.test.ts and tests/http-transport-*.test.ts.
Per-request state stored via memoizePerRequest() (e.g. wallet pockets fetched multiple times during a single broker quote) is keyed by correlationId and cleared in the finally block of executeTool() so the cache cannot grow unbounded.
๐ข Operating in Production
Two binaries ship with this package:
bit2me-mcp-serverโ the original stdio transport, designed to be spawned by a single LLM client (Claude Desktop, Cursor, โฆ).bit2me-mcp-httpโ HTTP JSON-RPC (src/index-http.ts). Each request may send its own credentials (X-Bit2Me-Api-Key+X-Bit2Me-Api-SecretorAuthorization: Bearer <jwt>).POST /mcphandlesinitialize,tools/*,prompts/*,resources/*. A notification (noid) returns202with an empty body.GET /mcp(SSE) is reserved, not implemented. Default bind is loopback (127.0.0.1). This is not a hosted multi-tenant SaaS; see ADR 0003. Put TLS in front of any non-loopback bind.
Recommended environment variables for the HTTP binary:
MCP_HTTP_HOST/MCP_HTTP_PORT(default127.0.0.1:3000)MCP_HTTP_AUTH_MODE:api_key(default),jwt, orbothLOG_FORMAT=jsonfor structured logsAUDIT_LOG_PATH=/var/log/bit2me-mcp/audit.logto ship audit lines to a file
Choosing an auth mode (HTTP transport)
The HTTP transport accepts API-key credentials and Bit2Me session JWTs. Both
modes are first-class โ the right choice depends on where the server is
bound and who is calling it, not on a one-size-fits-all rule. The full
threat model and rationale live in docs/adr/0001-valet-key-http-credentials.md.
Topology | Recommended | Why |
stdio (Cursor, Claude Desktop, local CLI) | n/a โ use | Single-process, no network hop; scopes are enforced by the Bit2Me dashboard. |
HTTP bound to loopback ( |
| Credentials never leave the host. |
HTTP on a private network / VPN behind a TLS-terminating reverse proxy |
| Encrypted hop; scopes enforced by the Bit2Me dashboard; operator owns the proxy chain. |
HTTP exposed on the public internet for a single operator |
| Bit2Me JWTs auto-expire (~15 min); the leak window is shorter. |
HTTP shared by multiple third-party integrators |
| Independent revocation per integrator without rotating the master credentials. |
Hard rules that apply regardless of the mode you pick:
Mint API keys with the smallest scope that satisfies the caller's use case. Read-only when possible. Never enable Withdrawal scopes for MCP usage โ the MCP server intentionally does not support external withdrawals, so granting that permission only widens the blast radius of a leak.
Always put the HTTP transport behind TLS on any non-loopback bind. Plain HTTP on
0.0.0.0is a misconfiguration regardless of the auth mode.The server emits a startup
WARNlog ifapi_key/bothis active on a non-loopback host so operators are nudged toward a TLS-terminating proxy or the JWT mode.Credential headers (
X-Bit2Me-Api-Key,X-Bit2Me-Api-Secret,Authorization) are scrubbed from every structured log line before it reaches stderr.
Built-in observability endpoints (HTTP transport only):
GET /healthโ liveness + Bit2Me reachability + cache/circuit-breaker/rate-limiter snapshot. Cached for 30s.GET /metricsโ Prometheus text-format counters (bit2me_mcp_tool_calls_total,bit2me_mcp_tool_errors_total,bit2me_mcp_tool_duration_avg_ms).
Reliability features active by default:
Circuit breaker on the upstream Bit2Me API (
src/utils/circuit-breaker.ts).Per-endpoint rate limiter with exponential backoff + jitter.
Idempotency keys on every write tool (
pro_create_order,loan_create,earn_deposit, โฆ) โ the wrapper stamps a stable key if the caller omitsidempotency_key.Irreversible writes (Pro / Earn / Loan /
broker_confirm_quote; notbroker_quote_*) return aneeds_confirmationpreview unlessconfirmis the booleantrue. The preview repeats the stampedidempotency_key.Monotonic request nonces for API-key signing (replay-safe even under high concurrency).
Append-only audit log for every successful and failed write operation.
โ Troubleshooting
Error: "Connection refused"
Ensure the MCP server is running.
Check that the path in
claude_desktop_config.jsonpoints correctly to thebuild/index.jsfile.
Error: "API Key invalid" or "Unauthorized"
Verify your keys in
.envor the Claude config.Ensure your API keys have the necessary permissions (Wallet, Trade, Earn, etc.) enabled in the Bit2Me dashboard.
Check that there are no extra spaces or quotes around the API key values.
Error: "Rate limit exceeded" or 429 responses
The Bit2Me API has rate limits. The server automatically retries with exponential backoff.
If you're hitting rate limits frequently, reduce the number of concurrent requests.
Consider adding delays between operations in your workflows.
Tools not showing up in Claude
Restart Claude Desktop completely (quit and reopen).
Check the Claude Desktop logs for initialization errors.
Verify the configuration file syntax is valid JSON.
Error: "Request timeout"
Check your internet connection.
Increase
BIT2ME_REQUEST_TIMEOUTin your environment variables (default: 30000ms).Some Bit2Me API endpoints may be temporarily slow.
Environment variables not loading
When using
npx, environment variables must be set in the config file'senvsection.For local development, ensure the
.envfile is in the project root.The server prioritizes config-provided credentials over
.envfile values.
Error: "Network error" or CORS issues
The MCP server runs server-side and doesn't have CORS restrictions.
Network errors usually indicate connectivity problems or API downtime.
Check the Bit2Me status page or try again later.
Debugging
Run the server manually to see logs:
pnpm devSet
BIT2ME_LOG_LEVEL=debugfor detailed logging.Check Claude Desktop logs:
macOS:
~/Library/Logs/Claude/mcp*.logWindows:
%APPDATA%\Claude\logs\mcp*.log
๐ Testing with MCP Inspector
MCP Inspector is the official debugging tool for MCP servers. It provides a web interface to test your tools, view responses, and debug issues.
Installation
This repo uses pnpm dlx (see pnpm dev / make dev). Consumers of the published package can use npx.
Running the Inspector
Option A: Published package (no clone)
export BIT2ME_API_KEY=YOUR_BIT2ME_ACCOUNT_API_KEY
export BIT2ME_API_SECRET=YOUR_BIT2ME_ACCOUNT_API_SECRET
npx -y @modelcontextprotocol/inspector npx @bit2me/mcp-serverOption B: Local repository
git clone https://github.com/bit2me-devs/bit2me-mcp.git
cd bit2me-mcp
pnpm install
pnpm run build
export BIT2ME_API_KEY=YOUR_BIT2ME_ACCOUNT_API_KEY
export BIT2ME_API_SECRET=YOUR_BIT2ME_ACCOUNT_API_SECRET
pnpm dlx @modelcontextprotocol/inspector node build/index.jsOr after install: pnpm dev (same inspector against build/index.js).
CLI (no browser) โ list tools against the local build:
pnpm dlx @modelcontextprotocol/inspector --cli node build/index.js --method tools/listNote: The web inspector opens at http://localhost:5173.
Using the Inspector
The web interface provides:
Tools Tab:
View all 48 available tools
See input schemas for each tool
Test tools with custom parameters
View formatted responses
Resources Tab:
Explore
bit2me://health,bit2me://server, andbit2me://catalog
Prompts Tab:
Test prompt templates (if configured)
Request/Response Logs:
See all MCP protocol messages
Debug communication issues
View timing information
Example: Testing a Tool
Navigate to the Tools tab
Select a tool (e.g.,
pro_get_ticker)Fill in the required parameters:
{ "pair": "BTC-EUR" }Click Run to execute the tool
View the formatted response in the output panel
๐ Landing Page Deployment
The project's landing page is located in the /landing directory.
Deployment is automated using GitHub Actions.
How to update the website:
Tool catalogue: edit
data/tools.json(Python/shell), thenpnpm build:docsand commitTOOLS_DOCUMENTATION.md.landing/tools-data.jsis gitignored (Pages /pnpm build:docsfor local preview).Page chrome: edit HTML/CSS/
CNAMEin/landingif needed.Push to
main. Pages deploy on push; after a SemVer release thelandingjob inrelease.ymlruns again so the catalogue snapshot can see the new git tag.The hero Stable badge reads live npm, not
package.jsononmain. Same source as the shields.io npm badge. See docs/stack/release.md.
Domain:
The /landing/CNAME file manages the custom domain configuration.
๐ค Contributing
We welcome contributions to improve this MCP server! Whether it's fixing bugs, adding new tools, or improving documentation, your help is appreciated.
Please read our Contributing Guidelines for details on:
Setting up your development environment
Running tests
Commit conventions (Conventional Commits)
Pull Request process
Quick Start
Fork and Clone:
git clone https://github.com/bit2me-devs/bit2me-mcp.gitInstall Dependencies:
pnpm installCreate a Branch:
git checkout -b feat/amazing-feature
For full details, check the CONTRIBUTING.md file.
Code of Conduct
Be respectful, inclusive, and constructive. Full text: CODE_OF_CONDUCT.md.
๐ License
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/bit2me-devs/bit2me-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server