Dela via


Skapa en minimal MCP-server med C# och publicera till NuGet

I den här snabbstarten skapar du en minimal MCP-server (Model Context Protocol) med C# SDK för MCP, ansluter till den med GitHub Copilot och publicerar den till NuGet. MCP-servrar är tjänster som exponerar funktioner för klienter via Model Context Protocol (MCP).

Anmärkning

Upplevelsen Microsoft.Extensions.AI.Templates är för närvarande i förhandsversion. Mallen använder biblioteket ModelContextProtocol och MCP-registerschematserver.json, som båda är i förhandsversion.

Förutsättningar

Skapa projektet

  1. I ett terminalfönster installerar du MCP Server-mallen (version 9.10.0-preview.3.25513.3 eller senare):

    dotnet new install Microsoft.Extensions.AI.Templates
    
  2. Skapa en ny MCP-serverapp med dotnet new mcpserver kommandot :

    dotnet new mcpserver -n SampleMcpServer
    

    Som standard skapar det här kommandot ett fristående verktygspaket som riktar sig till alla de vanligaste plattformarna som .NET stöds på. Om du vill se fler alternativ använder du dotnet new mcpserver --help.

  3. Gå till SampleMcpServer katalogen:

    cd SampleMcpServer
    
  4. Bygg projektet:

    dotnet build
    
  5. Uppdatera <PackageId> i .csproj-filen så att den är unik på NuGet.org, till exempel <NuGet.org username>.SampleMcpServer.

Konfigurera MCP-servern i Visual Studio Code

Konfigurera GitHub Copilot för Visual Studio Code för att använda din anpassade MCP-server:

  1. Om du inte redan har gjort det öppnar du projektmappen i Visual Studio Code.

  2. Skapa en .vscode mapp i roten av projektet.

  3. Lägg till en mcp.json fil i .vscode mappen med följande innehåll:

    {
      "servers": {
        "SampleMcpServer": {
          "type": "stdio",
          "command": "dotnet",
          "args": [
            "run",
            "--project",
            "<relative-path-to-project-file>"
          ]
        }
      }
    }
    

    Anmärkning

    VS Code kör MCP-servrar från arbetsytans rot. Platshållaren <relative-path-to-project-file> ska peka på .NET-projektfilen. Till exempel skulle värdet för den här SampleMcpServer-appen vara SampleMcpServer.csproj.

  4. Spara filen.

Testa MCP-servern

MCP-servermallen innehåller ett verktyg som heter get_random_number du kan använda för testning och som utgångspunkt för utveckling.

  1. Öppna GitHub Copilot i Visual Studio Code och växla till agentläge.

  2. Välj ikonen Välj verktyg för att kontrollera att SampleMcpServer är tillgängligt med exempelverktyget i listan.

    En skärmbild som visar tillgängliga MCP-verktyg.

  3. Ange en uppmaning om att köra verktyget get_random_number :

    Give me a random number between 1 and 100.
    
  4. GitHub Copilot begär behörighet att köra verktyget get_random_number för din fråga. Välj Fortsätt eller använd pilen för att välja ett mer specifikt beteende:

    • Den aktuella sessionen kör alltid åtgärden i den aktuella GitHub Copilot-agentlägessessionen.
    • Den aktuella arbetsytan kör alltid kommandot för den aktuella Visual Studio Code-arbetsytan.
    • Tillåt alltid att åtgärden alltid körs för alla GitHub Copilot-agentlägessessioner eller visual Studio Code-arbetsytor.
  5. Kontrollera att servern svarar med ett slumptal:

    Your random number is 42.
    

Lägga till indata och konfigurationsalternativ

