Skip to main content
Glama
khrnchn

Waktu Solat MCP

by khrnchn
README.md
# Waktu Solat MCP

MCP server for Malaysian prayer times via [api.waktusolat.app](https://api.waktusolat.app). Works with Claude, Cursor, and other MCP clients.

**Tools:** `get_prayer_times_today`, `get_prayer_times_month`, `get_next_prayer`, `list_zones`

## Zone codes (important)

Prayer tools require a JAKIM zone code (for example: `WLY01`, `SGR01`, `JHR01`).

If you are unsure which code to use, run:

- `list_zones()` to see all zones
- `list_zones("SGR")` to filter by state code (examples: `SGR`, `JHR`, `WLY`)

Example prompts in Claude/Cursor:

- "List all Selangor zones"
- "Get today's prayer times for `WLY01`"
- "What's the next prayer for `SGR01`?"

## Local (stdio)

```bash
uv sync
uv run waktusolat-mcp
```

Claude Desktop config:
```json
{
  "mcpServers": {
    "waktusolat": {
      "command": "uv",
      "args": ["--directory", "/path/to/waktu-solat-mcp", "run", "waktusolat-mcp"]
    }
  }
}
```

Claude Code (local stdio server):

```bash
claude mcp add --transport stdio waktusolat -- \
  uv --directory /path/to/waktu-solat-mcp run waktusolat-mcp
```

Verify in Claude Code:

```bash
claude mcp list
claude mcp get waktusolat
```

After connecting, try:

- "When is Maghrib in `WLY01` today?"
- "Show me prayer times this month for `SGR01`"

## Hosted (HTTP)

Public deployment (Railway):

- **Web UI:** `https://web-production-99037.up.railway.app/`
- **MCP endpoint:** `https://web-production-99037.up.railway.app/mcp`

Run with HTTP transport to serve a web UI with "Add to Cursor" / "Add to Claude" buttons:

```bash
uv run waktusolat-mcp-http
```

Or: `MCP_TRANSPORT=streamable-http uv run waktusolat-mcp`

- **Web UI:** `http://localhost:8000/`
- **MCP endpoint:** `http://localhost:8000/mcp`

Claude Code (remote HTTP server):

```bash
claude mcp add --transport http waktusolat https://web-production-99037.up.railway.app/mcp
```

Then run `/mcp` inside Claude Code to check connection/auth status.

Deploy to Railway, Render, etc. Set `PORT` (PaaS usually provides this). The app binds to `0.0.0.0` and uses `PORT` automatically. If behind a proxy, set `MCP_BASE_URL` to your public URL (for example this app uses `https://web-production-99037.up.railway.app`) so install links use the correct URL.

## Docker

```bash
docker compose up --build
# Web UI: http://localhost:8000/
# MCP: http://localhost:8000/mcp
```

TDQS

B3.4/5.0

Scored across 4 tools

Disambiguation4/5

The four tools have mostly distinct purposes: daily times, monthly times, next prayer, and zone listing. get_prayer_times_today and get_next_prayer have slight overlap since both return today's prayer data, but their intents are clearly different (full schedule vs. nearest upcoming prayer). list_zones is a clear utility/discovery tool.

Naming Consistency5/5

All tools follow a consistent get_verb + target noun pattern: get_prayer_times_today, get_prayer_times_month, get_next_prayer, and list_zones. The naming is uniform, snake_case, and predictable throughout.

Tool Count4/5

Four tools is a reasonable, focused set for a prayer time domain. There could arguably be a get_zone_details or a between-days range tool, but the count is well-scoped and each tool serves a clear purpose without bloat.

Completeness4/5

The core domain is well covered: daily lookup, monthly schedule, next-prayer calculation, and zone discovery. A minor gap exists (no explicit date-range lookup or zone-specific settings/metadata), but agents can accomplish the primary workflows: find prayer times for today/month, determine next prayer, and discover zones.

Maintenance

ActivityInactive
ResponsivenessNo issues