-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclient.go
93 lines (77 loc) · 2.66 KB
/
client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package mcp
import (
"context"
"errors"
"fmt"
"log/slog"
"github.com/agent-api/jsonrpc2"
)
type Client struct {
// conn is a JSON RPC 2.0 connection
conn *jsonrpc2.Conn
supportedVersions []string
serverVersion string
serverCapabilities *ServerCapabilities
serverInfo *ServerInfo
initialized bool
// logger is a slog logger
logger *slog.Logger
}
type ClientOpts struct {
Conn *jsonrpc2.Conn
SupportedVersions []string
Logger *slog.Logger
}
func NewClient(opts *ClientOpts) *Client {
return &Client{
conn: opts.Conn,
supportedVersions: opts.SupportedVersions,
logger: opts.Logger,
}
}
func (c *Client) Initialize(ctx context.Context, clientInfo ClientInfo, clientCapabilities ClientCapabilities) error {
c.logger.Debug("client checking if already initialized")
if c.initialized {
return errors.New("already initialized")
}
c.logger.Debug("client checking if supported versions provided")
if len(c.supportedVersions) == 0 {
return errors.New("no supported protocol versions")
}
params := InitializeParams{
ProtocolVersion: c.supportedVersions[0],
Capabilities: clientCapabilities,
ClientInfo: clientInfo,
}
c.logger.Debug("using mcp protocol version", "protocol version", params.ProtocolVersion)
c.logger.Debug("using capabilities", "capabilities", params.Capabilities)
c.logger.Debug("using client info", "client info", params.ClientInfo)
c.logger.Debug("client calling server initialization method")
var result InitializeResult
if err := c.conn.Call(ctx, "initialize", params, &result); err != nil {
return fmt.Errorf("initialize request failed: %w", err)
}
supported := false
for _, v := range c.supportedVersions {
c.logger.Debug("client comparing server supported versions", "client version", v, "server version", result.ProtocolVersion)
if v == result.ProtocolVersion {
supported = true
break
}
}
if !supported {
return fmt.Errorf("unsupported server protocol version: %s", result.ProtocolVersion)
}
c.serverVersion = result.ProtocolVersion
c.logger.Debug("client set server mcp version", "server version", c.serverVersion)
c.serverCapabilities = result.Capabilities
c.logger.Debug("client set server mcp capabilities", "server capabilities", c.serverCapabilities)
c.serverInfo = result.ServerInfo
c.logger.Debug("client set server mcp server info", "server info", c.serverInfo)
c.logger.Debug("client notifying server initialization complete")
if err := c.conn.Notify(ctx, "notifications/initialized", nil); err != nil {
return fmt.Errorf("failed to send initialized notification: %w", err)
}
c.initialized = true
return nil
}