Skip to content

fix: add .claude-plugin manifest for dotnet-msbuild binlog MCP server - #844

Merged
AbhitejJohn merged 1 commit into
mainfrom
abhitejjohn/fix-claude-code-msbuild-mcp
Jun 30, 2026
Merged

fix: add .claude-plugin manifest for dotnet-msbuild binlog MCP server#844
AbhitejJohn merged 1 commit into
mainfrom
abhitejjohn/fix-claude-code-msbuild-mcp

Conversation

@AbhitejJohn

Copy link
Copy Markdown
Collaborator

Summary

Adds a .claude-plugin/plugin.json\ manifest to the \dotnet-msbuild\ plugin so that Claude Code can discover and load the binlog MCP server. Also declares \mcpServers\ inline in the root marketplace manifest entry for belt-and-suspenders coverage.

Problem

Claude Code discovers plugin capabilities (skills, agents, MCP servers) via .claude-plugin/plugin.json\ inside each plugin directory. The existing .codex-plugin/\ manifest only works for Codex CLI. Without the Claude Code-specific manifest, installing \dotnet-msbuild\ via /plugin install\ loads skills and agents but not the binlog MCP server.

Changes

  • \plugins/dotnet-msbuild/.claude-plugin/plugin.json\ — new manifest with inline \mcpServers\ config
  • .claude-plugin/marketplace.json\ — added \mcpServers\ to the \dotnet-msbuild\ entry

Verification

After this change, running /plugin install dotnet-msbuild@dotnet-agent-skills\ in Claude Code should surface the \�inlog\ MCP server tools.

Fixes #840

Copilot AI review requested due to automatic review settings June 29, 2026 22:27
@github-actions

github-actions Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Skill Coverage Report

Plugin Skill Covered Coverage
⚠️ dotnet csharp-scripts 13/22 59.1%
dotnet dotnet-pinvoke 6/28 21.4%
dotnet setup-local-sdk 3/8 37.5%
dotnet-advanced `` error
Uncovered: dotnet/csharp-scripts
  • [Validation] dotnet --version reports 10.0 or later (or fallback path is used) (line 274)
  • [Validation] The app compiles without errors (can be checked explicitly with dotnet build <file>.cs) (line 276)
  • [Validation] App files and cached artifacts are cleaned up after the session (line 279)
  • [Pitfall] #:package without a version (line 286)
  • [Pitfall] #:property with wrong syntax (line 287)
  • [Pitfall] Directives placed after C# code (line 288)
  • [Pitfall] Reflection-based JSON serialization fails (line 293)
  • [WorkflowStep] Step 5: Clean up (line 199)
  • [CodePattern] [MSBuild] (line 93)
Uncovered: dotnet/dotnet-pinvoke
  • [Validation] Calling convention specified if targeting Windows x86; omitted otherwise (line 424)
  • [Validation] String encoding is explicit — no reliance on defaults or CharSet.Auto (line 425)
  • [Validation] Memory ownership is documented and matched (who allocates, who frees, with what) (line 426)
  • [Validation] SafeHandle used for all native handles (no raw IntPtr escaping the interop layer) (line 427)
  • [Validation] Delegates passed as callbacks are rooted to prevent GC collection (line 428)
  • [Validation] SetLastError/SetLastPInvokeError set for APIs that use OS error codes (line 429)
  • [Validation] Struct layout matches native (packing, alignment, field order) (line 430)
  • [Validation] CLong/CULong used for C long/unsigned long in cross-platform code (line 431)
  • [Validation] If using CLong/CULong with LibraryImport, [assembly: DisableRuntimeMarshalling] is applied (line 432)
  • [Validation] No bool without explicit MarshalAs — always specify UnmanagedType.Bool (4-byte) or UnmanagedType.U1 (1-byte) to ensure normalization across the language boundary. (line 433)
  • [WorkflowStep] Step 5: Establish Memory Ownership (line 168)
  • [WorkflowStep] Step 6: Use SafeHandle for Native Handles (line 224)
  • [WorkflowStep] Step 7: Handle Errors (line 261)
  • [CodePattern] [LibraryImport] (line 101)
  • [CodePattern] [Out] (line 144)
  • [CodePattern] [256] (line 176)
  • [CodePattern] [UnmanagedCallConv] (line 111)
  • [CodePattern] [UnmanagedCallersOnly] (line 281)
  • [CodePattern] [MarshalAs] (line 144)
  • [CodePattern] [DllImport] (line 93)
  • [CodePattern] [UnmanagedFunctionPointer] (line 300)
  • [CodePattern] sealed (line 228)
Uncovered: dotnet/setup-local-sdk
  • [Pitfall] paths ignored (line 382)
  • [Pitfall] dotnet app.dll wrong runtime (line 386)
  • [CodePattern] [ordered] (line 301)
  • [CodePattern] [pscustomobject] (line 301)
  • [CodePattern] [guid] (line 104)

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes Claude Code discovery for the dotnet-msbuild plugin by adding a per-plugin .claude-plugin/plugin.json manifest (so Claude Code can load the binlog MCP server), and also adds an inline mcpServers declaration in the root Claude marketplace manifest entry for additional coverage.

