Skip to content

This release adds 5 notable features for engineering teams evaluating rollout.

Published 15d MCP Developer Tools
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

ai claude-code code-analysis c# .net mcp
+2 more
roslyn semantic-analysis

Summary

AI summary

Added seven new diagnostic and analysis tools, expanded existing tool capabilities, and fixed multiple bugs.

Changes in this release

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 summaries
  • get_call_graph — multi-hop callers/callees with depth/node caps and cycle detection
  • find_untested_code — public surface not reached by any xUnit/NUnit/MSTest test method
  • find_god_objects — over-coupled types via efferent + afferent coupling and member count
  • get_project_health — composite audit dashboard: diagnostics + unused + coupling + coverage

Changed

  • Tool count: 62 → 67
  • get_diagnostics runs configured DiagnosticAnalyzers by default (StyleCop, Roslynator, NetAnalyzers, custom). Pass runAnalyzers: false for compiler-only output
  • find_references reports a cast kind and accepts an optional kind filter
  • format_document_batch accepts an optional filePattern glob (matches organize_usings_batch)
  • health_check response now uses the standard {success, data, meta} envelope. Callers must read data.status instead of status
  • generate_constructor response carries appliesEditsAutomatically: false to make its generation-only semantics explicit
  • Bad JSON-RPC params return -32602 Invalid params (per spec), not a generic error
  • Added Microsoft.CodeAnalysis.CSharp.Features so 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_signature no longer reports applied: true while editing nothing; it now updates the declaration and every call site, including constructors, local functions, and named arguments
  • extract_method actually applies edits on preview: false
  • apply_code_fix post-apply get_diagnostics no longer reports the just-fixed diagnostic as still present (stale-cache bug)
  • generate_equality_members, organize_usings_batch, and format_document_batch now invalidate the compilation cache after writing to disk; subsequent compilation reads served pre-edit content otherwise
  • get_code_actions_at_position and apply_code_action_by_title return real Roslyn refactorings instead of empty lists
  • get_source_generators surfaces the underlying generator type instead of IncrementalGeneratorWrapper
  • get_instantiation_options returns external factories on projects with source generators
  • analyze_data_flow, analyze_control_flow, and get_file_overview return a structured FileNotInSolution error for unknown paths instead of an unstructured rethrow
  • analyze_data_flow / analyze_control_flow work on regions that span block boundaries
  • find_attribute_usages and find_reflection_usage report accurate totalCount when maxResults is hit
  • search_symbols pagination reports the true match count (no +100 cap)
  • find_god_objects no longer over-counts efferent coupling via nameof(), using-directives, or types from referenced projects
  • find_untested_code matches test attributes by (namespace, name) so look-alikes in user namespaces aren't treated as test methods; honors includeProperties
  • find_references.kind reports actual usage (read/write/invocation/typeof/nameof/attribute/cast), not hardcoded read
  • Records report Record / RecordStruct in typeKind and kind: filters instead of Class
  • rename_symbol rejects invalid C# identifiers with INVALID_PARAMETER
  • JSON-RPC notifications produce no response (per spec §4.3) — no more {"id": null, ...} answers to initialize or other no-id requests
  • Relative paths from tool responses round-trip back through subsequent calls
  • FindTypeByName returns symbols SymbolFinder recognizes on generator-using projects
  • sync_documents.filePaths rejects 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

Track pzalutski-pixel/sharplens-mcp

Get notified when new releases ship.

Sign up free

About pzalutski-pixel/sharplens-mcp

58 semantic C#/.NET analysis tools via Roslyn. Navigation, refactoring, find usages, and code intelligence for AI agents.

All releases →

Beta — feedback welcome: [email protected]