---
title: "Platform Update — October 30, 2026"
slug: "platform-update-2026-10-30"
date: "2026-10-30"
tag: "Application"
summary: "Twelve services and packages moved in two weeks, led by an end-to-end MCP overhaul with a vendor-synced server catalog, per-tenant OAuth and per-user toggles, alongside Bedrock and Vertex model-catalog sync, per-user LLM spend caps, an edX proxy, text and Excel chat exports, LTI 1.3 standalone agent launches, and CDN-served edX assets."
author: "ibl.ai Engineering"
linkedin: |
  Your agents can now reach Slack, Gmail, Google Calendar and Google Drive through MCP servers synced straight from the official MCP Registry, and a user can switch any server on or off for themselves or for a single chat.

  That is the headline of a two-week run in which twelve services and packages moved. The MCP integration was rewritten end to end in four phases:

  → Discovery follows the RFC 9728 and RFC 8414 metadata chain with PKCE, so Linear, Notion, Atlassian, Sentry, HeyGen and Keycloak register cleanly
  → Each tenant holds its own OAuth client and admin-held credentials, with no cross-tenant collision
  → Users connect MCP servers directly from the chat composer
  → Vendor-published servers are synced from the MCP Registry, probed for auth support, and curated by staff

  Also shipped:

  → Bedrock and Vertex model catalogs sync into the LLM registry daily, priced at list and held until verified
  → Per-user LLM spend caps, with a tenant default that applies to every new member
  → An edX proxy, so a client calls the LMS and Studio with one platform token
  → Chat exports as text or Excel, whole conversations included, with native save dialogs on the desktop app
  → Chrome extension 1.1.10 acts by position on a screenshot, handles iframes, and runs up to 200 minutes
  → LTI 1.3 standalone launches, so an agent embeds in any LTI consumer
  → edX static assets published to a CDN per image tag, and native micro-frontend pages in the LMS
  → Context limits and allowed file types per agent, and a "reopen last conversation" setting

  When you run the platform yourself, that velocity lands on your own maintenance window, and nobody else decides when you upgrade.

  With ibl.ai you own all the code and the data: self-hosted inside your own perimeter, model-agnostic across any LLM, with no per-seat pricing, deployable anywhere from your own cloud to a fully air-gapped network.

  #iblai #AgenticAI #EnterpriseAI #AIAgents #MCP #SelfHosted
---

Platform digest covering releases from `iblai/iblai-prod-images` (platform pins 1.316.0 – 1.355.0) and `iblai/iblai-web-frontend` (SDK and app packages), published between 2026-10-16 and 2026-10-30.
| Service / Package | Image / Pin | Version Span |
|---|---|---|
| dm | `iblai-dm-pro` | `4.426.1-ai` → `4.462.0-ai` |
| os | `iblai-os-spa` | `0.171.3` → `0.183.1` |
| edx | `iblai-edx-pro` | `sumac.2.65.0` → `sumac.2.70.1` |
| lms | `iblai-lms-spa` | `0.95.0` → `0.100.1` |
| auth | `iblai-auth-spa` | `2.8.1` → `2.9.0` |
| cli | `ibl-cli` | `7.30.0` → `7.33.0` |
| web-containers | `@iblai/web-containers` | `1.44.3` → `1.59.1` |
| web-utils | `@iblai/web-utils` | `2.9.4` → `2.18.0` |
| data-layer | `@iblai/data-layer` | `1.30.3` → `1.38.1` |
| mcp | `@iblai/mcp` | `1.31.0` → `1.37.1` |
| agent-ai | `@iblai/agent-ai` | `2.13.1` → `2.13.3` |
| iblai-js | `@iblai/iblai-js` | `2.40.6` → `2.59.1` |

---

## iblai-dm-pro (`4.426.1-ai` → `4.462.0-ai`)

**MCP overhaul (Phases 1–4).** The MCP integration was rewritten end to end across four phases:

