DEV Community

Thang Chung
Thang Chung

Posted on • Edited on

Upgrade Projects Easily with CentralisedPackageConverter!

Context: The SK_MCP repository should utilize ManagePackageVersionsCentrally to facilitate the easy upgrading of NuGet packages used in both client and server projects.

We have found a very cool tool called CentralisedPackageConverter

First, let's install the tool by using:

dotnet tool install CentralisedPackageConverter --global
Enter fullscreen mode Exit fullscreen mode

Now, let's run it in the root of SK_MCP project:

git clone git@github.com:thangchung/mcp-labs.git
cd SK_MCP
central-pkg-converter .
Enter fullscreen mode Exit fullscreen mode

Then it will confirm and convert all of csproject to use ManagePackageVersionsCentrally, as shown in the picture below.

CentralisedPackageConverter runs

And Directory.Packages.props created with content as:

<Project>
  <PropertyGroup>
    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
    <CentralPackageTransitivePinningEnabled>false</CentralPackageTransitivePinningEnabled>
  </PropertyGroup>
  <ItemGroup>
    <PackageVersion Include="Aspire.Hosting.AppHost" Version="9.2.0" />
    <PackageVersion Include="Azure.AI.Projects" Version="1.0.0-beta.7" />
    <PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="9.0.4" />
    <PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="9.0.4" />
    <PackageVersion Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
    <PackageVersion Include="Microsoft.Extensions.Logging" Version="9.0.4" />
    <PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="9.0.4" />
    <PackageVersion Include="Microsoft.Extensions.Logging.Debug" Version="9.0.4" />
    <PackageVersion Include="Microsoft.SemanticKernel" Version="1.47.0" />
    <PackageVersion Include="Microsoft.SemanticKernel.Abstractions" Version="1.47.0" />
    <PackageVersion Include="Microsoft.SemanticKernel.Agents.AzureAI" Version="1.47.0-preview" />
    <PackageVersion Include="Microsoft.SemanticKernel.Agents.Core" Version="1.47.0" />
    <PackageVersion Include="Microsoft.SemanticKernel.Connectors.AzureOpenAI " Version="1.47.0" />
    <PackageVersion Include="Microsoft.SemanticKernel.Connectors.InMemory" Version="1.47.0-preview" />
    <PackageVersion Include="Microsoft.SemanticKernel.Core" Version="1.47.0" />
    <PackageVersion Include="Microsoft.SemanticKernel.PromptTemplates.Handlebars" Version="1.47.0" />
    <PackageVersion Include="ModelContextProtocol" Version="0.1.0-preview.10" />
    <PackageVersion Include="ModelContextProtocol.AspNetCore" Version="0.1.0-preview.10" />
    <PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.11.2" />
    <PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.11.2" />
    <PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.11.1" />
    <PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.11.0" />
  </ItemGroup>
</Project>
Enter fullscreen mode Exit fullscreen mode

Server and Client projects are modified to use ManagePackageVersionsCentrally as well. Look at the below.

# MCPServer
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>5ee045b0-aea3-4f08-8d31-32d1a6f8fed0</UserSecretsId>
    <NoWarn>$(NoWarn);VSTHRD111;CA2007;CA1054;SKEXP0001;SKEXP0010;SKEXP0110</NoWarn>
  </PropertyGroup>

  <ItemGroup>
    <Content Remove="Prompts\getCurrentWeatherForCity.json" />
  </ItemGroup>

  <ItemGroup>
    <None Remove="ProjectResources\EmployeeBirthdaysAndPositions.png" />
    <None Remove="ProjectResources\SalesReport2014.png" />
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Include="ProjectResources\EmployeeBirthdaysAndPositions.png" />
    <EmbeddedResource Include="ProjectResources\getCurrentWeatherForCity.json" />
    <EmbeddedResource Include="ProjectResources\cat.jpg">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </EmbeddedResource>
    <EmbeddedResource Include="ProjectResources\SalesReport2014.png" />
    <EmbeddedResource Include="ProjectResources\semantic-kernel-info.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </EmbeddedResource>
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" />
    <PackageReference Include="ModelContextProtocol" />
    <PackageReference Include="ModelContextProtocol.AspNetCore" />
    <!-- Core Semantic Kernel packages -->
    <PackageReference Include="Microsoft.SemanticKernel" />
    <PackageReference Include="Microsoft.SemanticKernel.Abstractions" />
    <PackageReference Include="Microsoft.SemanticKernel.Core" />
    <!-- Connectors -->
    <PackageReference Include="Microsoft.SemanticKernel.Connectors.AzureOpenAI " />
    <PackageReference Include="Microsoft.SemanticKernel.Connectors.InMemory" />
    <!-- Prompting -->
    <PackageReference Include="Microsoft.SemanticKernel.PromptTemplates.Handlebars" />
    <!-- Agent -->
    <PackageReference Include="Microsoft.SemanticKernel.Agents.Core" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
    <PackageReference Include="OpenTelemetry.Extensions.Hosting" />
    <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
    <PackageReference Include="OpenTelemetry.Instrumentation.Http" />
  </ItemGroup>

</Project>
Enter fullscreen mode Exit fullscreen mode

And,

# MCPClient
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>5ee045b0-aea3-4f08-8d31-32d1a6f8fed0</UserSecretsId>
    <NoWarn>$(NoWarn);VSTHRD111;CA2007;CA1054;SKEXP0001;SKEXP0010;SKEXP0110</NoWarn>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="ModelContextProtocol" />
    <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" />
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" />
    <PackageReference Include="Microsoft.Extensions.Logging" />
    <PackageReference Include="Microsoft.Extensions.Logging.Console" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
    <!-- Core Semantic Kernel packages -->
    <PackageReference Include="Microsoft.SemanticKernel" />
    <PackageReference Include="Microsoft.SemanticKernel.Abstractions" />
    <PackageReference Include="Microsoft.SemanticKernel.Core" />
    <!-- Connectors -->
    <PackageReference Include="Microsoft.SemanticKernel.Connectors.AzureOpenAI " />
    <PackageReference Include="Microsoft.SemanticKernel.Connectors.InMemory" />
    <!-- Prompting -->
    <PackageReference Include="Microsoft.SemanticKernel.PromptTemplates.Handlebars" />
    <!-- Agent -->
    <PackageReference Include="Microsoft.SemanticKernel.Agents.Core" />
    <PackageReference Include="Microsoft.SemanticKernel.Agents.AzureAI" />
  </ItemGroup>

  <ItemGroup Label="NotUsed">
    <PackageReference Include="Azure.AI.Projects" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
    <PackageReference Include="OpenTelemetry.Extensions.Hosting" />
    <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
    <PackageReference Include="OpenTelemetry.Instrumentation.Http" />
  </ItemGroup>

</Project>
Enter fullscreen mode Exit fullscreen mode

Bonus tip: migrate sln to slnx in .NET 9

dotnet sln migrate <your_solution.sln>
Enter fullscreen mode Exit fullscreen mode

sln migration

Now, we can upgrade the NuGet packages in Visual Studio. Happy tips, happy working!

Top comments (0)