n8n/packages/modules/mcp/frontend
Alex Antoniuk cef87cfcab
feat(editor): Add order to settings sidebar links (#40505)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 20:48:14 +00:00
..
src feat(editor): Add order to settings sidebar links (#40505) 2026-10-08 20:48:14 +00:00
biome.jsonc refactor(editor): Extract MCP access into a frontend module package (no-changelog) (#39493) 2026-10-06 14:31:21 +00:00
eslint.config.mjs refactor(editor): Extract MCP access into a frontend module package (no-changelog) (#39493) 2026-10-06 14:31:21 +00:00
package.json refactor(editor): Extract MCP access into a frontend module package (no-changelog) (#39493) 2026-10-06 14:31:21 +00:00
README.md refactor(editor): Extract MCP access into a frontend module package (no-changelog) (#39493) 2026-10-06 14:31:21 +00:00
stylelint.config.mjs refactor(editor): Extract MCP access into a frontend module package (no-changelog) (#39493) 2026-10-06 14:31:21 +00:00
tsconfig.json refactor(editor): Extract MCP access into a frontend module package (no-changelog) (#39493) 2026-10-06 14:31:21 +00:00
vite.config.ts refactor(editor): Extract MCP access into a frontend module package (no-changelog) (#39493) 2026-10-06 14:31:21 +00:00

@n8n/frontend-module-mcp

Frontend feature module. Consumed from source by the editor-ui shell through src/app/modules.manifest.ts; there is no build step and no dist.

Read the full guide at packages/@n8n/module-cli/frontend-module-guide.md. It gives the descriptor contract, the registration points and the known problems. This README gives a summary only.

pnpm turbo typecheck --filter=@n8n/frontend-module-mcp
pnpm turbo lint --filter=@n8n/frontend-module-mcp
pnpm turbo lint:styles --filter=@n8n/frontend-module-mcp
pnpm turbo test --filter=@n8n/frontend-module-mcp

Go through turbo, not pnpm --filter <pkg> typecheck: this package is consumed from source, and on a cold tree its platform dependencies have not been built yet. Turbo builds them first; the bare pnpm form does not.

Import rules

  • Depend on L0–L2 platform packages only. The full list is in "Imports and boundaries" in the guide. Never import another @n8n/frontend-module-*, and never import @/… from the shell.
  • @n8n/stores, @n8n/composables, @n8n/frontend-constants and @n8n/utils are subpath-only — import @n8n/stores/settings.store, not @n8n/stores.
  • The no-cross-module rule is currently a convention: the shared tsconfig base omits sibling modules from paths, which blocks an accidental import but not a deliberate one (declaring the dependency makes it typecheck clean). The CAT-3692 tracks the ESLint rule that will enforce it.

Adding UI

vite.config.ts already carries the three plugins a design-system consumer needs, so a .vue file compiles in tests without further setup:

  • @vitejs/plugin-vue — single-file components.
  • unplugin-icons — the ~icons/lucide/* virtual modules behind N8nIcon.
  • vite-svg-loader — design-system's custom/*.svg icon components. Without it an .svg import is a data-URI string, which Vue renders as a tag name.

src/__tests__/design-system-icons.test.ts renders one icon of each kind, so a plugin dropped from vite.config.ts fails this package's own suite. Keep that test while the module renders any design-system component.

SCSS goes in a scoped <style lang="scss"> block, with tokens from design-system — stylelint.config.mjs holds this package to the same rules the shell uses. Route components must load lazily — see the note in src/mcp.module.ts.