मॉडल कॉन्टेक्स्ट प्रोटोकॉल (MCP), और MCP सर्वर को Go में लागू करने के नोट्स

MCP विशेषताओं और GO में कार्यान्वयन पर लंबा लेख

Page content

यहाँ मॉडल कॉन्टेक्स्ट प्रोटोकॉल (MCP) का वर्णन है, जिसमें Go में एक MCP सर्वर का कार्यान्वयन के बारे में संक्षिप्त नोट्स शामिल हैं, जिसमें संदेश संरचना और प्रोटोकॉल विनिर्देश शामिल हैं।

रोबोट्स और MCP

मॉडल कॉन्टेक्स्ट प्रोटोकॉल (MCP) ओवरव्यू

मॉडल कॉन्टेक्स्ट प्रोटोकॉल (MCP) एक खुला, मानकीकृत फ्रेमवर्क है (अंथ्रोपिक द्वारा २०२४ के अंत में पेश किया गया) जो AI भाषा मॉडल्स को बाहरी डेटा स्रोतों, टूल्स, और सिस्टम्स से जोड़ने के लिए है। इसका उद्देश्य “N×M इंटीग्रेशन” समस्या को हल करना है, एक सार्वभौमिक इंटरफेस प्रदान करके जैसे कि फाइलों को पढ़ना, फंक्शन्स (टूल्स) को एक्सीक्यूट करना, और विभिन्न एप्लिकेशन्स के बीच कॉन्टेक्स्टुअल प्रॉम्प्ट्स का उपयोग करना। MCP एक प्रोप्राइटरी या आंतरिक प्रोटोकॉल नहीं है; यह एक खुला मानक है जिसमें एक आधिकारिक विनिर्देश और ओपन-सोर्स रेफरेंस इम्प्लीमेंटेशन है। वास्तव में, प्रमुख AI प्रोवाइडर्स (जिसमें ओपनएआई और गूगल डिप माइंड शामिल हैं) ने MCP के पेश होने के बाद समर्थन की घोषणा की, जो यह दर्शाता है कि यह एक व्यापक रूप से अपनाए जाने वाले मानक के रूप में बनाया गया है, न कि एक वेंडर-स्पेसिफिक समाधान।

MCP उद्देश्य और आर्किटेक्चर

MCP का उद्देश्य एप्लिकेशन्स द्वारा LLMs को कॉन्टेक्स्ट प्रदान करने का मानकीकरण करना है – जिसका अक्सर उपयोग किया जाने वाला तुलना “AI एप्लिकेशन्स के लिए एक USB-C पोर्ट” है। एक सामान्य प्रोटोकॉल को परिभाषित करके, MCP AI असिस्टेंट्स और टूल्स को डेटाबेस, फाइल सिस्टम, APIs, और अन्य संसाधनों के साथ बिना कस्टम एक-ऑफ इंटीग्रेशन्स के सीधे इंटरफेस करने की अनुमति देता है। यह भाषा मॉडल्स को सुरक्षित रूप से उन डेटा तक पहुंचने की अनुमति देकर अधिक प्रासंगिक, अपडेटेड रिस्पॉन्स उत्पन्न करने में मदद करता है जिनकी उन्हें आवश्यकता होती है।

आर्किटेक्चर: MCP एक क्लाइंट–सर्वर मॉडल का पालन करता है जिसमें स्पष्ट भूमिका विभाजन होता है:

  • MCP होस्ट: पैरेंट एप्लिकेशन (जैसे एक चैट क्लाइंट या IDE) जो कनेक्शन्स को मैनेज करता है। इसमें एक या अधिक MCP क्लाइंट्स (कनेक्टर्स) होते हैं।
  • MCP क्लाइंट: एक कनेक्टर इंस्टेंस (होस्ट के भीतर) जो एक MCP सर्वर के साथ 1:1 सेशन स्थापित करता है। क्लाइंट सेशन लाइफसाइकिल को हैंडल करता है, संदेशों को रूट करता है, और किसी भी उपयोगकर्ता अनुमतियों या सुरक्षा नीतियों को लागू करता है।
  • MCP सर्वर: एक लाइटवेट सर्विस जो MCP प्रोटोकॉल के माध्यम से विशिष्ट क्षमताओं (किसी विशेष डेटा या फंक्शन्स तक पहुंच) को एक्सपोज करता है। प्रत्येक सर्वर एक डेटा स्रोत (फाइलें, DB, API, आदि) या टूल को व्रैप कर सकता है। कई सर्वर समानांतर में चल सकते हैं, प्रत्येक अलग-अलग इंटीग्रेशन्स प्रदान करते हैं।
  • डेटा स्रोत/सर्विसेज: वास्तविक संसाधन जिनके साथ सर्वर इंटरफेस करते हैं – इसमें स्थानीय फाइलें और डेटाबेस या रिमोट सर्विसेज (वेब APIs, SaaS apps, आदि) शामिल हो सकते हैं। MCP सर्वर इन संसाधनों के लिए एक एडाप्टर के रूप में कार्य करता है, सुनिश्चित करता है कि LLM केवल मानकीकृत प्रोटोकॉल के माध्यम से डेटा तक पहुंचता है।

