Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.darylmcd/roslyn-mcp

NUGET · DARYLMCD.ROSLYNMCP · SCANNED SEP 20

Local-first MCP server for semantic C# analysis & refactoring via Roslyn & MSBuildWorkspace.

0 this week 85 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency48
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 1 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability84
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 24596 tokens (~137/item across 179 items; 174 tools + 5 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management93
  • Stability check failed: the tool surface changed between 4.0.0 and 4.2.1: 0 tool removals, 1 breaking changes, 0 additions. See how to fix → Fail
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (5% of tools); any adoption earns full credit.Pass
Tool Safety81
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 2 of 9 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_file_preview" implies "delete" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Partial
  • An AI judge read all 176 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

How do I install the io.github.darylmcd/roslyn-mcp server?

io.github.darylmcd/roslyn-mcp runs locally as a NuGet package, launched with dnx Darylmcd.RoslynMcp@4.2.1 --yes. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

nuget · Darylmcd.RoslynMcp

# add to Claude Code
claude mcp add darylmcd-roslyn-mcp -- dnx Darylmcd.RoslynMcp@4.2.1 --yes
// .cursor/mcp.json
{
  "mcpServers": {
    "darylmcd-roslyn-mcp": {
      "command": "dnx",
      "args": [
        "Darylmcd.RoslynMcp@4.2.1",
        "--yes"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "darylmcd-roslyn-mcp": {
      "command": "dnx",
      "args": [
        "Darylmcd.RoslynMcp@4.2.1",
        "--yes"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add darylmcd-roslyn-mcp -- dnx Darylmcd.RoslynMcp@4.2.1 --yes
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "darylmcd-roslyn-mcp": {
      "type": "local",
      "command": [
        "dnx",
        "Darylmcd.RoslynMcp@4.2.1",
        "--yes"
      ],
      "enabled": true
    }
  }
}
# ~/.hermes/config.yaml
mcp_servers:
  darylmcd-roslyn-mcp:
    command: "dnx"
    args: ["Darylmcd.RoslynMcp@4.2.1", "--yes"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "darylmcd-roslyn-mcp": {
      "Transport": "stdio",
      "Command": "dnx",
      "Arguments": [
        "Darylmcd.RoslynMcp@4.2.1",
        "--yes"
      ]
    }
  }
}
// mcp.json
{
  "mcpServers": {
    "darylmcd-roslyn-mcp": {
      "command": "dnx",
      "args": [
        "Darylmcd.RoslynMcp@4.2.1",
        "--yes"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93.

  • 19 Sept 26 +13
    • Malware scan: unverified → pass security
  • 18 Sept 26 −15
    • Malware scan: pass → unverified security
    • Package version: 4.2.0 → 4.2.1 functional
  • 17 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 96 to 100.

  • 15 Sept 26 +16
    • Malware scan: unverified → pass security
  • 14 Sept 26 −16
    • Malware scan: pass → unverified security
    • Stability: pass → fail security
    • Stability: pass → 0.90 functional
    • Package version: 4.1.2 → 4.2.0 functional
  • 13 Sept 26 0
    • Stability: 0.97 → pass security
  • 12 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Analysed nuget/Darylmcd.RoslynMcp@4.2.1

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem nuget
Reason Signature present, unreadable

Background: How many MCP packages publish verified provenance →

Dependencies 0 packages
Packages resolved 0
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 174 exposed · ~24,032 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
symbol_signature_help ~195

Get a symbol's display signature, parameters, return type, and documentation from a position or locator. Type-token carets auto-promote unless preferDeclaringMember=false.

NameTypeReqDescription
columninteger|nullOptional: 1-based column number
filePathstring|nullOptional: absolute path to the source file
lineinteger|nullOptional: 1-based line number
metadataNamestring|nullOptional: fully qualified metadata name, e.g. Namespace.TypeName
preferDeclaringMemberbooleanWhen true (default), a caret on a method's return-type token or a property's type token is auto-promoted to the enclosing member symbol. Set to false to resolve the type token literally.
symbolHandlestring|nullOptional: stable symbol handle returned by other semantic tools
workspaceIdstringyesThe workspace session identifier returned by workspace_load

No output schema declared.

No examples provided.

test_coverage ~68

Run tests with code coverage collection and return coverage metrics per module and class. Requires the coverlet.collector NuGet package in test projects.

NameTypeReqDescription
projectNamestring|nullOptional: specific test project name
workspaceIdstringyesThe workspace session identifier returned by workspace_load

No output schema declared.

No examples provided.

test_discover ~161

Discover tests from test projects in the loaded workspace. Results are paginated to stay within MCP context budgets - filter large suites with projectName and/or nameFilter. The response includes returnedCount/totalCount/hasMore.

NameTypeReqDescription
limitintegerMaximum number of test cases to return (default: 200; raise carefully — 1000 cases is roughly 350KB of JSON)
nameFilterstring|nullOptional: case-insensitive substring filter applied to fully-qualified test names
offsetintegerNumber of test cases to skip before returning results (default: 0)
projectNamestring|nullOptional: filter by project name
workspaceIdstringyesThe workspace session identifier returned by workspace_load

No output schema declared.

No examples provided.

test_reference_map ~199

Map productive source symbols to the test methods that reference them statically, without running tests — identifies untested public/internal APIs.

NameTypeReqDescription
limitintegerMax entries returned per page. Clamped to [1, 500]. Default 200.
maxMockDriftWarningsintegerMax mock-drift warnings returned. Clamped to [0, 500]. Default 50. Use totalMockDriftCount and hasMoreMockDrift on the response to detect truncation.
offsetinteger0-based start index. Clamped to [0, total]. Default 0.
projectNamestring|nullOptional: restrict to a single project (name or path). Matching a productive project filters the covered/uncovered sets to that project's symbols; matching a test project scopes the test scan. Unknow…
workspaceIdstringyesThe workspace session identifier returned by workspace_load

No output schema declared.

No examples provided.

test_related ~311

Find likely related tests for a symbol via three mutually-exclusive locators: symbolHandle alone, metadataName alone, or filePath plus line plus column together. For file-based impact use test_related_files instead.

NameTypeReqDescription
columninteger|nullSource-location mode: 1-based column number pointing at the symbol identifier token (not the start of the line). Must be provided together with filePath and line (all three are required as a group).…
filePathstring|nullSource-location mode: absolute path to the source file. Must be provided together with line and column (all three are required as a group). Omit all three source-location parameters when using symbol…
lineinteger|nullSource-location mode: 1-based line number. Must be provided together with filePath and column (all three are required as a group). Omit all three source-location parameters when using symbolHandle or…
maxResultsintegerMaximum number of test cases to return (default: 100)
metadataNamestring|nullOptional: fully qualified metadata name, e.g. Namespace.TypeName
symbolHandlestring|nullOptional: stable symbol handle returned by other semantic tools
workspaceIdstringyesThe workspace session identifier returned by workspace_load

No output schema declared.

No examples provided.

test_related_files ~98

Given a list of changed source file paths, find all related tests across the solution and return a combined dotnet test filter expression. Results use heuristic name matching and may not be exhaustive.

NameTypeReqDescription
filePathsarrayyesArray of absolute paths to changed source files
maxResultsintegerMaximum number of test cases to return (default: 100)
workspaceIdstringyesThe workspace session identifier returned by workspace_load

No output schema declared.

No examples provided.

test_run ~248

Run dotnet test for the loaded workspace or a specific test project and return structured results. When TRX output cannot be produced the result carries a classified FailureEnvelope instead of throwing; the failures array is paginated.

NameTypeReqDescription
compactbooleanOptional: when true, trims the response for a clean run — omits execution.stdOut/stdErr/command/arguments/workingDirectory (redundant with the count fields once succeeded && failed == 0) and the fail…
failuresLimitintegerMaximum number of failing tests to return detail for (default: 25). Aggregate counts (total/passed/failed/skipped) are never truncated — only the per-failure detail array is paginated to keep the res…
failuresOffsetintegerNumber of failing tests to skip before returning failure detail (default: 0)
filterstring|nullOptional: dotnet test filter expression
projectNamestring|nullOptional: specific test project name or file path
workspaceIdstringyesThe workspace session identifier returned by workspace_load

No output schema declared.

No examples provided.

trace_exception_flow ~150

Find catch handling sites and `throw new` origination sites for an exception type (usage sites, not handling sites). isComplete=false distinguishes scan failures from cap truncation.

NameTypeReqDescription
exceptionTypeMetadataNamestringyesFully qualified metadata name of the exception type to trace, e.g. 'System.Text.Json.JsonException' or 'System.ArgumentException'
maxResultsinteger|nullOptional: cap the returned catch-site list. Defaults to 200; absolute upper bound is 2000 to keep the payload bounded.
projectNamestring|nullOptional: restrict the walk to a specific project name
workspaceIdstringyesThe workspace session identifier returned by workspace_load

No output schema declared.

No examples provided.

type_hierarchy ~135

Get the type hierarchy (base types, derived types, implemented interfaces) for a type at the given position

NameTypeReqDescription
columninteger|nullOptional: 1-based column number
filePathstring|nullOptional: absolute path to the source file
lineinteger|nullOptional: 1-based line number
metadataNamestring|nullOptional: fully qualified metadata name, e.g. Namespace.TypeName
symbolHandlestring|nullOptional: stable symbol handle returned by other semantic tools
workspaceIdstringyesThe workspace session identifier returned by workspace_load

No output schema declared.

No examples provided.

validate_recent_git_changes ~148

Post-edit validation bundle that auto-derives the changed-file set from `git status --porcelain` and forwards to validate_workspace. Prefer this over validate_workspace when you have uncommitted edits and want touched-file scope.

NameTypeReqDescription
runTestsbooleanWhen true, runs the discovered related tests via dotnet test --filter. Default: false (discovery only).
summarybooleanWhen true, drops the per-diagnostic ErrorDiagnostics list and per-test DiscoveredTests list to keep the response under the MCP cap on large solutions. OverallStatus + counts still surface the verdict…
workspaceIdstringyesWorkspace session id from workspace_load.

No output schema declared.

No examples provided.

validate_workspace ~264

One-call post-edit validation bundle over an explicit changed-file set: in-memory compile_check, Error-severity compiler and analyzer diagnostics, related-test discovery, and optional test_run. Returns an aggregate overallStatus envelope.

NameTypeReqDescription
changedFilePathsarray|nullOptional: explicit list of changed file paths. Pass as a native JSON array of absolute file paths, not a JSON-encoded string. Example: ["/abs/path/a.cs", "/abs/path/b.cs"]. When omitted, the change t…
responseFormatstring|nullResponse shape: "json" (default) returns the indented JSON envelope; "markdown" returns a compact summary table built from the same DTO so the verdict is identical across shapes. Case-insensitive.
runTestsbooleanWhen true, runs the discovered related tests via dotnet test --filter. Default: false (discovery only).
summarybooleanWhen true, drops the per-diagnostic ErrorDiagnostics list and per-test DiscoveredTests list to keep the response under the MCP cap on large solutions. OverallStatus + counts still surface the verdict…
workspaceIdstringyesWorkspace session id from workspace_load.

No output schema declared.

No examples provided.

verify_pragma_suppresses ~127

Check whether a '#pragma warning disable/restore' pair for a diagnostic id actually covers the given 1-based line. Detects 'cosmetic pragma' bugs where the pair wraps the wrong span. Read-only.

NameTypeReqDescription
diagnosticIdstringyesDiagnostic id whose suppression to check (e.g. CA2025)
filePathstringyesAbsolute path to the source file
lineintegeryes1-based line number that should be covered (the diagnostic fire site)
workspaceIdstringyesThe workspace session identifier returned by workspace_load

No output schema declared.

No examples provided.

workspace_changes ~64

List all mutations applied to a workspace during this session. Returns an ordered list of changes with descriptions, affected files, tool names, and timestamps. Use to understand what has been modified since workspace_load.

NameTypeReqDescription
workspaceIdstringyesThe workspace session identifier returned by workspace_load

No output schema declared.

No examples provided.

workspace_close ~153

Close and dispose a loaded workspace session, freeing all resources. Set drainProcesses=true to also release MSBuild build-server and test-host file locks - required before `git worktree remove` in sweep teardown sequences.

NameTypeReqDescription
drainProcessesbooleanWhen true, run `dotnet build-server shutdown` AND kill detached testhost/vstest.console processes rooted under the loaded path's directory after session removal, to release MSBuild build-server and t…
getProcessesByName
processDrainTimeoutstring|null
workspaceIdstringyesThe workspace session identifier returned by workspace_load

No output schema declared.

No examples provided.

workspace_drift_check ~60

Compare a loaded workspace snapshot with files on disk and return filesDrifted plus reload/noop guidance. Use before reads after out-of-band edits; source-generated documents are skipped.

NameTypeReqDescription
workspaceIdstringyesWorkspace session id from workspace_load.
NameTypeReqDescription
filesDriftedarrayyes
recommendedstringyes
stalebooleanyes

No examples provided.

workspace_fork_apply ~188

Experimental: fork a loaded workspace, replay an existing preview token into the fork without mutating the source workspace, run validate_workspace against the fork, then retain or delete the fork per the retention policy.

NameTypeReqDescription
forkNamestring|nullOptional stable suffix for the fork directory. Sanitized by the server.
previewTokenstringyesPreview token from any *_preview tool.
retentionstringFork retention policy: drop-on-success, drop-on-failure, drop-always, or keep. Default: drop-on-success.
runTestsbooleanWhen true, runs related tests discovered by validate_workspace. If testFilter is supplied, runs that explicit filter instead.
testFilterstring|nullOptional explicit dotnet test filter to run against the fork when runTests=true.
workspaceIdstringyesSource workspace session id from workspace_load.

No output schema declared.

No examples provided.

workspace_health ~58

Alias for workspace_status with verbose=false — same summary JSON (isReady, restoreHint, solutionFileName, error counts). Use for agent bootstrap right after workspace_load.

NameTypeReqDescription
workspaceIdstringyesThe workspace session identifier returned by workspace_load
NameTypeReqDescription
analyzersReadybooleanyes
buildRequiredbooleanyes
documentCountintegeryes
isLoadedbooleanyes
isReadybooleanyes
isStalebooleanyes
loadedAtUtcstringyes
loadedPathstring|nullyes
projectCountintegeryes
restoreHintstring|nullyes
restoreRequiredbooleanyes
snapshotTokenstringyes
solutionFileNamestring|nullyes
workspaceDiagnosticCountintegeryes
workspaceErrorCountintegeryes
workspaceIdstringyes
workspaceVersionintegeryes
workspaceWarningCountintegeryes

No examples provided.

workspace_list ~68

List all currently loaded workspace sessions. Returns a lean summary per workspace by default — pass verbose=true for the full per-project tree of every workspace.

NameTypeReqDescription
verbosebooleanWhen true, return the full per-project tree and workspace diagnostics for each workspace. Default false returns only counts and load state.

Structured output declared, but exposes no named fields.

No examples provided.

workspace_load ~341

Load a .sln, .slnx, or .csproj into a Roslyn workspace session for semantic analysis. Idempotent by path: loading an already-loaded file returns the existing workspaceId. Returns a lean summary; pass verbose=true for the full project tree.

NameTypeReqDescription
autoRestorebooleanWhen true and the loaded status reports restoreRequired=true, run `dotnet restore` on the target and reload once before returning.
evictPolicystringControls cap-reached behaviour. 'Strict' (default) throws with activeWorkspaces and lruCandidate context for one-round-trip self-recovery. 'Lru' silently evicts the least-recently-used idle workspace…
expandSanctionedRootsbooleanRequests one-level sanctioned-root expansion for a sibling worktree. This takes effect only when the server operator also sets ROSLYNMCP_ALLOW_ROOT_EXPANSION=true; client input alone never widens the…
pathstringyesAbsolute path to a .sln, .slnx, or .csproj file
prewarmboolean|nullWhen true, run `workspace_warm` immediately after the load (and any auto-restore reload) succeeds, then include the warm result in the response. When omitted, large solutions with more than 50 projec…
verbosebooleanWhen true, return the full per-project tree and workspace diagnostics. Default false returns only counts and load state.

No output schema declared.

No examples provided.

workspace_readiness_report ~90

First-run/onboarding readiness report for a loaded workspace, distinct from the incident-focused workspace_support_bundle. Returns one verdict - ready, restore-needed, build-needed, or analyzer-limited - plus limitations and next workflows.

NameTypeReqDescription
workspaceIdstring|nullOptional workspace session identifier returned by workspace_load. Omit only when zero or one workspace is loaded; pass explicitly when multiple workspaces are active.
NameTypeReqDescription
generatedAtUtcstringyes
limitationsarrayyes
loadedWorkspacesarrayyes
nextRecommendedWorkflowsarrayyes
reportKindstringyes
requestedWorkspaceIdstring|nullyes
statusstringyes
workspaceobject|nullyes

No examples provided.

workspace_reload ~127

Workspace-scoped calls auto-reload stale state by default. Use this for an explicit reload; autoRestore=true runs dotnet restore and reloads once when restoreRequired=true.

NameTypeReqDescription
autoRestorebooleanWhen true and the reloaded status reports restoreRequired=true, run `dotnet restore` on the loaded target and reload once before returning.
verbosebooleanWhen true (default), preserve the full per-project response. Pass false for readiness, version, and aggregate counts without the project tree.
workspaceIdstringyesThe workspace session identifier returned by workspace_load

No output schema declared.

No examples provided.

workspace_status ~98

Cheap health check after workspace_load - call this first before compile_check or heavy tools. Default (verbose=false) returns summary JSON: isReady, isStale, workspaceErrorCount, restoreHint, solutionFileName, counts.

NameTypeReqDescription
verbosebooleanWhen true, return the full per-project tree and workspace diagnostics. Default false returns only counts and load state.
workspaceIdstringyesThe workspace session identifier returned by workspace_load

Structured output declared, but exposes no named fields.

No examples provided.

workspace_support_bundle ~152

Incident-diagnosis bundle for an existing workspace session, distinct from the first-run workspace_readiness_report. Composes readiness, drift status, a capped change ledger, versions, diagnostics totals, and next-action hints.

NameTypeReqDescription
maxChangeEntriesintegerMaximum number of recent change-ledger entries to include. Clamped to 0..50. Default 20.
maxDriftedFilesintegerMaximum number of drifted file paths to include. Clamped to 0..100. Default 25.
workspaceIdstring|nullOptional workspace session identifier returned by workspace_load. Omit only when zero or one workspace is loaded; pass explicitly when multiple workspaces are active.
NameTypeReqDescription
bundleKindstringyes
changeLedgerobjectyes
diagnosticsTotalsobject|nullyes
generatedAtUtcstringyes
limitsobjectyes
loadedWorkspacesarrayyes
nextActionsarrayyes
requestedWorkspaceIdstring|nullyes
statusstringyes
workspaceobject|nullyes

No examples provided.

workspace_warm ~121

Prewarm Roslyn compilations and first semantic models for all or selected projects. Use before the first read-side call; workspace_load may prewarm large solutions automatically.

NameTypeReqDescription
projectsarray|nullOptional: project names to warm. Pass as a native JSON array, not a JSON-encoded string. Example: ["MyProject.Core", "MyProject.Tests"]. Case-insensitive; unknown names are silently skipped. Omit or…
workspaceIdstringyesWorkspace session id from workspace_load.

No output schema declared.

No examples provided.

Common questions

What is the io.github.darylmcd/roslyn-mcp server?

io.github.darylmcd/roslyn-mcp is listed in the public MCP registry as io.github.darylmcd/roslyn-mcp. Local-first MCP server for semantic C# analysis & refactoring via Roslyn & MSBuildWorkspace. This page covers its NuGet package (Darylmcd.RoslynMcp).

Is the io.github.darylmcd/roslyn-mcp server safe to use?

io.github.darylmcd/roslyn-mcp scores 85 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.darylmcd/roslyn-mcp server expose?

io.github.darylmcd/roslyn-mcp exposes 174 tools: add_central_package_version_preview, add_package_reference_preview, add_pragma_suppression, add_project_reference_preview, add_target_framework_preview, and 169 more. Their descriptions and schemas cost roughly 24,032 tokens of context every time the server is loaded.

Is the io.github.darylmcd/roslyn-mcp server still maintained?

io.github.darylmcd/roslyn-mcp is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the io.github.darylmcd/roslyn-mcp server under?

io.github.darylmcd/roslyn-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.