Skycloak
आधिकारिकSkycloak प्रबंधित Keycloak के लिए Model Context Protocol सर्वर। किसी भी MCP क्लाइंट से क्लस्टर, realms, एप्लिकेशन, SSO और उपयोगकर्ताओं को प्रबंधित करें।
Skycloak MCP के साथ आप क्या कर सकते हैं?
-
क्लस्टर अपग्रेड समीक्षा — पूछें कि कौन से Keycloak क्लस्टर अपग्रेड में पीछे हैं और
list_cluster_upgradesऔरget_cluster_upgrade_pathके माध्यम से आगे बढ़ने का अनुशंसित तरीका प्राप्त करें। -
रियल्म प्रावधान — किसी विशिष्ट क्लस्टर पर कॉन्फ़िगर किए गए आइडेंटिटी प्रोवाइडर के साथ एक स्टेजिंग रियल्म बनाएं,
create_realmऔरcreate_identity_providerका उपयोग करके। -
उपयोगकर्ता गतिविधि ऑडिट — पता लगाएं कि हाल ही में किसे रियल्म में जोड़ा गया था और एडमिन परिवर्तनों की समीक्षा करें,
list_realm_usersऔरquery_eventsका लाभ उठाते हुए। -
SIEM एकीकरण सेटअप — एक गंतव्य कॉन्फ़िगर करें जो एडमिन इवेंट्स को बाहरी वेबहुक पर अग्रेषित करता है,
create_siem_destinationऔरtest_siem_destinationका उपयोग करके। -
थीम सामग्री प्रतिस्थापन — कस्टम थीम के आर्काइव को उसके असाइनमेंट खोए बिना स्थान पर अपडेट करें, पुष्टि के साथ
update_theme_contentके माध्यम से। -
कस्टम डोमेन रूटिंग — एक कस्टम डोमेन जोड़ें, बनाने के लिए DNS रिकॉर्ड प्राप्त करें, उन्हें सत्यापित करें, और
create_domainऔरverify_domainका उपयोग करके रियल्म में ट्रैफ़िक रूट करें।
दस्तावेज़
skycloak-mcp
Skycloak (प्रबंधित Keycloak) के लिए आधिकारिक Model Context Protocol सर्वर: किसी भी MCP क्लाइंट (Claude Desktop, Claude Code, Cursor) से अपने क्लस्टर, रियल्म, एप्लिकेशन और SSO प्रबंधित करें।
स्थिति: प्रारंभिक रिलीज़। टूल कवरेज बढ़ रही है; उपलब्ध सुविधाओं के लिए चेंजलॉग देखें।
त्वरित आरंभ
claude mcp add --transport http skycloak https://mcp.skycloak.io
कोई API कुंजी नहीं, कोई क्लाइंट ID नहीं, कोई कॉन्फ़िगरेशन नहीं। आपका ब्राउज़र खुलता है, आप Skycloak में साइन इन करते हैं, और टूल दिखाई देते हैं। कोई भी MCP क्लाइंट जो स्ट्रीमेबल HTTP का समर्थन करता है, उसी तरह काम करता है: उसे केवल URL दें और कुछ और नहीं।
फिर कुछ पूछें:
- "मेरे कौन से Keycloak क्लस्टर अपग्रेड में पीछे हैं?"
- "EU क्लस्टर पर Google और GitHub साइन-इन के साथ एक स्टेजिंग रियल्म बनाएं।"
- "पिछले सप्ताह प्रोडक्शन रियल्म में किसे जोड़ा गया?"
- "एक SIEM गंतव्य सेट करें जो एडमिन इवेंट्स को हमारे Datadog वेबहुक पर अग्रेषित करे।"
प्रमाणीकरण और सुरक्षा
- होस्टेड HTTP, OAuth के साथ (कॉन्फ़िगर करने के लिए कोई क्रेडेंशियल नहीं)। अपने क्लाइंट को बिना किसी हेडर के
https://mcp.skycloak.ioपर इंगित करें। सर्वर401का उत्तर/.well-known/oauth-protected-resourceपर अपने RFC 9728 मेटाडेटा के संकेत के साथ देता है, क्लाइंट Skycloak लॉगिन रियल्म के विरुद्ध ब्राउज़र प्राधिकरण-कोड प्रवाह चलाता है, और प्राप्त एक्सेस टोकन को एक अल्पकालिक, वर्कस्पेस-स्कोप्ड API कुंजी के लिए विनिमय किया जाता है जिस पर सत्र चलता है। कुंजी एक घंटे तक चलती है और स्वचालित रूप से नवीनीकृत होती है। आपके क्लाइंट कॉन्फ़िगरेशन में कुछ भी संग्रहीत नहीं होता है। - होस्टेड HTTP, API कुंजी के साथ। Skycloak डैशबोर्ड में एक कुंजी बनाएं और इसे
Authorization: Bearer <key>(याAPI-Key: <key>) के रूप में भेजें। प्रत्येक अनुरोध अपना स्वयं का क्रेडेंशियल रखता है और केवल उस क्रेडेंशियल के वर्कस्पेस के रूप में कार्य करता है। सर्वर कोई सत्र स्थिति नहीं रखता है, इसलिए एक अनुरोध कभी भी किसी अन्य कॉलर की स्थिति प्राप्त नहीं करता है। कुंजियाँ उपयोग से पहले सत्यापित नहीं की जाती हैं: Skycloak API ही प्राधिकरण है, इसलिए एक अमान्य कुंजी कनेक्ट समय के बजाय पहले टूल कॉल पर401के रूप में सामने आती है। - टूल आपकी भूमिका से मेल खाते हैं। OAuth पर, टूल सूची को सत्र के स्कोप की अनुमति के अनुसार छोटा किया जाता है, इसलिए एक केवल-पढ़ने वाला वर्कस्पेस सदस्य उन लेखन टूल को नहीं देखता है जो
403का उत्तर देंगे। API कुंजी के साथ पूरी सतह पंजीकृत होती है, क्योंकि कुंजी के स्कोप सर्वर को दिखाई नहीं देते हैं, और एक अनधिकृत कॉल API से403के रूप में सामने आती है। - स्थानीय stdio।
skycloak-mcp initचलाएं और अपने ब्राउज़र में अनुमोदन करें (OAuth 2.0 डिवाइस प्राधिकरण प्रवाह)। यह एक वर्कस्पेस-स्कोप्ड API कुंजी बनाता है, इसे आपके ऑपरेटिंग-सिस्टम कीचेन में संग्रहीत करता है, और आपके डिफ़ॉल्ट वर्कस्पेस का स्वचालित रूप से पता लगाता है (दूसरा चुनने के लिए--workspace <id>पास करें)।skycloak-mcp logoutसंग्रहीत कुंजी को हटा देता है। - हेडलेस / CI। ब्राउज़र को पूरी तरह से छोड़ने के लिए
SKYCLOAK_API_KEYपर्यावरण चर सेट करें (Skycloak डैशबोर्ड में एक कुंजी बनाएं)। यह हमेशा कीचेन पर प्राथमिकता लेता है। - लेखन आपके क्रेडेंशियल द्वारा नियंत्रित होते हैं, किसी फ़्लैग से नहीं।
https://mcp.skycloak.ioपर होस्टेड सर्वर लेखन-सक्षम चलता है, और आप वास्तव में जो बदल सकते हैं वह आपकी कुंजी के स्कोप और आपकी वर्कस्पेस भूमिका से सीमित है: एक केवल-पढ़ने वाला सदस्य कुछ भी परिवर्तित नहीं कर सकता, चाहे टूल सूची कुछ भी कहे। सत्र के लिए केवल-पढ़ने वाली टूल सतह को बाध्य करने के लिए URL में?readonly=trueजोड़ें। स्थानीय बाइनरी विपरीत दिशा में है और जब तक--allow-writesके साथ प्रारंभ नहीं किया जाता, कोई लेखन टूल पंजीकृत नहीं करता है। - क्लस्टर क्रेडेंशियल वैकल्पिक हैं।
get_cluster_credentialsएक क्लस्टर के Keycloak एडमिन क्रेडेंशियल लौटाता है, जिसे कुंजी रखने वाला सहायक तब देख सकता है, इसलिएinitडिफ़ॉल्ट रूप से उस स्कोप का अनुरोध नहीं करता है। इसे धारण करने वाली कुंजी का उपयोग करें: डैशबोर्ड में एक बनाएं, या stdio परskycloak-mcp init --allow-credentialsके साथ साइन इन करें। इसके बिना टूल एक 403 लौटाता है जो दोनों मार्गों की व्याख्या करता है। - विनाशकारी टूल के लिए पुष्टि आवश्यक है: उदाहरण के लिए, एक रियल्म को हटाने के लिए एक स्पष्ट
confirm=trueतर्क की आवश्यकता होती है। - अनुरोध आपकी Skycloak योजना के अनुसार दर-सीमित हैं;
429प्रतिक्रिया पर सर्वरRetry-Afterसतह पर लाता है।
टूल
137 टूल: 60 केवल-पढ़ने और 77 लेखन। केवल-पढ़ने वाले टूल हमेशा उपलब्ध होते हैं। होस्टेड सर्वर पर लेखन टूल भी पंजीकृत होते हैं और आपके क्रेडेंशियल के स्कोप द्वारा नियंत्रित होते हैं; स्थानीय बाइनरी उन्हें केवल तब पंजीकृत करता है जब --allow-writes के साथ प्रारंभ किया जाता है।
टूल नामों में skycloak_ उपसर्ग होता है जिसे नीचे दी गई तालिका छोड़ देती है, इसलिए list_clusters आपके क्लाइंट में skycloak_list_clusters है।
| क्षेत्र | केवल-पढ़ने | लेखन (--allow-writes) |
|---|---|---|
| क्लस्टर | list_clusters, get_cluster, list_cluster_locations, list_cluster_types, list_cluster_features, list_cluster_versions, list_cluster_upgrades, get_cluster_upgrade_path, get_cluster_credentials, get_cluster_insights, get_cluster_maintenance_window | create_cluster, update_cluster, delete_cluster, cancel_cluster_upgrade, restart_cluster_instances, set_cluster_maintenance_window, delete_cluster_maintenance_window |
| एज सुरक्षा | get_cluster_security, list_cluster_captcha_domains | update_cluster_security, add_cluster_captcha_domain, remove_cluster_captcha_domain |
| रियल्म | list_realms, get_realm | create_realm, update_realm, delete_realm |
| एप्लिकेशन | list_applications, get_application, list_application_roles, list_application_sessions | create_application, update_application, delete_application, assign_application_role, remove_application_role, rotate_application_secret |
| पहचान प्रदाता | list_identity_providers, get_identity_provider, list_identity_provider_templates, discover_oidc | create_identity_provider (OIDC), update_identity_provider, delete_identity_provider, test_identity_provider |
| उपयोगकर्ता, भूमिकाएँ और समूह | list_realm_users, get_realm_user, list_realm_roles, get_realm_role, list_realm_groups, get_realm_group, list_realm_group_members, list_user_roles, list_user_groups | create_realm_user, update_realm_user, delete_realm_user, create_realm_role, update_realm_role, delete_realm_role, create_realm_group, update_realm_group, delete_realm_group, assign_realm_user_role, remove_realm_user_role, add_realm_user_to_group, remove_realm_user_from_group |
| कस्टम डोमेन | list_domains, get_domain, list_domain_routes, get_domain_route | create_domain, verify_domain, delete_domain, create_domain_route, update_domain_route, delete_domain_route |
| ब्रांडिंग और थीम | list_themes, get_theme, get_theme_assignment, get_client_theme_assignment, get_login_branding, get_email_branding, download_theme_content, get_theme_settings | set_theme_assignment, set_client_theme_assignment, update_theme, update_theme_content, update_theme_settings, delete_theme, upsert_login_branding, delete_login_branding, upsert_email_branding, delete_email_branding |
| एक्सटेंशन | list_extensions, list_cluster_extensions | install_extension, upgrade_extension, update_extension, uninstall_extension, delete_extension |
| SMTP | get_smtp | upsert_smtp, delete_smtp, test_smtp |
| निर्यात और लॉग | list_exports, get_export, get_logs, get_security_logs, query_events | create_export, delete_export, export_cluster_events |
| रियल्म आयात और निर्यात | get_realm_export, get_realm_import | create_realm_export, create_realm_import, create_realm_import_upload_url |
| SIEM | list_siem_destinations, get_siem_destination | create_siem_destination, update_siem_destination, delete_siem_destination, test_siem_destination |
| वेबहुक | list_webhook_event_types, list_webhook_subscriptions, get_webhook_subscription | create_webhook_subscription, update_webhook_subscription, delete_webhook_subscription, test_webhook_subscription |
परंपराएँ: विनाशकारी टूल (delete_*, uninstall_extension, cancel_cluster_upgrade, update_theme_content, update_theme_settings, restart_cluster_instances) को confirm=true की आवश्यकता होती है। update_theme_settings वर्कस्पेस के लिए exact_theme_names को चालू या बंद करता है; कॉलर की API कुंजी वर्कस्पेस स्वामी या एडमिन के लिए बनाई गई होनी चाहिए, अन्यथा themes:write के साथ भी 403 मिलता है। इसे चालू करने से मौजूदा थीम पृष्ठभूमि में उनके सटीक सेवा नामों पर स्थानांतरित हो जाती हैं; एक थीम जिसकी सामग्री उसके सटीक नाम के तहत बदली गई थी, restart_cluster_instances उस क्लस्टर के Keycloak इंस्टेंस को रोल करने तक get_theme/list_themes/update_theme_content से restart_required: true रिपोर्ट करती है। एक पुनरारंभ तुरंत लागू करने के बजाय क्लस्टर के रखरखाव विंडो तक स्थगित किया जा सकता है, जिसे deferred: true और, जब ज्ञात हो, next_window के रूप में रिपोर्ट किया जाता है। create_cluster अतुल्यकालिक है: क्लस्टर के available होने तक get_cluster को पोल करें। create_domain उन DNS रिकॉर्ड्स को लौटाता है जिन्हें ग्राहक को बनाना होगा; verify_domain एक DNS जाँच ट्रिगर करता है। set_theme_assignment प्रति Keycloak थीम प्रकार एक कस्टम थीम सक्रिय करता है (खाली स्ट्रिंग अंतर्निहित डिफ़ॉल्ट पर रीसेट करती है)। update_theme_content एक थीम के संग्रह को स्थान पर बदल देता है (content_base64 में base64 ZIP या Keycloakify JAR), थीम की ID, नाम और रियल्म और एप्लिकेशन असाइनमेंट बनाए रखते हुए, इसलिए एक थीम को संपादित करने का मतलब अब उसे हटाना और फिर से अपलोड करना नहीं है; इसे confirm=true की आवश्यकता होती है क्योंकि जिस संग्रह को यह अधिलेखित करता है वह पुनर्प्राप्त करने योग्य नहीं है, और update_theme अभी भी केवल नाम, विवरण और संस्करण बदलता है। उस कॉल को कैसे किया जाता है, इसके लिए docs/theme-content-update.md देखें। update_cluster_security CAPTCHA सेटिंग्स को अछूता छोड़ देता है। रियल्म आयात/निर्यात एक रियल्म के कॉन्फ़िगरेशन को स्थानांतरित करता है और create_export से अलग है, जो पूरे क्लस्टर के डेटाबेस को डंप करता है: दोनों अतुल्यकालिक हैं, और रियल्म संग्रह हमेशा एन्क्रिप्टेड होता है, इसलिए इसे निर्यात करने के लिए उपयोग किया गया पासवर्ड इसे फिर से आयात करने के लिए आवश्यक है। एक रियल्म को मौजूदा निर्यात से सीधे आयात किया जा सकता है (source_export_id) या अपलोड किए गए संग्रह से (create_realm_import_upload_url, PUT, फिर upload_s3_key); आयात एक रियल्म बनाता है और अधिलेखित करने के बजाय नाम टकराव से इनकार करता है, और confirm=true की आवश्यकता होती है क्योंकि यह उपयोगकर्ताओं और क्रेडेंशियल्स को अपने साथ लाता है।
प्रॉम्प्ट
आठ प्रॉम्प्ट आपको उस टूल सतह में एक प्रारंभिक बिंदु देते हैं। क्लाइंट उन्हें स्लैश कमांड या सुझाए गए कार्यों के रूप में सतह पर लाते हैं; प्रत्येक तर्क लेता है (रियल्म, क्लस्टर, समय विंडो) और मॉडल को सही क्रम में सही टूल के माध्यम से चलाता है।
| प्रॉम्प्ट | यह क्या करता है |
|---|---|
audit_self_registration | हर उस रियल्म को खोजें जो अभी भी स्व-पंजीकरण की अनुमति देता है, एक क्लस्टर या उन सभी में |
review_upgrades | अपने Keycloak संस्करण में पीछे रहने वाले क्लस्टरों को पहचानें और अपग्रेड पथ निर्धारित करें |
triage_failed_logins | एक रियल्म के लिए हाल के असफल लॉगिन खींचें और उन्हें स्रोत IP द्वारा समूहित करें |
review_identity_providers | एक रियल्म के SSO कनेक्शन सूचीबद्ध करें और जाँचें कि कोई विशिष्ट सक्षम है या नहीं |
review_admin_changes | दिखाएँ कि हाल ही में एक रियल्म में किसने क्या बदला, लॉगिन और सुरक्षा सेटिंग्स पर केंद्रित |
provision_environment | एक क्लस्टर बनाएं, एक रियल्म जोड़ें, और एक पहचान प्रदाता कनेक्ट करें, प्रत्येक चरण की पुष्टि करते हुए |
set_up_custom_domain | एक कस्टम डोमेन जोड़ें, सटीक DNS रिकॉर्ड वापस दें, सत्यापित करें, और इसे एक रियल्म पर रूट करें |
rotate_client_secret | एक एप्लिकेशन के क्लाइंट सीक्रेट को पुनर्जीवित करें, पहले विस्फोट त्रिज्या स्पष्ट करते हुए |
प्रॉम्प्ट उसी तरह नियंत्रित होते हैं जैसे वे जिन टूल का नाम लेते हैं: तीन जो परिवर्तन करते हैं, केवल उन सत्रों को दिए जाते हैं जो उनके संदर्भित लेखन टूल को कॉल कर सकते हैं, और उनके निर्देश मॉडल को बताते हैं कि कुछ भी बदलने से पहले आपसे पुष्टि करें। विनाशकारी टूल पर confirm=true आवश्यकता अभी भी शीर्ष पर लागू होती है।
कौशल
जहाँ एक प्रॉम्प्ट एक प्रारंभिक बिंदु है, वहीं एक कौशल एक पूर्ण परिचालन प्लेबुक है जिसे मॉडल मांग पर लोड करता है। सर्वर चार भेजता है, ड्राफ्ट SEP-2640 Skills extension पर परोसा जाता है: यह अपनी क्षमताओं में io.modelcontextprotocol/skills घोषित करता है, skills/list और skills/get का उत्तर देता है, और प्रत्येक SKILL.md को skill://<name>/SKILL.md पर एक सामान्य संसाधन के रूप में अपनी सूची प्रविष्टि में sha256 डाइजेस्ट के साथ परोसता है। OpenAI का प्लगइन निर्देशिका कौशल को ठीक इसी आकार में आयात करता है।
| कौशल | यह क्या दर्शाता है |
|---|---|
auth-incident-triage | "उपयोगकर्ता लॉगिन नहीं कर सकते" की जांच करें: प्लेटफ़ॉर्म आउटेज को हमलों और कॉन्फ़िगरेशन परिवर्तनों से अलग करें, इवेंट्स, WAF लॉग्स और क्लस्टर स्वास्थ्य का उपयोग करके। केवल-पठनीय |
enterprise-sso-rollout | किसी एंटरप्राइज़ IdP को रियल्म में एंड-टू-एंड जोड़ें: issuer सत्यापन, अपस्ट्रीम ऐप पंजीकरण, ब्रोकर कॉन्फ़िगरेशन, कनेक्शन परीक्षण, और वास्तविक लॉगिन इवेंट्स के विरुद्ध सत्यापन |
keycloak-migration-doctor | Keycloak निर्यात, आयात या माइग्रेशन को उन बाधाओं के विरुद्ध प्रीफ़्लाइट करें जो सपोर्ट वास्तव में देखता है (स्क्रिप्ट पॉलिसी, लेगेसी /auth पथ, आंशिक-निर्यात अपेक्षाएँ), और वास्तविक error_message पढ़कर विफल जॉब का निदान करें, सामान्य डैशबोर्ड सूचना के बजाय |
keycloak-upgrade-readiness | संस्करण विचलन का आकलन करें, पता लगाएँ कि नया Keycloak संस्करण क्या तोड़ता है (एक्सटेंशन, थीम), और रोलबैक योजना के रूप में निर्यात के साथ पर्यावरणों में रोलआउट का क्रम निर्धारित करें |
कौशल उन्हीं गेटिंग नियमों का पालन करते हैं जो उनके नाम वाले टूल्स का करते हैं: राइट टूल्स के आसपास बने तीन वर्कफ़्लो केवल-पठनीय सत्रों से रोके जाते हैं, और एक स्कोप्ड सत्र को केवल वही कौशल दिया जाता है जिसके टूल्स उसके पास वास्तव में होते हैं। स्रोत internal/tools/skills/ में रहते हैं, प्रति कौशल एक निर्देशिका, मानक Agent Skills प्रारूप में, इसलिए वे सीधे स्थानीय कौशल निर्देशिका में कॉपी करने पर भी काम करते हैं।
कनेक्ट करना
होस्टेड HTTP के लिए सबसे सरल मार्ग OAuth है, जिसे किसी क्रेडेंशियल की आवश्यकता नहीं होती:
claude mcp add --transport http skycloak https://mcp.skycloak.io
पहला कॉल आपका ब्राउज़र खोलता है, आप Skycloak लॉगिन पृष्ठ पर अनुमोदन करते हैं, और टूल्स दिखाई देते हैं। यदि आप एक से अधिक वर्कस्पेस से संबंधित हैं, तो जिसे चाहते हैं उसका नाम बताएँ:
claude mcp add --transport http skycloak "https://mcp.skycloak.io?workspace=<workspace-id>"
अन्यथा, Skycloak डैशबोर्ड में एक API कुंजी बनाएँ और अपने MCP क्लाइंट को इसे bearer टोकन के रूप में भेजने के लिए कॉन्फ़िगर करें:
claude mcp add --transport http skycloak https://mcp.skycloak.io --header "Authorization: Bearer sk_sc_XXX"
यह .claude.json में निम्नलिखित जोड़ता है:
{
"mcpServers": {
"skycloak": {
"type": "http",
"url": "https://mcp.skycloak.io",
"headers": {
"Authorization": "Bearer sk_sc_XXX"
}
}
}
}
स्थानीय stdio के लिए, एक बार साइन इन करें, फिर अपने क्लाइंट को skycloak-mcp run पर इंगित करें:
skycloak-mcp init # one-time browser sign-in; stores a key in your keychain
Claude Desktop / Cursor (स्थानीय, stdio):
{
"mcpServers": {
"skycloak": {
"command": "skycloak-mcp",
"args": ["run", "--transport", "stdio"]
}
}
}
Claude Code:
claude mcp add skycloak -- skycloak-mcp run --transport stdio
हेडलेस / CI (बिना ब्राउज़र) के लिए, init छोड़ें और इसके बजाय कुंजी पास करें: कॉन्फ़िगरेशन में "env": { "SKYCLOAK_API_KEY": "sk_sc_..." } जोड़ें, या claude mcp add skycloak --env SKYCLOAK_API_KEY=sk_sc_... -- skycloak-mcp run --transport stdio।
--allow-writes केवल तभी जोड़ें जब आप परिवर्तन करने का इरादा रखते हैं (skycloak-mcp init --allow-writes के साथ साइन इन करें, या राइट-स्कोप्ड कुंजी का उपयोग करें)।
होस्टेड HTTP URL में ?readonly=true जोड़ें ताकि उस HTTP सत्र के लिए केवल केवल-पठनीय टूल्स उजागर हों, या राइट-सक्षम टूल सतह का अनुरोध करने के लिए ?readonly=false। क्वेरी पैरामीटर डिफ़ॉल्ट रूप से false है, लेकिन राइट टूल्स केवल तभी पंजीकृत होते हैं जब सर्वर --allow-writes के साथ शुरू किया गया हो।
?workspace=<uuid> जोड़ें ताकि चुना जा सके कि OAuth सत्र किस वर्कस्पेस पर कार्य करता है। यह केवल तभी आवश्यक है जब आप एक से अधिक से संबंधित हों; एकल वर्कस्पेस के साथ सर्वर इसे आपके लिए चुनता है, और यदि आप कई से संबंधित हैं और किसी का नाम नहीं देते हैं, तो कनेक्शन उन्हें सूचीबद्ध करने वाले संदेश के साथ विफल हो जाता है।
HTTP ट्रांसपोर्ट चलाना
skycloak-mcp run --transport http --http-addr :8080
इसे अपने स्वयं के क्रेडेंशियल की आवश्यकता नहीं होती: कॉल करने वाले अपने स्वयं के प्रति अनुरोध प्रदान करते हैं, इसलिए तैनाती के समय कुछ भी इंजेक्ट नहीं किया जाता है। GET /healthz और GET /readyz अनप्रमाणित हैं और केवल रिपोर्ट करते हैं कि प्रक्रिया चालू है; वे जानबूझकर Skycloak API की जांच नहीं करते हैं, इसलिए एक अपस्ट्रीम ब्लिप एक साथ हर रेप्लिका की जांच को विफल नहीं कर सकता। सर्वर कोई सत्र स्थिति नहीं रखता है, इसलिए रेप्लिका को सत्र आत्मीयता की आवश्यकता नहीं होती और उन्हें स्वतंत्र रूप से स्केल या रोल किया जा सकता है। SIGTERM नए कनेक्शन रोकता है और चल रहे कॉल्स को समाप्त करता है।
OAuth पथ तब चालू होता है जब SKYCLOAK_ISSUER और SKYCLOAK_DASHBOARD_URL सेट होते हैं, जो डिफ़ॉल्ट रूप से होते हैं। GET /.well-known/oauth-protected-resource तब अनप्रमाणित रूप से परोसा जाता है, जो रियल्म को प्राधिकरण सर्वर के रूप में नामित करता है। इसका resource मान SKYCLOAK_PUBLIC_URL से लिया जाता है जब सेट होता है, और अन्यथा अनुरोध के स्वयं के Host और स्कीम से, इसलिए एक इनग्रेस के पीछे एकल-होस्ट तैनाती को अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता नहीं होती। स्कीम X-Forwarded-Proto से आती है जब मौजूद होती है, और अन्यथा लूपबैक होस्ट के अलावा किसी भी चीज़ के लिए https पर डिफ़ॉल्ट होती है, क्योंकि TLS अपस्ट्रीम पर समाप्त होता है और http:// पहचानकर्ता प्रकाशित करना उस URL से मेल नहीं खाएगा जिससे क्लाइंट जुड़ा था। SKYCLOAK_PUBLIC_URL सेट करें यदि आपका इनग्रेस Host को फिर से लिखता है। दस्तावेज़ openid profile email को अपने scopes_supported के रूप में भी सूचीबद्ध करता है, और WWW-Authenticate चुनौती उन्हें scope पैरामीटर के रूप में दोहराती है, इसलिए दोनों में से कोई भी पढ़ने वाला क्लाइंट उन्हें रियल्म से पूछता है: openid आवश्यक है, क्योंकि टोकन विनिमय डैशबोर्ड को Keycloak के userinfo एंडपॉइंट को कॉल करने के लिए बनाता है और Keycloak इसके बिना दिए गए टोकन को अस्वीकार करता है। एक टोकन जो इसके बिना आता है उसे सत्यापन पर 401 और चुनौती के साथ अस्वीकार कर दिया जाता है, न कि उस विनिमय तक ले जाया जाता है जो सफल नहीं हो सकता, इसलिए पहले से अनुदान रखने वाला क्लाइंट पुनः प्रयास करना बंद कर देता है और फिर से साइन इन करता है। issuer या डैशबोर्ड चर में से किसी को खाली करने से OAuth पूरी तरह बंद हो जाता है, और सर्वर केवल API कुंजी के लिए चुनौती देने पर वापस चला जाता है और कुछ और नहीं।
OPENAI_APPS_CHALLENGE_TOKEN OpenAI के प्लगइन-निर्देशिका डोमेन सत्यापन टोकन को /.well-known/openai-apps-challenge पर परोसता है, सादे पाठ के रूप में और कुछ और नहीं। अनसेट होने पर, मार्ग पंजीकृत नहीं होता और पथ 404 देता है।
स्टार्टअप हल किए गए वायरिंग के साथ एक पंक्ति लॉग करता है (oauth=, issuer=, dashboard=, public_url=, endpoint=, allow_writes=), इसलिए एक गलत कॉन्फ़िगर की गई तैनाती को पुनः तैनाती के बिना देखा जा सकता है। OAuth पथ पर अस्वीकार किया गया हर अनुरोध एक पंक्ति लॉग करता है जो विफल हुए चरण का नाम देता है (verify, exchange या scopes), कॉल करने वाले को मिली स्थिति, और अंतर्निहित त्रुटि। एक सत्यापन विफलता उस जांच को जोड़ती है जिसने टोकन को अस्वीकार किया (expired, wrong_issuer, bad_signature, unknown_key_id, wrong_token_type, no_openid_scope, और इसी तरह); एक विनिमय विफलता डैशबोर्ड की स्थिति और कॉल किए गए होस्ट को जोड़ती है। कॉल करने वाला सत्यापित होने के बाद टोकन के विषय के रूप में दिखाई देता है, और कभी भी क्रेडेंशियल के रूप में नहीं: एक्सेस टोकन, Authorization हेडर और मिंट की गई API कुंजी कभी लॉग नहीं होते।
कॉन्फ़िगरेशन
| Env var | डिफ़ॉल्ट |
|---|---|
SKYCLOAK_API_KEY | कोई नहीं (stdio के लिए वैकल्पिक; HTTP क्लाइंट इसके बजाय API-Key हेडर प्रदान करते हैं) |
SKYCLOAK_ENDPOINT | https://api.skycloak.io |
SKYCLOAK_API_VERSION | वर्तमान API संस्करण |
SKYCLOAK_ISSUER | https://login.app.skycloak.io/realms/skycloak (CLI साइन-इन, और प्राधिकरण सर्वर जिसके विरुद्ध HTTP ट्रांसपोर्ट टोकन सत्यापित करता है) |
SKYCLOAK_CLIENT_ID | skycloak-mcp (CLI डिवाइस फ्लो केवल) |
SKYCLOAK_DASHBOARD_URL | https://app.skycloak.io (CLI कुंजियाँ और HTTP सत्र कुंजियाँ मिंट करता है) |
SKYCLOAK_PUBLIC_URL | कोई नहीं (प्रत्येक अनुरोध से व्युत्पन्न; इसे सेट करें जब इनग्रेस Host को फिर से लिखता है) |
OPENAI_APPS_CHALLENGE_TOKEN | OpenAI के प्लगइन-निर्देशिका सत्यापन टोकन को /.well-known/openai-apps-challenge पर परोसता है। अनसेट होने पर, वह पथ 404 देता है। |
कमांड: init (ब्राउज़र साइन-इन), run (सर्व करें), logout (संग्रहीत कुंजी हटाएँ)। init --workspace <id>, --allow-writes, --allow-credentials, और --ttl-days (डिफ़ॉल्ट 90) स्वीकार करता है।
| फ़्लैग | डिफ़ॉल्ट | विवरण |
|---|---|---|
--transport | stdio | stdio या http |
--http-addr | :8080 | HTTP ट्रांसपोर्ट के लिए सुनने का पता |
--allow-writes | false | stdio के लिए परिवर्तनकारी टूल्स सक्षम करें और readonly=false वाले HTTP सत्रों को राइट टूल्स पंजीकृत करने की अनुमति दें |
विकास
make build # build the server binary
make test # unit tests
make run # run on stdio for local testing
make inspector # MCP Inspector against the local binary
make lint # golangci-lint
make generate # regenerate the API client from the OpenAPI spec
internal/apiclient के अंतर्गत API क्लाइंट oapi-codegen के साथ Skycloak OpenAPI विनिर्देश से उत्पन्न होता है।
API के साथ सिंक में रहना
internal/apiclient में क्लाइंट oapi-codegen के साथ internal/apiclient/openapi.yaml से उत्पन्न होता है; इसे ताज़ा करने के लिए make generate चलाएँ। CI विफल हो जाता है यदि प्रतिबद्ध उत्पन्न कोड विनिर्देश से विचलित होता है। अनुरोधों को 429/5xx पर Retry-After-जागरूक बैकऑफ़ के साथ पुनः प्रयास किया जाता है।
वितरण
प्रत्येक टैग पर GitHub बाइनरी और एक ghcr.io/sky-cloak/skycloak-mcp कंटेनर छवि के रूप में जारी किया गया, और MCP Registry पर io.skycloak/skycloak-mcp के रूप में प्रकाशित। अधिकांश लोगों को किसी की आवश्यकता नहीं होती: होस्टेड सर्वर को कोई इंस्टॉल की आवश्यकता नहीं होती।
सुरक्षा
कृपया कमजोरियों की निजी रूप से रिपोर्ट करें। SECURITY.md देखें।
योगदानकर्ता
Skycloak में Guilliano Molaire, Neville Omangi और Aphilas द्वारा निर्मित। रिपॉजिटरी इतिहास को खोले जाने पर स्क्वैश किया गया था, इसलिए कमिट लॉग यह प्रतिबिंबित नहीं करता कि किसने क्या लिखा।
लाइसेंस
Apache-2.0। internal/apiclient/openapi.yaml में OpenAPI विवरण Skycloak प्लेटफ़ॉर्म API से उत्पन्न होता है और (c) Skycloak है; इसे यहाँ शामिल किया गया है ताकि क्लाइंट उत्पन्न और सत्यापित किया जा सके। NOTICE देखें।