Released September 29, 2026.
This release was about working with Leed from outside the browser. The leed CLI gained per-company sign-in and file uploads, AI agents connected over MCP gained most of the Settings screen and full control of asset metadata, and new documentation sets now arrive searchable and ready to render. It also carried a long list of fixes from real content migrations: Markdown that round-trips cleanly, imports that keep your URLs, and deployments that no longer get stuck.
New features
Work with several companies from one machine
The CLI used to hold one session per environment, so moving between two companies’ site repositories meant signing out and back in. Sessions are now stored per company and per environment, and each command uses the session for the company its repository belongs to. Existing credentials migrated automatically on the first command after upgrading, so nobody had to sign in again.
Browser authorization now names the company you are approving, and refuses if the account you are signed in as does not belong to that company, rather than quietly issuing a token for whichever workspace your browser had open.
| Command | What it does |
|---|---|
leed auth status | Lists every stored session, grouped by environment and company, and marks the default |
leed auth login --company <companyId or domain> | Signs in to a specific company |
leed auth logout --company <companyId or domain> | Signs out of one company only |
leed auth logout --all-companies | Signs out of every company in the environment |
leed auth default [company] | Shows or sets the company used outside a site repository |
Learn more: leed auth.
Upload files to the asset manager from the CLI
leed asset upload brings local files into the asset manager without a browser, which is what an AI coding agent working from your site checkout needs when a page it is writing references an image. It handles images, documents, audio and video, detects the type from the file, and returns each asset’s ID, URL and a ready-to-paste Leed Markdown reference.
A single file uploads in one step. A folder is two steps: the first pass hashes every file, checks for duplicates against your library and within the folder, and writes a state file without uploading anything; the second pass uploads from that state file and can be re-run to resume after an interruption.
leed asset upload ./hero.png
leed asset upload ./images
leed asset upload ./images --saveExact duplicates are refused and point at the asset you already have; near-duplicate images are uploaded and flagged. --labels applies labels to every uploaded file, and every form of the command supports --json.
Known limitations at release: uploading needed a leed auth login session, because API keys and OIDC tokens could not upload. SVGs uploaded in the browser have no content hash, so they are not found as duplicates. An interrupted video upload leaves a placeholder asset that --save or --resume-placeholder reuses.
Learn more: CLI command reference, Asset Library.
Keep your own alt text when uploading
Every uploaded image used to get generated alt text, even when accurate, hand-written text already existed. You can now supply it: --alt for a single image, or --alt-from with a JSON file that maps each file’s path within the folder to its alt text. Supplied text is stored as you wrote it, used in the returned Markdown reference, and switches off generation for that image. Images without supplied text still get generated alt text, so a folder where only some images are covered works as expected.
leed asset upload ./hero.png --alt "An isometric illustration of a balance scale, level"
leed asset upload ./images --alt-from alt.jsonLearn more: CLI command reference.
Update, relabel and delete assets from an AI agent
Assets could be created over MCP but never changed afterwards. Three new tools close that gap: update_asset changes one asset’s name, alt text (images only) or labels; label_assets adds and removes labels on up to 200 assets in one call; and delete_asset removes an asset, refusing while any page, form, email template or profile still uses it. The bulk and delete tools ask for confirmation before they act. Release 39 renamed label_assets to change_asset_labels.
Learn more: MCP Tools: Forms and Assets.
Filter the asset library by label
The asset library’s filter menu gained a Labels section beneath the type options. It lists the labels in use on your assets; select several and the grid shows assets carrying any of them, combined with the type filter and the search box.
Learn more: Asset Library.
Manage labels, page types and company settings from an AI agent
AI agents connected over MCP can now create and update labels and page types, edit your company’s General settings, and upload your logo, favicon and light and dark documentation logos. Every change follows the same rules and permissions as the Settings screen, and none of these tools can delete a label or a page type.
Several of those rules used to be enforced only in the browser and now apply everywhere: a page type’s kind cannot change after creation, and a slug-locked page type or label keeps its slug. Page type slug locks also stay in effect after other edits, where previously an edit could clear them.
Learn more: MCP Tools: Site Structure.
Documentation sets that are ready on day one
Creating a documentation or API page type now also creates a search index for it, named after the page type and bound to the set, so a new docs set is searchable without a trip to Settings. Search indexes can also be listed, created and updated from the CLI with leed settings searchindex and by AI agents over MCP.
New workspaces now arrive with three menus already wired into their documentation settings (a Header Menu, a Footer Menu and the Documentation menu) and a working default theme: the Alpha layout, Blue, Open Sans, GitHub code highlighting and a Get started header button. A documentation set renders correctly before anything is configured.
Learn more: MCP Tools: Site Structure, Workspace Provisioning.
AI agents edit pages directly
Page edits from an agent over the Operator MCP used to land only as tracked suggestions for a person to accept. They are now applied directly by default; pass mode: "suggest" to get the old behavior. The in-editor assistant still suggests. A direct edit can also change image-only and embed-only blocks, which suggestions could not touch, and it is still refused when the block carries a pending suggestion.
Agents can also now replace the whole body of a page that has never been published, rather than only filling an empty one. Release 39 renamed the page tools: the edit tool is now update_page_body and the whole-body tool is set_page_body.
Learn more: Authoring Pages Over MCP.
Documentation root URLs go to the starting page
Visiting a documentation or API set’s root URL, such as /docs/, used to lead nowhere when no page lived there. When the page type names a starting page, the root now sends readers to it with a temporary redirect. A starting page inherited from the company default does not count, and a starting page takes priority over the page type’s Redirect Index.
Learn more: Aliases and Redirects.
Fixes
Connecting AI clients
- MCP connections no longer fail after a successful browser authorization, so Claude Code and other MCP clients can connect to the Operator MCP.
- MCP clients can now discover, authorize and connect to a published site’s documentation MCP server.
Learn more: Connecting to the Operator MCP.
Creating and editing pages over MCP
- Creating a page now returns the new page instead of a schema error, so an import can read the page ID it just created.
- A slug supplied at creation is respected, so imported pages keep the URLs you asked for. Several tools also report results and errors more accurately, including keeping a supplied slug and warning when imported content loses attributes.
- Pages created over MCP can be edited afterwards over MCP, instead of being fixable only in the editor.
- Setting an editorial date accepts standard date formats, including the one the API returns, and explains what it expects when a value is rejected. An unparseable date is reported as a validation error everywhere.
- Page type details include which formatting features are enabled, so content can be checked before it is sent and one feature can be changed without resetting the others.
- Error messages name the field or cause that failed instead of a generic message.
- A failed page creation no longer risks moving an existing page to a different URL.
Release 39 renamed several of the page tools these fixes touched. Learn more: Authoring Pages Over MCP.
Exporting pages as Markdown
- Headings that contain inline code are included in the export.
- Exports no longer add stray backslashes before characters such as
:and@, or inside inline code. - A paragraph after a quote stays outside the quote, so re-importing an export no longer pulls your own words into a quotation.
- Every paragraph of a multi-paragraph list item is exported.
Learn more: Markdown for AI, MCP and Import.
Importing content
- Text that looks like a web address is no longer turned into a link on import, and any link can be removed in the editor without deleting its text.
- Text ending in braces is no longer silently removed.
- Imported HTML whose text begins with Leed block syntax no longer turns into an alert, tab or collapsible section.
- The documentation now explains how heading anchors are generated and how to link to a heading, so in-page links written against a custom anchor no longer break silently.
Learn more: Links and Internal Links.
Assets
- Labels chosen when uploading with
leed asset uploadare saved on the assets, so a bulk upload can be filtered by label. - Alt text entered when uploading an image in the asset manager is saved instead of being replaced by generated text.
- The asset library scrolls the selected asset into view when you open it directly or return to it.
Builds and deployments
- The CLI installer no longer hangs during device authorization: its network calls time out and retry.
- A lost connection to the CMS at the end of a site build no longer strands a deployment. The CLI retries with backoff and reports why a notification failed, and a build whose result never reached the CMS is rebuilt automatically.
- Deployments, including those started by a CLI push, no longer sit at “Queued” indefinitely when the build fails to start. They are marked failed with an error and can be retried.
- A deleted builder-generated page no longer loops on a failing publish and blocks other scheduled pages on the same site.
Learn more: When a Deployment Fails.
Page types and data handling
- Creating a page type no longer overwrites or collides with templates your site already has, so the site keeps building and existing pages keep their layout.
- Deleting a page with a very large revision history removes all of its stored content.
- Company data listings are isolated by exact company identifier rather than by prefix match.
- Scheduled secret rotation writes to the correct store entry and verifies the result, so a rotation can no longer leave stored secrets unreadable.
Improvements
Redirects you can rely on
Site redirects are now generated in a single pass, with each source path written exactly once. That fixed two cases that could send visitors to the wrong page: a documentation set’s first or last landing redirect when its pages live in nested menu folders, and any redirect whose destination carries a query string.
Learn more: Aliases and Redirects.