name: mps-ide-plugin description: >- Use 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<...>. type: reference
MPS IDE Plugin Language
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).