CallTool proxies a tool call to the appropriate MCP server.
(ctx context.Context, req workspacesdk.CallMCPToolRequest)
| 738 | |
| 739 | // CallTool proxies a tool call to the appropriate MCP server. |
| 740 | func (m *Manager) CallTool(ctx context.Context, req workspacesdk.CallMCPToolRequest) (workspacesdk.CallMCPToolResponse, error) { |
| 741 | serverName, originalName, err := splitToolName(req.ToolName) |
| 742 | if err != nil { |
| 743 | return workspacesdk.CallMCPToolResponse{}, err |
| 744 | } |
| 745 | |
| 746 | m.mu.RLock() |
| 747 | entry, ok := m.servers[serverName] |
| 748 | m.mu.RUnlock() |
| 749 | |
| 750 | if !ok { |
| 751 | return workspacesdk.CallMCPToolResponse{}, xerrors.Errorf("%w: %q", ErrUnknownServer, serverName) |
| 752 | } |
| 753 | |
| 754 | callCtx, cancel := context.WithTimeout(ctx, toolCallTimeout) |
| 755 | defer cancel() |
| 756 | |
| 757 | result, err := entry.client.CallTool(callCtx, mcp.CallToolRequest{ |
| 758 | Params: mcp.CallToolParams{ |
| 759 | Name: originalName, |
| 760 | Arguments: req.Arguments, |
| 761 | }, |
| 762 | }) |
| 763 | if err != nil { |
| 764 | return workspacesdk.CallMCPToolResponse{}, xerrors.Errorf("call tool %q on %q: %w", originalName, serverName, err) |
| 765 | } |
| 766 | |
| 767 | return convertResult(result), nil |
| 768 | } |
| 769 | |
| 770 | // RefreshTools re-fetches tool lists from all connected servers |
| 771 | // in parallel and rebuilds the cache. On partial failure, tools |