Metabase

आधिकारिक

Metabase के लिए आधिकारिक MCP सर्वर, जो डेटा खोजने, सिमैंटिक लेयर पर क्वेरी बनाने और MCP क्लाइंट के माध्यम से परिणामों को विज़ुअलाइज़ करने में सक्षम बनाता है।

Metabase MCP के साथ आप क्या कर सकते हैं?

  • खोजें और सामग्री प्राप्त करें — अपने सहायक से Metabase में प्रश्न, डैशबोर्ड या मॉडल खोजने के लिए search टूल का उपयोग करने को कहें, फिर get_content से विवरण प्राप्त करें।
  • क्वेरी चलाएं और परिणाम विज़ुअलाइज़ करें — अपने सहायक से execute_query के माध्यम से संरचित क्वेरी या execute_sql के साथ रॉ SQL निष्पादित करवाएं, फिर visualize_query का उपयोग करके परिणामों को इंटरैक्टिव चार्ट के रूप में प्रस्तुत करें।
  • डैशबोर्ड बनाएं और प्रबंधित करें — अपने सहायक को dashboard_write के साथ डैशबोर्ड और उनके लेआउट बनाने या अपडेट करने का निर्देश दें, या duplicate_content के माध्यम से मौजूदा सामग्री को संग्रह में डुप्लिकेट करें।
  • अलर्ट और सदस्यताएं सेट करें — अपने सहायक से सहेजे गए प्रश्नों के लिए alert_write के साथ शेड्यूल किए गए अलर्ट बनाने या subscription_write का उपयोग करके डैशबोर्ड ईमेल सदस्यताएं कॉन्फ़िगर करने को कहें।
  • डेटा पदानुक्रम एक्सप्लोर करें — अपने सहायक को browse_data के माध्यम से डेटाबेस, स्कीमा, टेबल और फ़ील्ड ब्राउज़ करने का निर्देश दें, या browse_collection के साथ संग्रह को संरचनात्मक रूप से नेविगेट करें।

दस्तावेज़

Metabase MCP सर्वर

Metabase में एक अंतर्निहित Model Context Protocol (MCP) सर्वर शामिल है जो AI क्लाइंट्स को सीधे Metabase इंस्टेंस से कनेक्ट करने देता है। यह Streamable HTTP transport का उपयोग करता है और Metabase के Agent API पर आधारित है ताकि खोज, नेविगेशन, क्वेरी, विज़ुअलाइज़ेशन, और सामग्री बनाने/अपडेट करने के लिए टूल उजागर किए जा सकें - ये सभी कनेक्ट करने वाले उपयोगकर्ता की अनुमतियों तक सीमित हैं।

एंडपॉइंट

MCP सर्वर निम्नलिखित पर उपलब्ध है:

https://{your-metabase.example.com}/api/metabase-mcp

पुराना /api/mcp पथ अभी भी मौजूदा क्लाइंट्स के लिए एक उपनाम के रूप में काम करता है, लेकिन /api/metabase-mcp ही विज्ञापित करने के लिए विहित URL है।

क्लाइंट कनेक्ट करना

किसी भी MCP-संगत क्लाइंट को /api/metabase-mcp एंडपॉइंट पर इंगित करें। उदाहरण के लिए, Claude Code के साथ:

claude mcp add metabase https://{your-metabase.example.com}/api/metabase-mcp --transport streamable-http

Claude Desktop के लिए, समान URL का उपयोग करके एक कस्टम कनेक्टर बनाएं।

Cursor के लिए, Settings > MCP खोलें और प्रकार streamable-http और URL के साथ एक नया सर्वर जोड़ें:

https://{your-metabase.example.com}/api/metabase-mcp

प्रमाणीकरण

MCP क्लाइंट OAuth 2.0 के माध्यम से प्रमाणित होते हैं। Metabase अपना स्वयं का एम्बेडेड OAuth सर्वर चलाता है - किसी बाहरी प्रदाता की आवश्यकता नहीं है।

