Skycloak

ทางการ

เซิร์ฟเวอร์ Model Context Protocol สำหรับ Skycloak ที่จัดการ Keycloak จัดการคลัสเตอร์ รีลึม แอปพลิเคชัน SSO และผู้ใช้จากไคลเอนต์ MCP ใด ๆ

GitHubลองใช้ MCP นี้ผู้สนับสนุน

คุณทำอะไรได้บ้างด้วย Skycloak MCP?

จัดการคลัสเตอร์ Skycloak (Keycloak ที่มีการจัดการ) รีลึม และ SSO ของคุณจากไคลเอนต์ MCP ใดก็ได้

  • การตรวจสอบการอัปเกรดคลัสเตอร์ — สอบถามว่าคลัสเตอร์ใดที่ยังไม่ได้รับการอัปเกรด Keycloak และรับเส้นทางการอัปเกรดผ่าน list_cluster_upgrades และ get_cluster_upgrade_path
  • การจัดเตรียมรีลึม — สร้างรีลึมพร้อมการลงชื่อเข้าใช้ด้วย Google และ GitHub โดยใช้ create_realm และ create_identity_provider
  • การส่งต่อ SIEM — ตั้งค่าปลายทาง SIEM ที่ส่งต่อเหตุการณ์ผู้ดูแลระบบไปยังเว็บฮุค Datadog ผ่าน create_siem_destination
  • การตั้งค่าโดเมนที่กำหนดเอง — เพิ่มโดเมนที่กำหนดเอง รับระเบียน DNS และตรวจสอบด้วย create_domain และ verify_domain

เอกสาร

skycloak-mcp

Smithery

เซิร์ฟเวอร์ Model Context Protocol อย่างเป็นทางการสำหรับ Skycloak (Keycloak ที่มีการจัดการ): จัดการคลัสเตอร์, realm, แอปพลิเคชัน และ SSO ของคุณจากไคลเอนต์ MCP ใดก็ได้ (Claude Desktop, Claude Code, Cursor)

สถานะ: รุ่นเผยแพร่ช่วงแรก ครอบคลุมเครื่องมือเพิ่มขึ้นเรื่อย ๆ ดู changelog สำหรับสิ่งที่พร้อมใช้งาน

เริ่มต้นอย่างรวดเร็ว

claude mcp add --transport http skycloak https://mcp.skycloak.io

ไม่ต้องใช้ API key, ไม่ต้องใช้ client ID, ไม่ต้องกำหนดค่าอะไร เบราว์เซอร์ของคุณจะเปิดขึ้น คุณลงชื่อเข้าใช้ Skycloak แล้วเครื่องมือต่าง ๆ ก็จะปรากฏ ไคลเอนต์ MCP ใดก็ตามที่รองรับ streamable HTTP ทำงานในลักษณะเดียวกัน: ให้ URL แค่นั้นก็พอ

จากนั้นลองขออะไรบางอย่าง:

  • "คลัสเตอร์ Keycloak ของฉันตัวไหนที่ตามหลังเรื่องอัปเกรดอยู่?"
  • "สร้าง staging realm บนคลัสเตอร์ EU พร้อมให้ลงชื่อเข้าด้วย Google และ GitHub"
  • "ใครถูกเพิ่มเข้า production realm ในสัปดาห์ที่ผ่านมาบ้าง?"
  • "ตั้งค่า SIEM destination ที่ส่งต่อ admin events ไปยัง Datadog webhook ของเรา"

