@lapage/strapi-mcp
Provides tools for managing Strapi CMS content, entries, media library, and schema discovery via REST API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@lapage/strapi-mcp list all blog posts"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@lapage/strapi-mcp
MCP server for Strapi CMS content and media management. Built by LaPage Digital.
Install
Run with npx:
npx -y @lapage/strapi-mcpOr install globally:
npm install -g @lapage/strapi-mcpRelated MCP server: contentstack-mcp
Environment
Variable | Required | Description |
| Yes | Strapi base URL, for example |
| Yes | Strapi API token for REST content and media operations. |
| Optional | Token for content-manager/admin schema discovery. Falls back to |
STRAPI_TOKEN is also accepted as an alias for STRAPI_API_TOKEN.
STRAPI_API_URL is also accepted as an alias for STRAPI_URL.
Agent Config
Codex
~/.codex/config.toml or project-local .codex/config.toml:
[mcp_servers.lapage-strapi-mcp]
command = "npx"
args = ["-y", "@lapage/strapi-mcp"]
env = {
"STRAPI_URL" = "https://cms.example.com",
"STRAPI_API_TOKEN" = "your-strapi-api-token",
"STRAPI_ADMIN_TOKEN" = "optional-admin-token"
}
[mcp_servers.lapage-strapi-mcp.tools.strapi_create_entry]
approval_mode = "approve"
[mcp_servers.lapage-strapi-mcp.tools.strapi_update_entry]
approval_mode = "approve"
[mcp_servers.lapage-strapi-mcp.tools.strapi_delete_entry]
approval_mode = "approve"
[mcp_servers.lapage-strapi-mcp.tools.strapi_request]
approval_mode = "approve"
[mcp_servers.lapage-strapi-mcp.tools.strapi_upload_media_from_url]
approval_mode = "approve"
[mcp_servers.lapage-strapi-mcp.tools.strapi_upload_media_from_file]
approval_mode = "approve"
[mcp_servers.lapage-strapi-mcp.tools.strapi_update_media_info]
approval_mode = "approve"
[mcp_servers.lapage-strapi-mcp.tools.strapi_delete_media]
approval_mode = "approve"Claude Desktop
claude_desktop_config.json:
{
"mcpServers": {
"lapage-strapi-mcp": {
"command": "npx",
"args": ["-y", "@lapage/strapi-mcp"],
"env": {
"STRAPI_URL": "https://cms.example.com",
"STRAPI_API_TOKEN": "your-strapi-api-token",
"STRAPI_ADMIN_TOKEN": "optional-admin-token"
}
}
}
}Cursor
.cursor/mcp.json:
{
"mcpServers": {
"lapage-strapi-mcp": {
"command": "npx",
"args": ["-y", "@lapage/strapi-mcp"],
"env": {
"STRAPI_URL": "https://cms.example.com",
"STRAPI_API_TOKEN": "your-strapi-api-token",
"STRAPI_ADMIN_TOKEN": "optional-admin-token"
}
}
}
}Windsurf
MCP config:
{
"mcpServers": {
"lapage-strapi-mcp": {
"command": "npx",
"args": ["-y", "@lapage/strapi-mcp"],
"env": {
"STRAPI_URL": "https://cms.example.com",
"STRAPI_API_TOKEN": "your-strapi-api-token",
"STRAPI_ADMIN_TOKEN": "optional-admin-token"
}
}
}
}Tools
Server
strapi_health— checks Strapi reachability.strapi_request— performs an arbitrary authenticated Strapi HTTP request.
Content Types
strapi_list_content_types— lists available Strapi content types.strapi_get_content_type_schema— returns one content type schema by UID.
Entries
strapi_list_entries— lists entries for a collection type.strapi_get_entry— gets one entry by Strapi 5documentIdor Strapi 4id.strapi_create_entry— creates an entry.strapi_update_entry— updates an entry.strapi_delete_entry— deletes an entry.
Strapi 5 i18n notes
locale: "all" list queries
For strapi_list_entries, this server treats locale: "all" as a request to
fetch every configured Strapi locale separately and merge the results. It first
calls /api/i18n/locales, then queries the collection once per locale, for
example locale=en and locale=vi.
This is intentional. Some Strapi 5 REST configurations can return a bogus empty array for filtered queries such as:
{
"filters": { "projectId": { "$eq": "lp_homepage" } },
"locale": "all",
"pagination": { "pageSize": 100 },
"populate": "*"
}while the equivalent per-locale queries return data. The merged response includes
meta.localeAll.resolvedLocales so callers can see which locales were queried.
Pagination metadata for merged locale: "all" responses is synthetic. The tool
applies the requested pagination to each locale request, merges the returned
rows, and reports a single combined meta.pagination.total. If you need a strict
cross-locale audit, query each locale explicitly and compare entries by
documentId.
Localized relation updates
When updating localized entries, relation fields that point to localized content
must use the numeric id for the target entry in the same locale. This matters
especially for post categories. Do not attach Vietnamese posts to English
category IDs just because the categories share the same documentId.
Concrete LaPage category examples:
EN
n8n Tutorialsnumeric id105maps to VIHướng Dẫn n8nnumeric id111.EN
Archivednumeric id113maps to VIArchivednumeric id115.
For a VI post update, use [111, 115] rather than [105, 113] for those
categories.
Media Library
strapi_list_media— lists Media Library files.strapi_get_media— gets one Media Library file by id.strapi_upload_media_from_url— uploads media from a URL.strapi_upload_media_from_file— uploads media from a local file path.strapi_update_media_info— updates media metadata.strapi_delete_media— deletes a Media Library file.
Available Tools
15 toolsstrapi_create_entryC
Create a Strapi entry using the REST API.
Inputs: data (required), contentType (required), queryJson.
strapi_delete_entryA
Delete a Strapi entry by documentId in Strapi 5 or id in Strapi 4 using the REST API.
Inputs: contentType (required), documentIdOrId (required).
strapi_delete_mediaB
Delete a Strapi Media Library file by file id.
Inputs: fileId (required).
strapi_get_content_type_schemaB
Get a content type schema via the content-manager API. Requires STRAPI_ADMIN_TOKEN or an API token with access.
Inputs: uid (required).
strapi_get_entryA
Get one Strapi entry by documentId in Strapi 5 or id in Strapi 4.
Inputs: contentType (required), documentIdOrId (required), queryJson.
strapi_get_mediaA
Get one Strapi Media Library file by file id.
Inputs: fileId (required).
strapi_healthB
Check the configured Strapi server is reachable.
Inputs: no named parameters.
strapi_list_content_typesB
List Strapi content types via the content-manager API. Requires STRAPI_ADMIN_TOKEN or an API token with access.
Inputs: no named parameters.
strapi_list_entriesB
List entries for a Strapi collection type using the REST API.
Inputs: contentType (required), queryJson.
strapi_list_mediaB
List Strapi Media Library files using /api/upload/files.
Inputs: queryJson.
strapi_requestA
Make an arbitrary authenticated request to Strapi. Use this for custom endpoints and admin/content-manager endpoints.
Inputs: path (required), body, query, method, +1 more.
strapi_update_entryA
Update a Strapi entry by documentId in Strapi 5 or id in Strapi 4 using the REST API.
Inputs: data (required), contentType (required), documentIdOrId (required), queryJson.
strapi_update_media_infoA
Update Strapi Media Library file metadata such as name, alternativeText, or caption.
Inputs: fileId (required), fileInfo (required).
strapi_upload_media_from_fileA
Create a Strapi Media Library item by uploading a local file path from this machine.
Inputs: filePath (required), ref, field, refId, +2 more.
strapi_upload_media_from_urlA
Create a Strapi Media Library item by downloading a URL and uploading it to /api/upload.
Inputs: url (required), ref, field, refId, +2 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 15 tools
Each tool targets a distinct resource and action: health check, generic request, content types (list/schema), entries CRUD, and media operations. The overlapping upload tools are differentiated by source (URL vs local file), and the generic strapi_request is clearly scoped to custom endpoints.
All tools follow a consistent snake_case pattern starting with 'strapi_', followed by a verb (list, get, create, update, delete, upload) and an object (content_types, entries, media). Even compound names like upload_media_from_url maintain a regular structure.
With 15 tools, the server covers health, content type introspection, entry lifecycle, and media management without being bloated. Each tool serves a clear purpose within the Strapi domain, and the count falls well within the ideal 3-15 range.
The server provides comprehensive CRUD for both entries and media, plus schema access and a generic request fallback for custom endpoints. Minor gaps exist, such as no explicit publish/unpublish tool (though update_entry may handle it) and no dedicated filtering/search tool, but these are workable via list_entries parameters or strapi_request.
Maintenance
Related MCP Connectors
MCP server for interacting with the Supabase platform
The official MCP Server from Mia-Platform to interact with Mia-Platform Console
An MCP server that provides access to Agility CMS. See https://mcp.agilitycms.com for more details.
The official MCP Server for the Mux API
Related MCP Servers
- AlicenseAqualityBmaintenanceA Model Context Protocol server that enables AI assistants to interact with Strapi CMS instances through a standardized interface, supporting content types and REST API operations.593 npm75MIT
- AlicenseAqualityDmaintenanceAn MCP server for interacting with Contentstack's Content Management API1516 npm2TypeScriptMIT
- AlicenseNot gradedqualityBmaintenanceMCP server that exposes Strapi v5 content management, visual layout configuration, schema authoring, media uploads, and GraphQL testing to LLM clients via native Strapi API tokens with security hardening.28 npm1MIT
- AlicenseBqualityDmaintenanceMCP server for the digihub.li content API, enabling Claude to read and write Stories, Solutions, and Sessions, and upload images for media.1710 npmMIT