@@ -165,6 +165,194 @@ test("should reject unsupported protocol version", async () => {
165165 expect ( clientTransport . close ) . toHaveBeenCalled ( ) ;
166166} ) ;
167167
168+ test ( "should connect new client to old, supported server version" , async ( ) => {
169+ const OLD_VERSION = SUPPORTED_PROTOCOL_VERSIONS [ 1 ] ;
170+ const server = new Server (
171+ {
172+ name : "test server" ,
173+ version : "1.0" ,
174+ } ,
175+ {
176+ capabilities : {
177+ resources : { } ,
178+ tools : { } ,
179+ } ,
180+ } ,
181+ ) ;
182+
183+ server . setRequestHandler ( InitializeRequestSchema , ( _request ) => ( {
184+ protocolVersion : OLD_VERSION ,
185+ capabilities : {
186+ resources : { } ,
187+ tools : { } ,
188+ } ,
189+ serverInfo : {
190+ name : "old server" ,
191+ version : "1.0" ,
192+ } ,
193+ } ) ) ;
194+
195+ server . setRequestHandler ( ListResourcesRequestSchema , ( ) => ( {
196+ resources : [ ] ,
197+ } ) ) ;
198+
199+ server . setRequestHandler ( ListToolsRequestSchema , ( ) => ( {
200+ tools : [ ] ,
201+ } ) ) ;
202+
203+ const [ clientTransport , serverTransport ] =
204+ InMemoryTransport . createLinkedPair ( ) ;
205+
206+ const client = new Client (
207+ {
208+ name : "new client" ,
209+ version : "1.0" ,
210+ protocolVersion : LATEST_PROTOCOL_VERSION ,
211+ } ,
212+ {
213+ capabilities : {
214+ sampling : { } ,
215+ } ,
216+ enforceStrictCapabilities : true ,
217+ } ,
218+ ) ;
219+
220+ await Promise . all ( [
221+ client . connect ( clientTransport ) ,
222+ server . connect ( serverTransport ) ,
223+ ] ) ;
224+
225+ expect ( client . getServerVersion ( ) ) . toEqual ( {
226+ name : "old server" ,
227+ version : "1.0" ,
228+ } ) ;
229+ } ) ;
230+
231+ test ( "should negotiate version when client is old, and newer server supports its version" , async ( ) => {
232+ const OLD_VERSION = SUPPORTED_PROTOCOL_VERSIONS [ 1 ] ;
233+ const server = new Server (
234+ {
235+ name : "new server" ,
236+ version : "1.0" ,
237+ } ,
238+ {
239+ capabilities : {
240+ resources : { } ,
241+ tools : { } ,
242+ } ,
243+ } ,
244+ ) ;
245+
246+ server . setRequestHandler ( InitializeRequestSchema , ( _request ) => ( {
247+ protocolVersion : LATEST_PROTOCOL_VERSION ,
248+ capabilities : {
249+ resources : { } ,
250+ tools : { } ,
251+ } ,
252+ serverInfo : {
253+ name : "new server" ,
254+ version : "1.0" ,
255+ } ,
256+ } ) ) ;
257+
258+ server . setRequestHandler ( ListResourcesRequestSchema , ( ) => ( {
259+ resources : [ ] ,
260+ } ) ) ;
261+
262+ server . setRequestHandler ( ListToolsRequestSchema , ( ) => ( {
263+ tools : [ ] ,
264+ } ) ) ;
265+
266+ const [ clientTransport , serverTransport ] =
267+ InMemoryTransport . createLinkedPair ( ) ;
268+
269+ const client = new Client (
270+ {
271+ name : "old client" ,
272+ version : "1.0" ,
273+ protocolVersion : OLD_VERSION ,
274+ } ,
275+ {
276+ capabilities : {
277+ sampling : { } ,
278+ } ,
279+ enforceStrictCapabilities : true ,
280+ } ,
281+ ) ;
282+
283+ await Promise . all ( [
284+ client . connect ( clientTransport ) ,
285+ server . connect ( serverTransport ) ,
286+ ] ) ;
287+
288+ expect ( client . getServerVersion ( ) ) . toEqual ( {
289+ name : "new server" ,
290+ version : "1.0" ,
291+ } ) ;
292+ } ) ;
293+
294+ test ( "should throw when client is old, and server doesn't support its version" , async ( ) => {
295+ const OLD_VERSION = SUPPORTED_PROTOCOL_VERSIONS [ 1 ] ;
296+ const FUTURE_VERSION = "FUTURE_VERSION" ;
297+ const server = new Server (
298+ {
299+ name : "new server" ,
300+ version : "1.0" ,
301+ } ,
302+ {
303+ capabilities : {
304+ resources : { } ,
305+ tools : { } ,
306+ } ,
307+ } ,
308+ ) ;
309+
310+ server . setRequestHandler ( InitializeRequestSchema , ( _request ) => ( {
311+ protocolVersion : FUTURE_VERSION ,
312+ capabilities : {
313+ resources : { } ,
314+ tools : { } ,
315+ } ,
316+ serverInfo : {
317+ name : "new server" ,
318+ version : "1.0" ,
319+ } ,
320+ } ) ) ;
321+
322+ server . setRequestHandler ( ListResourcesRequestSchema , ( ) => ( {
323+ resources : [ ] ,
324+ } ) ) ;
325+
326+ server . setRequestHandler ( ListToolsRequestSchema , ( ) => ( {
327+ tools : [ ] ,
328+ } ) ) ;
329+
330+ const [ clientTransport , serverTransport ] =
331+ InMemoryTransport . createLinkedPair ( ) ;
332+
333+ const client = new Client (
334+ {
335+ name : "old client" ,
336+ version : "1.0" ,
337+ protocolVersion : OLD_VERSION ,
338+ } ,
339+ {
340+ capabilities : {
341+ sampling : { } ,
342+ } ,
343+ enforceStrictCapabilities : true ,
344+ } ,
345+ ) ;
346+
347+ await Promise . all ( [
348+ expect ( client . connect ( clientTransport ) ) . rejects . toThrow (
349+ "Server's protocol version is not supported: FUTURE_VERSION"
350+ ) ,
351+ server . connect ( serverTransport ) ,
352+ ] ) ;
353+
354+ } ) ;
355+
168356test ( "should respect server capabilities" , async ( ) => {
169357 const server = new Server (
170358 {
0 commit comments