MCP Research Friend Server
आधिकारिकशोध उ
दस्तावेज़
रिसर्च फ्रेंड
एआई सहायकों के लिए एक मित्रवत सहायक, जिन्हें वेब पर चीज़ें खोजने और एक स्थानीय रिसर्च स्टैश प्रबंधित करने की आवश्यकता होती है।
रिसर्च फ्रेंड एक MCP सर्वर है जो आपके एआई उपकरणों को वेब पेज लाने और इंटरनेट पर खोज करने की क्षमता देता है। यह पर्दे के पीछे एक वास्तविक वेब ब्राउज़र का उपयोग करता है, इसलिए यह उन आधुनिक वेबसाइटों के साथ भी काम करता है जो जावास्क्रिप्ट पर बहुत अधिक निर्भर करती हैं। इसमें दस्तावेज़ों को संग्रहीत करने, टेक्स्ट निकालने और आपकी लाइब्रेरी में खोजने के लिए एक स्थानीय "स्टैश" भी शामिल है।
इसकी सभी सुविधाओं का उपयोग करने के लिए, आपको एक MCP क्लाइंट की आवश्यकता होगी जो प्रॉम्प्ट (सामान्य) और सैंपलिंग (कम सामान्य) का समर्थन करता हो। हम रिसर्च फ्रेंड को Chabeau के साथ बना रहे हैं, जो दोनों का समर्थन करता है।
यह क्या कर सकता है?
- वेब पेज लाना एक वास्तविक ब्राउज़र के साथ (JS-भारी साइटों सहित)
- PDF लाना और उनकी टेक्स्ट सामग्री निकालना
- वेब पर खोजना DuckDuckGo या Google के माध्यम से
- एक स्थानीय स्टैश बनाए रखना खोज, सूचीकरण और निष्कर्षण के लिए दस्तावेज़ों का
शुरू करना
आपको अपने कंप्यूटर पर Node.js संस्करण 20 या नया स्थापित करना होगा।
1. निर्भरताएँ स्थापित करें
इस फ़ोल्डर में एक टर्मिनल खोलें और चलाएँ:
npm install
2. ब्राउज़र समर्थन स्थापित करें
रिसर्च फ्रेंड वेब ब्राउज़र को नियंत्रित करने के लिए Playwright का उपयोग करता है। निर्भरताएँ स्थापित करने के बाद, आपको ब्राउज़र स्थापित करना होगा:
npx playwright install chromium
यह Chromium की एक प्रति डाउनलोड करता है जिसका उपयोग Playwright करेगा। यह आपके पहले से स्थापित किसी भी ब्राउज़र से अलग है।
3. सर्वर प्रारंभ करें
node src/index.js
सर्वर stdio (मानक इनपुट/आउटपुट) पर संचार करता है, जिस तरह से MCP क्लाइंट इससे जुड़ते हैं।
अपने MCP क्लाइंट में जोड़ना
आप रिसर्च फ्रेंड को कैसे जोड़ते हैं यह इस बात पर निर्भर करता है कि आप कौन सा MCP क्लाइंट उपयोग कर रहे हैं। यहाँ एक सामान्य उदाहरण दिया गया है कि कॉन्फ़िगरेशन कैसा दिख सकता है:
[[mcp_servers]]
id = "research-friend"
command = "node"
args = ["/path/to/mcp-research-friend/src"]
transport = "stdio"
/path/to/mcp-research-friend को अपने कंप्यूटर पर इस फ़ोल्डर के वास्तविक पथ से बदलें।
उपकरण
वेब उपकरण
friendly_web_fetch
एक वेब पेज लाता है और उसकी सामग्री लौटाता है। डिफ़ॉल्ट रूप से, संरक्षित लिंक के साथ मार्कडाउन लौटाता है — LLM के लिए आदर्श। मुख्य सामग्री निकालने के लिए Readability का उपयोग करता है (नेविगेशन, विज्ञापन आदि हटाकर)। PDF, पृष्ठांकन, या सामग्री के भीतर खोज के लिए, इसके बजाय friendly_web_extract का उपयोग करें।
पैरामीटर:
url(आवश्यक) - लाने के लिए वेब पताoutputFormat- आउटपुट प्रारूप:markdown(डिफ़ॉल्ट),text, याhtmlwaitMs- पेज लोड होने के बाद प्रतीक्षा करने का अतिरिक्त समय, यदि सामग्री धीरे-धीरे दिखाई देती हैtimeoutMs- हार मानने से पहले कितनी देर प्रतीक्षा करनी है (डिफ़ॉल्ट: 15 सेकंड)maxChars- लौटाने के लिए सामग्री की अधिकतम मात्रा (डिफ़ॉल्ट: 40,000 वर्ण)includeHtml- सामग्री के साथ कच्चा HTML भी लौटाने के लिएtrueपर सेट करेंheadless- ब्राउज़र विंडो देखने के लिएfalseपर सेट करें (डिबगिंग के लिए उपयोगी)
लौटाता है:
url- अनुरोध किया गया URLfinalUrl- किसी भी रीडायरेक्ट के बाद का URLtitle- पेज का शीर्षकcontent- निकाली गई सामग्री (अनुरोधित प्रारूप में)html- कच्चा HTML (केवल तभी जबincludeHtmlसत्य हो)meta- पेज मेटाडेटा (विवरण, लेखक, प्रकाशित समय, आदि)fetchedAt- पेज कब लाया गया इसका ISO टाइमस्टैम्पtruncated- क्या सामग्री कोmaxCharsमें फ़िट करने के लिए छोटा किया गया था
friendly_search
वेब पर खोजता है और परिणामों की एक सूची लौटाता है।
पैरामीटर:
query(आवश्यक) - क्या खोजना हैengine- कौन सा खोज इंजन उपयोग करना है (duckduckgoयाgoogle)maxResults- कितने परिणाम लौटाने हैं (डिफ़ॉल्ट: 10, अधिकतम: 50)timeoutMs- हार मानने से पहले कितनी देर प्रतीक्षा करनी है (डिफ़ॉल्ट: 15 सेकंड)headless- ब्राउज़र विंडो देखने के लिएfalseपर सेट करें
लौटाता है:
query- उपयोग की गई खोज क्वेरीengine- कौन सा खोज इंजन उपयोग किया गयाresults- परिणामों की सरणी, प्रत्येक मेंtitle,url, औरsnippetsearchedAt- खोज कब की गई इसका ISO टाइमस्टैम्पfallback_result_html- पेज का कच्चा HTML (केवल तभी शामिल किया जाता है जब कोई परिणाम नहीं मिला)debug_info- खोज प्रयास के बारे में नैदानिक जानकारी
CAPTCHA हैंडलिंग:
यदि हेडलेस मोड में चलते समय कोई CAPTCHA पाया जाता है, तो उपकरण स्वचालित रूप से एक दृश्यमान ब्राउज़र विंडो के साथ पुनः प्रयास करता है। इससे आपको CAPTCHA को मैन्युअल रूप से हल करने का मौका मिलता है। debug_info.retried फ़ील्ड इंगित करता है कि क्या इस फ़ॉलबैक का उपयोग किया गया था।
friendly_web_extract
एक URL से सामग्री निकालता है। स्वतः पता लगाता है कि URL एक PDF या वेब पेज की ओर इशारा करता है और प्रत्येक को उचित रूप से संभालता है।
पैरामीटर:
url(आवश्यक) - लाने के लिए URL (PDF या वेब पेज)maxChars- लौटाने के लिए टेक्स्ट की अधिकतम मात्रा (डिफ़ॉल्ट: 40,000 वर्ण)offset- शुरू करने के लिए वर्ण स्थिति (डिफ़ॉल्ट: 0)। बड़ी सामग्री के माध्यम से पृष्ठांकन करने के लिए इसका उपयोग करें।search- पूर्ण सामग्री के बजाय एक वाक्यांश खोजें और आसपास के संदर्भ के साथ मिलान लौटाएँcontextChars- प्रत्येक खोज मिलान के आसपास संदर्भ के वर्ण (डिफ़ॉल्ट: 200)waitMs- गतिशील सामग्री के लिए पेज लोड के बाद प्रतीक्षा करने का अतिरिक्त समय (केवल वेब पेज)timeoutMs- हार मानने से पहले कितनी देर प्रतीक्षा करनी है (डिफ़ॉल्ट: 15 सेकंड, केवल वेब पेज)headless- ब्राउज़र विंडो देखने के लिएfalseपर सेट करें (केवल वेब पेज)
लौटाता है (सामान्य मोड):
url- अनुरोध किया गया URLcontentType- या तोpdfयाhtmltitle- पेज/दस्तावेज़ का शीर्षकauthor- PDF लेखक (केवल PDF, यदि उपलब्ध हो)creationDate- PDF कब बनाया गया (केवल PDF, यदि उपलब्ध हो)pageCount- पृष्ठों की संख्या (केवल PDF)totalChars- कुल वर्ण (पृष्ठांकन के लिएoffsetके साथ उपयोग करें)offset- उपयोग किया गया ऑफसेटcontent- निकाली गई टेक्स्ट सामग्रीfetchedAt- ISO टाइमस्टैम्पtruncated- क्या इस खंड के बाद और सामग्री शेष है
लौटाता है (खोज मोड):
url,contentType,title,totalChars,fetchedAt- ऊपर जैसा हीsearch- उपयोग किया गया खोज वाक्यांशmatchCount- पाए गए मिलानों की संख्याmatches- मिलानों की सरणी, प्रत्येक मेंposition,context,prefix, औरsuffix
friendly_web_ask
एक URL (PDF या वेब पेज) लाता है और एक LLM से इसके बारे में प्रश्नों के उत्तर देता है। सामग्री प्रकार का स्वतः पता लगाता है। दस्तावेज़ को एक अलग संदर्भ में संसाधित किया जाता है, जिससे आपकी मुख्य बातचीत संक्षिप्त रहती है।
पैरामीटर:
url(आवश्यक) - लाने के लिए URL (PDF या वेब पेज)ask(आवश्यक) - LLM के लिए प्रश्न या निर्देश (सारांशित करें, जानकारी निकालें, प्रश्नों के उत्तर दें, आदि)askMaxInputTokens- प्रति LLM कॉल अधिकतम इनपुट टोकन (डिफ़ॉल्ट: 150,000)askMaxOutputTokens- प्रति LLM कॉल अधिकतम आउटपुट टोकन (डिफ़ॉल्ट: 4,096)askTimeout- मिलीसेकंड में टाइमआउट (डिफ़ॉल्ट: 300,000 = 5 मिनट)askSplitAndSynthesize- बड़े दस्तावेज़ों के लिए: खंडों में विभाजित करें, प्रत्येक को संसाधित करें, फिर परिणामों को संश्लेषित करें (डिफ़ॉल्ट: गलत)। चेतावनी: कई टोकन की खपत करता है।waitMs- गतिशील सामग्री के लिए पेज लोड के बाद प्रतीक्षा करने का अतिरिक्त समय (केवल वेब पेज)timeoutMs- हार मानने से पहले कितनी देर प्रतीक्षा करनी है (डिफ़ॉल्ट: 15 सेकंड, केवल वेब पेज)headless- ब्राउज़र विंडो देखने के लिएfalseपर सेट करें (केवल वेब पेज)
लौटाता है:
url- अनुरोध किया गया URLcontentType- या तोpdfयाhtmltitle- पेज/दस्तावेज़ का शीर्षकtotalChars- दस्तावेज़ में कुल वर्णask- दिया गया निर्देशanswer- LLM की प्रतिक्रियाmodel- प्रतिक्रिया उत्पन्न करने वाला मॉडलchunksProcessed- संसाधित खंडों की संख्या (छोटे दस्तावेज़ों के लिए 1,askSplitAndSynthesizeका उपयोग करने पर अधिक)fetchedAt- ISO टाइमस्टैम्प
आस्क मोड किसी भी निर्देश के साथ दस्तावेज़ को संसाधित करने के लिए MCP सैंपलिंग का उपयोग करता है। यह इसके लिए उपयोगी है:
- बड़े दस्तावेज़ जो संदर्भ को अभिभूत कर देंगे
- मुख्य बातचीत पर टोकन लागत कम रखना
जब askSplitAndSynthesize सक्षम होता है, तो askMaxInputTokens से अधिक दस्तावेज़ स्वचालित रूप से ओवरलैपिंग खंडों में विभाजित हो जाते हैं। प्रत्येक खंड को अलग से संसाधित किया जाता है, और परिणामों को एक एकल सुसंगत उत्तर में संश्लेषित किया जाता है। अंतिम प्रतिक्रिया आपके अनुरोध की भाषा में ही प्रदान की जाती है, चाहे दस्तावेज़ की भाषा कुछ भी हो।
दस्तावेज़ स्टैश
स्टैश दस्तावेज़ों की एक स्थानीय, खोजने योग्य लाइब्रेरी है। यह PDF, HTML फ़ाइलों और सादे टेक्स्ट (मार्कडाउन/TXT) का समर्थन करता है। जब आप कोई दस्तावेज़ जोड़ते हैं, तो रिसर्च फ्रेंड मूल फ़ाइल संग्रहीत करता है, टेक्स्ट निकालता है (PDF/HTML के लिए), और एक स्थानीय डेटाबेस में मेटाडेटा सहेजता है। खोज तेज़, वाक्यांश-जागरूक मिलान के लिए हुड के तहत ripgrep का उपयोग करती है।
स्टैश स्थान
स्टैश ~/.research-friend/ के अंतर्गत रहता है:
inbox/- संसाधित होने के लिए यहाँ फ़ाइलें छोड़ेंstore/- व्यवस्थित दस्तावेज़ भंडारण और निकाला गया टेक्स्टstash.db- मेटाडेटा डेटाबेस
समर्थित फ़ाइल प्रकार
- PDF:
.pdf(टेक्स्ट निकाला गया) - HTML:
.html,.htm(टेक्स्ट निकाला गया) - मार्कडाउन:
.md,.markdown(सादे टेक्स्ट के रूप में संग्रहीत) - टेक्स्ट:
.txt(सादे टेक्स्ट के रूप में संग्रहीत)
स्टैश उपकरण
stash_open_inbox
आसान ड्रैग-एंड-ड्रॉप के लिए अपने फ़ाइल प्रबंधक में स्टैश इनबॉक्स फ़ोल्डर खोलें।
लौटाता है:
opened- क्या फ़ोल्डर खोलने का अनुरोध भेजा गया थाinboxPath- इनबॉक्स का निरपेक्ष पथcommand- उपयोग किया गया OS कमांडargs- उपयोग किए गए कमांड तर्क
stash_process_inbox
inbox/ में फ़ाइलों को संसाधित करें, उन्हें विषयों में वर्गीकृत करें, टेक्स्ट निकालें, और परिणाम संग्रहीत करें।
लंबे दस्तावेज़ों के लिए, वर्गीकरण विषय सटीकता में सुधार करने के लिए नमूना अनुभागों (शुरुआत/मध्य/अंत और कुछ यादृच्छिक खंड) का उपयोग करता है।
लौटाता है:
processed- सफलतापूर्वक संसाधित फ़ाइल नामों की सरणीerrors- सामना की गई कोई भी त्रुटियाँdocuments- बनाए गए दस्तावेज़ रिकॉर्ड की सरणी
reindex_stash
स्टैश किए गए दस्तावेज़ों के लिए सारांश पुनर्जीवित करें, विषयों को पुनः आवंटित करें, और स्टोर मेटाडेटा अपडेट करें। यदि ids छोड़ दिया जाता है या खाली है, तो सभी दस्तावेज़ पुनः अनुक्रमित किए जाते हैं।
पैरामीटर:
ids- पुनः अनुक्रमित करने के लिए दस्तावेज़ IDs (वैकल्पिक)
लौटाता है:
reindexed- पुनः अनुक्रमित दस्तावेज़ IDserrors- सामना की गई कोई भी त्रुटियाँdocuments- अद्यतन दस्तावेज़ रिकॉर्ड की सरणी
stash_list
स्टैश में दस्तावेज़ों की सूची बनाएँ।
पैरामीटर:
topic- किसी विषय पर फ़िल्टर करें (वैकल्पिक)limit- अधिकतम परिणाम (डिफ़ॉल्ट: 50)offset- पृष्ठांकन ऑफसेट (डिफ़ॉल्ट: 0)
लौटाता है:
type-allयाtopictotalDocuments- कुल दस्तावेज़ (केवल तभी जबtypeallहो)count- पृष्ठांकन के बाद लौटाए गए परिणामoffset- उपयोग किया गया पृष्ठांकन ऑफसेटlimit- उपयोग की गई पृष्ठांकन सीमाtopics- ज्ञात विषयों और दस्तावेज़ संख्या का सारांशdocuments- मेटाडेटा के साथ दस्तावेज़ सूची (किसी विषय को सूचीबद्ध करते समयisPrimaryशामिल होता है)
stash_search
स्टैश में फ़ाइल नाम और सामग्री खोजें। सभी खोज शब्द मौजूद होने चाहिए (AND तर्क)। फ़ाइल नाम मिलान पहले सूचीबद्ध किए जाते हैं। सटीक वाक्यांशों के लिए उद्धरण चिह्नों का उपयोग करें।
पैरामीटर:
query(आवश्यक) - खोज शब्द। वाक्यांशों के लिए उद्धरण चिह्नों का उपयोग करें:"sparkling wine"topic- किसी विषय पर फ़िल्टर करें (वैकल्पिक)ids- विशिष्ट दस्तावेज़ IDs पर फ़िल्टर करें (वैकल्पिक)limit- लौटाने के लिए अधिकतम दस्तावेज़ (डिफ़ॉल्ट: 20)offset- पृष्ठांकन ऑफसेट (डिफ़ॉल्ट: 0)maxMatchesPerDoc- प्रति दस्तावेज़ अधिकतम मिलान (डिफ़ॉल्ट: 50)context- प्रत्येक मिलान के आसपास संदर्भ की पंक्तियाँ (डिफ़ॉल्ट: 1, अधिकतम: 5)। यह नियंत्रित करता है कि मिलान करने के लिए शब्द कितने करीब होने चाहिए और कितना आसपास का टेक्स्ट लौटाया जाए। यह लौटाता है:totalMatches- पृष्ठांकन से पहले मिले कुल दस्तावेज़count- पृष्ठांकन के बाद लौटाए गए परिणामresults- दस्तावेज़ों की सारणी, प्रत्येक में:id,filename,fileType,summary,charCount,createdAtmatchType-filename,content, याfilename+contentmatches- प्रत्येक मिलान स्थान के लिए{ line, context }की सारणी
मिलान स्थानों पर सीधे जाने के लिए stash_extract के साथ line मानों का उपयोग करें।
stash_extract
पढ़ने के लिए संग्रहीत दस्तावेज़ से सामग्री निकालें। मिलानों पर सीधे जाने के लिए stash_search परिणामों से पंक्ति संख्याओं का उपयोग करें।
पैरामीटर:
id(आवश्यक) -stash_list/stash_searchसे दस्तावेज़ आईडीmaxChars- लौटाने के लिए पाठ की अधिकतम मात्रा (डिफ़ॉल्ट: 40,000 वर्ण)offset- आरंभ करने के लिए वर्ण स्थिति (lineके साथ परस्पर अनन्य)line- आरंभ करने के लिए पंक्ति संख्या (offsetके साथ परस्पर अनन्य)
यह लौटाता है:
id,filename,fileType,summary- दस्तावेज़ मेटाडेटाtotalChars- दस्तावेज़ में कुल वर्णoffset- वर्ण ऑफ़सेट (संदर्भ के लिएlineका उपयोग करने पर शामिल)line- पंक्ति संख्या (केवल तब जबlineपैरामीटर का उपयोग किया गया हो)content- निकाली गई पाठ्य सामग्रीtruncated- क्या इस खंड के बाद और सामग्री शेष है
stash_ask
किसी संग्रहीत दस्तावेज़ के बारे में प्रश्नों का उत्तर देने के लिए एक LLM का उपयोग करें। दस्तावेज़ को एक अलग संदर्भ में संसाधित किया जाता है, जिससे आपकी मुख्य बातचीत संक्षिप्त रहती है।
पैरामीटर:
id(आवश्यक) -stash_list/stash_searchसे दस्तावेज़ आईडीask(आवश्यक) - LLM के लिए प्रश्न या निर्देशaskMaxInputTokens- प्रति LLM कॉल अधिकतम इनपुट टोकन (डिफ़ॉल्ट: 150,000)askMaxOutputTokens- प्रति LLM कॉल अधिकतम आउटपुट टोकन (डिफ़ॉल्ट: 4,096)askTimeout- मिलीसेकंड में समय सीमा (डिफ़ॉल्ट: 300,000 = 5 मिनट)askSplitAndSynthesize- बड़े दस्तावेज़ों के लिए: खंडों में विभाजित करें, प्रत्येक को संसाधित करें, फिर परिणामों को संश्लेषित करें (डिफ़ॉल्ट: false)
यह लौटाता है:
id,filename,fileType,summary- दस्तावेज़ मेटाडेटाtotalChars- दस्तावेज़ में कुल वर्णask- दिया गया निर्देशanswer- LLM का उत्तरmodel- उत्तर उत्पन्न करने वाला मॉडलchunksProcessed- संसाधित खंडों की संख्या
सामान्य प्रवाह
- फ़ाइलों को
~/.research-friend/inbox/में डालें stash_process_inboxचलाएँ- विषयों को ब्राउज़ करने के लिए
stash_listका उपयोग करें - प्रासंगिक दस्तावेज़ खोजने के लिए
stash_searchका उपयोग करें - किसी विशिष्ट दस्तावेज़ को पढ़ने के लिए
stash_extractका उपयोग करें, या उसके बारे में प्रश्न पूछने के लिएstash_askका उपयोग करें
समस्या निवारण
"ब्राउज़र अप्रत्याशित रूप से बंद हो गया" या इसी तरह की त्रुटियाँ
ब्राउज़र को पुनः स्थापित करने का प्रयास करें:
npx playwright install chromium --force
Linux पर, आपको सिस्टम निर्भरताओं की भी आवश्यकता हो सकती है:
npx playwright install-deps chromium
सर्वर प्रारंभ नहीं होगा
सुनिश्चित करें कि आप Node.js 20 या नए संस्करण का उपयोग कर रहे हैं:
node --version
यदि आपका संस्करण पुराना है, तो नया संस्करण डाउनलोड करने के लिए nodejs.org पर जाएँ।
लाइसेंस
MIT