| name | plugin-model-analyzer |
| description | Query IntelliJ Product DSL modules, products, plugin graphs, loading, validation, and packaging. |
Plugin Model Analyzer
Use the Product DSL analyzer directly through Bazel. Do not call the retired PluginModelAnalyzer MCP server.
Command Shape
Run from the repository root:
bazel run --ui_event_filters=-info --noshow_progress //platform/buildScripts:plugin-model-tool -- --json='<request-json>'
The output is JSON with a timestamp plus one result property named after the requested filter.
Prefer small, typed JSON requests. Avoid unfiltered --json: it emits the full model and is usually too large for agent context.
Use JSON fields, not extra CLI flags, to describe the query. Treat the single top-level result property as the answer.
Transport options:
- Short request:
--json='{"filter":"summary","limit":5}'
- Stdin request:
--json=-
- File request:
--json=@/private/tmp/plugin-model-query.json
Common Requests
Module overview:
{"filter":"moduleInfo","module":"intellij.platform.vcs.impl","limit":20}
Module dependencies:
{"filter":"moduleDependencies","module":"intellij.platform.vcs.impl","includeTransitive":false,"includeTestDependencies":false}
Dependency path:
{"filter":"dependencyPath","fromModule":"intellij.platform.vcs.impl","toModule":"intellij.platform.projectModel.impl","includeTestDependencies":true,"includeScopes":true}
Module owners:
{"filter":"moduleOwners","module":"intellij.platform.vcs.impl","includeTestSources":true}
Module-set details or search:
{"filter":"moduleSetQuery","moduleSet":"ide.common","details":false,"limit":50}
{"filter":"moduleSetQuery","name":"vcs","location":"COMMUNITY","minModuleCount":3,"limit":20}
Product details or search:
{"filter":"productQuery","product":"idea","details":false,"limit":50}
{"filter":"productQuery","usesModuleSet":"ide.common","limit":30}
Product comparison and trace path:
{"filter":"productCompare","product":"idea","product2":"Idea","limit":50}
{"filter":"productTracePath","product":"idea","moduleSet":"ide.common","limit":20}
Embedded dependency closure:
{"filter":"embeddedDependencyClosure","value":"idea","moduleSet":"ide.common","pluginSourceOnly":true}
Merge or inline impact:
{"filter":"mergeImpact","source":"some.module.set","target":"target.module.set","operation":"merge"}
{"filter":"mergeImpact","source":"some.module.set","operation":"inline"}
Validation and loading-rule checks:
{"filter":"validation","check":"community_products"}
{"filter":"validation","check":"module_set_locations"}
{"filter":"validation","check":"loading_inconsistencies"}
{"filter":"validation","check":"embedded_dependency_closure","product":"idea","pluginSourceOnly":true}
{"filter":"moduleLoading","loading":"EMBEDDED","limit":100}
Refactoring candidates:
{"filter":"moduleSetOverlap","minOverlapPercent":70,"limit":20}
{"filter":"productSimilarity","threshold":0.8,"limit":20}
{"filter":"unificationSuggestions","strategy":"merge","limit":10}
{"filter":"redundantModuleSetRefs","product":"idea","limit":50}
{"filter":"suggestModuleSetsForModules","modules":["intellij.platform.vcs.impl","intellij.platform.vcs.log.impl"],"limit":20}
Deprecated xi:include usage:
{"filter":"deprecatedIncludes","product":"idea","limit":100}
Old MCP Operation Map
Use this map when a prompt or older instruction mentions the retired PluginModelAnalyzer MCP operation names.
| Old operation | JSON request |
|---|
analyze_module_structure | {"filter":"summary"} |
module info | {"filter":"moduleInfo","module":"<module>"} |
module dependencies | {"filter":"moduleDependencies","module":"<module>"} |
module paths | {"filter":"modulePaths","module":"<module>"} |
module reachability | {"filter":"moduleReachability","module":"<module>","moduleSet":"<set>"} |
module find_by_loading | {"filter":"moduleLoading","loading":"EMBEDDED","details":true} |
module dependency_path | {"filter":"dependencyPath","fromModule":"<from>","toModule":"<to>","includeScopes":true} |
module-set info | {"filter":"moduleSetQuery","moduleSet":"<set>"} |
module-set search | {"filter":"moduleSetQuery","name":"<name>","location":"COMMUNITY","limit":20} |
module-set hierarchy | {"filter":"moduleSetQuery","moduleSet":"<set>","details":true} |
module-set overlap | {"filter":"moduleSetOverlap","minOverlapPercent":70,"limit":20} |
module-set graph | No ASCII graph output; use moduleSetQuery plus productTracePath or productUsage for structured edges. |
module-set suggest_for_modules | {"filter":"suggestModuleSetsForModules","modules":["<module>"]} |
product info | {"filter":"productQuery","product":"<product>"} |
product search | {"filter":"productQuery","name":"<name>","limit":20} |
product compare | {"filter":"productCompare","product":"<product1>","product2":"<product2>"} |
product similar | {"filter":"productSimilarity","threshold":0.8,"limit":20} |
product composition | {"filter":"composition"} for all products; use productQuery for one product. |
product trace_path | {"filter":"productTracePath","product":"<product>","moduleSet":"<set>"} |
product deprecated_includes | {"filter":"deprecatedIncludes","product":"<product>"} |
product full_analysis | Avoid unless explicitly needed; omit the filter only when the full raw model is required. |
validation community_products | {"filter":"validation","check":"community_products"} |
validation module_set_locations | {"filter":"validation","check":"module_set_locations"} |
validation loading_inconsistencies | {"filter":"validation","check":"loading_inconsistencies"} |
Fast Recipes
Where is a module included?
{"filter":"moduleInfo","module":"<module>","limit":50}
{"filter":"modulePaths","module":"<module>"}
What depends on what, and why?
{"filter":"moduleDependencies","module":"<module>","includeTransitive":false,"includeTestDependencies":false}
{"filter":"dependencyPath","fromModule":"<from>","toModule":"<to>","includeTestDependencies":true,"includeScopes":true}
Who owns a module?
{"filter":"moduleOwners","module":"<module>","includeTestSources":true}
Which products or module sets use something?
{"filter":"moduleInfo","module":"<module>","limit":50}
{"filter":"productQuery","usesModuleSet":"<module-set>","limit":50}
{"filter":"productUsage","moduleSet":"<module-set>"}
Can a module stop being embedded?
{"filter":"moduleInfo","module":"<module>","limit":50}
{"filter":"moduleLoading","loading":"EMBEDDED","details":true,"limit":200}
{"filter":"validation","check":"embedded_dependency_closure","module":"<module>","pluginSourceOnly":true}
For the loading query, inspect moduleLoading.result.entries.items for the target module; moduleLoading filters by loading rule, not by module name. The embedded closure check answers whether an embedded source module has dependencies that are not also supplied by embedded sources in affected products.
Did a Product DSL edit introduce placement or loading problems?
{"filter":"validation","check":"community_products"}
{"filter":"validation","check":"module_set_locations"}
{"filter":"validation","check":"loading_inconsistencies"}
{"filter":"validation","check":"embedded_dependency_closure","pluginSourceOnly":true}
Which module set should contain these modules?
{"filter":"suggestModuleSetsForModules","modules":["<module1>","<module2>"],"limit":20}
Reading Output
- Compact list fields use
count, items, and truncated; increase limit or set details:true only when needed.
- Some focused filters return an
error field in JSON for missing selectors or unknown names; a successful process exit does not always mean the query matched.
- For direct
embeddedDependencyClosure, use value for the product selector. The validation wrapper accepts product or value.
location values are COMMUNITY or ULTIMATE. loading values are EMBEDDED, REQUIRED, OPTIONAL, ON_DEMAND, or UNSPECIFIED.
Request Fields
Use only fields relevant to the filter. Omit false, null, and default values unless they are semantically important.
Core selectors: filter, value, module, moduleSet, product, product2, name, location, usesModuleSet, modules, fromModule, toModule, source, target.
Options: operation, graph, check, loading, strategy, limit, minModuleCount, details, threshold, minOverlapPercent, includeTransitive, includeTestDependencies, includeTestSources, includeScopes, pluginSourceOnly.
Practical Rules
- Start with
summary, moduleInfo, moduleSetQuery, or productQuery when exploring.
- Use
details:false and a small limit until you know the exact module set or product.
- Use the legacy precise filters (
moduleDependencies, dependencyPath, moduleOwners, moduleReachability, productUsage, embeddedDependencyClosure, mergeImpact) when you need the full typed analysis for one target.
- Use
--json=- or --json=@file for complex requests instead of adding more CLI flags.
- If the command fails before producing JSON, treat stderr as the source of truth; invalid JSON requests exit nonzero.