MCP Research Friend Server
resmiAlat riset, termasuk penyimpanan dokumen berbasis Sqlite
Dokumentasi
Research Friend
Pembantu yang ramah untuk asisten AI yang perlu mencari sesuatu di web dan mengelola simpanan riset lokal.
Research Friend adalah server MCP yang memberikan kemampuan kepada perangkat AI Anda untuk mengambil halaman web dan mencari di internet. Ia menggunakan peramban web sungguhan di balik layar, sehingga tetap berfungsi bahkan dengan situs web modern yang sangat bergantung pada JavaScript. Ia juga menyertakan "simpanan" lokal untuk menyimpan dokumen, mengekstrak teks, dan mencari di seluruh pustaka Anda.
Untuk memanfaatkan semua fiturnya, Anda memerlukan klien MCP yang mendukung prompt (umum) dan sampling (kurang umum). Kami membangun Research Friend bersama Chabeau, yang mendukung keduanya.
Apa yang bisa dilakukannya?
- Mengambil halaman web dengan peramban sungguhan (termasuk situs yang sarat JS)
- Mengambil PDF dan mengekstrak konten teksnya
- Mencari di web melalui DuckDuckGo atau Google
- Memelihara simpanan lokal dokumen untuk pencarian, daftar, dan ekstraksi
Memulai
Anda memerlukan Node.js versi 20 atau lebih baru yang terinstal di komputer Anda.
1. Instal dependensi
Buka terminal di folder ini dan jalankan:
npm install
2. Instal dukungan peramban
Research Friend menggunakan Playwright untuk mengendalikan peramban web. Setelah menginstal dependensi, Anda perlu menginstal peramban:
npx playwright install chromium
Ini mengunduh salinan Chromium yang akan digunakan Playwright. Ini terpisah dari peramban apa pun yang sudah Anda instal.
3. Mulai server
node src/index.js
Server berkomunikasi melalui stdio (input/output standar), yang merupakan cara klien MCP terhubung dengannya.
Menambahkan ke klien MCP Anda
Cara Anda menambahkan Research Friend bergantung pada klien MCP yang Anda gunakan. Berikut adalah contoh umum seperti apa konfigurasinya:
[[mcp_servers]]
id = "research-friend"
command = "node"
args = ["/path/to/mcp-research-friend/src"]
transport = "stdio"
Ganti /path/to/mcp-research-friend dengan jalur sebenarnya ke folder ini di komputer Anda.
Alat
Alat web
friendly_web_fetch
Mengambil halaman web dan mengembalikan kontennya. Secara default, mengembalikan markdown dengan tautan yang dipertahankan β ideal untuk LLM. Menggunakan Readability untuk mengekstrak konten utama (menghilangkan navigasi, iklan, dll.). Untuk PDF, paginasi, atau pencarian dalam konten, gunakan friendly_web_extract sebagai gantinya.
Parameter:
url(wajib) - Alamat web yang akan diambiloutputFormat- Format keluaran:markdown(default),text, atauhtmlwaitMs- Waktu ekstra untuk menunggu setelah halaman dimuat, jika konten muncul perlahantimeoutMs- Berapa lama menunggu sebelum menyerah (default: 15 detik)maxChars- Jumlah maksimum konten yang akan dikembalikan (default: 40.000 karakter)includeHtml- Atur ketrueuntuk juga mengembalikan HTML mentah bersama kontenheadless- Atur kefalseuntuk melihat jendela peramban (berguna untuk debugging)
Mengembalikan:
url- URL yang dimintafinalUrl- URL setelah pengalihan apa puntitle- Judul halamancontent- Konten yang diekstrak (dalam format yang diminta)html- HTML mentah (hanya jikaincludeHtmltrue)meta- Metadata halaman (deskripsi, penulis, waktu publikasi, dll.)fetchedAt- Stempel waktu ISO saat halaman diambiltruncated- Apakah konten dipotong agar sesuai denganmaxChars
friendly_search
Mencari di web dan mengembalikan daftar hasil.
Parameter:
query(wajib) - Apa yang akan dicariengine- Mesin pencari mana yang akan digunakan (duckduckgoataugoogle)maxResults- Berapa banyak hasil yang akan dikembalikan (default: 10, maksimum: 50)timeoutMs- Berapa lama menunggu sebelum menyerah (default: 15 detik)headless- Atur kefalseuntuk melihat jendela peramban
Mengembalikan:
query- Kueri pencarian yang digunakanengine- Mesin pencari mana yang digunakanresults- Array hasil, masing-masing dengantitle,url, dansnippetsearchedAt- Stempel waktu ISO saat pencarian dilakukanfallback_result_html- HTML mentah halaman (hanya disertakan jika tidak ada hasil yang ditemukan)debug_info- Informasi diagnostik tentang upaya pencarian
Penanganan CAPTCHA:
Jika CAPTCHA terdeteksi saat berjalan dalam mode headless, alat secara otomatis mencoba lagi dengan jendela peramban yang terlihat. Ini memberi Anda kesempatan untuk menyelesaikan CAPTCHA secara manual. Bidang debug_info.retried menunjukkan apakah fallback ini digunakan.
friendly_web_extract
Mengekstrak konten dari URL. Mendeteksi secara otomatis apakah URL mengarah ke PDF atau halaman web dan menangani masing-masing dengan tepat.
Parameter:
url(wajib) - URL yang akan diambil (PDF atau halaman web)maxChars- Jumlah maksimum teks yang akan dikembalikan (default: 40.000 karakter)offset- Posisi karakter untuk memulai (default: 0). Gunakan ini untuk melakukan paginasi melalui konten besar.search- Cari frasa dan kembalikan kecocokan dengan konteks sekitarnya alih-alih konten penuhcontextChars- Karakter konteks di sekitar setiap kecocokan pencarian (default: 200)waitMs- Waktu ekstra untuk menunggu setelah halaman dimuat untuk konten dinamis (hanya halaman web)timeoutMs- Berapa lama menunggu sebelum menyerah (default: 15 detik, hanya halaman web)headless- Atur kefalseuntuk melihat jendela peramban (hanya halaman web)
Mengembalikan (mode normal):
url- URL yang dimintacontentType- Baikpdfatauhtmltitle- Judul halaman/dokumenauthor- Penulis PDF (hanya PDF, jika tersedia)creationDate- Kapan PDF dibuat (hanya PDF, jika tersedia)pageCount- Jumlah halaman (hanya PDF)totalChars- Total karakter (gunakan denganoffsetuntuk paginasi)offset- Offset yang digunakancontent- Konten teks yang diekstrakfetchedAt- Stempel waktu ISOtruncated- Apakah lebih banyak konten tersisa setelah potongan ini
Mengembalikan (mode pencarian):
url,contentType,title,totalChars,fetchedAt- Sama seperti di atassearch- Frasa pencarian yang digunakanmatchCount- Jumlah kecocokan yang ditemukanmatches- Array kecocokan, masing-masing denganposition,context,prefix, dansuffix
friendly_web_ask
Mengambil URL (PDF atau halaman web) dan meminta LLM menjawab pertanyaan tentangnya. Mendeteksi jenis konten secara otomatis. Dokumen diproses dalam konteks terpisah, menjaga percakapan utama Anda tetap ringkas.
Parameter:
url(wajib) - URL yang akan diambil (PDF atau halaman web)ask(wajib) - Pertanyaan atau instruksi untuk LLM (meringkas, mengekstrak info, menjawab pertanyaan, dll.)askMaxInputTokens- Token input maksimum per panggilan LLM (default: 150.000)askMaxOutputTokens- Token output maksimum per panggilan LLM (default: 4.096)askTimeout- Timeout dalam milidetik (default: 300.000 = 5 menit)askSplitAndSynthesize- Untuk dokumen besar: bagi menjadi potongan, proses masing-masing, lalu sintesis hasil (default: false). Peringatan: mengonsumsi banyak token.waitMs- Waktu ekstra untuk menunggu setelah halaman dimuat untuk konten dinamis (hanya halaman web)timeoutMs- Berapa lama menunggu sebelum menyerah (default: 15 detik, hanya halaman web)headless- Atur kefalseuntuk melihat jendela peramban (hanya halaman web)
Mengembalikan:
url- URL yang dimintacontentType- Baikpdfatauhtmltitle- Judul halaman/dokumentotalChars- Total karakter dalam dokumenask- Instruksi yang diberikananswer- Respons LLMmodel- Model yang menghasilkan responschunksProcessed- Jumlah potongan yang diproses (1 untuk dokumen kecil, lebih banyak saat menggunakanaskSplitAndSynthesize)fetchedAt- Stempel waktu ISO
Mode tanya menggunakan sampling MCP untuk meminta LLM memproses dokumen dengan instruksi apa pun. Ini berguna untuk:
- Dokumen besar yang akan membanjiri konteks
- Menjaga biaya token tetap rendah pada percakapan utama
Saat askSplitAndSynthesize diaktifkan, dokumen yang melebihi askMaxInputTokens secara otomatis dibagi menjadi potongan yang tumpang tindih. Setiap potongan diproses secara terpisah, dan hasilnya disintesis menjadi satu jawaban yang koheren. Respons akhir diberikan dalam bahasa yang sama dengan permintaan Anda, terlepas dari bahasa dokumen.
Simpanan dokumen
Simpanan adalah pustaka dokumen lokal yang dapat dicari. Ini mendukung PDF, file HTML, dan teks biasa (Markdown/TXT). Saat Anda menambahkan dokumen, Research Friend menyimpan file asli, mengekstrak teks (untuk PDF/HTML), dan menyimpan metadata dalam basis data lokal. Pencarian menggunakan ripgrep di balik layar untuk pencocokan yang cepat dan sadar frasa.
Lokasi simpanan
Simpanan berada di bawah ~/.research-friend/:
inbox/- Letakkan file di sini untuk diprosesstore/- Penyimpanan dokumen terorganisir dan teks yang diekstrakstash.db- Basis data metadata
Jenis file yang didukung
- PDF:
.pdf(teks diekstrak) - HTML:
.html,.htm(teks diekstrak) - Markdown:
.md,.markdown(disimpan sebagai teks biasa) - Teks:
.txt(disimpan sebagai teks biasa)
Alat simpanan
stash_open_inbox
Buka folder kotak masuk simpanan di pengelola file Anda untuk memudahkan seret dan lepas.
Mengembalikan:
opened- Apakah permintaan buka folder telah dikiriminboxPath- Jalur absolut ke kotak masukcommand- Perintah OS yang digunakanargs- Argumen perintah yang digunakan
stash_process_inbox
Memproses file di inbox/, mengklasifikasikannya ke dalam topik, mengekstrak teks, dan menyimpan hasilnya.
Untuk dokumen panjang, klasifikasi menggunakan bagian sampel (awal/tengah/akhir ditambah beberapa potongan acak) untuk meningkatkan akurasi topik.
Mengembalikan:
processed- Array nama file yang berhasil diproseserrors- Kesalahan apa pun yang ditemuidocuments- Array catatan dokumen yang dibuat
reindex_stash
Menghasilkan ulang ringkasan, mengalokasikan ulang topik, dan memperbarui metadata simpanan untuk dokumen yang disimpan. Jika ids dihilangkan atau kosong, semua dokumen diindeks ulang.
Parameter:
ids- ID dokumen yang akan diindeks ulang (opsional)
Mengembalikan:
reindexed- ID dokumen yang diindeks ulangerrors- Kesalahan apa pun yang ditemuidocuments- Array catatan dokumen yang diperbarui
stash_list
Mencantumkan dokumen di simpanan.
Parameter:
topic- Filter ke topik (opsional)limit- Hasil maks (default: 50)offset- Offset paginasi (default: 0)
Mengembalikan:
type-allatautopictotalDocuments- Total dokumen (hanya ketikatypeadalahall)count- Hasil yang dikembalikan setelah paginasioffset- Offset paginasi yang digunakanlimit- Batas paginasi yang digunakantopics- Ringkasan topik yang diketahui dan jumlah dokumendocuments- Daftar dokumen dengan metadata (termasukisPrimarysaat mencantumkan topik)
stash_search
Mencari nama file dan konten di seluruh simpanan. Semua istilah pencarian harus ada (logika AND). Kecocokan nama file dicantumkan terlebih dahulu. Gunakan tanda kutip untuk frasa tepat.
Parameter:
query(wajib) - Istilah pencarian. Gunakan tanda kutip untuk frasa:"sparkling wine"topic- Filter ke topik (opsional)ids- Filter ke ID dokumen tertentu (opsional)limit- Dokumen maks yang akan dikembalikan (default: 20)offset- Offset paginasi (default: 0)maxMatchesPerDoc- Kecocokan maks per dokumen (default: 50)context- Baris konteks di sekitar setiap kecocokan (default: 1, maks: 5). Mengontrol seberapa dekat istilah harus muncul untuk cocok DAN berapa banyak teks sekitarnya yang dikembalikan. Mengembalikan:totalMatches- Total dokumen yang cocok sebelum paginasicount- Hasil yang dikembalikan setelah paginasiresults- Array dokumen, masing-masing dengan:id,filename,fileType,summary,charCount,createdAtmatchType-filename,content, ataufilename+contentmatches- Array{ line, context }untuk setiap lokasi kecocokan
Gunakan nilai line dengan stash_extract untuk langsung melompat ke lokasi kecocokan.
stash_extract
Ekstrak konten dari dokumen yang disimpan untuk dibaca. Gunakan nomor baris dari hasil stash_search untuk langsung melompat ke kecocokan.
Parameter:
id(wajib) - ID Dokumen daristash_list/stash_searchmaxChars- Jumlah maksimum teks yang akan dikembalikan (default: 40.000 karakter)offset- Posisi karakter untuk memulai (saling eksklusif denganline)line- Nomor baris untuk memulai (saling eksklusif denganoffset)
Mengembalikan:
id,filename,fileType,summary- Metadata dokumentotalChars- Total karakter dalam dokumenoffset- Offset karakter (disertakan saat menggunakanlineuntuk referensi)line- Nomor baris (hanya jika parameterlinedigunakan)content- Konten teks yang diekstraktruncated- Apakah masih ada konten yang tersisa setelah potongan ini
stash_ask
Minta LLM menjawab pertanyaan tentang dokumen yang disimpan. Dokumen diproses dalam konteks terpisah, menjaga percakapan utama Anda tetap ringkas.
Parameter:
id(wajib) - ID Dokumen daristash_list/stash_searchask(wajib) - Pertanyaan atau instruksi untuk LLMaskMaxInputTokens- Token input maksimum per panggilan LLM (default: 150.000)askMaxOutputTokens- Token output maksimum per panggilan LLM (default: 4.096)askTimeout- Batas waktu dalam milidetik (default: 300.000 = 5 menit)askSplitAndSynthesize- Untuk dokumen besar: bagi menjadi beberapa potongan, proses masing-masing, lalu sintesis hasilnya (default: false)
Mengembalikan:
id,filename,fileType,summary- Metadata dokumentotalChars- Total karakter dalam dokumenask- Instruksi yang diberikananswer- Respons LLMmodel- Model yang menghasilkan responschunksProcessed- Jumlah potongan yang diproses
Alur umum
- Letakkan file ke
~/.research-friend/inbox/ - Jalankan
stash_process_inbox - Gunakan
stash_listuntuk menjelajahi topik - Gunakan
stash_searchuntuk menemukan dokumen yang relevan - Gunakan
stash_extractuntuk membaca dokumen tertentu, ataustash_askuntuk mengajukan pertanyaan tentangnya
Pemecahan Masalah
"Browser closed unexpectedly" atau kesalahan serupa
Coba instal ulang browser:
npx playwright install chromium --force
Di Linux, Anda mungkin juga memerlukan dependensi sistem:
npx playwright install-deps chromium
Server tidak mau mulai
Pastikan Anda menggunakan Node.js 20 atau lebih baru:
node --version
Jika versi Anda lebih lama, kunjungi nodejs.org untuk mengunduh yang lebih baru.
Lisensi
MIT