-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathrpcRespInitialize.go
150 lines (130 loc) · 4.35 KB
/
rpcRespInitialize.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package mcp
import (
"github.com/llmcontext/gomcp/jsonrpc"
"github.com/llmcontext/gomcp/protocol"
)
type JsonRpcResponseInitializeResult struct {
ProtocolVersion string `json:"protocolVersion"`
Capabilities ServerCapabilities `json:"capabilities"`
ServerInfo ServerInfo `json:"serverInfo"`
Instructions *string `json:"instructions"`
}
type ServerInfo struct {
Name string `json:"name"`
Version string `json:"version"`
Instructions *string `json:"instructions,omitempty"`
}
type ServerCapabilities struct {
Tools *ServerCapabilitiesTools `json:"tools,omitempty"`
Prompts *ServerCapabilitiesPrompts `json:"prompts,omitempty"`
Logging *ServerCapabilitiesLogging `json:"logging,omitempty"`
Resources *ServerCapabilitiesResources `json:"resources,omitempty"`
}
type ServerCapabilitiesTools struct {
ListChanged *bool `json:"listChanged,omitempty"`
}
type ServerCapabilitiesPrompts struct {
ListChanged *bool `json:"listChanged,omitempty"`
}
type ServerCapabilitiesLogging struct {
}
type ServerCapabilitiesResources struct {
ListChanged *bool `json:"listChanged,omitempty"`
Subscribe *bool `json:"subscribe,omitempty"`
}
func ParseJsonRpcResponseInitialize(response *jsonrpc.JsonRpcResponse) (*JsonRpcResponseInitializeResult, error) {
resp := JsonRpcResponseInitializeResult{}
// parse params
result, err := protocol.CheckIsObject(response.Result, "result")
if err != nil {
return nil, err
}
// read protocol version
protocolVersion, err := protocol.GetStringField(result, "protocolVersion")
if err != nil {
return nil, err
}
resp.ProtocolVersion = protocolVersion
// read server info
serverInfo, err := protocol.GetObjectField(result, "serverInfo")
if err != nil {
return nil, err
}
// read name
name, err := protocol.GetStringField(serverInfo, "name")
if err != nil {
return nil, err
}
resp.ServerInfo.Name = name
// read version
version, err := protocol.GetStringField(serverInfo, "version")
if err != nil {
return nil, err
}
resp.ServerInfo.Version = version
// read instructions are present
instructions := protocol.GetOptionalStringField(serverInfo, "instructions")
if instructions != nil {
resp.Instructions = instructions
} else {
resp.Instructions = nil
}
// read capabilities
capabilities, err := protocol.CheckIsObject(result, "capabilities")
if err != nil {
return nil, err
}
// check if logging capability is present
if _, ok := capabilities["logging"]; ok {
resp.Capabilities.Logging = &ServerCapabilitiesLogging{}
}
// check if resources capability is present
capabilitiesResources := protocol.GetOptionalObjectField(capabilities, "resources")
if capabilitiesResources != nil {
resp.Capabilities.Resources = &ServerCapabilitiesResources{}
// check if listChanged is present
listChanged := protocol.GetOptionalBoolField(capabilitiesResources, "listChanged")
if listChanged != nil {
resp.Capabilities.Resources.ListChanged = listChanged
}
// check if subscribe is present
subscribe := protocol.GetOptionalBoolField(capabilitiesResources, "subscribe")
if subscribe != nil {
resp.Capabilities.Resources.Subscribe = subscribe
}
} else {
resp.Capabilities.Resources = nil
}
// check if tools capability is present
capabilitiesTools := protocol.GetOptionalObjectField(capabilities, "tools")
if capabilitiesTools != nil {
resp.Capabilities.Tools = &ServerCapabilitiesTools{}
// check if listChanged is present
listChanged := protocol.GetOptionalBoolField(capabilitiesTools, "listChanged")
if listChanged != nil {
resp.Capabilities.Tools.ListChanged = listChanged
}
} else {
resp.Capabilities.Tools = nil
}
// check if prompts capability is present
capabilitiesPrompts := protocol.GetOptionalObjectField(capabilities, "prompts")
if capabilitiesPrompts != nil {
resp.Capabilities.Prompts = &ServerCapabilitiesPrompts{}
// check if listChanged is present
listChanged := protocol.GetOptionalBoolField(capabilitiesPrompts, "listChanged")
if listChanged != nil {
resp.Capabilities.Prompts.ListChanged = listChanged
}
} else {
resp.Capabilities.Prompts = nil
}
// check if logging capability is present
logging := protocol.GetOptionalObjectField(capabilities, "logging")
if logging != nil {
resp.Capabilities.Logging = &ServerCapabilitiesLogging{}
} else {
resp.Capabilities.Logging = nil
}
return &resp, nil
}