การรับรองความถูกต้องและความปลอดภัย

  • Hosted HTTP พร้อม OAuth (ไม่ต้องกำหนดค่า credential ใด ๆ) ชี้ไคลเอนต์ของคุณไปที่ https://mcp.skycloak.io โดยไม่ต้องใส่ header เซิร์ฟเวอร์ตอบกลับ 401 พร้อมชี้ไปยัง metadata ตาม RFC 9728 ที่ /.well-known/oauth-protected-resource ไคลเอนต์จะรัน browser authorization-code flow กับ Skycloak login realm และ access token ที่ได้จะถูกแลกเป็น API key อายุสั้นที่จำกัดขอบเขตตาม workspace ซึ่งเซสชันจะใช้ในการทำงาน key มีอายุหนึ่งชั่วโมงและต่ออายุอัตโนมัติ ไม่มีการเก็บอะไรไว้ในการกำหนดค่าไคลเอนต์ของคุณ
  • Hosted HTTP พร้อม API key สร้าง key ใน Skycloak dashboard แล้วส่งเป็น Authorization: Bearer <key> (หรือ API-Key: <key>) ทุกคำขอถือ credential ของตัวเองและทำหน้าที่เฉพาะใน workspace ของ credential นั้นเท่านั้น เซิร์ฟเวอร์ไม่เก็บสถานะเซสชัน ดังนั้นคำขอหนึ่งจะไม่สืบทอดสิทธิ์ของผู้เรียกคนอื่น key จะไม่ถูกตรวจสอบก่อนใช้งาน: Skycloak API เป็นผู้ตัดสิน ดังนั้น key ที่ไม่ถูกต้องจะแสดงเป็น 401 ในการเรียกเครื่องมือครั้งแรกแทนที่จะเป็นตอนเชื่อมต่อ
  • เครื่องมือตรงกับบทบาทของคุณ ผ่าน OAuth รายการเครื่องมือจะถูกตัดให้เหลือเฉพาะที่ขอบเขตของเซสชันอนุญาต ดังนั้นสมาชิก workspace แบบอ่านอย่างเดียวจะไม่เห็นเครื่องมือเขียนที่อาจตอบ 403 ด้วย API key พื้นผิวทั้งหมดจะถูกลงทะเบียน เนื่องจากเซิร์ฟเวอร์ไม่เห็นขอบเขตของ key และการเรียกที่ไม่ได้รับอนุญาตจะแสดงเป็น 403 จาก API
  • Local stdio รัน skycloak-mcp init แล้วอนุมัติในเบราว์เซอร์ของคุณ (OAuth 2.0 device authorization flow) มันจะสร้าง API key ที่จำกัดขอบเขตตาม workspace เก็บไว้ใน keychain ของระบบปฏิบัติการ และตรวจจับ workspace เริ่มต้นของคุณโดยอัตโนมัติ (ส่ง --workspace <id> เพื่อเลือกอันอื่น) skycloak-mcp logout ลบ key ที่เก็บไว้
  • Headless / CI ตั้งค่าตัวแปรสภาพแวดล้อม SKYCLOAK_API_KEY (สร้าง key ใน Skycloak dashboard) เพื่อข้ามเบราว์เซอร์ทั้งหมด มันมีลำดับความสำคัญเหนือ keychain เสมอ
  • การเขียนถูกควบคุมโดย credential ของคุณ ไม่ใช่ flag เซิร์ฟเวอร์ hosted ที่ https://mcp.skycloak.io รันแบบรองรับการเขียน และสิ่งที่คุณเปลี่ยนได้จริงนั้นถูกจำกัดด้วยขอบเขตของ key และบทบาทใน workspace ของคุณ: สมาชิกแบบอ่านอย่างเดียวไม่สามารถเปลี่ยนแปลงอะไรได้ ไม่ว่ารายการเครื่องมือจะบอกอย่างไร เพิ่ม ?readonly=true ต่อท้าย URL เพื่อบังคับให้พื้นผิวเครื่องมือเป็นแบบอ่านอย่างเดียวสำหรับเซสชัน ไบนารีในเครื่องเป็นไปในทางตรงกันข้ามและไม่ลงทะเบียนเครื่องมือเขียนใด ๆ เว้นแต่จะเริ่มด้วย --allow-writes
  • Cluster credentials เป็นแบบเลือกใช้ get_cluster_credentials คืนค่า Keycloak admin credentials ของคลัสเตอร์ ซึ่งผู้ช่วยที่ถือ key อยู่จะเห็นได้ ดังนั้น init จึงไม่ขอขอบเขตนั้นโดยค่าเริ่มต้น ใช้ key ที่มีขอบเขตนี้: สร้างใน dashboard หรือผ่าน stdio ลงชื่อเข้าด้วย skycloak-mcp init --allow-credentials หากไม่มี เครื่องมือจะคืนค่า 403 ที่อธิบายทั้งสองเส้นทาง
  • เครื่องมือที่ทำลายล้างต้องมีการยืนยัน: การลบ realm เป็นต้น ต้องมีอาร์กิวเมนต์ confirm=true อย่างชัดเจน
  • คำขอถูกจำกัดอัตราตามแผน Skycloak ของคุณ; เมื่อได้รับการตอบสนอง 429 เซิร์ฟเวอร์จะแสดง Retry-After

