# lookup-holiday [Health: Active]

**Category:** 💰 Finance & Fintech  
**Repository:** https://github.com/encodi/lookup-holiday  
**GitHub Stars:** 0  
**Views:** 0  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/lookup-holiday

## Description
Real public holiday lookup for 206 countries via a rule-based calendar engine. Paid via x402.

## Claude Desktop Quick Installation
Heuristic fallback — verify the package name and runner against the repository README before running it. Uses `npx` (confidence: low):

```json
"mcpServers": {
  "lookup-holiday": {
    "command": "npx",
    "args": ["-y","lookup-holiday"]
  }
}
```

## Documentation & README

# lookup-holiday

[![lookup-holiday MCP server](https://glama.ai/mcp/servers/encodi/lookup-holiday/badges/score.svg)](https://glama.ai/mcp/servers/encodi/lookup-holiday)

Remote MCP server (Cloudflare Workers) with one tool that looks up real public holidays:

- **`lookup_holiday`** — real holidays for a country (and optionally a state/subdivision and region) and year, from a rule-based calendar engine covering 206 countries. Moveable holidays (Easter, lunar calendars, "nth weekday of month" rules, etc.) are computed with real date arithmetic, not guessed by the model.

No database, no persistent state: each call builds a fresh `McpServer` (see `createServer()` in `src/index.ts`). The calendar engine is [`date-holidays`](https://github.com/commenthol/date-holidays), bundled directly into the Worker.

## Data attribution

The holiday **data** (which dates are holidays, their names) comes from the `date-holidays` project and is licensed **CC BY-SA 3.0**, since it's compiled from Wikipedia articles — see [`NOTICE`](https://github.com/encodi/lookup-holiday/blob/HEAD/NOTICE) and [their LICENSE file](https://github.com/commenthol/date-holidays/blob/master/LICENSE) for the full per-country attribution list. Only the **code** in this repository is MIT; see [`LICENSE`](https://github.com/encodi/lookup-holiday/blob/HEAD/LICENSE).

## Billing (x402)

Charges per call via [x402](https://x402.org) — real USDC payment on **Base mainnet**, against the Coinbase Developer Platform (CDP) facilitator. The payment travels inside the MCP JSON-RPC itself (`_meta`), not as an HTTP header; see `src/payments.ts`.

| Tool | Price |
|---|---|
| `lookup_holiday` | $0.01 USDC |

An unpaid `tools/call` returns `isError: true` with the `accepts` (network, amount, `payTo`) the client needs to pay and retry — not an unexplained exception.

## Structure

```
src/
  index.ts          # registers the tool in the McpServer and exposes the MCP HTTP handler
  payments.ts       # x402 billing on Base mainnet via the CDP facilitator
  tools/
    holiday.ts         # pure logic for lookup_holiday (testable without Workers)
    holiday.test.ts
scripts/
  dev-node.ts       # dev server that runs the handler in plain Node, no wrangler
```

## Running it locally

⚠️ **Note on `wrangler dev`**: the real Cloudflare Workers runtime (`workerd`) requires **macOS 13.5+**. If your Mac has an older version, `wrangler dev` (and `npm run dev`) will fail. This project includes a plain-Node shim that runs the exact same `fetch()` handler without needing `workerd`.

### 1. Install dependencies

```bash
npm install
```

### 2. Run the unit tests

```bash
npm test
```

### 3a. If your wrangler dev works (macOS 13.5+, Linux, Windows)

```bash
npm run dev
```

### 3b. If `wrangler dev` fails because of the macOS version

```bash
npm run dev:node
```

Starts at `http://localhost:8787/mcp`, reading CDP credentials from `~/.mcp-tools-factory-credentials.env` (shared across all tools in this factory).

### 4. Test with curl

```bash
# 1) initialize
curl -s -X POST http://localhost:8787/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl-test","version":"0.0.1"}}}'

# 2) tools/list
curl -s -X POST http://localhost:8787/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'

# 3) tools/call — lookup_holiday
curl -s -X POST http://localhost:8787/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"lookup_holiday","arguments":{"country":"US","state":"TX","year":2026}}}'
```

Responses come as Server-Sent Events (`event: message` + `data: {...}`); the `data:` line is the usual JSON-RPC response.

## Deploy and listings

Deployed at `https://lookup-holiday.encodari.workers.dev/mcp` (Cloudflare Workers). Published on the [official MCP registry](https://registry.modelcontextprotocol.io), [Smithery](https://smithery.ai), [mcp.so](https://mcp.so), [Glama](https://glama.ai), and with an open PR to [awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers).

## What it doesn't do (yet)

- Charges on Base mainnet with real money. To switch back to testnet (Base Sepolia, `eip155:84532`) during development, change `NETWORK` in `src/payments.ts`.
- No database or persistent state between calls (beyond the billing config, cached in memory per isolate — see `src/payments.ts`).
- Doesn't model when a holiday was first introduced — a rule like "3rd Monday in January" is applied to any requested year even if the holiday didn't exist yet historically. Fine for scheduling near-term years; not a historical record.

