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
| Name | Required | Description | Default |
|---|---|---|---|
| book | Yes | Book name (English or Korean) or code | |
| chapter | Yes | Chapter number | |
| verseStart | Yes | Starting verse number | |
| verseEnd | No | Ending verse number (optional, defaults to verseStart) | |
| version | No | Bible translation version (default: GAE) | GAE |
Implementation Reference
- src/index.ts:419-458 (handler)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 }], }; }
- src/index.ts:283-309 (schema)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"], }, },
- src/index.ts:143-194 (helper)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, }; }
- src/index.ts:109-130 (helper)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; }