Skip to main content
Glama
PaulRichez

DevKit for Strapi MCP Server

by PaulRichez
README.md
<p align="center">
  <img src="assets/icon.svg" width="120" alt="DevKit for Strapi logo" />
</p>

<h1 align="center">DevKit for Strapi</h1>

<p align="center">
  Accurate, project-aware tooling for Strapi <em>magic strings</em> — for your editor <strong>and</strong> your AI agent.<br/>
  Where Copilot <strong>guesses</strong>, DevKit for Strapi <strong>knows</strong>: it reads your real <code>schema.json</code>.
</p>

<p align="center">
  <a href="https://marketplace.visualstudio.com/items?itemName=paul-richez.devkit-for-strapi"><img alt="VS Code Marketplace" src="https://img.shields.io/badge/VS%20Code-Marketplace-4945FF?logo=visualstudiocode&logoColor=white"></a>
  <a href="https://open-vsx.org/extension/paul-richez/devkit-for-strapi"><img alt="Open VSX" src="https://img.shields.io/open-vsx/v/paul-richez/devkit-for-strapi?label=Open%20VSX&color=7c5cff"></a>
  <a href="https://www.npmjs.com/package/devkit-for-strapi-mcp"><img alt="npm — MCP server" src="https://img.shields.io/npm/v/devkit-for-strapi-mcp?label=npm%20(MCP)&color=cb3837"></a>
  <a href="#license"><img alt="License" src="https://img.shields.io/badge/license-MIT%20%2B%20PolyForm-blue"></a>
</p>

<p align="center">
  <a href="https://devkit-for-strapi.paulrichez.fr">Docs</a> ·
  <a href="https://marketplace.visualstudio.com/items?itemName=paul-richez.devkit-for-strapi">Install for VS Code</a> ·
  <a href="https://open-vsx.org/extension/paul-richez/devkit-for-strapi">Cursor / Windsurf</a> ·
  <a href="https://www.npmjs.com/package/devkit-for-strapi-mcp">MCP server on npm</a>
</p>

---

## Why

Strapi runs on _magic strings_ — UIDs like `api::article.article`, service/controller refs, policy and
middleware names, component UIDs, route `handler`s. In most editors they have **no autocomplete, no
validation, and broken navigation**, and a typo fails **silently at runtime**. AI coding assistants don't
close the gap: an inline completion is a plausible guess, not a lookup — and an agent that greps for
references inherits the same blind spots you do.

DevKit for Strapi reads the **real** content-types, components, services, controllers, policies,
middlewares and routes of every Strapi project in your workspace, and turns those strings into
first-class, verified code — in two surfaces that share one engine:

- a **VS Code extension** for humans, and
- an **MCP server** that gives AI agents the same ground truth.

The rule everywhere: **guarantee, don't guess.** When something can't be proven (a non-literal string, an
unverifiable external plugin), DevKit stays silent rather than show a false positive.

---

## 🧩 The VS Code extension

Inside a Strapi project — zero config, no type generation:

- **Autocomplete** — inside a magic string, suggests the real values for the context at your cursor:
  UIDs, services, controllers, policies, middlewares, components, and a content-type's route actions.
- **Diagnostics** — underlines references that don't exist (with quick fixes that suggest the closest
  match), and flags Strapi v4 patterns (`entityService`, `data.attributes`) used in a v5 project.
- **Go to definition** — <kbd>Ctrl/Cmd</kbd>-click a string to jump to the right target: a UID → its
  `schema.json`, a service/controller/policy/middleware → its file, a route `handler` → the controller
  **method**, a component → its JSON, a `plugin('a').service('b')` chain → the plugin's service.
- **Find references & CodeLens** — a “N references” lens on every definition, including **per-method**
  usages (`strapi.service('x').find()` calls and route handlers) the TypeScript server can't see, because
  `strapi.service(...)` is typed `any`. A second “N incoming relations” lens on `schema.json`.
- **Rename** (<kbd>F2</kbd>) — on an entity **or a method**: propagates to every call-site and route
  handler, renames the underlying file/folder, and updates relation `target`s. No grep-and-pray.
- **Hover** — describes what a string resolves to, with the signature for service methods and usage
  insights (incoming relations, route handlers, data usages).

---

## 🤖 The MCP server — ground truth for AI agents

