MCP server for Flutter/Dart dependency upgrade analysis, impact assessment, and migration planning
Virgil exhibits solid fundamentals: all 6 tools have action-verb names (scan_, check_, analyze_, generate_, fetch_, search_), documented descriptions (130-180 chars), and complete JSON Schema input specifications with typed parameters and per-parameter descriptions. Tool naming follows verb_noun convention clearly. However, output schemas are entirely undocumented, the code shows tools return JSON-encoded results via TextContent but reveals nothing about the structure LLMs will receive. Error handling is generic ('tool_name failed: $e') with no recovery guidance or actionable next steps. Parameter descriptions lack specificity: 'analysiDepth' explains enum options but doesn't state what happens when analysis reaches line_level; 'resolveTypes' says 'slower but more precise' without quantifying cost or when to use it. No evidence of pagination for list results or result-size caps. Tool composition is sound (each does one thing), but lacks chaining hints, fetch_changelog doesn't mention that its output feeds into analyze_upgrade_impact. Overall quality is above-average community baseline but falls short of production-grade due to missing output schemas and weak error guidance.
Analyze the impact of upgrading a specific package to a target version. Identifies breaking changes, affected code locations, and cascading dependency effects.
Check available upgrades for project dependencies. Can target a specific package or all packages. Optionally filters by Flutter SDK compatibility.
Fetch and parse the changelog for a package version or version range. Returns structured breaking changes, deprecations, and migration guidance.
Generate an ordered migration plan for upgrading one or more packages. Produces step-by-step instructions including pubspec changes, code modifications, and test command suggestions.
Scan a Flutter/Dart project to discover all dependencies, their current versions, version constraints, and SDK requirements. Parses pubspec.yaml and pubspec.lock.
Search the project codebase for usages of specific APIs from a package. Returns file locations, line numbers, and context for each match.
No documented output schemas for any tool. Code shows results are JSON-encoded and wrapped in TextContent, but LLMs have no visibility into the structure (fields, types, nesting) of returned data. This forces LLMs to guess at response structure and makes downstream tool chaining fragile.
Error handling is generic and non-actionable. All tool callbacks catch exceptions and return '_errorResult(tool_name failed: $e)' with no recovery guidance. LLMs cannot determine if an error is retryable, user-fixable, or fatal. Example: 'analyze_upgrade_impact failed: FileNotFoundException' tells the agent nothing about whether to retry, suggest a different projectPath, or abandon the operation.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 69 | <=2025-11-25 | v2 |
Parameter descriptions lack actionable constraints and format expectations. 'analysisDepth' enum options are documented but no guidance on which depth to choose for different scenarios. 'includeTransitive' has no explanation of performance implications. 'resolveTypes' mentions 'slower but more precise' with no quantification of tradeoffs. PROJ)' is actionable; bare descriptions invite invalid input.
No pagination or result-size limiting documented. search_api_usage and check_available_upgrades could return unbounded lists. No mention of limits, offsets, or next_cursor patterns.
Tool composition lacks chaining hints. fetch_changelog returns structured breaking changes and migration guidance but doesn't tell the agent that this output feeds into analyze_upgrade_impact or generate_migration_plan. No cross-tool dependency documentation forces agents to discover relationships via trial.