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, या html
  • waitMs - पेज लोड होने के बाद प्रतीक्षा करने का अतिरिक्त समय, यदि सामग्री धीरे-धीरे दिखाई देती है
  • timeoutMs - हार मानने से पहले कितनी देर प्रतीक्षा करनी है (डिफ़ॉल्ट: 15 सेकंड)
  • maxChars - लौटाने के लिए सामग्री की अधिकतम मात्रा (डिफ़ॉल्ट: 40,000 वर्ण)
  • includeHtml - सामग्री के साथ कच्चा HTML भी लौटाने के लिए true पर सेट करें
  • headless - ब्राउज़र विंडो देखने के लिए false पर सेट करें (डिबगिंग के लिए उपयोगी)

लौटाता है:

  • url - अनुरोध किया गया URL
  • finalUrl - किसी भी रीडायरेक्ट के बाद का URL
  • title - पेज का शीर्षक
  • 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, और snippet
  • searchedAt - खोज कब की गई इसका 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 - अनुरोध किया गया URL
  • contentType - या तो pdf या html
  • title - पेज/दस्तावेज़ का शीर्षक
  • 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 - अनुरोध किया गया URL
  • contentType - या तो pdf या html
  • title - पेज/दस्तावेज़ का शीर्षक
  • 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 - पुनः अनुक्रमित दस्तावेज़ IDs
  • errors - सामना की गई कोई भी त्रुटियाँ
  • documents - अद्यतन दस्तावेज़ रिकॉर्ड की सरणी

stash_list

स्टैश में दस्तावेज़ों की सूची बनाएँ।

पैरामीटर:

  • topic - किसी विषय पर फ़िल्टर करें (वैकल्पिक)
  • limit - अधिकतम परिणाम (डिफ़ॉल्ट: 50)
  • offset - पृष्ठांकन ऑफसेट (डिफ़ॉल्ट: 0)

लौटाता है:

  • type - all या topic
  • totalDocuments - कुल दस्तावेज़ (केवल तभी जब type all हो)
  • 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, createdAt
    • matchType - filename, content, या filename+content
    • matches - प्रत्येक मिलान स्थान के लिए { 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 - संसाधित खंडों की संख्या

सामान्य प्रवाह

  1. फ़ाइलों को ~/.research-friend/inbox/ में डालें
  2. stash_process_inbox चलाएँ
  3. विषयों को ब्राउज़ करने के लिए stash_list का उपयोग करें
  4. प्रासंगिक दस्तावेज़ खोजने के लिए stash_search का उपयोग करें
  5. किसी विशिष्ट दस्तावेज़ को पढ़ने के लिए stash_extract का उपयोग करें, या उसके बारे में प्रश्न पूछने के लिए stash_ask का उपयोग करें

समस्या निवारण

"ब्राउज़र अप्रत्याशित रूप से बंद हो गया" या इसी तरह की त्रुटियाँ

ब्राउज़र को पुनः स्थापित करने का प्रयास करें:

npx playwright install chromium --force

Linux पर, आपको सिस्टम निर्भरताओं की भी आवश्यकता हो सकती है:

npx playwright install-deps chromium

सर्वर प्रारंभ नहीं होगा

सुनिश्चित करें कि आप Node.js 20 या नए संस्करण का उपयोग कर रहे हैं:

node --version

यदि आपका संस्करण पुराना है, तो नया संस्करण डाउनलोड करने के लिए nodejs.org पर जाएँ।

लाइसेंस

MIT