使用说明
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ą),/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}
- Parametry:
-
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) — mapanazwa: 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ślniedata.sqlitew katalogu uruchomienia).
- Parametry:
-
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:
rowsz polami:TrackId,Track,Album,Artist
- Parametry:
-
db_list_tracks_by_artist — Lista utworów dla wykonawcy (Chinook)
- Parametry:
artist(string, wymagane),limit(int, opcjonalne, domyślnie 200) - Zwraca:
rowsz polami:Artist,Album,Track - Parametry:
sql(string, wymagane) — polecenie bez SELECT (z parametrami@name),parameters(object, opcjonalne) — mapanazwa: wartośćdla parametrów (bez@).
- Zwraca: tekst z informacją o
affectedRowsi ścieżce bazy.
- Parametry:
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="<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"