DYN-10553: Consume DynamoMCP NuGet as a built-in package#17165
Conversation
Add a pinned DynamoMCP PackageReference (GeneratePathProperty + ExcludeAssets=all) and a BuildDynamoMcpDynamoPackage target that copies the package into Built-In Packages/packages/DynamoMCP, mirroring the PythonNet3Engine NuGet-consume pattern. Exclude DynamoMCP's independently-versioned binaries from check_file_version.ps1 (same treatment as TuneUp / DSPythonNet3). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
See the ticket for this pull request: https://jira.autodesk.com/browse/DYN-10553
jasonstratton
left a comment
There was a problem hiding this comment.
Approved pending the identification of the build version of DynamoMCP ... and resolution to the DynamoPlayer binaries question.
| "JsonSchema.Net.dll", | ||
| "JsonPointer.Net.dll", | ||
| "Json.More.dll", | ||
| "DynamoPlayer.*.dll" |
There was a problem hiding this comment.
Are you including Player as part of the package?
There was a problem hiding this comment.
Yes — DynamoPlayer 7.0.6 is bundled under bin/mcp_server/ as a runtime dependency of MCPServer.dll (loaded in an isolated AssemblyLoadContext). Core Dynamo doesn't ship DynamoPlayer, so the package carries its own copy. It's in the exclusion list only because those DLLs use DynamoPlayer's version (7.0.6), not the Dynamo build version — same as TuneUp.dll/DSPythonNet3*. Since the only DynamoPlayer binaries in the tree are this package's copies, the exclusion can't hide a Dynamo-owned mismatch. (Build version is now pinned to 0.3.0.)
| The DynamoMCP NuGet wraps the assembled package under bin\, so $(PkgDynamoMCP)\bin IS the package | ||
| layout (pkg.json + bin\ + bin\mcp_server\ + extra\). Copy it verbatim into Built-In Packages. | ||
| --> | ||
| <Target Name="BuildDynamoMcpDynamoPackage" AfterTargets="Build" Condition="'$(PkgDynamoMCP)' != ''"> |
There was a problem hiding this comment.
PythonNet3Engine does not have the conditional? Is it necessary? Will it be removed once the exact version is identified? ... I don't think it hurts anything though.
There was a problem hiding this comment.
Good call — it isn't necessary. I added the condition defensively while the version was a [1.0.0] placeholder; now that it's pinned to the published [0.3.0] the package always restores, so I've removed the condition to match the PythonNet3Engine target (commit a76b07b).
Bump the DynamoMCP PackageReference from the placeholder [1.0.0] to the first published feed version [0.3.0]. Verified locally: restores from team-dynamo-nuget and BuildDynamoMcpDynamoPackage lays it out under Built-In Packages\packages\DynamoMCP. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…onNet3Engine) The Condition guard was only needed while the version was a placeholder; with the package pinned to the published 0.3.0 it always restores, so remove it to match the PythonNet3Engine target. Per review feedback. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR integrates the DynamoMCP NuGet into Dynamo as a shipped built-in package under Built-In Packages\packages\DynamoMCP, following the existing pattern used for other externally-versioned components.
Changes:
- Added a pinned
PackageReferencetoDynamoMCP(withGeneratePathProperty+ExcludeAssets="all") to fetch package assets without adding compile/runtime references. - Added an MSBuild target to copy the NuGet’s packaged layout into the build output’s Built-In Packages folder.
- Updated the GitHub version-check script to ignore DynamoMCP’s independently-versioned binaries.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| src/DynamoCoreWpf/DynamoCoreWpf.csproj | Adds the DynamoMCP PackageReference and a post-build copy target to stage it as a built-in package. |
| .github/scripts/check_file_version.ps1 | Excludes DynamoMCP-related binaries from strict version matching against DynamoSandbox.exe. |
| <Target Name="BuildDynamoMcpDynamoPackage" AfterTargets="Build"> | ||
| <PropertyGroup> | ||
| <DynamoMcpDestRoot>$(OutputPath)\Built-In Packages\packages\DynamoMCP\</DynamoMcpDestRoot> | ||
| </PropertyGroup> | ||
| <ItemGroup> | ||
| <DynamoMcpPkg Include="$(PkgDynamoMCP)\bin\**\*.*" /> | ||
| </ItemGroup> | ||
| <Copy SourceFiles="@(DynamoMcpPkg)" DestinationFolder="$(DynamoMcpDestRoot)%(RecursiveDir)" SkipUnchangedFiles="True" /> | ||
| </Target> |
| different DynamoVisualProgramming.* API. Bump in lockstep with the DynamoMCP release for this line. | ||
| --> | ||
| <ItemGroup> | ||
| <PackageReference Include="DynamoMCP" Version="[0.3.0]" GeneratePathProperty="true" ExcludeAssets="all" /> |
Consume the DynamoMCP built-in package as the signed DynamoVisualProgramming.DynamoMCP NuGet published to nuget.org, and hard-pin to the exact 0.4.0 release for this line. Updates the path property and comments to the renamed package id. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| The NuGet wraps the assembled package under bin\, so $(PkgDynamoVisualProgramming_DynamoMCP)\bin IS | ||
| the package layout (pkg.json + bin\ + bin\mcp_server\ + extra\). Copy it verbatim into Built-In Packages. | ||
| --> | ||
| <Target Name="BuildDynamoMcpDynamoPackage" AfterTargets="Build"> |
There was a problem hiding this comment.
Leaving as-is intentionally: this target mirrors the PythonNet3Engine pattern (BuildPythonNet3EngineDynamoPackage in DynamoCore.csproj), which is likewise unguarded. A full build always restores, so the empty-path/--no-restore case doesn't occur in CI. If we want this hardening, the right move is a separate cleanup adding an Exists() condition to both targets so they stay consistent.
| different DynamoVisualProgramming.* API. Bump in lockstep with the DynamoMCP release for this line. | ||
| --> | ||
| <ItemGroup> | ||
| <PackageReference Include="DynamoVisualProgramming.DynamoMCP" Version="[0.4.0]" GeneratePathProperty="true" ExcludeAssets="all" /> |
There was a problem hiding this comment.
Fixed — the PR description was stale. Updated it to reflect the published, hard-pinned [0.4.0].
Switch the BuildDynamoMcpDynamoPackage copy glob from **\*.* to **\* so extensionless files (e.g. LICENSE/NOTICE) are included, matching the "copy verbatim" intent stated in the surrounding comment. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Shipping DynamoMCP as a built-in package adds a third built-in package
(alongside PythonNet3Engine and TuneUp) and a fourth package-requested
view extension ("Dynamo MCP View Extension"). Update the affected
expectations, mirroring the DYN-9388 PythonNet3 built-in change:
- ExpectedNumberOfBuiltInPackages 2 -> 3 (PackageManagerUITests).
- Add "Dynamo MCP View Extension" to the loaded view extension set.
- RequestedExtensions counts 2 -> 3 and 3 -> 4.
Verified by running the six tests against a clean package environment.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
merging even when Dynamo SelfServe check if failing, due that the 3 regression tests reported were introduced in a different PR (#17147). |
|




What
Consumes the DynamoMCP NuGet (
DynamoVisualProgramming.DynamoMCP, published by the DynamoMCP repo to nuget.org, DYN-10553) and ships it as a built-in package underBuilt-In Packages\packages\DynamoMCP. Mirrors the PythonNet3Engine NuGet-consume pattern.Changes
src/DynamoCoreWpf/DynamoCoreWpf.csproj: pinnedDynamoVisualProgramming.DynamoMCPPackageReferenceto the published[0.4.0](GeneratePathProperty+ExcludeAssets="all") and aBuildDynamoMcpDynamoPackagetarget that copies the package verbatim intoBuilt-In Packages\packages\DynamoMCP..github/scripts/check_file_version.ps1: exclude DynamoMCP's independently-versioned binaries (same treatment as TuneUp / DSPythonNet3). The package bundles its own DynamoPlayer 7.0.6 binaries underbin/mcp_server/(runtime deps ofMCPServer.dll, loaded in an isolatedAssemblyLoadContext), which carry DynamoPlayer's version rather than the Dynamo build version.Notes
[0.4.0]release for this line and should be bumped in lockstep with future DynamoMCP releases.🤖 Generated with Claude Code