Spring AI 模型上下文協議中的動態工具更新

工程 | Christian Tzolov | 2025 年 5 月 4 日 | ...

模型上下文協議 (MCP) 是 Spring AI 中一個強大的功能,它使 AI 模型能夠透過標準化介面訪問外部工具和資源。MCP 的一個有趣能力是它能夠在執行時動態更新可用工具。

本篇部落格文章將探討 Spring AI 如何在 MCP 中實現動態工具更新,從而為 AI 驅動的應用程式提供靈活性和可擴充套件性。

相關示例程式碼可在此處獲取:動態工具更新示例

理解模型上下文協議

在深入探討動態工具更新之前,讓我們先了解 MCP 是什麼以及它為何重要

模型上下文協議 (MCP) 是一個標準化介面,允許 AI 應用和 Agent 執行以下操作:訪問外部工具檢索資源使用提示模板

MCP 遵循客戶端-伺服器架構MCP 伺服器 - 暴露工具、資源和提示;MCP 客戶端 - 連線到伺服器並使用其功能;AI 模型 - 透過這些客戶端與世界互動

Spring AI 提供了 MCP 的全面實現,包括客戶端伺服器元件,使得將 AI 能力整合到 Spring 應用中變得容易。

動態工具更新功能

MCP 的強大之處在於能夠在執行時動態更新可用工具。這意味著

  • MCP 伺服器可以在不重啟的情況下新增或移除工具
  • MCP 客戶端可以檢測到這些更改
  • AI 模型可以立即使用新功能

動態工具更新的工作原理

動態工具更新過程涉及多個元件協同工作

伺服器端實現

Spring AI 的 @Tool 註解使得將方法暴露為 MCP 工具變得容易

public class MathTools {

    @Tool(description = "Adds two numbers")
    public int sumNumbers(int number1, int number2) {
        return number1 + number2;
    }

    // ...
}

該框架會自動

  1. 將方法引數提取為工具輸入
  2. 生成相應的 JSON Schema
  3. 處理引數驗證和轉換

在伺服器端,Spring AI 的 MCP 實現提供了一種簡單的方式,可在啟動時以及執行時動態地新增 MCP 工具

@SpringBootApplication
public class ServerApplication {

    //1. Tools added at start time by the Spring AI MCP Server Boot starter
    @Bean
    public ToolCallbackProvider weatherTools(WeatherService weatherService) {
        return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
    }

    //2. Runtime tool addition
    @Bean
    public CommandLineRunner commandRunner(McpSyncServer mcpSyncServer) {
        return args -> {

            // Wait for some tool update signal

            // Add math tools dynamically
            List<SyncToolSpecification> newTools = McpToolUtils
                    .toSyncToolSpecifications(ToolCallbacks.from(new MathTools()));

            for (SyncToolSpecification newTool : newTools) {
				mcpSyncServer.addTool(newTool);
			}
        };
    }
}

在此示例中

  1. 伺服器最初僅暴露天氣預報工具
  2. 當接收到自定義工具更新訊號時,使用 McpSyncServer.addTool() 方法動態註冊新工具

McpSyncServer 類提供了用於工具管理的方法

  • addTool(SyncToolSpecification) - 新增新工具
  • removeTool(String) - 按名稱移除工具
  • notifyToolsListChanged() - 通知客戶端工具已更改

注意: 僅在客戶端/伺服器連線初始化後,才能新增和/或移除工具。

客戶端實現

MCP 協議包含一個通知系統,允許伺服器告知客戶端可用工具的更改。此通知系統確保客戶端始終擁有伺服器功能的最新檢視。

在客戶端,Spring AI 提供了檢測和響應工具更改的機制

@Bean
McpSyncClientCustomizer customizeMcpClient() {
    return (name, mcpClientSpec) -> {
        mcpClientSpec.toolsChangeConsumer(tv -> {
            logger.info("\nMCP TOOLS CHANGE: " + tv);
            latch.countDown();
        });
    };
}

客戶端註冊一個監聽器,當伺服器的可用工具發生變化時,該監聽器會被呼叫。這允許客戶端

  1. 在工具新增或移除時收到通知
  2. 相應地更新其內部狀態
  3. 使新工具立即對 AI 模型可用

目前 Spring AI 不維護關於更新工具的內部狀態,但你可以使用自定義監聽器來實現智慧工具快取或類似功能。

工具發現與使用

客戶端可以隨時發現可用工具

List<ToolDescription> toolDescriptions = chatClientBuilder.build()
        .prompt("What tools are available?")
        .toolCallbacks(tools)
        .call()
        .entity(new ParameterizedTypeReference<List<ToolDescription>>() {});

Spring AI MCP 實現的一個關鍵見解是

提示:客戶端實現依賴於以下事實:MCP 的 ToolCallbackProvider#getToolCallbacks 實現將始終從伺服器檢索當前 MCP 工具列表。

這意味著無論何時客戶端請求可用工具時,它總是會從伺服器獲取最新的列表,而無需重啟或重新初始化客戶端。

實際應用

MCP 中的動態工具更新支援多種強大的用例

1. AI 功能的特性開關

您可以實現特性開關來控制哪些 AI 功能可用

if (featureFlags.isEnabled("advanced-math")) {
    mcpSyncServer.addTool(advancedMathTools);
}

2. 上下文感知的工具載入

根據當前上下文或使用者許可權載入工具

if (userHasPermission(currentUser, "admin-tools")) {
    mcpSyncServer.addTool(adminTools);
}

3. 漸進式增強

從基本工具開始,並根據需要新增更高階的功能

// Start with basic tools
mcpSyncServer.addTool(basicTools);

// Add advanced tools when the user reaches a certain level
userService.onUserLevelUp(user -> {
    if (user.getLevel() >= 5) {
        mcpSyncServer.addTool(advancedTools);
    }
});

4. 動態外掛架構

實現一個外掛系統,其中可以在執行時新增新功能

pluginRegistry.onPluginLoaded(plugin -> {
    if (plugin.hasMcpTools()) {
        mcpSyncServer.addTool(plugin.getMcpTools());
    }
});

結論

Spring AI 在模型上下文協議中處理動態工具更新,為在執行時擴充套件 AI 能力提供了一種機制。此功能使得 AI 應用更加靈活、可擴充套件且資源高效。

要點總結

  1. 標準化介面:MCP 提供了一種一致的方式,使 AI 模型能夠與外部工具和資源互動。

  2. 動態更新:工具可以在執行時新增或移除,無需重啟應用程式。

  3. 自動發現:客戶端可以檢測可用工具的更改,並立即將它們提供給 AI 模型使用。

  4. 簡潔 API:Spring AI 提供了一個簡潔、基於註解的 API,用於定義和管理 MCP 工具。

透過利用 Spring AI 的 MCP 實現中的動態工具更新,開發者可以建立更具適應性的 AI 應用,這些應用可以根據執行時條件、使用者需求和系統要求來發展其能力。

資源

訂閱 Spring 資訊

訂閱 Spring 資訊,保持聯絡

訂閱

先行一步

VMware 提供培訓和認證,為您的進步加速。

瞭解更多

獲取支援

Tanzu Spring 在一份簡單的訂閱中提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

近期活動

檢視 Spring 社群的所有近期活動。

檢視全部