पहली बार कनेक्शन के लिए प्रवाह:

  1. क्लाइंट Metabase के OAuth एंडपॉइंट्स की खोज करता है।
  2. क्लाइंट स्वयं को Metabase के साथ पंजीकृत करता है।
  3. उपयोगकर्ता को लॉग इन करने और कनेक्शन स्वीकृत करने के लिए Metabase पर पुनर्निर्देशित किया जाता है।
  4. क्लाइंट को उपयोगकर्ता की Metabase अनुमतियों तक सीमित एक एक्सेस टोकन प्राप्त होता है।

ब्राउज़र-आधारित सत्र (कुकी प्रमाणीकरण), API कुंजियाँ, और mb:full टोकन में कोई MCP स्कोप नहीं होता, इसलिए वे कनेक्ट हो सकते हैं लेकिन कोई स्कोप्ड टूल नहीं बुला सकते।

स्कोप

एक्सेस टोकन उन टूल्स को सीमित करने के लिए स्कोप्ड होते हैं जिन्हें एक क्लाइंट उपयोग कर सकता है:

स्कोपयह जो टूल प्रदान करता है
agent:content:readbrowse_collection, browse_data, get_content, get_parameter_values, glossary, learn, search, और catalog://metabase/fields डेटा संसाधन (देखें Resources)
agent:content:writebookmark_content, collection_write, dashboard_write, document_write, duplicate_content, measure_write, metric_write, question_write, segment_write
agent:delivery:writealert_write, subscription_write
agent:query:runexecute_query, refresh_ui_credential, render_drill_through, run_saved_question, visualize_query
agent:sql:runexecute_sql

एक टूल केवल तालिका में दिए गए सटीक स्कोप से मेल खाता है। एक वाइल्डकार्ड जैसे * या agent:*, और ::unrestricted सेंटिनल, MCP स्कोप नहीं हैं, इसलिए वे कोई टूल प्रदान नहीं करते।

ये स्कोप केवल MCP सतह को गेट करते हैं। कोई भी REST एंडपॉइंट इनमें से किसी को अपने :scope के रूप में घोषित नहीं कर सकता, इसलिए एक MCP क्लाइंट को जारी किया गया नया टोकन REST API पर कुछ भी प्रदान नहीं करता।

संरक्षित-संसाधन मेटाडेटा का scopes_supported और 401 चुनौती का scope दोनों तालिका में हर स्कोप को सूचीबद्ध करते हैं, इसलिए एक नया कनेक्शन उन सभी के लिए पूछता है। कुछ क्लाइंट 403 के बाद स्टेप-अप नहीं करते: Claude के कनेक्टर सेटिंग्स से एक मैनुअल पुनःकनेक्शन एक नया क्लाइंट पंजीकृत करता है और ठीक वही पूछता है जो ये सूचीबद्ध करते हैं। जब वे केवल बेसलाइन सूचीबद्ध करते थे, तो वह पुनःकनेक्शन कभी भी लेखन, कच्चा SQL, या डिलीवरी की पेशकश नहीं करता था, और उपयोगकर्ता के पास उन्हें प्रदान करने का कोई तरीका नहीं था (ENG-11089)। प्राधिकरण सर्वर मेटाडेटा भी उन सभी का विज्ञापन करता है।

बेसलाइन (agent:content:read agent:query:run) सहमति स्क्रीन पर लॉक है: जब कोई क्लाइंट इनमें से किसी एक का अनुरोध करता है, तो उपयोगकर्ता इसे अनटिक नहीं कर सकता। agent:query:run बेसलाइन में है ताकि चार्ट को कभी भी स्टेप-अप की आवश्यकता न हो। Claude Desktop एक सत्र पर स्टेप-अप के बाद एक टूल को पुनः प्रयास करता है जो MCP Apps समर्थन घोषित नहीं करता है, इसलिए एक स्टेप-अप किया गया visualize_query अस्वीकार कर दिया जाता है और उसका चार्ट कभी एम्बेड नहीं होता।