- **Phase 1 — langchain.mcp migration.** MCP tools now load through `langchain.mcp` (`MCPAdapter` / FastMCP 4), replacing the deprecated `langchain-mcp-adapters`. The langchain stack is bumped (`langchain` 1.4.5, `langchain-core` 1.6.10, `mcp` 2.3.0). The `websocket` transport is removed — existing websocket servers are migrated to `streamable_http`. Deploy: migration `0392`.
- **Phase 1B — OAuth discovery & DCR rewrite.** MCP OAuth discovery now follows the RFC 9728 / RFC 8414 / OIDC metadata chain, and DCR was rewritten for spec compliance. PKCE (S256) and RFC 8707 `resource` are sent on OAuth flows for MCP-discovered clients. Linear, Notion, Atlassian, Sentry, HeyGen and Keycloak now register. Deploy: migration `0393`.
- **Phase 2 — tenant credentials.** Per-tenant OAuth clients (`TenantOAuthClient`) with one resolver for every OAuth call site. Each tenant registers its own DCR client (no cross-tenant collision). `credentials/` and `verify/` endpoints for admin-held OAuth and API-key secrets. Configurable `authorization_params` / `token_params` per provider and per tenant client. Deploy: migrations `0394`–`0396`.
- **Phase 3 — per-user and per-session toggles.** Users turn MCP servers on or off for themselves (`mcp-servers/{id}/preference/`) or per chat session (`session-preference/`). `auth_scope` is now enforced: `user` uses only the user's own connection, `mentor` only the user's or that mentor's. A user-scoped connection can only use its own user's connected service. Deploy: migrations `0397`–`0398`, then `seed_rbac_data`.
- **Phase 4 — MCP Registry catalog.** MCP servers published by their vendor are synced from the official MCP Registry, probed for auth type and DCR support, and published as global servers. Staff curate through Django admin. New curated servers: Slack, Gmail, Google Calendar, Google Drive. Registry OAuth servers that offer DCR register per-tenant clients on first sign-in. Deploy: migrations `0399`–`0400`, then `seed_default_oauth_providers`, `sync_mcp_registry --full --probe`, `seed_flows`.
- **MCP OAuth refinements.** `oauth-find` accepts an admin's own OAuth client (`client_id`, `client_secret`, `authorization_url`, `token_url`). Default redirect URI is now `https://{SPA_DOMAIN}/google-oauth-callback/`. Registry servers get Title Case names and downloaded images. MCP network time is bounded: unreachable servers fail in ~5 s, discovery has a 15 s budget, and a failing server in chat is skipped alone within 15 s. `MCP_OAUTH_REDIRECT_URI` setting. Deploy: migrations `0404`–`0406`, then `repair_mcp_oauth_redirects --apply` and `backfill_mcp_server_images`.
- **OAuth token normalization.** MCP connections (e.g. GitHub Copilot) no longer fail when the token endpoint returns `expires_in` as a string.

**Bedrock & Vertex catalogue sync.** `sync_llm_catalog --gateway bedrock` and `--gateway vertex` sync models from the Model Garden / Bedrock into the LLM routes registry. Routes are priced at the author's list price and kept off until verified. Models whose last gateway route is retired are deprecated. Daily beat entries `sync_bedrock_catalog` (03:30 UTC) and `sync_vertex_catalog` (03:50 UTC). Deploy: migration `0403`.

**edX proxy.** `/v1/lms/{edx_path}` and `/v1/studio/{edx_path}` forward requests to edX as the calling platform member, so a client can call edX with its DM token. The edX JWT is minted through the LMS, cached per user (encrypted with `FIELD_ENCRYPTION_KEY`), and replaced 10 min before expiry. `EdxProxyRule` allows, denies or blocks edX paths — sync them with `sync_edx_proxy_rules`. Two exact SSO paths are reopened inside the global `ibl/ai/sso/*` block so the SPA can load course iframes with a DM token. Settings: `EDX_PROXY_READ_THROTTLE_RATE` (600/min), `EDX_PROXY_WRITE_THROTTLE_RATE` (120/min), `EDX_PROXY_MAX_BODY_SIZE` (250 MB). Deploy: migrations `core.0071`–`core.0072`, then `sync_edx_proxy_rules`.

**Per-user LLM spend caps.** `SpendCap` scope `user` caps one member's total LLM spend across every agent. A tenant default cap auto-applies to new members on their first `UserPlatformLink`. Admin endpoints under `/api/ai-mentor/orgs/<org>/spend-caps/users/`. Setting: `MENTOR_NEW_USER_SPEND_CAP_DEFAULT` (default disabled). Deploy: migration `0402`, then `seed_rbac_data`.

