forked from DevOps/deploy.stack
feat: 添加MCP时间服务器及相关工具
实现一个基于Golang的MCP时间服务器,提供获取当前时间和日期功能 包含客户端示例、安装脚本和详细文档 refactor: 优化磁盘巡检脚本以支持SAS和SSD硬盘 增强磁盘巡检脚本的兼容性,改进SMART信息解析逻辑 添加硬盘类型检测和更全面的错误处理 docs: 更新README和安装说明 添加MCP时间服务器的使用文档和API说明 完善磁盘巡检报告格式和内容
This commit is contained in:
190
mcpTimeServer/mcp_client_example.go
Normal file
190
mcpTimeServer/mcp_client_example.go
Normal file
@@ -0,0 +1,190 @@
|
||||
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来接收实时时间更新")
|
||||
}
|
||||
Reference in New Issue
Block a user