Skip to main content
Glama
oksure

Bible Korean MCP Server

by oksure

get-verses

Retrieve specific Bible verses in Korean translations by specifying book, chapter, and verse numbers. Access multiple Korean Bible versions including GAE, NIR, and KOR for study or reference purposes.

Instructions

Get specific verse(s) from a chapter

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
bookYesBook name (English or Korean) or code
chapterYesChapter number
verseStartYesStarting verse number
verseEndNoEnding verse number (optional, defaults to verseStart)
versionNoBible translation version (default: GAE)GAE

Implementation Reference

  • Handler for 'get-verses' tool: resolves book code, fetches full chapter, filters verses by range, formats and returns as markdown.
    case "get-verses": { const { book, chapter, verseStart, verseEnd, version = "GAE" } = args as { book: string; chapter: number; verseStart: number; verseEnd?: number; version?: string; }; const bookCode = findBookCode(book); if (!bookCode) { return { content: [ { type: "text", text: `Error: Book '${book}' not found.`, }, ], }; } const chapterData = await fetchChapter(bookCode, chapter, version); const endVerse = verseEnd || verseStart; const selectedVerses = chapterData.verses.filter( (v) => v.number >= verseStart && v.number <= endVerse ); let result = `# ${chapterData.book} ${chapterData.chapter}:${verseStart}`; if (endVerse !== verseStart) result += `-${endVerse}`; result += `\n**Translation:** ${chapterData.versionName}\n\n`; for (const verse of selectedVerses) { result += `**${verse.number}.** ${verse.text}\n\n`; } return { content: [{ type: "text", text: result }], }; }
  • Input schema definition for the 'get-verses' tool, specifying parameters like book, chapter, verse range, and version.
    inputSchema: { type: "object", properties: { book: { type: "string", description: "Book name (English or Korean) or code", }, chapter: { type: "number", description: "Chapter number", }, verseStart: { type: "number", description: "Starting verse number", }, verseEnd: { type: "number", description: "Ending verse number (optional, defaults to verseStart)", }, version: { type: "string", description: "Bible translation version (default: GAE)", enum: ["GAE", "GAE1", "NIR", "KOR", "CEV"], default: "GAE", }, }, required: ["book", "chapter", "verseStart"],
  • src/index.ts:280-311 (registration)
    Tool registration in the tools array used by ListToolsRequestSchema handler.
    { name: "get-verses", description: "Get specific verse(s) from a chapter", inputSchema: { type: "object", properties: { book: { type: "string", description: "Book name (English or Korean) or code", }, chapter: { type: "number", description: "Chapter number", }, verseStart: { type: "number", description: "Starting verse number", }, verseEnd: { type: "number", description: "Ending verse number (optional, defaults to verseStart)", }, version: { type: "string", description: "Bible translation version (default: GAE)", enum: ["GAE", "GAE1", "NIR", "KOR", "CEV"], default: "GAE", }, }, required: ["book", "chapter", "verseStart"], }, },
  • Core helper function that fetches and parses a Bible chapter from the website, used by get-verses to get verse data.
    async function fetchChapter( bookCode: string, chapter: number, version: string = "GAE" ): Promise<Chapter> { const url = `https://www.bskorea.or.kr/bible/korbibReadpage.php?version=${version}&book=${bookCode}&chap=${chapter}`; const response = await fetch(url); const html = await response.text(); const $ = cheerio.load(html); const verses: Verse[] = []; // Parse verses from span elements // The website uses span elements where verse text starts with verse number $("span").each((i, elem) => { const text = $(elem).text().trim(); // Look for pattern: number followed by spaces and text const match = text.match(/^(\d+)\s+(.+)$/s); if (match) { const verseNum = parseInt(match[1]); let verseText = match[2]; // Remove footnote markers (like 1), 2), etc.) verseText = verseText.replace(/\d+\)/g, "").trim(); // Remove explanatory text that comes after line breaks (like "또는 ...") const lines = verseText.split("\n"); verseText = lines[0].trim(); // Avoid duplicate verses (website has multiple spans per verse) if (!verses.find((v) => v.number === verseNum)) { verses.push({ number: verseNum, text: verseText, }); } } }); const bookInfo = getBookInfo(bookCode); return { book: bookInfo?.name || bookCode, bookKorean: bookInfo?.korean || "", chapter, version, versionName: TRANSLATIONS[version] || version, verses, }; }
  • Helper to resolve book name (English, Korean, or code) to the internal book code used in URLs.
    function findBookCode(bookName: string): string | null { const normalized = bookName.toLowerCase().trim(); // Try direct match for (const [name, info] of Object.entries(BIBLE_BOOKS)) { if (name.toLowerCase() === normalized || info.korean === bookName || info.code === normalized) { return info.code; } } // Try partial match for (const [name, info] of Object.entries(BIBLE_BOOKS)) { if (name.toLowerCase().includes(normalized) || info.korean.includes(bookName)) { return info.code; } } return null; }

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/oksure/bible-ko-mcp'

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