**RAG retrieval tuning.** `RAG_RETRIEVAL_K` (default 4) sets the global chunk count; a mentor's own `rag_retrieval_k` still wins. `RAG_RETRIEVAL_K_FORCE_PLATFORM_DEFAULT` makes every mentor use the platform default. Prioritized document-filter RAG now uses history-aware multi-query expansion. `RAG_DISABLE_PRODUCT_METADATA_AUGMENTATION` drops all `payload.metadata` from the RAG query, leaving only the question.

**Readable CSV reports.** Report downloads now keep line breaks, export agent chat messages as plain text, and list `document_sources` one per line with presigned URL signatures stripped. `REPORT_DOWNLOAD_CSV_READABLE` (default on); `clean=0` restores flattened output.

**Shareable link tokens.** Chat payloads accept `shareable_link_token` for share-link sessions.

**Platform metadata on login.** `GET /api/core/users/platforms/` carries `metadata` (the platform's public metadata). `POST consolidated-token/proxy/` carries `user_metadata` (the user's DM-held metadata). Settings `USER_PLATFORMS_INCLUDE_METADATA` and `CONSOLIDATED_TOKEN_INCLUDE_USER_METADATA` (both default true).

**LTI 1.3 email display.** An LTI 1.3 user's email is shown as the address from their LTI launch instead of the `@edx-lti-1p3.com` placeholder, across mentor responses, analytics and CSV exports.

**Course metadata v1 endpoint.** `GET /v1/courses/metadata?course_id=<id>` returns a course's metadata served from DM storage — Studio details, block outlines, pricing, certificate availability — so the SPA does not have to call edX separately.

**Raw RBAC permissions endpoint.** `GET /v1/rbac/permissions/` returns the raw grants for a user or API key.

**Platform API key listing.** A new endpoint lists the platform API keys the user has access to.

**Mentor default model enforcement.** Mentors created through the API, workflows, course-creation assessments, or default backfills now always receive the tenant's default model.

**Billing creator access.** The payment access check grants the item's creator (mentor `created_by` and pathway authors) directly, with `reason: "creator"`.

**Plaintext credential retirement.** The plaintext credential columns (`LLMCredential.value`, `GlobalCredential.value`, `IntegrationCredential.value`, etc.) are retired from the models. Nothing reads or writes them. Deploy: migration `0401`.

**Bot app removal.** The old bot app (Slack, Discord, Webex, WhatsApp, Teams bots configured per tenant) and its `api/ai-bot/` routes are removed. Dependencies `slack-bolt`, `discord-py`, `webexteamssdk`, `botbuilder-*`, `pylatex`, ImageMagick and the LaTeX toolchain are dropped from the image. Deploy: migration `0408` (detaches tables; follow-up drops them later).

**TTS reliability.** The chat-message TTS endpoint no longer streams through `GZipMiddleware`; provider failures before audio produce a `502` with a specific `code`; failures after the first byte abort cleanly. Provider calls are retried once for transient failures.

**Mentor metadata task rate-limiting.** `populate_mentor_metadata` retries provider 429s with backoff and runs under a configurable `MENTOR_METADATA_TASK_RATE_LIMIT` (default `20/m`).

**`mentor-llms` gateway info.** Chat models now carry `gateway` / `gateway_label` showing which gateway will serve them. Claude on Vertex is never sent `temperature`.

**TLS trust store refresh.** `certifi` 2026.10.19 across DM, CLI and edX images following the eMudhra/emSign certificate-authority incident.

**Deploy summary (DM):** migrations `0392`–`0409`, `core.0071`–`core.0072`. Post-migration commands: `seed_rbac_data`, `seed_default_oauth_providers`, `sync_mcp_registry --full --probe`, `seed_flows`, `sync_edx_proxy_rules`, `sync_llm_catalog --gateway bedrock`, `sync_llm_catalog --gateway vertex`, `repair_mcp_oauth_redirects --apply`, `backfill_mcp_server_images`, `backfill_mentor_llm_defaults`, `queue_course_info_sync --all`.

---

## iblai-os-spa (`0.171.3` → `0.183.1`)