เครื่องมือ

129 เครื่องมือ: 58 แบบอ่านอย่างเดียวและ 71 แบบเขียน เครื่องมืออ่านอย่างเดียวพร้อมใช้งานเสมอ บนเซิร์ฟเวอร์ hosted เครื่องมือเขียนก็ถูกลงทะเบียนเช่นกันและถูกจำกัดด้วยขอบเขตของ credential ของคุณ; ไบนารีในเครื่องลงทะเบียนเฉพาะเมื่อเริ่มด้วย --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_windowcreate_cluster, update_cluster, delete_cluster, cancel_cluster_upgrade, set_cluster_maintenance_window, delete_cluster_maintenance_window
ความปลอดภัยขอบget_cluster_security, list_cluster_captcha_domainsupdate_cluster_security, add_cluster_captcha_domain, remove_cluster_captcha_domain
Realmlist_realms, get_realmcreate_realm, update_realm, delete_realm
แอปพลิเคชันlist_applications, get_application, list_application_roles, list_application_sessionscreate_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_oidccreate_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_groupscreate_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_routecreate_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_contentset_theme_assignment, set_client_theme_assignment, update_theme, delete_theme, upsert_login_branding, delete_login_branding, upsert_email_branding, delete_email_branding
ส่วนขยายlist_extensions, list_cluster_extensionsinstall_extension, upgrade_extension, update_extension, uninstall_extension, delete_extension
SMTPget_smtpupsert_smtp, delete_smtp, test_smtp
การส่งออกและบันทึกlist_exports, get_export, get_logs, get_security_logs, query_eventscreate_export, delete_export, export_cluster_events
การนำเข้าและส่งออก realmget_realm_export, get_realm_importcreate_realm_export, create_realm_import, create_realm_import_upload_url
SIEMlist_siem_destinations, get_siem_destinationcreate_siem_destination, update_siem_destination, delete_siem_destination, test_siem_destination
Webhookslist_webhook_event_types, list_webhook_subscriptions, get_webhook_subscriptioncreate_webhook_subscription, update_webhook_subscription, delete_webhook_subscription, test_webhook_subscription

