@@ -101,6 +101,7 @@ describe("ResourceTemplate", () => {
101
101
const abortController = new AbortController ( ) ;
102
102
const result = await template . listCallback ?.( {
103
103
signal : abortController . signal ,
104
+ requestId : 'not-implemented' ,
104
105
sendRequest : ( ) => { throw new Error ( "Not implemented" ) } ,
105
106
sendNotification : ( ) => { throw new Error ( "Not implemented" ) }
106
107
} ) ;
@@ -646,6 +647,59 @@ describe("tool()", () => {
646
647
expect ( receivedSessionId ) . toBe ( "test-session-123" ) ;
647
648
} ) ;
648
649
650
+ test ( "should pass requestId to tool callback via RequestHandlerExtra" , async ( ) => {
651
+ const mcpServer = new McpServer ( {
652
+ name : "test server" ,
653
+ version : "1.0" ,
654
+ } ) ;
655
+
656
+ const client = new Client (
657
+ {
658
+ name : "test client" ,
659
+ version : "1.0" ,
660
+ } ,
661
+ {
662
+ capabilities : {
663
+ tools : { } ,
664
+ } ,
665
+ } ,
666
+ ) ;
667
+
668
+ let receivedRequestId : string | number | undefined ;
669
+ mcpServer . tool ( "request-id-test" , async ( extra ) => {
670
+ receivedRequestId = extra . requestId ;
671
+ return {
672
+ content : [
673
+ {
674
+ type : "text" ,
675
+ text : `Received request ID: ${ extra . requestId } ` ,
676
+ } ,
677
+ ] ,
678
+ } ;
679
+ } ) ;
680
+
681
+ const [ clientTransport , serverTransport ] = InMemoryTransport . createLinkedPair ( ) ;
682
+
683
+ await Promise . all ( [
684
+ client . connect ( clientTransport ) ,
685
+ mcpServer . server . connect ( serverTransport ) ,
686
+ ] ) ;
687
+
688
+ const result = await client . request (
689
+ {
690
+ method : "tools/call" ,
691
+ params : {
692
+ name : "request-id-test" ,
693
+ } ,
694
+ } ,
695
+ CallToolResultSchema ,
696
+ ) ;
697
+
698
+ expect ( receivedRequestId ) . toBeDefined ( ) ;
699
+ expect ( typeof receivedRequestId === 'string' || typeof receivedRequestId === 'number' ) . toBe ( true ) ;
700
+ expect ( result . content [ 0 ] . text ) . toContain ( "Received request ID:" ) ;
701
+ } ) ;
702
+
649
703
test ( "should provide sendNotification within tool call" , async ( ) => {
650
704
const mcpServer = new McpServer (
651
705
{
@@ -1702,6 +1756,59 @@ describe("resource()", () => {
1702
1756
expect ( result . completion . values ) . toEqual ( [ "movies" , "music" ] ) ;
1703
1757
expect ( result . completion . total ) . toBe ( 2 ) ;
1704
1758
} ) ;
1759
+
1760
+ test ( "should pass requestId to resource callback via RequestHandlerExtra" , async ( ) => {
1761
+ const mcpServer = new McpServer ( {
1762
+ name : "test server" ,
1763
+ version : "1.0" ,
1764
+ } ) ;
1765
+
1766
+ const client = new Client (
1767
+ {
1768
+ name : "test client" ,
1769
+ version : "1.0" ,
1770
+ } ,
1771
+ {
1772
+ capabilities : {
1773
+ resources : { } ,
1774
+ } ,
1775
+ } ,
1776
+ ) ;
1777
+
1778
+ let receivedRequestId : string | number | undefined ;
1779
+ mcpServer . resource ( "request-id-test" , "test://resource" , async ( _uri , extra ) => {
1780
+ receivedRequestId = extra . requestId ;
1781
+ return {
1782
+ contents : [
1783
+ {
1784
+ uri : "test://resource" ,
1785
+ text : `Received request ID: ${ extra . requestId } ` ,
1786
+ } ,
1787
+ ] ,
1788
+ } ;
1789
+ } ) ;
1790
+
1791
+ const [ clientTransport , serverTransport ] = InMemoryTransport . createLinkedPair ( ) ;
1792
+
1793
+ await Promise . all ( [
1794
+ client . connect ( clientTransport ) ,
1795
+ mcpServer . server . connect ( serverTransport ) ,
1796
+ ] ) ;
1797
+
1798
+ const result = await client . request (
1799
+ {
1800
+ method : "resources/read" ,
1801
+ params : {
1802
+ uri : "test://resource" ,
1803
+ } ,
1804
+ } ,
1805
+ ReadResourceResultSchema ,
1806
+ ) ;
1807
+
1808
+ expect ( receivedRequestId ) . toBeDefined ( ) ;
1809
+ expect ( typeof receivedRequestId === 'string' || typeof receivedRequestId === 'number' ) . toBe ( true ) ;
1810
+ expect ( result . contents [ 0 ] . text ) . toContain ( "Received request ID:" ) ;
1811
+ } ) ;
1705
1812
} ) ;
1706
1813
1707
1814
describe ( "prompt()" , ( ) => {
@@ -2511,4 +2618,60 @@ describe("prompt()", () => {
2511
2618
expect ( result . completion . values ) . toEqual ( [ "Alice" ] ) ;
2512
2619
expect ( result . completion . total ) . toBe ( 1 ) ;
2513
2620
} ) ;
2621
+
2622
+ test ( "should pass requestId to prompt callback via RequestHandlerExtra" , async ( ) => {
2623
+ const mcpServer = new McpServer ( {
2624
+ name : "test server" ,
2625
+ version : "1.0" ,
2626
+ } ) ;
2627
+
2628
+ const client = new Client (
2629
+ {
2630
+ name : "test client" ,
2631
+ version : "1.0" ,
2632
+ } ,
2633
+ {
2634
+ capabilities : {
2635
+ prompts : { } ,
2636
+ } ,
2637
+ } ,
2638
+ ) ;
2639
+
2640
+ let receivedRequestId : string | number | undefined ;
2641
+ mcpServer . prompt ( "request-id-test" , async ( extra ) => {
2642
+ receivedRequestId = extra . requestId ;
2643
+ return {
2644
+ messages : [
2645
+ {
2646
+ role : "assistant" ,
2647
+ content : {
2648
+ type : "text" ,
2649
+ text : `Received request ID: ${ extra . requestId } ` ,
2650
+ } ,
2651
+ } ,
2652
+ ] ,
2653
+ } ;
2654
+ } ) ;
2655
+
2656
+ const [ clientTransport , serverTransport ] = InMemoryTransport . createLinkedPair ( ) ;
2657
+
2658
+ await Promise . all ( [
2659
+ client . connect ( clientTransport ) ,
2660
+ mcpServer . server . connect ( serverTransport ) ,
2661
+ ] ) ;
2662
+
2663
+ const result = await client . request (
2664
+ {
2665
+ method : "prompts/get" ,
2666
+ params : {
2667
+ name : "request-id-test" ,
2668
+ } ,
2669
+ } ,
2670
+ GetPromptResultSchema ,
2671
+ ) ;
2672
+
2673
+ expect ( receivedRequestId ) . toBeDefined ( ) ;
2674
+ expect ( typeof receivedRequestId === 'string' || typeof receivedRequestId === 'number' ) . toBe ( true ) ;
2675
+ expect ( result . messages [ 0 ] . content . text ) . toContain ( "Received request ID:" ) ;
2676
+ } ) ;
2514
2677
} ) ;
0 commit comments