**User Models dialog.** The in-chat model change toggle moved from the chat header to the LLM tab in agent settings. Users can pick from their own models in a new User Models dialog.

**Chat downloads.** The chat download dialog now lets users choose between text and Excel export formats and can export the whole chat from the sidebar. On the desktop app (Tauri), files save through the native save dialog.

**Chrome extension updates (1.1.6 → 1.1.10).** The extension acts by position on a screenshot, lists on-screen elements, double-clicks to open elements, shows selected state, handles iframes, reads only on-screen text, and runs with a 200-minute limit instead of step/token caps, with automatic retries on failures.

**Per-tab auth storage.** The Mentor AI app can wire auth to per-tab storage (flag off by default, `NEXT_PUBLIC_IBL_PER_TAB_AUTH`). Tauri offline restore fills only empty stores without clobbering.

**Agent settings.** New settings tabs: Context Limits (token budgets for agent conversations), Allowed File Types (restrict upload extensions per agent), and an admin-visibility confirmation dialog when narrowing "Who Can View?" to administrators. The prompt popup gained a Save button.

**Embed improvements.** The user profile moved next to the Close button in embed mode. The app re-hydrates in place on `MENTOR:AUTH_UPDATE` instead of reloading. Service workers are not registered inside iframes.

**Mentor Skills tab.** The Skills tab is now a thin wrapper over the SDK's `AgentSkillsTab` component.

**iOS layout.** HTML/body overscroll is disabled so iOS swipes cannot shift the app.

**Explore page.** Clicking "Explore Agents" when already in the Explore view scrolls back to the top with a toggle chevron. The page title uses proper capitalization.

**Cowork flag.** The panel reads the `enable-cowork` flag from the backend.

**Desktop app (Tauri).** Releases v0.95.27 through v0.95.30.

---

## iblai-edx-pro (`sumac.2.65.0` → `sumac.2.70.1`)

**S3 static asset publishing.** The build's final step syncs `/openedx/staticfiles` to S3 under a per-tag directory, so assets served from the CDN match the image that built them. BuildKit is required; AWS credentials are passed as secrets. CSS `url()` references are rewritten to the tag's prefix so fonts and images load from the CDN. `build.sh` gains `--s3-bucket`, `--s3-prefix`, `--s3-sync-args`, `--no-s3`.

**edX S3 CDN (CLI).** `IBL_EDX.S3_CDN.ENABLE_S3_CDN` (default `false`) points `STATIC_URL` at the CDN. `CDN_DOMAIN` defaults to `assets.ibl.ai`; `ASSETS_PREFIX` defaults to the edX image tag. Studio gets `STATIC_URL` plus `studio/`.

**Course staff unenroll.** `POST /api/ibl/enrollment/unenroll/` and `/unenroll/bulk/` now accept course staff, course instructors, and org staff/instructors. Course reruns require Studio write access on the source course.

**Enrollment with history.** `POST /api/ibl/enrollment/enroll/` accepts `is_active` and `created` to carry an enrollment from another deployment with its original state and date. `is_active: false` creates the enrollment inactive. Enrollment refusals are reported with proper status codes (400/403/409) and `errors.EnrollmentNotAllowed`.

**LTI 1.3 standalone launches.** Lightweight standalone LTI launches for Agent blocks allow embedding agents in LTI consumers.

**TLS trust store refresh.** `certifi` 2026.10.19 on both `pro-sumac` and `pro-olive`. The olive image removes the distrusted root from the OS store.

---

## iblai-lms-spa (`0.95.0` → `0.100.1`)

**Native MFE pages.** Micro-frontend pages are now natively built into the LMS SPA (revamped architecture).

**Admin mode switch.** Admins can toggle between User and Admin mode, with automatic assessment mode.

**Help link.** A Help link is available in the profile dropdown, pointing to `IBL_SPA.LMS.HELP_CENTER_URL`.

**Agent embed.** The sidebar agent embed always shows the close button.

**edX-to-DM endpoints.** LMS API calls that previously went to edX now route through the DM proxy.

**Course about page.** Non-enrolled users are redirected correctly to the course about page.

---

## iblai-auth-spa (`2.8.1` → `2.9.0`)

**User metadata forwarding.** The auth flow now forwards trimmed `user_metadata` to `localStorage` so the SDK and apps can read it without an extra API call. The SDK reads the current user's metadata from `localStorage` directly.

