使用 MCP Server 打造企業內部人才搜尋工具 (使用 .NET 10)

AI 能協助我們處理例行事務的運用越來越多,除了單純的對話外,AI Agent 更能主動幫我們做事情,但如果希望你的 AI Agent 能夠回頭參考公司內部的資料在進行下一步的工作呢?這時候 MCP (Model Context Protocol) 就扮演了關鍵的角色。

這篇文章我要實作一個簡單的 MCP Server,模擬一個企業內部的人才搜尋工具,讓 AI Client 端也可以透過這個 Server 來查詢員工的工作經歷。


什麼是 MCP (Model Context Protocol)?

MCP 的歷史背景網路上很多,有興趣的可以自己查一下,我這邊就不重複貼上了😅 。簡單來說,MCP 是一個標準化的協定,用來連接 AI 模型 (MCP Client) 與 資料來源/工具 (MCP Server)。

想像一下我們如果要讓 AI 存取外部資料,可能需要寫特定的 Plugin 或 Function Calling,但麻煩的是每家 AI 的實作方式可能都不太一樣,所以我們有可能就要針對各 AI 平台寫各自的存取介面。

MCP 的出現就是為了解決這個問題,讓開發者只要寫一個程式,就能被支援 MCP 的各種 Client (如 Claude Desktop, Cursor, 或 Github Copilot) 使用,其流程大概如下圖。


情境說明

這次的範例專案是一個模擬的內部工具,主要功能有兩個: 

  • 查詢員工基本資料:包含員工編號、姓名、部門、職稱。 
  • 查詢工作經歷:查看該員工過去在其他公司的任職紀錄。 

透過這個工具,我們可以問 AI:「幫我查一下 Lawrence Shen 的工作經歷」,AI 就會自動呼叫我們寫好的 Tool 來取得資料。


開發環境與必要套件

本範例使用 .NET 10 (或是 .NET 8/9 也可以) 來開發,首先需要安裝以下 NuGet 套件:

  • Microsoft.Extensions.Hosting: 用來建立標準的 .NET Host。 
  • ModelContextProtocol: 這是核心套件,目前還是 Preview 版本,API 可能會變動,使用時請多留意

<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.0" />
<PackageReference Include="ModelContextProtocol" Version="0.5.0-preview.1" />


重點程式碼說明

Program.cs

Server 的進入點,這是整個 MCP Server 的啟動配置。

var builder = Host.CreateEmptyApplicationBuilder(settings: null);

// 註冊 MCP Server 服務
builder.Services
    .AddMcpServer()
    .WithStdioServerTransport() // 使用 Stdio 進行傳輸
    .WithToolsFromAssembly();   // 自動掃描組件中的 Tools

await builder.Build().RunAsync();

這邊另外補充一下,因為一般的 CreateApplicationBuilder 會預設載入很多設定檔 (appsettings.json)、環境變數與預設服務,但 MCP Server 通常是一個輕量級的 Console App,透過 Stdio 與 Client 溝通,我們希望它啟動越快越好,且干擾越少越好,所以選擇 Host.CreateEmptyApplicationBuilder 版本。

接下來,定義 Tools,我們可以透過 Attribute 來告訴 Server 哪些方法是可以被 AI 呼叫的。

  • [McpServerToolType]:將類別標記為 MCP 工具的容器,它告訴 MCP Server,這個類別包含一個或多個可提供給 AI 呼叫的的工具。
  • [McpServerTool]:宣告在 Method 上,這就是 AI Client 端實際可以呼叫的工具。 
  • [Description]:這個說明最重要, 可以用自然語言描述這個工具在做什麼、參數代表什麼意義。AI Client 端就是靠這些描述來決定什麼時候該呼叫這個工具。 

EmployeeTool.cs (查詢員工資料)

[McpServerToolType] // 1. 標記這個類別包含 MCP Tools
public static class EmployeeTool
{ 
    // ... (略過模擬員工資料 List) ... 