एक टूल कॉल या डेटा संसाधन पढ़ना जिसके लिए टोकन में स्कोप की कमी है, HTTP 403 और एक WWW-Authenticate: Bearer error="insufficient_scope" चुनौती के साथ अस्वीकार कर दिया जाता है जिसका scope उन v2 स्कोपों को सूचीबद्ध करता है जो टोकन पहले से रखता है साथ ही आवश्यक एक, ताकि एक क्लाइंट स्टेप-अप कर सके। प्रत्येक टूल अपने स्कोप को securitySchemes में भी घोषित करता है, जो ड्राफ्ट SEP-1488 है, जिसे ChatGPT द्वारा समर्थित किया गया है। यह MCP 2025-03-26 (वह संस्करण जो यह सर्वर रिपोर्ट करता है) या अंतिम 2026-07-28 टूल्स स्पेक का हिस्सा नहीं है, इसलिए अन्य क्लाइंट 403 से लापता स्कोप की खोज करते हैं। JSON-RPC बैच के अंदर अस्वीकृति एक इन-बैंड -32600 त्रुटि है इसके बजाय। UI शेल रीड्स को कभी चुनौती नहीं दी जाती: देखें Resources।

OAuth संरक्षित संसाधन मेटाडेटा निम्नलिखित पर उपलब्ध है:

/.well-known/oauth-protected-resource/api/metabase-mcp

सहमति स्क्रीन पर, क्लाइंट द्वारा अनुरोधित हर स्कोप टिक किया हुआ शुरू होता है, और बेसलाइन स्कोप भी लॉक होते हैं। केवल टिक छोड़े गए स्कोप ही प्रदान किए जाते हैं, और केवल उस टोकन के लिए जो यह प्राधिकरण मिंट करता है। एक अनटिक कभी भी उस टोकन को नहीं छूता जो ऐप के पास पहले से है। एक स्कोप जो अनटिक छोड़ दिया गया है, Metabase द्वारा याद नहीं रखा जाता। बाद में 403 उन क्लाइंट्स में एक और स्टेप-अप ट्रिगर कर सकता है जो इसका समर्थन करते हैं। अन्य क्लाइंट्स को मैनुअल पुनःप्राधिकरण की आवश्यकता हो सकती है। प्रत्येक चुनौती का error_description एक नोट के साथ समाप्त होता है कि उपयोगकर्ता को सहमति स्क्रीन पर अनुमति प्रदान करनी चाहिए।

कई क्लाइंट 403 के error_description को अपने स्वयं के पाठ से बदल देते हैं, इसलिए initialize परिणाम का instructions मॉडल को भी स्कोप विफलताओं की व्याख्या करता है: एक प्रमाणीकरण त्रुटि आमतौर पर एक समाप्त लॉगिन के बजाय एक लापता अनुमति का मतलब है, मॉडल को विफल टूल या संसाधन और उसके लिए आवश्यक अनुमति का नाम देना चाहिए, और उपयोगकर्ता इसे पुनःकनेक्ट करके और सहमति स्क्रीन पर अनुमति को टिक छोड़कर प्रदान करता है। निर्देश एक स्थिर स्ट्रिंग हैं, हर कॉलर के लिए समान: कोई प्रति-कनेक्शन अनुमति सूची नहीं है।

प्रति-समूह टूल पहुंच

