This release adds 5 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+2 more
Summary
AI summaryAdded seven new diagnostic and analysis tools, expanded existing tool capabilities, and fixed multiple bugs.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | Medium |
Bad JSON-RPC params return `-32602 Invalid params` (per spec), not a generic error. Bad JSON-RPC params return `-32602 Invalid params` (per spec), not a generic error. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: low |
— |
| Breaking | Medium |
`health_check` response now uses `{success, data, meta}` envelope; callers must read `data.status` instead of `status`. `health_check` response now uses `{success, data, meta}` envelope; callers must read `data.status` instead of `status`. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Feature | Medium |
`get_external_type_info` inspects NuGet/BCL/external-assembly types: members, signatures, XML doc summaries. `get_external_type_info` inspects NuGet/BCL/external-assembly types: members, signatures, XML doc summaries. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Feature | Medium |
`get_call_graph` provides multi-hop callers/callees with depth/node caps and cycle detection. `get_call_graph` provides multi-hop callers/callees with depth/node caps and cycle detection. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Feature | Medium |
`find_untested_code` identifies public surface not reached by any xUnit/NUnit/MSTest test method. `find_untested_code` identifies public surface not reached by any xUnit/NUnit/MSTest test method. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Feature | Medium |
`find_god_objects` detects over-coupled types via efferent + afferent coupling and member count. `find_god_objects` detects over-coupled types via efferent + afferent coupling and member count. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Feature | Medium |
`get_project_health` offers a composite audit dashboard: diagnostics, unused code, coupling, coverage. `get_project_health` offers a composite audit dashboard: diagnostics, unused code, coupling, coverage. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Feature | Low |
`get_diagnostics` runs configured DiagnosticAnalyzer's (StyleCop, Roslynator, NetAnalyzers, custom) by default. `get_diagnostics` runs configured DiagnosticAnalyzer's (StyleCop, Roslynator, NetAnalyzers, custom) by default. Source: granite4.1:30b@2026-05-20-audit Confidence: low |
— |
| Feature | Low |
`find_references` reports a `cast` kind and accepts an optional `kind` filter. `find_references` reports a `cast` kind and accepts an optional `kind` filter. Source: granite4.1:30b@2026-05-20-audit Confidence: low |
— |
| Feature | Low |
`format_document_batch` accepts an optional `filePattern` glob (matches `organize_usings_batch`). `format_document_batch` accepts an optional `filePattern` glob (matches `organize_usings_batch`). Source: granite4.1:30b@2026-05-20-audit Confidence: low |
— |
| Feature | Low |
Test count increased from 127 to 544; every tool now has an end‑to‑end MCP‑layer integration test against a deterministic fixture. Test count increased from 127 to 544; every tool now has an end‑to‑end MCP‑layer integration test against a deterministic fixture. Source: granite4.1:30b@2026-05-20-audit Confidence: low |
— |
| Feature | Low |
JSON‑RPC notifications produce no response (per spec §4.3); no more responses to `initialize` or other no‑id requests. JSON‑RPC notifications produce no response (per spec §4.3); no more responses to `initialize` or other no‑id requests. Source: granite4.1:30b@2026-05-20-audit Confidence: low |
— |
| Dependency | Medium |
Added `Microsoft.CodeAnalysis.CSharp.Features` for C#-specific refactorings (inline temporary, expression-body, invert-if, ~60 more). Added `Microsoft.CodeAnalysis.CSharp.Features` for C#-specific refactorings (inline temporary, expression-body, invert-if, ~60 more). Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`change_signature` no longer reports applied:true while editing nothing; updates declaration and all call sites, including constructors, local functions, and named arguments. `change_signature` no longer reports applied:true while editing nothing; updates declaration and all call sites, including constructors, local functions, and named arguments. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`extract_method` now applies edits on `preview:false`. `extract_method` now applies edits on `preview:false`. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`apply_code_fix` post-apply `get_diagnostics` no longer reports the just-fixed diagnostic as still present (stale-cache bug). `apply_code_fix` post-apply `get_diagnostics` no longer reports the just-fixed diagnostic as still present (stale-cache bug). Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`generate_equality_members`, `organize_usings_batch`, and `format_document_batch` invalidate compilation cache after writing to disk. `generate_equality_members`, `organize_usings_batch`, and `format_document_batch` invalidate compilation cache after writing to disk. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`get_code_actions_at_position` and `apply_code_action_by_title` return real Roslyn refactorings instead of empty lists. `get_code_actions_at_position` and `apply_code_action_by_title` return real Roslyn refactorings instead of empty lists. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`get_source_generators` surfaces underlying generator type instead of `IncrementalGeneratorWrapper`. `get_source_generators` surfaces underlying generator type instead of `IncrementalGeneratorWrapper`. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`get_instantiation_options` returns external factories on projects with source generators. `get_instantiation_options` returns external factories on projects with source generators. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`analyze_data_flow`, `analyze_control_flow`, and `get_file_overview` return structured `FileNotInSolution` error for unknown paths instead of unstructured rethrow. `analyze_data_flow`, `analyze_control_flow`, and `get_file_overview` return structured `FileNotInSolution` error for unknown paths instead of unstructured rethrow. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`analyze_data_flow` / `analyze_control_flow` work on regions that span block boundaries. `analyze_data_flow` / `analyze_control_flow` work on regions that span block boundaries. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`find_attribute_usages` and `find_reflection_usage` report accurate `totalCount` when `maxResults` is hit. `find_attribute_usages` and `find_reflection_usage` report accurate `totalCount` when `maxResults` is hit. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`search_symbols` pagination reports true match count (no `+100` cap). `search_symbols` pagination reports true match count (no `+100` cap). Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`find_god_objects` no longer over-counts efferent coupling via `nameof()`, using-directives, or types from referenced projects. `find_god_objects` no longer over-counts efferent coupling via `nameof()`, using-directives, or types from referenced projects. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`find_untested_code` matches test attributes by `(namespace, name)` and honors `includeProperties`. `find_untested_code` matches test attributes by `(namespace, name)` and honors `includeProperties`. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`find_references.kind` reports actual usage (read/write/invocation/typeof/nameof/attribute/cast), not hardcoded `read`. `find_references.kind` reports actual usage (read/write/invocation/typeof/nameof/attribute/cast), not hardcoded `read`. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
Records report `Record` / `RecordStruct` in `typeKind` and `kind:` filters instead of `Class`. Records report `Record` / `RecordStruct` in `typeKind` and `kind:` filters instead of `Class`. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`rename_symbol` rejects invalid C# identifiers with `INVALID_PARAMETER`. `rename_symbol` rejects invalid C# identifiers with `INVALID_PARAMETER`. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Bugfix | Medium |
`generate_constructor` response carries `appliesEditsAutomatically: false`. `generate_constructor` response carries `appliesEditsAutomatically: false`. Source: granite4.1:30b@2026-05-20-audit Confidence: low |
— |
Full changelog
Added
get_external_type_info— inspect NuGet/BCL/external-assembly types: members, signatures, XML doc summariesget_call_graph— multi-hop callers/callees with depth/node caps and cycle detectionfind_untested_code— public surface not reached by any xUnit/NUnit/MSTest test methodfind_god_objects— over-coupled types via efferent + afferent coupling and member countget_project_health— composite audit dashboard: diagnostics + unused + coupling + coverage
Changed
- Tool count: 62 → 67
get_diagnosticsruns configuredDiagnosticAnalyzers by default (StyleCop, Roslynator, NetAnalyzers, custom). PassrunAnalyzers: falsefor compiler-only outputfind_referencesreports acastkind and accepts an optionalkindfilterformat_document_batchaccepts an optionalfilePatternglob (matchesorganize_usings_batch)health_checkresponse now uses the standard{success, data, meta}envelope. Callers must readdata.statusinstead ofstatusgenerate_constructorresponse carriesappliesEditsAutomatically: falseto make its generation-only semantics explicit- Bad JSON-RPC params return
-32602 Invalid params(per spec), not a generic error - Added
Microsoft.CodeAnalysis.CSharp.Featuresso C#-specific refactorings load (inline temporary, expression-body, invert-if, ~60 more) - Test count: 127 → 544; every tool has an end-to-end MCP-layer integration test against a deterministic fixture
Fixed
change_signatureno longer reportsapplied: truewhile editing nothing; it now updates the declaration and every call site, including constructors, local functions, and named argumentsextract_methodactually applies edits onpreview: falseapply_code_fixpost-applyget_diagnosticsno longer reports the just-fixed diagnostic as still present (stale-cache bug)generate_equality_members,organize_usings_batch, andformat_document_batchnow invalidate the compilation cache after writing to disk; subsequent compilation reads served pre-edit content otherwiseget_code_actions_at_positionandapply_code_action_by_titlereturn real Roslyn refactorings instead of empty listsget_source_generatorssurfaces the underlying generator type instead ofIncrementalGeneratorWrapperget_instantiation_optionsreturns external factories on projects with source generatorsanalyze_data_flow,analyze_control_flow, andget_file_overviewreturn a structuredFileNotInSolutionerror for unknown paths instead of an unstructured rethrowanalyze_data_flow/analyze_control_flowwork on regions that span block boundariesfind_attribute_usagesandfind_reflection_usagereport accuratetotalCountwhenmaxResultsis hitsearch_symbolspagination reports the true match count (no+100cap)find_god_objectsno longer over-counts efferent coupling vianameof(), using-directives, or types from referenced projectsfind_untested_codematches test attributes by(namespace, name)so look-alikes in user namespaces aren't treated as test methods; honorsincludePropertiesfind_references.kindreports actual usage (read/write/invocation/typeof/nameof/attribute/cast), not hardcodedread- Records report
Record/RecordStructintypeKindandkind:filters instead ofClass rename_symbolrejects invalid C# identifiers withINVALID_PARAMETER- JSON-RPC notifications produce no response (per spec §4.3) — no more
{"id": null, ...}answers toinitializeor other no-id requests - Relative paths from tool responses round-trip back through subsequent calls
FindTypeByNamereturns symbolsSymbolFinderrecognizes on generator-using projectssync_documents.filePathsrejects non-string array elements with-32602 Invalid params
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About pzalutski-pixel/sharplens-mcp
58 semantic C#/.NET analysis tools via Roslyn. Navigation, refactoring, find usages, and code intelligence for AI agents.
Related context
Beta — feedback welcome: [email protected]