IslamicCorpusMCP
БесплатноНе проверенEnables querying the Quran, Tafsir (commentaries), and Hadith (sayings of Prophet Muhammad) from a relational MySQL database through natural language, using the
Описание
Enables querying the Quran, Tafsir (commentaries), and Hadith (sayings of Prophet Muhammad) from a relational MySQL database through natural language, using the Model Context Protocol for structured, anti-hallucination responses.
README
Kur'an + Kütüb-i Tis'a (hadis) + Tefsir kaynaklarını tek bir ilişkisel MySQL veritabanında, ortak sayısal ayet anahtarı üzerinden sorgulanabilir hale getirir. İki katman:
- Veri temeli (ingest) — kaynak veriyi indir, normalize et, eşle, MySQL'e yükle.
- MCP sorgu katmanı —
islamic_corpus_mcp/, güvenli açık kaynak MCP sunucusu (stdio + SSE + streamable-http). Herhangi MCP-uyumlu araç (Claude, Cline, Continue, kendi istemciniz) üzerinden Kur'an ile sohbet.
MCP Sorgu Katmanı (islamic_corpus_mcp/)
Kur'an, Tefsir ve Hadis korpusunu Model Context Protocol (MCP) üzerinden sunan güvenli, açık kaynak sunucu. Anti-hallucination tasarım: her sonuç yapılandırılmış Pydantic modelleriyle doğrudan veritabanından gelir; model uydurmaz, araçları çağırır ve gerçek metni alır.
İçerik
| Korpus | Kapsam |
|---|---|
| Kur'an | 114 sure, 6236 ayet (Osmani + S2 normalize) |
| Tefsir | 9 kaynak, ~218530 kayıt (%98.64 ayet eşleşme) |
| Hadis | Kutub-i Tis'a (9 kitap), ~40943 hadis (Arapça + İngilizce) |
| Meta | Sure adı çözümleme, Arapça normalizasyon, DB istatistikleri |
Araçlar (16)
Kur'an
quran_list_surahs— 114 sure listesiquran_fetch_ayah(surah_id, ayah_no)— belirli ayetquran_fetch_ayah_range(surah_id, start, end)— ayet aralığıquran_search(query, mode, surah_id?, limit, offset)—normalized/uthmaniquran_get_surah_info(surah_id)— sure detayı + ayet listesi
Tefsir
tafsir_fetch(surah_id, ayah_no, source_book?, match_status?, limit, offset)tafsir_search(query, source_book?, match_status?, limit, offset)— FULLTEXTtafsir_list_books— tefsir kaynakları + istatistiktafsir_list_unmatched(source_book?, reason?, limit, offset)
Hadis
hadith_list_books— 9 kitaphadith_fetch(book_id, number)— belirli hadishadith_search(query, lang, book_id?, limit, offset)—ar/enhadith_list_by_chapter(book_id, chapter_id, limit, offset)
Meta
resolve_surah(name)— sure adı → surah_id (ar/tr/en)normalize_arabic(text)— S2 agresif normalizasyonget_db_stats— veritabanı istatistikleri
Kaynaklar (Resources)
quran://schema, quran://surahs, quran://stats, quran://tafsir-books
Prompt'lar
Study Ayah, Compare Tafsirs, Surah Overview, Hadith Analysis
Kurulum
pip install -e ".[dev]" # veya pip install -e .
Python ≥ 3.10. Çalıştırılabilir: islamic-corpus-mcp.
Veritabanı bağlama
MySQL/MariaDB gerekir; şema quran_surah, quran_ayah,
quran_ayah.text_normalized, tafsir, hadith, hadith_book,
surah_name_alias, tafsir_unmatched_raw tablolarını içerir
(quran://schema kaynağı ile görülebilir). Şema kurulumu için aşağıdaki
Veri temeli bölümüne bakın.
Güvenlik: read-only kullanıcı oluşturun.
CREATE USER 'islam_readonly'@'%' IDENTIFIED BY '<parola>';
GRANT SELECT ON islam_corpus.* TO 'islam_readonly'@'%';
FLUSH PRIVILEGES;
.env.example'i .env olarak kopyalayıp doldurun:
ISLAM_DB_HOST=127.0.0.1
ISLAM_DB_PORT=3306
ISLAM_DB_USER=islam_readonly
ISLAM_DB_PASS=<parola>
ISLAM_DB_NAME=islam_corpus
Railway public MySQL (production)
Railway'nin mysql.railway.internal adresi dışarıdan erişilemez. Railway
dashboard'ında Connect sekmesinden public proxy adresini alın ve
ISLAM_DB_HOST olarak kullanın.
Ortam değişkenleri
| Değişken | Default | Açıklama |
|---|---|---|
ISLAM_DB_HOST |
127.0.0.1 |
MySQL sunucu |
ISLAM_DB_PORT |
3306 |
MySQL port |
ISLAM_DB_USER |
islam_readonly |
DB kullanıcı (root = uyarı) |
ISLAM_DB_PASS |
boş | DB parola |
ISLAM_DB_NAME |
islam_corpus |
DB adı |
MCP_PUBLIC_URL |
— | Remote zorunlu public Railway domaini (OAuth issuer/resource) |
MCP_AUTH_TOKEN |
— | Opsiyonel statik Bearer (Claude Desktop/Cline fallback) |
MCP_CORS_ORIGINS |
boş (deny-all) | Virgülle ayrılmış izinli origin'ler |
MCP_RATE_LIMIT_REQUESTS |
60 |
IP başına pencere içi istek |
MCP_RATE_LIMIT_WINDOW |
60 |
Pencere (saniye) |
FASTMCP_HOST |
0.0.0.0 |
Uzak transport host |
FASTMCP_PORT |
8080 |
Uzak transport port |
Transport modları
| Mod | Komut | Uç nokta | Auth | Kullanım |
|---|---|---|---|---|
| stdio (default) | islamic-corpus-mcp |
stdin/stdout | yok | Claude Desktop, yerel |
| SSE | MCP_PUBLIC_URL=… islamic-corpus-mcp --sse |
/sse + /messages/ |
OAuth/statik Bearer | eski MCP istemcileri |
| streamable-http | MCP_PUBLIC_URL=… islamic-corpus-mcp --http |
/mcp |
OAuth 2.1 (ChatGPT) | önerilen modern |
ChatGPT streamable-http (
--http) gerektirir; statik bearer token gönderemez — gerçek OAuth 2.1 akışı ister. Bu yüzden uzak transport artık tam bir OAuth 2.1 yetki sunucusu içerir (dinamik istemci kaydı + PKCE +/authorize/token/register/revoke).MCP_PUBLIC_URLpublic domaininize ayarlanmalı; aksi halde sahte issuer ChatGPT akışını bozar ("We couldn't connect your account").
Opsiyonel statik token (Claude Desktop/Cline gibi statik-bearer istemciler):
export MCP_AUTH_TOKEN=$(python -c "import secrets;print(secrets.token_urlsafe(32))")
MCP_PUBLIC_URLolmadan--sse/--httpbaşlamaz (exit(1)). stdio'da auth yoktur.
TLS
Self-signed --https kaldırıldı. Üretimde bir reverse-proxy TLS sonlandırır.
Caddy örneği (Caddyfile):
mcp.example.com {
reverse_proxy 127.0.0.1:8080
}
Caddy otomatik Let's Encrypt sertifikası alır; X-Forwarded-For gönderir
(rate limit için doğru IP kaynağı).
CORS
Tarayıcı tabanlı MCP istemcisi için izin ver:
export MCP_CORS_ORIGINS=https://claude.ai,https://app.example.com
Boş bırakılırsa deny-all (hiçbir tarayıcı origin'ine header gönderilmez).
İstemci yapılandırması
Claude Desktop (stdio — yerel)
claude_desktop_config.json:
{
"mcpServers": {
"islamic-corpus": {
"command": "islamic-corpus-mcp",
"env": {
"ISLAM_DB_HOST": "127.0.0.1",
"ISLAM_DB_USER": "islam_readonly",
"ISLAM_DB_PASS": "<parola>",
"ISLAM_DB_NAME": "islam_corpus"
}
}
}
}
Claude Desktop / Code (uzak SSE)
{
"mcpServers": {
"islamic-corpus": {
"url": "https://mcp.example.com/sse",
"headers": { "Authorization": "Bearer <MCP_AUTH_TOKEN>" }
}
}
}
streamable-http (önerilen)
{
"mcpServers": {
"islamic-corpus": {
"url": "https://mcp.example.com/mcp",
"headers": { "Authorization": "Bearer <MCP_AUTH_TOKEN>" },
"type": "http"
}
}
}
ChatGPT (özel connector — OAuth 2.1)
ChatGPT statik bearer gönderemez; gerçek OAuth 2.1 akışı kullanır. Sunucu artık tam bir OAuth yetki sunucusudur, bu yüzden connector kurulumu basittir:
- Railway/dağıtım env'inde
MCP_PUBLIC_URL=https://mcp.example.comayarlayın (kendi public domaininiz) ve--httpile çalıştırın (Dockerfile varsayılanı). - ChatGPT → Settings → Connectors → Add custom connector.
- Server URL:
https://mcp.example.com/mcp - Authorization type: OAuth 2.0 (ChatGPT
/.well-known/oauth-authorization-servermetadatasını okuyup/register+/authorize+/tokenuç noktalarını otomatik keşfeder; client_id/secret girmeniz gerekmez — dinamik kayıt). "Sign in" tıklayın; sunucu tek-kullanıcı olduğu için otomatik onaylar (consent ekranı yok). - Token'lar bellek-içi 1 saat access / 30 gün refresh yaşar; yenileme otomatik.
Tek process/replica için bellek-içi token deposu yeterlidir. Çok instance'a ölçeklemek için Redis/postgres-backed bir
OAuthAuthorizationServerProvidergerekir.
Dağıtım
Docker
docker build -t islamic-corpus-mcp .
docker run -p 8080:8080 \
-e MCP_PUBLIC_URL=https://mcp.example.com \
-e ISLAM_DB_HOST=db.example.com \
-e ISLAM_DB_USER=islam_readonly \
-e ISLAM_DB_PASS=<parola> \
-e ISLAM_DB_NAME=islam_corpus \
-e MCP_CORS_ORIGINS=https://claude.ai \
islamic-corpus-mcp
Railway / fly.io
Kalıcı container (serverless değil) — streamable-http long-lived destekler.
Platformun PORT env'ini kullanır (Dockerfile --http ile başlatır). Platform
yönetilen TLS kullanır (reverse-proxy gerekmez). MCP_PUBLIC_URL'i Railway
service değişkenlerine ekleyin (public domain, örn. https://mcp.example.com)
— ChatGPT OAuth akışı için zorunlu.
Test & lint
pytest tests/ -v # 19 test (DB gerektirmez)
ruff check islamic_corpus_mcp/ tests/
Güvenlik
Tüm güvenlik notları için SECURITY.md. Özet:
- Remote = zorunlu Bearer token (sabit-zamanlı doğrulama)
- Tüm SQL parametrize (injection yok)
- DB read-only kullanıcı öner
- Pydantic girdi kısıtları (422)
- CORS deny-all varsayılan
- Rate limit IP bazlı (tek-process)
- TLS reverse-proxy ile
Lisans
MIT. Korpus verisinin kendisi ayrı lisans/lisanslara tabi olabilir; kaynaklar için tefsir/hadis derlemelerinin orijinal yayın şartlarına uyun.
Veri Temeli (Faz 1 — ingest)
Aşağıdaki bölüm kaynak veriyi indir, normalize et, eşle ve MySQL'e yükleme sürecini anlatır. MCP sunucusunu kullanmadan önce veritabanını bu adımlarla doldurun.
Dizin yapısı
download_data.py Kaynakları data/ içine indirir (SENIN makinede calisir)
db/schema.sql Tam MySQL semasi (FK, index, FULLTEXT) — 11 tablo
ingest/
arabic_normalize.py Arapca normalize edici — S2 agresif (elif silme)
db.py Ortak MySQL baglanti yardimcisi (PyMySQL)
ingest_quran.py Kur'an metni + ceviriler -> kanonik omurga
ingest_hadith.py Kutub-i Tis'a (hadith-json) -> hadith tablolari
ingest_tafsir.py Tefsir -> ayet esleme + iki gecisli (birebir+fuzzy)
verify_matching.py MySQL gerektirmeden eslesme dogrulama (saf Python)
reports/
normalization_report.md Son eslesme raporu (tam veri, gercek sonuclar)
data/ Ham veri (download_data.py doldurur; repoya konmaz)
0) Veriyi indir
pip install requests huggingface_hub pandas pyarrow
python download_data.py
Dosyalar data/quran, data/hadith, data/tafsir altına iner.
1) Kurulum
pip install pymysql pandas pyarrow
mysql -u root -p -e "CREATE DATABASE islam_corpus CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -p islam_corpus < db/schema.sql
set DB_USER=root
set DB_PASS=***
set DB_NAME=islam_corpus
2) Eşleşme doğrulama (MySQL gerektirmez)
python verify_matching.py --sample 5000 # orneklem
python verify_matching.py --full # tam veri
3) MySQL'e yükleme sırası
# Kanonik omurga (ONCE bu)
python ingest/ingest_quran.py --inspect data/quran/Quran-Data/Quran-Data-main/Quran.json
python ingest/ingest_quran.py --sample 50 --json data/quran/Quran-Data/Quran-Data-main/Quran.json
python ingest/ingest_quran.py --full --json data/quran/Quran-Data/Quran-Data-main/Quran.json
# Hadis (kitap basina veya klasor)
python ingest/ingest_hadith.py --inspect data/hadith/hadith-json/hadith-json-main/db/by_book/the_9_books/bukhari.json
python ingest/ingest_hadith.py --dir --full data/hadith/hadith-json/hadith-json-main/db/by_book/the_9_books
# Tefsir — STOP & REPORT: once ornekle, orani kontrol et
python ingest/ingest_tafsir.py --inspect data/tafsir
python ingest/ingest_tafsir.py --sample 2000 data/tafsir
# -> reports/normalization_report.md'yi incele
python ingest/ingest_tafsir.py --full data/tafsir
Hangi kaynak hangi tabloya
| Kaynak | Tablo(lar) | Not |
|---|---|---|
| AbdullahGhanem/quran-database, rn0x/Quran-Data | quran_surah, quran_ayah, quran_translation | Sayisal omurga; kanonik anahtar buradan |
| AhmedBaset/hadith-json | hadith_book, hadith | ANA hadis kaynagi (id/chapterId/arabic/english) |
| LK-Hadith-Corpus | narrator, hadith_narrator | Ravi/isnad; doldurulabildigi kadar (ayri script — TODO) |
| MohamedRashad/Quran-Tafseer | tafsir, tafsir_unmatched_raw | Arapca ad + ayet metni; S2 + iki gecisli esleme |
Eşleşme politikası (KARARLASTI)
- Gecis 1 — Birebir (S2 agresif): normalize_ayah_key() tum elif (ا) karakterlerini siler. Osmani ↔ standart imla farkini notrler.
match_status='matched',confidence=1.000 - Gecis 2 — Bulanik (Jaccard >= 0.8): birebir eslesmeyenler icin token Jaccard benzerligi >= 0.8 ile eslestirme.
match_status='fuzzy',confidence=Jaccard skoru - Eslesmeyen: silinmez, tahmin edilmez.
match_status='unmatched',surah_id=NULL, ham halitafsir_unmatched_raw'da
Gerçek eşleşme sonuçları (tam veri, 218.530 satır)
| Durum | Sayı | Oran |
|---|---|---|
| matched (birebir) | 179.330 | %82.06 |
| fuzzy (Jaccard>=0.8) | 28.407 | %13.00 |
| unmatched | 10.793 | %4.94 |
| Toplam eşleşme | 207.737 | %95.06 |
Sûre adı eşlemesi: 113/113 = %100. Sahte-eşleşme riski (S2): 6.141 kanonik anahtardan yalnızca 28'i farklı ayetlere aynı anahtara iniyor (%0.46).
Bilinçli boş bırakılanlar (bu faz)
- hadith_ayah (hadis–ayet bağı): kaynakta hazır yok — sonraki faz.
- hadith.grade (derece): hadith-json'da yok — kaynak netleşince.
- text_tr (Türkçe tefsir/hadis): Diyanet metinleri telifli, kullanılmaz. Açık-lisanslı kaynak kararı kullanıcıda.
Bilinen eksikler / sonraki fazlar
- LK-Hadith-Corpus'tan narrator/hadith_narrator doldurma (ayrı script)
- hadith_ayah: hadis–ayet bağı (NLP ile, sonraki faz)
- Çeviri kaynakları (Türkçe Meal: açık lisanslı kaynak araştırması)
- MCP sorgu katmanı — ✅ tamamlandı (
islamic_corpus_mcp/) - Okuma arayüzü (
web/— ayrı)
Установка IslamicCorpusMCP
У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.
▸ github.com/ayzekhdawy/IslamicCorpusMCPFAQ
IslamicCorpusMCP MCP бесплатный?
Да, IslamicCorpusMCP MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для IslamicCorpusMCP?
Нет, IslamicCorpusMCP работает без API-ключей и переменных окружения.
IslamicCorpusMCP — hosted или self-hosted?
Self-hosted: сервер запускается локально на твоей машине командой из раздела установки.
Как установить IslamicCorpusMCP в Claude Desktop, Claude Code или Cursor?
Открой IslamicCorpusMCP на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
wenb1n-dev/SmartDB_MCP
A universal database MCP server supporting simultaneous connections to multiple databases. It provides tools for database operations, health analysis, SQL optim
автор: wenb1n-devPostgres Server
This server enables interaction with PostgreSQL databases through the Model Context Protocol, optimized for the AWS Bedrock AgentCore Runtime. It provides tools
автор: madhurprashPostgres
Query your database in natural language
автор: AnthropicPostgreSQL
Read-only database access with schema inspection.
автор: modelcontextprotocolCompare IslamicCorpusMCP with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории data
