MCP Research Friend Server
resmiAraştırma araçları, Sqlite destekli bir belge deposu dahil
Dokümantasyon
Research Friend
Yapay zeka asistanlarının web'de arama yapması ve yerel bir araştırma arşivini yönetmesi için dost bir yardımcı.
Research Friend, yapay zeka araçlarınıza web sayfalarını getirme ve internette arama yapma yeteneği kazandıran bir MCP sunucusudur. Arka planda gerçek bir web tarayıcısı kullanır, bu nedenle yoğun olarak JavaScript kullanan modern web sitelerinde bile çalışır. Ayrıca belgeleri depolamak, metin çıkarmak ve kütüphanenizde arama yapmak için yerel bir "arşiv" içerir.
Tüm özelliklerinden yararlanmak için, istemleri (yaygın) ve örneklemeyi (daha az yaygın) destekleyen bir MCP istemcisine ihtiyacınız olacak. Research Friend'i, her ikisini de destekleyen Chabeau ile birlikte geliştiriyoruz.
Neler yapabilir?
- Web sayfalarını getirir (JS ağırlıklı siteler dahil) gerçek bir tarayıcı ile
- PDF'leri getirir ve metin içeriklerini çıkarır
- Web'de arama yapar DuckDuckGo veya Google aracılığıyla
- Yerel bir arşiv tutar; arama, listeleme ve çıkarma için belgeleri saklar
Başlarken
Bilgisayarınızda Node.js sürüm 20 veya daha yenisinin yüklü olması gerekir.
1. Bağımlılıkları yükleyin
Bu klasörde bir terminal açın ve şunu çalıştırın:
npm install
2. Tarayıcı desteğini yükleyin
Research Friend, bir web tarayıcısını kontrol etmek için Playwright kullanır. Bağımlılıkları yükledikten sonra tarayıcıyı yüklemeniz gerekir:
npx playwright install chromium
Bu, Playwright'ın kullanacağı bir Chromium kopyasını indirir. Halihazırda yüklü olan tarayıcılarınızdan ayrıdır.
3. Sunucuyu başlatın
node src/index.js
Sunucu, MCP istemcilerinin bağlandığı stdio (standart giriş/çıkış) üzerinden iletişim kurar.
MCP istemcinize ekleme
Research Friend'i nasıl ekleyeceğiniz, hangi MCP istemcisini kullandığınıza bağlıdır. İşte yapılandırmanın nasıl görünebileceğine dair genel bir örnek:
[[mcp_servers]]
id = "research-friend"
command = "node"
args = ["/path/to/mcp-research-friend/src"]
transport = "stdio"
/path/to/mcp-research-friend kısmını, bilgisayarınızdaki bu klasörün gerçek yolu ile değiştirin.
Araçlar
Web araçları
friendly_web_fetch
Bir web sayfasını getirir ve içeriğini döndürür. Varsayılan olarak, bağlantılar korunmuş şekilde markdown döndürür — LLM'ler için idealdir. Ana içeriği (gezinme, reklamlar vb. çıkarılarak) ayıklamak için Readability kullanır. PDF'ler, sayfalandırma veya içerik içinde arama için bunun yerine friendly_web_extract kullanın.
Parametreler:
url(gerekli) - Getirilecek web adresioutputFormat- Çıktı formatı:markdown(varsayılan),textveyahtmlwaitMs- İçerik yavaş görünüyorsa, sayfa yüklendikten sonra beklenecek ek süretimeoutMs- Vazgeçmeden önce ne kadar bekleneceği (varsayılan: 15 saniye)maxChars- Döndürülecek maksimum içerik miktarı (varsayılan: 40.000 karakter)includeHtml- İçerikle birlikte ham HTML'i de döndürmek içintrueolarak ayarlayınheadless- Tarayıcı penceresini görmek içinfalseolarak ayarlayın (hata ayıklama için kullanışlıdır)
Döndürülenler:
url- İstenen URLfinalUrl- Yönlendirmelerden sonraki URLtitle- Sayfa başlığıcontent- Ayıklanan içerik (istenen formatta)html- Ham HTML (yalnızcaincludeHtmltrue ise)meta- Sayfa meta verileri (açıklama, yazar, yayınlanma zamanı vb.)fetchedAt- Sayfanın getirildiği zamana ait ISO zaman damgasıtruncated- İçeriğinmaxCharssığacak şekilde kesilip kesilmediği
friendly_search
Web'de arama yapar ve sonuç listesini döndürür.
Parametreler:
query(gerekli) - Aranacak şeyengine- Hangi arama motorunun kullanılacağı (duckduckgoveyagoogle)maxResults- Kaç sonuç döndürüleceği (varsayılan: 10, maksimum: 50)timeoutMs- Vazgeçmeden önce ne kadar bekleneceği (varsayılan: 15 saniye)headless- Tarayıcı penceresini görmek içinfalseolarak ayarlayın
Döndürülenler:
query- Kullanılan arama sorgusuengine- Hangi arama motorunun kullanıldığıresults- Her birititle,urlvesnippetiçeren sonuç dizisisearchedAt- Aramanın yapıldığı zamana ait ISO zaman damgasıfallback_result_html- Sayfanın ham HTML'i (yalnızca hiç sonuç bulunamazsa dahil edilir)debug_info- Arama girişimi hakkında tanısal bilgiler
CAPTCHA işleme:
Başsız modda çalışırken bir CAPTCHA algılanırsa, araç otomatik olarak görünür bir tarayıcı penceresiyle yeniden dener. Bu, CAPTCHA'yı manuel olarak çözme şansı verir. debug_info.retried alanı, bu yedeğin kullanılıp kullanılmadığını gösterir.
friendly_web_extract
Bir URL'den içerik çıkarır. URL'nin bir PDF'ye mi yoksa bir web sayfasına mı işaret ettiğini otomatik olarak algılar ve her birini uygun şekilde işler.
Parametreler:
url(gerekli) - Getirilecek URL (PDF veya web sayfası)maxChars- Döndürülecek maksimum metin miktarı (varsayılan: 40.000 karakter)offset- Başlanacak karakter konumu (varsayılan: 0). Büyük içeriklerde sayfalandırma yapmak için bunu kullanın.search- Tam içerik yerine bir ifade arayın ve eşleşmeleri çevreleyen bağlamla birlikte döndürüncontextChars- Her arama eşleşmesi etrafındaki bağlam karakterleri (varsayılan: 200)waitMs- Dinamik içerik için sayfa yüklendikten sonra beklenecek ek süre (yalnızca web sayfaları)timeoutMs- Vazgeçmeden önce ne kadar bekleneceği (varsayılan: 15 saniye, yalnızca web sayfaları)headless- Tarayıcı penceresini görmek içinfalseolarak ayarlayın (yalnızca web sayfaları)
Döndürülenler (normal mod):
url- İstenen URLcontentType-pdfveyahtmltitle- Sayfa/belge başlığıauthor- PDF yazarı (varsa, yalnızca PDF'ler)creationDate- PDF'in oluşturulma zamanı (varsa, yalnızca PDF'ler)pageCount- Sayfa sayısı (yalnızca PDF'ler)totalChars- Toplam karakter (sayfalandırma içinoffsetile kullanın)offset- Kullanılan ofsetcontent- Ayıklanan metin içeriğifetchedAt- ISO zaman damgasıtruncated- Bu parçadan sonra daha fazla içerik kalıp kalmadığı
Döndürülenler (arama modu):
url,contentType,title,totalChars,fetchedAt- Yukarıdakiyle aynısearch- Kullanılan arama ifadesimatchCount- Bulunan eşleşme sayısımatches- Her biriposition,context,prefixvesuffixiçeren eşleşme dizisi
friendly_web_ask
Bir URL'yi (PDF veya web sayfası) getirir ve bir LLM'nin bu konuda soruları yanıtlamasını sağlar. İçerik türünü otomatik olarak algılar. Belge ayrı bir bağlamda işlenir, böylece ana konuşmanız kompakt kalır.
Parametreler:
url(gerekli) - Getirilecek URL (PDF veya web sayfası)ask(gerekli) - LLM için soru veya talimat (özetle, bilgi çıkar, soruları yanıtla vb.)askMaxInputTokens- LLM çağrısı başına maksimum girdi token'ı (varsayılan: 150.000)askMaxOutputTokens- LLM çağrısı başına maksimum çıktı token'ı (varsayılan: 4.096)askTimeout- Milisaniye cinsinden zaman aşımı (varsayılan: 300.000 = 5 dakika)askSplitAndSynthesize- Büyük belgeler için: parçalara böl, her birini işle, sonra sonuçları sentezle (varsayılan: false). Uyarı: çok fazla token tüketir.waitMs- Dinamik içerik için sayfa yüklendikten sonra beklenecek ek süre (yalnızca web sayfaları)timeoutMs- Vazgeçmeden önce ne kadar bekleneceği (varsayılan: 15 saniye, yalnızca web sayfaları)headless- Tarayıcı penceresini görmek içinfalseolarak ayarlayın (yalnızca web sayfaları)
Döndürülenler:
url- İstenen URLcontentType-pdfveyahtmltitle- Sayfa/belge başlığıtotalChars- Belgedeki toplam karakterask- Verilen talimatanswer- LLM'nin yanıtımodel- Yanıtı oluşturan modelchunksProcessed- İşlenen parça sayısı (küçük belgeler için 1,askSplitAndSynthesizekullanırken daha fazla)fetchedAt- ISO zaman damgası
Soru modu, bir LLM'nin belgeyi herhangi bir talimatla işlemesini sağlamak için MCP örneklemesini kullanır. Bu şunlar için kullanışlıdır:
- Bağlamı aşırı yükleyebilecek büyük belgeler
- Ana konuşmadaki token maliyetlerini düşük tutmak
askSplitAndSynthesize etkinleştirildiğinde, askMaxInputTokens aşan belgeler otomatik olarak örtüşen parçalara bölünür. Her parça ayrı ayrı işlenir ve sonuçlar tek bir tutarlı yanıt halinde sentezlenir. Nihai yanıt, belgenin dilinden bağımsız olarak, isteğinizle aynı dilde sağlanır.
Belge arşivi
Arşiv, yerel, aranabilir bir belge kütüphanesidir. PDF'leri, HTML dosyalarını ve düz metni (Markdown/TXT) destekler. Bir belge eklediğinizde, Research Friend orijinal dosyayı saklar, metni çıkarır (PDF'ler/HTML için) ve meta verileri yerel bir veritabanına kaydeder. Aramalar, hızlı, ifadeye duyarlı eşleştirme için arka planda ripgrep kullanır.
Arşiv konumu
Arşiv ~/.research-friend/ altında bulunur:
inbox/- İşlenmek üzere dosyaları buraya bırakınstore/- Düzenlenmiş belge depolama ve ayıklanmış metinstash.db- Meta veri veritabanı
Desteklenen dosya türleri
- PDF:
.pdf(metin ayıklanır) - HTML:
.html,.htm(metin ayıklanır) - Markdown:
.md,.markdown(düz metin olarak saklanır) - Metin:
.txt(düz metin olarak saklanır)
Arşiv araçları
stash_open_inbox
Daha kolay sürükle-bırak için arşiv gelen kutusu klasörünü dosya yöneticinizde açın.
Döndürülenler:
opened- Klasör açma isteğinin gönderilip gönderilmediğiinboxPath- Gelen kutusunun mutlak yolucommand- Kullanılan işletim sistemi komutuargs- Kullanılan komut argümanları
stash_process_inbox
inbox/ içindeki dosyaları işleyin, konulara göre sınıflandırın, metni çıkarın ve sonuçları saklayın.
Uzun belgeler için sınıflandırma, konu doğruluğunu artırmak amacıyla örneklenmiş bölümleri (başlangıç/orta/son artı birkaç rastgele parça) kullanır.
Döndürülenler:
processed- Başarıyla işlenen dosya adları dizisierrors- Karşılaşılan hatalardocuments- Oluşturulan belge kayıtları dizisi
reindex_stash
Arşivlenmiş belgeler için özetleri yeniden oluşturun, konuları yeniden tahsis edin ve mağaza meta verilerini güncelleyin. ids atlanır veya boş bırakılırsa, tüm belgeler yeniden indekslenir.
Parametreler:
ids- Yeniden indekslenecek belge kimlikleri (isteğe bağlı)
Döndürülenler:
reindexed- Yeniden indekslenen belge kimliklerierrors- Karşılaşılan hatalardocuments- Güncellenen belge kayıtları dizisi
stash_list
Arşivdeki belgeleri listeler.
Parametreler:
topic- Bir konuya filtrele (isteğe bağlı)limit- Maksimum sonuç (varsayılan: 50)offset- Sayfalandırma ofseti (varsayılan: 0)
Döndürülenler:
type-allveyatopictotalDocuments- Toplam belge (yalnızcatype,allolduğunda)count- Sayfalandırmadan sonra döndürülen sonuçlaroffset- Kullanılan sayfalandırma ofsetilimit- Kullanılan sayfalandırma limititopics- Bilinen konuların ve belge sayılarının özetidocuments- Meta verilerle birlikte belge listesi (bir konu listelenirkenisPrimaryiçerir)
stash_search
Arşiv genelinde dosya adlarını ve içeriği arayın. Tüm arama terimleri mevcut olmalıdır (VE mantığı). Dosya adı eşleşmeleri önce listelenir. Tam ifadeler için tırnak işareti kullanın.
Parametreler:
query(gerekli) - Arama terimleri. İfadeler için tırnak işareti kullanın:"sparkling wine"topic- Bir konuya filtrele (isteğe bağlı)ids- Belirli belge kimliklerine filtrele (isteğe bağlı)limit- Döndürülecek maksimum belge (varsayılan: 20)offset- Sayfalandırma ofseti (varsayılan: 0)maxMatchesPerDoc- Belge başına maksimum eşleşme (varsayılan: 50)context- Her eşleşme etrafındaki bağlam satırları (varsayılan: 1, maks: 5). Hem terimlerin eşleşmesi için ne kadar yakın görünmesi gerektiğini hem de ne kadar çevreleyen metnin döndürüleceğini kontrol eder. Döndürülenler:totalMatches- Sayfalandırmadan önce eşleşen toplam belge sayısıcount- Sayfalandırmadan sonra döndürülen sonuçlarresults- Her biri şunları içeren belge dizisi:id,filename,fileType,summary,charCount,createdAtmatchType-filename,contentveyafilename+contentmatches- Her eşleşme konumu için{ line, context }dizisi
Doğrudan eşleşme konumlarına atlamak için stash_extract ile line değerlerini kullanın.
stash_extract
Okumak üzere saklanmış bir belgeden içerik çıkarır. Doğrudan eşleşmelere atlamak için stash_search sonuçlarındaki satır numaralarını kullanın.
Parametreler:
id(gerekli) -stash_list/stash_searchkaynağından belge kimliğimaxChars- Döndürülecek maksimum metin miktarı (varsayılan: 40.000 karakter)offset- Başlangıç karakter konumu (lineile karşılıklı olarak birbirini dışlar)line- Başlangıç satır numarası (offsetile karşılıklı olarak birbirini dışlar)
Döndürülenler:
id,filename,fileType,summary- Belge üst verisitotalChars- Belgedeki toplam karakter sayısıoffset- Karakter ofseti (referans içinlinekullanıldığında dahil edilir)line- Satır numarası (yalnızcalineparametresi kullanıldığında)content- Çıkarılan metin içeriğitruncated- Bu parçadan sonra daha fazla içerik kalıp kalmadığı
stash_ask
Saklanmış bir belge hakkında soruları bir LLM'ye yanıtlatır. Belge ayrı bir bağlamda işlenir, böylece ana konuşmanız derli toplu kalır.
Parametreler:
id(gerekli) -stash_list/stash_searchkaynağından belge kimliğiask(gerekli) - LLM için soru veya talimataskMaxInputTokens- LLM çağrısı başına maksimum girdi token'ı (varsayılan: 150.000)askMaxOutputTokens- LLM çağrısı başına maksimum çıktı token'ı (varsayılan: 4.096)askTimeout- Milisaniye cinsinden zaman aşımı (varsayılan: 300.000 = 5 dakika)askSplitAndSynthesize- Büyük belgeler için: parçalara böl, her birini işle, sonra sonuçları sentezle (varsayılan: false)
Döndürülenler:
id,filename,fileType,summary- Belge üst verisitotalChars- Belgedeki toplam karakter sayısıask- Verilen talimatanswer- LLM'nin yanıtımodel- Yanıtı oluşturan modelchunksProcessed- İşlenen parça sayısı
Tipik akış
- Dosyaları
~/.research-friend/inbox/içine bırakın stash_process_inboxçalıştırın- Konulara göz atmak için
stash_listkullanın - İlgili belgeleri bulmak için
stash_searchkullanın - Belirli bir belgeyi okumak için
stash_extractveya hakkında soru sormak içinstash_askkullanın
Sorun Giderme
"Tarayıcı beklenmedik şekilde kapandı" veya benzer hatalar
Tarayıcıyı yeniden yüklemeyi deneyin:
npx playwright install chromium --force
Linux'ta ayrıca sistem bağımlılıklarına ihtiyacınız olabilir:
npx playwright install-deps chromium
Sunucu başlamıyor
Node.js 20 veya daha yenisini kullandığınızdan emin olun:
node --version
Sürümünüz daha eskiyse, daha yenisini indirmek için nodejs.org adresini ziyaret edin.
Lisans
MIT