Files
deploy.stack/mcpTimeServer/mcp_client_example.go
cnphpbb 648faac289 feat: 添加MCP时间服务器及相关工具
实现一个基于Golang的MCP时间服务器,提供获取当前时间和日期功能
包含客户端示例、安装脚本和详细文档

refactor: 优化磁盘巡检脚本以支持SAS和SSD硬盘

增强磁盘巡检脚本的兼容性,改进SMART信息解析逻辑
添加硬盘类型检测和更全面的错误处理

docs: 更新README和安装说明

添加MCP时间服务器的使用文档和API说明
完善磁盘巡检报告格式和内容
2025-09-12 13:45:08 +08:00

190 lines
4.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
)
// 这里使用通用的map类型表示请求和响应避免与main.go中的结构体冲突
func main() {
// 服务器地址
serverURL := "http://localhost:8080"
// 1. 测试健康检查
testHealthCheck(serverURL)
// 2. 测试获取当前时间(默认格式)
testGetCurrentTime(serverURL, "")
// 3. 测试获取当前时间(自定义格式)
testGetCurrentTime(serverURL, "2006-01-02 15:04:05")
// 4. 测试订阅时间流
testSubscribeTimeStream(serverURL)
}
// 测试健康检查
func testHealthCheck(serverURL string) {
url := fmt.Sprintf("%s/health", serverURL)
resp, err := http.Get(url)
if err != nil {
fmt.Printf("健康检查请求失败: %v\n", err)
return
}
defer resp.Body.Close()
if resp.StatusCode == http.StatusOK {
fmt.Println("✅ 健康检查成功: 服务器正常运行")
} else {
fmt.Printf("❌ 健康检查失败: 状态码 %d\n", resp.StatusCode)
}
}
// 测试获取当前时间
func testGetCurrentTime(serverURL string, format string) {
url := fmt.Sprintf("%s/mcp/v1/submit", serverURL)
// 构建请求体
requestBody := map[string]interface{}{
"data": map[string]interface{}{},
"type": "get_current_time",
"timestamp": time.Now().Unix(),
}
// 添加格式参数(如果提供)
if format != "" {
data := requestBody["data"].(map[string]interface{})
data["format"] = format
}
// 序列化请求体
jsonData, err := json.Marshal(requestBody)
if err != nil {
fmt.Printf("序列化请求体失败: %v\n", err)
return
}
// 发送POST请求
resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
if err != nil {
fmt.Printf("发送请求失败: %v\n", err)
return
}
defer resp.Body.Close()
// 读取响应
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("读取响应失败: %v\n", err)
return
}
// 解析响应为map
var response map[string]interface{}
if err := json.Unmarshal(body, &response); err != nil {
fmt.Printf("解析响应失败: %v\n", err)
return
}
// 检查响应状态
success, ok := response["success"].(bool)
if !ok || !success {
message := "未知错误"
if msg, ok := response["message"].(string); ok {
message = msg
}
fmt.Printf("❌ 获取当前时间失败: %s\n", message)
return
}
// 提取数据
data, ok := response["data"].(map[string]interface{})
if !ok {
fmt.Println("❌ 响应数据格式错误")
return
}
// 获取时间信息
currentTime, _ := data["current_time"].(string)
timestamp, _ := data["timestamp"].(float64)
fmt.Printf("✅ 获取当前时间成功 (格式: %s):\n", format)
fmt.Printf(" 时间: %s\n", currentTime)
fmt.Printf(" 时间戳: %.0f\n", timestamp)
}
// 测试订阅时间流
func testSubscribeTimeStream(serverURL string) {
url := fmt.Sprintf("%s/mcp/v1/submit", serverURL)
// 构建请求体
requestBody := map[string]interface{}{
"data": map[string]interface{}{
"interval": 2, // 每2秒更新一次
"format": "2006-01-02 15:04:05",
},
"type": "subscribe_time_stream",
"timestamp": time.Now().Unix(),
}
// 序列化请求体
jsonData, err := json.Marshal(requestBody)
if err != nil {
fmt.Printf("序列化请求体失败: %v\n", err)
return
}
// 发送POST请求
resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
if err != nil {
fmt.Printf("发送请求失败: %v\n", err)
return
}
defer resp.Body.Close()
// 读取响应
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("读取响应失败: %v\n", err)
return
}
// 解析响应为map
var response map[string]interface{}
if err := json.Unmarshal(body, &response); err != nil {
fmt.Printf("解析响应失败: %v\n", err)
return
}
// 检查响应状态
success, ok := response["success"].(bool)
if !ok || !success {
message := "未知错误"
if msg, ok := response["message"].(string); ok {
message = msg
}
fmt.Printf("❌ 订阅时间流失败: %s\n", message)
return
}
// 提取数据
data, ok := response["data"].(map[string]interface{})
if !ok {
fmt.Println("❌ 响应数据格式错误")
return
}
// 获取流信息
streamID, _ := data["stream_id"].(string)
sseURL, _ := data["sse_url"].(string)
interval, _ := data["interval"].(float64)
fmt.Printf("✅ 订阅时间流成功:\n")
fmt.Printf(" 流ID: %s\n", streamID)
fmt.Printf(" SSE URL: %s\n", sseURL)
fmt.Printf(" 更新间隔: %.0f秒\n", interval)
fmt.Println(" 提示: 可以使用curl或浏览器访问SSE URL来接收实时时间更新")
}