ai_controls सुविधा वाले Enterprise इंस्टेंस पर, एक व्यवस्थापक Admin > AI > Usage controls > MCP tools access पर प्रति अनुमति समूह सतह को संकीर्ण कर सकता है (जब भी MCP सर्वर चालू होता है, LLM प्रदाता के साथ या बिना दिखाया जाता है)। प्रत्येक समूह के पास mcp_group_permission में एक पंक्ति होती है जो बताती है कि इसके सदस्य बिल्कुल कनेक्ट हो सकते हैं या नहीं और, प्रति टूल नाम, व्यवस्थापक का स्पष्ट "yes" या "no"; बिना प्रविष्टि वाला एक टूल अपने लेखक द्वारा घोषित डिफ़ॉल्ट लेता है, इसलिए हर deftool में :allowed या :denied का एक आवश्यक :default-access होता है और बाद में जारी किया गया एक टूल हर समूह में ठीक वही डिफ़ॉल्ट प्राप्त करता है जब तक कोई व्यवस्थापक इसे ओवरराइड नहीं करता। प्रविष्टियाँ टूल नाम से कुंजीबद्ध होती हैं, इसलिए एक टूल का नाम बदलने के लिए उसके पूर्व नामों के साथ :renamed-from की आवश्यकता होती है (एक पूर्व नाम के तहत संग्रहीत प्रविष्टि अभी भी लागू होती है और व्यवस्थापक API इसे वर्तमान नाम के तहत प्रस्तुत करता है), या लेखक स्वीकार करता है कि इसके लिए हर व्यवस्थापक की पसंद त्याग दी जाती है; metabase.mcp.v2.tool-names-test लाइव नामों को पिन करता है ताकि दोनों में से कोई भी दुर्घटना से न हो। एक उपयोगकर्ता की प्रभावी नीति उनके प्रत्येक समूह का tool_access है जिसकी पंक्ति MCP सक्षम करती है: MCP तब चालू होता है जब ऐसा कोई समूह मौजूद होता है, और एक टूल की अनुमति तब होती है जब उनमें से कोई भी समूह इसे हाँ में हल करता है। पंक्तियाँ अकेले इसे तय करती हैं, और वे अनुमति मोड भी रिकॉर्ड करती हैं: सरल मोड (Administrators, All Users, और All tenant users) या समूह-स्तर मोड (हर अन्य समूह), जो वह स्थिति है जिसमें All Users की कोई पंक्ति नहीं होती। एक स्विच नए मोड द्वारा छिपाए गए समूहों की पंक्तियों को हटा देता है और प्रवेश पर सक्षम किए गए समूहों को सीड करता है जिनकी कोई पंक्ति नहीं होती (समूह-स्तर मोड में प्रवेश करने पर Data Analysts, इसे छोड़ने पर All Users और All tenant users), और PUT एक समूह को अस्वीकार करता है जिसे वर्तमान मोड छिपाता है, इसलिए कोई अनुरोध कैश्ड मोड नहीं पढ़ता। नीति tools/list और tools/call (v2/registry.clj) में OAuth स्कोपों के शीर्ष पर लागू होती है, और एक उपयोगकर्ता जिसके समूह कोई पहुंच प्रदान नहीं करते हैं उसे initialize और resources/read (MCP बंद होने से पहले खोले गए सत्रों के लिए) पर एक त्रुटि के साथ अस्वीकार कर दिया जाता है जो समाधान का नाम देती है। केवल-ऐप टूल (_meta {:ui {:visibility ["app"]}}, यानी refresh_ui_credential) व्यवस्थापक पृष्ठ पर नहीं हैं: उन्हें तब अनुमति दी जाती है जब नीति किसी भी MCP Apps टूल की अनुमति देती है। सुपरयूज़र्स और आंतरिक कॉलर कभी संकीर्ण नहीं होते; OSS सब कुछ की अनुमति देता है। Enterprise पर संग्रहीत पंक्तियाँ ai_controls सुविधा के बिना भी लागू की जाती हैं (एक समाप्त या असत्यापनीय टोकन उन प्रतिबंधों को रखता है जो एक व्यवस्थापक ने कॉन्फ़िगर किए थे); सुविधा केवल व्यवस्थापक पृष्ठ और API को गेट करती है। रिज़ॉल्वर permissions.clj (defenterprise, metabase-enterprise.mcp.permissions में EE कार्यान्वयन) है और व्यवस्थापक API /api/ee/ai-controls/mcp-permissions है।

उपलब्ध टूल

v2 रजिस्ट्री से उत्पन्न (deftool)। यहाँ नामित स्कोप वह है जो रजिस्ट्री टूल चलाने से पहले जाँचता है; कुछ हैंडलर एक बार जब वे जानते हैं कि कॉल क्या करता है तो एक और स्कोप जाँचते हैं - agent:sql:run जब एक स्रोत मूल SQL में हल होता है (question_write), और agent:query:run उस निष्पादन के लिए जो एक अलर्ट या सदस्यता स्थगित करती है (alert_write, subscription_write)। वे अस्वीकृतियाँ समान 403 insufficient_scope चुनौती ले जाती हैं। tools/list टोकन जो कुछ भी रखता है उसके बावजूद हर टूल दिखाता है, और स्कोप की कमी वाला एक टोकन इसे कॉल नहीं कर सकता।

