はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】NuGet.orgにMCP Serverだと認識されなかった理由は.NET10以降かどうかでcsprojの記述が違うからだと気づいた

はじめに

まだちゃんと作りきれてないので宣伝していないのですが、実は最近MCP Serverを細々と作っています。
www.nuget.org

細かいところまで作りきれたらちゃんと記事なども書こうと思うのですが、その際に.mcp/server.jsonを配置しているのに何故かNuGet.orgでMCP Serverだと認識してくれませんでした。

MCP Serverだと認識されていない

↓ .mcp/server.json

{
  "$schema": "https://modelcontextprotocol.io/schemas/draft/2025-07-09/server.json",
  "description": "MCP Server for easily and efficiently analyzing Unity AssetBundles",
  "name": "io.github.hanachiru/AssetBundleMCP",
  "packages": [
    {
      "registry_name": "nuget",
      "name": "AssetBundleMCP",
      "version": "0.1.8",
      "package_arguments": []
    }
  ],
  "repository": {
    "url": "https://github.com/hanachiru/AssetBundleMCP",
    "source": "github"
  },
  "version_detail": {
    "version": "0.1.8"
  }
}
<None Include=".mcp\server.json" Pack="true" PackagePath="/.mcp/" />

調べてみたところ結構初見殺しな根深い問題でして、備忘録も兼ねて書き残しておきたいと思います。

原因

おそらく多くの方はMicrosoft.Extensions.AI.Templatesから生成してるかなと思います。

$ dotnet new install Microsoft.Extensions.AI.Templates
$ dotnet new mcpserver -n SampleMcpServer

learn.microsoft.com

そこには以下のように記述されているはずです。

<PackageType>McpServer</PackageType>

これは正しい記述なのですが、実は.NET10以降でないと動作しません。このままpackするとDotnetToolのみ付与されます。.NET10以降ならDotnetToolMcpServerが設定され、ちゃんとNuGet.orgがMCP Serverとして認識します。

補足ですがあくまでビルドするのが.NET10以降ならという話なので、TargetFrameworkは関係ありません

github.com

対処法

GitHub Actionsなどでリリースする際は.NET10以降をセットアップしてほしいのですが、どうしても.NET 9以前が良いと言う方は、以下のようにcsprojに記述してください。

<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
		<OutputType>Exe</OutputType>
		<TargetFrameworks>net8.0</TargetFrameworks>
		<ImplicitUsings>enable</ImplicitUsings>
		<Nullable>enable</Nullable>
		<ToolCommandName>my-command-name</ToolCommandName>
		<PackAsTool>true</PackAsTool>
		<GenerateNuspecDependsOn>$(GenerateNuspecDependsOn);OverridePackageType</GenerateNuspecDependsOn>
	</PropertyGroup>

	<Target Name="OverridePackageType">
		<PropertyGroup>
			<PackageType>DotnetTool;McpServer</PackageType>
		</PropertyGroup>
	</Target>

</Project>

重要なところはTargetでプロパティを上書きしている箇所です。