ข้อตกลง: เครื่องมือที่ทำลายล้าง (delete_*, uninstall_extension, cancel_cluster_upgrade) ต้องมี confirm=true create_cluster เป็นแบบ asynchronous: ให้สอบถาม get_cluster ซ้ำจนกว่าคลัสเตอร์จะเป็น available create_domain คืนค่า DNS records ที่ลูกค้าต้องสร้าง; verify_domain เรียกใช้การตรวจสอบ DNS set_theme_assignment เปิดใช้งานธีมที่กำหนดเองตามประเภทธีม Keycloak (สตริงว่างรีเซ็ตเป็นค่าเริ่มต้นในตัว) update_cluster_security ไม่แตะต้องการตั้งค่า CAPTCHA การนำเข้า/ส่งออก realm ย้ายการกำหนดค่าของ realm เดียวและแยกจาก create_export ซึ่งถ่ายโอนฐานข้อมูลทั้งคลัสเตอร์: ทั้งสองเป็นแบบ asynchronous และไฟล์เก็บถาวรของ realm ถูกเข้ารหัสเสมอ ดังนั้นรหัสผ่านที่ใช้ส่งออกจึงจำเป็นต้องใช้เพื่อนำเข้าอีกครั้ง realm สามารถนำเข้าได้โดยตรงจากไฟล์ส่งออกที่มีอยู่ (source_export_id) หรือจากไฟล์เก็บถาวรที่อัปโหลด (create_realm_import_upload_url, PUT, จากนั้น upload_s3_key); การนำเข้าจะสร้าง realm และปฏิเสธการชนกันของชื่อแทนที่จะเขียนทับ และต้องใช้ confirm=true เพราะมันนำผู้ใช้และข้อมูลประจำตัวมาด้วย

พรอมต์

พรอมต์แปดรายการให้จุดเริ่มต้นสู่พื้นผิวเครื่องมือนั้น ไคลเอนต์แสดงเป็นคำสั่งเครื่องหมายทับหรือการกระทำที่แนะนำ; แต่ละรายการรับอาร์กิวเมนต์ (realm, คลัสเตอร์, ช่วงเวลา) และนำโมเดลผ่านเครื่องมือที่ถูกต้องตามลำดับที่ถูกต้อง

พรอมต์สิ่งที่ทำ
audit_self_registrationค้นหา realm ทั้งหมดที่ยังอนุญาตการลงทะเบียนด้วยตนเอง ในคลัสเตอร์เดียวหรือทั้งหมด
review_upgradesระบุคลัสเตอร์ที่ตามหลังเวอร์ชัน Keycloak และวางแผนเส้นทางการอัปเกรด
triage_failed_loginsดึงการเข้าสู่ระบบที่ล้มเหลวล่าสุดของ realm และจัดกลุ่มตาม IP ต้นทาง
review_identity_providersแสดงรายการการเชื่อมต่อ SSO ของ realm และตรวจสอบว่าการเชื่อมต่อเฉพาะนั้นเปิดใช้งานอยู่หรือไม่
review_admin_changesแสดงว่าใครเปลี่ยนแปลงอะไรใน realm เมื่อเร็ว ๆ นี้ เน้นการตั้งค่าการเข้าสู่ระบบและความปลอดภัย
provision_environmentสร้างคลัสเตอร์ เพิ่ม realm และเชื่อมต่อผู้ให้บริการระบุตัวตน โดยยืนยันแต่ละขั้นตอน
set_up_custom_domainเพิ่มโดเมนที่กำหนดเอง ส่งคืน DNS records ที่แน่นอน ตรวจสอบ และกำหนดเส้นทางไปยัง realm
rotate_client_secretสร้าง client secret ของแอปพลิเคชันใหม่พร้อมระบุขอบเขตผลกระทบให้ชัดเจนก่อน

พรอมต์ถูกจำกัดในลักษณะเดียวกับเครื่องมือที่อ้างถึง: สามรายการที่เปลี่ยนแปลงข้อมูลจะเสนอเฉพาะกับเซสชันที่สามารถเรียกเครื่องมือเขียนที่อ้างถึงได้ และคำแนะนำของพรอมต์บอกให้โมเดลยืนยันกับคุณก่อนเปลี่ยนแปลงอะไรก็ตาม ข้อกำหนด confirm=true สำหรับเครื่องมือที่ทำลายล้างยังคงมีผลเพิ่มเติม

ทักษะ

