@cyanheads/mcp-ts-core 0.1.0-beta.12

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 (485) hide show
  1. package/CLAUDE.md +583 -0
  2. package/LICENSE +201 -0
  3. package/README.md +287 -0
  4. package/biome.json +103 -0
  5. package/dist/app.d.ts +82 -0
  6. package/dist/app.d.ts.map +1 -0
  7. package/dist/app.js +222 -0
  8. package/dist/app.js.map +1 -0
  9. package/dist/cli/init.d.ts +8 -0
  10. package/dist/cli/init.d.ts.map +1 -0
  11. package/dist/cli/init.js +161 -0
  12. package/dist/cli/init.js.map +1 -0
  13. package/dist/config/index.d.ts +349 -0
  14. package/dist/config/index.d.ts.map +1 -0
  15. package/dist/config/index.js +464 -0
  16. package/dist/config/index.js.map +1 -0
  17. package/dist/context.d.ts +119 -0
  18. package/dist/context.d.ts.map +1 -0
  19. package/dist/context.js +144 -0
  20. package/dist/context.js.map +1 -0
  21. package/dist/index.d.ts +8 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +9 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/mcp-server/prompts/prompt-registration.d.ts +33 -0
  26. package/dist/mcp-server/prompts/prompt-registration.d.ts.map +1 -0
  27. package/dist/mcp-server/prompts/prompt-registration.js +91 -0
  28. package/dist/mcp-server/prompts/prompt-registration.js.map +1 -0
  29. package/dist/mcp-server/prompts/utils/newPromptDefinition.d.ts +49 -0
  30. package/dist/mcp-server/prompts/utils/newPromptDefinition.d.ts.map +1 -0
  31. package/dist/mcp-server/prompts/utils/newPromptDefinition.js +39 -0
  32. package/dist/mcp-server/prompts/utils/newPromptDefinition.js.map +1 -0
  33. package/dist/mcp-server/prompts/utils/promptDefinition.d.ts +37 -0
  34. package/dist/mcp-server/prompts/utils/promptDefinition.d.ts.map +1 -0
  35. package/dist/mcp-server/prompts/utils/promptDefinition.js +2 -0
  36. package/dist/mcp-server/prompts/utils/promptDefinition.js.map +1 -0
  37. package/dist/mcp-server/resources/resource-registration.d.ts +27 -0
  38. package/dist/mcp-server/resources/resource-registration.d.ts.map +1 -0
  39. package/dist/mcp-server/resources/resource-registration.js +85 -0
  40. package/dist/mcp-server/resources/resource-registration.js.map +1 -0
  41. package/dist/mcp-server/resources/utils/newResourceDefinition.d.ts +84 -0
  42. package/dist/mcp-server/resources/utils/newResourceDefinition.d.ts.map +1 -0
  43. package/dist/mcp-server/resources/utils/newResourceDefinition.js +40 -0
  44. package/dist/mcp-server/resources/utils/newResourceDefinition.js.map +1 -0
  45. package/dist/mcp-server/resources/utils/newResourceHandlerFactory.d.ts +32 -0
  46. package/dist/mcp-server/resources/utils/newResourceHandlerFactory.d.ts.map +1 -0
  47. package/dist/mcp-server/resources/utils/newResourceHandlerFactory.js +103 -0
  48. package/dist/mcp-server/resources/utils/newResourceHandlerFactory.js.map +1 -0
  49. package/dist/mcp-server/resources/utils/resourceDefinition.d.ts +94 -0
  50. package/dist/mcp-server/resources/utils/resourceDefinition.d.ts.map +1 -0
  51. package/dist/mcp-server/resources/utils/resourceDefinition.js +2 -0
  52. package/dist/mcp-server/resources/utils/resourceDefinition.js.map +1 -0
  53. package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts +14 -0
  54. package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts.map +1 -0
  55. package/dist/mcp-server/resources/utils/resourceHandlerFactory.js +111 -0
  56. package/dist/mcp-server/resources/utils/resourceHandlerFactory.js.map +1 -0
  57. package/dist/mcp-server/roots/roots-registration.d.ts +22 -0
  58. package/dist/mcp-server/roots/roots-registration.d.ts.map +1 -0
  59. package/dist/mcp-server/roots/roots-registration.js +25 -0
  60. package/dist/mcp-server/roots/roots-registration.js.map +1 -0
  61. package/dist/mcp-server/server.d.ts +34 -0
  62. package/dist/mcp-server/server.d.ts.map +1 -0
  63. package/dist/mcp-server/server.js +62 -0
  64. package/dist/mcp-server/server.js.map +1 -0
  65. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts +42 -0
  66. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts.map +1 -0
  67. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js +70 -0
  68. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js.map +1 -0
  69. package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts +109 -0
  70. package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts.map +1 -0
  71. package/dist/mcp-server/tasks/core/storageBackedTaskStore.js +209 -0
  72. package/dist/mcp-server/tasks/core/storageBackedTaskStore.js.map +1 -0
  73. package/dist/mcp-server/tasks/core/taskManager.d.ts +103 -0
  74. package/dist/mcp-server/tasks/core/taskManager.d.ts.map +1 -0
  75. package/dist/mcp-server/tasks/core/taskManager.js +144 -0
  76. package/dist/mcp-server/tasks/core/taskManager.js.map +1 -0
  77. package/dist/mcp-server/tasks/core/taskTypes.d.ts +11 -0
  78. package/dist/mcp-server/tasks/core/taskTypes.d.ts.map +1 -0
  79. package/dist/mcp-server/tasks/core/taskTypes.js +13 -0
  80. package/dist/mcp-server/tasks/core/taskTypes.js.map +1 -0
  81. package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts +108 -0
  82. package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts.map +1 -0
  83. package/dist/mcp-server/tasks/utils/taskToolDefinition.js +14 -0
  84. package/dist/mcp-server/tasks/utils/taskToolDefinition.js.map +1 -0
  85. package/dist/mcp-server/tools/tool-registration.d.ts +49 -0
  86. package/dist/mcp-server/tools/tool-registration.d.ts.map +1 -0
  87. package/dist/mcp-server/tools/tool-registration.js +269 -0
  88. package/dist/mcp-server/tools/tool-registration.js.map +1 -0
  89. package/dist/mcp-server/tools/utils/newToolDefinition.d.ts +73 -0
  90. package/dist/mcp-server/tools/utils/newToolDefinition.d.ts.map +1 -0
  91. package/dist/mcp-server/tools/utils/newToolDefinition.js +45 -0
  92. package/dist/mcp-server/tools/utils/newToolDefinition.js.map +1 -0
  93. package/dist/mcp-server/tools/utils/newToolHandlerFactory.d.ts +33 -0
  94. package/dist/mcp-server/tools/utils/newToolHandlerFactory.d.ts.map +1 -0
  95. package/dist/mcp-server/tools/utils/newToolHandlerFactory.js +107 -0
  96. package/dist/mcp-server/tools/utils/newToolHandlerFactory.js.map +1 -0
  97. package/dist/mcp-server/tools/utils/toolDefinition.d.ts +118 -0
  98. package/dist/mcp-server/tools/utils/toolDefinition.d.ts.map +1 -0
  99. package/dist/mcp-server/tools/utils/toolDefinition.js +2 -0
  100. package/dist/mcp-server/tools/utils/toolDefinition.js.map +1 -0
  101. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts +34 -0
  102. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts.map +1 -0
  103. package/dist/mcp-server/tools/utils/toolHandlerFactory.js +68 -0
  104. package/dist/mcp-server/tools/utils/toolHandlerFactory.js.map +1 -0
  105. package/dist/mcp-server/transports/ITransport.d.ts +15 -0
  106. package/dist/mcp-server/transports/ITransport.d.ts.map +1 -0
  107. package/dist/mcp-server/transports/ITransport.js +2 -0
  108. package/dist/mcp-server/transports/ITransport.js.map +1 -0
  109. package/dist/mcp-server/transports/auth/authFactory.d.ts +11 -0
  110. package/dist/mcp-server/transports/auth/authFactory.d.ts.map +1 -0
  111. package/dist/mcp-server/transports/auth/authFactory.js +43 -0
  112. package/dist/mcp-server/transports/auth/authFactory.js.map +1 -0
  113. package/dist/mcp-server/transports/auth/authMiddleware.d.ts +24 -0
  114. package/dist/mcp-server/transports/auth/authMiddleware.d.ts.map +1 -0
  115. package/dist/mcp-server/transports/auth/authMiddleware.js +69 -0
  116. package/dist/mcp-server/transports/auth/authMiddleware.js.map +1 -0
  117. package/dist/mcp-server/transports/auth/lib/authContext.d.ts +34 -0
  118. package/dist/mcp-server/transports/auth/lib/authContext.d.ts.map +1 -0
  119. package/dist/mcp-server/transports/auth/lib/authContext.js +25 -0
  120. package/dist/mcp-server/transports/auth/lib/authContext.js.map +1 -0
  121. package/dist/mcp-server/transports/auth/lib/authTypes.d.ts +19 -0
  122. package/dist/mcp-server/transports/auth/lib/authTypes.d.ts.map +1 -0
  123. package/dist/mcp-server/transports/auth/lib/authTypes.js +2 -0
  124. package/dist/mcp-server/transports/auth/lib/authTypes.js.map +1 -0
  125. package/dist/mcp-server/transports/auth/lib/authUtils.d.ts +18 -0
  126. package/dist/mcp-server/transports/auth/lib/authUtils.d.ts.map +1 -0
  127. package/dist/mcp-server/transports/auth/lib/authUtils.js +64 -0
  128. package/dist/mcp-server/transports/auth/lib/authUtils.js.map +1 -0
  129. package/dist/mcp-server/transports/auth/lib/checkScopes.d.ts +25 -0
  130. package/dist/mcp-server/transports/auth/lib/checkScopes.d.ts.map +1 -0
  131. package/dist/mcp-server/transports/auth/lib/checkScopes.js +34 -0
  132. package/dist/mcp-server/transports/auth/lib/checkScopes.js.map +1 -0
  133. package/dist/mcp-server/transports/auth/lib/claimParser.d.ts +34 -0
  134. package/dist/mcp-server/transports/auth/lib/claimParser.d.ts.map +1 -0
  135. package/dist/mcp-server/transports/auth/lib/claimParser.js +58 -0
  136. package/dist/mcp-server/transports/auth/lib/claimParser.js.map +1 -0
  137. package/dist/mcp-server/transports/auth/lib/withAuth.d.ts +25 -0
  138. package/dist/mcp-server/transports/auth/lib/withAuth.d.ts.map +1 -0
  139. package/dist/mcp-server/transports/auth/lib/withAuth.js +30 -0
  140. package/dist/mcp-server/transports/auth/lib/withAuth.js.map +1 -0
  141. package/dist/mcp-server/transports/auth/strategies/authStrategy.d.ts +18 -0
  142. package/dist/mcp-server/transports/auth/strategies/authStrategy.d.ts.map +1 -0
  143. package/dist/mcp-server/transports/auth/strategies/authStrategy.js +2 -0
  144. package/dist/mcp-server/transports/auth/strategies/authStrategy.js.map +1 -0
  145. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.d.ts +14 -0
  146. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.d.ts.map +1 -0
  147. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js +86 -0
  148. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js.map +1 -0
  149. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts +14 -0
  150. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts.map +1 -0
  151. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js +113 -0
  152. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js.map +1 -0
  153. package/dist/mcp-server/transports/http/httpErrorHandler.d.ts +25 -0
  154. package/dist/mcp-server/transports/http/httpErrorHandler.d.ts.map +1 -0
  155. package/dist/mcp-server/transports/http/httpErrorHandler.js +112 -0
  156. package/dist/mcp-server/transports/http/httpErrorHandler.js.map +1 -0
  157. package/dist/mcp-server/transports/http/httpTransport.d.ts +47 -0
  158. package/dist/mcp-server/transports/http/httpTransport.d.ts.map +1 -0
  159. package/dist/mcp-server/transports/http/httpTransport.js +396 -0
  160. package/dist/mcp-server/transports/http/httpTransport.js.map +1 -0
  161. package/dist/mcp-server/transports/http/httpTypes.d.ts +17 -0
  162. package/dist/mcp-server/transports/http/httpTypes.d.ts.map +1 -0
  163. package/dist/mcp-server/transports/http/httpTypes.js +2 -0
  164. package/dist/mcp-server/transports/http/httpTypes.js.map +1 -0
  165. package/dist/mcp-server/transports/http/protectedResourceMetadata.d.ts +21 -0
  166. package/dist/mcp-server/transports/http/protectedResourceMetadata.d.ts.map +1 -0
  167. package/dist/mcp-server/transports/http/protectedResourceMetadata.js +44 -0
  168. package/dist/mcp-server/transports/http/protectedResourceMetadata.js.map +1 -0
  169. package/dist/mcp-server/transports/http/sessionIdUtils.d.ts +33 -0
  170. package/dist/mcp-server/transports/http/sessionIdUtils.d.ts.map +1 -0
  171. package/dist/mcp-server/transports/http/sessionIdUtils.js +54 -0
  172. package/dist/mcp-server/transports/http/sessionIdUtils.js.map +1 -0
  173. package/dist/mcp-server/transports/http/sessionStore.d.ts +87 -0
  174. package/dist/mcp-server/transports/http/sessionStore.d.ts.map +1 -0
  175. package/dist/mcp-server/transports/http/sessionStore.js +209 -0
  176. package/dist/mcp-server/transports/http/sessionStore.js.map +1 -0
  177. package/dist/mcp-server/transports/manager.d.ts +22 -0
  178. package/dist/mcp-server/transports/manager.d.ts.map +1 -0
  179. package/dist/mcp-server/transports/manager.js +62 -0
  180. package/dist/mcp-server/transports/manager.js.map +1 -0
  181. package/dist/mcp-server/transports/stdio/stdioTransport.d.ts +44 -0
  182. package/dist/mcp-server/transports/stdio/stdioTransport.d.ts.map +1 -0
  183. package/dist/mcp-server/transports/stdio/stdioTransport.js +63 -0
  184. package/dist/mcp-server/transports/stdio/stdioTransport.js.map +1 -0
  185. package/dist/services/graph/core/GraphService.d.ts +205 -0
  186. package/dist/services/graph/core/GraphService.d.ts.map +1 -0
  187. package/dist/services/graph/core/GraphService.js +231 -0
  188. package/dist/services/graph/core/GraphService.js.map +1 -0
  189. package/dist/services/graph/core/IGraphProvider.d.ts +295 -0
  190. package/dist/services/graph/core/IGraphProvider.d.ts.map +1 -0
  191. package/dist/services/graph/core/IGraphProvider.js +8 -0
  192. package/dist/services/graph/core/IGraphProvider.js.map +1 -0
  193. package/dist/services/graph/types.d.ts +107 -0
  194. package/dist/services/graph/types.d.ts.map +1 -0
  195. package/dist/services/graph/types.js +8 -0
  196. package/dist/services/graph/types.js.map +1 -0
  197. package/dist/services/llm/core/ILlmProvider.d.ts +86 -0
  198. package/dist/services/llm/core/ILlmProvider.d.ts.map +1 -0
  199. package/dist/services/llm/core/ILlmProvider.js +2 -0
  200. package/dist/services/llm/core/ILlmProvider.js.map +1 -0
  201. package/dist/services/llm/providers/openrouter.provider.d.ts +187 -0
  202. package/dist/services/llm/providers/openrouter.provider.d.ts.map +1 -0
  203. package/dist/services/llm/providers/openrouter.provider.js +302 -0
  204. package/dist/services/llm/providers/openrouter.provider.js.map +1 -0
  205. package/dist/services/llm/types.d.ts +16 -0
  206. package/dist/services/llm/types.d.ts.map +1 -0
  207. package/dist/services/llm/types.js +9 -0
  208. package/dist/services/llm/types.js.map +1 -0
  209. package/dist/services/speech/core/ISpeechProvider.d.ts +92 -0
  210. package/dist/services/speech/core/ISpeechProvider.d.ts.map +1 -0
  211. package/dist/services/speech/core/ISpeechProvider.js +34 -0
  212. package/dist/services/speech/core/ISpeechProvider.js.map +1 -0
  213. package/dist/services/speech/core/SpeechService.d.ts +87 -0
  214. package/dist/services/speech/core/SpeechService.d.ts.map +1 -0
  215. package/dist/services/speech/core/SpeechService.js +135 -0
  216. package/dist/services/speech/core/SpeechService.js.map +1 -0
  217. package/dist/services/speech/providers/elevenlabs.provider.d.ts +77 -0
  218. package/dist/services/speech/providers/elevenlabs.provider.d.ts.map +1 -0
  219. package/dist/services/speech/providers/elevenlabs.provider.js +199 -0
  220. package/dist/services/speech/providers/elevenlabs.provider.js.map +1 -0
  221. package/dist/services/speech/providers/whisper.provider.d.ts +94 -0
  222. package/dist/services/speech/providers/whisper.provider.d.ts.map +1 -0
  223. package/dist/services/speech/providers/whisper.provider.js +240 -0
  224. package/dist/services/speech/providers/whisper.provider.js.map +1 -0
  225. package/dist/services/speech/types.d.ts +173 -0
  226. package/dist/services/speech/types.d.ts.map +1 -0
  227. package/dist/services/speech/types.js +8 -0
  228. package/dist/services/speech/types.js.map +1 -0
  229. package/dist/storage/core/IStorageProvider.d.ts +159 -0
  230. package/dist/storage/core/IStorageProvider.d.ts.map +1 -0
  231. package/dist/storage/core/IStorageProvider.js +2 -0
  232. package/dist/storage/core/IStorageProvider.js.map +1 -0
  233. package/dist/storage/core/StorageService.d.ts +22 -0
  234. package/dist/storage/core/StorageService.d.ts.map +1 -0
  235. package/dist/storage/core/StorageService.js +151 -0
  236. package/dist/storage/core/StorageService.js.map +1 -0
  237. package/dist/storage/core/storageFactory.d.ts +66 -0
  238. package/dist/storage/core/storageFactory.d.ts.map +1 -0
  239. package/dist/storage/core/storageFactory.js +122 -0
  240. package/dist/storage/core/storageFactory.js.map +1 -0
  241. package/dist/storage/core/storageValidation.d.ts +77 -0
  242. package/dist/storage/core/storageValidation.d.ts.map +1 -0
  243. package/dist/storage/core/storageValidation.js +303 -0
  244. package/dist/storage/core/storageValidation.js.map +1 -0
  245. package/dist/storage/providers/cloudflare/d1Provider.d.ts +94 -0
  246. package/dist/storage/providers/cloudflare/d1Provider.d.ts.map +1 -0
  247. package/dist/storage/providers/cloudflare/d1Provider.js +347 -0
  248. package/dist/storage/providers/cloudflare/d1Provider.js.map +1 -0
  249. package/dist/storage/providers/cloudflare/kvProvider.d.ts +21 -0
  250. package/dist/storage/providers/cloudflare/kvProvider.d.ts.map +1 -0
  251. package/dist/storage/providers/cloudflare/kvProvider.js +183 -0
  252. package/dist/storage/providers/cloudflare/kvProvider.js.map +1 -0
  253. package/dist/storage/providers/cloudflare/r2Provider.d.ts +28 -0
  254. package/dist/storage/providers/cloudflare/r2Provider.d.ts.map +1 -0
  255. package/dist/storage/providers/cloudflare/r2Provider.js +222 -0
  256. package/dist/storage/providers/cloudflare/r2Provider.js.map +1 -0
  257. package/dist/storage/providers/fileSystem/fileSystemProvider.d.ts +20 -0
  258. package/dist/storage/providers/fileSystem/fileSystemProvider.d.ts.map +1 -0
  259. package/dist/storage/providers/fileSystem/fileSystemProvider.js +282 -0
  260. package/dist/storage/providers/fileSystem/fileSystemProvider.js.map +1 -0
  261. package/dist/storage/providers/inMemory/inMemoryProvider.d.ts +21 -0
  262. package/dist/storage/providers/inMemory/inMemoryProvider.d.ts.map +1 -0
  263. package/dist/storage/providers/inMemory/inMemoryProvider.js +139 -0
  264. package/dist/storage/providers/inMemory/inMemoryProvider.js.map +1 -0
  265. package/dist/storage/providers/supabase/supabase.types.d.ts +49 -0
  266. package/dist/storage/providers/supabase/supabase.types.d.ts.map +1 -0
  267. package/dist/storage/providers/supabase/supabase.types.js +8 -0
  268. package/dist/storage/providers/supabase/supabase.types.js.map +1 -0
  269. package/dist/storage/providers/supabase/supabaseProvider.d.ts +24 -0
  270. package/dist/storage/providers/supabase/supabaseProvider.d.ts.map +1 -0
  271. package/dist/storage/providers/supabase/supabaseProvider.js +209 -0
  272. package/dist/storage/providers/supabase/supabaseProvider.js.map +1 -0
  273. package/dist/testing/index.d.ts +53 -0
  274. package/dist/testing/index.d.ts.map +1 -0
  275. package/dist/testing/index.js +132 -0
  276. package/dist/testing/index.js.map +1 -0
  277. package/dist/types-global/errors.d.ts +83 -0
  278. package/dist/types-global/errors.d.ts.map +1 -0
  279. package/dist/types-global/errors.js +113 -0
  280. package/dist/types-global/errors.js.map +1 -0
  281. package/dist/utils/formatting/diffFormatter.d.ts +227 -0
  282. package/dist/utils/formatting/diffFormatter.d.ts.map +1 -0
  283. package/dist/utils/formatting/diffFormatter.js +369 -0
  284. package/dist/utils/formatting/diffFormatter.js.map +1 -0
  285. package/dist/utils/formatting/index.d.ts +9 -0
  286. package/dist/utils/formatting/index.d.ts.map +1 -0
  287. package/dist/utils/formatting/index.js +9 -0
  288. package/dist/utils/formatting/index.js.map +1 -0
  289. package/dist/utils/formatting/markdownBuilder.d.ts +543 -0
  290. package/dist/utils/formatting/markdownBuilder.d.ts.map +1 -0
  291. package/dist/utils/formatting/markdownBuilder.js +674 -0
  292. package/dist/utils/formatting/markdownBuilder.js.map +1 -0
  293. package/dist/utils/formatting/tableFormatter.d.ts +261 -0
  294. package/dist/utils/formatting/tableFormatter.d.ts.map +1 -0
  295. package/dist/utils/formatting/tableFormatter.js +456 -0
  296. package/dist/utils/formatting/tableFormatter.js.map +1 -0
  297. package/dist/utils/formatting/treeFormatter.d.ts +344 -0
  298. package/dist/utils/formatting/treeFormatter.d.ts.map +1 -0
  299. package/dist/utils/formatting/treeFormatter.js +400 -0
  300. package/dist/utils/formatting/treeFormatter.js.map +1 -0
  301. package/dist/utils/internal/encoding.d.ts +42 -0
  302. package/dist/utils/internal/encoding.d.ts.map +1 -0
  303. package/dist/utils/internal/encoding.js +87 -0
  304. package/dist/utils/internal/encoding.js.map +1 -0
  305. package/dist/utils/internal/error-handler/errorHandler.d.ts +140 -0
  306. package/dist/utils/internal/error-handler/errorHandler.d.ts.map +1 -0
  307. package/dist/utils/internal/error-handler/errorHandler.js +318 -0
  308. package/dist/utils/internal/error-handler/errorHandler.js.map +1 -0
  309. package/dist/utils/internal/error-handler/helpers.d.ts +98 -0
  310. package/dist/utils/internal/error-handler/helpers.d.ts.map +1 -0
  311. package/dist/utils/internal/error-handler/helpers.js +214 -0
  312. package/dist/utils/internal/error-handler/helpers.js.map +1 -0
  313. package/dist/utils/internal/error-handler/mappings.d.ts +85 -0
  314. package/dist/utils/internal/error-handler/mappings.d.ts.map +1 -0
  315. package/dist/utils/internal/error-handler/mappings.js +234 -0
  316. package/dist/utils/internal/error-handler/mappings.js.map +1 -0
  317. package/dist/utils/internal/error-handler/types.d.ts +160 -0
  318. package/dist/utils/internal/error-handler/types.d.ts.map +1 -0
  319. package/dist/utils/internal/error-handler/types.js +6 -0
  320. package/dist/utils/internal/error-handler/types.js.map +1 -0
  321. package/dist/utils/internal/health.d.ts +60 -0
  322. package/dist/utils/internal/health.d.ts.map +1 -0
  323. package/dist/utils/internal/health.js +46 -0
  324. package/dist/utils/internal/health.js.map +1 -0
  325. package/dist/utils/internal/logger.d.ts +300 -0
  326. package/dist/utils/internal/logger.d.ts.map +1 -0
  327. package/dist/utils/internal/logger.js +573 -0
  328. package/dist/utils/internal/logger.js.map +1 -0
  329. package/dist/utils/internal/performance.d.ts +78 -0
  330. package/dist/utils/internal/performance.d.ts.map +1 -0
  331. package/dist/utils/internal/performance.js +227 -0
  332. package/dist/utils/internal/performance.js.map +1 -0
  333. package/dist/utils/internal/requestContext.d.ts +200 -0
  334. package/dist/utils/internal/requestContext.d.ts.map +1 -0
  335. package/dist/utils/internal/requestContext.js +163 -0
  336. package/dist/utils/internal/requestContext.js.map +1 -0
  337. package/dist/utils/internal/runtime.d.ts +49 -0
  338. package/dist/utils/internal/runtime.d.ts.map +1 -0
  339. package/dist/utils/internal/runtime.js +90 -0
  340. package/dist/utils/internal/runtime.js.map +1 -0
  341. package/dist/utils/internal/startupBanner.d.ts +23 -0
  342. package/dist/utils/internal/startupBanner.d.ts.map +1 -0
  343. package/dist/utils/internal/startupBanner.js +34 -0
  344. package/dist/utils/internal/startupBanner.js.map +1 -0
  345. package/dist/utils/metrics/tokenCounter.d.ts +97 -0
  346. package/dist/utils/metrics/tokenCounter.d.ts.map +1 -0
  347. package/dist/utils/metrics/tokenCounter.js +162 -0
  348. package/dist/utils/metrics/tokenCounter.js.map +1 -0
  349. package/dist/utils/network/fetchWithTimeout.d.ts +91 -0
  350. package/dist/utils/network/fetchWithTimeout.d.ts.map +1 -0
  351. package/dist/utils/network/fetchWithTimeout.js +305 -0
  352. package/dist/utils/network/fetchWithTimeout.js.map +1 -0
  353. package/dist/utils/pagination/pagination.d.ts +157 -0
  354. package/dist/utils/pagination/pagination.d.ts.map +1 -0
  355. package/dist/utils/pagination/pagination.js +191 -0
  356. package/dist/utils/pagination/pagination.js.map +1 -0
  357. package/dist/utils/parsing/csvParser.d.ts +84 -0
  358. package/dist/utils/parsing/csvParser.d.ts.map +1 -0
  359. package/dist/utils/parsing/csvParser.js +132 -0
  360. package/dist/utils/parsing/csvParser.js.map +1 -0
  361. package/dist/utils/parsing/dateParser.d.ts +103 -0
  362. package/dist/utils/parsing/dateParser.d.ts.map +1 -0
  363. package/dist/utils/parsing/dateParser.js +142 -0
  364. package/dist/utils/parsing/dateParser.js.map +1 -0
  365. package/dist/utils/parsing/frontmatterParser.d.ts +91 -0
  366. package/dist/utils/parsing/frontmatterParser.d.ts.map +1 -0
  367. package/dist/utils/parsing/frontmatterParser.js +163 -0
  368. package/dist/utils/parsing/frontmatterParser.js.map +1 -0
  369. package/dist/utils/parsing/index.d.ts +15 -0
  370. package/dist/utils/parsing/index.d.ts.map +1 -0
  371. package/dist/utils/parsing/index.js +15 -0
  372. package/dist/utils/parsing/index.js.map +1 -0
  373. package/dist/utils/parsing/jsonParser.d.ts +115 -0
  374. package/dist/utils/parsing/jsonParser.d.ts.map +1 -0
  375. package/dist/utils/parsing/jsonParser.js +177 -0
  376. package/dist/utils/parsing/jsonParser.js.map +1 -0
  377. package/dist/utils/parsing/pdfParser.d.ts +563 -0
  378. package/dist/utils/parsing/pdfParser.d.ts.map +1 -0
  379. package/dist/utils/parsing/pdfParser.js +775 -0
  380. package/dist/utils/parsing/pdfParser.js.map +1 -0
  381. package/dist/utils/parsing/thinkBlock.d.ts +31 -0
  382. package/dist/utils/parsing/thinkBlock.d.ts.map +1 -0
  383. package/dist/utils/parsing/thinkBlock.js +31 -0
  384. package/dist/utils/parsing/thinkBlock.js.map +1 -0
  385. package/dist/utils/parsing/xmlParser.d.ts +69 -0
  386. package/dist/utils/parsing/xmlParser.d.ts.map +1 -0
  387. package/dist/utils/parsing/xmlParser.js +140 -0
  388. package/dist/utils/parsing/xmlParser.js.map +1 -0
  389. package/dist/utils/parsing/yamlParser.d.ts +64 -0
  390. package/dist/utils/parsing/yamlParser.d.ts.map +1 -0
  391. package/dist/utils/parsing/yamlParser.js +129 -0
  392. package/dist/utils/parsing/yamlParser.js.map +1 -0
  393. package/dist/utils/scheduling/scheduler.d.ts +174 -0
  394. package/dist/utils/scheduling/scheduler.d.ts.map +1 -0
  395. package/dist/utils/scheduling/scheduler.js +248 -0
  396. package/dist/utils/scheduling/scheduler.js.map +1 -0
  397. package/dist/utils/security/idGenerator.d.ts +189 -0
  398. package/dist/utils/security/idGenerator.d.ts.map +1 -0
  399. package/dist/utils/security/idGenerator.js +301 -0
  400. package/dist/utils/security/idGenerator.js.map +1 -0
  401. package/dist/utils/security/index.d.ts +8 -0
  402. package/dist/utils/security/index.d.ts.map +1 -0
  403. package/dist/utils/security/index.js +8 -0
  404. package/dist/utils/security/index.js.map +1 -0
  405. package/dist/utils/security/rateLimiter.d.ts +171 -0
  406. package/dist/utils/security/rateLimiter.d.ts.map +1 -0
  407. package/dist/utils/security/rateLimiter.js +294 -0
  408. package/dist/utils/security/rateLimiter.js.map +1 -0
  409. package/dist/utils/security/sanitization.d.ts +430 -0
  410. package/dist/utils/security/sanitization.d.ts.map +1 -0
  411. package/dist/utils/security/sanitization.js +759 -0
  412. package/dist/utils/security/sanitization.js.map +1 -0
  413. package/dist/utils/telemetry/index.d.ts +12 -0
  414. package/dist/utils/telemetry/index.d.ts.map +1 -0
  415. package/dist/utils/telemetry/index.js +12 -0
  416. package/dist/utils/telemetry/index.js.map +1 -0
  417. package/dist/utils/telemetry/instrumentation.d.ts +62 -0
  418. package/dist/utils/telemetry/instrumentation.d.ts.map +1 -0
  419. package/dist/utils/telemetry/instrumentation.js +223 -0
  420. package/dist/utils/telemetry/instrumentation.js.map +1 -0
  421. package/dist/utils/telemetry/metrics.d.ts +170 -0
  422. package/dist/utils/telemetry/metrics.d.ts.map +1 -0
  423. package/dist/utils/telemetry/metrics.js +205 -0
  424. package/dist/utils/telemetry/metrics.js.map +1 -0
  425. package/dist/utils/telemetry/semconv.d.ts +147 -0
  426. package/dist/utils/telemetry/semconv.d.ts.map +1 -0
  427. package/dist/utils/telemetry/semconv.js +159 -0
  428. package/dist/utils/telemetry/semconv.js.map +1 -0
  429. package/dist/utils/telemetry/trace.d.ts +141 -0
  430. package/dist/utils/telemetry/trace.d.ts.map +1 -0
  431. package/dist/utils/telemetry/trace.js +193 -0
  432. package/dist/utils/telemetry/trace.js.map +1 -0
  433. package/dist/utils/types/guards.d.ts +209 -0
  434. package/dist/utils/types/guards.d.ts.map +1 -0
  435. package/dist/utils/types/guards.js +229 -0
  436. package/dist/utils/types/guards.js.map +1 -0
  437. package/dist/utils/types/index.d.ts +6 -0
  438. package/dist/utils/types/index.d.ts.map +1 -0
  439. package/dist/utils/types/index.js +6 -0
  440. package/dist/utils/types/index.js.map +1 -0
  441. package/dist/worker.d.ts +59 -0
  442. package/dist/worker.d.ts.map +1 -0
  443. package/dist/worker.js +216 -0
  444. package/dist/worker.js.map +1 -0
  445. package/package.json +377 -0
  446. package/skills/README.md +38 -0
  447. package/skills/add-export/SKILL.md +49 -0
  448. package/skills/add-prompt/SKILL.md +97 -0
  449. package/skills/add-provider/SKILL.md +53 -0
  450. package/skills/add-resource/SKILL.md +107 -0
  451. package/skills/add-service/SKILL.md +113 -0
  452. package/skills/add-tool/SKILL.md +110 -0
  453. package/skills/api-auth/SKILL.md +173 -0
  454. package/skills/api-config/SKILL.md +68 -0
  455. package/skills/api-context/SKILL.md +321 -0
  456. package/skills/api-errors/SKILL.md +146 -0
  457. package/skills/api-services/SKILL.md +24 -0
  458. package/skills/api-services/references/graph.md +124 -0
  459. package/skills/api-services/references/llm.md +46 -0
  460. package/skills/api-services/references/speech.md +72 -0
  461. package/skills/api-testing/SKILL.md +263 -0
  462. package/skills/api-utils/SKILL.md +106 -0
  463. package/skills/api-utils/references/formatting.md +237 -0
  464. package/skills/api-utils/references/parsing.md +263 -0
  465. package/skills/api-utils/references/security.md +226 -0
  466. package/skills/api-workers/SKILL.md +165 -0
  467. package/skills/devcheck/SKILL.md +31 -0
  468. package/skills/maintenance/SKILL.md +52 -0
  469. package/skills/migrate-mcp-ts-template/SKILL.md +131 -0
  470. package/skills/release/SKILL.md +67 -0
  471. package/skills/setup/SKILL.md +89 -0
  472. package/skills/walkthrough-init/SKILL.md +50 -0
  473. package/templates/.env.example +17 -0
  474. package/templates/AGENTS.md +113 -0
  475. package/templates/CLAUDE.md +113 -0
  476. package/templates/_tsconfig.json +33 -0
  477. package/templates/biome.template.json +43 -0
  478. package/templates/package.json +26 -0
  479. package/templates/src/index.ts +16 -0
  480. package/templates/src/mcp-server/prompts/definitions/echo.prompt.ts +19 -0
  481. package/templates/src/mcp-server/resources/definitions/echo.resource.ts +30 -0
  482. package/templates/src/mcp-server/tools/definitions/echo.tool.ts +24 -0
  483. package/templates/vitest.config.ts +12 -0
  484. package/tsconfig.base.json +44 -0
  485. package/vitest.config.base.ts +38 -0