The same engine, exposed over the [Model Context Protocol](https://modelcontextprotocol.io) so coding
agents (Claude Code, Copilot agent mode, Cursor, …) **query your project's real values instead of
grepping for them**. 31 stdio tools, in three layers.

> **Not Strapi's own MCP server** — they do different jobs. Strapi's
> [official MCP](https://docs.strapi.io/cms/features/strapi-mcp-server) acts on your **content**
> (CRUD on entries in a *running* instance, admin token, Strapi ≥ 5.47). DevKit acts on your
> **codebase** (reads `schema.json` and source files — no server, no token, no network; v4 and v5).
> *Use Strapi's MCP to work **with** your content; use DevKit to work **on** your code.* Many
> projects want both.

**Know** — read the project's truth
`server_info` · `list_projects` · `list_content_types` · `list_components` · `list_artifacts` · `get_schema` ·
`resolve` · `validate_reference` · `find_references` · `list_routes` · `refresh`

**Understand** — health & impact analysis
`list_unused` (dead code) · `list_broken_refs` · `coverage` · `find_relation_usages` · `list_refs` (glob) ·
`dependencies` / `dependents` (the dependency graph, for cut analysis)

**Refactor** — plan → review → apply
`plan_rename_method` / `plan_rename_entity` · `plan_move` / `plan_move_entities` · `plan_change_relation` ·
`plan_rename_attribute` · `create_plugin` · `extract_to_plugin`, then `apply_edits` / `apply_rename`.

Every refactor returns a **contractual, reviewable plan** (text edits + file creates/renames/deletes +
content fingerprints). Applying is explicit and **safe by construction**: the executor is **confined to
your discovered project root(s)** (symlink-resolved — no escape), refuses to silently overwrite, verifies
the fingerprints first (a stale plan is rejected, not applied), is **best-effort transactional** (rolls
back on a mid-write failure), and **self-verifies** afterward (re-checks for broken refs). Garantir, ne
pas deviner — applied to writes too.

### Set it up

- **VS Code, Cursor, Windsurf, Antigravity** — the server is **bundled in the extension and
  auto-registered** with the editor's MCP support. Nothing to configure: install the extension and your
  agent can use the tools.
- **Other MCP clients** — run `devkit-for-strapi-mcp` as a stdio server. The project path is
  **optional**: without it the server falls back to the client's `roots` capability (Claude Code and
  Cursor advertise the folder you opened), then to the cwd. Passing it explicitly is still the most
  reliable — it's indexed at startup, so the first tool call already works on any client. There's also
  an `add_project` tool to register a project on demand.

For Claude Code, Claude Desktop, or any standalone MCP client:

```json
{
  "mcpServers": {
    "devkit-for-strapi": {
      "command": "npx",
      "args": ["-y", "devkit-for-strapi-mcp@latest", "/absolute/path/to/your/strapi-project"]
    }
  }
}
```

### Try it

Once it's wired, ask your agent:

- *"Which content types exist in this project?"*
- *"What uses `api::article.article`?"*
- *"Is `api::article.artcle` a valid reference?"*

It answers from your real `schema.json` — not from a guess.

---

## Accurate by design

- **Reads your real schema** — answers come from your project's files, not from a model's guess.
- **Multi-project** — discovers every Strapi project in the workspace by content (scanning for
  `@strapi/strapi`), never assuming _workspace root = Strapi root_. References resolve against the project
  that **owns** the edited file; an ambiguous request returns candidates, never a silent choice.
- **Strapi v4 _and_ v5** — the version is detected per project; v4-in-v5 patterns are flagged. Knows the
  difference between a `collectionType` and a `singleType` (their auto-CRUD actions differ) and a
  schema-only content-type's auto-generated controller.
- **JavaScript & TypeScript** — identical behavior for ESM and CommonJS projects (challenged by a
  JS⇄TS parity test).
- **Runs everywhere** — VS Code and its forks (Cursor, Windsurf, Google Antigravity) via Open VSX and the
  VS Code Marketplace.

---

## Install

**Editor** — install from the
[VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=paul-richez.devkit-for-strapi),
or from [Open VSX](https://open-vsx.org/extension/paul-richez/devkit-for-strapi) for Cursor / Windsurf /
VSCodium (or just search **“DevKit for Strapi”** in the Extensions view). Open a Strapi project and it works.

**AI agent, outside an editor** — the MCP server is on npm as
[`devkit-for-strapi-mcp`](https://www.npmjs.com/package/devkit-for-strapi-mcp) (and in the official MCP
registry as `io.github.PaulRichez/devkit-for-strapi-mcp`): `npx -y devkit-for-strapi-mcp@latest /path/to/project`.

**Requirements** — a Strapi **v4** or **v5** project, and VS Code `1.101+` (or a compatible fork). No
configuration, no type generation, no extra setup.

The MCP server needs no separate install in those editors — it ships inside the extension.

---

## Architecture

A pnpm monorepo around one pure engine:

| Package | Role |
|---|---|
| `devkit-for-strapi-core` | The editor-agnostic engine — all Strapi knowledge, reads IO through a `FileSystem` seam, pure TypeScript. |
| `devkit-for-strapi` | The VS Code extension (providers, watcher) — glue, no Strapi logic. |
| `devkit-for-strapi-mcp` | The stdio MCP server — a third client of the same engine. |

The same core powers the editor, the MCP server, and the tests — so a fact verified once is true on every
surface.

---

## Trademark

Independent, community-built tool — **not affiliated with, endorsed by, or sponsored by Strapi SAS.**
“Strapi” is a trademark of Strapi SAS, used here only to describe compatibility.

## License

The **core engine and the free editor/MCP wedge are free to use** (licensed [MIT](LICENSE))
(`devkit-for-strapi-core`, plus the read/navigation/diagnostics surface of the extension and the
read-only MCP tools).

The **Pro write/refactor engine** (propagated rename, move/extract, schema edits, plan→apply) is a
**separate package that is not included in this repository** — the `packages/pro` here is an
**MIT-licensed stub** that only preserves the public API so the free tier builds and runs. The real Pro
engine is licensed under **PolyForm Shield 1.0.0** and is bundled into the **published** VS Code
extension and MCP server, so those distributed artifacts are governed by `MIT AND
PolyForm-Shield-1.0.0`. Building from this repository produces the **free tier**; Pro features return a
"Pro required" upsell. Get Pro: <https://devkit-for-strapi.paulrichez.fr/pro/>.