Waktu Solat MCP
# 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
Scored across 4 tools
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.
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.
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.
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.