@@ -0,0 +1,90 @@
1
+ /**
2
+ * @fileoverview Runtime capability detection for multi-environment support.
3
+ * Detects presence of Node features, Web/Workers APIs, and common globals.
4
+ * @module src/utils/internal/runtime
5
+ */
6
+ // Best-effort static detection without throwing in restricted envs
7
+ const safeHas = (key) => {
8
+ try {
9
+ // @ts-expect-error index access on globalThis
10
+ return typeof globalThis[key] !== 'undefined';
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ };
16
+ /**
17
+ * Safely checks if process.versions.node exists and is a string.
18
+ * Uses try-catch to handle environments where property access might be restricted.
19
+ */
20
+ const hasNodeVersion = () => {
21
+ try {
22
+ return (typeof process !== 'undefined' &&
23
+ typeof process.versions === 'object' &&
24
+ process.versions !== null &&
25
+ typeof process.versions.node === 'string');
26
+ }
27
+ catch {
28
+ return false;
29
+ }
30
+ };
31
+ /**
32
+ * Safely checks if globalThis.performance.now is a function.
33
+ * Uses try-catch to handle environments where property access might be restricted.
34
+ */
35
+ const hasPerformanceNowFunction = () => {
36
+ try {
37
+ const perf = globalThis.performance;
38
+ return typeof perf === 'object' && perf !== null && typeof perf.now === 'function';
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ };
44
+ const isNode = hasNodeVersion();
45
+ const isBun = isNode && typeof process?.versions?.bun === 'string';
46
+ const hasProcess = typeof process !== 'undefined';
47
+ const hasBuffer = typeof Buffer !== 'undefined';
48
+ const hasTextEncoder = safeHas('TextEncoder');
49
+ const hasPerformanceNow = hasPerformanceNowFunction();
50
+ /**
51
+ * Safely checks if WorkerGlobalScope exists.
52
+ * Cloudflare Workers and other worker environments expose this.
53
+ */
54
+ const hasWorkerGlobalScope = () => {
55
+ try {
56
+ return 'WorkerGlobalScope' in globalThis;
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ };
62
+ // Cloudflare Workers expose "Web Worker"-like environment (self, caches, fetch, etc.)
63
+ const isWorkerLike = !isNode && hasWorkerGlobalScope();
64
+ const isBrowserLike = !isNode && !isWorkerLike && safeHas('window');
65
+ /**
66
+ * Singleton snapshot of runtime capabilities for the current environment.
67
+ * Computed once at module load; safe to read at any time without async.
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * import { runtimeCaps } from './runtime.js';
72
+ *
73
+ * if (runtimeCaps.hasBuffer) {
74
+ * // Node.js / Bun path — use Buffer for encoding
75
+ * } else {
76
+ * // Worker / browser path — use Web APIs
77
+ * }
78
+ * ```
79
+ */
80
+ export const runtimeCaps = {
81
+ isNode,
82
+ isBun,
83
+ isWorkerLike,
84
+ isBrowserLike,
85
+ hasProcess,
86
+ hasBuffer,
87
+ hasTextEncoder,
88
+ hasPerformanceNow,
89
+ };
90
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/utils/internal/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8BH,mEAAmE;AACnE,MAAM,OAAO,GAAG,CAAC,GAAW,EAAW,EAAE;IACvC,IAAI,CAAC;QACH,8CAA8C;QAC9C,OAAO,OAAO,UAAU,CAAC,GAAG,CAAC,KAAK,WAAW,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,cAAc,GAAG,GAAY,EAAE;IACnC,IAAI,CAAC;QACH,OAAO,CACL,OAAO,OAAO,KAAK,WAAW;YAC9B,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;YACpC,OAAO,CAAC,QAAQ,KAAK,IAAI;YACzB,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAC1C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,yBAAyB,GAAG,GAAY,EAAE;IAC9C,IAAI,CAAC;QACH,MAAM,IAAI,GAAI,UAAkD,CAAC,WAAW,CAAC;QAC7E,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,UAAU,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;AAChC,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,QAAQ,CAAC;AACnE,MAAM,UAAU,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;AAChD,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAC9C,MAAM,iBAAiB,GAAG,yBAAyB,EAAE,CAAC;AAEtD;;;GAGG;AACH,MAAM,oBAAoB,GAAG,GAAY,EAAE;IACzC,IAAI,CAAC;QACH,OAAO,mBAAmB,IAAI,UAAU,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,sFAAsF;AACtF,MAAM,YAAY,GAAG,CAAC,MAAM,IAAI,oBAAoB,EAAE,CAAC;AACvD,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEpE;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,WAAW,GAAwB;IAC9C,MAAM;IACN,KAAK;IACL,YAAY;IACZ,aAAa;IACb,UAAU;IACV,SAAS;IACT,cAAc;IACd,iBAAiB;CAClB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @fileoverview Utility for displaying startup banners in TTY environments.
3
+ * Provides a centralized way to show user-facing messages during server initialization
4
+ * while preventing output pollution in non-interactive environments (CI, pipes, STDIO transport).
5
+ * @module src/utils/internal/startupBanner
6
+ */
7
+ /**
8
+ * Displays a startup banner message to the console only if running in a TTY environment.
9
+ * This prevents polluting STDIO transport, piped output, or CI/CD logs.
10
+ *
11
+ * In STDIO mode, the banner is written to stderr to avoid polluting stdout, which is
12
+ * reserved for MCP JSON-RPC protocol messages.
13
+ *
14
+ * @param message - The banner message to display
15
+ * @param transportType - The transport type ('stdio' or 'http'). If 'stdio', uses stderr.
16
+ * @example
17
+ * ```typescript
18
+ * logStartupBanner('🚀 MCP Server running at: http://localhost:3010', 'http');
19
+ * logStartupBanner('🚀 MCP Server running in STDIO mode', 'stdio');
20
+ * ```
21
+ */
22
+ export declare function logStartupBanner(message: string, transportType?: 'stdio' | 'http'): void;
23
+ //# sourceMappingURL=startupBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startupBanner.d.ts","sourceRoot":"","sources":["../../../src/utils/internal/startupBanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAUxF"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @fileoverview Utility for displaying startup banners in TTY environments.
3
+ * Provides a centralized way to show user-facing messages during server initialization
4
+ * while preventing output pollution in non-interactive environments (CI, pipes, STDIO transport).
5
+ * @module src/utils/internal/startupBanner
6
+ */
7
+ /**
8
+ * Displays a startup banner message to the console only if running in a TTY environment.
9
+ * This prevents polluting STDIO transport, piped output, or CI/CD logs.
10
+ *
11
+ * In STDIO mode, the banner is written to stderr to avoid polluting stdout, which is
12
+ * reserved for MCP JSON-RPC protocol messages.
13
+ *
14
+ * @param message - The banner message to display
15
+ * @param transportType - The transport type ('stdio' or 'http'). If 'stdio', uses stderr.
16
+ * @example
17
+ * ```typescript
18
+ * logStartupBanner('🚀 MCP Server running at: http://localhost:3010', 'http');
19
+ * logStartupBanner('🚀 MCP Server running in STDIO mode', 'stdio');
20
+ * ```
21
+ */
22
+ export function logStartupBanner(message, transportType) {
23
+ // Guard against environments where process.stdout may not exist (e.g. Cloudflare Workers)
24
+ if (typeof process === 'undefined' || !process.stdout?.isTTY)
25
+ return;
26
+ // In STDIO mode, use stderr to avoid polluting stdout (which is reserved for MCP JSON-RPC)
27
+ if (transportType === 'stdio') {
28
+ console.error(message);
29
+ }
30
+ else {
31
+ console.log(message);
32
+ }
33
+ }
34
+ //# sourceMappingURL=startupBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startupBanner.js","sourceRoot":"","sources":["../../../src/utils/internal/startupBanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,aAAgC;IAChF,0FAA0F;IAC1F,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK;QAAE,OAAO;IAErE,2FAA2F;IAC3F,IAAI,aAAa,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,97 @@
1
+ import type { RequestContext } from '../../utils/internal/requestContext.js';
2
+ /**
3
+ * Minimal chat message shape used for token counting, intentionally provider-agnostic.
4
+ * Covers the common subset of OpenAI-style chat message fields without depending on
5
+ * any specific SDK types.
6
+ */
7
+ export type ChatMessage = {
8
+ /** The message author role (e.g. `'user'`, `'assistant'`, `'tool'`, `'system'`). */
9
+ role: string;
10
+ /**
11
+ * Message body. Either a plain string, a multi-part content array (e.g. for vision
12
+ * or tool-result messages), or `null` when the assistant emits tool calls with no
13
+ * accompanying text.
14
+ */
15
+ content: string | Array<{
16
+ type: string;
17
+ text?: string;
18
+ [k: string]: unknown;
19
+ }> | null;
20
+ /** Optional display name; when present, adds `tokensPerName` overhead per model heuristics. */
21
+ name?: string;
22
+ /**
23
+ * Tool calls emitted by an `assistant` message. Only `function`-type calls are counted;
24
+ * the function name and serialized arguments each contribute to the token total.
25
+ */
26
+ tool_calls?: Array<{
27
+ id?: string;
28
+ type?: string;
29
+ function?: {
30
+ name?: string;
31
+ arguments?: string;
32
+ };
33
+ }> | null;
34
+ /** Tool result correlation ID present on `tool` role messages. Counted as plain text. */
35
+ tool_call_id?: string | null;
36
+ };
37
+ /**
38
+ * Heuristic parameters that control how tokens are estimated for a specific model.
39
+ * Add entries to the internal `HEURISTICS` map to calibrate per-model behavior.
40
+ */
41
+ export interface ModelHeuristics {
42
+ /** Average number of characters per token. ~4 for English prose on most GPT-family models. */
43
+ charsPerToken: number;
44
+ /**
45
+ * Fixed token overhead added once per call to {@link countChatTokens} to account for the
46
+ * assistant reply primer (`<|im_start|>assistant`).
47
+ */
48
+ replyPrimer: number;
49
+ /** Fixed token overhead added per message (e.g. role delimiters). Typically 3 for gpt-4o. */
50
+ tokensPerMessage: number;
51
+ /** Extra tokens added when a message includes a `name` field. Typically 1 for gpt-4o. */
52
+ tokensPerName: number;
53
+ }
54
+ /**
55
+ * Estimates the number of tokens in a plain-text string using model-specific character-per-token
56
+ * heuristics. Whitespace is normalized before counting. No external dependencies are required.
57
+ *
58
+ * @param text - The input string to estimate. Empty or whitespace-only strings return `0`.
59
+ * @param context - Optional request context forwarded to the error handler for correlated logging.
60
+ * @param model - Model identifier used to look up heuristics (e.g. `'gpt-4o'`). Falls back to
61
+ * `'gpt-4o'` when omitted or unrecognized.
62
+ * @returns Estimated token count, rounded up to the nearest integer.
63
+ * @throws {McpError} With `InternalError` code if the heuristic calculation fails unexpectedly.
64
+ * @example
65
+ * const tokens = await countTokens('Hello, world!');
66
+ * // Returns approximately 4 (13 chars / 4 charsPerToken, rounded up)
67
+ */
68
+ export declare function countTokens(text: string, context?: RequestContext, model?: string): Promise<number>;
69
+ /**
70
+ * Estimates the total number of tokens for an array of chat messages using the same
71
+ * heuristics as OpenAI's token-counting cookbook for gpt-4o-family models.
72
+ *
73
+ * Per-message overhead (`tokensPerMessage`) and an assistant reply primer (`replyPrimer`)
74
+ * are added on top of the raw content estimates. Counting logic:
75
+ * - String `content`: normalized character count divided by `charsPerToken`.
76
+ * - Array `content`: only `type: 'text'` parts are counted; other part types emit a warning
77
+ * and are skipped.
78
+ * - `name` field: adds `tokensPerName` plus the name's character-count estimate.
79
+ * - `tool_calls` (assistant role): function name and serialized arguments are counted.
80
+ * - `tool_call_id` (tool role): counted as plain text.
81
+ *
82
+ * @param messages - Ordered array of chat messages to estimate. May be empty (returns
83
+ * `replyPrimer` tokens).
84
+ * @param context - Optional request context forwarded to the error handler for correlated logging.
85
+ * @param model - Model identifier used to look up heuristics (e.g. `'gpt-4o-mini'`). Falls back
86
+ * to `'gpt-4o'` when omitted or unrecognized.
87
+ * @returns Estimated total token count across all messages, including per-message overhead and
88
+ * the reply primer.
89
+ * @throws {McpError} With `InternalError` code if the heuristic calculation fails unexpectedly.
90
+ * @example
91
+ * const tokens = await countChatTokens([
92
+ * { role: 'user', content: 'What is 2 + 2?' },
93
+ * { role: 'assistant', content: 'It is 4.' },
94
+ * ]);
95
+ */
96
+ export declare function countChatTokens(messages: ReadonlyArray<ChatMessage>, context?: RequestContext, model?: string): Promise<number>;
97
+ //# sourceMappingURL=tokenCounter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenCounter.d.ts","sourceRoot":"","sources":["../../../src/utils/metrics/tokenCounter.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IACtF,+FAA+F;IAC/F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAClD,CAAC,GAAG,IAAI,CAAC;IACV,yFAAyF;IACzF,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,6FAA6F;IAC7F,gBAAgB,EAAE,MAAM,CAAC;IACzB,yFAAyF;IACzF,aAAa,EAAE,MAAM,CAAC;CACvB;AA2CD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,cAAc,EACxB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,aAAa,CAAC,WAAW,CAAC,EACpC,OAAO,CAAC,EAAE,cAAc,EACxB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAgEjB"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * @fileoverview Lightweight, dependency-free token counters with model-configurable heuristics.
3
+ * This avoids native/WASM dependencies (e.g., tiktoken) while providing a stable extension point
4
+ * to adjust per-model tokenization and overhead later.
5
+ * @module src/utils/metrics/tokenCounter
6
+ */
7
+ import { JsonRpcErrorCode } from '../../types-global/errors.js';
8
+ import { ErrorHandler } from '../../utils/internal/error-handler/errorHandler.js';
9
+ import { logger } from '../../utils/internal/logger.js';
10
+ const DEFAULT_MODEL = 'gpt-4o';
11
+ // Known heuristics; tweak as you calibrate
12
+ const HEURISTICS = {
13
+ 'gpt-4o': {
14
+ charsPerToken: 4,
15
+ tokensPerMessage: 3,
16
+ tokensPerName: 1,
17
+ replyPrimer: 3,
18
+ },
19
+ 'gpt-4o-mini': {
20
+ charsPerToken: 4,
21
+ tokensPerMessage: 3,
22
+ tokensPerName: 1,
23
+ replyPrimer: 3,
24
+ },
25
+ default: {
26
+ charsPerToken: 4,
27
+ tokensPerMessage: 3,
28
+ tokensPerName: 1,
29
+ replyPrimer: 3,
30
+ },
31
+ };
32
+ function getModelHeuristics(model) {
33
+ const key = (model ?? DEFAULT_MODEL).toLowerCase();
34
+ const found = HEURISTICS[key];
35
+ return (found ?? HEURISTICS.default);
36
+ }
37
+ function nonEmptyString(s) {
38
+ return typeof s === 'string' && s.length > 0;
39
+ }
40
+ function approxTokenCount(text, charsPerToken) {
41
+ if (!text)
42
+ return 0;
43
+ const normalized = text.replace(/\s+/g, ' ').trim();
44
+ if (!normalized)
45
+ return 0;
46
+ return Math.ceil(normalized.length / Math.max(1, charsPerToken));
47
+ }
48
+ /**
49
+ * Estimates the number of tokens in a plain-text string using model-specific character-per-token
50
+ * heuristics. Whitespace is normalized before counting. No external dependencies are required.
51
+ *
52
+ * @param text - The input string to estimate. Empty or whitespace-only strings return `0`.
53
+ * @param context - Optional request context forwarded to the error handler for correlated logging.
54
+ * @param model - Model identifier used to look up heuristics (e.g. `'gpt-4o'`). Falls back to
55
+ * `'gpt-4o'` when omitted or unrecognized.
56
+ * @returns Estimated token count, rounded up to the nearest integer.
57
+ * @throws {McpError} With `InternalError` code if the heuristic calculation fails unexpectedly.
58
+ * @example
59
+ * const tokens = await countTokens('Hello, world!');
60
+ * // Returns approximately 4 (13 chars / 4 charsPerToken, rounded up)
61
+ */
62
+ export async function countTokens(text, context, model) {
63
+ return await ErrorHandler.tryCatch(() => {
64
+ const h = getModelHeuristics(model);
65
+ return approxTokenCount(text ?? '', h.charsPerToken);
66
+ }, {
67
+ operation: 'countTokens',
68
+ ...(context && { context }),
69
+ input: {
70
+ textSample: nonEmptyString(text)
71
+ ? text.length > 53
72
+ ? `${text.slice(0, 50)}...`
73
+ : text
74
+ : '',
75
+ },
76
+ errorCode: JsonRpcErrorCode.InternalError,
77
+ });
78
+ }
79
+ /**
80
+ * Estimates the total number of tokens for an array of chat messages using the same
81
+ * heuristics as OpenAI's token-counting cookbook for gpt-4o-family models.
82
+ *
83
+ * Per-message overhead (`tokensPerMessage`) and an assistant reply primer (`replyPrimer`)
84
+ * are added on top of the raw content estimates. Counting logic:
85
+ * - String `content`: normalized character count divided by `charsPerToken`.
86
+ * - Array `content`: only `type: 'text'` parts are counted; other part types emit a warning
87
+ * and are skipped.
88
+ * - `name` field: adds `tokensPerName` plus the name's character-count estimate.
89
+ * - `tool_calls` (assistant role): function name and serialized arguments are counted.
90
+ * - `tool_call_id` (tool role): counted as plain text.
91
+ *
92
+ * @param messages - Ordered array of chat messages to estimate. May be empty (returns
93
+ * `replyPrimer` tokens).
94
+ * @param context - Optional request context forwarded to the error handler for correlated logging.
95
+ * @param model - Model identifier used to look up heuristics (e.g. `'gpt-4o-mini'`). Falls back
96
+ * to `'gpt-4o'` when omitted or unrecognized.
97
+ * @returns Estimated total token count across all messages, including per-message overhead and
98
+ * the reply primer.
99
+ * @throws {McpError} With `InternalError` code if the heuristic calculation fails unexpectedly.
100
+ * @example
101
+ * const tokens = await countChatTokens([
102
+ * { role: 'user', content: 'What is 2 + 2?' },
103
+ * { role: 'assistant', content: 'It is 4.' },
104
+ * ]);
105
+ */
106
+ export async function countChatTokens(messages, context, model) {
107
+ return await ErrorHandler.tryCatch(() => {
108
+ const h = getModelHeuristics(model);
109
+ let tokens = 0;
110
+ for (const message of messages) {
111
+ tokens += h.tokensPerMessage;
112
+ // role contribution (very small; approximate as 1)
113
+ tokens += 1;
114
+ // content
115
+ if (typeof message.content === 'string') {
116
+ tokens += approxTokenCount(message.content, h.charsPerToken);
117
+ }
118
+ else if (Array.isArray(message.content)) {
119
+ for (const part of message.content) {
120
+ if (part && part.type === 'text' && nonEmptyString(part.text)) {
121
+ tokens += approxTokenCount(part.text, h.charsPerToken);
122
+ }
123
+ else if (part) {
124
+ logger.warning(`Non-text content part found (type: ${String(part.type)}), token count contribution ignored.`, context);
125
+ }
126
+ }
127
+ }
128
+ // optional name
129
+ if (message.name) {
130
+ tokens += h.tokensPerName;
131
+ tokens += approxTokenCount(message.name, h.charsPerToken);
132
+ }
133
+ // assistant tool calls
134
+ if (message.role === 'assistant' && Array.isArray(message.tool_calls)) {
135
+ for (const toolCall of message.tool_calls) {
136
+ if (toolCall?.type === 'function') {
137
+ if (toolCall.function?.name) {
138
+ tokens += approxTokenCount(toolCall.function.name, h.charsPerToken);
139
+ }
140
+ if (toolCall.function?.arguments) {
141
+ tokens += approxTokenCount(toolCall.function.arguments, h.charsPerToken);
142
+ }
143
+ }
144
+ }
145
+ }
146
+ // tool message id
147
+ if (message.role === 'tool' && message.tool_call_id) {
148
+ tokens += approxTokenCount(message.tool_call_id, h.charsPerToken);
149
+ }
150
+ }
151
+ tokens += h.replyPrimer;
152
+ return tokens;
153
+ }, {
154
+ operation: 'countChatTokens',
155
+ ...(context && { context }),
156
+ input: { messageCount: messages.length },
157
+ errorCode: JsonRpcErrorCode.InternalError,
158
+ });
159
+ }
160
+ // Intentionally no generic helpers; the return above asserts to satisfy
161
+ // TypeScript with noUncheckedIndexedAccess while remaining safe at runtime.
162
+ //# sourceMappingURL=tokenCounter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenCounter.js","sourceRoot":"","sources":["../../../src/utils/metrics/tokenCounter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import type { RequestContext } from '../../utils/internal/requestContext.js';
2
+ /**
3
+ * Options for the `fetchWithTimeout` utility.
4
+ *
5
+ * Extends the standard `RequestInit` type, omitting `signal` (which is managed
6
+ * internally via `AbortController`) and adding SSRF protection and caller-supplied
7
+ * cancellation options.
8
+ */
9
+ export interface FetchWithTimeoutOptions extends Omit<RequestInit, 'signal'> {
10
+ /**
11
+ * When `true`, rejects requests to private/reserved IP ranges and localhost.
12
+ *
13
+ * Use this when fetching user-controlled URLs to prevent SSRF attacks against
14
+ * internal services (e.g., cloud metadata endpoints, internal APIs). Covered
15
+ * ranges include RFC 1918, loopback (127.x, ::1), link-local (169.254.x),
16
+ * CGNAT (100.64–127.x), and known internal hostnames (e.g., `metadata.google.internal`).
17
+ *
18
+ * On Node.js, DNS is also resolved and all A/AAAA records are validated against
19
+ * private ranges before the request is sent. On Workers, only string-based
20
+ * hostname/IP checks apply (no DNS API available).
21
+ *
22
+ * When enabled, redirects are followed manually (up to {@link MAX_SSRF_REDIRECTS}
23
+ * hops) with SSRF validation applied to each redirect target.
24
+ *
25
+ * Default: `false` (no restriction).
26
+ */
27
+ rejectPrivateIPs?: boolean;
28
+ /**
29
+ * An optional external `AbortSignal` (e.g., `ctx.signal` from the request context)
30
+ * to combine with the internal timeout signal. If this signal aborts before the
31
+ * timeout fires, the fetch is cancelled immediately and a `McpError` with code
32
+ * `InternalError` is thrown.
33
+ */
34
+ signal?: AbortSignal;
35
+ }
36
+ /**
37
+ * Fetches a resource with a configurable timeout and optional SSRF protection.
38
+ *
39
+ * Internally manages an `AbortController` that fires after `timeoutMs`. An optional
40
+ * external `signal` (e.g., `ctx.signal`) can be passed via `options` to support
41
+ * early cancellation by the caller. The two signals are composed — whichever fires
42
+ * first wins.
43
+ *
44
+ * When `options.rejectPrivateIPs` is `true`, the target URL is validated before the
45
+ * request is sent, and all redirects are followed manually with per-hop SSRF checks
46
+ * (up to 5 hops). This mode forces `redirect: 'manual'` on the underlying fetch.
47
+ *
48
+ * Non-2xx responses are treated as errors: the response body is read, logged, and
49
+ * wrapped in a `McpError` with code `ServiceUnavailable`.
50
+ *
51
+ * @param url - The URL to fetch (string or `URL` instance).
52
+ * @param timeoutMs - Maximum duration in milliseconds before the request is aborted.
53
+ * @param context - Request context used for structured logging (requestId, operation, etc.).
54
+ * @param options - Optional fetch configuration extending `RequestInit`.
55
+ * - `rejectPrivateIPs`: Block requests to private/internal IP space (SSRF protection).
56
+ * - `signal`: External `AbortSignal` to cancel the request independently of the timeout.
57
+ * - All other standard `RequestInit` fields (method, headers, body, etc.) are forwarded.
58
+ * @returns A promise resolving to the `Response` object on HTTP 2xx.
59
+ * @throws {McpError} `ValidationError` if the URL targets a private/reserved address
60
+ * and `rejectPrivateIPs` is enabled.
61
+ * @throws {McpError} `Timeout` if the request exceeds `timeoutMs`.
62
+ * @throws {McpError} `InternalError` if the request is cancelled via the external signal.
63
+ * @throws {McpError} `ServiceUnavailable` if the server returns a non-2xx status or a
64
+ * network-level error occurs.
65
+ * @example
66
+ * ```ts
67
+ * // Basic GET with a 5-second timeout
68
+ * const response = await fetchWithTimeout(
69
+ * 'https://api.example.com/data',
70
+ * 5000,
71
+ * ctx,
72
+ * );
73
+ * const data = await response.json();
74
+ *
75
+ * // POST with SSRF protection and caller-cancellable signal
76
+ * const response = await fetchWithTimeout(
77
+ * userProvidedUrl,
78
+ * 10_000,
79
+ * ctx,
80
+ * {
81
+ * method: 'POST',
82
+ * headers: { 'Content-Type': 'application/json' },
83
+ * body: JSON.stringify(payload),
84
+ * rejectPrivateIPs: true,
85
+ * signal: ctx.signal,
86
+ * },
87
+ * );
88
+ * ```
89
+ */
90
+ export declare function fetchWithTimeout(url: string | URL, timeoutMs: number, context: RequestContext, options?: FetchWithTimeoutOptions): Promise<Response>;
91
+ //# sourceMappingURL=fetchWithTimeout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchWithTimeout.d.ts","sourceRoot":"","sources":["../../../src/utils/network/fetchWithTimeout.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGzE;;;;;;GAMG;AACH,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC1E;;;;;;;;;;;;;;;;OAgBG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AA+ID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,QAAQ,CAAC,CA4JnB"}