@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.
- package/.github/workflows/pipeline.yml +11 -1
- package/README.md +28 -42
- package/coverage/clover.xml +324 -325
- package/coverage/coverage-final.json +20 -20
- package/coverage/lcov-report/decorators/constants.ts.html +4 -4
- package/coverage/lcov-report/decorators/index.html +1 -1
- package/coverage/lcov-report/decorators/index.ts.html +5 -5
- package/coverage/lcov-report/decorators/prompt.decorator.ts.html +4 -4
- package/coverage/lcov-report/decorators/resource.decorator.ts.html +4 -4
- package/coverage/lcov-report/decorators/tool.decorator.ts.html +5 -5
- package/coverage/lcov-report/index.html +37 -37
- package/coverage/lcov-report/services/index.html +9 -39
- package/coverage/lcov-report/services/mcp-registry.service.ts.html +6 -6
- package/coverage/lcov-report/tests/index.html +21 -21
- package/coverage/lcov-report/tests/utils.ts.html +45 -45
- package/coverage/lcov.info +446 -449
- package/dist/interfaces/mcp-tool.interface.d.ts +7 -1
- package/dist/interfaces/mcp-tool.interface.d.ts.map +1 -1
- package/dist/services/handlers/mcp-handler.base.d.ts +3 -5
- package/dist/services/handlers/mcp-handler.base.d.ts.map +1 -1
- package/dist/services/handlers/mcp-handler.base.js +6 -2
- package/dist/services/handlers/mcp-handler.base.js.map +1 -1
- package/dist/transport/streamable-http.controller.factory.js +2 -2
- package/dist/transport/streamable-http.controller.factory.js.map +1 -1
- package/package.json +5 -3
- package/playground/resources/greeting.tool.ts +4 -3
- package/tests/mcp-tool.e2e.spec.ts +74 -10
- package/tsconfig.build.tsbuildinfo +1 -1
- package/coverage/lcov-report/services/handlers/index.html +0 -161
- package/coverage/lcov-report/services/handlers/mcp-handler.base.ts.html +0 -421
- package/coverage/lcov-report/services/handlers/mcp-prompts.handler.ts.html +0 -385
- package/coverage/lcov-report/services/handlers/mcp-resources.handler.ts.html +0 -361
- package/coverage/lcov-report/services/handlers/mcp-tools.handler.ts.html +0 -355
- package/coverage/lcov-report/services/mcp-executor.service.ts.html +0 -199
- package/coverage/lcov-report/services/sse-ping.service.ts.html +0 -499
- package/coverage/lcov-report/transport/index.html +0 -131
- package/coverage/lcov-report/transport/sse.controller.factory.ts.html +0 -532
- 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"> </span>
|
|
217
|
-
<span class="cline-any cline-neutral"> </span>
|
|
218
|
-
<span class="cline-any cline-neutral"> </span>
|
|
219
|
-
<span class="cline-any cline-neutral"> </span>
|
|
220
|
-
<span class="cline-any cline-neutral"> </span>
|
|
221
|
-
<span class="cline-any cline-neutral"> </span>
|
|
222
|
-
<span class="cline-any cline-neutral"> </span>
|
|
223
|
-
<span class="cline-any cline-neutral"> </span>
|
|
224
|
-
<span class="cline-any cline-neutral"> </span>
|
|
225
|
-
<span class="cline-any cline-neutral"> </span>
|
|
226
|
-
<span class="cline-any cline-neutral"> </span>
|
|
227
|
-
<span class="cline-any cline-neutral"> </span>
|
|
228
|
-
<span class="cline-any cline-neutral"> </span>
|
|
229
|
-
<span class="cline-any cline-neutral"> </span>
|
|
230
|
-
<span class="cline-any cline-neutral"> </span>
|
|
231
|
-
<span class="cline-any cline-yes">1x</span>
|
|
232
|
-
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
240
|
-
<span class="cline-any cline-neutral"> </span>
|
|
241
|
-
<span class="cline-any cline-neutral"> </span>
|
|
242
|
-
<span class="cline-any cline-neutral"> </span>
|
|
243
|
-
<span class="cline-any cline-yes">1x</span>
|
|
244
|
-
<span class="cline-any cline-neutral"> </span>
|
|
245
|
-
<span class="cline-any cline-neutral"> </span>
|
|
246
|
-
<span class="cline-any cline-neutral"> </span>
|
|
247
|
-
<span class="cline-any cline-neutral"> </span>
|
|
248
|
-
<span class="cline-any cline-neutral"> </span>
|
|
249
|
-
<span class="cline-any cline-neutral"> </span>
|
|
250
|
-
<span class="cline-any cline-yes">2x</span>
|
|
251
|
-
<span class="cline-any cline-neutral"> </span>
|
|
252
|
-
<span class="cline-any cline-neutral"> </span>
|
|
253
|
-
<span class="cline-any cline-neutral"> </span>
|
|
254
|
-
<span class="cline-any cline-yes">2x</span>
|
|
255
|
-
<span class="cline-any cline-neutral"> </span>
|
|
256
|
-
<span class="cline-any cline-neutral"> </span>
|
|
257
|
-
<span class="cline-any cline-neutral"> </span>
|
|
258
|
-
<span class="cline-any cline-neutral"> </span>
|
|
259
|
-
<span class="cline-any cline-no"> </span>
|
|
260
|
-
<span class="cline-any cline-neutral"> </span>
|
|
261
|
-
<span class="cline-any cline-no"> </span>
|
|
262
|
-
<span class="cline-any cline-neutral"> </span>
|
|
263
|
-
<span class="cline-any cline-neutral"> </span>
|
|
264
|
-
<span class="cline-any cline-no"> </span>
|
|
265
|
-
<span class="cline-any cline-no"> </span>
|
|
266
|
-
<span class="cline-any cline-no"> </span>
|
|
267
|
-
<span class="cline-any cline-no"> </span>
|
|
268
|
-
<span class="cline-any cline-neutral"> </span>
|
|
269
|
-
<span class="cline-any cline-neutral"> </span>
|
|
270
|
-
<span class="cline-any cline-neutral"> </span>
|
|
271
|
-
<span class="cline-any cline-neutral"> </span>
|
|
272
|
-
<span class="cline-any cline-neutral"> </span>
|
|
273
|
-
<span class="cline-any cline-neutral"> </span>
|
|
274
|
-
<span class="cline-any cline-neutral"> </span>
|
|
275
|
-
<span class="cline-any cline-no"> </span>
|
|
276
|
-
<span class="cline-any cline-neutral"> </span>
|
|
277
|
-
<span class="cline-any cline-neutral"> </span>
|
|
278
|
-
<span class="cline-any cline-neutral"> </span>
|
|
279
|
-
<span class="cline-any cline-neutral"> </span>
|
|
280
|
-
<span class="cline-any cline-neutral"> </span>
|
|
281
|
-
<span class="cline-any cline-neutral"> </span>
|
|
282
|
-
<span class="cline-any cline-neutral"> </span>
|
|
283
|
-
<span class="cline-any cline-neutral"> </span>
|
|
284
|
-
<span class="cline-any cline-neutral"> </span>
|
|
285
|
-
<span class="cline-any cline-yes">2x</span>
|
|
286
|
-
<span class="cline-any cline-no"> </span>
|
|
287
|
-
<span class="cline-any cline-neutral"> </span>
|
|
288
|
-
<span class="cline-any cline-neutral"> </span>
|
|
289
|
-
<span class="cline-any cline-neutral"> </span>
|
|
290
|
-
<span class="cline-any cline-neutral"> </span>
|
|
291
|
-
<span class="cline-any cline-no"> </span>
|
|
292
|
-
<span class="cline-any cline-neutral"> </span>
|
|
293
|
-
<span class="cline-any cline-neutral"> </span>
|
|
294
|
-
<span class="cline-any cline-no"> </span>
|
|
295
|
-
<span class="cline-any cline-neutral"> </span>
|
|
296
|
-
<span class="cline-any cline-neutral"> </span>
|
|
297
|
-
<span class="cline-any cline-neutral"> </span>
|
|
298
|
-
<span class="cline-any cline-neutral"> </span>
|
|
299
|
-
<span class="cline-any cline-neutral"> </span>
|
|
300
|
-
<span class="cline-any cline-neutral"> </span>
|
|
301
|
-
<span class="cline-any cline-neutral"> </span>
|
|
302
|
-
<span class="cline-any cline-neutral"> </span>
|
|
303
|
-
<span class="cline-any cline-neutral"> </span>
|
|
304
|
-
<span class="cline-any cline-neutral"> </span>
|
|
305
|
-
<span class="cline-any cline-neutral"> </span>
|
|
306
|
-
<span class="cline-any cline-neutral"> </span>
|
|
307
|
-
<span class="cline-any cline-neutral"> </span>
|
|
308
|
-
<span class="cline-any cline-no"> </span>
|
|
309
|
-
<span class="cline-any cline-no"> </span>
|
|
310
|
-
<span class="cline-any cline-neutral"> </span>
|
|
311
|
-
<span class="cline-any cline-neutral"> </span>
|
|
312
|
-
<span class="cline-any cline-no"> </span>
|
|
313
|
-
<span class="cline-any cline-neutral"> </span>
|
|
314
|
-
<span class="cline-any cline-no"> </span>
|
|
315
|
-
<span class="cline-any cline-neutral"> </span>
|
|
316
|
-
<span class="cline-any cline-no"> </span>
|
|
317
|
-
<span class="cline-any cline-no"> </span>
|
|
318
|
-
<span class="cline-any cline-no"> </span>
|
|
319
|
-
<span class="cline-any cline-neutral"> </span>
|
|
320
|
-
<span class="cline-any cline-neutral"> </span>
|
|
321
|
-
<span class="cline-any cline-no"> </span>
|
|
322
|
-
<span class="cline-any cline-neutral"> </span>
|
|
323
|
-
<span class="cline-any cline-neutral"> </span>
|
|
324
|
-
<span class="cline-any cline-neutral"> </span>
|
|
325
|
-
<span class="cline-any cline-neutral"> </span>
|
|
326
|
-
<span class="cline-any cline-neutral"> </span>
|
|
327
|
-
<span class="cline-any cline-neutral"> </span>
|
|
328
|
-
<span class="cline-any cline-neutral"> </span>
|
|
329
|
-
<span class="cline-any cline-yes">2x</span>
|
|
330
|
-
<span class="cline-any cline-neutral"> </span>
|
|
331
|
-
<span class="cline-any cline-neutral"> </span>
|
|
332
|
-
<span class="cline-any cline-neutral"> </span>
|
|
333
|
-
<span class="cline-any cline-neutral"> </span>
|
|
334
|
-
<span class="cline-any cline-no"> </span>
|
|
335
|
-
<span class="cline-any cline-no"> </span>
|
|
336
|
-
<span class="cline-any cline-neutral"> </span>
|
|
337
|
-
<span class="cline-any cline-no"> </span>
|
|
338
|
-
<span class="cline-any cline-no"> </span>
|
|
339
|
-
<span class="cline-any cline-neutral"> </span>
|
|
340
|
-
<span class="cline-any cline-neutral"> </span>
|
|
341
|
-
<span class="cline-any cline-no"> </span>
|
|
342
|
-
<span class="cline-any cline-no"> </span>
|
|
343
|
-
<span class="cline-any cline-no"> </span>
|
|
344
|
-
<span class="cline-any cline-neutral"> </span>
|
|
345
|
-
<span class="cline-any cline-neutral"> </span>
|
|
346
|
-
<span class="cline-any cline-neutral"> </span>
|
|
347
|
-
<span class="cline-any cline-no"> </span>
|
|
348
|
-
<span class="cline-any cline-no"> </span>
|
|
349
|
-
<span class="cline-any cline-neutral"> </span>
|
|
350
|
-
<span class="cline-any cline-neutral"> </span>
|
|
351
|
-
<span class="cline-any cline-neutral"> </span>
|
|
352
|
-
<span class="cline-any cline-neutral"> </span>
|
|
353
|
-
<span class="cline-any cline-neutral"> </span>
|
|
354
|
-
<span class="cline-any cline-neutral"> </span>
|
|
355
|
-
<span class="cline-any cline-no"> </span>
|
|
356
|
-
<span class="cline-any cline-neutral"> </span>
|
|
357
|
-
<span class="cline-any cline-neutral"> </span>
|
|
358
|
-
<span class="cline-any cline-no"> </span>
|
|
359
|
-
<span class="cline-any cline-neutral"> </span>
|
|
360
|
-
<span class="cline-any cline-neutral"> </span>
|
|
361
|
-
<span class="cline-any cline-neutral"> </span>
|
|
362
|
-
<span class="cline-any cline-yes">2x</span>
|
|
363
|
-
<span class="cline-any cline-neutral"> </span>
|
|
364
|
-
<span class="cline-any cline-neutral"> </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
|
-
|
|
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
|
-
|
|
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<CanActivate>[] = [],
|
|
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
|
-
|
|
407
|
-
// Map to store active transports by session ID
|
|
408
|
-
public <span class="cstat-no" title="statement not covered" >transports = new Map<string, SSEServerTransport>();</span>
|
|
409
|
-
// Map to store MCP server instances by session ID
|
|
410
|
-
public <span class="cstat-no" title="statement not covered" >mcpServers = new Map<string, McpServer>();</span>
|
|
411
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
463
|
-
<span class="cstat-no" title="statement not covered" > transport.onclose = <span class="fstat-no" title="function not covered" >() =</span>> {</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
|
-
|
|
470
|
-
<span class="cstat-no" title="statement not covered" > await mcpServer.connect(transport);</span>
|
|
471
|
-
}
|
|
472
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
506
|
-
// Process the message
|
|
507
|
-
<span class="cstat-no" title="statement not covered" > await transport.handlePostMessage(req, res, body);</span>
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
return SseController;
|
|
512
|
-
}
|
|
513
|
-
</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
|
-
|