Reported issues for KeyCloak MCP
Pod holds 14 of 14 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.
Back to KeyCloak MCP.
Most discussed
get_admin_events / get_user_attribute_history return raw attribute values in representation
Summary
get_admin_events and get_user_attribute_history return the admin event representation
field verbatim (truncated at max_repr, default 500, and the caller can pass -1 to disable
truncation). The representation of a user-update event is the full user JSON, including
attributes.
Deployments that keep a secret in a custom user attribute therefore get that secret echoed back by a read-only tool. A concrete case: a realm that stores an operator-issued temporary password in a us
Read the thread · 2026-08-14 · open · 0 comments
調査: OAuth 2.1 リファレンス実装との突き合わせ(Cloudflare remote-mcp-github-oauth)
背景
トレンドMCP調査で Cloudflare の OAuth Provider リファレンス実装(cloudflare/ai の remote-mcp-github-oauth デモ)を確認。OAuth 2.1 の完全実装をライブラリ化し、Durable Objects で認証済みユーザーコンテキストを保持、SQL インジェクション対策・permission-based コントロールを明記した設計。
参考: https://github.com/cloudflare/ai/tree/main/demos/remote-mcp-github-oauth
検討したい点
本サーバーは Keycloak Admin REST API を Service Account 経由で扱う認証まわりのMCPサーバーであり、上記リファレンスの認可設計・入力サニタイズの考え方が直接参考になる可能性がある。
- 現行の認証・認可フローと比較し、抜け漏れがないか確認
- permission-based コントロールの粒度を見直す価値があるか
まだ検討段階。実装の優先度は
Read the thread · 2026-08-06 · open · 0 comments
Add a live smoke test that exercises every registered tool
Motivation
Unit tests check logic against fixtures. They cannot tell you that a tool users actually call has stopped returning real data — a tool that exists but does not work is worse than no tool.
This happened for real in jquants-mcp: the earnings-calendar tools returned well-formed empty results for every query while the whole suite stayed green (shigechika/jquants-mcp#523). A live smoke test was built there to close the gap, and on its first production run it found three defects,
Read the thread · 2026-07-25 · closed · 0 comments
feat: spray/breach detection via per-external-IP success rate (single rule)
Problem
Password-spray sources that breach accounts are invisible to a raw failure-count threshold. Real production evidence (an external attacker vs. a benign shared-egress gateway seen in the same window):
| source | failures | reality | old count-threshold verdict |
|---|---|---|---|
| campus NAT gateway (internal range) | 328 | benign | (high count, ignored correctly) |
| attacker (external) | 86 | spray, 2 breaches | **"under |
Read the thread · 2026-07-21 · open · 0 comments
feat: classify known relay egress ranges (Cloudflare WARP / iCloud Private Relay) in detect_login_loops
Background
Morning patrols repeatedly flag "login loops" that are not attacks but a UX artifact of encrypted relay services rotating egress IPs mid-session, which makes the Shibboleth SP session establishment spin (rapid successful LOGINs, zero LOGIN_ERROR, converging once the client reaches the SP or switches network).
Confirmed relay families in production:
- Cloudflare WARP:
2a09:bac2::/32,2a09:bac3::/32(AS13335) - iCloud Private Relay / Fastly egress:
2a04:4e41::/32(ob
Read the thread · 2026-07-21 · open · 0 comments
robustness: set_user_enabled no-op check depends on brief-rep 'enabled' field
Follow-up from the review of #41.
The no-op fast path if u.get("enabled") == enabled: relies on the brief representation returned by _resolve_user including the enabled field. If it were ever absent, None == False is False, so the tool proceeds to a redundant GET+PUT instead of the intended no-op.
Impact is harmless (a redundant but correct write), so this is low priority. Consider fetching the current enabled from the full representation, or documenting the assumption.
Read the thread · 2026-07-13 · open · 0 comments
perf: set_user_enabled issues 3 HTTP round-trips
Follow-up from the review of #41.
set_user_enabled performs three sequential requests: username search (_resolve_user) + GET /users/{id} + PUT /users/{id}, versus two for reset_password.
The extra GET /users/{id} is currently justified: the list/search endpoint returns a brief representation without attributes, so reusing the _resolve_user result for the PUT would drop custom attributes. Reducing to two round-trips would require _resolve_user (or a variant) to fetch the ful
Read the thread · 2026-07-13 · open · 0 comments
feat: add get_ip_activity tool for exhaustive per-IP investigation
Problem
get_events(ip_address=...) filters by IP client-side over a single page
(max_results, default 50). KeyCloak's /events endpoint has no server-side
IP filter, so activity from a given IP outside that page is silently missed.
No tool currently gives a complete picture of one IP's activity (users
touched, clients/SPs, timeline).
Proposed Fix
Add get_ip_activity(ip_address, event_types="LOGIN,LOGIN_ERROR", date_from="", date_to="", max_timeline=200). Follows the same full-pag
Read the thread · 2026-07-03 · closed · 0 comments
Most recent
docs: user documentation site on GitHub Pages (family rollout)
Summary
Roll out the family documentation-site pattern to this repository: a task-oriented user guide on GitHub Pages, complementing the reference README.
Template (live example): https://github.com/shigechika/mcp-stdio — issue shigechika/mcp-stdio#284, scaffold PR shigechika/mcp-stdio#285, published at https://shigechika.github.io/mcp-stdio/ (Japanese at /ja/).
Steps
- Copy the three-piece scaffold from mcp-stdio and adapt:
mkdocs.yml— changesite_name/site_url/ `rep
Read the thread · 2026-07-02 · closed · 0 comments
tests: test_client.py fails under newer respx/httpx (AllMockedAssertionError)
Problem
tests/test_client.py has ~23 failing tests on main (pre-existing, unrelated to recent feature work). They fail with respx.models.AllMockedAssertionError, a respx/httpx version incompatibility — the mocked routes are no longer matched the way the test fixtures assume.
Confirmed pre-existing: checking out origin/main and running the suite reproduces the same ~23 failures. The health_check PR (#20) only touched tests/test_server.py (all green) and did not introduce or fix t
Read the thread · 2026-06-18 · closed · 0 comments
events tools: default date_from to last 24h to prevent full-scan hang
Problem
All event-based tools (get_events, get_login_stats_by_client, get_login_stats_by_hour, detect_login_loops, get_login_failures_by_ip) accept an optional date_from parameter. When date_from is omitted, the tool scans all events from the beginning of the database — potentially millions of records — causing the process to hang (RSS > 5 GB, no response for 60+ minutes).
This is documented as a known issue in keycloak-mcp v0.3.0 and requires the caller to always supply `date
Read the thread · 2026-05-01 · closed · 0 comments
_format_ts: use UTC to avoid OSError on Windows for epoch values near 0
Background
`keycloak_mcp/server.py:_format_ts` currently does:
```python datetime.fromtimestamp(ts).astimezone().strftime("%Y-%m-%d %H:%M:%S") ```
On Windows, `datetime.fromtimestamp(0)` (and negative/near-zero timestamps) raises `OSError` because the underlying `localtime()` rejects pre-1970 values in the local timezone. The function catches `OSError` and falls back to `str(epoch_ms)`, so production is unaffected — but the formatted output is lost.
This surfaced in CI
Read the thread · 2026-04-14 · closed · 0 comments
ci: Windows smoke test should exercise stdio_server, not just pytest
Background
PR #2 added a `windows-latest × Python 3.12` job to CI to guard against Windows-specific regressions (cf. modelcontextprotocol/python-sdk#2433, where `stdio_server()` emits CRLF instead of LF on Windows and corrupts the NDJSON wire format).
However, the current Windows job only runs `pytest`, which exercises pure-Python logic (client helpers, formatters, etc.). It never actually spawns the MCP server and read
Read the thread · 2026-04-14 · closed · 0 comments
ci: add Windows smoke test to guard stdio regressions (cf. python-sdk#2433)
Background
This project depends on the official mcp package (a.k.a. modelcontextprotocol/python-sdk), whose stdio_server() currently emits CRLF instead of LF on Windows, corrupting the NDJSON wire format used by MCP. The upstream bug is tracked at modelcontextprotocol/python-sdk#2433.
Current CI only runs on ubuntu-latest, so any Windows-specific regression (stdio newlines, path handling, signal behavior) goes undetec
Read the thread · 2026-04-14 · closed · 0 comments
The remaining reports are on the project's issue tracker.