MCP server for Skyrim plugin analysis using Mutagen library. Provides tools for querying plugin load order, analyzing FormKey override chains, detecting conflicts, and comparing plugins.
Mutagen MCP has well-structured tool definitions with explicit schemas and descriptions. All 5 tools are registered with [McpServerTool] attributes and include parameter descriptions. However, descriptions are verbose (often 200+ chars) and could be more LLM-optimized. Parameter schemas are present but lack explicit type constraints (enums, min/max bounds). Error handling is present but generic. No tool annotations (readOnlyHint, destructiveHint) despite all tools being read-only. Output schemas are not formally documented in the code.
Lists plugins in plugins.txt order that define the given FormKey as a major record; last is the winning override. By default winnerOnly is true: returns only the winning plugin (highest load-order index that contains the FormKey). Binary overlay uses the same parallelism as a full scan (OverrideChainOverlayMaxDegreeOfParallelism); every plugin may still be opened. Set winnerOnly false to list all contributors in load order. Uses fast per-plugin binary overlay by default (OverrideChainUseBinaryOverlay, OverrideChainOverlayMaxDegreeOfParallelism); set false for full GameEnvironment load. Plugins enabled in plugins.txt but without a resolved file path are skipped entirely. When MutagenMcp PrependImplicitStandardMasters is true (default), standard Skyrim masters on disk are prepended if missing from plugins.txt (MO2). When the chain is empty, the response includes emptyResultDiagnostics (load-order resolution counts, standard master file resolution, hint).
Lists plugins from plugins.txt in load order. Files are resolved on disk using DataFolder + PluginSearchRoots (later roots win). Optional headers use Mutagen overlay reads (costly). Use offset + maxPlugins to page; onlyFileMissing keeps plugins not found on disk. count matches returnedCount (legacy).
Reads ModHeader + master list for one plugin; file is resolved via DataFolder + PluginSearchRoots.
Returns the first N major records from one plugin using binary overlay only (no full GameEnvironment). Use to obtain real formKey values for mutagen_formid_override_chain or debugging.
Descriptions are verbose (200-400+ chars) and lack LLM-optimized structure. Best practice is 50-200 chars with clear WHAT/WHEN/WHY. Example: mutagen_formid_override_chain description is 600+ chars, burying key intent.
No tool annotations despite all tools being read-only. Missing readOnlyHint attribute would help agents understand safety and enable aggressive caching/retry strategies.
Parameter constraints lack formal enums and bounds. Example: maxPlugins, maxRecords, maxChainLength accept integers but no min/max validation visible in schema. LLMs may pass invalid values (0, negative, or absurdly large numbers).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 40 | <=2025-11-25 | v2 |
Reports server build version (confirm MCP image/DLL), plugins.txt path, search roots, game release. Safe to call first.
Output schemas not formally documented. Code shows JSON serialization but no explicit schema definition for response objects (e.g., what fields does mutagen_list_plugins return? What is the structure of the chain in mutagen_formid_override_chain?).
Error responses are generic (Error() method returns unstructured strings). No actionable recovery guidance. Example: 'bad formKey' tells agent nothing about valid format; should return 'Invalid FormKey format. Expected: hexId:PluginFile.esp (e.g., 0E40B9:Skyrim.esm)'.