Changes:

  • Added plugins/dotnet-msbuild/.claude-plugin/plugin.json with inline mcpServers.binlog configuration.
  • Updated .claude-plugin/marketplace.json to include mcpServers.binlog for the dotnet-msbuild plugin entry.
Show a summary per file
File Description
plugins/dotnet-msbuild/.claude-plugin/plugin.json New Claude Code plugin manifest enabling binlog MCP server discovery.
.claude-plugin/marketplace.json Adds inline mcpServers for dotnet-msbuild in the Claude marketplace manifest.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 2/2 changed files
  • Comments generated: 0

@github-actions github-actions Bot added the waiting-on-review PR state label label Jun 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Evaluation passed for 79003b2. cc @webreidi @AbhitejJohn @ViktorHofer @JanKrivanek @dotnet/skills-msbuild-reviewers — please review.

Claude Code discovers MCP servers via .claude-plugin/plugin.json inside
each plugin directory. The existing .codex-plugin/ manifest only works
for Codex CLI. Add the Claude Code-specific manifest with inline
mcpServers config, and also declare mcpServers in the root marketplace
manifest entry for belt-and-suspenders coverage.

Fixes #840

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@AbhitejJohn
AbhitejJohn force-pushed the abhitejjohn/fix-claude-code-msbuild-mcp branch from 79003b2 to 2213193 Compare June 29, 2026 23:44

@Evangelink Evangelink left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving. The fix is correct and spec-compliant:

  • plugins/dotnet-msbuild/.claude-plugin/plugin.json — Claude Code reads a plugin's manifest from .claude-plugin/plugin.json, not a root-level plugin.json. Skills/agents were loading via auto-discovery of the skills/ and �gents/ directories, but with no MCP config in any location Claude reads (no .mcp.json, no .claude-plugin/plugin.json), the binlog server never loaded. The inline mcpServers form is valid per the spec, and the new file is byte-identical to the existing root manifest.
  • .claude-plugin/marketplace.json — marketplace plugin entries accept any field from the plugin manifest schema, so the inline mcpServers here is valid as belt-and-suspenders coverage.

JSON is well-formed on both files, all CI checks pass, and dotnet-msbuild is the only plugin declaring an MCP server, so the targeted scope is appropriate. Fixes #840.

@AbhitejJohn
AbhitejJohn merged commit 733cc26 into main Jun 30, 2026
36 checks passed
@AbhitejJohn
AbhitejJohn deleted the abhitejjohn/fix-claude-code-msbuild-mcp branch June 30, 2026 17:48
AbhitejJohn added a commit that referenced this pull request Jul 9, 2026
…rden /version-bump permission check

Resolves the 3 findings from the Copilot re-review of ebfc958.

Optional third manifest (.claude-plugin/plugin.json):
- One plugin (dotnet-msbuild, via #844) also carries
  plugins/<name>/.claude-plugin/plugin.json — Claude Code needs an inline
  mcpServers block where the Codex manifest uses a reference. It has its own
  "version" field, but the script only stamped plugin.json and
  .codex-plugin/plugin.json, so it would drift. The top-level marketplace.json
  files carry no version fields, so they stay out of scope.
- Sync-PluginVersions.ps1: add .claude-plugin/plugin.json to the universal
  $HeightExcludedFiles (so it's height-excluded and part of the canonical
  pathFilters set) and to Get-ChangedPlugins' output-manifest excludes. In the
  main loop, treat it as optional (stamp-if-present, keyed off Test-Path so a
  present-but-malformed manifest fails loudly instead of being skipped); codex
  stays required. Include it in the drift/$changed check and the write path.
- All 16 plugins/*/version.json: add ":!.claude-plugin/plugin.json" so they
  still match the now-4-entry canonical set. Excluding a manifest a plugin
  doesn't have is a harmless no-op and future-proofs any plugin that later adds
  one.
- CONTRIBUTING.md: document the optional third manifest.

version-bump-command.yml:
- The actor permission lookup returned a 404 for non-collaborators, which made
  `gh api` exit non-zero and (under the default `set -eo pipefail` shell)
  aborted the step before the friendly "requires write access" denial comment.
  Default to "none" on any API failure so the denial path always runs. This can
  only ever deny more, never grant.
- Add a non-fatal `git add plugins/*/.claude-plugin/plugin.json` so the new
  manifest is committed, and an empty glob (if no plugin has one in future)
  can't fail the step.

Validated: actionlint clean; script parses; harness scenarios prove all three
manifests stamp equally, the Claude manifest is height-excluded (no self-bump),
claude-only drift is detected, a plugin without one stamps only its two, a
present-but-malformed Claude manifest fails loudly, and the canonical guard
accepts the 4-exclusion set. Earlier codex/regression guard suites still pass.
Cross-model (GPT-5.5) review drove the Test-Path presence fix.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

waiting-on-review PR state label

Projects

None yet

Development

Successfully merging this pull request may close these issues.

dotnet-msbuild plugin: binlog MCP server not recognized by Claude Code

3 participants