{"id":"0fc369b9-ef22-427f-9c11-55f3effb2c65","slug":"bit2me-mcp","kind":"mcp","name":"bit2me-mcp","summary":"Official MCP local server for Bit2Me digital assets platform","owner":"bit2me-devs","repoUrl":"https://github.com/bit2me-devs/bit2me-mcp","license":"MIT","licenseTier":"permissive","trust":"community","stars":5,"match":null,"fewStars":false,"format":"mcp","createdAt":"2025-11-25T13:04:47.000Z","addedAt":"2026-10-21T04:09:01.849Z","logoUrl":"https://avatars.githubusercontent.com/u/47451541?v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["cloud-infra"],"tags":["artificial-intelligence","bit2me"],"runtime":"node","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-28T08:27:02.687Z","sample":false,"url":"https://conduits.dev/tools/bit2me-mcp","language":"TypeScript","transports":["stdio"],"install":{"npm":"@bit2me/mcp-server"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# Bit2Me MCP Server\n\n[![CI](https://github.com/bit2me-devs/bit2me-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/bit2me-devs/bit2me-mcp/actions/workflows/ci.yml)\n[![Deploy](https://github.com/bit2me-devs/bit2me-mcp/actions/workflows/deploy.yml/badge.svg)](https://github.com/bit2me-devs/bit2me-mcp/actions/workflows/deploy.yml)\n[![NPM Version](https://img.shields.io/npm/v/@bit2me/mcp-server?style=flat-square&color=0075FF&labelColor=slate-900)](https://www.npmjs.com/package/@bit2me/mcp-server)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/bit2me-devs/bit2me-mcp/badge)](https://scorecard.dev/viewer/?uri=github.com/bit2me-devs/bit2me-mcp)\n[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/11511/badge)](https://www.bestpractices.dev/projects/11511)\n[![TypeScript](https://img.shields.io/badge/TypeScript-6.0-blue.svg)](https://www.typescriptlang.org/)\n[![Node.js](https://img.shields.io/badge/Node.js-20%2B-green.svg)](https://nodejs.org/)\n\nAn [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) server to interact with the [Bit2Me](https://bit2me.com/) 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.\n\nFor more information, visit: **[https://mcp.bit2me.com](https://mcp.bit2me.com)**\n\n**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.\n\n## 🚀 Features\n\n- **General**: Asset information, account details, portfolio valuation, and self-introspection (`general_describe_tool` returns description, schema, and examples for an **enabled** tool — useful for LLMs encountering a tool for the first time).\n- **Wallet Management**: Query balances, transactions, and wallet (Pockets) details.\n- **Pro Trading**: Manage orders (Limit, Market, Stop), query open orders, and transfer funds between Wallet and Pro.\n- **Earn & Loans**: Manage Earn (Staking) strategies and collateralized loans.\n- **Operations**: Execute trades, transfers, and withdrawals securely.\n- **Write safeguards**: Irreversible writes (Pro / Earn / Loan / `broker_confirm_quote`) first return a `needs_confirmation` preview unless `confirm` is the boolean `true`. Broker quote tools (`broker_quote_*`) do not require confirm. The preview includes the stamped `idempotency_key` so a retry reuses it. Failed POST/DELETE calls retry with exponential backoff + jitter when that key is present.\n- **Category allow-list**: Optional `BIT2ME_ENABLED_CATEGORIES` (comma-separated: `general`, `broker`, `wallet`, `pro`, `earn`, `loan`) filters `tools/list` and dispatch. Unset = all. An unknown id is a startup/parse error.\n- **MCP tool annotations**: `tools/list` exposes hints from `type` in `data/tools.json` — `readOnlyHint` on READ/META, `destructiveHint` on irreversible WRITE (not `broker_quote_*`), `idempotentHint` on cancel-order tools.\n- **structuredContent**: Tool results include a `structuredContent` object alongside the existing text JSON (the text payload is unchanged).\n- **Resources**: `bit2me://health`, `bit2me://server`, and `bit2me://catalog` (enabled tools; no Bit2Me I/O). Same catalogue on stdio and HTTP `resources/list` / `resources/read`.\n- **Decimal Precision**: Portfolio valuation uses `decimal.js` — no floating-point drift on large balances or high-precision assets.\n- **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.\n- **Monotonic Nonces**: API-key signing uses a strictly-increasing nonce counter, preventing replay attacks even under high concurrency.\n- **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_PATH` to write to a dedicated file; otherwise audit lines are emitted via the logger with `audit: true`.\n- **Parametrized Prompts**: `analyze_portfolio` and `market_summary` accept arguments. Extra prompts: `tax_report`, `dca_plan`, `loan_health_check`, and `confirm_write` (optional `tool` argument) for irreversible writes.\n\n## 🛠️ Available Tools & API Endpoints\n\nThe server currently exposes **48 tools** grouped as follows:\n\n- 4 General tools (including `general_describe_tool` for self-introspection)\n- 8 Broker (Simple Trading) tools — includes `wallet_get_cards` (Bit2Me Teller). It stays in `broker` so the allow-list id does not change.\n- 4 Wallet tools\n- 14 Pro Trading tools\n- 11 Earn (Staking) tools\n- 7 Loan tools\n\nFull descriptions, response schemas, Bit2Me REST endpoints and usage notes live in [`TOOLS_DOCUMENTATION.md`](./TOOLS_DOCUMENTATION.md).\n\n## 📋 Documentation & Schemas\n\nAll tool responses are normalised for LLM consumption (consistent naming, flattened payloads, concise metadata). Use the following references when developing new tooling:\n\n- **[`docs/README.md`](./docs/README.md)** – Map of every canonical doc (what to edit vs what is generated).\n- **[`TOOLS_DOCUMENTATION.md`](./TOOLS_DOCUMENTATION.md)** – Auto-generated catalogue (`pnpm build:docs` from `data/tools.json`).\n- **[`data/tools.json`](./data/tools.json)** – Source of truth for tool metadata, schemas and examples.\n\n## ⚙️ Installation and Configuration\n\n### Prerequisites\n\n- **Node.js**: v20 or higher.\n- **Bit2Me Account**: You need a verified Bit2Me account.\n\n### 🔑 Authentication Methods\n\n#### API Keys (Recommended)\n\nThe recommended way to authenticate is using API Keys. This method is secure, granular, and designed for programmatic access.\n\n1. Go to your **[Bit2Me API Dashboard](https://app.bit2me.com/profile/api)**.\n2. Click on **\"New Key\"**.\n3. Select the permissions you need (e.g., Wallets, Trading, Earn, Loans).\n    > **⚠️ 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.\n\n#### JWT Session Token (Alternative)\n\nAll tools accept an optional `jwt` argument (session cookie toward Bit2Me). Typical local use does **not** need it.\n\n- **stdio / Claude Desktop**: prefer API keys in `.env`. `jwt` is only for a one-off session token.\n- **HTTP binary**: send `Authorization: Bearer <jwt>` (or API-key headers) per request — see ADR 0001.\n\nWhen `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.\n\n```typescript\n// Example: optional session token on a tool call\nconst result = await mcpClient.callTool(\"wallet_get_pockets\", {\n    symbol: \"BTC\",\n    jwt: \"user_session_token_here\", // omitted → API keys from the environment\n});\n```\n\n> **Note:** For local Claude Desktop / Cursor, API keys in `.env` are 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](./docs/adr/0001-valet-key-http-credentials.md) and the [documentation map](./docs/README.md).\n\n### Steps\n\n1. **Clone the repository:**\n\n    ```bash\n    git clone https://github.com/bit2me-devs/bit2me-mcp.git\n    cd bit2me-mcp\n    ```\n\n2. **Install dependencies:**\n\n    ```bash\n    pnpm install\n    ```\n\n3. **Configure environment variables:**\n   Create a `.env` file in the root directory:\n\n    ```bash\n    cp .env.example .env\n    ```\n\n    Edit `.env` and add your keys:\n\n    ```env\n    BIT2ME_API_KEY=YOUR_BIT2ME_ACCOUNT_API_KEY\n    BIT2ME_API_SECRET=YOUR_BIT2ME_ACCOUNT_API_SECRET\n\n    # Optional Configuration\n    BIT2ME_GATEWAY_URL=https://gateway.bit2me.com  # Must be HTTPS (localhost/127.x are exempt)\n    BIT2ME_REQUEST_TIMEOUT=30000     # Request timeout in ms (default: 30000)\n    BIT2ME_MAX_RETRIES=3             # Max retries for rate limits (default: 3)\n    BIT2ME_RETRY_BASE_DELAY=1000     # Base delay for backoff in ms (default: 1000)\n    BIT2ME_LOG_LEVEL=info            # Log level: debug, info, warn, error (default: info)\n    LOG_FORMAT=json                  # Optional: \"json\" for log aggregators; default is human-readable\n    # AUDIT_LOG_PATH=/var/log/bit2me-mcp/audit.log  # Append-only write-tool audit log\n    # BIT2ME_ENABLED_CATEGORIES=wallet,broker,general  # Optional allow-list; unset = all\n    ```\n\n    > **💡 QA/Staging:** Use `BIT2ME_GATEWAY_URL` to point to different environments (e.g., `https://qa-gateway.bit2me.com` for QA testing).\n\n    > **🔒 File permissions:** The `.env` file holds API credentials. Restrict it to the owner only:\n    >\n    > ```bash\n    > chmod 600 .env\n    > ```\n    >\n    > A pre-commit hook (`.husky/check-env-perms.sh`) prints a warning when the local `.env` mode is more permissive than `600`.\n\n4. **Build the project:**\n    ```bash\n    pnpm run build\n    ```\n\n## 🖥️ Usage with Claude Desktop\n\nTo use this server with the Claude Desktop application, add the following configuration to your `claude_desktop_config.json` file:\n\n### MacOS\n\n`~/Library/Application Support/Claude/claude_desktop_config.json`\n\n### Windows\n\n`%APPDATA%\\Claude\\claude_desktop_config.json`\n\n```json\n{\n    \"mcpServers\": {\n        \"bit2me\": {\n            \"command\": \"node\",\n            \"args\": [\"/absolute/path/to/bit2me-mcp/build/index.js\"],\n            \"env\": {\n                \"BIT2ME_API_KEY\": \"YOUR_BIT2ME_ACCOUNT_API_KEY\",\n                \"BIT2ME_API_SECRET\": \"YOUR_BIT2ME_ACCOUNT_API_SECRET\"\n            }\n        }\n    }\n}\n```\n\n> **Note:** Replace `/absolute/path/to/...` with the actual full path to your project.\n\n#### Using a Custom Gateway (QA/Staging)\n\nFor testing against different environments, add the `BIT2ME_GATEWAY_URL` variable:\n\n```json\n{\n    \"mcpServers\": {\n        \"bit2me\": {\n            \"command\": \"node\",\n            \"args\": [\"/absolute/path/to/bit2me-mcp/build/index.js\"],\n            \"env\": {\n                \"BIT2ME_API_KEY\": \"YOUR_BIT2ME_ACCOUNT_API_KEY\",\n                \"BIT2ME_API_SECRET\": \"YOUR_BIT2ME_ACCOUNT_API_SECRET\",\n                \"BIT2ME_GATEWAY_URL\": \"https://qa-gateway.bit2me.com\"\n            }\n        }\n    }\n}\n```\n\n## 🛡️ Security\n\n### Security Policy\n\nFor detailed information about reporting vulnerabilities and our security policy, please see [SECURITY.md](./SECURITY.md).\n\n### Best Practices\n\n- **API Keys**: Never commit API keys to version control. The pre-commit hook runs `gitleaks` (if installed) to block accidental secret commits.\n- **Permissions**: Use minimal permissions. Avoid \"Withdrawal\" permissions for MCP usage.\n- **HTTPS Gateway**: `BIT2ME_GATEWAY_URL` is validated at startup — only `https://` URLs are accepted. Plain `http://` is rejected except for `localhost` / `127.x` addresses (local development only).\n- **Monotonic Nonces**: API-key signing uses a strictly-increasing nonce counter so concurrent requests cannot generate replay-vulnerable signatures.\n- **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.\n- **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_PATH` to persist to a file.\n\n## ⚠️ Rate Limits & Error Handling\n\nThe Bit2Me API enforces rate limits to ensure stability.\n\n- **429 Too Many Requests**: The client retries with exponential backoff and **full jitter** (`BIT2ME_RETRY_BASE_DELAY`, default 1000 ms, up to `BIT2ME_MAX_RETRIES`).\n- **Console Warnings**: You may see warnings in the logs if rate limits are hit.\n- **Best Practice**: Avoid asking for massive amounts of data in a very short loop.\n\n## 📊 Logging\n\nThe server implements a structured logging system that automatically sanitizes sensitive data (API keys, signatures, JWTs, emails, IBANs, and other PII).\nYou can control the verbosity using the `BIT2ME_LOG_LEVEL` environment variable:\n\n- `debug`: Detailed request/response logs (useful for development)\n- `info`: Startup and operational events (default)\n- `warn`: Rate limits and non-critical issues\n- `error`: API errors and failures\n\nSet `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.\n\nAll logs are written to **stderr**; stdout is reserved for the MCP JSON-RPC frame.\n\n## 🧵 Concurrency Model\n\nEach incoming tool call runs inside its own [`AsyncLocalStorage`](https://nodejs.org/api/async_context.html#class-asynclocalstorage) boundary. The store carries:\n\n- `correlationId`: a UUID generated per request, included in every log line\n- `sessionToken` (`jwt`): the optional per-call session token, never logged in the clear\n- `toolName`, `startTime`: useful for metrics / audit\n\nTwo 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](./docs/adr/0003-local-single-user-threat-model.md). Tests outside `runWithContext` fall back to a safe default. See `tests/concurrency.test.ts` and `tests/http-transport-*.test.ts`.\n\nPer-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.\n\n## 🚢 Operating in Production\n\nTwo binaries ship with this package:\n\n- `bit2me-mcp-server` — the original stdio transport, designed to be spawned by a single LLM client (Claude Desktop, Cursor, …).\n- `bit2me-mcp-http` — HTTP JSON-RPC (`src/index-http.ts`). Each request may send its own credentials (`X-Bit2Me-Api-Key` + `X-Bit2Me-Api-Secret` or `Authorization: Bearer <jwt>`). `POST /mcp` handles `initialize`, `tools/*`, `prompts/*`, `resources/*`. A notification (no `id`) returns `202` with 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](./docs/adr/0003-local-single-user-threat-model.md). Put TLS in front of any non-loopback bind.\n\nRecommended environment variables for the HTTP binary:\n\n- `MCP_HTTP_HOST` / `MCP_HTTP_PORT` (default `127.0.0.1:3000`)\n- `MCP_HTTP_AUTH_MODE`: `api_key` (default), `jwt`, or `both`\n- `LOG_FORMAT=json` for structured logs\n- `AUDIT_LOG_PATH=/var/log/bit2me-mcp/audit.log` to ship audit lines to a file\n\n### Choosing an auth mode (HTTP transport)\n\nThe HTTP transport accepts API-key credentials and Bit2Me session JWTs. Both\nmodes are first-class — the right choice depends on **where the server is\nbound and who is calling it**, not on a one-size-fits-all rule. The full\nthreat model and rationale live in [`docs/adr/0001-valet-key-http-credentials.md`](./docs/adr/0001-valet-key-http-credentials.md).\n\n| Topology                                                               | Recommended `MCP_HTTP_AUTH_MODE`                           | Why                                                                                    |\n| ---------------------------------------------------------------------- | ---------------------------------------------------------- | -------------------------------------------------------------------------------------- |\n| stdio (Cursor, Claude Desktop, local CLI)                              | n/a — use `BIT2ME_API_KEY` / `BIT2ME_API_SECRET` in `.env` | Single-process, no network hop; scopes are enforced by the Bit2Me dashboard.           |\n| HTTP bound to loopback (`127.0.0.1`, `::1`, `localhost`)               | `api_key`                                                  | Credentials never leave the host.                                                      |\n| HTTP on a private network / VPN behind a TLS-terminating reverse proxy | `api_key`                                                  | Encrypted hop; scopes enforced by the Bit2Me dashboard; operator owns the proxy chain. |\n| HTTP exposed on the public internet for a single operator              | `jwt`                                                      | Bit2Me JWTs auto-expire (~15 min); the leak window is shorter.                         |\n| HTTP shared by multiple third-party integrators                        | `jwt`                                                      | Independent revocation per integrator without rotating the master credentials.         |\n\nHard rules that apply regardless of the mode you pick:\n\n- **Mint API keys with the smallest scope** that satisfies the caller's use\n  case. Read-only when possible. **Never enable Withdrawal scopes for MCP\n  usage** — the MCP server intentionally does not support external withdrawals,\n  so granting that permission only widens the blast radius of a leak.\n- **Always put the HTTP transport behind TLS** on any non-loopback bind.\n  Plain HTTP on `0.0.0.0` is a misconfiguration regardless of the auth mode.\n- The server emits a startup `WARN` log if `api_key`/`both` is active on a\n  non-loopback host so operators are nudged toward a TLS-terminating proxy or\n  the JWT mode.\n- Credential headers (`X-Bit2Me-Api-Key`, `X-Bit2Me-Api-Secret`,\n  `Authorization`) are scrubbed from every structured log line before it\n  reaches stderr.\n\nBuilt-in observability endpoints (HTTP transport only):\n\n- `GET /health` — liveness + Bit2Me reachability + cache/circuit-breaker/rate-limiter snapshot. Cached for 30s.\n- `GET /metrics` — Prometheus text-format counters (`bit2me_mcp_tool_calls_total`, `bit2me_mcp_tool_errors_total`, `bit2me_mcp_tool_duration_avg_ms`).\n\nReliability features active by default:\n\n- Circuit breaker on the upstream Bit2Me API (`src/utils/circuit-breaker.ts`).\n- Per-endpoint rate limiter with exponential backoff + jitter.\n- Idempotency keys on every write tool (`pro_create_order`, `loan_create`, `earn_deposit`, …) — the wrapper stamps a stable key if the caller omits `idempotency_key`.\n- Irreversible writes (Pro / Earn / Loan / `broker_confirm_quote`; not `broker_quote_*`) return a `needs_confirmation` preview unless `confirm` is the boolean `true`. The preview repeats the stamped `idempotency_key`.\n- Monotonic request nonces for API-key signing (replay-safe even under high concurrency).\n- Append-only audit log for every successful **and** failed write operation.\n\n## ❓ Troubleshooting\n\n### Error: \"Connection refused\"\n\n- Ensure the MCP server is running.\n- Check that the path in `claude_desktop_config.json` points correctly to the `build/index.js` file.\n\n### Error: \"API Key invalid\" or \"Unauthorized\"\n\n- Verify your keys in `.env` or the Claude config.\n- Ensure your API keys have the necessary permissions (Wallet, Trade, Earn, etc.) enabled in the Bit2Me dashboard.\n- Check that there are no extra spaces or quotes around the API key values.\n\n### Error: \"Rate limit exceeded\" or 429 responses\n\n- The Bit2Me API has rate limits. The server automatically retries with exponential backoff.\n- If you're hitting rate limits frequently, reduce the number of concurrent requests.\n- Consider adding delays between operations in your workflows.\n\n### Tools not showing up in Claude\n\n- Restart Claude Desktop completely (quit and reopen).\n- Check the Claude Desktop logs for initialization errors.\n- Verify the configuration file syntax is valid JSON.\n\n### Error: \"Request timeout\"\n\n- Check your internet connection.\n- Increase `BIT2ME_REQUEST_TIMEOUT` in your environment variables (default: 30000ms).\n- Some Bit2Me API endpoints may be temporarily slow.\n\n### Environment variables not loading\n\n- When using `npx`, environment variables must be set in the config file's `env` section.\n- For local development, ensure the `.env` file is in the project root.\n- The server prioritizes config-provided credentials over `.env` file values.\n\n### Error: \"Network error\" or CORS issues\n\n- The MCP server runs server-side and doesn't have CORS restrictions.\n- Network errors usually indicate connectivity problems or API downtime.\n- Check the Bit2Me status page or try again later.\n\n### Debugging\n\n- Run the server manually to see logs:\n    ```bash\n    pnpm dev\n    ```\n- Set `BIT2ME_LOG_LEVEL=debug` for detailed logging.\n- Check Claude Desktop logs:\n    - macOS: `~/Library/Logs/Claude/mcp*.log`\n    - Windows: `%APPDATA%\\Claude\\logs\\mcp*.log`\n\n## 🔍 Testing with MCP Inspector\n\n[MCP Inspector](https://github.com/modelcontextprotocol/inspector) is the official debugging tool for MCP servers. It provides a web interface to test your tools, view responses, and debug issues.\n\n### Installation\n\nThis repo uses `pnpm dlx` (see `pnpm dev` / `make dev`). Consumers of the published package can use `npx`.\n\n### Running the Inspector\n\n#### Option A: Published package (no clone)\n\n```bash\nexport BIT2ME_API_KEY=YOUR_BIT2ME_ACCOUNT_API_KEY\nexport BIT2ME_API_SECRET=YOUR_BIT2ME_ACCOUNT_API_SECRET\nnpx -y @modelcontextprotocol/inspector npx @bit2me/mcp-server\n```\n\n#### Option B: Local repository\n\n```bash\ngit clone https://github.com/bit2me-devs/bit2me-mcp.git\ncd bit2me-mcp\npnpm install\npnpm run build\n\nexport BIT2ME_API_KEY=YOUR_BIT2ME_ACCOUNT_API_KEY\nexport BIT2ME_API_SECRET=YOUR_BIT2ME_ACCOUNT_API_SECRET\npnpm dlx @modelcontextprotocol/inspector node build/index.js\n```\n\nOr after install: `pnpm dev` (same inspector against `build/index.js`).\n\nCLI (no browser) — list tools against the local build:\n\n```bash\npnpm dlx @modelcontextprotocol/inspector --cli node build/index.js --method tools/list\n```\n\n**Note:** The web inspector opens at `http://localhost:5173`.\n\n### Using the Inspector\n\nThe web interface provides:\n\n1. **Tools Tab:**\n    - View all 48 available tools\n    - See input schemas for each tool\n    - Test tools with custom parameters\n    - View formatted responses\n\n2. **Resources Tab:**\n    - Explore `bit2me://health`, `bit2me://server`, and `bit2me://catalog`\n\n3. **Prompts Tab:**\n    - Test prompt templates (if configured)\n\n4. **Request/Response Logs:**\n    - See all MCP protocol messages\n    - Debug communication issues\n    - View timing information\n\n### Example: Testing a Tool\n\n1. Navigate to the **Tools** tab\n2. Select a tool (e.g., `pro_get_ticker`)\n3. Fill in the required parameters:\n    ```json\n    {\n        \"pair\": \"BTC-EUR\"\n    }\n    ```\n4. Click **Run** to execute the tool\n5. View the formatted response in the output panel\n\n## 🌐 Landing Page Deployment\n\nThe project's landing page is located in the `/landing` directory.\nDeployment is automated using GitHub Actions.\n\n**How to update the website:**\n\n1. Tool catalogue: edit `data/tools.json` (Python/shell), then `pnpm build:docs` and commit `TOOLS_DOCUMENTATION.md`. `landing/tools-data.js` is gitignored (Pages / `pnpm build:docs` for local preview).\n2. Page chrome: edit HTML/CSS/`CNAME` in `/landing` if needed.\n3. Push to `main`. Pages deploy on push; after a SemVer release the `landing` job in `release.yml` runs again so the catalogue snapshot can see the new git tag.\n4. The hero **Stable** badge reads **live npm**, not `package.json` on `main`. Same source as the shields.io npm badge. See [docs/stack/release.md](./docs/stack/release.md).\n\n**Domain:**\nThe `/landing/CNAME` file manages the custom domain configuration.\n\n## 🤝 Contributing\n\nWe welcome contributions to improve this MCP server! Whether it's fixing bugs, adding new tools, or improving documentation, your help is appreciated.\n\nPlease read our **[Contributing Guidelines](./CONTRIBUTING.md)** for details on:\n\n- Setting up your development environment\n- Running tests\n- Commit conventions (Conventional Commits)\n- Pull Request process\n\n### Quick Start\n\n1.  **Fork and Clone**:\n    ```bash\n    git clone https://github.com/bit2me-devs/bit2me-mcp.git\n    ```\n2.  **Install Dependencies**:\n    ```bash\n    pnpm install\n    ```\n3.  **Create a Branch**:\n    ```bash\n    git checkout -b feat/amazing-feature\n    ```\n\nFor full details, check the [CONTRIBUTING.md](./CONTRIBUTING.md) file.\n\n### Code of Conduct\n\nBe respectful, inclusive, and constructive. Full text:\n[CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md).\n\n## 📄 License\n\n[MIT License](./LICENSE)\n"}