{"_id":"@asksakina/islamic-knowledge-mcp","_rev":"10-5c283703d716a66a905657465f0157e5","name":"@asksakina/islamic-knowledge-mcp","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.0":{"name":"@asksakina/islamic-knowledge-mcp","version":"1.0.0","keywords":["mcp","model-context-protocol","islam","islamic","quran","dua","supplication","hadith","asma-ul-husna","99-names-of-allah","spiritual","ai-agent","claude","sakina"],"license":"SEE LICENSE IN LICENSE","_id":"@asksakina/islamic-knowledge-mcp@1.0.0","maintainers":[{"name":"yserrag","email":"yousefserrag@gmail.com"}],"homepage":"https://www.asksakina.com","bugs":{"url":"https://github.com/yserrag/sakina-v3/issues"},"bin":{"sakina-mcp":"dist/server.js"},"dist":{"shasum":"be85c51c2ca59ec568b8f1ee7a22c5db1c0cafcf","tarball":"https://registry.npmjs.org/@asksakina/islamic-knowledge-mcp/-/islamic-knowledge-mcp-1.0.0.tgz","fileCount":39,"integrity":"sha512-PGMtBfS/FwncvqchbTOnb0TR9iccjIK9n2wdNCCTlPz3ub55d5hUI2EaRnjNwaK4rfCmzNtEsfHXEShQuDzV7Q==","signatures":[{"sig":"MEYCIQD6phdYJJcZ9GsyyuOFDh6xihkI/UL4jYuS+IcBB7+DgwIhAJUQJpEAPSuggt2mFgEcQTZhJYNRQ+J/HDAslf6voh4J","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":597321},"main":"dist/server.js","engines":{"node":">=20"},"gitHead":"dd38ef695cbfadbac188a4e4627d08b21835169c","mcpName":"com.asksakina/islamic-knowledge","private":false,"scripts":{"build":"tsc -p tsconfig.build.json && node scripts/postbuild.mjs","start":"tsx src/server.ts","typecheck":"tsc --noEmit","start:dist":"node dist/server.js","test:tools":"tsx scripts/test-tools.ts","bundle-data":"tsx scripts/bundle-data.ts","prepublishOnly":"npm run bundle-data && npm run build && npm run test:tools"},"_npmUser":{"name":"yserrag","email":"yousefserrag@gmail.com"},"deprecated":"Superseded by 1.5.1. This version's description is out of date: install @asksakina/islamic-knowledge-mcp@latest.","repository":{"url":"git+https://github.com/yserrag/sakina-v3.git","type":"git"},"_npmVersion":"11.12.1","description":"Verified Islamic knowledge MCP server — Quranic verses, authenticated du'as, and the 99 Names of Allah. Scholar-reviewed across mainstream Sunni schools (Hanafi, Maliki, Shafi'i, Hanbali). Provides three lookup tools to AI agents over the Model Context Pr","directories":{},"_nodeVersion":"24.15.0","dependencies":{"zod":"^3.23.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^5.6.2","@types/node":"^22.7.4"},"_npmOperationalInternal":{"tmp":"tmp/islamic-knowledge-mcp_1.0.0_1778336154967_0.607289838882151","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@asksakina/islamic-knowledge-mcp","version":"1.0.1","keywords":["mcp","model-context-protocol","islam","islamic","quran","dua","supplication","hadith","asma-ul-husna","99-names-of-allah","spiritual","ai-agent","claude","sakina"],"license":"SEE LICENSE IN LICENSE","_id":"@asksakina/islamic-knowledge-mcp@1.0.1","maintainers":[{"name":"yserrag","email":"yousefserrag@gmail.com"}],"homepage":"https://www.asksakina.com","bugs":{"url":"https://github.com/yserrag/sakina-v3/issues"},"bin":{"sakina-mcp":"dist/server.js"},"dist":{"shasum":"df5f40e413321e70aec8a8341594c42974514990","tarball":"https://registry.npmjs.org/@asksakina/islamic-knowledge-mcp/-/islamic-knowledge-mcp-1.0.1.tgz","fileCount":39,"integrity":"sha512-XZ0FBw80bNp83A3rL43qbNJ+c9P3mi7C1GBGh4sb731xlLEaykmbcRe0r2/0xCbHADWv4oB3GJsusMsQBTHaFQ==","signatures":[{"sig":"MEUCIQC+XFAIlUAQPEzl8WPEzTrn7VxJv4MT5rzGy6Ymxzzy4gIgVgjWrswFLXScHGmoBV/VgzYV979Ak9eIez++aisjC6E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":597321},"main":"dist/server.js","engines":{"node":">=20"},"gitHead":"10b23f597ede84ec6e5949cdbb6f826a5db719cf","mcpName":"com.asksakina/islamic-knowledge","private":false,"scripts":{"build":"tsc -p tsconfig.build.json && node scripts/postbuild.mjs","start":"tsx src/server.ts","typecheck":"tsc --noEmit","start:dist":"node dist/server.js","test:tools":"tsx scripts/test-tools.ts","bundle-data":"tsx scripts/bundle-data.ts","prepublishOnly":"npm run bundle-data && npm run build && npm run test:tools"},"_npmUser":{"name":"yserrag","email":"yousefserrag@gmail.com"},"deprecated":"Superseded by 1.5.1. This version's description is out of date: install @asksakina/islamic-knowledge-mcp@latest.","repository":{"url":"git+https://github.com/yserrag/sakina-v3.git","type":"git"},"_npmVersion":"11.12.1","description":"Verified Islamic knowledge MCP server — Quranic verses, authenticated du'as, and the 99 Names of Allah. Scholar-reviewed across mainstream Sunni schools (Hanafi, Maliki, Shafi'i, Hanbali). Provides three lookup tools to AI agents over the Model Context Pr","directories":{},"_nodeVersion":"24.15.0","dependencies":{"zod":"^3.23.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^5.6.2","@types/node":"^22.7.4"},"_npmOperationalInternal":{"tmp":"tmp/islamic-knowledge-mcp_1.0.1_1778488174531_0.5915321365887038","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@asksakina/islamic-knowledge-mcp","version":"1.2.0","keywords":["mcp","model-context-protocol","islam","islamic","quran","dua","supplication","hadith","asma-ul-husna","99-names-of-allah","spiritual","ai-agent","claude","sakina"],"license":"SEE LICENSE IN LICENSE","_id":"@asksakina/islamic-knowledge-mcp@1.2.0","maintainers":[{"name":"yserrag","email":"yousefserrag@gmail.com"}],"homepage":"https://www.asksakina.com","bugs":{"url":"https://github.com/yserrag/sakina-v3/issues"},"bin":{"sakina-mcp":"dist/server.js"},"dist":{"shasum":"d7e4b6cebaa9c7d101131dbf340fb5a6fe9e5ac3","tarball":"https://registry.npmjs.org/@asksakina/islamic-knowledge-mcp/-/islamic-knowledge-mcp-1.2.0.tgz","fileCount":50,"integrity":"sha512-tU8jv4kOp+BNp17IpUoHcYiXvC3IJ3KdK/Q1nWGd28Go0oDqYkrttQgB1BS++Oe3byrQxBtYYtMLb0WbrQESXQ==","signatures":[{"sig":"MEUCIQDAXSWffwZA4WVZ1LgxmyPXLqpCsIPJHycXsgdivLPcpwIgLsKhD+Ub/gCCHWsm7NC/uluW34Na3gLaXIHKjVv+lZI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":685439},"main":"dist/server.js","engines":{"node":">=20"},"gitHead":"1e8aeb8a0b71e474122b718f132b5b404d40bc77","mcpName":"com.asksakina/islamic-knowledge","private":false,"scripts":{"build":"tsc -p tsconfig.build.json && node scripts/postbuild.mjs","start":"tsx src/server.ts","prebuild":"npm run bundle-data","test:http":"tsx scripts/test-http-smoke.ts","typecheck":"tsc --noEmit","start:dist":"node dist/server.js","test:tools":"tsx scripts/test-tools.ts","bundle-data":"tsx scripts/bundle-data.ts","update-geoip":"node node_modules/geoip-lite/scripts/updatedb.js","prepublishOnly":"npm run bundle-data && npm run build && npm run test:tools && npm run test:analytics && npm run test:http","test:analytics":"tsx scripts/test-analytics.ts"},"_npmUser":{"name":"yserrag","email":"yousefserrag@gmail.com"},"deprecated":"Superseded by 1.5.1. This version's description is out of date: install @asksakina/islamic-knowledge-mcp@latest.","repository":{"url":"git+https://github.com/yserrag/sakina-v3.git","type":"git"},"_npmVersion":"10.8.2","description":"Verified Islamic knowledge MCP server — Quranic verses, authenticated du'as, and the 99 Names of Allah. Scholar-reviewed across mainstream Sunni schools (Hanafi, Maliki, Shafi'i, Hanbali). Provides three lookup tools to AI agents over the Model Context Pr","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","geoip-lite":"^1.4.10","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^5.6.2","@types/node":"^22.7.4","@types/geoip-lite":"^1.4.4"},"_npmOperationalInternal":{"tmp":"tmp/islamic-knowledge-mcp_1.2.0_1783094475682_0.3159299857598876","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@asksakina/islamic-knowledge-mcp","version":"1.3.0","keywords":["mcp","model-context-protocol","islam","islamic","quran","dua","supplication","hadith","asma-ul-husna","99-names-of-allah","spiritual","ai-agent","claude","sakina"],"license":"SEE LICENSE IN LICENSE","_id":"@asksakina/islamic-knowledge-mcp@1.3.0","maintainers":[{"name":"yserrag","email":"yousefserrag@gmail.com"}],"homepage":"https://www.asksakina.com","bugs":{"url":"https://github.com/yserrag/sakina-v3/issues"},"bin":{"sakina-mcp":"dist/server.js"},"dist":{"shasum":"39f6e0516029e2f9825ef97159fb1aebdbbbdf13","tarball":"https://registry.npmjs.org/@asksakina/islamic-knowledge-mcp/-/islamic-knowledge-mcp-1.3.0.tgz","fileCount":52,"integrity":"sha512-NrUc+Oh+pdTFLMVD8zYFIlQ+KEPd7UklPXIDSQQB1OGztGbKMYZZ46LvaobQresQWkU2T+hWtZz5tu4muhciCg==","signatures":[{"sig":"MEQCIFoAfXRUWhJHsk5HCZtUXqIk9coQe5R3Fv60mSLjJ5BqAiA8nhMy2iV7M8Qu2Juz1eeak0324a7Wumq/UYkzjqCXUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":710478},"main":"dist/server.js","engines":{"node":">=20"},"gitHead":"8c8e9e2579c8b69bb0e15aa3a4b4129b4775ae2e","mcpName":"com.asksakina/islamic-knowledge","private":false,"scripts":{"build":"tsc -p tsconfig.build.json && node scripts/postbuild.mjs","start":"tsx src/server.ts","prebuild":"npm run bundle-data","test:http":"tsx scripts/test-http-smoke.ts","typecheck":"tsc --noEmit","start:dist":"node dist/server.js","test:tools":"tsx scripts/test-tools.ts","bundle-data":"tsx scripts/bundle-data.ts","update-geoip":"node node_modules/geoip-lite/scripts/updatedb.js","prepublishOnly":"npm run bundle-data && npm run build && npm run test:tools && npm run test:analytics && npm run test:http","test:analytics":"tsx scripts/test-analytics.ts"},"_npmUser":{"name":"yserrag","email":"yousefserrag@gmail.com"},"deprecated":"Superseded by 1.5.1. This version's description is out of date: install @asksakina/islamic-knowledge-mcp@latest.","repository":{"url":"git+https://github.com/yserrag/sakina-v3.git","type":"git"},"_npmVersion":"10.8.2","description":"Verified Islamic knowledge MCP server — Quranic verses, authenticated du'as, and the 99 Names of Allah. Scholar-reviewed across mainstream Sunni schools (Hanafi, Maliki, Shafi'i, Hanbali). Provides three lookup tools to AI agents over the Model Context Pr","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","geoip-lite":"^1.4.10","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^5.6.2","@types/node":"^22.7.4","@types/geoip-lite":"^1.4.4"},"_npmOperationalInternal":{"tmp":"tmp/islamic-knowledge-mcp_1.3.0_1783694768804_0.1643723923905933","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@asksakina/islamic-knowledge-mcp","version":"1.4.0","keywords":["mcp","model-context-protocol","islam","islamic","quran","dua","supplication","hadith","asma-ul-husna","99-names-of-allah","spiritual","ai-agent","claude","sakina"],"license":"SEE LICENSE IN LICENSE","_id":"@asksakina/islamic-knowledge-mcp@1.4.0","maintainers":[{"name":"yserrag","email":"yousefserrag@gmail.com"}],"homepage":"https://www.asksakina.com","bugs":{"url":"https://github.com/yserrag/asksakina-mcp/issues"},"bin":{"sakina-mcp":"dist/server.js"},"dist":{"shasum":"a6d0fd2dcabe5d4c65e0c19aab8c4614c3ff64a1","tarball":"https://registry.npmjs.org/@asksakina/islamic-knowledge-mcp/-/islamic-knowledge-mcp-1.4.0.tgz","fileCount":48,"integrity":"sha512-BHboVPsZfRyzebjsduooIBN/cXf1PmZg/6yYzhuNJLSyK3QMVC1GzwLvgup/wfHAtvrmXHgG1Q1UJIB9Wsc/wQ==","signatures":[{"sig":"MEQCIFMxw5KduqXiUfvhrCn39pl7/0iE6W8zCI1cOFNxAyVtAiBpGigWLl6wPtZOVleO7Iy7ORNy04acd37AP2g5LU6Jpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD7iwdzjMIvznQqDvh2WFrAPLQfoc3ZgwgRXNA/8xcOFwIhAOW7Ff4O5pqxFcDAiLvEBZB9OiTwofQs3qvGEcTRy/5p","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":640564},"main":"dist/server.js","engines":{"node":">=20"},"gitHead":"fe98cc42ff6fc74413a9afded87b29db79ba28fd","mcpName":"com.asksakina/islamic-knowledge","private":false,"scripts":{"build":"tsc -p tsconfig.build.json && node scripts/postbuild.mjs","start":"tsx src/server.ts","guards":"node scripts/publish-guards.mjs","prebuild":"npm run bundle-data","test:http":"tsx scripts/test-http-smoke.ts","typecheck":"tsc --noEmit","start:dist":"node dist/server.js","test:tools":"tsx scripts/test-tools.ts","bundle-data":"tsx scripts/bundle-data.ts","update-geoip":"node node_modules/geoip-lite/scripts/updatedb.js","prepublishOnly":"npm run bundle-data && npm run build && npm run test:tools && npm run test:analytics && npm run test:http && npm run guards","test:analytics":"tsx scripts/test-analytics.ts"},"_npmUser":{"name":"yserrag","email":"yousefserrag@gmail.com"},"deprecated":"Superseded by 1.5.1. This version's description is out of date: install @asksakina/islamic-knowledge-mcp@latest.","repository":{"url":"git+https://github.com/yserrag/asksakina-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"Verified Islamic knowledge MCP server — Quranic verses, authenticated du'as, and the 99 Names of Allah. Reviewed through AskSakina's structured specialist-AI review chain across mainstream Sunni schools (Hanafi, Maliki, Shafi'i, Hanbali); not a substitute","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","geoip-lite":"^1.4.10","@modelcontextprotocol/sdk":"^1.30.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^5.6.2","@types/node":"^22.7.4","@types/geoip-lite":"^1.4.4"},"_npmOperationalInternal":{"tmp":"tmp/islamic-knowledge-mcp_1.4.0_1790336307031_0.23402162986750996","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@asksakina/islamic-knowledge-mcp","version":"1.4.1","keywords":["mcp","model-context-protocol","islam","islamic","quran","dua","supplication","hadith","asma-ul-husna","99-names-of-allah","spiritual","ai-agent","claude","sakina"],"license":"SEE LICENSE IN LICENSE","_id":"@asksakina/islamic-knowledge-mcp@1.4.1","maintainers":[{"name":"yserrag","email":"yousefserrag@gmail.com"}],"homepage":"https://www.asksakina.com","bugs":{"url":"https://github.com/yserrag/asksakina-mcp/issues"},"bin":{"sakina-mcp":"dist/server.js"},"dist":{"shasum":"a4b8ca356246905caa9d22d4f117cfd5c35a8667","tarball":"https://registry.npmjs.org/@asksakina/islamic-knowledge-mcp/-/islamic-knowledge-mcp-1.4.1.tgz","fileCount":52,"integrity":"sha512-AyjDsqJadbMMlRHS59v5Dyq4W5YHEvDB5GMS5TTtK3gLZ2oTe1LuKqacjt++lxvgUWYjbQP68bwbqiY12g1lcg==","signatures":[{"sig":"MEUCIBLfz+sk5Dl2+UW7yFWnuHLiQFt6STlgFCdkeqrbP08vAiEA8oflfqGdFpx0CYz1ibytyVj0kJevSZdNMNuELRNe6kI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIALdKaJWndbim8Y1djT11LwTDls69nhBcDhY3QLQ0lo6AiAO4EhcJOa/mNVmELVxQ1VVsENGhkD4vW9tJd+QRpvCkg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":680272},"main":"dist/server.js","engines":{"node":">=20"},"gitHead":"94926de7e47c82ff532de590323dbda7ff138107","mcpName":"com.asksakina/islamic-knowledge","private":false,"scripts":{"eval":"tsx scripts/run-evals.ts","build":"tsc -p tsconfig.build.json && node scripts/postbuild.mjs","start":"tsx src/server.ts","guards":"node scripts/publish-guards.mjs","prebuild":"npm run bundle-data","test:http":"tsx scripts/test-http-smoke.ts","typecheck":"tsc --noEmit","start:dist":"node dist/server.js","test:tools":"tsx scripts/test-tools.ts","bundle-data":"tsx scripts/bundle-data.ts","update-geoip":"node node_modules/geoip-lite/scripts/updatedb.js","prepublishOnly":"npm run bundle-data && npm run build && npm run test:tools && npm run test:analytics && npm run test:http && npm run test:ratelimit && npm run guards","test:analytics":"tsx scripts/test-analytics.ts","test:ratelimit":"tsx scripts/test-ratelimit.ts"},"_npmUser":{"name":"yserrag","email":"yousefserrag@gmail.com"},"deprecated":"Superseded by 1.5.1. This version's description is out of date: install @asksakina/islamic-knowledge-mcp@latest.","repository":{"url":"git+https://github.com/yserrag/asksakina-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"Verified Islamic knowledge MCP server — Quranic verses, a curated du'a collection, and the 99 Names of Allah. Reviewed through AskSakina's structured specialist-AI review chain across mainstream Sunni schools (Hanafi, Maliki, Shafi'i, Hanbali); not a subs","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","geoip-lite":"^1.4.10","@modelcontextprotocol/sdk":"^1.30.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^5.6.2","@types/node":"^22.7.4","@types/geoip-lite":"^1.4.4"},"_npmOperationalInternal":{"tmp":"tmp/islamic-knowledge-mcp_1.4.1_1790417481424_0.2950187344135331","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@asksakina/islamic-knowledge-mcp","version":"1.5.0","keywords":["mcp","model-context-protocol","islam","islamic","quran","dua","supplication","hadith","asma-ul-husna","99-names-of-allah","spiritual","ai-agent","claude","sakina"],"license":"SEE LICENSE IN LICENSE","_id":"@asksakina/islamic-knowledge-mcp@1.5.0","maintainers":[{"name":"yserrag","email":"yousefserrag@gmail.com"}],"homepage":"https://www.asksakina.com","bugs":{"url":"https://github.com/yserrag/asksakina-mcp/issues"},"bin":{"sakina-mcp":"dist/server.js"},"dist":{"shasum":"3d5e5add4c356941606de360bfc1659f24fe4ba8","tarball":"https://registry.npmjs.org/@asksakina/islamic-knowledge-mcp/-/islamic-knowledge-mcp-1.5.0.tgz","fileCount":59,"integrity":"sha512-CAzxmdvkGe1n+N26hvY5/gXUkYAFARroBxNS0n3DYmsLORRWwcBVJxIeWL7cxRg3FeAEbVnAe73NSUeQUt2jEg==","signatures":[{"sig":"MEYCIQDeqrpi+uBb6ovErycUO42GoDzeHiAqzrjUdSICWQJLzwIhAP4cmnF1KXjQEQYn4ovvmpG4SWZ3hVESxLd8Sv4elfms","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDyS5abcuX0og+rWNEzdrmwhvSn7dkm0s2w8Ukr27tAkAIgHyt1NgzL0/JER8E2XMAp4rHXWaYRXx7uAD/P1NuG6Pk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":717335},"main":"dist/server.js","engines":{"node":">=20"},"gitHead":"b1e5f82f4748de6989333d47046b495bd83b632f","mcpName":"com.asksakina/islamic-knowledge","private":false,"scripts":{"eval":"tsx scripts/run-evals.ts","build":"tsc -p tsconfig.build.json && node scripts/postbuild.mjs","start":"tsx src/server.ts","guards":"node scripts/publish-guards.mjs","prebuild":"npm run bundle-data","test:http":"tsx scripts/test-http-smoke.ts","typecheck":"tsc --noEmit","start:dist":"node dist/server.js","test:tools":"tsx scripts/test-tools.ts","bundle-data":"tsx scripts/bundle-data.ts","update-geoip":"node node_modules/geoip-lite/scripts/updatedb.js","prepublishOnly":"npm run bundle-data && npm run build && npm run test:tools && npm run test:analytics && npm run test:http && npm run test:ratelimit && npm run guards","test:analytics":"tsx scripts/test-analytics.ts","test:ratelimit":"tsx scripts/test-ratelimit.ts"},"_npmUser":{"name":"yserrag","email":"yousefserrag@gmail.com"},"deprecated":"Superseded by 1.5.1. This version's description is out of date: install @asksakina/islamic-knowledge-mcp@latest.","repository":{"url":"git+https://github.com/yserrag/asksakina-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"Verified Islamic knowledge MCP server — Quranic verses, a curated du'a collection, and the 99 Names of Allah. Reviewed through AskSakina's structured specialist-AI review chain across mainstream Sunni schools (Hanafi, Maliki, Shafi'i, Hanbali); not a subs","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","geoip-lite":"^1.4.10","@modelcontextprotocol/sdk":"^1.30.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^5.6.2","@types/node":"^22.7.4","@types/geoip-lite":"^1.4.4"},"_npmOperationalInternal":{"tmp":"tmp/islamic-knowledge-mcp_1.5.0_1790430285899_0.2415635568401273","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@asksakina/islamic-knowledge-mcp","version":"1.5.1","keywords":["mcp","model-context-protocol","islam","islamic","quran","dua","supplication","hadith","asma-ul-husna","99-names-of-allah","spiritual","ai-agent","claude","sakina"],"license":"SEE LICENSE IN LICENSE","_id":"@asksakina/islamic-knowledge-mcp@1.5.1","maintainers":[{"name":"yserrag","email":"yousefserrag@gmail.com"}],"homepage":"https://www.asksakina.com","bugs":{"url":"https://github.com/yserrag/asksakina-mcp/issues"},"bin":{"sakina-mcp":"dist/server.js"},"dist":{"shasum":"3391d34ee6e20caa96efd380d436a50bfc92f827","tarball":"https://registry.npmjs.org/@asksakina/islamic-knowledge-mcp/-/islamic-knowledge-mcp-1.5.1.tgz","fileCount":61,"integrity":"sha512-j1hr2shDAdEKCuB8XpyAfZCH0dePLOFDShVWmYoKLAqluTaWfCKBEhftqmBFChPMZxsi7XkDVvmXNcpuHi11PQ==","signatures":[{"sig":"MEYCIQD7f26pzrXRoPTkYvEWXQ2mqgataqCm9kqxuydG2qke1AIhAOCmK3abk0cBRiRqkfvDnsWWIS6s8TUX/zOCH4ZTmKIX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCuNFc4K6t1EtlXAtBSAAw8BnY9D2pSVDwOSFZgARcBZgIgArwk7wKexsoD+wVey0vBHZIqD+1cXZEAUbHAkgHqsUY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":732367},"main":"dist/server.js","engines":{"node":">=20"},"gitHead":"9a7e72b162605d0ded006971bdaa79a438b1b045","mcpName":"com.asksakina/islamic-knowledge","private":false,"scripts":{"eval":"tsx scripts/run-evals.ts","build":"tsc -p tsconfig.build.json && node scripts/postbuild.mjs","start":"tsx src/server.ts","guards":"node scripts/publish-guards.mjs","prebuild":"npm run bundle-data","test:http":"tsx scripts/test-http-smoke.ts","typecheck":"tsc --noEmit","start:dist":"node dist/server.js","test:tools":"tsx scripts/test-tools.ts","bundle-data":"tsx scripts/bundle-data.ts","test:crisis":"tsx scripts/test-crisis-normalisation.ts","update-geoip":"node node_modules/geoip-lite/scripts/updatedb.js","prepublishOnly":"npm run bundle-data && npm run build && npm run test:tools && npm run test:analytics && npm run test:http && npm run test:ratelimit && npm run test:crisis && npm run guards","test:analytics":"tsx scripts/test-analytics.ts","test:ratelimit":"tsx scripts/test-ratelimit.ts"},"_npmUser":{"name":"yserrag","email":"yousefserrag@gmail.com"},"repository":{"url":"git+https://github.com/yserrag/asksakina-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"Curated Islamic knowledge MCP server: Quranic verses, a curated du'a corpus, and the 99 Names of Allah. New and changed content is reviewed through AskSakina's structured specialist-AI review chain across mainstream Sunni schools (Hanafi, Maliki, Shafi'i,","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","geoip-lite":"^1.4.10","@modelcontextprotocol/sdk":"^1.30.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^5.6.2","@types/node":"^22.7.4","@types/geoip-lite":"^1.4.4"},"_npmOperationalInternal":{"tmp":"tmp/islamic-knowledge-mcp_1.5.1_1790531963335_0.2317000380651415","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"_id":"@asksakina/islamic-knowledge-mcp@2.0.0","bin":{"sakina-mcp":"dist/server.js"},"bugs":{"url":"https://github.com/yserrag/asksakina-mcp/issues"},"dist":{"shasum":"986e7e105c7499a6d649559629d9a217a292cf43","tarball":"https://registry.npmjs.org/@asksakina/islamic-knowledge-mcp/-/islamic-knowledge-mcp-2.0.0.tgz","fileCount":74,"integrity":"sha512-F3trJlqX0r5NDteZLoPBQ/ZPkkGM+aejnEANqhEP4ztBIt9eBBKqIyeyZufZu2EDs1OVJSX6ranWlRbu7DUGLw==","signatures":[{"sig":"MEQCIFojInvWoX/eKHl/U4vtsUuaIpLUkHUssZrXdSvZd9NMAiBudpMscpsbeaUZKIq9kbVn8yjihASrqcMWp3HCPFgmbg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGF8Z3DT+vx5PVI/xqdlr+Br9sBNw/TIaALVIkxjBSiaAiEAvJvUUr1BTBb/mdo/7zVBXvlSdNbCAPx+PjxwqkOsoV4="}],"unpackedSize":782441},"main":"dist/server.js","name":"@asksakina/islamic-knowledge-mcp","engines":{"node":">=20"},"gitHead":"a676064fcee0229704d61487eb6c7ed51ce84e44","license":"SEE LICENSE IN LICENSE","mcpName":"com.asksakina/islamic-knowledge","private":false,"scripts":{"eval":"tsx scripts/run-evals.ts","build":"tsc -p tsconfig.build.json && node scripts/postbuild.mjs","start":"tsx src/server.ts","guards":"node scripts/publish-guards.mjs","prebuild":"npm run bundle-data","test:http":"tsx scripts/test-http-smoke.ts","typecheck":"tsc --noEmit","start:dist":"node dist/server.js","test:teach":"tsx scripts/test-teach.ts","test:tools":"tsx scripts/test-tools.ts","bundle-data":"tsx scripts/bundle-data.ts","test:crisis":"tsx scripts/test-crisis-normalisation.ts","release-gate":"tsx scripts/release-gate.ts","update-geoip":"node node_modules/geoip-lite/scripts/updatedb.js","byte-identity":"tsx scripts/byte-identity.ts","prepublishOnly":"npm run bundle-data && npm run build && npm run test:tools && npm run test:analytics && npm run test:http && npm run test:ratelimit && npm run test:crisis && npm run test:teach && npm run guards","test:analytics":"tsx scripts/test-analytics.ts","test:ratelimit":"tsx scripts/test-ratelimit.ts"},"version":"2.0.0","_npmUser":{"name":"yserrag","email":"yousefserrag@gmail.com"},"homepage":"https://www.asksakina.com","keywords":["mcp","model-context-protocol","islam","islamic","quran","dua","supplication","hadith","asma-ul-husna","99-names-of-allah","spiritual","ai-agent","claude","sakina"],"repository":{"url":"git+https://github.com/yserrag/asksakina-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"Curated Islamic knowledge MCP server: Quranic verses, a curated du'a corpus, and the 99 Names of Allah. New and changed content is reviewed through AskSakina's structured specialist-AI review chain across mainstream Sunni schools (Hanafi, Maliki, Shafi'i,","directories":{},"maintainers":[{"name":"yserrag","email":"yousefserrag@gmail.com"}],"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","geoip-lite":"^1.4.10","@modelcontextprotocol/sdk":"^1.30.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","typescript":"^5.6.2","@types/node":"^22.7.4","@types/geoip-lite":"^1.4.4"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/islamic-knowledge-mcp_2.0.0_1790695979235_0.33873108202200997"}}},"time":{"created":"2026-05-09T14:15:54.815Z","modified":"2026-09-29T15:32:59.644Z","1.0.0":"2026-05-09T14:15:55.106Z","1.0.1":"2026-05-11T08:29:34.804Z","1.2.0":"2026-07-03T16:01:15.820Z","1.3.0":"2026-07-10T14:46:09.107Z","1.4.0":"2026-09-25T11:38:27.158Z","1.4.1":"2026-09-26T10:11:21.514Z","1.5.0":"2026-09-26T13:44:45.986Z","1.5.1":"2026-09-27T17:59:23.415Z","2.0.0":"2026-09-29T15:32:59.347Z"},"bugs":{"url":"https://github.com/yserrag/asksakina-mcp/issues"},"license":"SEE LICENSE IN LICENSE","homepage":"https://www.asksakina.com","keywords":["mcp","model-context-protocol","islam","islamic","quran","dua","supplication","hadith","asma-ul-husna","99-names-of-allah","spiritual","ai-agent","claude","sakina"],"repository":{"url":"git+https://github.com/yserrag/asksakina-mcp.git","type":"git"},"description":"Curated Islamic knowledge MCP server: Quranic verses, a curated du'a corpus, and the 99 Names of Allah. New and changed content is reviewed through AskSakina's structured specialist-AI review chain across mainstream Sunni schools (Hanafi, Maliki, Shafi'i,","maintainers":[{"name":"yserrag","email":"yousefserrag@gmail.com"}],"readme":"# AskSakina Islamic Knowledge MCP Server\n\n[![npm version](https://img.shields.io/npm/v/@asksakina/islamic-knowledge-mcp.svg?style=flat-square)](https://www.npmjs.com/package/@asksakina/islamic-knowledge-mcp)\n[![License](https://img.shields.io/badge/license-Sacred%20Use-8B6A42.svg?style=flat-square)](./LICENSE)\n[![MCP Registry](https://img.shields.io/badge/MCP-com.asksakina%2Fislamic--knowledge-4A6B4A.svg?style=flat-square)](https://registry.modelcontextprotocol.io/v0/servers?search=com.asksakina)\n\n> **Specialist-AI-reviewed Islamic knowledge for AI agents.** Quranic verses, a curated du'a corpus, and the 99 Names of Allah — reviewed across the four mainstream Sunni schools (Hanafi, Maliki, Shafi'i, Hanbali) through AskSakina's structured specialist-AI review chain, which is not a substitute for a qualified scholar. Every response is wrapped in a presentation contract so agents cannot silently misrepresent the content.\n\n**Architectural posture:** *\"AskSakina ships records, agents ship answers.\"* The server is a reference library, not an advisor. Each response includes a `_sakina_meta` envelope with disclaimer, LLM directives, presentation contract, and educational context. What the calling agent does with the record is its responsibility — but every response arms the agent with enough structural context to make mishandling difficult and trackable.\n\n---\n\n## What it provides\n\nFour lookup tools and one canonical resource over the Model Context Protocol. Every record is sourced from AskSakina's main app (`asksakina.com`), so each MCP release matches what the public app surfaced when it was built.\n\n| Tool | What it does |\n|---|---|\n| `get_quran_verse` | Verbatim Quranic verse lookup by surah:ayah |\n| `get_dua` | Curated du'a corpus lookup by life context (anxiety, morning, travel, ...) |\n| `get_name_of_allah` | One of the 99 Names by number (1–99) or string |\n| `find_verses` | Quran verses by topic keyword, from AskSakina's thematic verse index |\n| `sakina://about` (resource) | Read-once briefing — seven core directives plus three Gem-cleared dawah texts (Quran preservation, hadith grading, madhab attribution) |\n\n---\n\n## Tools\n\n### `get_quran_verse`\n\nVerbatim Quranic verse lookup by surah:ayah. Returns the canonical AskSakina envelope with Arabic text, translation, surah name (Arabic + English), and the `quran` presentation contract — no paraphrasing, surah:ayah citation required, \"Translation of the Meaning\" labelling.\n\n**Parameters**\n\n| Name | Type | Required | Notes |\n|---|---|---|---|\n| `surah` | `1`..`114` | yes | Surah number |\n| `ayah` | `1`..`286` | yes | Ayah within the surah |\n| `locale` | `'en'` \\| `'id'` \\| `'ur'` \\| `'ar'` | no, defaults `en` | Translation language. `ar` returns the Arabic original with the Pickthall English alongside. Urdu and Indonesian translations are not yet available (pending licences): `ur` and `id` return Pickthall English, `translation_language: \"en\"` and a `translation_note` saying so |\n\n**Example response (truncated)**\n\n```jsonc\n{\n  \"_sakina_meta\": {\n    \"version\": \"1.0\",\n    \"content_type\": \"quran_verse\",\n    \"presentation_contract\": {\n      \"quran\": {\n        \"no_paraphrase\": true,\n        \"require_citation\": \"surah:ayah\",\n        \"translation_label\": \"Translation of the Meaning\"\n      }\n    }\n    /* … */\n  },\n  \"content\": {\n    \"surah\": { \"number\": 2, \"name_arabic\": \"البقرة\", \"name_english\": \"Al-Baqarah\" },\n    \"ayah\": 186,\n    \"arabic\": \"وَإِذَا سَأَلَكَ عِبَادِي عَنِّي فَإِنِّي قَرِيبٌ ۖ …\",\n    \"translation\": \"And when My servants ask you concerning Me — indeed I am near. …\"\n  }\n}\n```\n\n### `get_dua`\n\nReturns du'as matching a life context (anxiety, grief, morning, travel, etc.). Context is resolved against canonical category slugs, an alias map, and tag dimensions. A natural phrase (\"grief after losing my mother\") also resolves: the server normalises it and matches known category, alias, tag and synonym words and a few multi-word phrases inside it, deterministically and without AI. `content.matched_by` says how it resolved. **Grief (WO#386):** a query that names the querier's own grief (\"I lost my mother\", \"grief after losing my mother\", \"my father passed away\", \"bereaved\") resolves to context `bereaved`; a funeral rite or the person who has died (\"funeral\", \"dua for the deceased\", \"grave\") stays `deceased`. `bereaved` returns seven du'as ruled by the fiqh reviewer (Gem 4), in its order, with a `teaching_note` on the masculine forms in the Arabic, and always carries at least the soft support note. Crisis detection runs first, on the full raw input. Self-harm and abuse get separate blocks (`crisis_type`): the abuse block carries domestic-abuse lines and an abuse-specific directive. **On any hard crisis (self-harm or abuse) no du'as are returned**: `content_type` is `crisis_resource_only` and the crisis resource is the whole response. Each block lists 24/7 lines first and states the hours of any limited-hours line. **If the context contains a crisis keyword (matched against the main app's `detectCrisis` keyword list), the response includes a mandatory `crisis_resource` block** with the appropriate hotline and prosocial directive.\n\n**Parameters**\n\n| Name | Type | Required | Notes |\n|---|---|---|---|\n| `context` | `string` | yes | Free-form life context |\n| `locale` | `'en'` \\| `'id'` \\| `'ur'` \\| `'ar'` | no, defaults `en` | Translation language |\n\n**Example response (truncated)**\n\n```jsonc\n{\n  \"_sakina_meta\": {\n    \"content_type\": \"dua_collection\",\n    \"presentation_contract\": {\n      \"hadith\": { \"require_grading\": \"per_record\" /* true when every record is graded */ }\n    }\n    /* … */\n  },\n  \"content\": {\n    \"context\": \"stress-anxiety\",\n    \"duas\": [\n      {\n        \"dua_block\": \"Arabic: …\\nTransliteration: …\\nTranslation: …\\nOrigin: Quran 21:87\\nSource: Quran 21:87\\nGrading: Quranic\",\n        \"title\": \"Dua to Deal with Distress & Depression\",\n        \"arabic\": \"وَذَا ٱلنُّونِ إِذ ذَّهَبَ …\",\n        \"source\": \"Quran 21:87\",\n        \"grading\": \"Quranic\",\n        \"grading_status\": \"quranic\",\n        \"origin\": \"quran\",\n        \"quran_citation\": \"Quran 21:87\"\n      },\n      {\n        \"title\": \"Dua to Remove Sorrow & Grief:\",\n        \"source\": \"Source not recorded in AskSakina corpus\",\n        \"grading\": \"Not graded in AskSakina corpus\",\n        \"grading_status\": \"not_recorded\"\n        /* … */\n      }\n      /* … */\n    ],\n    \"total_results\": 12,\n    \"grading_summary\": { \"quranic\": 2, \"graded\": 0, \"not_recorded\": 10 }\n  }\n  // crisis_resource block added if context triggers the crisis keyword list\n}\n```\n\n**Grading status.** Every du'a record carries `grading_status`: `quranic` (the text is a Quranic verse or clause), `graded` (a hadith grading is recorded), or `not_recorded` (the AskSakina corpus holds no grading for it). Most of the corpus is `not_recorded` today; the `Source` and `Grading` lines say so rather than implying a grading exists. Du'as whose Quranic reference has been verified carry `origin: \"quran\"` and a `quran_citation`, and their Arabic is the Tanzil Uthmani text resolved from AskSakina's scripture module at bundle time.\n\n### `get_name_of_allah`\n\nLook up by number (1–99) or string (transliteration, Arabic, or English meaning). Returns Arabic, transliteration, locale-aware meaning, reflection, and Quranic references.\n\n**Parameters** — one of:\n\n| Name | Type | Notes |\n|---|---|---|\n| `number` | `1`..`99` | Primary lookup |\n| `name` | `string` | Transliteration, Arabic, or English meaning |\n\nPlus optional `locale`.\n\n**Example response (truncated)**\n\n```jsonc\n{\n  \"_sakina_meta\": { \"content_type\": \"name_of_allah\" /* … */ },\n  \"content\": {\n    \"number\": 29,\n    \"arabic\": \"الحَكَم\",\n    \"transliteration\": \"Al-Hakam\",\n    \"meaning\": \"The Judge\",\n    \"reflection\": \"Allah is the absolute Judge…\",\n    \"quran_references\": [\"6:114\", \"13:41\"]\n  }\n}\n```\n\n### `find_verses`\n\nTopic lookup beside `get_quran_verse`'s reference lookup (WO#386). The query is normalised and each word is matched to a theme of AskSakina's thematic verse index (anxiety, gratitude, patience, trust, grief, hope, forgiveness, morning, friday, ramadan, encouragement), by theme name or a fixed synonym list. Deterministic: no embedding, no AI call.\n\nEach verse carries `reference` (surah:ayah), `arabic` (the full ayah from the scripture module, Tanzil Uthmani, byte for byte), `translation` (full-ayah Pickthall, fetched as `get_quran_verse` fetches it), the surah names, and a `relevance_note` saying which theme lists it. The note is not commentary. If the upstream is unreachable, the Arabic is still served and `translation` is `null` with a note.\n\nNo match returns `content_type: \"not_found\"` with `verses: []`, `no_results: true` and the list of available themes, not an error. Crisis detection runs first, as on `get_dua`: any hard crisis (self-harm or abuse) returns `crisis_resource_only`, with no verses and no theme list.\n\n**Parameters**\n\n| Name | Type | Required | Notes |\n|---|---|---|---|\n| `query` | `string` | yes | Topic or keyword, e.g. `patience`, `grief`, `gratitude` |\n| `limit` | `1`..`10` | no, defaults `5` | Number of verses |\n| `locale` | `'en'` \\| `'id'` \\| `'ur'` \\| `'ar'` | no, defaults `en` | Selects the in-country crisis resources. Translations are Pickthall English; `ur` and `id` carry the parked-translation note |\n\n### Resource: `sakina://about`\n\nRead this resource **before** using the tools. It contains the seven core directives plus three Gem-cleared educational dawah texts. Most MCP clients fetch it automatically the first time they connect.\n\n---\n\n## Response envelope\n\nEvery tool returns the same shape:\n\n```jsonc\n{\n  \"_sakina_meta\": {\n    \"version\": \"1.0\",\n    \"source\": \"AskSakina Islamic Knowledge Server (asksakina.com)\",\n    \"content_type\": \"quran_verse\" | \"dua_collection\" | \"name_of_allah\" | \"not_found\" | \"crisis_resource_only\",\n    \"disclaimer\": \"AskSakina provides curated Islamic reference content for educational purposes. …\",\n    \"llm_directives\": { \"CRITICAL_RULES\": [\"…\"] },\n    \"presentation_contract\": {\n      \"quran\":         { \"no_paraphrase\": true, \"require_citation\": \"surah:ayah\" /* … */ },\n      \"hadith\":        { \"require_grading\": true, \"require_source\": true /* … */ },\n      \"name_of_allah\": { \"no_paraphrase_arabic\": true /* … */ }\n    },\n    \"educational_context\": \"…\"\n  },\n  \"content\": { /* tool-specific record */ },\n  // get_dua and find_verses, when crisis keywords detected:\n  \"crisis_resource\": { \"level\": \"hard\" | \"soft\", \"crisis_type\": \"self-harm\" | \"abuse\", \"locale\": \"…\", \"directive\": \"…\", \"text\": \"…\" }\n}\n```\n\nThe envelope is the contract: `_sakina_meta.presentation_contract` tells the agent how to render the record, `disclaimer` tells the agent what claims it cannot make on its own authority, and `crisis_resource` overrides everything when a user's distress crosses a safety threshold.\n\n---\n\n## Quick start\n\n### Run via npx (no install)\n\n```bash\nnpx -y @asksakina/islamic-knowledge-mcp\n```\n\nThe package speaks MCP over stdio out of the box — wire it into any MCP client.\n\n### Connect via remote streamable HTTP\n\n```\nhttps://sakina-mcp.fly.dev/mcp\n```\n\nFor agents that prefer a hosted endpoint over a local subprocess. Same tools, same envelope, same rate limits.\n\n### Claude Desktop\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%/Claude/claude_desktop_config.json` (Windows):\n\n```jsonc\n{\n  \"mcpServers\": {\n    \"sakina\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@asksakina/islamic-knowledge-mcp\"]\n    }\n  }\n}\n```\n\nRestart Claude Desktop. The three tools and the `sakina://about` resource appear in the tool picker.\n\n### Cursor\n\nAdd to `~/.cursor/mcp.json` (or workspace `.cursor/mcp.json`):\n\n```jsonc\n{\n  \"mcpServers\": {\n    \"sakina\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@asksakina/islamic-knowledge-mcp\"]\n    }\n  }\n}\n```\n\n### VS Code (with an MCP-aware extension)\n\nAdd to `.vscode/mcp.json` in your workspace:\n\n```jsonc\n{\n  \"servers\": {\n    \"sakina-islamic-knowledge\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@asksakina/islamic-knowledge-mcp\"]\n    }\n  }\n}\n```\n\n### Generic MCP client over remote HTTP\n\n```jsonc\n{\n  \"mcpServers\": {\n    \"sakina\": {\n      \"type\": \"streamable-http\",\n      \"url\": \"https://sakina-mcp.fly.dev/mcp\"\n    }\n  }\n}\n```\n\n---\n\n## Use cases\n\nThe MCP server is designed for any agent or application that needs curated Islamic source material, returned with explicit instructions to quote it exactly rather than paraphrase it.\n\n- **Build an Islamic chatbot with cited references where recorded.** Pipe `get_quran_verse` and `get_dua` into your conversation flow; the presentation contract instructs the agent to quote exactly and keep gradings attached, and each response states its content type and, for du'as, each record's grading status.\n- **Add prayer-time-aware spiritual content to your agent.** Combine the Quranic and du'a tools with a prayer-time API to surface Allah's words at the right moment of the day.\n- **Recommend du'as based on user context.** The crisis-keyword filter in `get_dua` handles the dangerous edge cases (self-harm language, abuse) so your assistant is directed not to reply with a generic du'a to a safety-critical message.\n- **Answer questions about the 99 Names.** `get_name_of_allah` returns the canonical Arabic, transliteration, meaning, and reflection — plus Quranic references — for both number-based and name-based lookups.\n- **Stay theologically inclusive.** The server is designed not to present a contested ruling as the universal answer.\n\n---\n\n## Content integrity\n\nNew and changed content is reviewed by AskSakina's \"Gem\" specialist-AI review chain before shipping. Four of its reviewers gate every Islamic-knowledge release:\n\n1. **Quran & Translation Verification.** Ayah accuracy, surah/ayah citation correctness, hadith grading, source review.\n2. **Fiqh Diversity (Multi-Madhab).** Cross-school accuracy, no single-madhab framing on contested topics, inclusive language.\n3. **Islamic Psychology & Pastoral Care.** Comfort window safety, crisis filter coverage, no guilt-based motivation.\n4. **Explorer / New-to-Islam Accessibility.** Glossing of Arabic terms for non-Muslim audiences, plain-English fiqh, zero-assumed-belief reflections.\n\nArchitectural behaviours implemented in code:\n\n- The Unicode prophet salutation (U+FDFA, ﷺ) is replaced with `(peace be upon him)` at every data-loader boundary. The response builder rejects any output containing the symbol.\n- Each du'a record carries a `grading_status` (`quranic`, `graded`, `not_recorded`). The `hadith` presentation contract sets `require_grading: true` only when every returned record is graded or Quranic, and `\"per_record\"` otherwise, so the envelope never claims a grading the data does not hold.\n- Crisis keyword detection runs on every `get_dua` request — the same keyword list used by the main app's safety gate.\n\n**Sacred Use License.** This server is distributed under a Sacred Use License (see [LICENSE](./LICENSE)). Permitted uses centre on dawah, education, personal worship, and respectful integration into Muslim-serving applications. The license forbids monetisation that frames Islamic knowledge as scarce or paywalled. A public summary of the license terms lives at `https://www.asksakina.com/en/mcp`.\n\n**Privacy.** See [Privacy & Analytics](#privacy--analytics).\n\n---\n\n## Running locally for development\n\n```bash\ncd mcp-server\nnpm install\nnpm run bundle-data     # snapshot data from main repo into data/\nnpm run typecheck       # tsc --noEmit\nnpm run start           # HTTP server on :3030 via tsx\nnpm run test:tools      # exercise each tool, prints sample JSON\n\n# Or build + run from compiled output:\nnpm run build           # tsc -> dist/, postbuild adds shebang + dist/package.json\nnpm run start:dist      # node dist/server.js\n```\n\n`POST /mcp` accepts standard MCP JSON-RPC 2.0. `GET /health` returns `{ \"status\": \"ok\", \"name\", \"version\" }`.\n\n## Rate limiting\n\nDefault: **60 requests per minute per IP**.\n\n- `UPSTASH_REDIS_REST_URL` + `UPSTASH_REDIS_REST_TOKEN` set → distributed Upstash Redis fixed window.\n- Otherwise → in-memory token bucket, per process.\n\nResponses include `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`. A 429 with code `-32029` is returned on exceed.\n\n## Authentication\n\nv1 ships unauthenticated. An optional `X-Sakina-App-Id` header is accepted but not enforced or logged in v1. This becomes required in v2.\n\n## Privacy & Analytics\n\nThis service operates with an aggregate-only, memory-bound data model (implemented in WO#360). For each tool, the server maintains a running count of calls by outcome (`ok`, `not_found`, `error`) and the summed handler time to report operational averages via the `/stats` endpoint.\n\n- **No persistent tracking:** No per-request logs or client identifiers are written to disk or any database by the application.\n- **Ephemeral IP handling:** Client IP addresses are used only to enforce the rate limit. Each is held as a rate-limit key in Upstash Redis for the rate-limit window (60 seconds), then expired. If Upstash is unavailable, the in-memory fallback holds it in process memory for the same window, then discards it. Raw IP addresses are never persisted by the application, and never written to logs.\n- **No payload logging:** Request parameters (such as `context` values or verse references) and response payloads are never captured or logged.\n- **Memory-only retention:** All aggregate counters exist only in RAM and are reset when the server process restarts.\n\n*Regulatory Note (UK GDPR): Because nothing identifiable is held beyond the rate-limit window, there are no records that could be accessed or erased. Note that while the application itself does not persist personal data, our infrastructure provider (Fly.io) transiently processes IP addresses at the edge layer for standard network routing and platform security.*\n\n### `/stats` endpoint\n\nAuthenticated summary endpoint:\n\n```bash\ncurl -H \"Authorization: Bearer $MCP_STATS_TOKEN\" https://sakina-mcp.fly.dev/stats\n```\n\nRequires the `MCP_STATS_TOKEN` env var to be set (otherwise the endpoint returns 503 and refuses to serve unauthenticated). Token comparison is constant-time.\n\nPayload shape:\n\n```json\n{\n  \"privacy\": \"aggregate-only in-memory counters; no per-request records, no IPs, no user-agents, no client identifiers, no geolocation, no params, no payloads; resets on restart\",\n  \"since\": \"2026-09-25T…\",\n  \"total_requests\": N,\n  \"by_tool\": {\n    \"get_quran_verse\":   { \"total\": N, \"ok\": N, \"not_found\": N, \"error\": N, \"avg_response_ms\": N },\n    \"get_dua\":           { \"total\": N, \"ok\": N, \"not_found\": N, \"error\": N, \"avg_response_ms\": N },\n    \"get_name_of_allah\": { \"total\": N, \"ok\": N, \"not_found\": N, \"error\": N, \"avg_response_ms\": N }\n  },\n  \"rate_limiter\": {\n    \"state\": \"upstash\",\n    \"upstash_configured\": true,\n    \"upstash_failures\": 0,\n    \"last_failure\": null,\n    \"last_failure_at\": null,\n    \"last_success_at\": \"2026-09-25T…\",\n    \"startup_check\": \"Upstash reachable (PING ok, 12 ms); state: upstash\"\n  },\n  \"basmala_prefix_mismatch\": 0\n}\n```\n\n`rate_limiter.state` is `upstash` (Upstash answering), `degraded` (Upstash configured but failing: requests are limited by the in-memory fallback, never allowed through) or `memory` (Upstash not configured). Failure reasons carry the HTTP status or error, never a client IP. `basmala_prefix_mismatch` counts ayah-1 texts from the upstream that started with neither recorded basmala form and were served unchanged. It is an aggregate count only; the log line for it carries no verse reference.\n\n### One-time setup on Fly\n\n```bash\nfly secrets set MCP_STATS_TOKEN=$(openssl rand -hex 32)\nfly deploy\n```\n\nThe server no longer writes to the `/data` volume that `fly.toml` mounts; it was the log volume before WO#360.\n\n## Data sources\n\n| Tool | Source |\n|---|---|\n| `get_quran_verse` | `alquran.cloud`, fetched at runtime: Tanzil-derived Uthmani Arabic plus the translation for the locale: `en` and `ar` Pickthall (`en.pickthall`), `ur` and `id` also Pickthall, with a note (their translations are parked pending licences; 1.4.1). A leading byte-order mark is removed. The upstream also prefixes the basmala to ayah 1 of each surah except 1 and 9. Per Gem 2 (the basmala is part of ayah 1 only at 1:1), that exact prefix is removed from ayah 1 of surahs 2–8 and 10–114, matched against the two byte forms the upstream sends. The rest of the ayah is served byte for byte. An unrecognised start is served unchanged and counted in `/stats` (`basmala_prefix_mismatch`). Everything is fetched verse by verse (`/ayah/{surah}:{ayah}`). Saheeh International is not served (removed in 1.2.0, WO#245). Cached in process for 24 h per verse + edition. |\n| `get_dua` | AskSakina's du'a corpus (445 entries at 1.4.0), snapshotted from `../src/data/duas` into `data/duas.json` by `npm run bundle-data`. Du'as with a verified Quranic reference take their Arabic from the scripture module (`../src/lib/scripture`, Tanzil Uthmani) at the same step. |\n| `get_name_of_allah` | AskSakina's 99 Names, snapshotted from `../src/lib/data/99-names` by `npm run bundle-data`. |\n| `find_verses` | AskSakina's thematic verse index (`../src/lib/data/thematic-verses`), snapshotted into `data/thematic-verses.json` by `npm run bundle-data`. Only each verse's reference and themes are taken from the index; the Arabic comes from the scripture module at the same step, and the Pickthall translation from `alquran.cloud` at runtime (same cache as `get_quran_verse`). |\n\nThe du'a and Names data are snapshots of the main app's data files, so any update to them lands here on the next `npm run bundle-data` (the deploy workflow runs it). A published package carries the snapshot taken when it was built.\n\n---\n\n## Out of scope for v1\n\nPer the Phase 3 planning doc:\n\n- Semantic search / `search_islamic_guidance` — needs a Gem-reviewed eval set. (`find_verses` is an index lookup, not semantic search.)\n- `explain_islamic_concept` — directly conflicts with CLAUDE.md's \"AI never gives spiritual/fiqh advice\" rule until an Architect-level ruling is made.\n- `get_pastoral_guidance` — Gem 3's framing depends on AskSakina-controlled surface; cannot ship via MCP without a separate review.\n- `check_halal_ingredient` — blocked on WO#61 restoration.\n- HMAC signing enforcement — v1 accepts but ignores the `X-Sakina-App-Id` header.\n\n---\n\n## Deployment\n\nSelf-contained at publish time — `npm run bundle-data` snapshots the du'a corpus, the 99 Names, and the canonical safety modules from the main AskSakina monorepo into `data/` and `src/safety/_synced/`. The compiled `dist/` plus the bundled `data/` directory have no runtime dependency on the main app.\n\n`bundle-data` runs automatically via a `prebuild` script (WO#138), so `npm run build` is self-contained on a fresh checkout — no manual bundling step required. The `src/safety/_synced/` directory IS committed to git so any drift from the main-app safety modules shows up in `git diff` between commits.\n\n`docker build` does NOT run `prebuild` (it only copies the `mcp-server/` directory, not the monorepo). Run `npm run bundle-data` on the host before `docker build` so `data/` is populated. The same applies if you build from a fresh clone — `npm install && npm run bundle-data` before `docker build`.\n\n### CI deploy (canonical — WO#249)\n\nAll MCP releases go through the **`MCP Server Deploy`** GitHub Actions workflow\n(`.github/workflows/mcp-deploy.yml`) — no developer machine holds `flyctl` or npm\nauth. The Architect triggers it from the repo **Actions** tab\n(`workflow_dispatch`) with two boolean inputs:\n\n- **`deploy_fly`** (default `true`) — build + `flyctl deploy` to `sakina-mcp.fly.dev`.\n- **`publish_npm`** (default `true`) — `npm publish` `@asksakina/islamic-knowledge-mcp`.\n\nThe job runs the full Gem 10 runbook on `main`: `npm ci` → `npm run bundle-data`\n(load-bearing) → `flyctl deploy` → poll `/health` → **live Pickthall byte-check on\n2:255** → live Dhun-Nun check → rate-limiter probe (warn only) → **live publish guards** → agent evals (warn only; after the guards since WO#386, so the blocking guards get the rate-limit budget first) → `npm publish` → confirm the registry shows the published version. The\nbyte-check runs the MCP `initialize` handshake + `tools/call get_quran_verse`\nagainst the live endpoint: `\"save Him\"` (Pickthall) passes; `\"except Him\"` (Saheeh\nInternational) or an unreachable `/mcp` **fails the job before `npm publish`**,\ndumps `flyctl status` + logs, and prints the manual rollback commands. Secrets\n`FLY_API_TOKEN` and `NPM_TOKEN` live in repo settings and are never echoed.\n\n> Automated rollback-to-previous-image is the Gem 10 end-state but is a deferred\n> follow-up: the current live image is itself broken, so there is no known-good\n> image to auto-restore yet. The first runs are fail-loud + manual rollback only.\n\n### Fly.io (manual / break-glass)\n\nPrefer the CI workflow above. These commands are the underlying mechanics, for a\nmachine that already has `flyctl` auth:\n\n```bash\ncd mcp-server\nfly launch              # first time only — picks up fly.toml\nfly secrets set \\\n  UPSTASH_REDIS_REST_URL=... \\\n  UPSTASH_REDIS_REST_TOKEN=...\nnpm run bundle-data     # load-bearing: docker build copies host data/\nfly deploy\nfly status\ncurl https://<app>.fly.dev/health\n```\n\nProduction app: `sakina-mcp.fly.dev`. App `sakina-mcp`, region `lhr`, internal port 3030, force HTTPS, healthcheck on `/health` every 30 s, auto-stop on idle, 1 shared CPU, 256 MB RAM.\n\n### Post-deploy verification and rollback\n\nAfter every `fly deploy`, byte-check one Quran verse from the live endpoint against the locked Pickthall table (`docs/wo-cert/si-pickthall-LOCKED-final.json`) to confirm the translation edition is Pickthall, not Saheeh International:\n\n```bash\ncurl -s https://sakina-mcp.fly.dev/mcp ... # call get_quran_verse for a known ref\n# compare the returned translation to the locked Pickthall text for that ref\n```\n\nIf the byte-check fails (SI text served, or the translation does not match Pickthall), **roll back first, diagnose second**. Immediately redeploy the previous image before any further investigation or fix:\n\n```bash\nfly releases --app sakina-mcp                 # find the last-good release / image\nfly deploy --app sakina-mcp --image <previous-image-ref>\n```\n\nDo not attempt a forward fix on a live SI regression — restore the known-good image, confirm the byte-check passes on it, then diagnose the bad build offline.\n\n### Local container test\n\n```bash\ndocker compose up --build\ncurl http://localhost:3030/health\n```\n\n### Other targets\n\nThe package is just a Node.js HTTP server, so it runs on any platform that takes a Dockerfile or a Node process: Railway, Render, a small VPS, Cloudflare Workers (with the streamable-http transport), Vercel Functions (with a small adapter). The in-memory rate limiter falls back gracefully when Upstash isn't configured.\n\n---\n\n## npm publishing\n\nPublishing goes through the **`MCP Server Deploy`** workflow (see [CI deploy](#ci-deploy-canonical--wo249)) with `publish_npm: true` — the Architect triggers it from the Actions tab; `NPM_TOKEN` lives in repo settings. The manual equivalent (break-glass, needs local npm auth):\n\n```bash\ncd mcp-server\nnpm login                                    # to the @asksakina org\nnpm publish --access public\n```\n\n`prepublishOnly` runs `bundle-data` → `build` → `test:tools` so the published tarball always contains fresh data and a clean build. The `files` field whitelists `dist/`, `data/`, `README.md`, `LICENSE`, and `.mcp/server.json`.\n\nVerify the published tarball with `npm pack --dry-run` first to see what would ship.\n\n## MCP Registry submission\n\n`mcp-server/.mcp/server.json` declares AskSakina's identity for the official MCP Registry:\n\n- Server name: `com.asksakina/islamic-knowledge`\n- Package: `@asksakina/islamic-knowledge-mcp` (npm, stdio transport)\n- Remote: `https://sakina-mcp.fly.dev/mcp` (Streamable HTTP)\n\nPublishing flow: the **MCP Registry Publish** GitHub Actions workflow (`.github/workflows/mcp-registry-publish.yml` in the main repository, manual dispatch). It checks that `server.json`, `package.json` and npm agree, then runs:\n\n```bash\nmcp-publisher login dns --domain asksakina.com --private-key <KEY>   # or: login http\nmcp-publisher publish .mcp/server.json\ncurl \"https://registry.modelcontextprotocol.io/v0/servers?search=com.asksakina\"\n```\n\nDomain proof for `com.asksakina` is an Ed25519 key: the public half in a DNS TXT record on `asksakina.com` (`v=MCPv1; k=ed25519; p=<base64>`, since May 2026) or at `https://asksakina.com/.well-known/mcp-registry-auth`; the private half in the repository secret `MCP_REGISTRY_PRIVATE_KEY`.\n\n### Smithery re-publish (after a version bump)\n\nThree places carry the version — all bumped together:\n\n1. `package.json` (`\"version\"`)\n2. `mcp-server/.mcp/server.json` (top-level `version` **and** `packages[0].version`)\n3. `mcp-server/src/server.ts` (`SERVER_VERSION` constant — surfaces in `/health` and `/.well-known/mcp/server-card.json`)\n\nRe-publish checklist when bumping:\n\n```bash\ncd mcp-server\nnpm run typecheck && npm run test:tools && npm run test:analytics\nnpm run bundle-data\nnpm publish                                       # npm registry\nmcp-publisher publish .mcp/server.json            # MCP Registry\nfly deploy                                        # Smithery scanner picks up the new card via /.well-known/mcp/server-card.json\n```\n\nSmithery auto-scans `/.well-known/mcp/server-card.json` and re-indexes within a few minutes — no manual Smithery API call needed.\n\n---\n\n## Links\n\n- **Web:** [asksakina.com](https://www.asksakina.com)\n- **MCP showcase:** [asksakina.com/en/mcp](https://www.asksakina.com/en/mcp)\n- **MCP registry:** [registry.modelcontextprotocol.io — com.asksakina/islamic-knowledge](https://registry.modelcontextprotocol.io/v0/servers?search=com.asksakina)\n- **npm:** [npmjs.com/@asksakina/islamic-knowledge-mcp](https://www.npmjs.com/package/@asksakina/islamic-knowledge-mcp)\n- **Source:** [github.com/yserrag/asksakina-mcp](https://github.com/yserrag/asksakina-mcp) (mirror of `mcp-server/` in the main repository)\n- **Issues / questions:** [github.com/yserrag/asksakina-mcp/issues](https://github.com/yserrag/asksakina-mcp/issues)\n","readmeFilename":"README.md"}