Bitso MCP Server
CI/CD pipeline integration for automated testing, coverage reporting, and build validation
Built with TypeScript for type-safe development and configuration validation
Comprehensive testing framework for unit and integration tests with coverage reporting
Schema validation for API inputs, parameters, and configuration management
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Bitso MCP Serverlist withdrawals for BTC from last week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Bitso MCP Server
An MCP server for the Bitso API that provides tools to access withdrawals and fundings data. Built with TypeScript, featuring comprehensive testing, dual transport support, and production-ready best practices.
Features
π¦ Bitso API Integration
Complete Withdrawals API support (list, get by ID, get by multiple IDs, get by origin IDs)
Complete Fundings API support (list, get by ID)
Proper authentication with API key/secret and HMAC signature
Support for all API filtering and pagination parameters
π Production Ready
Dual transport support (stdio for Claude Desktop, HTTP for development)
Comprehensive error handling and logging
Type-safe configuration with Zod validation
Project-root-aware file logging system
π§ͺ Comprehensive Testing
Two-tier testing strategy (unit + integration tests)
Real MCP protocol testing (not mocked functions)
MSW for consistent API mocking
High test coverage with Vitest
π οΈ Developer Experience
Hot reloading with TypeScript watch mode
Tool generation script
ESM support with proper module resolution
CI/CD pipeline with GitHub Actions
π¦ Best Practices
Modular tool organization
Zod schema validation for all inputs
Structured logging with file output
Caching with configurable TTL
Related MCP server: Bitso MCP Server
Quick Start
1. Setup
npm install2. Configure Environment
cp .env.example .env
# Edit .env with your Bitso API credentialsRequired environment variables:
BITSO_API_KEY: Your Bitso API keyBITSO_API_SECRET: Your Bitso API secret
3. Build and Test
# Build the project
npm run build
# Run tests
npm run test
# Start development server (HTTP mode)
npm run start:http4. Add to Claude Desktop
Add to your Claude Desktop configuration (claude_desktop_config.json):
{
"mcpServers": {
"bitso-mcp-server": {
"command": "node",
"args": ["/path/to/bitso-mcp-server/dist/src/index.js"],
"env": {
"BITSO_API_KEY": "your-bitso-api-key",
"BITSO_API_SECRET": "your-bitso-api-secret"
}
}
}
}Available Tools
The server provides 6 tools to interact with the Bitso API:
Withdrawals Tools
list_withdrawals- List withdrawals with optional filteringParameters:
currency,limit,marker,method,origin_id,status,wid
get_withdrawal- Get specific withdrawal by IDParameters:
wid(required)
get_withdrawals_by_ids- Get multiple withdrawals by comma-separated IDsParameters:
wids(required, e.g., "wid1,wid2,wid3")
get_withdrawals_by_origin_ids- Get withdrawals by client-supplied origin IDsParameters:
origin_ids(required, e.g., "origin1,origin2,origin3")
Fundings Tools
list_fundings- List fundings with optional filteringParameters:
limit,marker,method,status,fids
get_funding- Get specific funding by IDParameters:
fid(required)
Development Guide
Project Structure
src/
βββ tools/ # MCP tool implementations
β βββ bitso-tools.ts # Bitso API tools
βββ utils/ # Shared utilities
β βββ logging.ts # Project-root-aware logging
βββ client.ts # Bitso API client with authentication
βββ config.ts # Environment configuration
βββ types.ts # TypeScript type definitions
βββ index.ts # Main server entry point
tests/
βββ unit/ # Fast unit tests with MSW mocking
βββ integration/ # Real MCP protocol tests
βββ helpers/ # Test utilities
β βββ mcp-test-helper.ts
β βββ test-server-factory.ts
β βββ test-config.ts
βββ mocks/ # MSW request handlers
βββ setup.ts # Test environment setupCreating New Tools
Use the built-in tool generator:
npm run build
npm run create-toolOr create manually following the pattern in src/tools/bitso-tools.ts:
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
const MyToolSchema = z.object({
param: z.string().min(1, "Parameter is required"),
});
export function registerMyTools(server: McpServer, client: BitsoApiClient): void {
server.tool(
"my_tool",
{
description: "Description of what the tool does",
inputSchema: {
type: "object",
properties: {
param: {
type: "string",
description: "Parameter description",
},
},
required: ["param"],
},
},
async (params): Promise<ToolResult> => {
try {
const validatedParams = MyToolSchema.parse(params);
// Your tool logic here
return {
content: [
{
type: "text",
text: "Tool response"
}
]
};
} catch (error) {
// Error handling
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
}
);
}Testing Strategy
This template uses a two-tier testing approach:
Unit Tests (tests/unit/)
Test business logic in isolation
Mock external APIs using MSW
Fast execution, run frequently during development
Focus on data transformations, caching, validation
Integration Tests (tests/integration/)
Test through real MCP protocol
Use actual MCP server instances
Validate tool registration and MCP compliance
Ensure proper request/response formatting
# Run unit tests (fast)
npm run test:unit
# Run integration tests (slower, full MCP protocol)
npm run test:integration
# Run all tests with coverage
npm run test:coverageTransport Modes
Stdio Transport (Production)
Used by Claude Desktop and other MCP clients:
npm start
# or
node dist/src/index.jsHTTP Transport (Development)
Useful for debugging and development:
npm run start:http
# Server available at http://localhost:3000/mcpLogging and Debugging
The template includes a sophisticated logging system:
Debug logs: Written to
mcp-debug.login project rootProject-root-aware: Works from both source and compiled code
Structured logging: JSON formatting for complex data
Console output: Errors also logged to stderr
Check logs during development:
tail -f mcp-debug.logConfiguration Management
Configuration uses Zod for type-safe validation:
// src/config.ts
const ConfigSchema = z.object({
apiKey: z.string().min(1, 'API_KEY environment variable is required'),
apiEndpoint: z.string().url().default('https://api.example.com'),
// ... other config
});Environment variables are validated on startup with clear error messages.
API Integration
Client Pattern
The template includes a robust API client pattern:
// Automatic caching
const resources = await client.getResources(); // Cached for 5 minutes
// Error handling
try {
const resource = await client.getResource(id);
} catch (error) {
// Errors are logged and can be handled
}
// Connection testing
const isHealthy = await client.testConnection();Bitso API Authentication
The server uses HMAC-SHA256 authentication required by the Bitso API:
// Authentication headers are automatically generated
const authHeaders = {
'key': config.apiKey,
'signature': hmacSignature, // Generated using API secret
'nonce': timestamp
};Each request is signed using:
API Secret (from environment)
HTTP method
Request path
Request body (if any)
Current timestamp as nonce
Deployment
Building for Production
npm run build
npm testCI/CD
The template includes a GitHub Actions workflow (.github/workflows/ci.yml):
Unit tests: Fast feedback on basic functionality
Integration tests: Full MCP protocol validation
Coverage reporting: Ensure code quality
Build validation: Verify compilation
Environment Variables
Production deployment requires:
BITSO_API_KEY=your-production-api-key
BITSO_API_SECRET=your-production-api-secret
BITSO_API_ENDPOINT=https://api.bitso.com # Production endpoint
CACHE_TTL_SECONDS=300
TIMEOUT=30000Best Practices
Tool Development
Always use Zod schemas for parameter validation
Return MCP-compliant responses with
{ content: [...] }formatHandle errors gracefully with user-friendly messages
Log extensively for debugging and monitoring
Test through MCP protocol using integration tests
Error Handling
// Good: MCP-compliant error response
return {
content: [
{
type: "text",
text: `Error: ${error.message}`
}
]
};
// Bad: Throwing unhandled errors
throw new Error("Something went wrong");Performance
Use caching for expensive API calls
Implement request timeouts
Log performance metrics
Monitor API rate limits
Troubleshooting
Common Issues
Tool not appearing in Claude:
Check build succeeded:
npm run buildRestart Claude Desktop
Check
mcp-debug.logfor errorsVerify
claude_desktop_config.jsonconfiguration
Tests failing:
Run unit tests first:
npm run test:unitCheck MSW handlers match your API expectations
Verify integration tests use real MCP server instances
API connection issues:
Verify environment variables are set
Test API credentials manually
Check network connectivity and firewalls
Review API endpoint URLs
Debug Mode
Enable detailed logging:
DEBUG=true npm startContributing
Fork the repository
Create a feature branch
Add tests for new functionality
Ensure all tests pass:
npm testBuild successfully:
npm run buildSubmit a pull request
License
MIT License. See LICENSE for details.
Related Resources
Available Tools
6 toolsget_fundingD
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Tool has no description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tool has no description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has no description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has no description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Tool has no description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tool has no description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_withdrawalD
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Tool has no description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tool has no description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has no description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has no description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Tool has no description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tool has no description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_withdrawals_by_idsD
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Tool has no description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tool has no description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has no description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has no description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Tool has no description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tool has no description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_withdrawals_by_origin_idsD
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Tool has no description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tool has no description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has no description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has no description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Tool has no description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tool has no description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_fundingsD
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Tool has no description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tool has no description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has no description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has no description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Tool has no description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tool has no description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_withdrawalsD
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Tool has no description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tool has no description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has no description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has no description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Tool has no description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tool has no description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v1.0.0- First observed
get_funding - First observed
get_withdrawal - First observed
get_withdrawals_by_ids - First observed
get_withdrawals_by_origin_ids - First observed
list_fundings - First observed
list_withdrawals
TDQS
Scored across 6 tools
The tools have clear distinctions between funding and withdrawal operations, with specific 'get' and 'list' variants. However, the two 'get_withdrawals_by_*' tools could be confusing as they serve similar purposes (retrieving withdrawals by different ID types) without clear differentiation in their names or descriptions.
All tools follow a consistent verb_noun pattern with underscores, using 'get' for single retrievals and 'list' for collections. The naming is predictable and uniform across all six tools, with no deviations in style or convention.
Six tools is a reasonable number for a financial transaction server, covering core funding and withdrawal operations. It's slightly lean but appropriate for the apparent scope, though it might benefit from additional tools for actions like creating or updating transactions.
The toolset is severely incomplete for a financial platform, covering only read operations (get and list) for fundings and withdrawals. There are no tools for creating, updating, or deleting transactions, which are essential for a full CRUD lifecycle in this domain, leaving significant gaps that will hinder agent workflows.
Maintenance
Related MCP Connectors
Bity crypto bank (Bitybank / BitypreΓ§o), account balance per coin, market data (ticker, order book,
Read-only access to your bank, investment, and crypto accounts: balances, transactions, holdings.
Tools for your business banking with Rho, including accounts, transactions, and more
Bitstamp keyless public market: ticker, orderbook, transactions, OHLC, trading pairs.
Related MCP Servers
- AlicenseBqualityDmaintenanceInteract seamlessly with the Bybit API to fetch market data, manage your account, and execute trades. Leverage powerful tools to enhance your trading experience and automate your strategies effortlessly. If you wish to use an API key restricted to your personal IP address, you must configure the MCP159MIT
- AlicenseNot gradedqualityDmaintenanceEnables access to Bitso cryptocurrency exchange data through comprehensive withdrawal and funding transaction tools. Features production-ready authentication, caching, and complete API integration for monitoring exchange activities.MIT
- AlicenseBqualityDmaintenanceEnables interaction with the Bithumb cryptocurrency exchange API to fetch market data, manage account balances, and execute trading operations including limit orders, market orders, and withdrawals.1920 npmMIT

Conekta MCP Serverofficial
FlicenseAqualityDmaintenanceEnables interaction with the Conekta payment API to manage orders, customers, subscriptions, and financial transactions. It provides a comprehensive suite of tools for core payment operations like processing refunds, creating checkouts, and monitoring account balances.322-