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 buildTryb czatu (interaktywny, jedna sesja MCP na wiele pytań):
dotnet run --project McpClient/McpClient.csproj -- --chat
# alias: -iW trybie czatu dostępne są komendy:
/reset— czyści historię rozmowy (pozostawia tylko wiadomość systemową),/exitlub/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):
- get_time - Zwraca bieżący czas serwera
- Parametry: brak - Przykład: {}
- 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}
- 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"}
- 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).
- db_execute — Wykonanie poleceń nie-SELECT (INSERT/UPDATE/DELETE/DDL) w SQLite
- db_schema — Zwraca schemat bazy (tabele i kolumny) jako JSON
- Parametry: brak - Zwraca: path, tables (lista tabel z kolumnami)
- 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
- 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 przezMicrosoft.Extensions.Hostingi 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 przezStdioClientTransporti łą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 MCPMcpClient/Program.cs- Klient LLM (Azure OpenAI) integrujący narzędzia MCPMcpClient/McpClient.csproj- Plik projektu .NET klientaREADME.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=""
export AZURE_OPENAI_ENDPOINT="https://.openai.azure.com"
export AZURE_OPENAI_CHAT_DEPLOYMENT=""
# Opcjonalnie: ścieżka do bazy SQLite dla serwera MCP
export DB_SQLITE_PATH="/pełna/ścieżka/do/data.sqlite"