@rekog/mcp-nest 1.5.0 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/.github/workflows/pipeline.yml +11 -1
  2. package/README.md +28 -42
  3. package/coverage/clover.xml +324 -325
  4. package/coverage/coverage-final.json +20 -20
  5. package/coverage/lcov-report/decorators/constants.ts.html +4 -4
  6. package/coverage/lcov-report/decorators/index.html +1 -1
  7. package/coverage/lcov-report/decorators/index.ts.html +5 -5
  8. package/coverage/lcov-report/decorators/prompt.decorator.ts.html +4 -4
  9. package/coverage/lcov-report/decorators/resource.decorator.ts.html +4 -4
  10. package/coverage/lcov-report/decorators/tool.decorator.ts.html +5 -5
  11. package/coverage/lcov-report/index.html +37 -37
  12. package/coverage/lcov-report/services/index.html +9 -39
  13. package/coverage/lcov-report/services/mcp-registry.service.ts.html +6 -6
  14. package/coverage/lcov-report/tests/index.html +21 -21
  15. package/coverage/lcov-report/tests/utils.ts.html +45 -45
  16. package/coverage/lcov.info +446 -449
  17. package/dist/interfaces/mcp-tool.interface.d.ts +7 -1
  18. package/dist/interfaces/mcp-tool.interface.d.ts.map +1 -1
  19. package/dist/services/handlers/mcp-handler.base.d.ts +3 -5
  20. package/dist/services/handlers/mcp-handler.base.d.ts.map +1 -1
  21. package/dist/services/handlers/mcp-handler.base.js +6 -2
  22. package/dist/services/handlers/mcp-handler.base.js.map +1 -1
  23. package/dist/transport/streamable-http.controller.factory.js +2 -2
  24. package/dist/transport/streamable-http.controller.factory.js.map +1 -1
  25. package/package.json +5 -3
  26. package/playground/resources/greeting.tool.ts +4 -3
  27. package/tests/mcp-tool.e2e.spec.ts +74 -10
  28. package/tsconfig.build.tsbuildinfo +1 -1
  29. package/coverage/lcov-report/services/handlers/index.html +0 -161
  30. package/coverage/lcov-report/services/handlers/mcp-handler.base.ts.html +0 -421
  31. package/coverage/lcov-report/services/handlers/mcp-prompts.handler.ts.html +0 -385
  32. package/coverage/lcov-report/services/handlers/mcp-resources.handler.ts.html +0 -361
  33. package/coverage/lcov-report/services/handlers/mcp-tools.handler.ts.html +0 -355
  34. package/coverage/lcov-report/services/mcp-executor.service.ts.html +0 -199
  35. package/coverage/lcov-report/services/sse-ping.service.ts.html +0 -499
  36. package/coverage/lcov-report/transport/index.html +0 -131
  37. package/coverage/lcov-report/transport/sse.controller.factory.ts.html +0 -532
  38. package/coverage/lcov-report/transport/streamable-http.controller.factory.ts.html +0 -1258
