다음을 통해 공유


C#을 사용하여 최소 MCP 서버 만들기 및 NuGet에 게시

이 빠른 시작에서는 MCP용 C# SDK를 사용하여 최소 MCP(모델 컨텍스트 프로토콜) 서버를 만들고, GitHub Copilot를 사용하여 연결하고, NuGet에 게시합니다. MCP 서버는 MCP(모델 컨텍스트 프로토콜)를 통해 클라이언트에 기능을 노출하는 서비스입니다.

비고

환경은 Microsoft.Extensions.AI.Templates 현재 미리 보기로 제공됩니다. 템플릿은 미리 보기 상태인 ModelContextProtocol 라이브러리와 MCP 레지스트리 server.json 스키마를 사용합니다.

필수 조건

프로젝트를 만듭니다.

  1. 터미널 창에서 MCP 서버 템플릿(버전 9.10.0-preview.3.25513.3 이상)을 설치합니다.

    dotnet new install Microsoft.Extensions.AI.Templates
    
  2. 다음 명령을 사용하여 새 MCP 서버 앱을 만듭니다 dotnet new mcpserver .

    dotnet new mcpserver -n SampleMcpServer
    

    기본적으로 이 명령은 .NET이 지원되는 가장 일반적인 모든 플랫폼을 대상으로 하는 자체 포함 도구 패키지를 만듭니다. 더 많은 옵션을 보려면 .를 사용합니다 dotnet new mcpserver --help.

  3. SampleMcpServer 디렉터리로 이동하십시오.

    cd SampleMcpServer
    
  4. 프로젝트를 빌드합니다.

    dotnet build
    
  5. NuGet.org에서 고유하도록 <PackageId> 파일의 .csproj를 업데이트합니다. 예를 들어 <NuGet.org username>.SampleMcpServer와 같이 설정하십시오.

Visual Studio Code에서 MCP 서버 구성

사용자 지정 MCP 서버를 사용하도록 Visual Studio Code용 GitHub Copilot를 구성합니다.

  1. 아직 열려 있지 않은 경우 Visual Studio Code에서 프로젝트 폴더를 엽니다.

  2. .vscode 프로젝트의 루트에 폴더를 만듭니다.

  3. mcp.json 폴더에 다음 내용이 포함된 .vscode 파일을 추가합니다.

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

    비고

    VS Code는 작업 영역 루트에서 MCP 서버를 실행합니다. <relative-path-to-project-file> 자리 표시자는 .NET 프로젝트 파일을 가리킵니다. 예를 들어 이 SampleMcpServer 앱의 값은 다음과 같습니다 SampleMcpServer.csproj.

  4. 파일을 저장합니다.

MCP 서버 테스트

MCP 서버 템플릿에는 테스트에 사용할 수 있는 도구와 개발의 시작점으로 사용할 get_random_number 수 있는 도구가 포함되어 있습니다.

  1. Visual Studio Code에서 GitHub Copilot를 열고 에이전트 모드로 전환합니다.

  2. 도구 선택 아이콘을 선택하여 샘플 도구가 나열된 상태에서 SampleMcpServer를 사용할 수 있는지 확인합니다.

    사용 가능한 MCP 도구를 보여 주는 스크린샷.

  3. get_random_number 도구를 실행하라는 프롬프트를 입력합니다.

    Give me a random number between 1 and 100.
    
  4. GitHub Copilot는 프롬프트에 대해 get_random_number 도구를 실행할 수 있는 권한을 요청합니다. 계속을 선택하거나 화살표를 사용하여 보다 구체적인 동작을 선택합니다.

    • 현재 세션 은 항상 현재 GitHub Copilot 에이전트 모드 세션에서 작업을 실행합니다.
    • 현재 작업 영역은 항상 현재 Visual Studio Code 작업 영역에 대한 명령을 실행합니다.
    • 항상 모든 GitHub Copilot 에이전트 모드 세션 또는 Visual Studio Code 작업 영역에 대해 작업을 실행하도록 항상 허용합니다.
  5. 서버가 난수로 응답했는지 확인합니다.

    Your random number is 42.
    

입력 및 구성 옵션 추가

이 예제에서는 환경 변수에 설정된 구성 값을 사용하도록 MCP 서버를 향상시킵니다. API 키, 연결할 엔드포인트 또는 로컬 디렉터리 경로와 같은 MCP 서버의 작동에 필요한 구성일 수 있습니다.

  1. GetRandomNumber에서 Tools/RandomNumberTools.cs 메서드 뒤에 다른 도구 메서드를 추가합니다. 환경 변수를 사용하도록 도구 코드를 업데이트합니다.

    [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 테스트용 환경 변수를 WEATHER_CHOICES 설정하도록 업데이트합니다.

    {
       "servers": {
         "SampleMcpServer": {
           "type": "stdio",
           "command": "dotnet",
           "args": [
             "run",
             "--project",
             "<relative-path-to-project-file>"
           ],
           "env": {
              "WEATHER_CHOICES": "sunny,humid,freezing"
           }
         }
       }
     }
    
  3. 다음과 같이 VS Code에서 Copilot를 사용하여 다른 프롬프트를 시도합니다.

    What is the weather in Redmond, Washington?
    

    VS Code는 임의의 날씨 설명을 반환해야 합니다.

  4. 환경 변수 입력을 .mcp/server.json 선언하도록 업데이트합니다. server.json 파일 스키마는 MCP 레지스트리 프로젝트에서 정의되며 NuGet.org VS Code MCP 구성을 생성하는 데 사용됩니다.

    • environmentVariables 이 속성을 사용하여 MCP 서버(예: VS Code)를 사용하여 클라이언트에서 설정할 앱에서 사용하는 환경 변수를 선언합니다.

    • packageArguments 속성을 사용하여 앱에 전달될 CLI 인수를 정의합니다. 자세한 예제는 MCP 레지스트리 프로젝트를 참조하세요.

    {
      "$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"
      }
    }
    

    NuGet.org에서 server.json에 사용되는 유일한 정보는 값이 packages와 일치하는 첫 번째 registryType 배열 항목입니다. 속성을 제외한 packages 다른 최상위 속성은 현재 사용되지 않으며 예정된 중앙 MCP 레지스트리용입니다. MCP 레지스트리가 라이브 상태이고 MCP 서버 항목을 수락할 준비가 될 때까지 자리 표시자 값을 그대로 둘 수 있습니다.

