Releases: Atypical-Consulting/RoselineMCP
Release list
v2.0.0
Added
- Server-level tool guidance to drive adoption. The server now sends MCP
instructions— a
decision policy telling the model to prefer these structural tools over reading whole files
(especially on large codebases) — and each read-only tool's description is rewritten as a decision
rule ("prefer over Read/Grep to answer 'where is this used'") rather than a feature list. In
end-to-end testing this flipped the agent from never calling the tools to using them unprompted on
large solutions. Seedocs/AGENT-BENCHMARK.md. projectis now optional on the Roslyn-backed tools (search_symbols,get_symbol_info,
find_references,find_implementations,get_call_graph,get_type_hierarchy,edit_member,
rename_symbol) — when omitted it is auto-discovered from the working directory (searching the
cwd, a few parent directories, and immediate subdirectories) — and a.slnpath is now accepted
whereverprojectis passed. Reduces the friction that made agents fail calls guessing the
project (they naturally tried the.sln, which used to fail).
Changed
-
BREAKING: leaner response shapes for the read-only navigation tools and
get_symbol_info— a
token-efficiency pass trimmed redundant and always-present fields from the JSON these tools
return (tool names and input parameters are unchanged). Concretely:- Relative file paths. Every
file/definitionFileis now solution-root-relative with
forward slashes (e.g.RoselineMCP/Services/Foo.cs) instead of an absolute path — across
search_symbols,get_symbol_info,find_references,find_implementations,
get_call_graph, andget_type_hierarchy. truncatedis omitted whenfalse. Its absence now means "not truncated" — for
search_symbols,find_references,find_implementations, everyget_call_graphnode, and
get_type_hierarchy'sderivedTypesTruncated.find_referencesdrops thecolumnfield from each reference (now justfile,line,
snippet).get_call_graphdrops each node'ssignature; the nodefullNamenow renders parameter
types as simple names (e.g.RoselineMCP.Services.Foo.Bar(string, CancellationToken)),
still parameter-qualified so overloads stay distinct — callget_symbol_infofor a method's
full signature.- Redundant fields dropped from symbol summaries and
get_symbol_info.accessibilityis
gone (it is already insidesignature) fromget_symbol_infoand the project-wide summaries;
containingTypeis gone from the full summaries (it is already the prefix offullName). The
single-file outline ofsearch_symbolsstill emitscontainingType, but now as the simple,
unqualified type name. get_symbol_infonow omitsmodifiers,baseTypes,interfaces,documentation, and
sourcewhen they are empty/absent, so a minimal symbol collapses toname,fullName,
kind, andsignature.
Net effect: tool output is ~35% smaller, lifting the benchmark headline savings from a pooled
81% to 88% (median per task 76% → 85%) on RoselineMCP's own source. These are breaking
changes to the read-only tools' response wire shapes; update any client that parsed the removed
fields or relied on absolute paths. - Relative file paths. Every
-
deploy-docs.ymlretries the GitHub Pages deploy up to 3× — it intermittently returns
"Deployment failed, try again later" (a Pages backend hiccup, not a build failure) that clears on
re-run. The first two attempts tolerate failure, so a transient miss no longer fails the job.
Documentation
- End-to-end agent benchmark (
docs/AGENT-BENCHMARK.md) — a controlled
A/B (vanilla Claude Code vs. + RoselineMCP, same task, same model, quality-gated) measuring whether
an agent actually consumes fewer tokens in practice. Finding: ~50% fewer tokens at equal quality on
large-file codebases, break-even on tiny repos, and the model must be steered to use the tools. - Tools page aligned to the v1.4.0 contract. Added a response-envelope callout
({ ok, data }/{ ok, error },structuredContent/outputSchema), surfaced each tool's
humanTitleand capability pills (progress,confirms/elicitation), gave every tool an anchor
link, and dropped the stalenewbadges (those tools shipped in 1.3.0). The page had been showing
the pre-1.4.0 flat response shape. - Docs site: added a GitHub "Star" button in the top bar showing the star count. Renders a
build-time snapshot instantly, then a tiny client-side fetch refreshes it to the current count
(falls back to the build-time value on rate-limit/error).
v1.4.0
Added
- MCP structured content + output schema — every tool now advertises an
outputSchemaand
emitsstructuredContent(UseStructuredContent = true), so clients get a machine-readable,
schema-validated result in addition to the JSON text. - Progress notifications for long-running tools —
AnalyzeSolution,ApplyFixes, and
RenameSymbolnow report progress via MCP progress notifications. - Human-readable tool titles and an honest
OpenWorldhint — every tool advertises aTitle;
OpenWorldisfalsefor the local-only tools andtrueonly forAnalyzeSolution(which can
clone a Git URL). - Write confirmation via MCP elicitation — the write tools (
ApplyFixes,EditMember,
RenameSymbol) ask the client to confirm before writing whenpreviewOnly: false; declining
downgrades the call to a preview (nothing is written). - Failure logging via MCP logging notifications — tool failures are surfaced to the client's
log stream through MCP logging notifications that carry the correlation ID.
Changed
- BREAKING: tools now return a typed
ToolResult<T>envelope instead of a hand-serialized JSON
string. The response wire shape changed: success payloads are now nested underdata
({ "ok": true, "data": { ... } }) and failures undererror
({ "ok": false, "error": { "type", "message", "hint?", "correlationId" } }). The human-readable
message moved from the top-levelerrorfield toerror.message;type/hint/correlationId
moved undererror. Seedocs/API.md. server.jsonwebsiteUrlnow points at the documentation site
(https://atypical-consulting.github.io/RoselineMCP/) instead of the GitHub repo. Reaches the
live MCP Registry entry on the next published version.
v1.3.3
Fixed
- MCP Registry publish 403'd on namespace casing. The registry namespace derived from GitHub
OIDC is case-sensitive and matches the org's canonical login (Atypical-Consulting), but
server.json'snameand the README ownership marker used lowercase
(io.github.atypical-consulting/...), so the first publish wasForbidden. Corrected both to
io.github.Atypical-Consulting/roseline-mcp. (The lowercase GHCR image name is unrelated and
stays lowercase, as Docker requires.) - Docs
/releasespage didn't refresh on new releases. Therelease:trigger on
deploy-docs.ymlnever fired because the release is created by the publish workflow's
GITHUB_TOKEN, and GitHub does not start workflows from token-created events. Switched to a
workflow_runtrigger on thePublish NuGetworkflow's completion, which keys off the workflow
(whose original trigger was a human tag push) and fires regardless of the publish outcome.
v1.3.2
Documentation
- Docs site: a Releases page generated from GitHub Releases at build time (notes rendered from
each release, plus direct.mcpb/.nupkgdownload buttons), a new Claude Desktop (1-click)
install tab, and a note that RoselineMCP is listed in the official MCP Registry. The Astro build
fetches the Releases API (authenticated in CI to avoid rate limits) and degrades to a GitHub
link-out if the fetch fails.
Added
- One-click install for Claude Desktop (MCPB bundle). A
mcpb/manifest.json(MCPB spec 0.3)
describes RoselineMCP as adnx-launched server; the release now builds and attaches a
RoselineMCP.mcpbto each GitHub Release, so users can install with a dialog instead of editing
JSON config. The bundle only wraps thednx RoselineMCPlaunch (the .NET 10 SDK is still
required, since analysis loads projects through MSBuild), so it stays tiny and platform-agnostic. - Automated MCP Registry publishing.
publish-nuget.ymlnow has apublish-registryjob that,
after a successful NuGet publish, waits for the version to index, then authenticates via GitHub
OIDC (mcp-publisher login github-oidc, no secret) and publishes.mcp/server.jsonto the
official registry (registry.modelcontextprotocol.io) — so the server is discoverable by any
client/aggregator that reads the registry. Ownership is proven by anmcp-name:marker added to
the packedREADME.md, which the registry cross-checks against the NuGet package. The manifest
$schemawas migrated from the deprecated2025-10-17to the current2025-12-11(a URL-only
change; the format is unchanged for stdio package servers). Takes effect on the next tagged release.
Security
- Pinned
Microsoft.Bcl.Memoryto10.0.9(aligned with thenet10.0TFM) in
RoselineMCP.TokenBenchmarkto override the9.0.4
thatMicrosoft.ML.Tokenizers2.0.0pulled in transitively, which was vulnerable to
CVE-2026-26127 (GHSA-73j8-2gch-69rq, high severity — Base64Url out-of-bounds-read DoS). The
benchmark harness is never packaged and is not referenced by the shippedRoselineMCPpackage,
so published users were never exposed; this clears theNU1903restore warning. Remove the pin
onceMicrosoft.ML.Tokenizersreferences a patched build.
v1.3.1
Changed
publish-nuget.ymlnow creates a GitHub Release and verifies the artifact before publishing.
A git tag is not a GitHub Release, and nothing was creating one — so tagged versions published to
NuGet without a corresponding Release (v1.3.0had to be backfilled by hand). The release job now:
(1) fails the build if the packed.nupkgis missing.mcp/server.jsonor its embedded version
doesn't match the tag — a guard that would have caught the originaldnx-fetches-1.0.0bug at
the source rather than in the wild; and (2) after a successful NuGet push, creates (or heals) the
matching GitHub Release with notes extracted from this CHANGELOG and the.nupkgattached.
Dependencies
v1.3.0 — Code navigation & editing tools
[1.3.0] - 2026-07-03
Added
- Token-efficient code navigation tools — six new read-only MCP tools that let an AI agent
retrieve precise structural/semantic information via Roslyn instead of reading whole files
(source code typically dominates an agent's token budget):search_symbols— find symbols by wildcard/substring name pattern, or outline a single fileget_symbol_info— a symbol's kind, accessibility, modifiers, signature, base types,
interfaces, XML docs, and definition location (optionally its source) — the compact
"go to definition" payloadfind_references— every use site of a symbol across the solution, as location + snippetfind_implementations— implementations of an interface/member, overrides, or derived typesget_call_graph— a depth-bounded caller/callee graph with cycle detectionget_type_hierarchy— a type's base-class chain, interfaces, and derived types
- Surgical code-editing tools — two new write tools that emit a member-level change (not a
whole-file rewrite), keeping the tokens an agent produces proportional to the change. Both
default to preview mode (previewOnly: true) likeApplyFixes, so nothing is written to disk
unless the caller passespreviewOnly: falseexplicitly:edit_member— replace, add, or delete a single type memberrename_symbol— rename a symbol and update every reference across the solution (Roslyn rename)
IProjectLoader/ProjectLoaderservice that loads a project — and its containing solution when
present, so references and renames span projects — into a fresh workspace per call, plus
ICodeNavigationServiceandICodeEditServiceand their response models.- Token-savings benchmark (
RoselineMCP.TokenBenchmark) — a reproducible harness that runs the
real services against RoselineMCP's own source and measures each tool's output against the source
an agent would otherwise read, tokenized with cl100k_base. Systematic sweeps; results stamped with
commit + date. Reproduce withdotnet run --project RoselineMCP.TokenBenchmark -c Release. - Documentation site (
website/, Astro) with an overview, the tool reference, and the honest
benchmark (charts + methodology + limitations), deployed to GitHub Pages via
.github/workflows/deploy-docs.yml. Across 477 navigation tasks the read-only tools showed a
pooled 81% / median 74% token reduction versus reading the corresponding files.
Changed
search_symbolsfile outline is now token-lean. The benchmark caught the outline costing
tokens (it repeated the file path and fully-qualified name on every symbol); it now returns a
lean projection (name, kind, signature, line), flipping its median from −45% to +30%.
SymbolSummaryalso omits null fields from its JSON. Project-wide search is unchanged.
Fixed
dnx-based installs pulled an ancient1.0.0..mcp/server.jsonhardcodedversion/
packages[0].versionat1.0.0— a version that was never released (releases start at1.2.0)
— so any client resolving the MCP manifest was told to fetch1.0.0. Worse, despite
PackageType=McpServerthe manifest was never packed into the.nupkg(it lives at the repo
root with no<None Include>wiring it in), so the McpServer package shipped without its own
manifest. Fixed by: (1) correcting the manifest to the current release, (2) packing
../.mcp/server.jsoninto the package at.mcp/server.json, and (3) stamping the version into
the manifest from the release tag inpublish-nuget.yml(mirroringMinVerVersionOverride) so
it can never drift out of lockstep with the package version again.
v1.2.1 — Reference-project hardening
First real published release of RoselineMCP: reference-project hardening covering security defaults, real Git-URL analysis, correctness fixes, CI/CD, packaging, and a full documentation accuracy pass. See CHANGELOG.md for the itemized [1.2.0]/[1.2.1] entries.
Install
dotnet tool install -g RoselineMCPOr via Docker:
docker pull phmatray/roseline-mcp:1.2.1Note on versioning
v1.2.0's tag push published Docker Hub/GHCR images successfully but hit a CI bug that blocked the NuGet.org publish (fixed in this release — see CHANGELOG). v1.2.1 republishes identical application content to both registries and is NuGet.org's first successful release.