यह डिजाइन IDE दुनिया से लैंग्वेज सर्वर प्रोटोकॉल (LSP) से प्रेरित है। ठीक उसी तरह जैसे LSP किसी भी एडिटर को एक सामान्य प्रोटोकॉल के माध्यम से किसी भी प्रोग्रामिंग भाषा का समर्थन करने की अनुमति देता है, MCP किसी भी AI एप्लिकेशन को किसी भी डेटा/टूल इंटीग्रेशन से कनेक्ट करने की अनुमति देता है जो MCP बोलता है। यह डिकपलिंग का मतलब है कि AI टूल डेवलपर्स एक बार MCP सर्वर लिख सकते हैं और इसे कई AI क्लाइंट्स के साथ काम करने के लिए उपयोग कर सकते हैं, और AI एप्लिकेशन डेवलपर्स बस एक MCP सर्वर प्लग इन करके नए इंटीग्रेशन्स जोड़ सकते हैं, बिना बेसपोक इंटीग्रेशन कोड के।

प्रोटोकॉल और संदेश संरचना

संचार: MCP संचार स्थायी, स्टेटफुल सेशन पर आधारित है जिसमें JSON-RPC 2.0 संदेशों का उपयोग किया जाता है। सभी रिक्वेस्ट्स और रिस्पॉन्स JSON-RPC के फॉर्मेट का पालन करते हैं (जिसमें "jsonrpc": "2.0" फील्ड, मेथड नाम, पैरामीटर्स, और कॉरिलेटिंग आईडी शामिल हैं)। किसी भी पक्ष – क्लाइंट या सर्वर – द्वारा रिक्वेस्ट्स या नोटिफिकेशन्स भेजे जा सकते हैं, जिससे दो-तरफा इंटरैक्शन की अनुमति मिलती है। एक MCP सेशन आमतौर पर एक हैंडशेक के साथ शुरू होता है:

  • क्लाइंट एक initialize रिक्वेस्ट के साथ शुरू करता है, एक प्रोटोकॉल संस्करण का प्रस्ताव रखता है और अपनी क्षमताओं को विज्ञापित करता है (जिस फीचर्स का वह समर्थन करता है)। उदाहरण के लिए, क्लाइंट यह इंगित कर सकता है कि वह सर्वर-ड्राइवन “सैम्पलिंग” रिक्वेस्ट्स को हैंडल कर सकता है या फाइल एक्सेस के लिए कुछ रूट्स प्रदान कर सकता है। सर्वर अपने समर्थित प्रोटोकॉल संस्करण और क्षमताओं के साथ जवाब देता है, यह निर्धारित करता है कि इस सेशन के लिए कौन से फीचर्स सक्षम हैं (MCP एक क्षमता निगोशिएशन सिस्टम का उपयोग करता है जो LSP में वैकल्पिक फीचर्स के समान है)। अगर महत्वपूर्ण क्षमताएं या संस्करण असंगत हैं, तो कनेक्शन ग्रेसफुल रूप से रद्द कर दिया जाता है।
  • सहमति के बाद, क्लाइंट एक initialized नोटिफिकेशन भेजता है ताकि तैयार होने का संकेत दिया जा सके। इसके बाद, सामान्य ऑपरेशन्स जारी रह सकते हैं। सेशन JSON-RPC संदेशों के निरंतर आदान-प्रदान के लिए खुला रहता है जब तक कि कोई पक्ष एक शटडाउन जारी नहीं करता।

ट्रांसपोर्ट्स: MCP एक एकल ट्रांसपोर्ट को मांडेट नहीं करता – यह किसी भी चैनल पर काम करता है जो JSON टेक्स्ट को ले जा सकता है। आमतौर पर, एक MCP सर्वर को एक सबप्रोसेस के रूप में चलाया जाता है और स्थानीय इंटीग्रेशन्स के लिए STDIO (stdin/stdout पाइप्स) के माध्यम से संचार करता है। यह भाषा सर्वर्स के ऑपरेशन के समान है और स्थानीय टूल्स के लिए सुविधाजनक है (होस्ट सर्वर प्रक्रिया को लॉन्च कर सकता है और संदेशों को पाइप कर सकता है)। विकल्प के रूप में, MCP सर्वर स्वतंत्र सर्विसेज के रूप में चल सकते हैं जो HTTP के माध्यम से एक्सेस किए जा सकते हैं। MCP स्पेसिफिकेशन एक स्ट्रीमिंग HTTP ट्रांसपोर्ट परिभाषित करता है जहां सर्वर JSON-RPC कॉल्स के लिए एक एकल HTTP एंडपॉइंट एक्सपोज करता है (क्लाइंट्स रिक्वेस्ट्स को POST करते हैं, और सर्वर लंबे समय तक चलने वाले ऑपरेशन्स के लिए परिणामों को रिस्पॉन्स या सर्वर-सेंट इवेंट्स के माध्यम से स्ट्रीम कर सकता है)। किसी भी मामले में, संदेश UTF-8 JSON लाइन्स होते हैं, और प्रोटोकॉल स्ट्रीमिंग रिस्पॉन्स और सर्वर-इनिशिएटेड संदेशों का समर्थन करता है (HTTP+SSE दृष्टिकोण सर्वर को नोटिफिकेशन्स या आंशिक परिणामों को एसिंक्रोनस रूप से पुश करने की अनुमति देता है)। सुरक्षा दिशानिर्देशों की सिफारिश है कि स्थानीय सर्वर localhost पर बाइंड करें और अनचाहे रिमोट एक्सेस को रोकने के लिए Origin हेडर्स को वैलिडेट करें, और रिमोट सर्वर्स के लिए उचित ऑथ (जैसे टोकन्स या OAuth फ्लो) का उपयोग करें।

