mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-21 17:38:10 +00:00
- OVERVIEW.md: 非技术用户友好的项目介绍和目标 - PLUGIN_DEV.md: 完整插件开发指南(含三种开发方式、API 参考、最佳实践) - internal/plugins/mcp/: MCP 协议适配器插件(JSON-RPC over stdio/SSE) - client.go: MCP 客户端(ListTools / CallTool) - stdio.go: 子进程 stdin/stdout 传输 - sse.go: HTTP POST 传输 - plugin.go: init() 自注册 + Settings 配置读取 - README.md 更新链接
62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
package mcp
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
)
|
|
|
|
// SSETransport 通过 HTTP POST 进行 JSON-RPC 通信(简化版,非流式)
|
|
type SSETransport struct {
|
|
url string
|
|
client *http.Client
|
|
pending map[int]chan *rpcResponse
|
|
done chan struct{}
|
|
}
|
|
|
|
func NewSSETransport(url string) *SSETransport {
|
|
return &SSETransport{
|
|
url: url,
|
|
client: &http.Client{},
|
|
pending: make(map[int]chan *rpcResponse),
|
|
done: make(chan struct{}),
|
|
}
|
|
}
|
|
func (t *SSETransport) Send(req *rpcRequest) (*rpcResponse, error) {
|
|
data, err := json.Marshal(req)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("marshal: %w", err)
|
|
}
|
|
|
|
httpReq, err := http.NewRequest("POST", t.url, bytes.NewReader(data))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("http request: %w", err)
|
|
}
|
|
httpReq.Header.Set("Content-Type", "application/json")
|
|
|
|
resp, err := t.client.Do(httpReq)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("http post: %w", err)
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("read body: %w", err)
|
|
}
|
|
|
|
var rpcResp rpcResponse
|
|
if err := json.Unmarshal(body, &rpcResp); err != nil {
|
|
return nil, fmt.Errorf("unmarshal response: %w", err)
|
|
}
|
|
|
|
return &rpcResp, nil
|
|
}
|
|
|
|
func (t *SSETransport) Close() error {
|
|
close(t.done)
|
|
return nil
|
|
}
|