Skip to main content
Glama
khrnchn

Waktu Solat MCP

by khrnchn

Waktu Solat MCP

MCP server for Malaysian prayer times via 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?"

Related MCP server: Zmanim MCP Server

Local (stdio)

uv sync
uv run waktusolat-mcp

Claude Desktop config:

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

Claude Code (local stdio server):

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

Verify in Claude Code:

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:

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):

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

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

Available Tools

4 tools
get_next_prayerB

Get the next upcoming prayer time for the given zone. If all prayers today have passed, returns next day's Fajr/Subuh.

ParametersJSON Schema
NameRequiredDescriptionDefault
zoneYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full transparency burden. It does disclose the rollover behavior (next day's Fajr/Subuh), which is genuinely useful behavioral detail. However, it doesn't mention what timezone the returned time is in, output format, or any edge cases beyond the rollover. Given this is a read-only lookup, the disclosure is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero wasted words. The purpose and the key edge-case behavior are both conveyed efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has only one parameter and a simple deterministic behavior, so the description is close to sufficient. However, with an output schema present, the return format is partially covered by the schema, but the zone-format gap and lack of usage guidance vs siblings leave some contextual incompleteness. An output schema exists, reducing the need to explain return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. The description mentions 'zone' as the input concept but provides no format for it (e.g., what zone strings look like, whether it maps to the sibling list_zones). The single parameter is largely unexplained beyond its name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb+resource: 'Get the next upcoming prayer time for the given zone.' It differentiates from siblings by focusing on the next upcoming prayer rather than a full-day or month listing, though it doesn't explicitly name the sibling alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the fallback behavior (returns next day's Fajr if all today's prayers passed), which implies when to use this tool versus checking all of today's prayers. However, it doesn't explicitly contrast with get_prayer_times_today or get_prayer_times_month, nor does it mention zone-format requirements.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_prayer_times_monthC

Get prayer times for all days in a given month. Zone codes follow JAKIM format (e.g. SGR01).

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
zoneYes
monthYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided for this read operation, so the description carries the full burden of disclosure. It doesn't state whether invalid zone codes cause errors, whether the operation is read-only/safe, what happens with invalid month/year values, or the response format. The zone format hint (JAKIM) is useful but the description lacks broader behavioral clarity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two brief sentences with no wasted words. The purpose statement and zone format hint are both relevant. It's appropriately compact for its scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is an output schema, which helps with return-value understanding. Given the modest complexity (3 simple parameters for a read operation), the description covers the core purpose and one key data-format detail. However, it omits error behavior for invalid inputs and does not discuss month/year bounds, making it a minimum-viable but not thorough description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the three parameters. It only mentions the zone format (JAKIM format with example SGR01), offering no guidance on year/month ranges, constraints, or relationships between parameters. The description adds minimal value beyond what the bare field names imply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the verb+resource ('Get prayer times') with scope ('for all days in a given month'), which is clear. However, it doesn't explicitly distinguish from siblings like get_prayer_times_today beyond the month scope, though the month phrasing and sibling names make the distinction reasonably inferable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use guidance is given. The description implies this is for monthly retrieval (vs daily for get_prayer_times_today), but there is no discussion of when to choose one over another or any context about valid zones or required format beyond a single example (SGR01).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_prayer_times_todayA

Get prayer times for today in the given zone. Zone codes follow JAKIM format (e.g. SGR01, WLY01). Returns times in Malaysia time (MYT, UTC+8).

ParametersJSON Schema
NameRequiredDescriptionDefault
zoneYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden of behavioral disclosure. It does state the return timezone (MYT, UTC+8), which is useful. However, it doesn't disclose what fields the response contains, whether zone validity is checked, or error behavior for invalid zones. The timezone disclosure is genuinely helpful context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero waste. Each sentence serves a purpose: defining the scope (today, zone), specifying zone format, and clarifying timezone. Exceptionally tight and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (1 required param) with an output schema present, so the description doesn't need to explain return format. It covers the zone format and timezone semantics. It's slightly incomplete regarding validation behavior and whether open-ended zones are accepted vs only those from list_zones, but for a single-param tool with output schema this is adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the zone parameter. It does explain the zone format (JAKIM, e.g. SGR01, WLY01) and gives examples, which adds real meaning beyond the schema. However, it doesn't indicate whether the zone must map to a listed zone from list_zones, which would be useful given that sibling tool exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb+resource (get prayer times for today) and scopes it to 'today' in 'the given zone'. It distinguishes from siblings by highlighting the 'today' scope vs get_prayer_times_month. However, it doesn't explicitly differentiate from get_next_prayer, so it loses a point.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly conveys usage by scoping to 'today' and a specific zone format, which differentiates it from the month tool. However, there are no explicit when-to-use or exclusion statements, nor mention of when get_next_prayer or list_zones would be preferable. The zone code format note (JAKIM) is helpful context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_zonesB

List JAKIM prayer zone codes with area descriptions. Optionally filter by state code (e.g. SGR, JHR, WLY).

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden of behavioral disclosure. It's a read/list operation, which is inferable but never stated explicitly. It doesn't describe output format, pagination, or whether an empty/invalid state returns all zones or an error. With zero annotations, more could be disclosed, but the nature is fairly benign.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the primary purpose. Efficient and easy to scan. Could be slightly more descriptive without bloating, but overall tight and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and a single optional param, this is a simple tool. The description covers the core purpose and the key parameter adequately. However, it's missing the default-when-no-state behavior and doesn't confirm whether all zones are returned when no filter is applied—small but relevant gaps for a lookup tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% (no param descriptions), so the description must compensate. It does explain the `state` parameter with example codes (SGR, JHR, WLY), which is genuinely useful. However, it doesn't mention the default behavior (whether null returns all zones) or accepted code format beyond the three examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb+resource ('List JAKIM prayer zone codes') with a specific description scope ('with area descriptions'). It distinguishes reasonably from siblings like get_prayer_times_today/month, as it's the only zone-list tool. Doesn't explicitly differentiate but purpose is specific enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description notes the optional state filter, implying it's used for filtering/list operations. However, it provides no explicit guidance on when to use this vs alternatives, or when the state filter is needed vs. listing all zones. The state codes (SGR, JHR, WLY) context is helpful but usage boundaries are left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 4 tool updatesv0.1.0
    • First observedget_next_prayer
    • First observedget_prayer_times_month
    • First observedget_prayer_times_today
    • First observedlist_zones

TDQS

B3.4/5.0
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

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that provides access to Malaysia prayer time data through Claude Desktop, enabling users to retrieve prayer times for specific zones, list available prayer zones, and check current prayer time status.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    A comprehensive MCP server for calculating Jewish prayer times (zmanim) using the python-zmanim library, supporting multiple halachic opinions and global locations.
    6
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server providing Malaysian/global prayer times (JAKIM + Aladhan fallback), nearest mosque/surau finder, and Islamic calendar events.
    4
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Remote MCP server exposing Wasilah's Islamic reference data, enabling prayer-time, Qibla, Hijri-date, and Quran-audio queries via natural language.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/khrnchn/waktu-solat-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server