skills/workspace-health/SKILL.md
One-shot status report on the running Roslyn MCP server and any loaded workspaces. Use when: troubleshooting the server, onboarding a session, confirming readiness before a sensitive operation, listing loaded workspaces, checking for staleness/degraded state, or recovering from `Server "roslyn" is not connected`, `InvalidArgument: Parameter is required`, `NotFound: No symbol found matching`, or any `workspace_load` / `find_references` / `go_to_definition` / `code_fix_preview` / `get_prompt_text` parameter-validation failure — these indicate workspace staleness, server restart, or stale workspace IDs and this skill is the canonical recovery path.
npx skillsauth add darylmcd/Roslyn-Backed-MCP workspace-healthInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are a Roslyn MCP status reporter. Your job is to probe the running server, enumerate loaded workspaces, surface degraded or stale state, and produce a compact go/no-go verdict that other skills (or the user) can act on.
$ARGUMENTS is an optional workspace ID. If provided, focus the report on that workspace (still include server-level state). If omitted, report on every loaded workspace.
This skill is the canonical entry point for server and workspace discovery — the other skills probe server_info / workspace_list internally; this skill surfaces that information directly to the user. If the tool list or workflow surface is unclear downstream, point users at server_info, the server_catalog resource (roslyn://server/catalog), or MCP prompt discover_capabilities with category all.
Before running any mcp__roslyn__* tool call, probe the server once:
Call mcp__roslyn__server_info — confirm the response includes connection.state: "ready".
If the call fails OR connection.state is initializing / degraded / absent, bail with this message to the user and stop the skill:
Roslyn MCP is not connected. This skill requires an active Roslyn MCP server. Run
mcp__roslyn__server_heartbeatto confirm connection state, then re-run this skill once the server reportsconnection.state: "ready". See the Connection-state signals reference for the canonical probes (server_info/server_heartbeat).
If connection.state is "ready", proceed with the rest of the workflow. The server_info call above also satisfies any server-version / capability-discovery needs — do not repeat it.
Note: this skill's purpose is to report server/workspace status, so a failing precheck is itself the answer. Surface the failure as the final output (see Refusal conditions below) rather than silently aborting.
Execute these steps in order. Use the Roslyn MCP tools — do not shell out.
Before enumerating workspaces, determine whether the current working directory contains a C# project.
Glob tool to search the CWD for any file matching *.csproj, *.sln, or *.slnx (search non-recursively at CWD root first; a single hit is sufficient).applicable: truedetectedStack: "csharp"applicable: falsedetectedStack: "unknown".csproj, .sln, or .slnx) is not a sufficient signal — at least one of those three must be present.Emit applicable and detectedStack as the first two lines of the output report (before the Server section). These values are used in Step 3 to decide whether to emit the workspace-load hint.
server_info response from the precheck.connection.state, transport, and any build-time catalog metadata (tool count, capability flags).server_heartbeat once to confirm the transport is live and measure round-trip freshness.server_info reported.workspace_list to get every loaded workspace and its metadata (id, solution path, load time, warnings).$ARGUMENTS names a workspace ID, filter to just that entry but keep the count of the others for the summary.applicable from Step 0:
applicable: false: suppress the "consider calling workspace_load" hint and instead emit: "CWD does not appear to be a C# repo (detectedStack: unknown). The workspace-health skill is most useful when a .sln or .csproj is present."applicable: true: retain the existing hint — emit "no workspaces loaded — consider calling workspace_load on a .sln / .slnx / .csproj".For each workspace in scope:
workspace_status with the workspaceId — record state (ready / loading / degraded), load-time warnings, and any outstanding preview tokens if the response exposes them.workspace_health with the same workspaceId — record deeper metrics (project count, document count, last-activity timestamp, stale flags). If workspace_health is unavailable on this server build, note it and continue.For any workspace flagged as possibly stale in Step 4 (or when the user asked for a single-workspace deep check):
validate_workspace without runTests for a fast compile + analyzer snapshot.Skip this step for a broad multi-workspace sweep unless the user asked for depth — it is a heavier call.
Combine the server-level signals (Steps 1-2) with the per-workspace signals (Steps 3-5) using the rubric below to produce a single verdict line (go / caution / no-go) and a prioritized "next actions" list.
| Indicator | Meaning | Action |
|---|---|---|
| connection.state = "ready" + heartbeat OK | Server is healthy and responsive | Proceed |
| connection.state = "initializing" | Server is still coming up | Wait, re-run skill in a few seconds |
| connection.state = "degraded" or heartbeat timeout | Transport or internal state is unhealthy | Investigate server logs; consider restart |
| connection.state absent / server_info fails | Server is unreachable | Surface as output (see Refusal conditions) |
| workspace_status.state = "ready" | Workspace usable | Proceed |
| workspace_status.state = "loading" | Load in progress | Wait; re-probe |
| workspace_status.state = "degraded" | Load completed with errors | Review load-time warnings; consider workspace_reload |
| Stale workspace (solution files changed on disk after load) | On-disk drift | Reload with workspace_reload |
| Outstanding preview tokens | Unapplied preview sessions linger | Review the associated skill/flow; apply or discard |
| validate_workspace reports errors | Compilation broken in memory | Hand off to analyze or explain-error skill |
Present a structured report:
## Workspace Health Report
applicable: {true|false}
detectedStack: {csharp|unknown}
### Server
- Version: {semver}
- Connection: {state}
- Transport: {transport} (heartbeat {latency-ms} ms)
- Catalog: {tool-count} tools, {capability-flags}
### Workspaces ({N} loaded)
{table: id, solution path, state, load-time warnings, outstanding preview tokens}
### Per-Workspace Detail
For each workspace in scope:
- **{id}** — {state}
- Projects: {count} Documents: {count}
- Last activity: {timestamp}
- Stale: {yes/no + reason}
- Validation (if Step 5 ran): {build pass/fail}, {errors}, {warnings}
### Verdict
{GO | CAUTION | NO-GO}: {one-line rationale}
### Suggested Next Actions
1. {actionable next step, e.g., "Run workspace_reload on {id} — solution files changed on disk"}
2. ...
Keep the verdict line at the top of any chat-level summary so a caller skill can parse it quickly.
This skill does not refuse on transport failure — the whole point is to report state. Instead:
connection.state absent/degraded/initializing), emit the connectivity-failure report as the final output: server identity (to the extent known), "connection: {state-or-unreachable}", and the suggested remediation from the Status Rubric.workspace_list returns empty, emit a "no workspaces loaded" report with a suggestion to call workspace_load on a .sln / .slnx / .csproj.$ARGUMENTS workspace ID is not found in workspace_list, emit a "workspace not found" report with the list of actually-loaded IDs so the caller can retry.In every case, the user gets an actionable report — never a silent failure.
tools
Consumer-facing audit of the Roslyn MCP server's live surface against a loaded C# repo. Two run tiers: `--quick` (read-only smoke pass, ~15 min) and `--full` (default; comprehensive sweep including disposable-worktree apply round-trips and the experimental-promotion scorecard, ~90–180 min). Findings print to stdout by default for non-maintainers; the repo owner (`darylmcd`) auto-files each finding as a GitHub Issue at https://github.com/darylmcd/Roslyn-Backed-MCP. Pass `--auto-file` to force-enable or `--no-auto-file` to force-disable. Requires the Roslyn MCP server (`mcp__roslyn__server_info`); halts if the server is not callable rather than running a non-MCP fallback. Use to validate that the server's tools, resources, and prompts behave as documented against your own C# codebase, and to share findings back upstream.
tools
Comprehensive Roslyn MCP server audit + experimental-promotion scorecard + plugin-skill audit, run against a loaded C# repo. Three modes — `full`, `promotion-only`, `read-only`. Requires the Roslyn MCP server (`mcp__roslyn__server_info`); halts if the server is not callable rather than running a non-MCP fallback. Use for full-surface server stress testing, promotion gating, or a no-holds-barred repo-quality sweep — not for PR review.
development
Multi-project version bump across a .NET solution. Use when: cutting a release, incrementing patch/minor/major across every versioned project, or synchronizing `<Version>` / `<VersionPrefix>` values. Takes a bump type (patch, minor, or major) as input. Edits MSBuild version properties across all projects that define them.
tools
Update the Roslyn MCP plugin. Use when: server_info shows an update is available, the user wants to update to the latest version, or the plugin reports an older version than NuGet. Handles both the global tool binary (Layer 1) and the Claude Code plugin metadata (Layer 2).