AI项目博客
记录 AI 工程实践与大模型应用

Spring AI Alibaba 84|Graph Core · 分配 MCP 工具给指定节点 · config

分配指定的 MCP 给指定的 node 节点

实战代码可见:spring-ai-alibaba-examples 下的 graph 目录,本章代码为其 mcp-node 模块

<dependencies>

    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-autoconfigure-model-openai</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-autoconfigure-model-chat-client</artifactId>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>
        <artifactId>spring-ai-alibaba-graph-core</artifactId>
        <version>${spring-ai-alibaba.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

注意 spring.ai.graph.nodes 下的配置,node 配置对应 mcp 服务的映射

server:
  port: 8080
spring:
  application:
    name: mcp-node
  ai:
    openai:
      api-key: ${AIDASHSCOPEAPIKEY}
      base-url: https://dashscope.aliyuncs.com/compatible-mode
      chat:
        options:
          model: qwen-max
    mcp:
      client:
        enabled: true
        name: my-mcp-client
        version: 1.0.0
        request-timeout: 30s
        type: ASYNC  # or ASYNC for reactive applications
        sse:
          connections:
            server1:
              url: http://localhost:19000

    graph:
      nodes:
        node2servers:
          mcp-node:
            - server1

McpNodeProperties

node 配置对应 mcp 服务的映射类

package com.spring.ai.tutorial.graph.mcp.config;

import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.Map;
import java.util.Set;

@ConfigurationProperties(prefix = McpNodeProperties.PREFIX)
public class McpNodeProperties {

  public static final String PREFIX = "spring.ai.graph.nodes";

  private Map<String, Set<String>> node2servers;

  public Map<String, Set<String>> getNode2servers() {
      return node2servers;
  }

  public void setNode2servers(Map<String, Set<String>> node2servers) {
      this.node2servers = node2servers;
  }
}

McpGaphConfiguration

注入 McpClientToolCallbackProvider,提供给 McpNode

package com.spring.ai.tutorial.graph.mcp.config;

import com.alibaba.cloud.ai.graph.GraphRepresentation;
import com.alibaba.cloud.ai.graph.KeyStrategy;
import com.alibaba.cloud.ai.graph.KeyStrategyFactory;
import com.alibaba.cloud.ai.graph.StateGraph;
import com.alibaba.cloud.ai.graph.exception.GraphStateException;
import com.alibaba.cloud.ai.graph.state.strategy.ReplaceStrategy;
import com.spring.ai.tutorial.graph.mcp.node.McpNode;
import com.spring.ai.tutorial.graph.mcp.tool.McpClientToolCallbackProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

import static com.alibaba.cloud.ai.graph.action.AsyncNodeAction.nodeasync;

@Configuration
@EnableConfigurationProperties({ McpNodeProperties.class })
public class McpGaphConfiguration {

  private static final Logger logger = LoggerFactory.getLogger(McpGaphConfiguration.class);

  @Autowired
  private McpClientToolCallbackProvider mcpClientToolCallbackProvider;

  @Bean
  public StateGraph mcpGraph(ChatClient.Builder chatClientBuilder) throws GraphStateException {
      KeyStrategyFactory keyStrategyFactory = () -> {
          HashMap<String, KeyStrategy> keyStrategyHashMap = new HashMap<>();

          // 用户输入
          keyStrategyHashMap.put("query", new ReplaceStrategy());
          keyStrategyHashMap.put("mcpcontent", new ReplaceStrategy());
          return keyStrategyHashMap;
      };

      StateGraph stateGraph = new StateGraph(keyStrategyFactory)
              .addNode("mcp", nodeasync(new McpNode(chatClientBuilder, mcpClientToolCallbackProvider)))

              .addEdge(StateGraph.START, "mcp")
              .addEdge("mcp", StateGraph.END);

      // 添加 PlantUML 打印
      GraphRepresentation representation = stateGraph.getGraph(GraphRepresentation.Type.PLANTUML,
              "mcp flow");
      logger.info("
=== mcp UML Flow ===");
      logger.info(representation.content());
      logger.info("==================================
");

      return stateGraph;
  }
}

本文整理自 Spring AI Alibaba 官方文档《分配 MCP 工具给指定节点》:https://java2ai.com/docs/frameworks/graph-core/examples/mcp-node

赞(0)
未经允许不得转载:AI项目博客 » Spring AI Alibaba 84|Graph Core · 分配 MCP 工具给指定节点 · config

评论 抢沙发

AI项目博客

专注 AI 工程化落地 —— 覆盖智能体、大模型、Java AI 与 Python 的学习笔记,以及 AI 平台的项目实战记录。

关于本站文章归档

登录

找回密码

注册