ในขณะที่พรอมต์เป็นจุดเริ่มต้น ทักษะคือคู่มือปฏิบัติการฉบับสมบูรณ์ที่โมเดลโหลดตามความต้องการ เซิร์ฟเวอร์มาพร้อมสี่ทักษะ ให้บริการผ่าน ส่วนขยายทักษะ SEP-2640 ฉบับร่าง: ประกาศ io.modelcontextprotocol/skills ในความสามารถ ตอบ skills/list และ skills/get และให้บริการแต่ละ SKILL.md เป็นทรัพยากรทั่วไปที่ skill://<name>/SKILL.md พร้อม sha256 digest ในรายการ ไดเรกทอรีปลั๊กอินของ OpenAI นำเข้าทักษะในรูปแบบนี้พอดี

ทักษะสิ่งที่เข้ารหัส
auth-incident-triageคัดแยก "ผู้ใช้ไม่สามารถเข้าสู่ระบบ": แยกการหยุดทำงานของแพลตฟอร์มจากการโจมตีและการเปลี่ยนแปลงการกำหนดค่า โดยใช้เหตุการณ์ บันทึก WAF และสถานะคลัสเตอร์ อ่านอย่างเดียว
enterprise-sso-rolloutเชื่อมต่อ IdP ระดับองค์กรเข้ากับ realm อย่างครบวงจร: การตรวจสอบ issuer การลงทะเบียนแอปต้นทาง การกำหนดค่า broker การทดสอบการเชื่อมต่อ และการตรวจสอบกับเหตุการณ์การเข้าสู่ระบบจริง
keycloak-migration-doctorตรวจสอบล่วงหน้าสำหรับการส่งออก นำเข้า หรือย้าย Keycloak เทียบกับอุปสรรคที่ฝ่ายสนับสนุนเห็นจริง (script policies, เส้นทาง /auth แบบเดิม, ความคาดหวังการส่งออกบางส่วน) และวินิจฉัยงานที่ล้มเหลวโดยอ่าน error_message จริงแทนการแจ้งเตือนทั่วไปบนแดชบอร์ด
keycloak-upgrade-readinessประเมินความคลาดเคลื่อนของเวอร์ชัน คำนวณว่าเวอร์ชัน Keycloak ใหม่ทำลายอะไร (ส่วนขยาย ธีม) และจัดลำดับการเผยแพร่ข้ามสภาพแวดล้อมโดยใช้การส่งออกเป็นแผนการย้อนกลับ

ทักษะปฏิบัติตามการจำกัดเดียวกันกับเครื่องมือที่อ้างถึง: สามเวิร์กโฟลว์ที่สร้างจากเครื่องมือเขียนจะถูกระงับจากเซสชันอ่านอย่างเดียว และเซสชันที่จำกัดขอบเขตจะได้รับเฉพาะทักษะที่มีเครื่องมือจริงเท่านั้น แหล่งที่มาอยู่ใน internal/tools/skills/ หนึ่งไดเรกทอรีต่อทักษะ ในรูปแบบ Agent Skills มาตรฐาน ดังนั้นจึงใช้งานได้เมื่อคัดลอกตรงไปยังไดเรกทอรีทักษะในเครื่อง

การเชื่อมต่อ

สำหรับ hosted HTTP เส้นทางที่ง่ายที่สุดคือ OAuth ซึ่งไม่ต้องใช้ credential เลย:

claude mcp add --transport http skycloak https://mcp.skycloak.io

การเรียกครั้งแรกจะเปิดเบราว์เซอร์ของคุณ คุณอนุมัติในหน้าเข้าสู่ระบบ Skycloak แล้วเครื่องมือจะปรากฏ หากคุณอยู่ในหลาย workspace ให้ระบุชื่อที่ต้องการ:

claude mcp add --transport http skycloak "https://mcp.skycloak.io?workspace=<workspace-id>"

หรือสร้าง API key ใน Skycloak dashboard และกำหนดค่าไคลเอนต์ MCP ของคุณให้ส่งเป็น bearer token:

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"
      }
    }
  }
}

สำหรับ local stdio ลงชื่อเข้าใช้ครั้งเดียว จากนั้นชี้ไคลเอนต์ของคุณไปที่ skycloak-mcp run:

