MCP 协议，包括上面讲到的 Tool 服务外，共支持三种原语（即，内容类型）。


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

Mcp Resouce 会有两种概念或形态（在 solon-ai-mcp 里，开发方式是相同的）：

* 资源（Resouce），即资源路径是静态的
* 资源模板（ResouceTemplate），即资源路径里有变量

### 1、完整的 Mcp Server 展示（使用注解模式）



```java
import org.noear.solon.ai.annotation.PromptMapping;
import org.noear.solon.ai.annotation.ResourceMapping;
import org.noear.solon.ai.annotation.ToolMapping;
import org.noear.solon.ai.chat.message.ChatMessage;
import org.noear.solon.ai.mcp.server.annotation.McpServerEndpoint;
import org.noear.solon.annotation.Param;
import org.noear.solon.core.handle.Context;

import java.util.Arrays;
import java.util.Collection;

@McpServerEndpoint(channel = McpChannel.STREAMABLE, mcpEndpoint = "/mcp")
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";
    }

    //资源模板（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、客户端对应的接口示意

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

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

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

具体，参考后面的资料