---

## ibl-cli (`7.30.0` → `7.33.0`)

**Same-origin proxy fix.** The `/backend/<svc>/` proxy locations now clear `X-Forwarded-Host`, so behind a load balancer backends build absolute URLs from the API host instead of the SPA host.

**edX S3 CDN plugin.** `ibl-edx-s3-cdn` plugin and the `IBL_EDX.S3_CDN.*` settings. See the edX section above.

**LMS help center link.** `IBL_SPA.LMS.HELP_CENTER_URL` (default `https://docs.<BASE_DOMAIN>`), rendered into `.env.lms` as `NEXT_PUBLIC_HELP_CENTER_URL`.

**TLS trust store refresh.** `certifi` 2026.10.19.

---

## @iblai/web-containers (`1.44.3` → `1.59.1`)

**Reopen last conversation.** A new "Reopen last conversation" setting opens the user's most recent chat when they click an agent, instead of starting fresh.

**User Models dialog.** The in-chat model change moved to the LLM tab. Users pick from a User Models dialog with a multi-select mode. The automatic-model warning is shown on the card.

**Chat download.** Text and Excel export in the download dialog; the sidebar offers whole-chat export. Download links stay alive long enough for Safari.

**Admin-visibility confirmation.** A note and confirmation dialog appear when narrowing "Who Can View?" to administrators.

**Code approvals.** Code approval actions appear in the composer and on chat cards, with a phone-friendly tool-row layout.

**Context Limits.** A new Capabilities section with number fields for agent context limits.

**Allowed File Types.** File Uploads in Capabilities settings with an Allowed File Types dialog. Files outside the allowed types are refused with a toast and a link to the allowed-types list.

**MCP server connection.** Users can connect MCP servers directly from the chat composer.

**Onboarding.** The onboarding flow asks only what is missing, and the upgrade checkout URL is streamlined.

**Explore Agents scroll toggle.** Clicking Explore Agents while already in view scrolls back up.

---

## @iblai/web-utils (`2.9.4` → `2.18.0`)

**Multi-tenant auto-switch.** A two-tenant user is automatically switched to their own tenant when the embedded tab is on the wrong one.

**File type allow-list.** Helpers to check file extensions against the agent's allowed types, and the `file_error` chat frame is handled.

**Shareable link token.** The share link is sent as `shareable_link_token` alongside the user's own token, and masked in logged websocket payloads.

**RBAC permissions.** The RBAC permissions call no longer blocks the UI; it loads asynchronously.

**Tenant metadata from platforms list.** The TenantProvider reads metadata from the platform list response, eliminating the separate metadata fetch.

**Per-tab auth.** Auth storage is wired to per-tab storage for Mentor AI (flag off by default).

---

## @iblai/data-layer (`1.30.3` → `1.38.1`)

**User platforms query.** A new `useUserPlatformsQuery` hook for the DM platform list endpoint.

**LLM access endpoints.** LLM access status and set endpoints for the User Models dialog.

**Latest conversation lookup.** API to look up an agent's latest conversation for the reopen feature.

**File upload URL refusal.** The upload-URL endpoint returns a refusal object instead of throwing, supporting the allowed file types flow.

**Readable CSV download.** A `combineCSVData` utility for the readable CSV export.

---

## @iblai/mcp (`1.31.0` → `1.37.1`)

**SDK surface.** This package aggregates the MCP UI hooks used by `web-containers` for server listings, connections, preferences, and the chat-composer MCP integration. It tracks the API changes from the DM's MCP phases and the `shareable_link_token` support.

---

## @iblai/agent-ai (`2.13.1` → `2.13.3`)

**Iframe sandbox downloads.** The embed iframe sandbox now includes `allow-downloads`, so chat file downloads work inside the launcher.

**closeEmbed relay.** The `closeEmbed` message relay no longer loops when the launcher runs on a top-level host.

---

## @iblai/iblai-js (`2.40.6` → `2.59.1`)

**Aggregation package.** `iblai-js` bundles `web-containers`, `web-utils`, `data-layer`, `mcp`, and `agent-ai` into one importable SDK. All features listed in those packages' sections above are included. Tailwind scanning works with the per-module ESM tree.