skycloak-mcp init        # one-time browser sign-in; stores a key in your keychain

Claude Desktop / Cursor (local, stdio):

{
  "mcpServers": {
    "skycloak": {
      "command": "skycloak-mcp",
      "args": ["run", "--transport", "stdio"]
    }
  }
}

Claude Code:

claude mcp add skycloak -- skycloak-mcp run --transport stdio

สำหรับการทำงานแบบ headless / 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 หรือใช้คีย์ที่มีสิทธิ์เขียน)

เพิ่ม ?readonly=true ไปยัง URL HTTP ที่โฮสต์ไว้เพื่อเปิดเผยเฉพาะเครื่องมือแบบอ่านอย่างเดียวสำหรับเซสชัน HTTP นั้น หรือ ?readonly=false เพื่อขอพื้นผิวเครื่องมือที่รองรับการเขียน ค่าพารามิเตอร์เริ่มต้นคือ false แต่เครื่องมือเขียนจะลงทะเบียนเฉพาะเมื่อเซิร์ฟเวอร์เริ่มต้นด้วย --allow-writes

เพิ่ม ?workspace=<uuid> เพื่อเลือกเวิร์กสเปซที่เซสชัน OAuth จะดำเนินการ จำเป็นเฉพาะเมื่อคุณเป็นสมาชิกมากกว่าหนึ่งเวิร์กสเปซเท่านั้น หากมีเวิร์กสเปซเดียวเซิร์ฟเวอร์จะเลือกให้เอง และหากคุณเป็นสมาชิกหลายเวิร์กสเปซแต่ไม่ได้ระบุชื่อใด การเชื่อมต่อจะล้มเหลวพร้อมข้อความที่ระบุรายชื่อเหล่านั้น

การรัน HTTP transport

skycloak-mcp run --transport http --http-addr :8080

ไม่จำเป็นต้องมีข้อมูลประจำตัวของตัวเอง: ผู้เรียกจะส่งข้อมูลประจำตัวของตนในแต่ละคำขอ ดังนั้นจึงไม่มีการฉีดข้อมูลใด ๆ ในเวลาที่ deploy GET /healthz และ GET /readyz ไม่ต้องมีการยืนยันตัวตนและรายงานเพียงว่าโปรเซสทำงานอยู่เท่านั้น โดยตั้งใจไม่ตรวจสอบ Skycloak API เพื่อให้การขัดข้องของระบบต้นทางไม่ทำให้การตรวจสอบของทุก replica ล้มเหลวพร้อมกัน เซิร์ฟเวอร์ไม่เก็บสถานะเซสชัน ดังนั้น replica จึงไม่จำเป็นต้องมี session affinity และสามารถปรับขนาดหรือหมุนเวียนได้อย่างอิสระ SIGTERM หยุดการเชื่อมต่อใหม่และระบายคำขอที่กำลังดำเนินอยู่

