Skip to main content
Glama
djalal

quran-mcp-server

by djalal

chapter-reciters

Find chapter reciters for Quranic verses by specifying the desired language. Integrates with the Quran.com corpus REST API v4 for accurate and accessible recitation options.

Instructions

List of Chapter Reciters

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
languageNoName of reciters in specific language

Implementation Reference

  • The primary handler function that executes the 'chapter-reciters' tool logic. It validates the input arguments using the schema, calls the audio service, formats the response, and handles errors.
    /**
     * Handler for the chapter-reciters tool
     */
    export async function handleChapterReciters(args: any) {
      try {
        // Validate arguments
        const validatedArgs = chapterRecitersSchema.parse(args);
        
        // Call the service
        const result = await audioService.listChapterReciters(validatedArgs);
        
        // Log the response in verbose mode
        verboseLog('response', {
          tool: 'chapter-reciters',
          result
        });
        
        return {
          content: [
            {
              type: "text",
              text: JSON.stringify(result, null, 2)
            }
          ]
        };
      } catch (error) {
        verboseLog('error', {
          tool: 'chapter-reciters',
          error: error instanceof Error ? error.message : String(error)
        });
        
        // Use the standardized error response utility
        const { createErrorResponse } = require('../utils/error-handler');
        return createErrorResponse(error, 'chapter-reciters');
      }
    }
  • Zod schema for validating input parameters to the 'chapter-reciters' tool, specifically an optional language parameter.
    /**
     * Schema for chapter-reciters
     */
    export const chapterRecitersSchema = z.object({
      language: z.string().optional().describe("Name of reciters in specific language"),
    });
  • src/server.ts:221-225 (registration)
    Registration of the 'chapter-reciters' tool in the MCP server's listTools response, defining its name, description, and input schema.
      name: ApiTools.chapter_reciters,
      description: "List of Chapter Reciters",
      inputSchema: zodToJsonSchema(audioSchemas.chapterReciters),
    },
    {
  • src/server.ts:303-304 (registration)
    Dispatch/registration of the handler function for the 'chapter-reciters' tool in the MCP callTool request handler switch statement.
    case ApiTools.chapter_reciters:
      return await handleChapterReciters(request.params.arguments);
  • Core service method implementing the logic for fetching chapter reciters: API request, caching, fallback to mock data on errors.
    async listChapterReciters(params: z.infer<typeof chapterRecitersSchema>): Promise<ChapterRecitersResponse> {
      try {
        // Validate parameters
        const validatedParams = chapterRecitersSchema.parse(params);
        
        // Check cache first
        const now = Date.now();
        if (this.chapterRecitersCache && (now - this.chapterRecitersCacheTimestamp < CACHE_DURATION_MS)) {
          verboseLog('response', {
            method: 'listChapterReciters',
            source: 'cache',
            age: `${(now - this.chapterRecitersCacheTimestamp) / 1000} seconds`
          });
          
          return {
            success: true,
            message: "chapter-reciters executed successfully (from cache)",
            data: this.chapterRecitersCache
          };
        }
        
        try {
          // Make request to Quran.com API
          const url = `${API_BASE_URL}/resources/chapter_reciters`;
          const response = await makeApiRequest(url, {
            language: validatedParams.language
          });
          
          verboseLog('response', {
            method: 'listChapterReciters',
            source: 'api',
            dataSize: JSON.stringify(response).length
          });
          
          // Update cache
          this.chapterRecitersCache = response;
          this.chapterRecitersCacheTimestamp = now;
          
          return {
            success: true,
            message: "chapter-reciters executed successfully",
            data: response
          };
        } catch (axiosError) {
          verboseLog('error', {
            method: 'listChapterReciters',
            error: axiosError instanceof Error ? axiosError.message : String(axiosError)
          });
          
          // If the API call fails, return mock data
          verboseLog('response', {
            method: 'listChapterReciters',
            source: 'mock',
            reason: 'API unavailable'
          });
          
          const mockData = this.getChapterRecitersMockData();
          
          return {
            success: true,
            message: "chapter-reciters executed with mock data (API unavailable)",
            data: mockData
          };
        }
      } catch (error) {
        verboseLog('error', {
          method: 'listChapterReciters',
          error: error instanceof Error ? error.message : String(error)
        });
        
        if (error instanceof z.ZodError) {
          throw new ApiError(`Validation error: ${error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ')}`, 400);
        }
        
        // Return mock data as a fallback for any error
        verboseLog('response', {
          method: 'listChapterReciters',
          source: 'mock',
          reason: 'error occurred'
        });
        
        const mockData = this.getChapterRecitersMockData();
        
        return {
          success: true,
          message: "chapter-reciters executed with mock data (error occurred)",
          data: mockData
        };
      }
    }

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/djalal/quran-mcp-server'

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