टूलदायराविवरण
alert_writeagent:delivery:writeअलर्ट बनाएं या अपडेट करें: एक नोटिफिकेशन जो शेड्यूल पर भेजा जाता है जब किसी सहेजे गए प्रश्न के परिणाम किसी शर्त को पूरा करते हैं।
bookmark_contentagent:content:writeकॉल करने वाले उपयोगकर्ता के लिए सामग्री पर बुकमार्क जोड़ें या हटाएं — वही स्टार/पसंदीदा सूची जो Metabase साइडबार दिखाता है।
browse_collectionagent:content:readसंग्रहों को संरचनात्मक रूप से ब्राउज़ करें — हर विभाजन पर एक समान id: एक संख्यात्मक id, एक 21-वर्ण entity_id, "root" (प्रति नेमस्पेस पुनः-रूटेड), या "trash" (संग्रहीत सामग्री, केवल आइटम मोड)।
browse_dataagent:content:readडेटा पदानुक्रम ब्राउज़ करें: डेटाबेस → स्कीमा → टेबल → फ़ील्ड।
collection_writeagent:content:writeसंग्रह बनाएं, नाम बदलें, स्थानांतरित करें, संग्रहीत करें, या पुनर्स्थापित करें — वे फ़ोल्डर जो प्रश्न, डैशबोर्ड, मॉडल और दस्तावेज़ रखते हैं।
dashboard_writeagent:content:writeडैशबोर्ड बनाएं या अपडेट करें और क्रमबद्ध ऑप्स के साथ इसका लेआउट संपादित करें।
document_writeagent:content:writeदस्तावेज़ बनाएं या अपडेट करें।
duplicate_contentagent:content:writeकिसी प्रश्न, डैशबोर्ड, या दस्तावेज़ को संग्रह में कॉपी करें — मूल को पढ़ने और फिर से बनाने से सस्ता और सुरक्षित, और यह सब कुछ संरक्षित करता है जो रीड प्रोजेक्शन छोड़ देते हैं।
execute_queryagent:query:runडेटा से प्रश्न का उत्तर देने का डिफ़ॉल्ट तरीका: एक संरचित (MBQL) क्वेरी को मान्य करें और निष्पादित करें, पंक्तियों के साथ query_handle लौटाते हुए।
execute_sqlagent:sql:runएस्केप हैच: डेटाबेस के खिलाफ रॉ SQL स्ट्रिंग निष्पादित करें, पंक्तियों के साथ query_handle लौटाते हुए।
get_contentagent:content:read{type, id} द्वारा सामग्री प्राप्त करें — खोज या browse_collection के माध्यम से मिली किसी भी चीज़ के लिए टाइप की गई रीड।
get_parameter_valuesagent:content:readडैशबोर्ड या सहेजे गए प्रश्न पर एक फ़िल्टर के लिए मान्य मान प्राप्त करें, ताकि आप अनुमान लगाने के बजाय वास्तविक मानों से फ़िल्टर करें।
glossaryagent:content:readएक व्यावसायिक शब्द देखें जैसा कि यह Metabase इंस्टेंस परिभाषित करता है; परिभाषित शब्द नाम टूल के अपने विवरण पर चलते हैं।
learnagent:content:readइस सर्वर के कार्य दस्तावेज़ (कौशल) पढ़ें उन लेखन बोलियों के लिए जिन्हें स्कीमा पूरी तरह से वर्णित नहीं कर सकते।
measure_writeagent:content:writeएक माप बनाएं या अपडेट करें: एक नामित, पुनः प्रयोज्य MBQL एकत्रीकरण जो एक टेबल से जुड़ा होता है, दूसरी क्वेरी के एकत्रीकरण में ["measure", id] के रूप में संदर्भित होता है।
metric_writeagent:content:writeएक मीट्रिक बनाएं या अपडेट करें: एक सहेजा गया, पुनः प्रयोज्य एकत्रीकरण जो संग्रह में रहता है और अपने आप क्वेरी किया जा सकता है या अन्य क्वेरी से संदर्भित किया जा सकता है।
question_writeagent:content:writeसहेजा गया प्रश्न या मॉडल बनाएं, अपडेट करें, या संग्रहीत करें।
refresh_ui_credentialagent:query:runMetabase MCP ऐप द्वारा उपयोग किए जाने वाले स्कोप्ड क्रेडेंशियल को रीफ्रेश करें।
render_drill_throughagent:query:runड्रिल-थ्रू विज़ुअलाइज़ेशन प्रस्तुत करें जिसमें उपयोगकर्ता अभी नेविगेट किया है।
run_saved_questionagent:query:runसंख्यात्मक id या entity_id द्वारा सहेजा गया प्रश्न (कार्ड) चलाएं, पंक्तियों को इनलाइन लौटाते हुए।
searchagent:content:readप्रासंगिकता द्वारा Metabase इंस्टेंस में सामग्री खोजें।
segment_writeagent:content:writeएक सेगमेंट बनाएं या अपडेट करें: एक नामित, पुनः प्रयोज्य MBQL फ़िल्टर जो एक टेबल से जुड़ा होता है, अन्य क्वेरी के फ़िल्टर से संदर्भित होता है।
subscription_writeagent:delivery:writeडैशबोर्ड सब्सक्रिप्शन बनाएं या अपडेट करें — पूरे डैशबोर्ड की शेड्यूल की गई डिलीवरी, जैसे।
visualize_queryagent:query:runकिसी क्वेरी को इंटरैक्टिव चार्ट या टेबल के रूप में विज़ुअलाइज़ करें, बातचीत में इनलाइन प्रस्तुत किया गया।