เส้นทาง OAuth จะเปิดใช้งานเมื่อใดก็ตามที่ตั้งค่า SKYCLOAK_ISSUER และ SKYCLOAK_DASHBOARD_URL ซึ่งตั้งค่าไว้ตามค่าเริ่มต้น จากนั้น GET /.well-known/oauth-protected-resource จะถูกให้บริการโดยไม่ต้องยืนยันตัวตน โดยระบุ realm เป็นเซิร์ฟเวอร์อนุญาต ค่า resource ของมันถูกนำมาจาก SKYCLOAK_PUBLIC_URL เมื่อตั้งค่าไว้ และมิฉะนั้นจะนำมาจาก Host และ scheme ของคำขอเอง ดังนั้นการติดตั้งแบบโฮสต์เดียวที่อยู่เบื้องหลัง ingress จึงไม่จำเป็นต้องมีการคอนฟิกเพิ่มเติม scheme มาจาก X-Forwarded-Proto เมื่อมีอยู่ และมิฉะนั้นจะเริ่มต้นเป็น https สำหรับสิ่งใดก็ตามที่ไม่ใช่ loopback host เนื่องจาก TLS สิ้นสุดที่ upstream และการเผยแพร่ตัวระบุ http:// จะไม่ตรงกับ URL ที่ไคลเอ็นต์เชื่อมต่อ ตั้งค่า SKYCLOAK_PUBLIC_URL หาก ingress ของคุณเขียน Host ใหม่ เอกสารยังระบุ openid profile email เป็น scopes_supported และความท้าทาย WWW-Authenticate จะทำซ้ำเป็นพารามิเตอร์ scope ดังนั้นไคลเอ็นต์ที่อ่านอย่างใดอย่างหนึ่งจะขอจาก realm: จำเป็นต้องมี openid เนื่องจากการแลกเปลี่ยนโทเค็นทำให้แดชบอร์ดเรียกจุดสิ้นสุด userinfo ของ Keycloak และ Keycloak ปฏิเสธโทเค็นที่ได้รับโดยไม่มีมัน โทเค็นที่มาถึงโดยไม่มีมันจะถูกปฏิเสธที่การตรวจสอบด้วย 401 และความท้าทาย แทนที่จะส่งต่อไปยังการแลกเปลี่ยนที่ไม่สามารถสำเร็จได้ ดังนั้นไคลเอ็นต์ที่ยังถือสิทธิ์จากก่อนหน้านี้จะหยุดลองใหม่และลงชื่อเข้าอีกครั้ง การเว้นว่างตัวแปร issuer หรือ dashboard ตัวใดตัวหนึ่งจะปิด OAuth ทั้งหมด และเซิร์ฟเวอร์จะกลับไปขอคีย์ API เท่านั้น

OPENAI_APPS_CHALLENGE_TOKEN ให้บริการโทเค็นการตรวจสอบโดเมนไดเรกทอรีปลั๊กอินของ OpenAI ที่ /.well-known/openai-apps-challenge เป็นข้อความธรรมดาเท่านั้น หากไม่ได้ตั้งค่า เส้นทางจะไม่ถูกลงทะเบียนและพาธจะคืนค่า 404

การเริ่มต้นจะบันทึกหนึ่งบรรทัดพร้อมการเชื่อมต่อที่แก้ไขแล้ว (oauth=, issuer=, dashboard=, public_url=, endpoint=, allow_writes=) เพื่อให้สามารถตรวจพบการติดตั้งที่คอนฟิกผิดพลาดได้โดยไม่ต้อง redeploy ทุกคำขอที่ถูกปฏิเสธบนเส้นทาง OAuth จะบันทึกหนึ่งบรรทัดที่ระบุขั้นตอนที่ล้มเหลว (verify, exchange หรือ scopes) สถานะที่ผู้เรียกได้รับ และข้อผิดพลาดพื้นฐาน ความล้มเหลวในการตรวจสอบจะเพิ่มการตรวจสอบที่ปฏิเสธโทเค็น (expired, wrong_issuer, bad_signature, unknown_key_id, wrong_token_type, no_openid_scope และอื่น ๆ) ความล้มเหลวในการแลกเปลี่ยนจะเพิ่มสถานะของแดชบอร์ดและโฮสต์ที่เรียก ผู้เรียกจะปรากฏเป็น subject ของโทเค็นเมื่อตรวจสอบแล้ว และไม่เคยปรากฏเป็นข้อมูลประจำตัว: โทเค็นการเข้าถึง ส่วนหัว Authorization และคีย์ API ที่สร้างขึ้นจะไม่ถูกบันทึก

การคอนฟิก

