
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 Framework | Microsoft.Agents.AI 1.8.0 / Microsoft.Agents.AI.OpenAI 1.8.0 |
| MCP-based skills package | Microsoft.Agents.AI.Mcp 1.8.0-alpha.260528.1 |
| MCP C# SDK | ModelContextProtocol 1.3.0 / ModelContextProtocol.AspNetCore 1.3.0 |
| LM Studio 모델 | google/gemma-4-26b-a4b |
확인할 동작
다음 시나리오로 동작을 확인합니다.
- MCP 서버는 로컬 HTTP MCP 서버로 기동한다
- 동일한
/mcp엔드포인트에서 도구(Tool)와 기술(Skill)을 모두 공개한다 - 기술(Skill)은
zenn-article-planner와mcp-server-design-reviewer2개를 공개한다 - 도구(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.json과 SKILL.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-planner와 mcp-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가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기