execute_query प्रति कॉल row_limit पंक्तियाँ लौटाता है (डिफ़ॉल्ट 100, अधिकतम 2000) — एक पेज आकार, परिणाम पर सीमा नहीं। एक छोटा पेज truncated: true रिपोर्ट करता है और, जब क्वेरी में कुल क्रम होता है, तो एक next_cursor वापस पास करने के लिए cursor के रूप में अगले पेज के लिए, जब तक truncated: false के साथ एक पेज नहीं आता। एक क्वेरी जो केवल अपनी पहली N पंक्तियाँ चाहती है अपने चरण में limit: N रखती है (एक order-by के साथ); सर्वर उस सीमा को पेजों में खर्च करता है, इसलिए अंतिम पेज बिना कर्सर के पूरा आता है और पेजिनेशन अपने आप समाप्त हो जाता है।

संसाधन

सर्वर MCP संसाधनों को उजागर करता है ताकि क्लाइंट टूल विवरणों को बढ़ाए बिना URI द्वारा पूरक सामग्री प्राप्त कर सकें।

संसाधन URIदायराविवरण
ui://metabase/visualize-query.htmlagent:query:run (केवल UI क्रेडेंशियल)MCP ऐप्स iframe शेल जिस पर visualize_query एक सक्षम क्लाइंट को इंगित करता है।
ui://metabase/render-drill-through.htmlagent:query:run (केवल UI क्रेडेंशियल)वह शेल जिस पर render_drill_through इंगित करता है।
catalog://metabase/fieldsagent:content:readडॉट-पथ जो प्रत्येक सामग्री प्रकार fields तर्कों में स्वीकार करता है।

