MCP协议SDK

基于Azure OpenAI的MCP协议C# SDK实现,提供服务器与客户端交互功能,支持多种工具调用如时间查询、URL检查、天气查询和数据库操作。

  • by KNG60
  • C#
  • 本地部署
  • 更新于
在 GitHub 查看 KNG60/MCPserver_Azure_AI

使用说明

MCP C# SDK: serwer + klient (Azure OpenAI)

To repo zawiera:

  • serwer Model Context Protocol (MCP) zbudowany na oficjalnym ModelContextProtocol C# SDK (projekt McpServer),
  • klienta w C#, który łączy się z serwerem przez stdio używając tego samego SDK i udostępnia narzędzia LLM‑owi (Azure OpenAI) w trybie tools/function calling (projekt McpClient).

Wymagania

  • .NET 8.0 SDK lub nowszy

Budowa projektu

dotnet build

Tryb czatu (interaktywny, jedna sesja MCP na wiele pytań):

dotnet run --project McpClient/McpClient.csproj -- --chat
# alias: -i

W trybie czatu dostępne są komendy:

  • /reset — czyści historię rozmowy (pozostawia tylko wiadomość systemową),
  • /exit lub /quit — kończy działanie klienta.

Wysyłanie promptu (nie interaktywny)

Prompt — sprawdź URL

dotnet run --project McpClient/McpClient.csproj -- "Sprawdź, czy wp.pl jest dostępne."

Przykładowy wynik:

Strona wp.pl jest dostępna (status 200 OK, czas odpowiedzi 210 ms).

Prompt — podaj czas

dotnet run --project McpClient/McpClient.csproj -- "podaj czas"

Przykładowy wynik:

Aktualny czas serwera to 19:19:36.

Prompt — pogoda (online, Open‑Meteo)

dotnet run --project McpClient/McpClient.csproj -- "Podaj pogodę dla Warszawy w stopniach Celsjusza."

Przykładowy wynik:

Aktualna temperatura w Warszawie wynosi 7,2°C.

Prompt — zasoby

dotnet run --project McpClient/McpClient.csproj -- "Wypisz listę utworów 'Led Zeppelin'."

Przykładowy wynik:

Oto lista utworów zespołu Led Zeppelin:

1. **BBC Sessions [Disc 1] [Live]**
   - Communication Breakdown
   - Communication Breakdown(2)
   - Communication Breakdown(3)
   - Dazed and Confused
   - How Many More Times
   - I Can't Quit You Baby
   - I Can't Quit You Baby(2)
   ...
dotnet run --project McpClient/McpClient.csproj -- "Znajdz wykonawcę utworu 'Black Dog'."

Przykładowy wynik:

Oto lista utworów zespołu Led Zeppelin:

1. **BBC Sessions [Disc 1] [Live]**
   - Communication Breakdown
   - Communication Breakdown(2)
   - Communication Breakdown(3)
   - Dazed and Confused
   - How Many More Times
   - I Can't Quit You Baby
   - I Can't Quit You Baby(2)
   ...

Funkcjonalności