@@ -1,532 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for transport/sse.controller.factory.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../prettify.css" />
9
- <link rel="stylesheet" href="../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../index.html">All files</a> / <a href="index.html">transport</a> sse.controller.factory.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">30.95% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>13/42</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">25% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>2/8</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">16.66% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>1/6</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">30.95% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>13/42</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line low'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
216
- <span class="cline-any cline-neutral">&nbsp;</span>
217
- <span class="cline-any cline-neutral">&nbsp;</span>
218
- <span class="cline-any cline-neutral">&nbsp;</span>
219
- <span class="cline-any cline-neutral">&nbsp;</span>
220
- <span class="cline-any cline-neutral">&nbsp;</span>
221
- <span class="cline-any cline-neutral">&nbsp;</span>
222
- <span class="cline-any cline-neutral">&nbsp;</span>
223
- <span class="cline-any cline-neutral">&nbsp;</span>
224
- <span class="cline-any cline-neutral">&nbsp;</span>
225
- <span class="cline-any cline-neutral">&nbsp;</span>
226
- <span class="cline-any cline-neutral">&nbsp;</span>
227
- <span class="cline-any cline-neutral">&nbsp;</span>
228
- <span class="cline-any cline-neutral">&nbsp;</span>
229
- <span class="cline-any cline-neutral">&nbsp;</span>
230
- <span class="cline-any cline-neutral">&nbsp;</span>
231
- <span class="cline-any cline-yes">1x</span>
232
- <span class="cline-any cline-neutral">&nbsp;</span>
233
- <span class="cline-any cline-yes">1x</span>
234
- <span class="cline-any cline-yes">1x</span>
235
- <span class="cline-any cline-neutral">&nbsp;</span>
236
- <span class="cline-any cline-yes">1x</span>
237
- <span class="cline-any cline-yes">1x</span>
238
- <span class="cline-any cline-yes">1x</span>
239
- <span class="cline-any cline-neutral">&nbsp;</span>
240
- <span class="cline-any cline-neutral">&nbsp;</span>
241
- <span class="cline-any cline-neutral">&nbsp;</span>
242
- <span class="cline-any cline-neutral">&nbsp;</span>
243
- <span class="cline-any cline-yes">1x</span>
244
- <span class="cline-any cline-neutral">&nbsp;</span>
245
- <span class="cline-any cline-neutral">&nbsp;</span>
246
- <span class="cline-any cline-neutral">&nbsp;</span>
247
- <span class="cline-any cline-neutral">&nbsp;</span>
248
- <span class="cline-any cline-neutral">&nbsp;</span>
249
- <span class="cline-any cline-neutral">&nbsp;</span>
250
- <span class="cline-any cline-yes">2x</span>
251
- <span class="cline-any cline-neutral">&nbsp;</span>
252
- <span class="cline-any cline-neutral">&nbsp;</span>
253
- <span class="cline-any cline-neutral">&nbsp;</span>
254
- <span class="cline-any cline-yes">2x</span>
255
- <span class="cline-any cline-neutral">&nbsp;</span>
256
- <span class="cline-any cline-neutral">&nbsp;</span>
257
- <span class="cline-any cline-neutral">&nbsp;</span>
258
- <span class="cline-any cline-neutral">&nbsp;</span>
259
- <span class="cline-any cline-no">&nbsp;</span>
260
- <span class="cline-any cline-neutral">&nbsp;</span>
261
- <span class="cline-any cline-no">&nbsp;</span>
262
- <span class="cline-any cline-neutral">&nbsp;</span>
263
- <span class="cline-any cline-neutral">&nbsp;</span>
264
- <span class="cline-any cline-no">&nbsp;</span>
265
- <span class="cline-any cline-no">&nbsp;</span>
266
- <span class="cline-any cline-no">&nbsp;</span>
267
- <span class="cline-any cline-no">&nbsp;</span>
268
- <span class="cline-any cline-neutral">&nbsp;</span>
269
- <span class="cline-any cline-neutral">&nbsp;</span>
270
- <span class="cline-any cline-neutral">&nbsp;</span>
271
- <span class="cline-any cline-neutral">&nbsp;</span>
272
- <span class="cline-any cline-neutral">&nbsp;</span>
273
- <span class="cline-any cline-neutral">&nbsp;</span>
274
- <span class="cline-any cline-neutral">&nbsp;</span>
275
- <span class="cline-any cline-no">&nbsp;</span>
276
- <span class="cline-any cline-neutral">&nbsp;</span>
277
- <span class="cline-any cline-neutral">&nbsp;</span>
278
- <span class="cline-any cline-neutral">&nbsp;</span>
279
- <span class="cline-any cline-neutral">&nbsp;</span>
280
- <span class="cline-any cline-neutral">&nbsp;</span>
281
- <span class="cline-any cline-neutral">&nbsp;</span>
282
- <span class="cline-any cline-neutral">&nbsp;</span>
283
- <span class="cline-any cline-neutral">&nbsp;</span>
284
- <span class="cline-any cline-neutral">&nbsp;</span>
285
- <span class="cline-any cline-yes">2x</span>
286
- <span class="cline-any cline-no">&nbsp;</span>
287
- <span class="cline-any cline-neutral">&nbsp;</span>
288
- <span class="cline-any cline-neutral">&nbsp;</span>
289
- <span class="cline-any cline-neutral">&nbsp;</span>
290
- <span class="cline-any cline-neutral">&nbsp;</span>
291
- <span class="cline-any cline-no">&nbsp;</span>
292
- <span class="cline-any cline-neutral">&nbsp;</span>
293
- <span class="cline-any cline-neutral">&nbsp;</span>
294
- <span class="cline-any cline-no">&nbsp;</span>
295
- <span class="cline-any cline-neutral">&nbsp;</span>
296
- <span class="cline-any cline-neutral">&nbsp;</span>
297
- <span class="cline-any cline-neutral">&nbsp;</span>
298
- <span class="cline-any cline-neutral">&nbsp;</span>
299
- <span class="cline-any cline-neutral">&nbsp;</span>
300
- <span class="cline-any cline-neutral">&nbsp;</span>
301
- <span class="cline-any cline-neutral">&nbsp;</span>
302
- <span class="cline-any cline-neutral">&nbsp;</span>
303
- <span class="cline-any cline-neutral">&nbsp;</span>
304
- <span class="cline-any cline-neutral">&nbsp;</span>
305
- <span class="cline-any cline-neutral">&nbsp;</span>
306
- <span class="cline-any cline-neutral">&nbsp;</span>
307
- <span class="cline-any cline-neutral">&nbsp;</span>
308
- <span class="cline-any cline-no">&nbsp;</span>
309
- <span class="cline-any cline-no">&nbsp;</span>
310
- <span class="cline-any cline-neutral">&nbsp;</span>
311
- <span class="cline-any cline-neutral">&nbsp;</span>
312
- <span class="cline-any cline-no">&nbsp;</span>
313
- <span class="cline-any cline-neutral">&nbsp;</span>
314
- <span class="cline-any cline-no">&nbsp;</span>
315
- <span class="cline-any cline-neutral">&nbsp;</span>
316
- <span class="cline-any cline-no">&nbsp;</span>
317
- <span class="cline-any cline-no">&nbsp;</span>
318
- <span class="cline-any cline-no">&nbsp;</span>
319
- <span class="cline-any cline-neutral">&nbsp;</span>
320
- <span class="cline-any cline-neutral">&nbsp;</span>
321
- <span class="cline-any cline-no">&nbsp;</span>
322
- <span class="cline-any cline-neutral">&nbsp;</span>
323
- <span class="cline-any cline-neutral">&nbsp;</span>
324
- <span class="cline-any cline-neutral">&nbsp;</span>
325
- <span class="cline-any cline-neutral">&nbsp;</span>
326
- <span class="cline-any cline-neutral">&nbsp;</span>
327
- <span class="cline-any cline-neutral">&nbsp;</span>
328
- <span class="cline-any cline-neutral">&nbsp;</span>
329
- <span class="cline-any cline-yes">2x</span>
330
- <span class="cline-any cline-neutral">&nbsp;</span>
331
- <span class="cline-any cline-neutral">&nbsp;</span>
332
- <span class="cline-any cline-neutral">&nbsp;</span>
333
- <span class="cline-any cline-neutral">&nbsp;</span>
334
- <span class="cline-any cline-no">&nbsp;</span>
335
- <span class="cline-any cline-no">&nbsp;</span>
336
- <span class="cline-any cline-neutral">&nbsp;</span>
337
- <span class="cline-any cline-no">&nbsp;</span>
338
- <span class="cline-any cline-no">&nbsp;</span>
339
- <span class="cline-any cline-neutral">&nbsp;</span>
340
- <span class="cline-any cline-neutral">&nbsp;</span>
341
- <span class="cline-any cline-no">&nbsp;</span>
342
- <span class="cline-any cline-no">&nbsp;</span>
343
- <span class="cline-any cline-no">&nbsp;</span>
344
- <span class="cline-any cline-neutral">&nbsp;</span>
345
- <span class="cline-any cline-neutral">&nbsp;</span>
346
- <span class="cline-any cline-neutral">&nbsp;</span>
347
- <span class="cline-any cline-no">&nbsp;</span>
348
- <span class="cline-any cline-no">&nbsp;</span>
349
- <span class="cline-any cline-neutral">&nbsp;</span>
350
- <span class="cline-any cline-neutral">&nbsp;</span>
351
- <span class="cline-any cline-neutral">&nbsp;</span>
352
- <span class="cline-any cline-neutral">&nbsp;</span>
353
- <span class="cline-any cline-neutral">&nbsp;</span>
354
- <span class="cline-any cline-neutral">&nbsp;</span>
355
- <span class="cline-any cline-no">&nbsp;</span>
356
- <span class="cline-any cline-neutral">&nbsp;</span>
357
- <span class="cline-any cline-neutral">&nbsp;</span>
358
- <span class="cline-any cline-no">&nbsp;</span>
359
- <span class="cline-any cline-neutral">&nbsp;</span>
360
- <span class="cline-any cline-neutral">&nbsp;</span>
361
- <span class="cline-any cline-neutral">&nbsp;</span>
362
- <span class="cline-any cline-yes">2x</span>
363
- <span class="cline-any cline-neutral">&nbsp;</span>
364
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import {
365
- Body,
366
- Controller,
367
- Get,
368
- Inject,
369
- Post,
370
- Req,
371
- Res,
372
- Type,
373
- UseGuards,
374
- OnModuleInit,
375
- VERSION_NEUTRAL,
376
- applyDecorators,
377
- } from '@nestjs/common';
378
- import type { Request, Response } from 'express';
379
- import { CanActivate } from '@nestjs/common';
380
- import { ContextIdFactory, ModuleRef } from '@nestjs/core';
381
- &nbsp;
382
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
383
- import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
384
- import { McpOptions } from '../interfaces';
385
- import { McpRegistryService } from '../services/mcp-registry.service';
386
- import { McpExecutorService } from '../services/mcp-executor.service';
387
- import { SsePingService } from '../services/sse-ping.service';
388
- &nbsp;
389
- /**
390
- * Creates a controller for handling SSE connections and tool executions
391
- */
392
- export function createSseController(
393
- sseEndpoint: string,
394
- messagesEndpoint: string,
395
- globalApiPrefix: string,
396
- guards: Type&lt;CanActivate&gt;[] = [],
397
- decorators: ClassDecorator[] = [],
398
- ) {
399
- @Controller({
400
- version: VERSION_NEUTRAL,
401
- })
402
- @applyDecorators(...decorators)
403
- class SseController implements OnModuleInit {
404
- // Note: Currently, storing transports and servers in memory makes this not viable for scaling out.
405
- // Redis can be used for this purpose, but considering that HTTP Streamable succeeds SSE then we can drop keeping this in memory.
406
- &nbsp;
407
- // Map to store active transports by session ID
408
- public <span class="cstat-no" title="statement not covered" >transports = new Map&lt;string, SSEServerTransport&gt;();</span>
409
- // Map to store MCP server instances by session ID
410
- public <span class="cstat-no" title="statement not covered" >mcpServers = new Map&lt;string, McpServer&gt;();</span>
411
- &nbsp;
412
- <span class="fstat-no" title="function not covered" > constructor(</span>
413
- @Inject('MCP_OPTIONS') public readonly <span class="cstat-no" title="statement not covered" >options: McpOptions,</span>
414
- public readonly <span class="cstat-no" title="statement not covered" >moduleRef: M</span>oduleRef,
415
- public readonly <span class="cstat-no" title="statement not covered" >toolRegistry: M</span>cpRegistryService,
416
- @Inject(SsePingService) public readonly <span class="cstat-no" title="statement not covered" >pingService: S</span>sePingService,
417
- ) {}
418
- &nbsp;
419
- /**
420
- * Initialize the controller and configure ping service
421
- */
422
- <span class="fstat-no" title="function not covered" > onModuleInit(</span>) {
423
- // Configure ping service with options
424
- <span class="cstat-no" title="statement not covered" > this.pingService.configure({</span>
425
- pingEnabled: this.options.sse?.pingEnabled, // Enable by default
426
- pingIntervalMs: this.options.sse?.pingIntervalMs,
427
- });
428
- }
429
- &nbsp;
430
- /**
431
- * SSE connection endpoint
432
- */
433
- @Get(sseEndpoint)
434
- <span class="fstat-no" title="function not covered" > async </span>sse(@Res() res: Response) {
435
- const transport = <span class="cstat-no" title="statement not covered" >new SSEServerTransport(</span>
436
- // Remove potential double slashes from the path
437
- `${globalApiPrefix}/${messagesEndpoint}`.replace(/\/+/g, '/'),
438
- res,
439
- );
440
- const sessionId = <span class="cstat-no" title="statement not covered" >transport.sessionId;</span>
441
- &nbsp;
442
- // Create a new MCP server for this session
443
- const mcpServer = <span class="cstat-no" title="statement not covered" >new McpServer(</span>
444
- { name: this.options.name, version: this.options.version },
445
- {
446
- capabilities: this.options.capabilities || {
447
- tools: {},
448
- resources: {},
449
- resourceTemplates: {},
450
- prompts: {},
451
- },
452
- instructions: this.options.instructions || '',
453
- },
454
- );
455
- &nbsp;
456
- // Store the transport and server for this session
457
- <span class="cstat-no" title="statement not covered" > this.transports.set(sessionId, transport);</span>
458
- <span class="cstat-no" title="statement not covered" > this.mcpServers.set(sessionId, mcpServer);</span>
459
- &nbsp;
460
- // Register the connection with the ping service
461
- <span class="cstat-no" title="statement not covered" > this.pingService.registerConnection(sessionId, transport, res);</span>
462
- &nbsp;
463
- <span class="cstat-no" title="statement not covered" > transport.onclose = <span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
464
- // Clean up when the connection closes
465
- <span class="cstat-no" title="statement not covered" > this.transports.delete(sessionId);</span>
466
- <span class="cstat-no" title="statement not covered" > this.mcpServers.delete(sessionId);</span>
467
- <span class="cstat-no" title="statement not covered" > this.pingService.removeConnection(sessionId);</span>
468
- };
469
- &nbsp;
470
- <span class="cstat-no" title="statement not covered" > await mcpServer.connect(transport);</span>
471
- }
472
- &nbsp;
473
- /**
474
- * Tool execution endpoint - protected by the provided guards
475
- */
476
- @Post(messagesEndpoint)
477
- @UseGuards(...guards)
478
- <span class="fstat-no" title="function not covered" > async </span>messages(
479
- @Req() req: Request,
480
- @Res() res: Response,
481
- @Body() body: unknown,
482
- ) {
483
- const sessionId = <span class="cstat-no" title="statement not covered" >req.query.sessionId as string;</span>
484
- const transport = <span class="cstat-no" title="statement not covered" >this.transports.get(sessionId);</span>
485
- &nbsp;
486
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!transport) {</span>
487
- <span class="cstat-no" title="statement not covered" > return res.status(404).send('Session not found');</span>
488
- }
489
- &nbsp;
490
- const mcpServer = <span class="cstat-no" title="statement not covered" >this.mcpServers.get(sessionId);</span>
491
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!mcpServer) {</span>
492
- <span class="cstat-no" title="statement not covered" > return res.status(404).send('MCP server not found for session');</span>
493
- }
494
- &nbsp;
495
- // Resolve the request-scoped tool executor service
496
- const contextId = <span class="cstat-no" title="statement not covered" >ContextIdFactory.getByRequest(req);</span>
497
- const executor = <span class="cstat-no" title="statement not covered" >await this.moduleRef.resolve(</span>
498
- McpExecutorService,
499
- contextId,
500
- { strict: false },
501
- );
502
- &nbsp;
503
- // Register request handlers with the user context from this specific request
504
- <span class="cstat-no" title="statement not covered" > executor.registerRequestHandlers(mcpServer, req);</span>
505
- &nbsp;
506
- // Process the message
507
- <span class="cstat-no" title="statement not covered" > await transport.handlePostMessage(req, res, body);</span>
508
- }
509
- }
510
- &nbsp;
511
- return SseController;
512
- }
513
- &nbsp;</pre></td></tr></table></pre>
514
-
515
- <div class='push'></div><!-- for sticky footer -->
516
- </div><!-- /wrapper -->
517
- <div class='footer quiet pad2 space-top1 center small'>
518
- Code coverage generated by
519
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
520
- at 2025-04-26T05:28:42.460Z
521
- </div>
522
- <script src="../prettify.js"></script>
523
- <script>
524
- window.onload = function () {
525
- prettyPrint();
526
- };
527
- </script>
528
- <script src="../sorter.js"></script>
529
- <script src="../block-navigation.js"></script>
530
- </body>
531
- </html>
532
-