हर संसाधन टोकन के दायरे की परवाह किए बिना सूचीबद्ध है। एक डेटा संसाधन, जैसे फ़ील्ड कैटलॉग, केवल उस टोकन द्वारा पढ़ा जाता है जो उसका दायरा रखता है; अन्यथा रीड को दायरे के तहत वर्णित 403 insufficient_scope चुनौती मिलती है। एक UI शेल किसी भी टोकन द्वारा पढ़ा जाता है, क्योंकि एक MCP ऐप्स होस्ट टूल कॉल के साथ टूल का शेल पढ़ता है, और यदि वह रीड अस्वीकार कर दी जाती, तो होस्ट टूल कॉल के 403 के बाद कदम नहीं उठाता। शेल कोई डेटा नहीं रखते। शेल के दायरे के बिना टोकन द्वारा पढ़ा गया शेल कभी UI क्रेडेंशियल नहीं बनाता। चार्ट डेटा टूल कॉल और refresh_ui_credential (दोनों agent:query:run) द्वारा गेटेड है, जिसकी iframe को कुछ भी क्वेरी करने से पहले आवश्यकता होती है। एक अज्ञात URI एक -32602 "Resource not found" त्रुटि है।

स्किल पैक learn टूल के माध्यम से संसाधनों के रूप में नहीं, बल्कि वितरित किए जाते हैं।

इकाई नेविगेशन get_content और browse_* टूल के साथ किया जाता है, URI योजना के बजाय; उपरोक्त ui:// संसाधन केवल इसलिए मौजूद हैं ताकि एक क्लाइंट जो iframe प्रस्तुत कर सकता है उसके पास माउंट करने के लिए कुछ हो।

समर्थित JSON-RPC विधियाँ

विधिविवरण
initializeMCP कनेक्शन प्रारंभ करें। सर्वर क्षमताएं और सत्र ID लौटाता है।
notifications/initializedक्लाइंट सूचना कि प्रारंभिकरण पूरा हो गया है।
tools/listउपलब्ध टूल सूचीबद्ध करें, टोकन के दायरे की परवाह किए बिना।
tools/callतर्कों के साथ एक टूल कॉल करें।
resources/listउपलब्ध संसाधन सूचीबद्ध करें, टोकन के दायरे की परवाह किए बिना।
resources/readURI द्वारा संसाधन पढ़ें; एक डेटा संसाधन को अपना दायरा चाहिए। सत्र की आवश्यकता है।
pingकीपअलाइव पिंग।

अनुरोध व्यक्तिगत रूप से या JSON-RPC बैच के रूप में भेजे जा सकते हैं। सर्वर Accept हेडर के आधार पर JSON या SSE के साथ प्रतिक्रिया देता है।

आर्किटेक्चर

कार्यान्वयन इन फ़ाइलों में रहता है:

  • transport.clj - HTTP ट्रांसपोर्ट। JSON-RPC अनुरोधों को पार्स करता है, प्रमाणीकरण और सत्र हेडर को मान्य करता है, ओरिजिन जांच (DNS रीबाइंडिंग सुरक्षा) लागू करता है, और उपयुक्त विधि को डिस्पैच करता है। JSON और SSE दोनों प्रतिक्रिया प्रारूपों का समर्थन करता है।

  • v2/api.clj - टूल सतह हैंडलर। ट्रांसपोर्ट को v2 टूल + संसाधन रजिस्ट्रियों से जोड़ता है और विधि डिस्पैच परिभाषित करता है (tools/list, tools/call, resources/list, resources/read, ping)।

  • v2/registry.clj - v2 टूल रजिस्ट्री। टूल deftool के माध्यम से स्व-पंजीकरण करते हैं; रजिस्ट्री दायरे जांचता है, तर्क मान्य करता है, कॉल डिस्पैच करता है, और उपयोग रिकॉर्ड करता है।

  • scope.clj - दायरा मिलान तर्क। केवल सटीक मिलान: वाइल्डकार्ड, nil दायरे, और ::unrestricted सेंटिनल किसी भी चीज़ से मेल नहीं खाते।

अनुरोध प्रवाह

MCP client
  -> POST /api/metabase-mcp (JSON-RPC)
  -> Origin + session validation
  -> Auth: OAuth bearer token or browser session
  -> Scope check against requested tool
  -> Synthetic request to Agent API endpoint
  -> Response materialized as MCP content
  -> JSON or SSE back to client

आगे पढ़ें