I det här exemplet förbättrar du MCP-servern så att den använder ett konfigurationsvärde som anges i en miljövariabel. Det kan vara konfiguration som krävs för att mcp-servern ska fungera, till exempel en API-nyckel, en slutpunkt att ansluta till eller en lokal katalogsökväg.

  1. Lägg till en annan verktygsmetod efter GetRandomNumber -metoden i Tools/RandomNumberTools.cs. Uppdatera verktygskoden så att den använder en miljövariabel.

    [McpServerTool]
    [Description("Describes random weather in the provided city.")]
    public string GetCityWeather(
        [Description("Name of the city to return weather for")] string city)
    {
        // Read the environment variable during tool execution.
        // Alternatively, this could be read during startup and passed via IOptions dependency injection
        var weather = Environment.GetEnvironmentVariable("WEATHER_CHOICES");
        if (string.IsNullOrWhiteSpace(weather))
        {
            weather = "balmy,rainy,stormy";
        }
    
        var weatherChoices = weather.Split(",");
        var selectedWeatherIndex =  Random.Shared.Next(0, weatherChoices.Length);
    
        return $"The weather in {city} is {weatherChoices[selectedWeatherIndex]}.";
    }
    
  2. .vscode/mcp.json Uppdatera för att ange WEATHER_CHOICES miljövariabeln för testning.

    {
       "servers": {
         "SampleMcpServer": {
           "type": "stdio",
           "command": "dotnet",
           "args": [
             "run",
             "--project",
             "<relative-path-to-project-file>"
           ],
           "env": {
              "WEATHER_CHOICES": "sunny,humid,freezing"
           }
         }
       }
     }
    
  3. Prova en annan fråga med Copilot i VS Code, till exempel:

    What is the weather in Redmond, Washington?
    

    VS Code bör returnera en slumpmässig väderbeskrivning.

  4. Uppdatera .mcp/server.json för att deklarera din miljövariabel indata. Filschemat server.json definieras av MCP Registry-projektet och används av NuGet.org för att generera VS Code MCP-konfiguration.

    • Använd egenskapen environmentVariables för att deklarera miljövariabler som används av din app som ska anges av klienten med hjälp av MCP-servern (till exempel VS Code).

    • Använd egenskapen packageArguments för att definiera CLI-argument som skickas till din app. Fler exempel finns i MCP Registry-projektet.

    {
      "$schema": "https://static.modelcontextprotocol.io/schemas/2025-10-17/server.schema.json",
      "description": "<your description here>",
      "name": "io.github.<your GitHub username here>/<your repo name>",
      "version": "<your package version here>",
      "packages": [
        {
          "registryType": "nuget",
          "registryBaseUrl": "https://api.nuget.org",
          "identifier": "<your package ID here>",
          "version": "<your package version here>",
          "transport": {
            "type": "stdio"
          },
          "packageArguments": [],
          "environmentVariables": [
            {
              "name": "WEATHER_CHOICES",
              "value": "{weather_choices}",
              "variables": {
                "weather_choices": {
                  "description": "Comma separated list of weather descriptions to randomly select.",
                  "isRequired": true,
                  "isSecret": false
                }
              }
            }
          ]
        }
      ],
      "repository": {
        "url": "https://github.com/<your GitHub username here>/<your repo name>",
        "source": "github"
      }
    }
    

    Den enda information som används av NuGet.org i server.json är det första packages matrisobjektet med värdet registryType som matchar nuget. De andra toppnivåegenskaperna, förutom packages-egenskapen, är för närvarande oanvända och är avsedda för det kommande centrala MCP-registret. Du kan lämna platshållarvärdena tills MCP-registret är aktivt och redo att acceptera MCP-serverinlägg.

Du kan testa MCP-servern igen innan du går vidare.

