본문으로 건너뛰기

© 2026 Molayo

Zenn헤드라인2026. 06. 04. 00:38

Microsoft Agent Framework의 MCP 기반 기술(MCP-based skills) 시도해 보기 (C# v1.8.0)

요약

Microsoft Agent Framework 1.8.0에서 도입된 MCP 기반 기술(MCP-based skills)의 동작 원리와 구현 방법을 다룹니다. MCP 서버를 통해 기술과 도구를 통합 관리하고 배포하는 메커니즘을 C# 환경에서 검증했습니다.

핵심 포인트

  • MCP 서버를 통해 기술(Skill)을 로컬 파일이 아닌 원격으로 배포 가능
  • 동일한 MCP 서버에서 도구(Tool)와 기술(Skill)을 동시에 공개 가능
  • 기술(Skill)을 활용해 도구 사용에 필요한 컨텍스트를 효율적으로 관리
  • ASP.NET Core 기반의 HTTP MCP 서버 구축 및 연동 확인

서론

Microsoft Agent Framework 1.8.0에서 추가된 MCP-based skills가 어떻게 동작하는지 확인해 보았습니다.

MCP-based skills는 기술(Skill)을 로컬 파일이 아닌 MCP 서버로부터 배포하기 위한 메커니즘입니다.

이를 통해 기술(Skill)의 관리와 배포를 MCP 서버 측에서 일원화할 수 있게 됩니다.

다음 사항들을 확인했습니다.

  • MCP-based skills를 로컬 HTTP MCP 서버로 공개하는 흐름
  • 독자적인 기술(Skill)을 여러 개 공개할 수 있는지 여부
  • 동일한 MCP 서버에서 도구(Tool)와 기술(Skill)의 공개를 겸할 수 있는지 여부
  • 도구(Tool)의 사용을 보조하는 기술(Skill)을 동일한 서버에서 관리할 수 있는지 여부

결론적으로 동일한 MCP 서버에서 도구(Tool)와 기술(Skill)을 모두 공개할 수 있었습니다.

또한, 도구(Tool)만으로는 부족하기 쉬운 컨텍스트(Context)도 기술(Skill)로서 묶어서 관리할 수 있을 것으로 보였습니다.

환경 정보

이번에 확인한 주요 환경 정보는 다음과 같습니다.

항목버전
.NET.NET 10 (net10.0)
Microsoft Agent FrameworkMicrosoft.Agents.AI 1.8.0 / Microsoft.Agents.AI.OpenAI 1.8.0
MCP-based skills packageMicrosoft.Agents.AI.Mcp 1.8.0-alpha.260528.1
MCP C# SDKModelContextProtocol 1.3.0 / ModelContextProtocol.AspNetCore 1.3.0
LM Studio 모델google/gemma-4-26b-a4b

확인할 동작

다음 시나리오로 동작을 확인합니다.

  • MCP 서버는 로컬 HTTP MCP 서버로 기동한다
  • 동일한 /mcp 엔드포인트에서 도구(Tool)와 기술(Skill)을 모두 공개한다
  • 기술(Skill)은 zenn-article-plannermcp-server-design-reviewer 2개를 공개한다
  • 도구(Tool)로서 get_zenn_article_template를 공개한다
  • 콘솔 출력으로 도구(Tool) 호출과 기술(Skill) 읽기를 확인한다

먼저, API로서의 동작을 사전에 확인해 보겠습니다.

그다음, 에이전트(Agent) 실행 시의 기술(Skill) 읽기를 확인해 보겠습니다.

프로젝트

이번 프로젝트의 구성은 다음과 같습니다.

McpBasedSkillsSample/
├── McpBasedSkillsSample.csproj
├── Program.cs
...

Program.cs는 엔트리 포인트(Entry point)로만 설정해 두었습니다.

실제 처리는 다음 두 파일로 나누어져 있습니다.

  • ClientApplication.cs: MCP 클라이언트(Client)의 접속, 도구(Tool) 확인, 기술(Skill) 읽기, 에이전트(Agent) 실행
  • ServerComponents.cs: 로컬 HTTP MCP 서버, 도구(Tool)와 기술(Skill)의 공개

MCP 서버 측 구성 (ServerComponents.cs)

이번에는 ASP.NET Core 위에서 로컬 HTTP MCP 서버를 구축했습니다.

builder.Services
.AddMcpServer(options => options.ServerInfo = new() { Name = "LocalZennSkillsServer", Version = "1.0.0" })
.WithHttpTransport()
...

포인트는 WithResources<SkillResources>()WithTools<ArticleTools>()를 동시에 등록했다는 점입니다.

이를 통해 하나의 MCP 서버가 도구(Tool)와 기술(Skill)을 모두 공개할 수 있습니다.

공개할 도구 (Tool)

도구(Tool)로서 get_zenn_article_template를 공개하고 있습니다.

[McpServerTool(Name = "get_zenn_article_template"] 
[Description("Zenn technical article template provider.")]
public static string GetZennArticleTemplate(string topic, bool includeExperimentalNotes)
...

공개하는 Skill

Skill은 skill://index.json와 각 SKILL.md를 resource로 공개하고 있습니다.

[McpServerResource(UriTemplate = "skill://index.json", Name = "Skill Index", MimeType = "application/json"] 
public static string GetIndex() => IndexJson;
[McpServerResource(UriTemplate = "skill://zenn-article-planner/SKILL.md", Name = "Zenn Article Planner Skill", MimeType = "text/markdown")] 
...

skill://index.json의 내용은 다음과 같습니다.

{
"$schema": "https://schemas.agentskills.io/discovery/0.2.0/schema.json",
"skills": [
...

첫 번째 zenn-article-planner는 기사 구성을 만드는 Skill입니다.

두 번째 mcp-server-design-reviewer는, MCP 서버의 관리 관점에서 보는 Skill입니다.

Client 측 구성(ClientApplication.cs)

Client 측에서는 다음 순서로 처리를 합니다.

SkillServerHost.StartAsync(...)로 로컬 MCP 서버를 기동하는 것 -
HttpClientTransport/mcp endpoint에 접속하는 것 -
ListToolsAsync()로 Tool을 확인하는 것 -
ReadResourceAsync(...)skill://index.jsonSKILL.md를 읽는 것 -
UseMcpSkills(client)AgentSkillsProvider를 만드는 것 - 마지막으로 Agent를 실행합니다.

MCP client의 접속 부분은 다음과 같습니다.

await using McpClient mcpClient = await McpClient.CreateAsync(
new HttpClientTransport(new HttpClientTransportOptions
{
...

Tool 확인은 ListToolsAsync()InvokeAsync(...)로 진행합니다.

IList<McpClientTool> tools = await mcpClient.ListToolsAsync().ConfigureAwait(false);
McpClientTool templateTool = tools 
.Single(tool => string.Equals(tool.Name, "get_zenn_article_template", StringComparison.Ordinal));
...

MCP-based skills의 로딩은 UseMcpSkills(client)입니다.

AgentSkillsProvider skillsProvider = new AgentSkillsProviderBuilder()
.UseMcpSkills(mcpClient)
.Build();

Skill resource 확인은 ReadResourceAsync(...)로 직접 진행합니다.

ReadResourceResult indexResult = await mcpClient.ReadResourceAsync("skill://index.json");
ReadResourceResult skillResult = await mcpClient.ReadResourceAsync(skill.Url);

Agent 측에서는 AIContextProviders에 이 provider를 전달합니다.

AIAgent agent = chatClient.AsAIAgent(new ChatClientAgentOptions
{
Name = "McpSkillsAgent",
...

실행 결과

이번에는 Tool과 Skill 확인부터 Agent 실행까지를 한 번의 실행으로 이어서 확인합니다.

LM Studio를 실행한 상태에서 다음을 실행합니다.

$env:OPENAI_BASE_URL="http://localhost:1234/v1"
$env:OPENAI_API_KEY="sk-dummy"
$env:OPENAI_MODEL="google/gemma-4-26b-a4b"
...

실행하면 처음에 다음과 같은 로그가 출력됩니다.

[server] Started.
[server] This endpoint serves normal MCP tools and MCP-based skill resources.
[client] Listing normal MCP tools...
...

이 로그를 통해 Tool 호출과 Skill 읽기가 동일한 MCP 서버에 도달하고 있음을 알 수 있습니다.

이어서 Agent 실행에 들어갑니다. 채팅 내용은 다음과 같습니다.

MCP-based skills의 기사 구성을 작성해 주세요. MCP server가 Tool과 Skill의 공개를 겸할 수 있는지에 대한 관점도 포함해 주세요.

Agent 실행 중의 로그는 다음과 같습니다.

[client] Starting agent run...
[server] resource read: skill://index.json
[server] resource read: skill://mcp-server-design-reviewer/SKILL.md
...

이 로그를 통해 Agent가 최종 답변을 만들기 전에 Skill을 읽어들이고 있음을 확인할 수 있었습니다.

그 후, LLM으로부터 다음과 같은 응답이 돌아왔습니다.

MCP server가 Tool과 Skill 모두를 관리 및 공개한다는 개념에 기반하여, Zenn 기사 구성안을 작성했습니다.
# Zenn 기사 구성안: MCP Server를 통한 Tool과 Skill의 통합 관리
## 기사 컨셉
...

이번 실행에서는 zenn-article-plannermcp-server-design-reviewer를 모두 읽은 후 기사 구성안이 반환되었습니다. 응답 문구 자체는 매번 조금씩 달라질 수 있지만, Skill을 먼저 읽은 뒤 구성을 짜는 흐름은 확인할 수 있습니다.

요약

MCP-based skills는 Skill을 로컬 파일이 아닌 MCP 서버로부터 배포하기 위한 메커니즘임을 확인할 수 있었습니다.

이번의 핵심 요점은 다음과 같습니다.

  • skill://index.json에 여러 개의 skill-md 엔트리를 올려 독자적인 Skill을 공개할 수 있었다.
  • 동일한 MCP 서버에서 Tool과 Skill의 공개를 겸할 수 있었다.
  • Tool 사용법을 보조하는 instructions도 Skill로서 동일한 서버에서 제공할 수 있을 것 같았다.
  • Client 측은 UseMcpSkills(client)를 추가하는 것만으로 Skill을 읽어올 수 있었다.

Tool만으로는 모델의 동작이 안정적이지 않아, 시스템 프롬프트(System Prompt)로 보조하고 싶은 상황이 적지 않습니다.

그러한 컨텍스트를 Skill로서 MCP 서버 측에서 관리할 수 있다면, Tool의 사양과 사용법을 동일한 장소에서 배포할 수 있으므로 운용하기 쉬운 구성이 될 것입니다.

참고

관련 기사

참고

관련 기사

  • ASP.NET Core로 간단한 MCP 서버를 만들어 보기
  • Microsoft Agent Framework를 로컬 LLM으로 사용해 보기 그 14 (MCP 클라이언트)
  • MicrosoftAgentFramework에서 AgentSkills을 사용해 보기

소스

Program.cs

using System.Text;
Console.OutputEncoding = Encoding.UTF8;
SampleSettings settings = SampleSettings.Load(args);
...

ServerComponents.cs

using System.ComponentModel;
using System.Net;
using System.Net.Sockets;
...

ClientApplication.cs

using System.ClientModel;
using System.Text.Json;
using System.Text.Json.Serialization;
...

토론

AI 자동 생성 콘텐츠

본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0