Skycloak
공식Skycloak 관리형 Keycloak을 위한 Model Context Protocol 서버입니다. 모든 MCP 클라이언트에서 클러스터, 영역, 애플리케이션, SSO 및 사용자를 관리할 수 있습니다.
Skycloak MCP(으)로 무엇을 할 수 있나요?
-
클러스터 업그레이드 검토 — 업그레이드가 지연된 Keycloak 클러스터를 확인하고
list_cluster_upgrades및get_cluster_upgrade_path를 통해 권장 진행 경로를 확인합니다. -
영역 프로비저닝 —
create_realm및create_identity_provider를 사용하여 특정 클러스터에 ID 공급자가 구성된 스테이징 영역을 생성합니다. -
사용자 활동 감사 — 최근에 영역에 추가된 사용자를 찾고 관리자 변경 사항을 검토하며,
list_realm_users및query_events를 활용합니다. -
SIEM 통합 설정 —
create_siem_destination및test_siem_destination을 사용하여 관리자 이벤트를 외부 웹훅으로 전달하는 대상을 구성합니다. -
테마 콘텐츠 교체 — 할당을 잃지 않고
update_theme_content를 통해 확인 절차를 거쳐 사용자 정의 테마의 아카이브를 제자리에서 업데이트합니다. -
사용자 정의 도메인 라우팅 —
create_domain및verify_domain을 사용하여 사용자 정의 도메인을 추가하고, 생성할 DNS 레코드를 검색하고, 이를 확인한 후 영역으로 트래픽을 라우팅합니다.
문서
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에 로그인하면 도구가 나타납니다. 스트리밍 HTTP를 지원하는 모든 MCP 클라이언트는 동일한 방식으로 작동합니다. URL만 제공하면 됩니다.
그런 다음 다음과 같이 요청해 보세요:
- "내 Keycloak 클러스터 중 업그레이드가 지연된 것은?"
- "EU 클러스터에 Google 및 GitHub 로그인이 포함된 스테이징 영역을 만들어 줘."
- "지난주에 프로덕션 영역에 추가된 사람은 누구?"
- "관리자 이벤트를 Datadog 웹훅으로 전달하는 SIEM 대상을 설정해 줘."
인증 및 보안
- OAuth를 사용하는 호스팅 HTTP(구성할 자격 증명 없음). 헤더 없이 클라이언트를
https://mcp.skycloak.io에 연결하세요. 서버는401로 응답하며/.well-known/oauth-protected-resource의 RFC 9728 메타데이터를 가리킵니다. 클라이언트는 Skycloak 로그인 영역에 대해 브라우저 인증 코드 흐름을 실행하고, 받은 액세스 토큰은 세션이 실행되는 단기 워크스페이스 범위 API 키로 교환됩니다. 키는 1시간 동안 유효하며 자동으로 갱신됩니다. 클라이언트 구성에는 아무것도 저장되지 않습니다. - API 키를 사용하는 호스팅 HTTP. 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 |
| ID 공급자 | 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가 필요합니다.
프롬프트
8개의 프롬프트가 도구 표면의 시작점을 제공합니다. 클라이언트는 이를 슬래시 명령 또는 제안된 작업으로 표시합니다. 각 프롬프트는 인수(영역, 클러스터, 시간 창)를 받아 올바른 순서로 올바른 도구를 모델에 안내합니다.
| 프롬프트 | 기능 |
|---|---|
audit_self_registration | 하나의 클러스터 또는 전체에서 자체 등록을 허용하는 모든 영역 찾기 |
review_upgrades | Keycloak 버전이 지연된 클러스터를 찾아 업그레이드 경로 제시 |
triage_failed_logins | 영역의 최근 실패한 로그인을 가져와 소스 IP별로 그룹화 |
review_identity_providers | 영역의 SSO 연결을 나열하고 특정 연결이 활성화되었는지 확인 |
review_admin_changes | 영역에서 최근 변경 사항을 로그인 및 보안 설정 중심으로 표시 |
provision_environment | 클러스터 생성, 영역 추가, ID 공급자 연결(각 단계 확인) |
set_up_custom_domain | 사용자 지정 도메인 추가, 정확한 DNS 레코드 반환, 확인, 영역에 연결 |
rotate_client_secret | 애플리케이션의 클라이언트 비밀번호를 재생성하고 영향 범위를 먼저 설명 |
프롬프트는 참조하는 도구와 동일한 방식으로 제한됩니다. 변경을 수행하는 3개는 참조하는 쓰기 도구를 호출할 수 있는 세션에만 제공되며, 지침은 모델이 변경 전에 사용자와 확인하도록 안내합니다. 파괴적 도구에 대한 confirm=true 요구 사항은 여전히 적용됩니다.
스킬
프롬프트가 시작점이라면 스킬은 모델이 요청 시 로드하는 전체 운영 플레이북입니다. 서버는 초안 SEP-2640 Skills 확장을 통해 4개를 제공합니다. 기능에 io.modelcontextprotocol/skills를 선언하고 skills/list 및 skills/get에 응답하며 각 SKILL.md를 skill://<name>/SKILL.md의 일반 리소스로 제공하고 목록 항목에 sha256 다이제스트를 포함합니다. OpenAI의 플러그인 디렉터리는 정확히 이 형태로 스킬을 가져옵니다.
| 스킬 | 인코딩하는 내용 |
|---|---|
auth-incident-triage | "사용자가 로그인할 수 없음" 문제를 분류합니다: 이벤트, WAF 로그 및 클러스터 상태를 사용하여 플랫폼 중단, 공격, 구성 변경을 구분합니다. 읽기 전용 |
enterprise-sso-rollout | 엔터프라이즈 IdP를 릴름에 종단 간 연결합니다: 발급자 검증, 업스트림 앱 등록, 브로커 구성, 연결 테스트, 실제 로그인 이벤트에 대한 검증 |
keycloak-migration-doctor | 지원팀이 실제로 마주치는 차단 요소(스크립트 정책, 레거시 /auth 경로, 부분 내보내기 기대치)에 대해 Keycloak 내보내기, 가져오기 또는 마이그레이션을 사전 점검하고, 일반 대시보드 알림 대신 실제 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 클라이언트가 이를 베어러 토큰으로 보내도록 구성하세요:
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과 일치하지 않기 때문입니다. 인그레스가 Host을 다시 작성하는 경우 SKYCLOAK_PUBLIC_URL을 설정하세요. 문서에는 openid profile email이 scopes_supported으로도 나열되며, WWW-Authenticate 챌린지는 이를 scope 매개변수로 반복하므로 클라이언트가 둘 중 하나를 읽으면 릴름에 요청합니다: openid은 필수입니다. 토큰 교환으로 대시보드가 Keycloak의 userinfo 엔드포인트를 호출하고 Keycloak은 이를 부여하지 않은 토큰을 거부하기 때문입니다. 이 없이 도착한 토큰은 검증 시 401 및 챌린지로 거부되며, 성공할 수 없는 교환으로 전달되지 않으므로 이전 부여를 보유한 클라이언트는 재시도를 중지하고 다시 로그인합니다. 발급자 또는 대시보드 변수 중 하나를 비우면 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 키는 절대 기록되지 않습니다.
구성
| 환경 변수 | 기본값 |
|---|---|
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를 참조하세요.