    [McpServerTool]
    [Description("依姓名(中文或英文)取得員工資訊字串")] // 2. 標記方法與描述
    public static string GetInfo(
    	[Description("員工中文或英文姓名")] string name // 3. 參數也可以加上描述
    ) 
    {
         // ... 實作搜尋邏輯 ...
    }
}

JobHistoryTool.cs (工作經歷)

[McpServerToolType]
public static class JobHistoryTool
{  
    // ... (略過模擬工作經歷資料 List) ...
 
    [McpServerTool, Description("取得指定員工的工作經歷")]
    public static IEnumerable<JobHistory> GetJobHistoryByEmpNo(
    	[Description("員工編號")] string empNo
    )
    {
        // ... 實作搜尋邏輯 ...
    }
}


開發與除錯

使用 MCP Inspector 

官方提供了一個很棒的網頁版除錯工具「MCP Inspector」,它讓我們可以直接用網頁的 UI 來呼叫我們自己開發的 MCP Server Tool,

  • 在開始之前請確保你有安裝 Node.js,並先安裝底下的套件。

npm i -D @modelcontextprotocol/inspector

  • 接著在,終端執行以下指令

cd McpServer
npx @modelcontextprotocol/inspector dotnet run

建置成功後應該會開啟一個瀏覽器畫面 http://localhost:6274 ,接著就可以按底下步驟開始進行測試

  • 點擊 Connect 按鈕
  • Tools -> List Tools 列出所有工具
  • 直接在網頁上模擬發送 Request 測試你的開發的 Mcp 工具


用 GitHub Copilot 進行真實測試

MCP Inspector 雖然很方便測試,但它畢竟只是一個模擬的 MCP Client,並不等於真實的 AI Client(例如 GitHub Copilot、Claude for Desktop)。

因此在本篇文章中,我將使用 GitHub Copilot 來驗證真實情境以及紀錄相關設定步驟。

  1. 在 VS Code 開啟專案,按 F1,輸入並選擇「MCP: Add Server」。 
  2. 選擇 Command(transport 類型)時選「stdio」。
  3.  因為專案使用 .NET 10,依此須透過 dotnet cli 來執行,所以在 Command 欄位填入 dotnet
  4. 輸入 MCP Server 的 Name(我是直接用隨機名稱)。 
  5. 設定目標(target):此範例選擇 Workspace(代表在本工作區啟動)。 
  6. 完成上述步驟後,會在 .vscode 下產生一個 mcp.json,但還需補 dotnet run 執行參數與專案路徑才能正確啟動你的 MCP 伺服器。
  7. (非必要)若調整完程式要重新啟動 MCP Server,請輸入「ctr + shift + p」並選擇「MCP:List Servers」。
  8. 選擇你的 MCP Server。
  9. 重新啟動 MCP Server。


完成上述設定後,就可以開啟 GitHub Copilot Chat 來測試一下我們的 MCP 工具了。這邊示範一次如何使讓 AI Client 呼叫我們的 MCP 工具,相關步驟如下:
  • 在 VS Code 開啟 Copilot Chat,並輸入「幫我查一下 Lawrence 的工作經歷」。 
  • AI Client 會檢視已公開的 MCP Tools(在 NET 類別中標記的 Methods / Descriptions),並推理出呼叫的順序: 
    • 先呼叫取得員工資料的 Tool,以取得員工的 empNo。
    • 再用取得的 empNo 呼叫 JobHistory 的 Tool。
    • 整理並回傳結果。
  • 補充一下,AI Client 在要執行任一外部 Tool 前,通常會詢問使用者是否允許執行該外部操作(安全/授權確認),因此必須人工允許該執行請求。若允許,Client 會啟動你的 MCP Server,並經由 Stdio 發送參數,並呼叫工具來取得 Server 的回傳資料,待資料回傳後,AI Client 會把結果回饋給使用者介面。 

  • 收到回傳值後,驗證顯示的工作經歷內容,是否與你 MCP Server 回傳的內容一致。


本文範例:使用 .NET Core 10,請至 Github 下載。


參考網站

留言