Skip to content

v0.6.3

Choose a tag to compare

@github-actions github-actions released this 28 Jun 10:18
· 17 commits to main since this release

Security/perf/architecture remediation (from a full re-review) plus broker production-readiness.
Live-regressed across all transports vs a real Creatio; 537 tests, 94.5% line coverage.

Security

  • Broker access tokens are audience-boundaud (the /mcp resource) + iss (origin) are
    set and verified on every /mcp call, so a token minted by one deployment is rejected by another
    sharing CREATIO_MCP_JWT_SECRET (token redirection / confused-deputy). client_id is bound and
    enforced on refresh.
  • refresh_token grant (rotating, single-use, client-bound, gated on the broker still holding
    the user's Creatio tokens) — replaces a previously non-redeemable refresh token; standalone
    clients no longer re-consent hourly.
  • CREATIO_MCP_JWT_SECRET hardening — minimum 32 chars enforced; required in production
    (fail-closed); ephemeral-with-warning only outside production.
  • SSRF guard for the gateway X-Creatio-Base-Url override — CREATIO_MCP_ALLOWED_BASE_URLS
    allowlist; cloud-metadata link-local addresses always blocked.
  • OData identifier-injection guard, log redaction of code/state/token query params,
    and bounded DCR client store (TTL + cap).
  • RFC 7009 POST /revoke (logout) — revokes the Creatio token upstream
    (/connect/revocation, best-effort) and purges server-side + issued-refresh tokens; always 200.

Added

  • Pluggable broker token storeCREATIO_MCP_TOKEN_STORE=memory (default) | redis. The
    Redis store (CREATIO_MCP_REDIS_URL) encrypts tokens at rest (AES-256-GCM;
    CREATIO_MCP_TOKEN_ENC_KEY or derived from the JWT secret) with native TTL → stateless,
    restart-durable, horizontally-scalable broker.
  • CREATIO_MCP_PUBLIC_URL — pins issuer/audience/redirects/discovery to the external origin
    behind a TLS-terminating proxy.
  • Proactive session keep-alive (CREATIO_MCP_KEEPALIVE_SECONDS, default 300s, 0 disables)
    for legacy/client_credentials; reactive reconnect now also recovers from a login-page bounce,
    not only 401.

Changed

  • Performance — tuned global undici keep-alive dispatcher for outbound Creatio calls;
    single-flight token refresh (no thundering herd); O(1) describe-entity via metadata indexes;
    compact (non-pretty) tool output; capability-probe negative-cache.
  • Architecture/DRYcreateAuthEdge factory (auth-strategy out of HttpServer);
    httpServer.tshttp-server.ts; shared identifier/probe/expiry helpers; OData read +
    getCurrentUserInfo onto the shared request() helper; mutation audit now records outcome.
  • Lint@typescript-eslint/member-ordering rule codifies the class-member convention.

Tests

  • Coverage raised to 94.5% lines (537 tests). Added the broker full-stack API suite
    (supertest) and an opt-in real-Redis integration test (auto-skips without Redis).