v3.77.0

payloadcms/payloadv3.77.0Feb 18, 2026by denolfe

AI Summary

This release introduces significant features including custom ID support in db.create, MCP plugin migration to mcp-handler, and Local API depth consistency. It also includes numerous bug fixes across plugins and UI components.

Key Highlights

  • Custom ID support in db.create - create documents with specific IDs without custom ID field
  • MCP plugin migration from deprecated @vercel/mcp-adapter to mcp-handler with new options
  • Local API depth now passes through to req.query.depth for consistency across APIs
  • Security vulnerability fix in MCP plugin (bumped @modelcontextprotocol/sdk to 1.25.2)
  • Multiple bug fixes for plugins and UI including import-export, cloud-storage, and multi-tenant

New Features

  • Local API depth consistency - depth option now passed to req.query.depth
  • Custom ID support in db.create via customID argument
  • MCP plugin migration with disableSse, onEvent, and redisUrl options

Full Release Notes

## [v3.77.0](https://github.com/payloadcms/payload/compare/v3.76.1...v3.77.0) (2026-02-18)


### ๐Ÿš€ Features

* pass local API `depth` through to `req.query.depth` for consistency ([#15023](https://github.com/payloadcms/payload/issues/15023)) ([9a38469](https://github.com/payloadcms/payload/commit/9a38469))
* **db-*:** add `customID` arg to `db.create` ([#15653](https://github.com/payloadcms/payload/issues/15653)) ([0935824](https://github.com/payloadcms/payload/commit/0935824))
* **plugin-mcp:** migrate from @vercel/mcp-adapter to mcp-handler ([#15661](https://github.com/payloadcms/payload/issues/15661)) ([24025fd](https://github.com/payloadcms/payload/commit/24025fd))

---

### Feature Details

**Local API Depth Consistency** - The `depth` option passed to Local API calls like `payload.find()` is now automatically set on `req.query.depth`. Previously, hooks relying on `req.query.depth` would behave differently between Local API and REST/GraphQL calls unless you manually passed `req: { query: { depth: x } }` in addition to `depth: x`. This change ensures consistent behavior across all API methods. [#15023](https://github.com/payloadcms/payload/pull/15023)

**Custom ID Support in db.create (db-\*)** - New `customID` argument on `payload.db.create` allows creating documents with a specific ID without requiring a custom ID field in your collection schema. [#15653](https://github.com/payloadcms/payload/pull/15653)

```ts
payload.db.create({ collection: 'posts', customID: 'ce98d6c4-c3ab-45de-9dfc-bf33d94cc941', data: { } })
```

**MCP Plugin Migration (plugin-mcp)** - Migrates from the deprecated `@vercel/mcp-adapter` to `mcp-handler` and bumps `@modelcontextprotocol/sdk` to 1.25.2 addressing a security vulnerability. Exposes new handler options: `disableSse`, `onEvent`, and `redisUrl`. [#15661](https://github.com/payloadcms/payload/pull/15661)

```ts
import { mcpPlugin } from '@payloadcms/plugin-mcp'

export default buildConfig({
  plugins: [
    mcpPlugin({
      // Optional: Enable SSE transport (disabled by default)
      disableSse: false,
      // Optional: Redis URL for SSE session management (defaults to REDIS_URL env)
      redisUrl: 'redis://localhost:6379',
      // Optional: Track MCP events for analytics/debugging
      onEvent: (event) => {
        console.log('MCP event:', event)
      },
    }),
  ],
})
```

---

### ๐Ÿ› Bug Fixes

* hasMany text fields cannot be filtered with contains operator ([#15671](https://github.com/payloadcms/payload/issues/15671)) ([4513a05](https://github.com/payloadcms/payload/commit/4513a05))
* use consistent empty state styling between list and folder views ([#15555](https://github.com/payloadcms/payload/issues/15555)) ([8953b37](https://github.com/payloadcms/payload/commit/8953b37))
* populate previousValue correctly in afterChange hooks for nested lexical fields ([#15623](https://github.com/payloadcms/payload/issues/15623)) ([1cc3bb9](https://github.com/payloadcms/payload/commit/1cc3bb9))
* add i18n support for dashboard edit mode buttons ([#15564](https://github.com/payloadcms/payload/issues/15564)) ([818e31d](https://github.com/payloadcms/payload/commit/818e31d))
* **next:** handle undefined fieldTab in version diff tabs ([#15590](https://github.com/payloadcms/payload/issues/15590)) ([bbacab8](https://github.com/payloadcms/payload/commit/bbacab8))
* **plugin-cloud-storage:** ensure file data persists across operations ([#15570](https://github.com/payloadcms/payload/issues/15570)) ([6af3673](https://github.com/payloadcms/payload/commit/6af3673))
* **plugin-cloud-storage:** generateFileURL only ran when disablePayloadAccessControl was true ([#15667](https://github.com/payloadcms/payload/issues/15667)) ([6c5611c](https://github.com/payloadcms/payload/commit/6c5611c))
* **plugin-import-export:** remove deprecated import ([#15666](https://github.com/payloadcms/payload/issues/15666)) ([733b1df](https://github.com/payloadcms/payload/commit/733b1df))
* **plugin-import-export:** export and import issues when using custom IDs ([#15518](https://github.com/payloadcms/payload/issues/15518)) ([7e2a3ab](https://github.com/payloadcms/payload/commit/7e2a3ab))
* **plugin-import-export:** columns being duplicated when using toCSV hook ([#15597](https://github.com/payloadcms/payload/issues/15597)) ([28e07dc](https://github.com/payloadcms/payload/commit/28e07dc))
* **plugin-mcp:** resolve union type fields failing in update tool ([#15660](https://github.com/payloadcms/payload/issues/15660)) ([9ae89dd](https://github.com/payloadcms/payload/commit/9ae89dd))
* **plugin-multi-tenant:** improve translation for "Tenant" (use "Mandant" instead of "Mieter") ([#15537](https://github.com/payloadcms/payload/issues/15537)) ([4d4033b](https://github.com/payloadcms/payload/commit/4d4033b))
* **plugin-multi-tenant:** tenant selector not appearing after login ([#15617](https://github.com/payloadcms/payload/issues/15617)) ([dd09f67](https://github.com/payloadcms/payload/commit/dd09f67))
* **storage-r2:** build error due to types issue in R2 Bucket type ([#15670](https://github.com/payloadcms/payload/issues/15670)) ([7d1e233](https://github.com/payloadcms/payload/commit/7d1e233))
* **ui:** fix broken polymorphic join edit drawer ([#15621](https://github.com/payloadcms/payload/issues/15621)) ([d450e99](https://github.com/payloadcms/payload/commit/d450e99))

### ๐Ÿ“š Documentation

* update cell component docs ([#15574](https://github.com/payloadcms/payload/issues/15574)) ([c403b00](https://github.com/payloadcms/payload/commit/c403b00))
* outline html lexical content conversion ([#15601](https://github.com/payloadcms/payload/issues/15601)) ([dc1b799](https://github.com/payloadcms/payload/commit/dc1b799))
* updates collection admin options ([#14605](https://github.com/payloadcms/payload/issues/14605)) ([8e92f7f](https://github.com/payloadcms/payload/commit/8e92f7f))
* update custom components docs ([#15576](https://github.com/payloadcms/payload/issues/15576)) ([ae82294](https://github.com/payloadcms/payload/commit/ae82294))
* clarify supported Next.js versions and optional dependencies in installation guide ([#15604](https://github.com/payloadcms/payload/issues/15604)) ([409bc0d](https://github.com/payloadcms/payload/commit/409bc0d))

### ๐Ÿงช Tests

* trash e2e tests check URL before navigation completes ([#15599](https://github.com/payloadcms/payload/issues/15599)) ([7fe5a8c](https://github.com/payloadcms/payload/commit/7fe5a8c))

### ๐Ÿก Chores

* add md and mdx language block linting ([#15309](https://github.com/payloadcms/payload/issues/15309)) ([5415516](https://github.com/payloadcms/payload/commit/5415516))
* bump playwright to fix vscode run test indicators ([#15626](https://github.com/payloadcms/payload/issues/15626)) ([f74d288](https://github.com/payloadcms/payload/commit/f74d288))
* only add publishAllLocales to publish when localizeStatus is enabled ([#15610](https://github.com/payloadcms/payload/issues/15610)) ([d57bc22](https://github.com/payloadcms/payload/commit/d57bc22))

### ๐Ÿค Contributors

- Paul (@paulpopus)
- Patrik (@PatrikKozak)
- Jessica Rynkar (@JessRynkar)
- German Jablonski (@GermanJablo)
- Kendell (@kendelljoseph)
- Ahmad Yasser (@AhmadYasser1)
- Sasha (@r1tsuu)
- Philipp Schneider (@philipp-tailor)
- Philipp Brumm (@brumm)
- Sebastian Blank (@blankse)
- Sean Zubrickas (@zubricks)
- Alessio Gravili (@AlessioGr)
- Vaishnav Patil (@vaishnav-3)
- Divyesh Jain (@divyesh123-jain)