MPS IDE Plugin Language
SkillDev toolsUse when authoring or modifying MPS IDE plugins — code that integrates with the MPS / IntelliJ host IDE shell. Covers ActionDeclaration, ActionGroupDeclaration, ToolDeclaration/TabbedToolDeclaration (dockable tool windows), KeymapChangesDeclaration (shortcuts), PreferencesComponentDeclaration (settings pages), EditorTab+Order (concept editor tabs), InterfaceGroup (bootstrap wrappers around external groups), NonDumbAwareActions, IdeaConfigurationXml, ApplicationPluginDeclaration/ProjectPluginDeclaration/StandalonePluginDescriptor (lifecycle hooks). Uses jetbrains.mps.lang.plugin and jetbrains.mps.lang.plugin.standalone. Trigger terms: action group, tool window, menu item, MainMenu, EditorPopup, NodeActions, ModelActions, ModuleActions, ProjectViewPopupMenu, MPS plugin solution, ActionInstance, ModificationStatement, DataKey, MPSCommonDataKeys, MPSDataKeys, dumb-aware, project.tool<...>, project.preferenceComponent<...>, application plugin<...>, project plugin<...>.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the MPS IDE Plugin Language skill
What this skill tells your AI
The instructions your AI receives, as published by jetbrains/mps in .agents/skills/mps-ide-plugin/SKILL.md and read by ahel’s review.
This skill covers IDE plugins: code that integrates with the MPS/IntelliJ host IDE — menu actions, tool windows, shortcuts, settings panels. Plugin code lives in a regular Solution module (compilation mode: "Regular MPS module contributing extensions to MPS") with model(s) using jetbrains.mps.lang.plugin and jetbrains.mps.lang.plugin.standalone. The canonical model name is <solution_name>.plugin — MPS auto-registers it on that convention.
Official documentation: https://www.jetbrains.com/help/mps/plugin.html
Critical Directives
- Disambiguate the overloaded vocabulary first. "Plugin", "tool", "action group" each mean two or three different things. See
references/terminology.mdbefore naming anything. - A plugin solution is NOT an IntelliJ plugin jar. The solution contains MPS models; the jar is what the MPS Build Language packages from it. Don't conflate.
- A
Toolis a tool window — a dockable panel — not a CLI tool or an action. - Use MPS MCP tools for edits.
mps_mcp_insert_root_node_from_json,mps_mcp_update_node,mps_mcp_print_node. Resolve concept names withmps_mcp_search_concepts/mps_mcp_get_concept_details; never guess. ModificationStatement.modifiedGroupis a node reference (r:...), not a concept reference (c:...). Look up the target group viamps_mcp_search_root_node_by_nameto obtain the node ref.- Add a model dependency on
jetbrains.mps.ide.actionsbefore referencing built-in groups (MainMenu,EditorPopup,NodeActions,ModelActions,ModuleActions,MainToolbar,ProjectViewPopupMenu). - Pick
requiredAccessdeliberately:none(no model touch),read(safe traversal),command(mutates with undo + write lock — never open modal dialogs from here),editorCommand(correct undo scope for editor-driven edits). - Don't call
project.tool<…>fromdispose. The lookup can fail during teardown. - Mac keymap trap: with
Keymap = Default, MPS translatesctrl→cmdon macOS. If you specifically wantctrlon Mac, add a separateMac_OS_XKeymapChangesDeclaration. - After edits, rebuild the module (
mps_mcp_alter_nodesMAKE) so generated Java is current, then Reload All in MPS for hot-load. - Validate every new root with
mps_mcp_check_root_node_problems.
Required Used Languages (on the Model)
jetbrains.mps.lang.plugin— core concepts (Action, Group, Tool, …).jetbrains.mps.lang.plugin.standalone— ApplicationPlugin / ProjectPlugin,project.tool<...>,project.preferenceComponent<...>,StandalonePluginDescriptor.jetbrains.mps.baseLanguage(+.classifiers,.collections,.closures) — for code bodies.jetbrains.mps.lang.smodelif you touch nodes/models.jetbrains.mps.lang.resourcesfor icons.
Common-Path Workflow
For a typical "add a menu item that does X on the selected node":
- Identify the context — which IDE menu/toolbar should it appear in? (
MainMenu,EditorPopup,NodeActions,ProjectViewPopupMenu, …). - Locate the target group.
mps_mcp_search_root_node_by_namefor the group name. Inspect withmps_mcp_print_nodeto discover theGroupAnchors you can target. - Decide plugin solution location. Reuse an existing
*.pluginSolutionmodule if one fits; otherwise create a new solution and a<name>.pluginmodel with the used languages above. - Author an
ActionDeclaration— seereferences/actions.md. Set name, caption, parameters (MPSCommonDataKeys.MPS_PROJECT/.NODEetc.),requiredAccess, isApplicable, execute body. - Author an
ActionGroupDeclaration— seereferences/action-groups.md. Owns your action(s) viaElementListContents→ActionInstance. Add aModificationStatementundermodifiertargeting the existing group + an anchor. - Add a keybinding (optional) — new
KeymapChangesDeclarationreferencing the action — seereferences/keymaps.md. - Rebuild the solution via
mps_mcp_alter_nodesMAKE; reload MPS. - Validate with
mps_mcp_check_root_node_problemson each new root.
For other task families: tool window → references/tools.md; settings page → references/preferences.md; editor tabs → references/editor-tabs.md; bespoke startup → references/lifecycle-plugins.md.
Reference Examples in This Repository
Seed mps_mcp_print_node / mps_mcp_query_nodes (FIND_USAGES) with these:
| Concept | Example nodes | Model |
|---|---|---|
ActionDeclaration | ShowHelpForNode, ShowDefaultHelp, ShowHelpForRoot, ShowHelpForAspect | jetbrains.mps.lang.structure.pluginSolution.plugin |
ActionGroupDeclaration | ShowHelp (contributes to Structure and ModelActions) | jetbrains.mps.lang.structure.pluginSolution.plugin |
ToolDeclaration | TodoViewer | jetbrains.mps.ide.tools.todo |
PreferencesComponentDeclaration | BehaviorDialogsPersistentOptions | jetbrains.mps.ide.actions |
InterfaceGroup | IDEAWindows, IDEAGoTo, IDEAEdit, IDEAFile, IDEAView, IDEATools, IDEAVCS | jetbrains.mps.ide.actions |
EditorTab | Actions, Behavior, Constraints, Data Flow, Editor, Feedback, Find Usages, Generator, Intentions, Refactorings, Structure, Textgen, Typesystem | jetbrains.mps.ide.devkit.editor |
EditorTab (alt) | Run Configuration, Executor, Producer | jetbrains.mps.execution.configurations.pluginSolution.plugin |
Order (editor tabs) | Order root | jetbrains.mps.ide.devkit.editor |
Related Skills
mps-aspect-actions— node factories, unrelated to IDE actions despite the name.mps-aspect-intentions— Alt+Enter context actions inside the projectional editor.mps-aspect-editor-menus-and-keymaps— editor cell actions, substitute menus, side transforms (a different layer from the IDE shell).mps-build-language— packaging a plugin solution into a distributable MPS/IDEA plugin (the build script must copystartup.propertiesfrom the solution's resources).mps-quotations/mps-model-manipulation— writing the base-language bodies insideexecute/isApplicable/init/disposeblocks.mps-baselanguage— mechanics of building BaseLanguage JSON.
Reference Index
- Open
references/terminology.mdwhen starting any plugin task — disambiguates "plugin solution" vs "IntelliJ plugin",ApplicationPlugin/ProjectPluginvs the deployable jar,Tool(tool window) vs "CLI tool",ActionGroupvsBootstrapGroup/InterfaceGroup, anchor (->),EditorMenu/SubstituteMenu(different aspect), Intention (different aspect), Node Factory (different language). - Open
references/concept-catalog.mdwhen looking up a concept FQN — every rootable concept (ActionDeclaration,ActionGroupDeclaration,InterfaceGroup,ToolDeclaration,TabbedToolDeclaration,KeymapChangesDeclaration,PreferencesComponentDeclaration,EditorTab,Order,NonDumbAwareActions,IdeaConfigurationXml,IdeaInitializerDescriptor,ApplicationPluginDeclaration,ProjectPluginDeclaration,StandalonePluginDescriptor) plus every non-root concept you reference (blocks, parameters, instances, anchors, separators, keystrokes, shortcut changes, preference pages, persistent properties, etc.). - Open
references/actions.mdwhen declaring or modifying anActionDeclaration— all fields (name,caption,description,mnemonic,ID,overrides,isAlwaysVisible,requiredAccess,outsideCommandExecution,updateInBackground,fillActionContext,nativeLanguage,updateBlock,executeFunction,icon,parameter,constructionParameter,methodDeclaration,places), the two parameter kinds (ActionDataParameterDeclarationsimple-from-DataKey vsActionParameterDeclarationcomplex-typed),RequiredConditionvsisOptional, how to refer to parameters inside bodies (ActionParameterReferenceOperation/ActionDataParameterReferenceOperation), theShowHelpForNodeblueprint with typicalMPSCommonDataKeys.MPS_PROJECT+MPSCommonDataKeys.NODE, and therequiredAccesstable (none/read/command/editorCommand) with the dialog-from-commanddeadlock warning. - Open
references/action-groups.mdwhen assembling menus / toolbars / popups —ActionGroupDeclarationfields (name,caption,mnemonic,isPopup,isInvisibleWhenDisabled,isInternal,isPluginXmlGroup,updateInBackground,modifier,contents), the threecontentsvariants (ElementListContentsstatic /BuildGroupBlockonce /UpdateGroupBlockevery open),ActionGroupMemberinterface,ActionInstancewithactualParameterfor construction parameters,GroupAnchor(named slots),Separator,InterfaceExtentionPoint(bootstrap ->),ModificationStatementto plug intoMainMenu/EditorPopup/NodeActions/ etc., and theShowHelpblueprint. - Open
references/tools.mdwhen building a tool window —ToolDeclarationfields (name,caption,positionenum,isAvailableOnStartup,numberdeprecated,icondeprecated,toolIcon,getComponentBlock,toolInitBlock,toolDisposeBlock,fieldDeclaration,methodDeclaration,shortcut), the lifecycle (BaseProjectTool, init once, dispose on close, never callproject.tool<…>from dispose), retrieval viaproject.tool<MyTool>(GetToolInProjectOperation), theTodoViewerblueprint, andTabbedToolDeclarationdifferences (nogetComponentBlock, tabs added from init). - Open
references/keymaps.mdwhen adding shortcuts —KeymapChangesDeclarationfields (name,keymapenum:Default/Mac_OS_X/Mac_OS_X_Plus/XWin/GNOME/KDE,isPluginXmlKeymap,shortcutChange),SimpleShortcutChangewith action ref + orderedKeyMapKeystrokesequence (chords),KeyMapKeystrokefields (modifiersspace-separated string,keycodeJava-style likeVK_F9,changeenumreplace_all/remove), theDefault→cmd-on-Mac translation, blueprint forHelpKeymapwithCtrl-F1. - Open
references/preferences.mdwhen creating a Settings dialog page —PreferencesComponentDeclarationfields (name,persistenPropertyDeclaration,afterReadBlock,beforeWriteBlock,preferencePage),PreferencePagefields (name,helpTopic,icon,component,isModifiedBlock,resetBlock,commitBlock), how to retrieve from code (project.preferenceComponent<MyPrefs>), persistence toworkspace.xml, theMyPluginPrefsskeleton. - Open
references/editor-tabs.mdwhen adding tabs to a concept editor (e.g. the language-definition editor'sStructure/Editor/Behaviortabs) —EditorTabfields (name,shortcutChar,commandOnCreatedeprecated,baseNodeConcept,icon,orderlegacy,listenBlock,baseNodeBlock,isApplicableBlock,nodesBlock,createTabBlock),Orderroot +EditorTabReferencefor left-to-right ordering, theBehaviortab blueprint. - Open
references/interface-group.mdwhen targeting an external (IDEA / platform) action group —InterfaceGroupfields (name,groupID,contents,modifier), thegroupIDexpression pattern (IdeActions.GROUP_FILEetc.), theIDEAFileblueprint, andInterfaceExtentionPoint(bootstrap ->) for external extension-point ids inside anElementListContents. - Open
references/non-dumb-aware.mdwhen opting actions out of dumb mode —NonDumbAwareActionsroot, one per plugin model, listing actions that must not run while indexing is in progress. - Open
references/idea-configuration-xml.mdwhen the higher-level concepts can't express something —IdeaConfigurationXml(outputPath,actionschild ofIdeaActionsDescriptor) for emitting rawMETA-INF/IdeaComponents.xml. Use sparingly. - Open
references/lifecycle-plugins.mdwhen needing bespoke application or project lifecycle hooks —ApplicationPluginDeclaration(app scope) vsProjectPluginDeclaration(project scope,initBlock/disposeBlockreceiveproject),fieldDeclarationfor private state, retrieval viaapplication plugin<Name>/project plugin<Name>, theProjectPluginskeleton, when to addStandalonePluginDescriptor(model not following<solution>.pluginconvention;needInitConfigUI toggle). - Open
references/common-failures.mdwhen a plugin feature misbehaves — "Group X not found" (missingjetbrains.mps.ide.actionsdep); concept-ref-vs-node-ref confusion onmodifiedGroup; action doesn't appear (modifier missing / required param unresolved /isAlwaysVisiblenot set); deadlock when opening dialog from execute (requiredAccess = commandholds write lock — compute inputs first, thenproject.modelAccess.executeCommand { ... });TabbedToolmissinggetComponentBlock(by design); ctrl shortcut works on Win but not Mac (Defaulttranslates tocmd);constructionParameterwithouttoString()causes generated-ID collisions; IDE doesn't see edits (rebuild + Reload All).
Signals
- GitHub stars
- 2k
- Forks
- 309
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
mps-ide-plugin- Source
- github.com/jetbrains/mps