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

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

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

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

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

理解模型上下文協議

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

模型上下文協議 (MCP) 是一個標準化介面,它允許 AI 應用程式和代理: 訪問外部工具檢索資源使用提示模板

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 模式
  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 實現的一個關鍵洞察是

提示:客戶端實現依賴於 ToolCallbackProvider#getToolCallbacks 對於 MCP 的實現總是從伺服器檢索當前 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 社群所有即將舉行的活動。

檢視所有