ตัวแปรสภาพแวดล้อมค่าเริ่มต้น
SKYCLOAK_API_KEYไม่มี (ไม่บังคับสำหรับ stdio; ไคลเอ็นต์ HTTP ให้ส่วนหัว API-Key แทน)
SKYCLOAK_ENDPOINThttps://api.skycloak.io
SKYCLOAK_API_VERSIONเวอร์ชัน API ปัจจุบัน
SKYCLOAK_ISSUERhttps://login.app.skycloak.io/realms/skycloak (การลงชื่อเข้าผ่าน CLI และเซิร์ฟเวอร์อนุญาตที่ HTTP transport ตรวจสอบโทเค็น)
SKYCLOAK_CLIENT_IDskycloak-mcp (เฉพาะ CLI device flow)
SKYCLOAK_DASHBOARD_URLhttps://app.skycloak.io (สร้างคีย์ CLI และคีย์เซสชัน HTTP)
SKYCLOAK_PUBLIC_URLไม่มี (ได้มาจากแต่ละคำขอ; ตั้งค่าเมื่อ ingress เขียน Host ใหม่)
OPENAI_APPS_CHALLENGE_TOKENให้บริการโทเค็นการตรวจสอบไดเรกทอรีปลั๊กอินของ OpenAI ที่ /.well-known/openai-apps-challenge หากไม่ได้ตั้งค่า พาธนั้นจะคืนค่า 404

คำสั่ง: init (ลงชื่อเข้าผ่านเบราว์เซอร์), run (serve), logout (ลบคีย์ที่เก็บไว้) init รองรับ --workspace <id>, --allow-writes, --allow-credentials และ --ttl-days (ค่าเริ่มต้น 90)

แฟล็กค่าเริ่มต้นคำอธิบาย
--transportstdiostdio หรือ http
--http-addr:8080ที่อยู่สำหรับฟังของ HTTP transport
--allow-writesfalseเปิดใช้งานเครื่องมือที่แก้ไขสำหรับ stdio และอนุญาตให้เซสชัน HTTP ที่มี readonly=false ลงทะเบียนเครื่องมือเขียน

การพัฒนา

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

ไคลเอ็นต์ API ภายใต้ internal/apiclient ถูกสร้างจากสเปก OpenAPI ของ Skycloak ด้วย oapi-codegen

การรักษาความสอดคล้องกับ API

ไคลเอ็นต์ใน internal/apiclient ถูกสร้างจาก internal/apiclient/openapi.yaml ด้วย oapi-codegen; รัน make generate เพื่อรีเฟรช CI จะล้มเหลวหากโค้ดที่สร้างและคอมมิตแล้วเบี่ยงเบนจากสเปก คำขอจะถูกลองใหม่บน 429/5xx พร้อม backoff ที่คำนึงถึง Retry-After

การเผยแพร่

เผยแพร่เป็นไบนารี GitHub และอิมเมจคอนเทนเนอร์ ghcr.io/sky-cloak/skycloak-mcp ในแต่ละแท็ก และเผยแพร่ไปยัง MCP Registry เป็น io.skycloak/skycloak-mcp คนส่วนใหญ่ไม่จำเป็นต้องใช้ทั้งสองอย่าง: เซิร์ฟเวอร์ที่โฮสต์ไว้ไม่ต้องติดตั้ง

ความปลอดภัย

โปรดรายงานช่องโหว่เป็นการส่วนตัว ดู SECURITY.md

ผู้มีส่วนร่วม

สร้างที่ Skycloak โดย Guilliano Molaire, Neville Omangi และ Aphilas ประวัติของ repository ถูกบีบอัดเมื่อเปิดสู่สาธารณะ ดังนั้นบันทึกการคอมมิตจึงไม่สะท้อนว่าใครเขียนอะไร

สัญญาอนุญาต

Apache-2.0 คำอธิบาย OpenAPI ใน internal/apiclient/openapi.yaml ถูกสร้างจาก Skycloak platform API และเป็นลิขสิทธิ์ของ Skycloak; รวมไว้ที่นี่เพื่อให้สามารถสร้างและตรวจสอบไคลเอ็นต์ได้ ดู NOTICE