앞으로 이동하기 전에 MCP 서버를 다시 테스트 할 수 있습니다.

NuGet에 압축 및 게시

  1. 프로젝트 압축:

    dotnet pack -c Release
    

    이 명령은 목록에 따라 <RuntimeIdentifiers>SampleMcpServer.csproj하나의 도구 패키지와 여러 플랫폼별 패키지를 생성합니다.

  2. NuGet에 패키지를 게시합니다.

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

    지원되는 모든 플랫폼이 MCP 서버를 실행할 수 있도록 모든 .nupkg 파일을 게시해야 합니다.

    NuGet.org 게시하기 전에 게시 흐름을 테스트하려면 NuGet 갤러리 통합 환경에 https://int.nugettest.org계정을 등록할 수 있습니다. 이 push 명령은 다음으로 수정됩니다.

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

자세한 내용은 패키지 게시를 참조하세요.

NuGet.org MCP 서버 검색

  1. NuGet.org MCP 서버 패키지를 검색하거나 통합 환경에 게시한 경우 int.nugettest.org 목록에서 선택합니다.

    NuGet.org MCP 서버 검색을 보여 주는 스크린샷

  2. 패키지 세부 정보를 보고 "MCP 서버" 탭에서 JSON을 복사합니다.

    NuGet.org 표시되는 특정 MCP 서버를 보여 주는 스크린샷

  3. mcp.json 폴더의 .vscode 파일에서 복사한 JSON을 추가합니다. 이는 다음과 같습니다.

    {
      "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}"
          }
        }
      }
    }
    

    NuGet 갤러리 통합 환경에 게시한 경우 배열의 "--add-source", "https://apiint.nugettest.org/v3/index.json" 끝에 추가 "args" 해야 합니다.

  4. 파일을 저장합니다.

  5. GitHub Copilot에서 도구 선택 아이콘을 선택하여 나열된 도구에서 SampleMcpServer 를 사용할 수 있는지 확인합니다.

  6. get_city_weather 도구를 실행하라는 프롬프트를 입력합니다.

    What is the weather in Redmond?
    
  7. MCP 서버에 입력을 추가한 경우(예: WEATHER_CHOICES) 값을 제공하라는 메시지가 표시됩니다.

  8. 서버가 임의 날씨로 응답했는지 확인합니다.

    The weather in Redmond is balmy.
    

일반적인 문제

SampleMcpServer를 실행하는 데 필요한 "dnx" 명령을 찾을 수 없습니다.

MCP 서버를 시작할 때 VS Code에서 이 오류가 표시되면 호환되는 버전의 .NET SDK를 설치해야 합니다.

VS Code에서 누락된 dnx 명령을 보여 주는 스크린샷

dnx 명령은 버전 10부터 .NET SDK의 일부로 배송됩니다. .NET 10 SDK를 설치 하여 이 문제를 해결합니다.

GitHub Copilot는 도구를 사용하지 않습니다(도구를 호출하지 않고 답변이 제공됨)

일반적으로 GitHub Copilot와 같은 AI 에이전트에는 VS Code와 같은 클라이언트 애플리케이션에서 사용할 수 있는 몇 가지 도구가 있다는 내용이 표시됩니다. 샘플 난수 도구와 같은 일부 도구는 유사한 기능이 기본 제공되므로 AI 에이전트에서 활용하지 못할 수 있습니다.

도구를 사용하지 않는 경우 다음을 확인합니다.

  1. VS Code에서 사용하도록 설정한 도구 목록에 도구가 표시되는지 확인합니다. 이를 확인하는 방법은 MCP 서버 테스트 의 스크린샷을 참조하세요.
  2. 프롬프트에서 도구의 이름을 명시적으로 참조합니다. VS Code에서 이름으로 도구를 참조할 수 있습니다. 예: Using #get_random_weather, what is the weather in Redmond?.
  3. MCP 서버를 시작할 수 있는지 확인합니다. VS Code 사용자 또는 작업 영역 설정에서 MCP 서버 구성 위에 표시되는 "시작" 단추를 클릭하여 이를 확인할 수 있습니다.

시작된 VS Code 구성의 MCP 서버를 보여 주는 스크린샷