์์ธํ ๋ด์ฉ ๋ณด๊ธฐ: Release v1.0 of the official MCP C# SDK - .NET Blog
MCP(Model Context Protocol) C# SDK๊ฐ v1.0 ๋ง์ผ์คํค์ ๋๋ฌํ์ต๋๋ค. ์ด๋ฒ ๋ฆด๋ฆฌ์ค๋ MCP ์คํ 2025-11-25 ๋ฒ์ ์ ์์ ํ๊ฒ ์ง์ํ๋ฉฐ, ์ธ์ฆ ํ๋ฆ ๊ฐ์ ๋ถํฐ ์ฅ๊ธฐ ์คํ ์์ฒญ ์ฒ๋ฆฌ, ์คํ์ ๊ธฐ๋ฅ์ธ Tasks๊น์ง ํญ๋์ ๋ณํ๋ฅผ ๋ด๊ณ ์์ต๋๋ค. ํต์ฌ ๋ด์ฉ์ ์ ๋ฆฌํฉ๋๋ค.
1. ์ธ์ฆ ์๋ฒ ๋์ค์ปค๋ฒ๋ฆฌ ๊ฐ์
์๋ฒ๊ฐ Protected Resource Metadata(PRM) ๋ฌธ์๋ฅผ ๋ ธ์ถํ๋ ๊ฒฝ๋ก๊ฐ ์ธ ๊ฐ์ง๋ก ํ์ฅ๋์์ต๋๋ค.
-
WWW-Authenticateํค๋์resource_metadataํ๋ผ๋ฏธํฐ (๊ธฐ์กด ๋ฐฉ์) -
MCP ์๋ํฌ์ธํธ ๊ฒฝ๋ก ๊ธฐ๋ฐ well-known URL (์:
/.well-known/oauth-protected-resource/public/mcp) -
๋ฃจํธ well-known URL (์:
/.well-known/oauth-protected-resource)
ํด๋ผ์ด์ธํธ๋ ์ด ์ธ ์์น๋ฅผ ์์๋๋ก ํ์ํฉ๋๋ค. ์๋ฒ ์ธก์์๋ AddMcp ํ์ฅ ๋ฉ์๋๋ก PRM์ ๊ตฌ์ฑํ๋ฉด, SDK๊ฐ well-known ๊ฒฝ๋ก ํธ์คํ
๊ณผ WWW-Authenticate ํค๋ ์ค์ ์ ์๋ ์ฒ๋ฆฌํฉ๋๋ค.
2. ๋๊ตฌยท๋ฆฌ์์คยทํ๋กฌํํธ์ ์์ด์ฝ ๋ฉํ๋ฐ์ดํฐ ์ถ๊ฐ
tools/list, resources/list, prompts/list ์๋ต์ ์์ด์ฝ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ McpServerToolAttribute์ IconSource ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐ๋ ๊ฒ์
๋๋ค.
[McpServerTool(Title = "๋ ์จ ์กฐํ", IconSource = "https://example.com/weather-icon.svg")]
public static string GetWeather(...)
MIME ํ์
, ํฌ๊ธฐ ํํธ, ๋ผ์ดํธ/๋คํฌ ํ
๋ง ๊ตฌ๋ถ์ด ํ์ํ ๊ฒฝ์ฐ McpServerToolCreateOptions.Icons๋ฅผ ํตํด ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ, Implementation ํด๋์ค์๋ Icons์ WebsiteUrl ์์ฑ์ด ์ถ๊ฐ๋์์ต๋๋ค.
3. ์ ์ง์ ์ค์ฝํ ๋์ (Incremental Scope Consent)
์ต์ ๊ถํ ์์น์ MCP ์ธ์ฆ์ ์ ์ฉํ ๊ธฐ๋ฅ์ ๋๋ค.
-
ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ ์์ด ์์ฒญํ๋ฉด ์๋ฒ๋
401๊ณผ ํจ๊ป ํ์ํ ์ค์ฝํ๋ฅผ ์๋ตํฉ๋๋ค. -
ํ ํฐ์ ํน์ ์์ ์ ์ค์ฝํ๊ฐ ๋ถ์กฑํ๋ฉด
403 Forbidden+insufficient_scope์๋ฌ๋ก ์ถ๊ฐ ์ค์ฝํ๋ฅผ ์๋ดํฉ๋๋ค.
ํด๋ผ์ด์ธํธ SDK๋ ์ด ํ๋ฆ์ ์๋ ์ฒ๋ฆฌํ๋ฏ๋ก ๋ณ๋ ์ฝ๋๊ฐ ํ์ ์์ต๋๋ค. ์๋ฒ ์ธก์์๋ ASP.NET Core ๋ฏธ๋ค์จ์ด์์ ์ธ๊ฐ ๊ฒ์ฌ๋ฅผ ์ํํด์ผ ํ๋๋ฐ, MCP HTTP ํธ๋ค๋ฌ๊ฐ ๋๊ตฌ ํธ์ถ ์ ์ ์๋ต ํค๋๋ฅผ flushํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๊ตฌ ๋ฉ์๋ ๋ด๋ถ๊ฐ ์๋ ๋ฏธ๋ค์จ์ด์์ ์ฒ๋ฆฌํด์ผ ํ๋ค๋ ์ ์ด ์ค์ํฉ๋๋ค.
4. URL ๋ชจ๋ Elicitation
MCP ํธ์คํธ/ํด๋ผ์ด์ธํธ๋ฅผ ์ฐํํ์ฌ ์๋ฒ์ ์ต์ข ์ฌ์ฉ์ ๊ฐ์ ๋์ญ ์ธ(out-of-band) ์ํธ์์ฉ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. API ํค, ์๋ํํฐ ์ธ์ฆ, ๊ฒฐ์ ์ ๋ณด ๊ฐ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ ์์ง์ ์ ์ฉํฉ๋๋ค.
-
ํด๋ผ์ด์ธํธ๋
Capabilities.Elicitation.Url์ ์ค์ ํ๊ณElicitationHandler๋ฅผ ์ ๊ณตํฉ๋๋ค. -
์๋ฒ๋ Elicitation URL ์๋ํฌ์ธํธ๋ฅผ ์ ์ํ๊ณ , Razor Page ๋ฑ์ผ๋ก ํผ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
-
Streamable HTTP Transport์ ๋ฉํฐํ ๋ํธ ํน์ฑ์, ๊ฐ Elicitation ์์ฒญ์ ์ฌ๋ฐ๋ฅธ MCP ์ธ์ ์ ์ฐ๊ฒฐํ๋ ์ํ ๊ด๋ฆฌ๊ฐ ํ์์ ๋๋ค.
5. ์ํ๋ง์์์ ๋๊ตฌ ํธ์ถ ์ง์
์ด๋ฒ ์คํ์์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ์ถ๊ฐ ์ฌํญ ์ค ํ๋์ ๋๋ค. ์๋ฒ๊ฐ ์ํ๋ง ์์ฒญ์ ๋๊ตฌ๋ฅผ ํฌํจ์ํค๋ฉด, LLM์ด ํด๋น ๋๊ตฌ๋ฅผ ํธ์ถํ์ฌ ์๋ต์ ์์ฑํ ์ ์์ต๋๋ค.
ํต์ฌ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์
CreateMessage์์ฒญ (ํ๋กฌํํธ + ๋๊ตฌ ์ ์ ํฌํจ) -
ํด๋ผ์ด์ธํธ(LLM)๊ฐ ๋๊ตฌ ํธ์ถ์ ์์ฒญํ๋ ์๋ต ๋ฐํ (
stopReason: tool_calls) -
์๋ฒ๊ฐ ๋๊ตฌ๋ฅผ ๋ก์ปฌ ์คํํ ๋ค, ๋๊ตฌ ํธ์ถ/์๋ต์ ํฌํจํ ์
CreateMessage์์ฒญ ๋ฐ์ก -
์ต์ข ์๋ต์ด ์ฌ ๋๊น์ง ๋ฐ๋ณต
Microsoft.Extensions.AI์ IChatClient์ CreateSamplingHandler()๋ฅผ ํ์ฉํ๋ฉด MCP-LLM ๊ฐ ํฌ๋งท ๋ณํ์ ๊ฐ๊ฒฐํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ฒ ์ธก์์๋ McpServer.AsSamplingChatClient()๋ก IChatClient๋ฅผ ์ป๊ณ , UseFunctionInvocation()์ผ๋ก ๋๊ตฌ ํธ์ถ์ ์ถ๊ฐํ๋ ํจํด์
๋๋ค.
6. Client ID Metadata Documents (CIMD)
Dynamic Client Registration(DCR)์ ๋์์ผ๋ก, ์ด์ MCP์์ ํด๋ผ์ด์ธํธ ๋ฑ๋ก์ ๊ถ์ฅ ๋ฐฉ์์
๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ client_id๋ก URL์ ์ง์ ํ๋ฉด, ์ธ๊ฐ ์๋ฒ๊ฐ ํด๋น URL์์ JSON ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํฉ๋๋ค.
SDK๋ CIMD๋ฅผ ๋จผ์ ์๋ํ๊ณ , ์ธ๊ฐ ์๋ฒ๊ฐ ๋ฏธ์ง์ ์ DCR๋ก ํด๋ฐฑํฉ๋๋ค.
7. HTTP ๊ธฐ๋ฐ ์ฅ๊ธฐ ์คํ ์์ฒญ โ ํด๋ง ๋ฐฉ์
HTTP ํ์์์ ํ๊ฒฝ์์ ์ฅ๊ธฐ ์คํ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด ๊ฐ์ ๋์์ต๋๋ค.
-
์๋ฒ๊ฐ SSE ์คํธ๋ฆผ์ ์ด ๋ Event ID๊ฐ ํฌํจ๋ ๋น ์ด๋ฒคํธ๋ฅผ ๋จผ์ ๋ณด๋ ๋๋ค.
-
์ดํ ์๋ฒ๊ฐ ์ธ์ ๋ ์คํธ๋ฆผ์ ๋ซ์ ์ ์๊ณ , ํด๋ผ์ด์ธํธ๋ Event ID๋ก ์ฌ์ฐ๊ฒฐํฉ๋๋ค.
-
ISseEventStreamStore๊ตฌํ์ฒด๋ฅผ ์ ๊ณตํ๋ฉด ๋๋ฉฐ, SDK์ ํฌํจ๋DistributedCacheEventStreamStore๋IDistributedCache๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค. -
ํธ๋ค๋ฌ์์
context.EnablePollingAsync()๋ฅผ ํธ์ถํ๋ฉด SSE ์ฐ๊ฒฐ์ ๋๊ณ ํด๋ง ๋ชจ๋๋ก ์ ํํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง๋ฅผ ์ํด ์ธ์ ์ข ๋ฃ ์ ์คํธ๋ฆผ ์ญ์ , ์๊ฐ ๊ธฐ๋ฐ ๋ง๋ฃ ์ ์ฑ , ์ ํ์ ์ด๋ฒคํธ ์ ์ฅ ๋ฑ์ ๋ณด์กด ์ ๋ต์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
8. Tasks (์คํ์ ๊ธฐ๋ฅ)
MCP ์คํ 2025-11-25์ ์คํ์ ๊ธฐ๋ฅ์ ๋๋ค. ํฅํ API ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๊ธฐ์กด ์์ฒญ์ ๋ด๊ตฌ์ฑ ์๋ ์ํ ์ถ์ ๊ณผ ์ง์ฐ ๊ฒฐ๊ณผ ์กฐํ๋ฅผ ์ถ๊ฐํ๋ ์๋ก์ด ํ๋ฆฌ๋ฏธํฐ๋ธ์ ๋๋ค.
-
ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์
taskํ๋๋ฅผ ํฌํจํ๋ฉด, ์๋ฒ๋ Task IDยท์ํยทTTL ๋ฑ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค. -
์ดํ
tasks/get(์ํ ํด๋ง),tasks/result(๊ฒฐ๊ณผ ์กฐํ),tasks/list(๋ชฉ๋ก),tasks/cancel(์ทจ์)๋ก ๊ด๋ฆฌํฉ๋๋ค. -
Task ์ํ๋
workingโcompleted|failed|cancelled(+input_required)์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
์๋ฒ์์๋ IMcpTaskStore๋ฅผ ๊ตฌํํ์ฌ Task ์คํ ์ด๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. SDK์ ํฌํจ๋ InMemoryMcpTaskStore๋ ๊ฐ๋ฐ ๋ฐ ๋จ์ผ ์๋ฒ ๋ฐฐํฌ์ ์ ํฉํ๋ฉฐ, ํ๋ก๋์
๋ฉํฐ ์๋ฒ ํ๊ฒฝ์์๋ DB๋ Redis ๋ฑ ์์ ์ ์ฅ์ ๊ธฐ๋ฐ ๊ตฌํ์ด ํ์ํฉ๋๋ค.
๋น๋๊ธฐ ๋ฉ์๋(Task<T>, ValueTask<T> ๋ฐํ)๋ ์๋์ผ๋ก Task ์ง์์ ์ ์ธํ๋ฉฐ, McpServerToolAttribute์ TaskSupport ์์ฑ์ผ๋ก Forbidden, Optional, Required๋ฅผ ๋ช
์์ ์ผ๋ก ์ ์ดํ ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋งํฌ
์ด๋ฒ ๋ฆด๋ฆฌ์ค๋ .NET ์ํ๊ณ์์ MCP ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์์ด ๋ณธ๊ฒฉ์ ์ธ ํ๋ก๋์ ๋ ๋ฒจ์ ๊ธฐ๋ฐ์ด ๋ง๋ จ๋ ๊ฒ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค. ํนํ ์ธ์ฆ ํ๋ฆ, ์ํ๋ง ๋๊ตฌ ํธ์ถ, ์ฅ๊ธฐ ์คํ ์ฒ๋ฆฌ ํจํด์ ์ค์ ์ํฐํ๋ผ์ด์ฆ ์๋๋ฆฌ์ค์์ ๋ฐ๋ก ํ์ฉ ๊ฐ๋ฅํ ์์ค์ ๋๋ค.
์ด ์ํฐํด์ ์์ฑํ AI๋ฅผ ํตํด ๋ฒ์ญ/์ ๋ฆฌํ์ต๋๋ค.