@@ -18,6 +18,7 @@ const (
1818
1919type MCPClient interface {
2020 InspectTools () ([]map [string ]any , error )
21+ CallToolText (toolName string , args map [string ]any ) (string , error )
2122}
2223
2324func NewMCPClient (clientType string , baseURL string , logger * logrus.Logger ) (MCPClient , error ) {
@@ -49,7 +50,7 @@ type httpMCPClient struct {
4950 logger * logrus.Logger
5051}
5152
52- func (c * httpMCPClient ) InspectTools () ([] map [ string ] any , error ) {
53+ func (c * httpMCPClient ) connect () (* mcp. ClientSession , error ) {
5354 url := c .baseURL
5455 ctx := context .Background ()
5556
@@ -63,17 +64,26 @@ func (c *httpMCPClient) InspectTools() ([]map[string]any, error) {
6364 }, nil )
6465
6566 // Connect to the server.
66- session , err := client .Connect (ctx , & mcp.StreamableClientTransport {Endpoint : url }, nil )
67+ return client .Connect (ctx , & mcp.StreamableClientTransport {Endpoint : url }, nil )
68+ }
69+
70+ func (c * httpMCPClient ) connectOrDie () * mcp.ClientSession {
71+ session , err := c .connect ()
6772 if err != nil {
6873 c .logger .Fatalf ("Failed to connect: %v" , err )
6974 }
75+ return session
76+ }
77+
78+ func (c * httpMCPClient ) InspectTools () ([]map [string ]any , error ) {
79+ session := c .connectOrDie ()
7080 defer session .Close ()
7181
7282 c .logger .Infof ("Connected to server (session ID: %s)" , session .ID ())
7383
7484 // First, list available tools.
7585 c .logger .Infof ("Listing available tools..." )
76- toolsResult , err := session .ListTools (ctx , nil )
86+ toolsResult , err := session .ListTools (context . Background () , nil )
7787 if err != nil {
7888 c .logger .Fatalf ("Failed to list tools: %v" , err )
7989 }
@@ -87,33 +97,42 @@ func (c *httpMCPClient) InspectTools() ([]map[string]any, error) {
8797 rv = append (rv , toolInfo )
8898 }
8999
90- // Call the cityTime tool for each city.
91- cities := []string {"nyc" , "sf" , "boston" }
92-
93- c .logger .Println ("Getting time for each city..." )
94- for _ , city := range cities {
95- // Call the tool.
96- result , resultErr := session .CallTool (ctx , & mcp.CallToolParams {
97- Name : "cityTime" ,
98- Arguments : map [string ]any {
99- "city" : city ,
100- },
101- })
102- if resultErr != nil {
103- c .logger .Infof ("Failed to get time for %s: %v\n " , city , resultErr )
104- continue
105- }
100+ c .logger .Infof ("Client completed successfully" )
101+ return rv , nil
102+ }
106103
107- // Print the result.
108- for _ , content := range result .Content {
109- if textContent , ok := content .(* mcp.TextContent ); ok {
110- c .logger .Infof (" %s" , textContent .Text )
111- }
112- }
104+ func (c * httpMCPClient ) callTool (toolName string , args map [string ]any ) (* mcp.CallToolResult , error ) {
105+ session := c .connectOrDie ()
106+ defer session .Close ()
107+
108+ c .logger .Infof ("Connected to server (session ID: %s)" , session .ID ())
109+
110+ c .logger .Infof ("Calling tool %s..." , toolName )
111+ result , err := session .CallTool (context .Background (), & mcp.CallToolParams {
112+ Name : toolName ,
113+ Arguments : args ,
114+ })
115+ if err != nil {
116+ c .logger .Errorf ("Failed to call tool %s: %v\n " , toolName , err )
117+ return result , err
113118 }
114119
115120 c .logger .Infof ("Client completed successfully" )
116- return rv , nil
121+ return result , nil
122+ }
123+
124+ func (c * httpMCPClient ) CallToolText (toolName string , args map [string ]any ) (string , error ) {
125+ toolCall , toolCallErr := c .callTool (toolName , args )
126+ if toolCallErr != nil {
127+ return "" , toolCallErr
128+ }
129+ var result string
130+ for _ , content := range toolCall .Content {
131+ if textContent , ok := content .(* mcp.TextContent ); ok {
132+ result += textContent .Text + "\n "
133+ }
134+ }
135+ return result , nil
117136}
118137
119138type stdioMCPClient struct {
@@ -134,3 +153,8 @@ func (c *stdioMCPClient) InspectTools() ([]map[string]any, error) {
134153 c .logger .Infof ("stdio MCP client not implemented yet" )
135154 return nil , nil
136155}
156+
157+ func (c * stdioMCPClient ) CallToolText (toolName string , args map [string ]any ) (string , error ) {
158+ c .logger .Infof ("stdio MCP client not implemented yet" )
159+ return "" , nil
160+ }
0 commit comments