Packa och publicera till NuGet

  1. Packa projektet:

    dotnet pack -c Release
    

    Det här kommandot genererar ett verktygspaket och flera plattformsspecifika paket baserat på <RuntimeIdentifiers> listan i SampleMcpServer.csproj.

  2. Publicera paketen till NuGet:

    dotnet nuget push bin/Release/*.nupkg --api-key <your-api-key> --source https://api.nuget.org/v3/index.json
    

    Se till att publicera alla .nupkg filer för att säkerställa att alla plattformar som stöds kan köra MCP-servern.

    Om du vill testa publiceringsflödet innan du publicerar till NuGet.org kan du registrera ett konto i NuGet Gallery-integreringsmiljön: https://int.nugettest.org. Kommandot push skulle ändras till:

    dotnet nuget push bin/Release/*.nupkg --api-key <your-api-key> --source https://apiint.nugettest.org/v3/index.json
    

Mer information finns i Publicera ett paket.

Identifiera MCP-servrar på NuGet.org

  1. Sök efter MCP-serverpaketet på NuGet.org (eller int.nugettest.org om du publicerade till integrationsmiljön) och välj det i listan.

    En skärmbild som visar en sökning efter MCP-servrar på NuGet.org.

  2. Visa paketinformationen och kopiera JSON från fliken "MCP Server".

    En skärmbild som visar en specifik MCP-server som visas på NuGet.org.

  3. mcp.json I filen i .vscode mappen lägger du till den kopierade JSON som ser ut så här:

    {
      "inputs": [
        {
          "type": "promptString",
          "id": "weather_choices",
          "description": "Comma separated list of weather descriptions to randomly select.",
          "password": false
        }
      ],
      "servers": {
        "Contoso.SampleMcpServer": {
          "type": "stdio",
          "command": "dnx",
          "args": ["Contoso.SampleMcpServer@0.0.1-beta", "--yes"],
          "env": {
            "WEATHER_CHOICES": "${input:weather_choices}"
          }
        }
      }
    }
    

    Om du har publicerat i NuGet Gallery-integreringsmiljön måste du lägga "--add-source", "https://apiint.nugettest.org/v3/index.json" till i slutet av matrisen "args" .

  4. Spara filen.

  5. I GitHub Copilot väljer du ikonen Välj verktyg för att kontrollera att SampleMcpServer är tillgänglig med de verktyg som visas.

  6. Ange en uppmaning om att köra det nya get_city_weather verktyget:

    What is the weather in Redmond?
    
  7. Om du har lagt till indata till MCP-servern (till exempel WEATHER_CHOICES) uppmanas du att ange värden.

  8. Kontrollera att servern svarar med slumpmässigt väder:

    The weather in Redmond is balmy.
    

Vanliga problem

Kommandot "dnx" som behövdes för att köra SampleMcpServer hittades inte

Om VS Code visar det här felet när du startar MCP-servern måste du installera en kompatibel version av .NET SDK.

En skärmbild som visar det saknade dnx-kommandot i VS Code.

Kommandot dnx levereras som en del av .NET SDK, från och med version 10. Installera .NET 10 SDK för att lösa problemet.

GitHub Copilot använder inte verktyget (ett svar tillhandahålls utan att du anropar verktyget)

Generellt sett informeras en AI-agent som GitHub Copilot om att den har vissa verktyg som är tillgängliga av klientprogrammet, till exempel VS Code. Vissa verktyg, till exempel exempel slumpmässigt nummerverktyg, kanske inte utnyttjas av AI-agenten eftersom det har liknande funktioner inbyggda.

Om verktyget inte används kontrollerar du följande:

  1. Kontrollera att verktyget visas i listan över verktyg som VS Code har aktiverat. Se skärmbilden i Testa MCP-servern för att se hur du kontrollerar detta.
  2. Referera uttryckligen till namnet på verktyget i din fråga. I VS Code kan du referera till verktyget med namn. Till exempel Using #get_random_weather, what is the weather in Redmond?.
  3. Kontrollera att MCP-servern kan starta. Du kan kontrollera detta genom att klicka på knappen "Start" som visas ovanför MCP-serverkonfigurationen i VS Code-användar- eller arbetsyteinställningarna.

En skärmbild som visar en MCP-server i VS Code-konfigurationen som har startats.