Skip to main content
Glama
bitrefill

Bitrefill Search and Shop

Official
by bitrefill
README.md
# Bitrefill MCP Server (Sample Implementation)

> **This is a sample / reference implementation.** For production use, connect to the **official hosted Bitrefill eCommerce MCP** at `https://api.bitrefill.com/mcp` instead. It is maintained by Bitrefill, supports OAuth, and exposes the same tools without you having to run, deploy, or update anything.
>
> Use this repository if you want to **learn how a Bitrefill MCP can be built**, **fork it**, **extend it**, or **self-host a customized variant** on top of the [Bitrefill API v2](https://docs.bitrefill.com).

This server wraps the [Bitrefill API v2](https://docs.bitrefill.com) (`https://api.bitrefill.com/v2`) using **`Authorization: Bearer ${BITREFILL_API_KEY}`**. Only **request** parameters are validated with Zod; API responses are returned as JSON text unchanged.

## Use the official remote MCP (recommended for production)

The [Bitrefill eCommerce MCP](https://docs.bitrefill.com/docs/ecommerce-mcp) is hosted by Bitrefill and is the recommended way to integrate with ChatGPT, Claude Desktop / Code, Cursor, and any other MCP-compatible client.

- **OAuth (recommended)**. Point your client at:

  ```
  https://api.bitrefill.com/mcp
  ```

  You'll be redirected to Bitrefill to sign in and authorize access. No API key handling required.

- **API key**. Append your key from [bitrefill.com/account/developers](https://www.bitrefill.com/account/developers):

  ```
  https://api.bitrefill.com/mcp/YOUR_API_KEY
  ```

Setup guides per client: [ChatGPT](https://docs.bitrefill.com/docs/use-with-chatgpt), [Claude Desktop](https://docs.bitrefill.com/docs/use-with-claude-chat), [Claude Code](https://docs.bitrefill.com/docs/use-with-claude-code), [Cursor](https://docs.bitrefill.com/docs/use-with-cursor).

## When to use this repo instead

Run this local MCP only if you need to:

- Study a working reference implementation of a Bitrefill MCP server.
- Fork it to add custom tools, prompts, validation, logging, or routing.
- Self-host inside a private network or air-gapped environment.
- Experiment with a wider set of v2 endpoints (this sample exposes 18 tools, while the official remote MCP intentionally exposes a curated set of 7; see [eCommerce MCP](https://docs.bitrefill.com/docs/ecommerce-mcp#available-tools)).

For everyday "buy gift cards / eSIMs from my AI assistant" use cases, prefer the hosted server above.

## Configuration

1. Create an API key: [Bitrefill account → Developers](https://www.bitrefill.com/account/developers).
2. Set in the environment (or `.env` for local runs):

```bash
BITREFILL_API_KEY=your_api_key_here
```

If `BITREFILL_API_KEY` is missing, **no tools** are registered (v2 requires authentication even for `ping`).

## Tools (v1.0.0)

| Tool | API |
|------|-----|
| `search-products` | `GET /products/search` (with `q`) or `GET /products` (browse) |
| `product-details` | `GET /products/{id}` |
| `buy-products` | `POST /invoices` |
| `get-invoice-by-id` | `GET /invoices/{id}` |
| `get-order-by-id` | `GET /orders/{id}` |
| `list-invoices` | `GET /invoices` |
| `list-orders` | `GET /orders` |
| `pay-invoice` | `POST /invoices/{id}/pay` |
| `get-account-balance` | `GET /accounts/balance` |
| `check-phone-number` | `GET /check_phone_number` |
| `ping` | `GET /ping` |
| `list-esim-products` | `GET /products/esims` |
| `get-esim-product` | `GET /products/esims/{id}` |
| `create-esim-invoice` | `POST /esims` |
| `get-esim-invoice` | `GET /esims/invoice/{id}` |
| `pay-esim-invoice` | `POST /esims/invoice/{id}/pay` |
| `list-esims` | `GET /esims` |
| `get-esim` | `GET /esims/{id}` |

**Breaking change vs 0.x:** old snake_case tool names (`search`, `create_invoice`, `unseal_order`, ...) were removed. Use the names above. There is no `unseal_order` in v2; `GET /orders/{id}` returns `redemption_info` when delivered.

## Resources

- `bitrefill://payment-methods`: allowed `payment_method` strings for `buy-products` / `create-esim-invoice`
- `bitrefill://category-slugs`: B2B `category` query values for product list/search
- `bitrefill://product-types`: product family keys
- `bitrefill://product-types/{productType}`: category slugs per family

## Project layout

```
src/
  index.ts
  types/api.ts          # Optional TS shapes for API JSON (not validated at runtime)
  constants/            # payment_method list, category slugs
  handlers/             # resources.ts, tools.ts
  schemas/              # Zod: inputs only
  services/             # API calls (search, products, invoices, orders, esims, misc)
  utils/api/            # base (BitrefillApiError), authenticated (Bearer v2)
```

## Development

```bash
pnpm install
pnpm run build
pnpm run typecheck
pnpm run lint
```

### Smoke tests (this repo’s MCP only)

Smoke tests always start **this package’s** server (`node build/index.js` after `pnpm run build`). They do **not** open `https://api.bitrefill.com/mcp` or any other remote MCP URL.

**Recommended**: MCP client in-process (stdio to `build/index.js`):

```bash
pnpm run build
pnpm run smoke
```

Same as `pnpm run test-services` (alias).

**Optional**: [MCP Inspector](https://modelcontextprotocol.io/docs/tools/inspector) CLI, still only against **this** server:

```bash
pnpm run build
pnpm run smoke:inspector
```

**All 18 tools** (Inspector CLI, summary lines, dummy ids on purpose):

```bash
pnpm run test:inspector:all-tools
```

The Inspector uses **`--tool-arg key=value`** (repeat for multiple keys), not a single JSON blob. For nested data, use JSON in the value, e.g.  
`--tool-arg 'products=[{"product_id":"x","value":10}]'`.

Interactive UI (local server only):

```bash
pnpm run build
pnpm run inspector
```

Examples:

```bash
pnpm dlx @modelcontextprotocol/inspector node build/index.js --cli --method tools/call --tool-name ping
pnpm dlx @modelcontextprotocol/inspector node build/index.js --cli --method tools/call --tool-name product-details --tool-arg id=test-gift-card-code
```

## Client examples (self-hosted sample)

> Reminder: for production, prefer the hosted `https://api.bitrefill.com/mcp` (OAuth) over the stdio config below.

**Cursor / Claude-style MCP config**, pass the key in `env`:

```json
{
  "mcpServers": {
    "bitrefill": {
      "command": "npx",
      "args": ["-y", "bitrefill-mcp-server"],
      "env": {
        "BITREFILL_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

**Docker**, e.g. `-e BITREFILL_API_KEY=...` or `--env-file .env`.

**Hosted remote MCP** (no install, recommended):

```json
{
  "mcpServers": {
    "bitrefill": {
      "url": "https://api.bitrefill.com/mcp"
    }
  }
}
```

## Documentation

- [Bitrefill docs](https://docs.bitrefill.com) ([llms index](https://docs.bitrefill.com/llms.txt))
- [Bitrefill eCommerce MCP (hosted)](https://docs.bitrefill.com/docs/ecommerce-mcp): official remote server, recommended for production
- [Setup guides](https://docs.bitrefill.com/docs/setup-guides): ChatGPT, Claude, Cursor

## License

MIT

TDQS

A3.7/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a clearly distinct purpose with no ambiguity: 'categories' retrieves product categories, 'detail' gets product information, 'ping' checks API availability, and 'search' finds products. The descriptions explicitly differentiate their roles, such as suggesting to use 'categories' before 'search' for better context, ensuring an agent can easily tell them apart.

Naming Consistency5/5

All tool names follow a consistent, simple noun-based pattern (e.g., 'categories', 'detail', 'ping', 'search') without mixing conventions like camelCase or snake_case. This predictability makes the set easy to navigate and understand at a glance.

Tool Count5/5

With 4 tools, the server is well-scoped for its purpose of searching and shopping on Bitrefill. Each tool earns its place by covering essential functions: API health check, category mapping, product search, and detailed product viewing, avoiding bloat or thin coverage.

Completeness4/5

The tool surface is nearly complete for a search and shop domain, covering discovery (categories, search), inspection (detail), and availability (ping). A minor gap exists in lacking purchase or checkout tools, but agents can work around this by using the provided tools to gather information before external actions.

Maintenance

ActivityInactive
ResponsivenessUnresponsive