Agent skills, guidelines and tools that teach AI coding agents the Jmix-specific patterns, mandatory rules and best practices for developing applications with the Jmix framework.
Each Jmix major version lives on its own branch: v2 for Jmix 2, v3 for Jmix 3, and so on. The default branch is the current stable major. A branch's content/ folder holds:
guidelines-block.md: a short block, delimited by<!-- BEGIN jmix-agent-toolkit -->/<!-- END jmix-agent-toolkit -->markers, that the installer merges into the project's agent guidelines file. It points the agent at thejmixskill.skills/: one folder per skill, each with aSKILL.md(instructions and rules for a specific Jmix feature) and optional subfolders with examples or other materials.
The simplest way is Jmix Studio 3.0+: run the AI Agents Toolkit action from the Settings menu of the Jmix tool window and follow the wizard.
One command starts an interactive wizard with three steps: installing skills, adding guidelines, and registering the JetBrains, Context7 and Playwright MCP servers.
macOS / Linux:
curl -fsSL https://raw.githubusercontent.com/jmix-framework/jmix-agent-toolkit/v3/install.sh | bashWindows (PowerShell 5+):
Invoke-RestMethod https://raw.githubusercontent.com/jmix-framework/jmix-agent-toolkit/v3/install.ps1 | Invoke-ExpressionIf the execution policy blocks the script, bypass it:
powershell -NoProfile -ExecutionPolicy Bypass -Command "Invoke-RestMethod 'https://raw.githubusercontent.com/jmix-framework/jmix-agent-toolkit/v3/install.ps1' | Invoke-Expression"If powershell.exe itself is blocked by a corporate policy (CreateProcess error=5, Access is denied), use PowerShell 7 (pwsh):
pwsh -NoProfile -ExecutionPolicy Bypass -Command "Invoke-RestMethod 'https://raw.githubusercontent.com/jmix-framework/jmix-agent-toolkit/v3/install.ps1' | Invoke-Expression"Each runs one step without the wizard. CSV is a comma-separated list (e.g. claude,codex) or a single value.
install.sh skills [--scope global|local] [--claude=false]
install.sh agents-md [--claude=false]
install.sh mcp --servers CSV --agents CSV [--scope local|global] [--context7-key KEY]
install.sh mcp-jetbrains | mcp-context7 | playwright --agents CSV [--scope local|global]
# mcp-context7 also takes [--context7-key KEY]Piped from curl, pass the subcommand after bash -s --:
curl -fsSL https://raw.githubusercontent.com/jmix-framework/jmix-agent-toolkit/v3/install.sh | bash -s -- mcp --servers jetbrains,playwright --agents claude,codexPowerShell takes the same subcommands and flags (e.g. install.ps1 skills -Scope local -Claude:$false to skip Claude Code). To run one straight from the URL:
& ([scriptblock]::Create((iwr -useb https://raw.githubusercontent.com/jmix-framework/jmix-agent-toolkit/v3/install.ps1).Content)) mcp -Servers 'jetbrains,playwright' -Agents 'claude,codex'Quote lists: unquoted, claude,codex is an array in PowerShell.
skills always installs the skills into .agents/skills, and agents-md always merges the guidelines into AGENTS.md: Codex, OpenCode, Junie, Cline, Cursor, GitHub Copilot, Gemini CLI and others read them there. Claude Code is included by default: each skill is linked into .claude/skills, and a new CLAUDE.md contains only @AGENTS.md, so the shared instructions have one copy. Existing CLAUDE.md files keep the current merge and backup rules; a file that already imports AGENTS.md is left untouched. Use --claude=false (-Claude:$false) to skip Claude Code.
The MCP subcommands take agents, each with its own config: claude, codex, opencode, junie, cline. claude also sets up Claude Desktop when it is installed. Cline has only a user config, which it gets whatever the --scope.
| Flag (bash) | Flag (PowerShell) | Default | Meaning |
|---|---|---|---|
--content-ref REF |
-ContentRef REF |
v3 |
Branch/ref whose content/ is downloaded; it also names the global skills store. Studio passes its resolved toolkit branch. |
--source DIR |
-Source DIR |
- | Install from a local checkout of this repository instead of downloading (CI, offline use). |
--claude[=true|false] |
-Claude |
on | skills, agents-md: set up Claude Code by default. Use --claude=false / -Claude:$false to skip .claude/skills links and CLAUDE.md. .agents/skills and AGENTS.md are always installed. |
--agents CSV |
-Agents CSV |
- | MCP subcommands: claude, codex, opencode, junie, cline. Required. |
--servers CSV |
-Servers CSV |
- | mcp: jetbrains, context7, playwright. Required. |
--scope global|local |
-Scope global|local |
global | skills: install into the user home or the current project, see Skills store below. |
--scope local|global |
-Scope local|global |
local | MCP subcommands: write the project files in the current directory or each agent's user config. Claude Desktop and Cline have only a user config. |
--context7-key K |
-Context7Key K |
prompt | mcp, mcp-context7: Context7 API key (letters, digits, ., _, -); skip leaves Context7 out. Never printed. At local scope it goes into the project files: keep them out of version control. |
--backup-existing-files |
-BackupExistingFiles |
off | Rename overwritten files/dirs to <name>.bak (.bak1, .bak2, ... when taken) instead of deleting them. Not for guidelines files: they are merged, and backed up (with or without this flag) only when the toolkit rewrites content it does not own: an older toolkit's file, or your own file getting the block. |
--verbose, --debug |
-Verbose |
off | Print diagnostics (OS, PATH, resolved paths, tool versions). |
Environment: JMIX_IDE_MCP_PORT sets the port of the IntelliJ IDEA MCP server (default 64342), e.g. curl ... | JMIX_IDE_MCP_PORT=64343 bash -s -- mcp-jetbrains --agents claude. CLINE_MCP_SETTINGS_PATH, CLINE_DATA_DIR and CLINE_DIR move Cline's MCP config, as they do for Cline itself.
Skills store: the skills are copied into a store, and each skill folder is linked into .agents/skills (unless that dir is the store) and, unless --claude=false, into .claude/skills, next to any other skills there.
- Global: store at
~/.agents/.jmix/skills/<ref>/(the--content-ref, e.g.v3), linked into~/.agents/skillsand, unless--claude=false, into~/.claude/skills. - Local: the store is
<project>/.agents/skills/itself, so the skills are real folders there. Each skill is linked into<project>/.claude/skillsunless--claude=false. With--backup-existing-files, replaced skill folders go to<project>/.agents/.jmix/backups/, where no agent reads them as skills.
Upgrading from an older local install: older versions kept the local store in <project>/.skills/. A re-run moves the skills into .agents/skills, re-points the links into .skills in .claude/skills (and in any other <project>/.*/skills you linked the same way), deletes the toolkit's skills from .skills, moves any other jmix* entry there (a retired skill or your own) to .agents/.jmix/backups/, and deletes .skills when nothing else is left. A .skills that is a link is left alone. One that a skills dir links to (e.g. .claude/skills -> ../.skills) is kept: behind .agents/skills it stays the store, behind any other dir its Jmix skills become links to .agents/skills. If the old layout is committed, git shows .skills deleted, the .agents/skills entries changed from symlinks to folders and the .claude/skills links re-pointed.
The installer writes MCP servers straight into each agent's config file (see MCP Servers), keeping its other servers and settings; only Claude CLI at
globalscope goes throughclaude mcp add. A file that is already up to date is not rewritten. On macOS/Linux, merging into an existing JSON config file needsjqornode; a new file is written without them. Servers started throughnpxneed Node.js 20+ when the agent starts them, not at install time.
To skip the script, check out the branch for your Jmix major and take the files from its content/ folder.
The guidelines live in the jmix skill; the project's agent guidelines file gets only a short block that points the agent at it. Add the content of guidelines-block.md to that file, or create the file with just the block. Keep the <!-- BEGIN jmix-agent-toolkit --> / <!-- END jmix-agent-toolkit --> markers: a later installer run replaces only the region between them, so keep your own instructions outside them. In an AGENTS.md, put the block at the top: Codex reads only the first 32 KiB.
- Claude CLI:
CLAUDE.mdin the project root. - Codex:
AGENTS.mdin the project root. If anAGENTS.override.mdsits next to it, Codex reads that file instead; copy the block into it. - OpenCode:
AGENTS.mdin the project root. - Junie:
AGENTS.mdin the project root. If your project has.junie/AGENTS.md, Junie reads only that file; add the block there (the installer does not). - Cline:
AGENTS.mdin the project root (it does not readCLAUDE.md).
A full AGENTS.md or CLAUDE.md from an earlier toolkit version is replaced, not extended: delete its toolkit content and paste in the block. The installer does this itself and keeps the old file as <name>.bak.
skills/ holds the skills for Jmix features (entities, UI views, data access, etc.). Copy or symlink each skill folder so it sits directly inside the agent's skills folder in the project or your home directory (e.g. ~/.claude/skills/jmix-create-entity/): agents do not scan nested subfolders, so do not link the whole skills/ directory as one entry. Leave other (non-Jmix) skills in that folder alone.
| Agent | Project Skills Folder Path | Global Skills Folder Path |
|---|---|---|
| Claude CLI | .claude/skills/ |
~/.claude/skills/ |
| Codex, OpenCode, Junie, Cline | .agents/skills/ |
~/.agents/skills/ |
Re-run after pulling new skills: ln -sfn refreshes existing links and leaves other skills untouched:
mkdir -p ~/.claude/skills
# run from a checkout of your major's branch (v2, v3, ...)
for skill in /path/to/jmix-agent-toolkit/content/skills/*/; do
ln -sfn "$skill" ~/.claude/skills/"$(basename "$skill")"
doneTo copy instead (the skills then survive deleting the clone), replace the ln -sfn line with cp -R "${skill%/}" ~/.claude/skills/. Keep the %/: on macOS, cp -R with a trailing slash copies the folder's contents, not the folder.
| Agent | Project Guidelines | Home Directory Base |
|---|---|---|
| Claude CLI | CLAUDE.md |
~/.claude/ |
| Codex | AGENTS.md |
~/.codex/ |
| OpenCode | AGENTS.md |
~/.config/opencode/ |
| Junie | AGENTS.md |
~/.junie/ |
| Cline | AGENTS.md |
~/.cline/ |
Two MCP servers help AI agents build Jmix apps:
-
JetBrains (highly recommended): lets an external agent talk to a running IntelliJ IDEA to use its code analysis and inspections.
-
Context7 (optional): gives the agent docs and code examples from official sources.
The installer registers them and the Playwright server in the project files (--scope local, the default) or in each agent's user config (--scope global, serves every project). Project servers need a confirmation: Claude Code asks to approve the servers in .mcp.json, and Codex reads .codex/config.toml only in trusted projects (its desktop app ignores project servers). At user level, Claude CLI is registered through claude mcp add --scope user, so the installer needs claude on PATH, in ~/.local/bin or in ~/.claude/local, and skips Claude CLI without it.
Codex merges the user config with the .codex/config.toml of the current directory and its parents up to the git root (only the current directory outside a repository). The installer writes one of these files and only reads the others; the step fails and names the file when another one defines the same server with the other transport (url vs command, which Codex cannot merge) or through inline tables or dotted keys. Other projects are not checked: if one defines the server with the other transport in its .codex/config.toml, remove that table. In the file it writes, the installer edits only explicit [mcp_servers.<name>] tables; a file with triple-quoted strings, or with the server defined through inline tables or dotted keys, is left untouched and needs manual configuration.
| Agent | Project file | User file | Servers key |
|---|---|---|---|
| Claude CLI | .mcp.json |
~/.claude.json, through claude mcp add --scope user |
mcpServers |
| Codex | .codex/config.toml |
~/.codex/config.toml ($CODEX_HOME) |
[mcp_servers.<name>] |
| OpenCode | opencode.json |
~/.config/opencode/opencode.json ($XDG_CONFIG_HOME) |
mcp |
| Junie | .junie/mcp/mcp.json |
~/.junie/mcp/mcp.json ($JUNIE_HOME for the Junie CLI) |
mcpServers |
| Cline | - | ~/.cline/data/settings/cline_mcp_settings.json, see Cline |
mcpServers |
Claude Desktop (with claude, when installed) |
- | claude_desktop_config.json, see Claude Desktop |
mcpServers |
To run the JetBrains MCP server in IntelliJ IDEA, go to Settings → Tools → MCP Server and select Enable MCP Server ✓, then keep your project open in the IDE. The server listens on 127.0.0.1, port 64342 by default. The endpoint depends on the IDE version:
- IntelliJ IDEA 2026.1+: Streamable HTTP at
http://127.0.0.1:64342/stream. - IntelliJ IDEA 2025.2 / 2025.3: SSE at
http://127.0.0.1:64342/sse.
The installer probes /stream to choose the endpoint. If the IDE does not answer, it assumes 2026.1+, so on 2025.x run the step with the IDE open and its MCP server enabled. Context7 uses the remote endpoint https://mcp.context7.com/mcp with the header Authorization: Bearer YOUR_API_KEY. Junie and Claude Desktop use the stdio package @upstash/context7-mcp instead, with the key in CONTEXT7_API_KEY.
Below are the entries the installer writes for each agent. Merge them into the existing project or user file.
For the project, use --scope project instead of --scope user: it writes .mcp.json.
-
JetBrains MCP:
claude mcp add --scope user --transport http jetbrains http://127.0.0.1:64342/stream # IntelliJ IDEA 2025.2/2025.3: claude mcp add --scope user --transport sse jetbrains http://127.0.0.1:64342/sse -
Context7 MCP. Keep
--headerafter the URL: it takes several values and would swallow any arguments after it.claude mcp add --scope user --transport http context7 https://mcp.context7.com/mcp --header "Authorization: Bearer YOUR_API_KEY"
-
JetBrains MCP,
.codex/config.tomlor~/.codex/config.toml:[mcp_servers.jetbrains] url = "http://127.0.0.1:64342/stream"
Codex has no SSE transport, so on IntelliJ IDEA 2025.2/2025.3 use the stdio bridge:
[mcp_servers.jetbrains] command = "npx" args = ["-y", "mcp-remote", "http://127.0.0.1:64342/sse", "--transport", "sse-only"] startup_timeout_sec = 60
The stdio command from Copy Stdio Config (Settings → Tools → MCP Server, Manual Client Configuration) works too.
-
Context7 MCP,
.codex/config.tomlor~/.codex/config.toml:[mcp_servers.context7] url = "https://mcp.context7.com/mcp" http_headers = { Authorization = "Bearer YOUR_API_KEY" }
-
JetBrains MCP,
opencode.jsonor~/.config/opencode/opencode.json(on IntelliJ IDEA 2025.2/2025.3 use the/sseURL):{ "mcp": { "jetbrains": { "type": "remote", "url": "http://127.0.0.1:64342/stream", "enabled": true } } } -
Context7 MCP,
opencode.jsonor~/.config/opencode/opencode.json:{ "mcp": { "context7": { "type": "remote", "url": "https://mcp.context7.com/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" }, "enabled": true } } }
-
JetBrains MCP: not needed, so the installer skips it. Junie runs inside IntelliJ IDEA and already has native access to the IDE.
-
Context7 MCP,
.junie/mcp/mcp.jsonor~/.junie/mcp/mcp.json:{ "mcpServers": { "context7": { "command": "npx", "args": ["-y", "@upstash/context7-mcp"], "env": { "CONTEXT7_API_KEY": "YOUR_API_KEY" } } } }
The Cline VS Code extension, JetBrains plugin and CLI share one user-level file, ~/.cline/data/settings/cline_mcp_settings.json (%USERPROFILE%\.cline\data\settings\ on Windows). CLINE_MCP_SETTINGS_PATH (the file), CLINE_DATA_DIR (instead of ~/.cline/data) or CLINE_DIR (instead of ~/.cline) move it. Cline has no project MCP config, so cline in an MCP step writes this file whatever the --scope. The extension and the plugin pick up a change on their own; the CLI reads the file when a session starts.
Cline checks the whole file: with one entry it does not accept, such as Claude Code's "type": "http", it loads none of the servers. Spell type as streamableHttp, sse or stdio; a url entry without type is taken as SSE.
{
"mcpServers": {
"jetbrains": {
"type": "streamableHttp",
"url": "http://127.0.0.1:64342/stream"
},
"context7": {
"type": "streamableHttp",
"url": "https://mcp.context7.com/mcp",
"headers": { "Authorization": "Bearer YOUR_API_KEY" }
}
}
}On IntelliJ IDEA 2025.2/2025.3 the JetBrains entry is { "type": "sse", "url": "http://127.0.0.1:64342/sse" }. If the Cline JetBrains plugin already lists the IDE's MCP server on its own, delete the jetbrains entry so its tools are not offered twice. VS Code windows that still run Cline's legacy build read <VS Code user dir>/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json instead; copy the entries there if Cline in VS Code does not show them.
Claude Desktop reads MCP servers from a user-level claude_desktop_config.json:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json. The Store (MSIX) build reads its own copy under%LOCALAPPDATA%\Packages\*Claude_*\LocalCache\Roaming\Claude. The installer updates every copy that exists. - Linux:
~/.config/Claude/claude_desktop_config.json($XDG_CONFIG_HOME)
It is not a separate agent. When claude is selected in an MCP step, the installer also updates this file, whatever the --scope, if Claude Desktop is installed, i.e. its config folder exists. Start Claude Desktop once before running the installer. Claude Desktop accepts only stdio entries, so JetBrains MCP always goes through the mcp-remote bridge to /sse.
{
"mcpServers": {
"jetbrains": {
"command": "npx",
"args": ["-y", "mcp-remote", "http://127.0.0.1:64342/sse", "--transport", "sse-only"]
},
"context7": {
"command": "npx",
"args": ["-y", "@upstash/context7-mcp"],
"env": { "CONTEXT7_API_KEY": "YOUR_API_KEY" }
}
}
}After a change, quit Claude Desktop completely (not just its window) and start it again.
Playwright lets the agent verify a running application in the browser, from navigation to complex UI behavior. The toolkit registers the Playwright MCP server (@playwright/mcp), which the agent starts through npx (Node.js 20+).
Add the server to the files listed in MCP Servers:
-
Claude CLI:
claude mcp add --scope user playwright -- npx -y @playwright/mcp@latest. -
Codex (the first
npxdownload can outlast the default startup timeout):[mcp_servers.playwright] command = "npx" args = ["-y", "@playwright/mcp@latest"] startup_timeout_sec = 60
-
OpenCode:
{ "mcp": { "playwright": { "type": "local", "command": ["npx", "-y", "@playwright/mcp@latest"], "enabled": true } } } -
Junie, Cline and Claude Desktop:
{ "mcpServers": { "playwright": { "command": "npx", "args": ["-y", "@playwright/mcp@latest"] } } }
Then give the agent instructions like:
Run the app and use Playwright MCP to log in and test all created views