tools.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package mcpservers
  2. import (
  3. "context"
  4. "errors"
  5. "github.com/bytedance/sonic"
  6. "github.com/mark3labs/mcp-go/mcp"
  7. )
  8. func ListServerTools(ctx context.Context, server Server) ([]mcp.Tool, error) {
  9. requestBytes, err := sonic.Marshal(mcp.JSONRPCRequest{
  10. JSONRPC: mcp.JSONRPC_VERSION,
  11. ID: mcp.NewRequestId(1),
  12. Request: mcp.Request{
  13. Method: string(mcp.MethodToolsList),
  14. Params: mcp.RequestParams{},
  15. },
  16. })
  17. if err != nil {
  18. return nil, err
  19. }
  20. response := server.HandleMessage(ctx, requestBytes)
  21. if response == nil {
  22. return nil, errors.New("no response from server")
  23. }
  24. responseBytes, err := sonic.Marshal(response)
  25. if err != nil {
  26. return nil, err
  27. }
  28. var jsonRPCResponse struct {
  29. Result *mcp.ListToolsResult `json:"result"`
  30. Error *struct {
  31. Code int `json:"code"`
  32. Message string `json:"message"`
  33. } `json:"error"`
  34. }
  35. if err := sonic.Unmarshal(responseBytes, &jsonRPCResponse); err != nil {
  36. return nil, err
  37. }
  38. if jsonRPCResponse.Error != nil {
  39. return nil, errors.New(jsonRPCResponse.Error.Message)
  40. }
  41. if jsonRPCResponse.Result == nil {
  42. return nil, nil
  43. }
  44. return jsonRPCResponse.Result.Tools, nil
  45. }