संदेश फॉर्मेट: MCP JSON-RPC के तीन संदेश प्रकारों का उपयोग करता है: रिक्वेस्ट्स, रिस्पॉन्स, और नोटिफिकेशन्स. एक रिक्वेस्ट में एक id, एक method स्ट्रिंग, और (वैकल्पिक रूप से) params (आमतौर पर पैरामीटर्स का एक JSON ऑब्जेक्ट) शामिल होते हैं। रिसीवर को एक संबंधित रिस्पॉन्स (मिलान करने वाले id के साथ) भेजना चाहिए जिसमें या तो एक result या एक error ऑब्जेक्ट होता है। नोटिफिकेशन्स एक-तरफा संदेश होते हैं जिनमें एक method और पैरामीटर्स होते हैं लेकिन कोई id नहीं (इसलिए उन्हें कोई रिस्पॉन्स नहीं मिलता)। MCP बेस JSON-RPC के ऊपर कुछ नियम लागू करता है (उदाहरण के लिए, id नॉन-नल और सेशन के दौरान पुनः उपयोग नहीं किया जाना चाहिए) ताकि स्पष्टता बनाए रखी जा सके।

सेशन और स्टेट: कनेक्शन स्टेटफुल माना जाता है – क्लाइंट और सर्वर एक दूसरे की क्षमताओं और संभवतः कुछ सेशन स्टेट (जैसे बदलावों के लिए सब्सक्रिप्शन्स, चल रहे ऑपरेशन्स, आदि) के बारे में संदर्भ बनाए रखते हैं। ग्रेसफुल शटडाउन के लिए परिभाषित प्रक्रियाएं भी हैं (उदाहरण के लिए, एक क्लाइंट एक शटडाउन रिक्वेस्ट भेज सकता है या बस ट्रांसपोर्ट को बंद कर सकता है; सर्वर क्लीनअप को हैंडल करना चाहिए, और दोनों पक्ष लंबे समय तक चलने वाले ऑपरेशन्स के लिए टाइमआउट्स लागू करते हैं)। एरर हैंडलिंग JSON-RPC कन्वेंशन्स का पालन करती है (एरर रिस्पॉन्स में एक कोड और संदेश होता है) और स्पेसिफिकेशन कुछ स्थितियों के लिए मानक एरर कोड्स परिभाषित करता है (उदाहरण के लिए, अनुमति अस्वीकृत, टूल नहीं मिला, आदि)। MCP यूटिलिटीज भी प्रदान करता है जो क्रॉस-कटिंग कंसर्न के लिए हैं: उदाहरण के लिए, प्रगति अपडेट्स के लिए बिल्ट-इन नोटिफिकेशन्स, एक लंबे समय तक चलने वाले रिक्वेस्ट की रद्दीकरण (CancelledNotification), लॉगिंग/डिबग संदेश, और कॉन्फ़िगरेशन बदलाव हैं। ये लंबे या जटिल इंटरैक्शन्स को मैनेज करने में मदद करते हैं (क्लाइंट एक प्रोग्रेस टूल कॉल रद्द कर सकता है, या सर्वर क्लाइंट को चेतावनियां लॉग कर सकता है, आदि)।

MCP विशेषताएँ और ऑपरेशन्स

