Solon v3.3.0

mcp - 支持的三种内容服务

</> markdown

MCP 协议,包括上面讲到的 Tool 服务外,共支持三种内容服务。

内容描述备注
Tool工具一般由模型控制使用
Prompt提示语一般由用户控制使用
Resouce资源(支持,路径变量)一般由应用控制使用

Mcp Resouce 会有两种概念或形态(在 solon-ai-mcp 里,开发方式是相同的):

  • 资源(Resouce),即资源路径是静态的
  • 资源模板(ResouceTemplate),即资源路径里有变量

1、完整的 Mcp Server 展示(使用注解模式)

@McpServerEndpoint(sseEndpoint = "/mcp/sse")
public class McpServerTool {

    @ToolMapping(description = "查询天气预报")
    public String getWeather(@Param(description = "城市位置") String location, Context ctx) {
        System.out.println("------------: sessionId: " + ctx.sessionId());

        //ctx.realIp(); //ctx 可用于小范围鉴权

        return "晴,14度";
    }

    @ResourceMapping(uri = "config://app-version", description = "获取应用版本号", mimeType = "text/config")
    public String getAppVersion() {
        return "v3.2.0";
    }
    
    @Produces("text/config") //(@Produces 注解申明 mimeType,v3.3.1 后支持)
    @ResourceMapping(uri = "config://app-version", description = "获取应用版本号")
    public String getAppVersion2() {
        return "v3.2.0";
    }
    
    //资源模板(v3.3.1 后支持)
    @ResourceMapping(uri = "db://users/{user_id}/email", description = "根据用户ID查询邮箱")
    public String getEmail(@Param(description = "用户Id") String user_id) {
        return user_id + "@example.com";
    }

    @PromptMapping(description = "生成关于某个主题的提问")
    public Collection<ChatMessage> askQuestion(@Param(description = "主题") String topic) {
        return Arrays.asList(
                ChatMessage.ofUser("请解释一下'" + topic + "'的概念?")
        );
    }
}

没有 @Param 注解的参数,不会转给大模型处理。

2、客户端对应的接口示意

McpClientProvider::callToolAsText(name, args)
McpClientProvider::getTools()

McpClientProvider::readResourceAsText(uri)
McpClientProvider::getResources()
McpClientProvider::getResourceTemplates()  //v3.3.1 后支持

McpClientProvider::getPromptAsMessages(name, args)
McpClientProvider::getPrompts()

具体,参考后面的资料