jw-mcp
v1.3.2
Published
MCP server for JW.org content: Bible scripture lookup with study content, workbook materials, Watchtower articles, and video captions
Maintainers
Readme
JW MCP Server
An MCP server for working with JW.org content — Bible scripture lookup with study notes, workbook materials, Watchtower articles, and video captions.
Quick Start
Claude Code (Recommended)
claude mcp add jw-mcp -- npx -y jw-mcpClaude Desktop
Download the latest jw-mcp.mcpb from Releases and open it — Claude Desktop will install it automatically.
Or add manually to your config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows):
{
"mcpServers": {
"jw-mcp": {
"command": "npx",
"args": ["-y", "jw-mcp"]
}
}
}Other MCP Clients (Cursor, Windsurf, etc.)
npx -y jw-mcpDocker (self-hosted)
Run this server on a machine with a public HTTPS URL, then paste that URL into Grok, Claude.ai, or ChatGPT as a custom connector.
Compose binds the container to loopback only (127.0.0.1:8080). Do not publish port 8080 on the public internet. Put a reverse proxy on the host, terminate TLS there, and proxy to 127.0.0.1:8080.
- Copy
.env.exampleto.env. - Set
MCP_BASE_URLto your public origin, with no path. Example:https://jw-mcp.example.com. - Set
MCP_AUTH_SECRETto a long access key (at least 16 characters). - Keep
MCP_AUTH=true. HTTP mode with auth off is loopback-only. Do not disable auth in Docker. - Set
MCP_TRUST_PROXY=trueonly when the reverse proxy overwritesX-Forwarded-For. Leave it unset otherwise. - Start it:
docker compose up --build -dThe connector URL is:
https://your-host/mcpWhen you add the connector, the AI site opens a login page. Type the same access key you put in MCP_AUTH_SECRET.
| Client | Where to add it | |---|---| | Grok | grok.com/connectors → New Connector → Custom | | Claude.ai | Customize → Connectors → Add custom connector | | ChatGPT | Settings → enable Developer mode → add the server URL |
Local HTTP (http://localhost:8080) is fine for testing because compose binds loopback. Claude, ChatGPT, and Grok must reach a public HTTPS URL. A tunnel such as ngrok or Cloudflare Tunnel can expose that loopback port for a live click-test. Do not publish 8080 on 0.0.0.0.
Auth codes, clients, and tokens are stored in the jw-mcp-auth Docker volume so a container restart does not drop every connection.
Tools
All tools support multiple languages via the langwritten parameter (E = English, S = Spanish, F = French, etc.).
Bible Scripture Tools
search_bible_books
Search for Bible books by name, abbreviation, or number.
{ "query": "matthew" }get_bible_verse
Get plain verse text from wol.jw.org. Books are numbered 1-66 (1-39 OT, 40-66 NT).
{ "book": 43, "chapter": 3, "verse": 16 }get_verse_with_study
Get verses with study notes, cross-references, and research articles. Supports ranges.
{
"book": 40, "chapter": 5, "verse": "3-5",
"fields": ["verses", "study_notes", "study_articles"]
}Available fields: verses, study_notes, study_articles, cross_references, chapter_level, combined_text

get_bible_verse_url
Generate JW.org URLs for verses, ranges, or chapters — useful for adding clickable links to documents.
{ "book": 19, "chapter": 83, "verse": "18" }
{ "book": 23, "chapter": 46, "verse": "9-11" }
{ "book": 40, "chapter": 5 }
Workbook Tools
getWorkbookLinks
Get available Christian Life and Ministry workbook weeks for the current or a specific issue.
{ "issue": "20250500", "langwritten": "E" }getWorkbookContent
Download and parse a workbook week's RTF content to clean plain text (70% token reduction).
{ "url": "https://cfp2.jw-cdn.org/a/clm_E_202505_01.rtf" }
Watchtower Tools
getWatchtowerLinks
Get available Watchtower study articles. Automatically uses the correct issue (published 2 months ahead of study period).
{ "issue": "20250300", "langwritten": "E" }getWatchtowerContent
Download and parse a Watchtower article's RTF content to clean plain text (70% token reduction).
{ "url": "https://cfp2.jw-cdn.org/a/w_E_202509_01.rtf" }
Video Caption Tools
get_jw_captions
Fetch video captions and metadata by video ID or any JW.org URL.
{ "video_id": "pub-jwbvod25_17_VIDEO" }Also accepts full JW.org URLs — the video ID is extracted automatically.

Troubleshooting
- "Could not read package.json" — Use absolute path in Claude Desktop config
- Server disconnects — Ensure Node.js is installed (
npm install) - Permission denied —
chmod +x start-server.sh
Development
npm start # stdio mode (local)
npm run start:http # HTTP mode (testing)
npm test # OAuth + HTTP connector testsBuilt with Node.js, MCP SDK, node-fetch, and cheerio.
License
MIT