Serwer implementuje następujące narzędzia (tools):

  1. get_time - Zwraca bieżący czas serwera

    • Parametry: brak
    • Przykład: {}
  2. check_url - Sprawdza dostępność strony/URL

    • Parametry: url (string, wymagane), method (string: HEAD/GET, opcjonalnie), timeoutMs (integer 100–10000, opcjonalnie)
    • Przykład: {"url":"https://example.com","method":"HEAD","timeoutMs":3000}
  3. check_weather - Informacja o pogodzie dla miasta

    • Działa online (Open‑Meteo: geocoding + current temperature), z fallbackiem offline gdy API jest niedostępne.
    • Parametry: city (string), units (string, opcjonalnie: metric/imperial)
    • Przykład: {"city": "Warszawa", "units": "metric"}
  4. db_query — Zapytanie tylko do odczytu (SELECT) do bazy SQLite

    • Parametry:
      • sql (string, wymagane) — zapytanie SELECT lub WITH … SELECT (z parametrami @name),
      • parameters (object, opcjonalne) — mapa nazwa: wartość dla parametrów (bez @),
      • limit (int, opcjonalne) — maksymalna liczba zwracanych wierszy (domyślnie 100, max 1000).
    • Zwraca: JSON z polami rows (tablica wierszy), rowCount, path.
    • Zmienna środowiskowa: DB_SQLITE_PATH — ścieżka do pliku bazy (domyślnie data.sqlite w katalogu uruchomienia).
  5. db_execute — Wykonanie poleceń nie-SELECT (INSERT/UPDATE/DELETE/DDL) w SQLite

  6. db_schema — Zwraca schemat bazy (tabele i kolumny) jako JSON

    • Parametry: brak
    • Zwraca: path, tables (lista tabel z kolumnami)
  7. db_find_track_artist — Wyszukiwanie utworów po fragmencie tytułu (Chinook)

    • Parametry: title (string, wymagane), limit (int, opcjonalne, domyślnie 10)
    • Zwraca: rows z polami: TrackId, Track, Album, Artist
  8. db_list_tracks_by_artist — Lista utworów dla wykonawcy (Chinook)

    • Parametry: artist (string, wymagane), limit (int, opcjonalne, domyślnie 200)
    • Zwraca: rows z polami: Artist, Album, Track
    • Parametry:
      • sql (string, wymagane) — polecenie bez SELECT (z parametrami @name),
      • parameters (object, opcjonalne) — mapa nazwa: wartość dla parametrów (bez @).
    • Zwraca: tekst z informacją o affectedRows i ścieżce bazy.

Jak to działa (skrót)

  • Serwer MCP (McpServer) jest hostowany przez Microsoft.Extensions.Hosting i uruchamiany w trybie stdio przez MCP SDK (AddMcpServer().WithStdioServerTransport()).
  • Narzędzia (tools) są rejestrowane przez atrybuty [McpServerToolType] i [McpServerTool] na metodach w kodzie.
  • Klient MCP (McpClient) uruchamia serwer jako proces potomny przez StdioClientTransport i łączy się z nim protokołem MCP.
  • Lista narzędzi jest mapowana na specyfikację „tools” dla Chat Completions, a LLM może je wywoływać w pętli do uzyskania odpowiedzi.

Struktura projektu

  • McpServer/Program.cs - Serwer MCP oparty o oficjalny C# SDK (Host + atrybuty narzędzi)
  • McpServer/McpServer.csproj - Plik projektu .NET serwera MCP
  • McpClient/Program.cs - Klient LLM (Azure OpenAI) integrujący narzędzia MCP
  • McpClient/McpClient.csproj - Plik projektu .NET klienta
  • README.md - Dokumentacja

Implementacja

Komunikacja JSON‑RPC oraz negocjacja MCP są w pełni obsługiwane przez ModelContextProtocol C# SDK (NuGet: ModelContextProtocol). Logi serwera są kierowane na stderr, aby stdout pozostał czysty dla protokołu.

Klient MCP (C# + Azure OpenAI)

Klient McpClient uruchamia lokalnie serwer MCP (projekt McpServer) przez dotnet run, pobiera listę narzędzi MCP, mapuje je na funkcje dla Chat Completions (tools/function calling), a następnie pozwala LLM automatycznie wzywać narzędzia. Wyniki z narzędzi zwracane są z powrotem do modelu, aż do uzyskania finalnej odpowiedzi.

Konfiguracja środowiska

export AZURE_OPENAI_API_KEY="<twój_klucz>"
export AZURE_OPENAI_ENDPOINT="https://<twoja_nazwa>.openai.azure.com"
export AZURE_OPENAI_CHAT_DEPLOYMENT="<nazwa_deploymentu_modelu>"
# Opcjonalnie: ścieżka do bazy SQLite dla serwera MCP
export DB_SQLITE_PATH="/pełna/ścieżka/do/data.sqlite"