feat: centrally mount and dispatch agent MCP services

This commit is contained in:
kyaring
2026-09-30 13:17:19 +08:00
committed by kory
parent 37243e26c0
commit 07f7db6031
14 changed files with 1097 additions and 8 deletions
+35
View File
@@ -188,3 +188,38 @@ func (b *MCPBackend) WriteFile(ctx context.Context, clientIP, device, path, cont
Bytes: n,
}, nil
}
func (b *MCPBackend) ListAgentMCP(ctx context.Context, device string) (any, error) {
if device == "" {
return nil, errors.New("device required")
}
if b.server.isRemote(device) && (b.server.Cluster == nil || !b.server.Cluster.Online(device)) {
return nil, fmt.Errorf("device %s is offline", device)
}
if !b.server.isRemote(device) {
return map[string]any{"device": b.server.LocalName, "services": []any{}}, nil
}
return b.server.Cluster.ListMCP(device)
}
func (b *MCPBackend) CallAgentMCP(ctx context.Context, clientIP, device, server, tool string, args any) (any, error) {
if device == "" || server == "" || tool == "" {
return nil, errors.New("device, server and tool required")
}
if b.server.isRemote(device) && (b.server.Cluster == nil || !b.server.Cluster.Online(device)) {
return nil, fmt.Errorf("device %s is offline", device)
}
if !b.server.isRemote(device) {
return nil, errors.New("agent MCP requires a remote device")
}
start := time.Now()
v, err := b.server.Cluster.CallMCP(ctx, device, server, tool, args)
ms := time.Since(start).Milliseconds()
if b.server.Store != nil {
if err != nil {
_ = b.server.Store.Audit(clientIP, device, "mcp_call", server+"/"+tool, 1, ms, err.Error())
} else {
_ = b.server.Store.Audit(clientIP, device, "mcp_call", server+"/"+tool, 0, ms, "")
}
}
return v, err
}