एक बार प्रारंभ होने के बाद, एक MCP सेशन संदर्भ और कमांड्स के आदान-प्रदान को संरचित तरीके से सक्षम बनाता है। MCP के सर्वर-साइड फीचर्स के मुख्य हैं प्रॉम्प्ट्स, रिसोर्सेस, और टूल्स (जिसमें से प्रत्येक सर्वर प्रारंभिकरण के दौरान समर्थन करता है अगर वह समर्थन करता है):

  • प्रॉम्प्ट्स: पूर्व-परिभाषित प्रॉम्प्ट टेम्प्लेट्स या निर्देश जो सर्वर क्लाइंट को प्रदान कर सकता है। ये आमतौर पर उपयोगकर्ता-ट्रिगर्ड हेल्पर्स होते हैं (उपयोगकर्ता स्पष्ट रूप से एक प्रॉम्प्ट को चैट में डालने के लिए चुनता है, उदाहरण के लिए UI में एक स्लैश कमांड का उपयोग करके)। MCP उपलब्ध प्रॉम्प्ट्स की सूची प्राप्त करने और एक प्रॉम्प्ट के सामग्री को प्राप्त करने के लिए विधियाँ प्रदान करता है। उदाहरण के लिए, एक क्लाइंट prompts/list को कॉल कर सकता है ताकि प्रॉम्प्ट टेम्प्लेट्स की सूची प्राप्त कर सके (हर एक के साथ एक नाम, विवरण, और वैकल्पिक पैरामीटर्स)। एक प्रॉम्प्ट प्राप्त करने के लिए, क्लाइंट prompts/get का उपयोग प्रॉम्प्ट के नाम और किसी भी अर्गुमेंट वैल्यू के साथ करता है; सर्वर फिर प्रॉम्प्ट सामग्री को वापस करता है (अक्सर एक सेट संदेशों के रूप में जो क्लाइंट LLM के संदर्भ में इंजेक्ट करेगा)। प्रॉम्प्ट्स जटिल निर्देशों या वर्कफ्लो (उदाहरण के लिए, “कोड रिव्यू टेम्प्लेट”) के पुनः उपयोग की अनुमति देते हैं जिन्हें उपयोगकर्ता आवश्यकता पड़ने पर बुला सकता है। सर्वर एक prompts क्षमता को इंगित करते हैं (वैकल्पिक उप-फीचर्स जैसे listChanged के साथ, जो क्लाइंट को सूचित करता है अगर प्रॉम्प्ट्स की सेटिंग डायनामिक रूप से बदलती है).

  • रिसोर्सेस: संरचित डेटा या सामग्री जो मॉडल को संदर्भ प्रदान करता है। रिसोर्सेस आमतौर पर फाइलें, दस्तावेज़, डेटाबेस एंट्रीज जैसे चीज़ें होती हैं - जानकारी जो एक AI असिस्टेंट पढ़ सकता है या संदर्भित कर सकता है। MCP रिसोर्सेस की पहचान और ट्रांसफर करने के तरीके को मानक बनाता है: हर रिसोर्स के पास एक URI पहचानकर्ता होता है (उदाहरण के लिए, file:///path/to/file.txt या डेटाबेस के लिए एक कस्टम स्कीम)। क्लाइंट उपलब्ध रिसोर्सेस के बारे में पूछताछ कर सकते हैं resources/list के माध्यम से (सर्वर एक डायरेक्टरी ट्री, हाल के दस्तावेज़ों की सूची, आदि प्रदर्शित कर सकता है)। सर्वर का जवाब हर रिसोर्स के लिए मेटाडेटा शामिल करता है (URI, नाम, प्रकार, विवरण, आदि)। फिर क्लाइंट एक विशिष्ट रिसोर्स के सामग्री को अनुरोध कर सकता है resources/read के साथ, URI पास करके। सर्वर रिसोर्स सामग्री का जवाब देता है, जो पाठ (फाइलों के लिए) हो सकता है, या संरचित डेटा (MCP विभिन्न सामग्री प्रकारों का समर्थन करता है, जैसे पाठ, JSON, बाइनरी, आदि, MIME प्रकारों के साथ)। रिसोर्स टेम्प्लेट्स के लिए भी समर्थन है (पैरामीटरीकृत रिसोर्स जो टेम्प्लेट URIs द्वारा पहचाने जाते हैं, जिन्हें क्लाइंट भर सकता है, उदाहरण के लिए एक डेटाबेस क्वेरी जहां उपयोगकर्ता एक पैरामीटर प्रदान करता है)। अगर सक्षम है, तो सर्वर रिसोर्सेस बदलने पर सूचना भेज सकते हैं (उदाहरण के लिए, notifications/resources/updated) या क्लाइंट को एक रिसोर्स पर बदलावों के लिए सब्सक्राइब करने की अनुमति दे सकते हैं (resources/subscribe)। MCP के डिजाइन में, रिसोर्सेस एप्लिकेशन-नियंत्रित संदर्भ हैं: होस्ट एप्लिकेशन (क्लाइंट) आमतौर पर यह निर्णय लेता है कि मॉडल के प्रॉम्प्ट में किस रिसोर्स सामग्री को वास्तव में फीड करना है (अक्सर उपयोगकर्ता की पुष्टि के बाद या UI संदर्भ के आधार पर).

  • टूल्स: निष्पादन योग्य फ़ंक्शन्स या कार्रवाइयाँ जो सर्वर मॉडल को बुलाने के लिए प्रदर्शित करता है। टूल्स उन ऑपरेशन्स का प्रतिनिधित्व करते हैं जिन्हें AI कर सकता है - उदाहरण के लिए, एक बाहरी API को कॉल करना, एक डेटाबेस क्वेरी चलाना, एक ईमेल भेजना, या एक फाइल को संशोधित करना। हर टूल के पास एक नाम और JSON स्कीमा इसके इनपुट (और वैकल्पिक आउटपुट) पैरामीटर्स के लिए होता है, इसलिए AI (या क्लाइंट) जानता है कि यह किस अर्गुमेंट्स की अपेक्षा करता है। टूल्स आमतौर पर मॉडल-नियंत्रित होते हैं: विचार यह है कि भाषा मॉडल (एजेंट) यह निर्णय लेता है कि और कब एक टूल का उपयोग एक चैट में उपयोगकर्ता के अनुरोध को पूरा करने के लिए करना है। हालाँकि, सुरक्षा के लिए, एक मानव उपयोगकर्ता या होस्ट ऐप टूल उपयोग को मध्यस्थता कर सकता है (उदाहरण के लिए, एक पुष्टि क्लिक की आवश्यकता हो सकती है)। MCP में टूल्स का उपयोग करने में दो मुख्य ऑपरेशन्स शामिल हैं: सूचीबद्ध करना और कॉल करना। एक क्लाइंट tools/list को कॉल कर सकता है ताकि उपलब्ध टूल्स और उनके स्कीमा प्राप्त कर सके। उदाहरण के लिए, एक सर्वर एक टूल get_weather सूचीबद्ध कर सकता है जिसमें एक विवरण और एक इनपुट स्कीमा होता है जो एक “लोकेशन” स्ट्रिंग की आवश्यकता होती है। फिर, जब मॉडल एक टूल का उपयोग करने का निर्णय लेता है (या उपयोगकर्ता इसे बुलाता है), क्लाइंट एक tools/call अनुरोध भेजता है टूल के नाम और अर्गुमेंट्स के JSON ऑब्जेक्ट के साथ। सर्वर फ़ंक्शन को निष्पादित करता है और परिणाम वापस करता है, आमतौर पर एक result.content फ़ील्ड के रूप में जो पाठ या संरचित डेटा हो सकता है (MCP कई सामग्री भागों (उदाहरण के लिए, पाठ के साथ एक छवि, आदि) वापस करने का समर्थन करता है, हालांकि पाठ आम है)। एक सरल उदाहरण: एक get_weather टूल को कॉल करना एक पाठ पेलोड जैसे “न्यू यॉर्क में वर्तमान मौसम: 72°F, आंशिक रूप से बादल” असिस्टेंट को प्रस्तुत करने के लिए सामग्री के रूप में वापस कर सकता है। टूल्स गलतियों को भी इंगित कर सकते हैं (अगर कुछ गलत हो गया तो जवाब में एक isError फ्लैग या एक एरर ऑब्जेक्ट होता है)। प्रॉम्प्ट्स और रिसोर्सेस की तरह, tools क्षमता में एक वैकल्पिक listChanged फ्लैग हो सकता है जो बताता है कि उपलब्ध टूल्स रनटाइम में बदलते हैं (उदाहरण के लिए, एक डायनामिक प्लगइन लोड/अनलोड होता है).

उपरोक्त सर्वर-प्रदत्त फीचर्स के अलावा, MCP क्लाइंट-प्रदत्त फीचर्स भी परिभाषित करता है (क्षमताएँ जिनका सर्वर उपयोग कर सकता है अगर क्लाइंट उनका समर्थन करता है)। इनमें सैम्पलिंग, रूट्स, और एलिसिटेशन शामिल हैं:

  • सैम्पलिंग एक सर्वर को क्लाइंट (और इसके LLM) से अनुरोध करने की अनुमति देता है कि सेशन के भीतर मॉडल इन्फरेंस निष्पादित करें। उदाहरण के लिए, एक सर्वर एक LLM कॉल शुरू कर सकता है (शायद चेन-ऑफ-थॉट को जारी रखने या कुछ को सारांशित करने के लिए) एक अनुरोध भेजकर जैसे sampling/request - क्लाइंट फिर मॉडल को प्रॉम्प्ट करेगा और परिणाम वापस करेगा। यह एजेंटिक व्यवहार सक्षम बनाता है जहां सर्वर AI को अपने उप-कार्यों में सहायता करने के लिए प्रेरित कर सकता है। (ऐसे सभी कार्रवाइयाँ उपयोगकर्ता की मंजूरी और नीति के अधीन हैं - उदाहरण के लिए, उपयोगकर्ता को एक सर्वर को अतिरिक्त क्वेरी के लिए मॉडल ट्रिगर करने की अनुमति देने के लिए ऑप्ट-इन करना पड़ सकता है.)

  • रूट्स सर्वर को अनुमति देता है कि कुछ अनुमत फ़ाइल सिस्टम या URI रूट्स के बारे में पूछताछ करें या उनके भीतर काम करें। क्लाइंट एक सूची प्रदान कर सकता है “रूट” डायरेक्टरी/URIs जो सर्वर को एक्सेस करने की अनुमति है, roots/list के माध्यम से। यह एक सुरक्षा फीचर है जो सुनिश्चित करता है कि सर्वर सीमाओं को जानता है (उदाहरण के लिए, किस फ़ोल्डर ट्री से वह पढ़ सकता है).

  • एलिसिटेशन सर्वर को क्लाइंट से अनुरोध करने की अनुमति देता है कि अगर आवश्यक हो तो उपयोगकर्ता से अधिक जानकारी प्राप्त करें। उदाहरण के लिए, अगर एक टूल को एक गायब जानकारी की आवश्यकता होती है जो प्रदान नहीं की गई थी, तो सर्वर एक एलिसिटेशन अनुरोध भेज सकता है, जिसे क्लाइंट (UI) एक उपयोगकर्ता प्रॉम्प्ट में बदल देगा (“X इंटीग्रेशन को आपका API की आवश्यकता है, कृपया इसे दर्ज करें”)। इस तरह से सर्वर क्लाइंट के माध्यम से इंटरैक्टिव रूप से इनपुट एकत्र कर सकता है.

ये सभी फीचर्स वैकल्पिक हैं और प्रारंभिकरण के दौरान आगे से निर्धारित किए जाते हैं। MCP का एक मुख्य डिजाइन पहलू यह है कि क्षमता वार्ता प्रारंभिकरण के दौरान होती है - क्लाइंट और सर्वर उपरोक्त फीचर्स में से किसका समर्थन करते हैं, यह घोषित करते हैं, इसलिए दोनों पक्षों को पता चलता है कि सेशन में कौन से ऑपरेशन्स उपलब्ध हैं। उदाहरण के लिए, अगर एक सर्वर tools क्षमता घोषित नहीं करता है, तो क्लाइंट उसके साथ कोई tools/list या tools/call ऑपरेशन्स नहीं करने की कोशिश करेगा। इस विस्तार योग्यता के कारण MCP समय के साथ नई फीचर्स के साथ विकसित हो सकता है जबकि पिछले संस्करणों के साथ पिछले संस्करणों के साथ संगतता बनाए रखता है (अनुसंधान किए गए विधियाँ अगर वार्ता नहीं की गई तो उपयोग नहीं की जाएंगी).

MCP के कार्यान्वयन, SDKs, और एक MCP सर्वर बनाना (विशेष रूप से Go में)

अधिकारिक विनिर्देश और दस्तावेज़ीकरण: MCP का आधिकारिक विनिर्देश खुले रूप में उपलब्ध है, जिसमें सभी संदेश प्रकारों का एक औपचारिक स्कीमा शामिल है। यह Model Context Protocol वेबसाइट और GitHub पर बनाए रखा जाता है। विनिर्देश एक TypeScript स्कीमा फाइल (एक संबद्ध JSON स्कीमा के साथ) में परिभाषित किया गया है जो सभी अनुरोधों, प्रतिक्रियाओं और संरचनाओं को सटीक रूप से दस्तावेज़ीकरण करता है। दस्तावेज़ीकरण साइट (modelcontextprotocol.io) गाइड्स, एक FAQ, और प्रत्येक विशेषता और संदेश प्रकार के विस्तृत विवरण प्रदान करती है, साथ ही एक “MCP Inspector” टूल भी प्रदान करती है जो इंटरैक्टिव डिबगिंग के लिए है। हालांकि MCP अभी तक (अभी तक) IETF या ISO मानक नहीं है, लेकिन यह एक खुला मानक के रूप में विकसित किया जाता है जिसमें समुदाय का इनपुट होता है और यह परिवर्तनों को प्रबंधित करने के लिए RFC 2119 शब्दावली का उपयोग करता है। यह एक विकसित हो रही प्रोटोकॉल है (संस्करण तारीख-STAMP किए गए हैं; उदाहरण के लिए, 2025-06-18 एक हालिया संशोधन है), जिसमें परिवर्तनों को प्रबंधित करने के लिए एक संस्करण नीति है।

रेफरेंस कार्यान्वयन: जब MCP का परिचय दिया गया था, तो Anthropic ने कई MCP सर्वर कनेक्टर्स और SDKs को ओपन-सोर्स किया। एक GitHub संगठन modelcontextprotocol है जो विनिर्देश और कई रिपॉजिटरीज होस्ट करता है। विशेष रूप से, एक “servers” रिपॉजिटरी में आम सेवाओं और डेटा स्रोतों के लिए प्री-बिल्ट MCP सर्वर कार्यान्वयन का एक संग्रह शामिल है। ये रेफरेंस इंटीग्रेशन के रूप में कार्य करते हैं और अक्सर आउट-ऑफ-द-बॉक्स या कस्टम सर्वर के लिए टेम्पलेट के रूप में उपयोग किए जा सकते हैं। उदाहरण के लिए, आधिकारिक रिपॉजिटरी में Google Drive (Google Drive में फाइल एक्सेस और खोज), Slack (वर्कस्पेस संदेश और चैनल सामग्री), GitHub/Git (कोड रिपॉजिटरी संदर्भ), PostgreSQL (स्कीमा जानकारी के साथ रीड-ऑनली डेटाबेस क्वेरी), Google Maps (स्थान और दिशा API), Puppeteer (वेब ब्राउज़िंग और स्क्रैपिंग), और बहुत से और शामिल हैं। इन सर्वरों को इंस्टॉल या चलाने से एक AI एप्लिकेशन जैसे Claude या Cursor को तुरंत उस इंटीग्रेशन प्राप्त हो जाता है। MCP के लिए एक समुदाय द्वारा चलाया जाने वाला रजिस्ट्री सर्विस (Go में ओपन-सोर्स) भी है जो उपलब्ध सर्वरों की सूचीबद्ध करता है, और कई तीसरे पक्ष के योगदान हैं जो MCP को विभिन्न डोमेन (CRMs से ब्लॉकचेन डेटा तक) तक विस्तारित करते हैं।

SDKs और लाइब्रेरी: अपने MCP सर्वर/क्लाइंट बनाने के लिए, कई भाषाओं में आधिकारिक SDKs उपलब्ध हैं। 2025 तक, प्रोजेक्ट TypeScript/Node, Python, Java (और Kotlin), C# (Microsoft के साथ विकसित), Ruby (Shopify के साथ), Swift, और अन्य के लिए SDKs प्रदान करता है। ये लाइब्रेरी प्रोटोकॉल प्लंबिंग का प्रबंधन करते हैं - उदाहरण के लिए, JSON-RPC ट्रांसपोर्ट का प्रबंधन, विनिर्देश स्कीमा का कार्यान्वयन, और टूल्स को रजिस्टर करने या संसाधनों को सर्व करने के लिए हेल्पर APIs प्रदान करते हैं। उदाहरण के लिए, TypeScript SDK का उपयोग Node.js में एक सर्वर लिखने के लिए किया जा सकता है, और Python SDK का उपयोग MCP को Python एप्लिकेशनों में एकीकृत करने के लिए किया जा सकता है। SDK दृष्टिकोण का मतलब है कि डेवलपर्स को JSON-RPC संदेशों को मैन्युअल रूप से बनाना या पूरे स्टेट मशीन को कार्यान्वित करना नहीं पड़ता है; इसके बजाय, वे उच्च-स्तरीय विधियों को कॉल करते हैं ताकि अनुरोध भेजे या क्षमताएं प्रकाशित की जा सकें।

Go कार्यान्वयन: Go MCP सर्वरों के लिए एक लोकप्रिय विकल्प के रूप में उभरा है, इसकी प्रदर्शन और समांतरता की ताकतों के कारण (एक साथ कई अनुरोधों को हैंडल करने के लिए अच्छा है)। एक आधिकारिक Go SDK अब उपलब्ध है, जो Google के Go टीम के साथ सहयोग में बनाए रखा जाता है। (इसका ऐलान अप्रैल 2025 के आसपास हुआ था और पहला स्थिर रिलीज़ अगस्त 2025 के लिए निर्धारित है।) Go SDK एक पैकेज mcp प्रदान करता है जो क्लाइंट/सर्वर बनाने के लिए है और एक jsonschema हेल्पर टूल स्कीमाओं के लिए है। Go SDK का उपयोग करके, डेवलपर्स कुछ कॉल्स के साथ एक MCP सर्वर बना सकते हैं। उदाहरण के लिए, आप एक नया सर्वर एक नाम और संस्करण के साथ इंस्टैंसियेट कर सकते हैं, फिर AddTool के माध्यम से टूल्स जोड़ सकते हैं, एक टूल परिभाषा (नाम, विवरण, इनपुट स्कीमा) प्रदान करके और एक Go हैंडलर फंक्शन को प्रदान करके जब उस टूल को कॉल किया जाता है। SDK प्रोटोकॉल में टूल को एक्सपोज करने का काम संभालता है (इसे tools/list में विज्ञापित करना और tools/call अनुरोधों का प्रबंधन करना)। इसी तरह, आप संसाधनों या प्रॉम्प्ट्स को समान APIs के साथ एक्सपोज कर सकते हैं। अंत में, आप सर्वर चलाते हैं - उदाहरण के लिए, server.Run(ctx, mcp.NewStdioTransport()) JSON-RPC संदेशों को stdio के माध्यम से प्रोसेस करना शुरू करेगा जब तक कि क्लाइंट डिस्कनेक्ट नहीं हो जाता। क्लाइंट साइड पर, Go SDK एक सबप्रोसेस स्पॉन कर सकता है और mcp.NewCommandTransport(exec.Command("myserver")) के माध्यम से कनेक्ट कर सकता है, फिर क्लाइंट session.CallTool(ctx, params) कॉल कर सकता है ताकि एक टूल को इन्वोक किया जा सके और Go कोड में परिणाम आसानी से प्राप्त किया जा सके।

उदाहरण: आधिकारिक Go SDK दस्तावेज़ीकरण एक सरल “ग्रीटर” सर्वर दिखाता है। सर्वर एक टूल "greet" रजिस्टर करता है जो एक नाम लेता है और एक ग्रीटिंग स्ट्रिंग रिटर्न करता है। क्लाइंट फिर इस टूल को नाम से कॉल करता है और परिणाम प्रिंट करता है। यह बुनियादी पैटर्न को दर्शाता है: टूल परिभाषित करना -> क्लाइंट टूल कॉल करना -> परिणाम प्राप्त करना। नीचे, यह MCP विनिर्देश द्वारा परिभाषित JSON-RPC संदेशों ("method": "tools/call", params: {"name": "greet", ...} और प्रतिक्रिया में result.content के साथ टेक्स्ट) के साथ संबंधित है।

आधिकारिक Go SDK रिलीज़ होने से पहले, समुदाय ने अपने Go लाइब्रेरी बनाए। विशेष रूप से, Ed Zynda का mcp-go प्रोजेक्ट (mark3labs/mcp-go) व्यापक रूप से उपयोग किया जाता था और आधिकारिक SDK के डिजाइन को प्रभावित करता था। एक और लाइब्रेरी, mcp-golang Metoro द्वारा, एक Go कार्यान्वयन और API प्रदान करती थी (Elton Minetto द्वारा Dev समुदाय ब्लॉग पोस्ट इस लाइब्रेरी का उपयोग करता है, 2025 के शुरुआत में)। ये समुदाय SDKs Go डेवलपर्स को MCP के साथ प्रयोग करने की अनुमति दी, उदाहरण के लिए, एक ट्यूटोरियल दिखाता है कि कैसे एक MCP सर्वर बनाया जाता है जो ब्राजीलियन पोस्टल कोड्स (CEP) को ढूंढता है, एक “zipcode” टूल को Metoro mcp-golang लाइब्रेरी के माध्यम से एक्सपोज करके। उस उदाहरण में, Go सर्वर एक फंक्शन रजिस्टर करता है जो एक बाहरी API को कॉल करता है ताकि एक ZIP से एक पता ढूंढा जा सके, और परिणाम को टेक्स्ट के रूप में रिटर्न करता है - जिससे एक AI सहायक MCP के माध्यम से मांग पर पता जानकारी प्राप्त कर सकता है। एक और गाइड एक कस्टम इन-मेमोरी डेटाबेस (DiceDB) को mark3labs mcp-go SDK का उपयोग करके एक MCP सर्वर के रूप में लपेटने का प्रदर्शन करता है: यह एक ping टूल परिभाषित करता है ताकि DB कनेक्टिविटी की जांच की जा सके और अन्य टूल्स डेटा ऑपरेशंस के लिए। ये उदाहरण दिखाते हैं कि एक MCP इंटीग्रेशन बनाने में कितना सरल हो सकता है: अधिकांश कोड बस बिजनेस लॉजिक (API कॉल्स, DB क्वेरीज, आदि) होता है, जबकि SDK JSON-RPC वायरिंग का प्रबंधन करता है।

Go में एक MCP सर्वर बनाना (ट्यूटोरियल हाइलाइट्स)

प्रक्रिया को आउटलाइन करने के लिए, Go SDK या समान लाइब्रेरी के साथ एक सामान्य फ्लो यहां दिया गया है:

  1. सर्वर सेटअप: बुनियादी जानकारी (नाम, संस्करण, और समर्थित क्षमताओं की घोषणा) के साथ एक नया सर्वर इंस्टेंस इंस्टैंसियेट करें। उदाहरण के लिए, Go में: server := mcp.NewServer("MyServer", "1.0.0", nil) एक सर्वर बनाएगा जो (डिफ़ॉल्ट रूप से) कोर प्रोटोकॉल विशेषताओं का समर्थन करता है। आप विकल्पों या बस उन विशेषताओं को रजिस्टर करके (एक टूल या संसाधन जोड़ने का मतलब उस क्षमता का होना) जैसे प्रॉम्प्ट्स/संसाधनों/टूल्स जैसे विशिष्ट क्षमताओं को सक्षम कर सकते हैं।

  2. विशेषताओं को रजिस्टर करें: आप जो भी कार्यक्षमता एक्सपोज करना चाहते हैं, उसे जोड़ें:

    • अगर टूल्स एक्सपोज किए जा रहे हैं, तो प्रत्येक टूल के स्कीमा और हैंडलर को परिभाषित करें। उदाहरण के लिए, Go SDK के AddTool का उपयोग करके: एक mcp.Tool{Name: "...", Description: "..."} प्रदान करें और एक हैंडलर फंक्शन जो कॉल अनुरोध लेता है और एक परिणाम रिटर्न करता है (जिसमें टेक्स्ट या अन्य सामग्री हो सकती है)। SDK आपकी हैंडलर के पैरामीटर प्रकारों से इनपुट्स के लिए एक JSON स्कीमा स्वचालित रूप से जनरेट करेगा (या आप इसे निर्दिष्ट कर सकते हैं)।
    • अगर संसाधनों को एक्सपोज किया जा रहा है, तो आप एक API का उपयोग करके संसाधन सूचियों को रजिस्टर कर सकते हैं या सामग्री पढ़ने के लिए एक कॉलबैक प्रदान कर सकते हैं। उदाहरण के लिए, Python SDK में, आप एक ResourceProvider सबक्लास कर सकते हैं; Go में, SDK अभी विकसित हो रही है, लेकिन आप संभवतः संसाधनों को सूचीबद्ध करने और पढ़ने के लिए फंक्शन प्रदान करेंगे। प्रत्येक संसाधन के पास एक स्थिर URI होना चाहिए।
    • अगर प्रॉम्प्ट्स को एक्सपोज किया जा रहा है, तो प्रॉम्प्ट टेम्पलेट्स (यहां तक कि स्टैटिक फाइलें या स्ट्रिंग्स भी हो सकते हैं) को परिभाषित करें और उन्हें नामों और वैकल्पिक पैरामीटरों के साथ रजिस्टर करें। सर्वर उन्हें विज्ञापित करेगा ताकि क्लाइंट उन्हें प्राप्त कर सके और उपयोगकर्ताओं को दिखा सके।
  3. ट्रांसपोर्ट कार्यान्वयन: यह तय करें कि सर्वर कैसे चलाया जाएगा। स्थानीय उपयोग के लिए सबसे सरल है stdio - उदाहरण के लिए, Go में server.Run(ctx, mcp.NewStdioTransport()) JSON-RPC को stdin से पढ़ना शुरू करेगा। अगर आपका सर्वर नेटवर्क पर होना चाहिए, तो आप एक HTTP हैंडलर कार्यान्वयन कर सकते हैं जो Go SDK का उपयोग करके JSON-RPC को HTTP के माध्यम से स्वीकार करता है (आधिकारिक Go SDK में शीघ्र ही HTTP/SSE ट्रांसपोर्ट के लिए एक हेल्पर शामिल हो सकता है)।

  4. क्लाइंट परीक्षण: आप एक MCP-संगत क्लाइंट का उपयोग करके सर्वर का परीक्षण कर सकते हैं। उदाहरण के लिए, Anthropic का Claude 2 (Desktop के लिए Claude) स्थानीय MCP सर्वरों को लोड करने का समर्थन करता है; आप Claude को अपने सर्वर बाइनरी को लॉन्च या कनेक्ट करने के लिए कॉन्फ़िगर करेंगे। mcp-cli नामक एक CLI टूल और MCP Inspector GUI भी है जो एक पूर्ण AI क्लाइंट के बिना सर्वरों का परीक्षण करने के लिए है - ये टूल्स आपकी सर्वर को MCP अनुरोध भेजते हैं और परिणाम दिखाते हैं, डिबगिंग में मदद करते हैं।

  5. सुरक्षा और अनुमतियाँ: एक सर्वर बनाते समय, प्रमाणिकता और स्कोपिंग पर विचार करें। स्थानीय सर्वरों के लिए, होस्ट इसे कुछ OS अनुमतियों के साथ चला सकता है या एप्लिकेशन कीज को पर्यावरण के माध्यम से प्रदान कर सकता है। दूरस्थ सर्वरों के लिए, auth headers या OAuth flows का उपयोग करें। MCP में HTTP ट्रांसपोर्ट्स के लिए एक प्रमाणिकता विनिर्देश शामिल है (सर्वर एक टोकन की मांग कर सकता है और क्लाइंट इसे भेज सकता है)। हमेशा यह सुनिश्चित करें कि सर्वर केवल उस डेटा तक पहुंचता है जिसे उपयोगकर्ता ने अनुमति दी है (उदाहरण के लिए, क्लाइंट द्वारा प्रदान की गई रूट डायरेक्टरीज का सम्मान करें, और अन्य जगह डेटा लीक न करें) - MCP गाइडलाइन्स उपयोगकर्ता सहमति, डेटा गोपनीयता, और टूल सुरक्षा को मूलभूत मानते हैं।

सारांश में, MCP एक औपचारिक लेकिन लचीला प्रोटोकॉल है जो LLMs को बाहरी दुनिया से जोड़ने के लिए है। यह एक कंपनी के आंतरिक API नहीं है, बल्कि एक खुला मानक है जिसमें बढ़ती हुई अपनाई जाने वाली क्षमता और एक समृद्ध इंटीग्रेशन पारिस्थितिकी है। प्रोटोकॉल स्पष्ट संदेश संरचनाओं (JSON-RPC आधारित) और एक सेट ऑपरेशंस (प्रॉम्प्ट्स, टूल्स, संसाधनों, आदि के लिए विधियाँ) को परिभाषित करता है जिन्हें कोई भी अनुपालन करने वाला क्लाइंट/सर्वर कार्यान्वित कर सकता है। आधिकारिक दस्तावेज़ीकरण और विनिर्देश उपलब्ध हैं, और कई SDKs, लाइब्रेरीज, और उदाहरण सर्वर (Go में भी) कार्यान्वयन को आसान बनाते हैं। MCP का उपयोग करके, डेवलपर्स AI-सक्षम एप्लिकेशनों का निर्माण कर सकते हैं जो सुरक्षित रूप से मौजूदा डेटा और सेवाओं का उपयोग करते हैं, बिना हर नए मॉडल या डेटासेट के लिए इंटीग्रेशन लॉजिक को पुनः आविष्कार किए।

उपयोगी लिंक्स