@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,321 @@
1
+ ---
2
+ name: api-context
3
+ description: >
4
+ Canonical reference for the unified `Context` object passed to every tool and resource handler in `@cyanheads/mcp-ts-core`. Covers the full interface, all sub-APIs (`ctx.log`, `ctx.state`, `ctx.elicit`, `ctx.sample`, `ctx.progress`), and when to use each.
5
+ metadata:
6
+ author: cyanheads
7
+ version: "1.0"
8
+ audience: external
9
+ type: reference
10
+ ---
11
+
12
+ ## Overview
13
+
14
+ Every tool and resource handler receives a single `Context` (`ctx`) argument. It provides request identity, structured logging, tenant-scoped storage, optional protocol capabilities (elicitation, sampling), cancellation, and task progress — all auto-correlated to the current request.
15
+
16
+ **Rule:** Use `ctx.log` and `ctx.state` inside handlers. Use the global `logger` and `StorageService` directly only in lifecycle/background code (`setup()`, services).
17
+
18
+ ---
19
+
20
+ ## `Context` Interface
21
+
22
+ ```ts
23
+ import type { Context } from '@cyanheads/mcp-ts-core/context';
24
+
25
+ interface Context {
26
+ // Identity & tracing
27
+ readonly requestId: string; // Unique per request, auto-generated
28
+ readonly timestamp: string; // ISO 8601 request start time
29
+ readonly tenantId?: string; // From JWT 'tid' claim; 'default' in stdio mode
30
+ readonly traceId?: string; // OTEL trace ID (present when OTEL enabled)
31
+ readonly spanId?: string; // OTEL span ID (present when OTEL enabled)
32
+ readonly auth?: AuthContext; // Parsed auth claims (clientId, scopes, sub)
33
+
34
+ // Structured logging — auto-includes requestId, traceId, tenantId
35
+ readonly log: ContextLogger;
36
+
37
+ // Tenant-scoped key-value storage
38
+ readonly state: ContextState;
39
+
40
+ // Optional protocol capabilities (undefined when client doesn't support them)
41
+ readonly elicit?: (message: string, schema: z.ZodObject<any>) => Promise<ElicitResult>;
42
+ readonly sample?: (messages: SamplingMessage[], opts?: SamplingOpts) => Promise<CreateMessageResult>;
43
+
44
+ // Cancellation
45
+ readonly signal: AbortSignal;
46
+
47
+ // Task progress — present only when tool is defined with task: true
48
+ readonly progress?: ContextProgress;
49
+
50
+ // Raw URI — present only for resource handlers
51
+ readonly uri?: URL;
52
+ }
53
+ ```
54
+
55
+ ### Identity fields
56
+
57
+ | Field | Always present | Source |
58
+ |:------|:--------------|:-------|
59
+ | `requestId` | Yes | Auto-generated UUID per request |
60
+ | `timestamp` | Yes | ISO 8601, request start |
61
+ | `tenantId` | In stdio (as `'default'`); from JWT `tid` claim in HTTP | JWT / stdio default |
62
+ | `traceId` | When OTEL enabled | OTEL trace context |
63
+ | `spanId` | When OTEL enabled | OTEL trace context |
64
+ | `auth` | When auth enabled | Parsed JWT claims |
65
+
66
+ ---
67
+
68
+ ## `ctx.log`
69
+
70
+ Request-scoped structured logger. Every log line is automatically annotated with `requestId`, `traceId`, and `tenantId` — no manual spreading needed.
71
+
72
+ ### Methods
73
+
74
+ | Method | Level |
75
+ |:-------|:------|
76
+ | `ctx.log.debug(msg, data?)` | Verbose debugging |
77
+ | `ctx.log.info(msg, data?)` | Normal operational events |
78
+ | `ctx.log.notice(msg, data?)` | Significant but non-error events |
79
+ | `ctx.log.warning(msg, data?)` | Recoverable issues, unexpected states |
80
+ | `ctx.log.error(msg, error?, data?)` | Errors (second arg is the Error object) |
81
+
82
+ ### Usage
83
+
84
+ ```ts
85
+ // Basic
86
+ ctx.log.info('Processing query', { query: input.query });
87
+
88
+ // With error object (second arg)
89
+ ctx.log.error('Failed to fetch upstream', error, { url, statusCode });
90
+
91
+ // Debug detail
92
+ ctx.log.debug('Cache miss', { key, ttl });
93
+ ```
94
+
95
+ ### `ctx.log` vs global `logger`
96
+
97
+ | Use | Where |
98
+ |:----|:------|
99
+ | `ctx.log` | Inside tool/resource handlers — auto-correlated to the request |
100
+ | `core.logger` / `logger` | In `setup()`, service constructors, background tasks — no request context available |
101
+
102
+ The global `logger` is imported from `@cyanheads/mcp-ts-core/utils/logger`. In handlers, always prefer `ctx.log`.
103
+
104
+ ---
105
+
106
+ ## `ctx.state`
107
+
108
+ Tenant-scoped key-value storage. Delegates to `StorageService` with automatic `tenantId` scoping — data written under tenant A is invisible to tenant B.
109
+
110
+ ### Interface
111
+
112
+ ```ts
113
+ interface ContextState {
114
+ get(key: string): Promise<string | null>;
115
+ set(key: string, value: string, opts?: { ttl?: number }): Promise<void>;
116
+ delete(key: string): Promise<void>;
117
+ list(prefix?: string, opts?: { cursor?: string; limit?: number }): Promise<{
118
+ items: Array<{ key: string; value: string }>;
119
+ cursor?: string; // opaque base64url; omitted on last page
120
+ }>;
121
+ }
122
+ ```
123
+
124
+ ### Usage
125
+
126
+ ```ts
127
+ // Store (values are always strings — serialize JSON manually)
128
+ await ctx.state.set('item:123', JSON.stringify(data));
129
+ await ctx.state.set('session:xyz', token, { ttl: 3600 }); // TTL in seconds
130
+
131
+ // Retrieve
132
+ const raw = await ctx.state.get('item:123');
133
+ const data = raw ? JSON.parse(raw) : null;
134
+
135
+ // Delete
136
+ await ctx.state.delete('item:123');
137
+
138
+ // List with prefix + pagination
139
+ const page = await ctx.state.list('item:', { cursor, limit: 20 });
140
+ for (const { key, value } of page.items) { /* ... */ }
141
+ if (page.cursor) { /* more pages available */ }
142
+ ```
143
+
144
+ ### Behavior notes
145
+
146
+ - Throws `McpError(InvalidRequest)` if `tenantId` is missing (won't happen in stdio mode — defaults to `'default'`).
147
+ - Keys are tenant-prefixed internally; handlers never need to namespace manually.
148
+ - **Workers persistence:** The `in-memory` provider loses data on cold starts. Use `cloudflare-kv`, `cloudflare-r2`, or `cloudflare-d1` for durable storage in Workers.
149
+
150
+ ---
151
+
152
+ ## `ctx.elicit` / `ctx.sample`
153
+
154
+ Both are optional — they are `undefined` when the connected client does not support the capability. Always check for presence before calling. No type guards are required; a simple truthiness check is sufficient.
155
+
156
+ ### `ctx.elicit` — ask the user for structured input
157
+
158
+ Presents a form to the human user via the MCP elicitation protocol. The user fills in a Zod-validated schema and returns an action (`accept`, `decline`, or `cancel`).
159
+
160
+ ```ts
161
+ if (ctx.elicit) {
162
+ const result = await ctx.elicit(
163
+ 'Which output format do you want?',
164
+ z.object({
165
+ format: z.enum(['json', 'csv', 'markdown']).describe('Output format'),
166
+ includeHeaders: z.boolean().default(true).describe('Include column headers'),
167
+ }),
168
+ );
169
+
170
+ if (result.action === 'accept') {
171
+ // result.data is typed as { format: 'json' | 'csv' | 'markdown', includeHeaders: boolean }
172
+ await produceOutput(result.data.format, result.data.includeHeaders);
173
+ } else {
174
+ // 'decline' or 'cancel' — user opted out
175
+ throw new McpError(JsonRpcErrorCode.InvalidRequest, 'User declined input');
176
+ }
177
+ }
178
+ ```
179
+
180
+ `ElicitResult`:
181
+
182
+ ```ts
183
+ type ElicitResult =
184
+ | { action: 'accept'; data: z.infer<typeof schema> }
185
+ | { action: 'decline' | 'cancel' };
186
+ ```
187
+
188
+ **Convention:** Only call `ctx.elicit` from tool handlers, not from services.
189
+
190
+ ### `ctx.sample` — request an LLM completion from the client
191
+
192
+ Requests the client's LLM to generate a completion (MCP sampling protocol). Useful for AI-assisted tool behavior without managing a separate LLM provider.
193
+
194
+ ```ts
195
+ if (ctx.sample) {
196
+ const result = await ctx.sample(
197
+ [
198
+ { role: 'user', content: { type: 'text', text: `Summarize: ${data}` } },
199
+ ],
200
+ { maxTokens: 500 },
201
+ );
202
+ return { summary: result.content.text };
203
+ }
204
+ ```
205
+
206
+ `SamplingOpts`:
207
+
208
+ ```ts
209
+ interface SamplingOpts {
210
+ includeContext?: 'none' | 'thisServer' | 'allServers';
211
+ maxTokens?: number;
212
+ modelPreferences?: Record<string, unknown>;
213
+ stopSequences?: string[];
214
+ temperature?: number;
215
+ }
216
+ ```
217
+
218
+ **Convention:** Only call `ctx.sample` from tool handlers, not from services.
219
+
220
+ ---
221
+
222
+ ## `ctx.signal`
223
+
224
+ Standard `AbortSignal`. Present on every context. Set when the client cancels the request or when a task tool is cancelled.
225
+
226
+ ```ts
227
+ // Check before expensive operations
228
+ if (ctx.signal.aborted) return earlyResult;
229
+
230
+ // Pass through to fetch / other async APIs
231
+ const response = await fetch(url, { signal: ctx.signal });
232
+
233
+ // Loop with cancellation check
234
+ for (const item of items) {
235
+ if (ctx.signal.aborted) break;
236
+ await processItem(item);
237
+ }
238
+ ```
239
+
240
+ In task tools (`task: true`), the framework signals `ctx.signal` when the client sends a cancellation request.
241
+
242
+ ---
243
+
244
+ ## `ctx.progress`
245
+
246
+ Present only when the tool definition includes `task: true`. Undefined for standard (non-task) tools and all resource handlers.
247
+
248
+ ### Methods
249
+
250
+ | Method | Purpose |
251
+ |:-------|:--------|
252
+ | `ctx.progress.setTotal(n)` | Set the total number of steps (enables percentage calculation on client) |
253
+ | `ctx.progress.increment(amount?)` | Advance progress by `amount` (default: 1) |
254
+ | `ctx.progress.update(message)` | Send a descriptive status message without advancing the counter |
255
+
256
+ ### Usage
257
+
258
+ ```ts
259
+ const asyncCountdown = tool('async_countdown', {
260
+ description: 'Count down from a number with progress updates.',
261
+ task: true,
262
+ input: z.object({
263
+ count: z.number().int().positive().describe('Number to count down from'),
264
+ delayMs: z.number().default(1000).describe('Delay between counts in ms'),
265
+ }),
266
+
267
+ async handler(input, ctx) {
268
+ await ctx.progress!.setTotal(input.count);
269
+
270
+ for (let i = input.count; i > 0; i--) {
271
+ if (ctx.signal.aborted) break;
272
+
273
+ await ctx.progress!.update(`Counting: ${i}`);
274
+ await new Promise(resolve => setTimeout(resolve, input.delayMs));
275
+ await ctx.progress!.increment();
276
+ }
277
+
278
+ return { finalCount: 0, message: 'Countdown complete' };
279
+ },
280
+ });
281
+ ```
282
+
283
+ **Note:** Use the non-null assertion (`ctx.progress!`) when accessing inside a `task: true` handler — the type is `ContextProgress | undefined` even though it's guaranteed present at runtime. TypeScript cannot narrow based on the `task` flag.
284
+
285
+ ---
286
+
287
+ ## `ctx.uri`
288
+
289
+ Present only for resource handlers. The raw `URL` object for the matched resource URI.
290
+
291
+ ```ts
292
+ export const myResource = resource('myscheme://{itemId}/data', {
293
+ async handler(params, ctx) {
294
+ ctx.log.debug('Resource accessed', { uri: ctx.uri?.toString() });
295
+ // params.itemId is extracted from the URI pattern — prefer params over ctx.uri
296
+ return fetchItem(params.itemId);
297
+ },
298
+ });
299
+ ```
300
+
301
+ Prefer `params` (the extracted URI template variables) over parsing `ctx.uri` manually. `ctx.uri` is available when the raw URL string is needed.
302
+
303
+ ---
304
+
305
+ ## Quick Reference
306
+
307
+ | Property | Type | Present when |
308
+ |:---------|:-----|:-------------|
309
+ | `ctx.requestId` | `string` | Always |
310
+ | `ctx.timestamp` | `string` | Always |
311
+ | `ctx.tenantId` | `string \| undefined` | Always in stdio (`'default'`); HTTP with auth |
312
+ | `ctx.traceId` | `string \| undefined` | OTEL enabled |
313
+ | `ctx.spanId` | `string \| undefined` | OTEL enabled |
314
+ | `ctx.auth` | `AuthContext \| undefined` | Auth enabled |
315
+ | `ctx.log` | `ContextLogger` | Always |
316
+ | `ctx.state` | `ContextState` | Always (throws if `tenantId` missing) |
317
+ | `ctx.signal` | `AbortSignal` | Always |
318
+ | `ctx.elicit` | `function \| undefined` | Client supports elicitation |
319
+ | `ctx.sample` | `function \| undefined` | Client supports sampling |
320
+ | `ctx.progress` | `ContextProgress \| undefined` | Tool defined with `task: true` |
321
+ | `ctx.uri` | `URL \| undefined` | Resource handlers only |
@@ -0,0 +1,146 @@
1
+ ---
2
+ name: api-errors
3
+ description: >
4
+ McpError constructor, JsonRpcErrorCode reference, and error handling patterns for `@cyanheads/mcp-ts-core`. Use when looking up error codes, understanding where errors should be thrown vs. caught, or using ErrorHandler.tryCatch in services.
5
+ metadata:
6
+ author: cyanheads
7
+ version: "1.0"
8
+ audience: external
9
+ type: reference
10
+ ---
11
+
12
+ ## Overview
13
+
14
+ Error handling in `@cyanheads/mcp-ts-core` follows a strict layered pattern: tool and resource handlers throw `McpError` freely (no try/catch), the handler factory catches and normalizes all errors, and services use `ErrorHandler.tryCatch` for graceful recovery.
15
+
16
+ **Imports:**
17
+
18
+ ```ts
19
+ import { McpError, JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
20
+ import { ErrorHandler } from '@cyanheads/mcp-ts-core/utils/errorHandler';
21
+ ```
22
+
23
+ ---
24
+
25
+ ## McpError Constructor
26
+
27
+ ```ts
28
+ throw new McpError(code, message?, data?, options?)
29
+ ```
30
+
31
+ - `code` — a `JsonRpcErrorCode` enum value
32
+ - `message` — optional human-readable description of the failure
33
+ - `data` — optional structured context (plain object)
34
+ - `options` — optional `{ cause?: unknown }` for error chaining
35
+
36
+ **Example:**
37
+
38
+ ```ts
39
+ import { McpError, JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
40
+
41
+ throw new McpError(JsonRpcErrorCode.InvalidParams, 'Missing required field: name', {
42
+ requestId: ctx.requestId,
43
+ field: 'name',
44
+ });
45
+ ```
46
+
47
+ ---
48
+
49
+ ## Error Codes
50
+
51
+ **Standard JSON-RPC 2.0 codes:**
52
+
53
+ | Code | Value | When to Use |
54
+ |:-----|------:|:------------|
55
+ | `ParseError` | -32700 | Malformed JSON received |
56
+ | `InvalidRequest` | -32600 | Unsupported operation, missing client capability |
57
+ | `MethodNotFound` | -32601 | Requested method does not exist |
58
+ | `InvalidParams` | -32602 | Bad input, missing required fields, schema validation failure |
59
+ | `InternalError` | -32603 | Unexpected failure, catch-all for programmer errors |
60
+
61
+ **Implementation-defined codes (-32000 to -32099):**
62
+
63
+ | Code | Value | When to Use |
64
+ |:-----|------:|:------------|
65
+ | `ServiceUnavailable` | -32000 | External dependency down, upstream failure |
66
+ | `NotFound` | -32001 | Resource, entity, or record doesn't exist |
67
+ | `Conflict` | -32002 | Duplicate key, version mismatch, concurrent modification |
68
+ | `RateLimited` | -32003 | Rate limit exceeded |
69
+ | `Timeout` | -32004 | Operation exceeded time limit |
70
+ | `Forbidden` | -32005 | Authenticated but insufficient scopes/permissions |
71
+ | `Unauthorized` | -32006 | No auth, invalid token, expired credentials |
72
+ | `ValidationError` | -32007 | Business rule violation (not schema — use `InvalidParams` for that) |
73
+ | `ConfigurationError` | -32008 | Missing env var, invalid config |
74
+ | `InitializationFailed` | -32009 | Server/component startup failure |
75
+ | `DatabaseError` | -32010 | Storage/persistence layer failure |
76
+ | `SerializationError` | -32070 | Data serialization/deserialization failed |
77
+ | `UnknownError` | -32099 | Generic fallback when no other code fits |
78
+
79
+ ---
80
+
81
+ ## Where Errors Are Handled
82
+
83
+ | Layer | Pattern |
84
+ |:------|:--------|
85
+ | Tool/resource handlers | Throw `McpError` — no try/catch |
86
+ | Handler factory | Catches all errors, normalizes to `McpError`, sets `isError: true` |
87
+ | Services/setup code | `ErrorHandler.tryCatch` for graceful recovery |
88
+
89
+ **Handler — throw freely, no try/catch:**
90
+
91
+ ```ts
92
+ export const myTool = tool('my_tool', {
93
+ input: z.object({ id: z.string().describe('Item ID') }),
94
+ async handler(input, ctx) {
95
+ const item = await db.find(input.id);
96
+ if (!item) {
97
+ throw new McpError(JsonRpcErrorCode.NotFound, `Item not found: ${input.id}`, {
98
+ id: input.id,
99
+ });
100
+ }
101
+ return item;
102
+ },
103
+ });
104
+ ```
105
+
106
+ ---
107
+
108
+ ## ErrorHandler.tryCatch (Services)
109
+
110
+ Use `ErrorHandler.tryCatch` in service code — not in tool handlers. It wraps arbitrary exceptions into `McpError` and supports structured logging context.
111
+
112
+ ```ts
113
+ import { ErrorHandler } from '@cyanheads/mcp-ts-core/utils/errorHandler';
114
+
115
+ // Works with both async and sync functions
116
+ const result = await ErrorHandler.tryCatch(
117
+ () => externalApi.fetch(url),
118
+ {
119
+ operation: 'ExternalApi.fetch',
120
+ context: { url },
121
+ errorCode: JsonRpcErrorCode.ServiceUnavailable,
122
+ },
123
+ );
124
+
125
+ const parsed = await ErrorHandler.tryCatch(
126
+ () => JSON.parse(raw),
127
+ {
128
+ operation: 'parseConfig',
129
+ errorCode: JsonRpcErrorCode.ConfigurationError,
130
+ },
131
+ );
132
+ ```
133
+
134
+ `tryCatch` always logs and rethrows — it never swallows errors. The `fn` argument may be synchronous or return a `Promise`; both are handled via `Promise.resolve(fn())`.
135
+
136
+ **Options** (`Omit<ErrorHandlerOptions, 'rethrow'>`):
137
+
138
+ | Option | Type | Required | Purpose |
139
+ |:-------|:-----|:--------:|:--------|
140
+ | `operation` | `string` | Yes | Name logged with the error |
141
+ | `context` | `ErrorContext` | No | Extra structured fields merged into the log record; `requestId` and `timestamp` receive special treatment |
142
+ | `errorCode` | `JsonRpcErrorCode` | No | Code used if the caught error is not already an `McpError` |
143
+ | `input` | `unknown` | No | Input value sanitized and logged alongside the error |
144
+ | `critical` | `boolean` | No | Marks the error as critical in logs (default `false`) |
145
+ | `includeStack` | `boolean` | No | Include stack trace in log output (default `true`) |
146
+ | `errorMapper` | `(error: unknown) => Error` | No | Custom transform applied instead of default `McpError` wrapping |
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: api-services
3
+ description: >
4
+ API reference for built-in service providers (LLM, Speech, Graph). Use when looking up service interfaces, provider capabilities, or integration patterns.
5
+ metadata:
6
+ author: cyanheads
7
+ version: "1.2"
8
+ audience: external
9
+ type: reference
10
+ ---
11
+
12
+ ## Overview
13
+
14
+ Service interfaces are deferred from core's public exports — they remain in downstream servers until shared by 2+ servers. These are documented here for core contributors and servers that use the built-in providers.
15
+
16
+ All services follow the **init/accessor pattern**: initialized in `setup()`, accessed at request time via lazy accessor. See the `add-service` skill for the full pattern.
17
+
18
+ ## References
19
+
20
+ | Reference | Path | Description |
21
+ |:----------|:-----|:------------|
22
+ | LLM | `references/llm.md` | OpenRouter-based LLM provider (`ILlmProvider`, streaming, config) |
23
+ | Speech | `references/speech.md` | TTS/STT providers (`SpeechService`, ElevenLabs, Whisper) |
24
+ | Graph | `references/graph.md` | Relationship graph operations (`IGraphProvider`, traversal, pathfinding) |
@@ -0,0 +1,124 @@
1
+ # Graph Service (`services/graph`)
2
+
3
+ ## `IGraphProvider` interface
4
+
5
+ Relationship-oriented graph operations — not vertex-CRUD:
6
+
7
+ | Method | Signature | Notes |
8
+ |:-------|:----------|:------|
9
+ | `relate` | `(from, edgeTable, to, context, options?) -> Promise<Edge>` | Create a directed relationship edge |
10
+ | `unrelate` | `(edgeId, context) -> Promise<boolean>` | Delete an edge by ID. Returns `true` if found. |
11
+ | `traverse` | `(startVertexId, context, options?) -> Promise<TraversalResult>` | Graph traversal from a starting vertex |
12
+ | `shortestPath` | `(from, to, context, options?) -> Promise<GraphPath \| null>` | Find lowest-cost path between two vertices |
13
+ | `getOutgoingEdges` | `(vertexId, context, edgeTypes?) -> Promise<Edge[]>` | All outgoing edges from a vertex |
14
+ | `getIncomingEdges` | `(vertexId, context, edgeTypes?) -> Promise<Edge[]>` | All incoming edges to a vertex |
15
+ | `pathExists` | `(from, to, context, maxDepth?) -> Promise<boolean>` | Reachability check (cheaper than `shortestPath`) |
16
+ | `getStats` | `(context) -> Promise<GraphStats>` | Aggregate vertex/edge counts and type breakdowns |
17
+ | `healthCheck` | `() -> Promise<boolean>` | Provider liveness check |
18
+
19
+ All methods that take `context` expect `RequestContext`, not unified `Context`.
20
+
21
+ ## `GraphService` class
22
+
23
+ Thin facade over `IGraphProvider` — delegates all calls to the injected provider with debug logging. Same method signatures as `IGraphProvider`, plus:
24
+
25
+ | Method | Return |
26
+ |:-------|:-------|
27
+ | `getProvider()` | `IGraphProvider` — access the underlying provider |
28
+
29
+ Not auto-constructed — initialize in `setup()` with a provider.
30
+
31
+ ## Types
32
+
33
+ ```ts
34
+ interface Vertex {
35
+ id: string; // e.g., 'user:alice'
36
+ table: string; // e.g., 'user'
37
+ data: Record<string, unknown>;
38
+ }
39
+
40
+ interface Edge {
41
+ id: string; // e.g., 'follows:1'
42
+ table: string; // e.g., 'follows'
43
+ from: string; // source vertex ID
44
+ to: string; // target vertex ID
45
+ data: Record<string, unknown>;
46
+ }
47
+
48
+ type TraversalDirection = 'out' | 'in' | 'both';
49
+
50
+ interface TraversalOptions {
51
+ direction?: TraversalDirection; // default: 'out'
52
+ maxDepth?: number; // default: 1
53
+ edgeTypes?: string[]; // filter by edge table
54
+ vertexTypes?: string[]; // filter by vertex table
55
+ where?: string; // provider-specific filter
56
+ }
57
+
58
+ interface TraversalResult {
59
+ start: Vertex;
60
+ paths: GraphPath[];
61
+ }
62
+
63
+ interface GraphPath {
64
+ vertices: Vertex[];
65
+ edges: Edge[];
66
+ weight?: number;
67
+ }
68
+
69
+ interface PathOptions {
70
+ algorithm?: 'dijkstra' | 'bfs' | 'dfs'; // default: 'bfs'
71
+ maxLength?: number;
72
+ weightFn?: (edge: Edge) => number; // required for 'dijkstra'
73
+ }
74
+
75
+ interface RelateOptions {
76
+ allowDuplicates?: boolean; // default: false
77
+ data?: Record<string, unknown>;
78
+ }
79
+
80
+ interface GraphStats {
81
+ vertexCount: number;
82
+ edgeCount: number;
83
+ avgDegree: number;
84
+ vertexTypes: Record<string, number>;
85
+ edgeTypes: Record<string, number>;
86
+ }
87
+ ```
88
+
89
+ ## Usage
90
+
91
+ ```ts
92
+ // Create a relationship
93
+ const edge = await graphService.relate(
94
+ 'user:alice', 'follows', 'user:bob', context,
95
+ { data: { since: '2025-01-01' } },
96
+ );
97
+
98
+ // Delete a relationship
99
+ const deleted = await graphService.unrelate('follows:1', context);
100
+
101
+ // Traverse the graph
102
+ const result = await graphService.traverse('user:alice', context, {
103
+ maxDepth: 2,
104
+ edgeTypes: ['follows'],
105
+ direction: 'out',
106
+ });
107
+
108
+ // Find shortest path
109
+ const path = await graphService.shortestPath('user:alice', 'user:charlie', context, {
110
+ algorithm: 'bfs',
111
+ maxLength: 4,
112
+ });
113
+ if (path) console.log(`${path.vertices.length} hops`);
114
+
115
+ // Check reachability
116
+ const connected = await graphService.pathExists('user:alice', 'user:charlie', context, 3);
117
+
118
+ // Get edges
119
+ const outgoing = await graphService.getOutgoingEdges('user:alice', context, ['follows']);
120
+ const incoming = await graphService.getIncomingEdges('user:bob', context, ['follows']);
121
+
122
+ // Stats
123
+ const stats = await graphService.getStats(context);
124
+ ```
@@ -0,0 +1,46 @@
1
+ # LLM Service (`services/llm`)
2
+
3
+ | Export | API | Notes |
4
+ |:-------|:----|:------|
5
+ | `ILlmProvider` | `.chatCompletion(params, context) -> Promise<ChatCompletion \| Stream<ChatCompletionChunk>>` `.chatCompletionStream(params, context) -> Promise<AsyncIterable<ChatCompletionChunk>>` | OpenAI-compatible interface. `params.stream` discriminates return type on `chatCompletion`. Context is `RequestContext`, not unified `Context`. |
6
+ | `OpenRouterProvider` | Implements `ILlmProvider` via OpenRouter API | Tier 3 peer: `openai`. Lazy-loaded. Rate-limited via `RateLimiter`. Retries on 429/5xx. |
7
+ | `OpenRouterChatParams` | `ChatCompletionCreateParamsNonStreaming \| ChatCompletionCreateParamsStreaming` | OpenAI SDK types — OpenRouter is API-compatible. |
8
+
9
+ ## Configuration
10
+
11
+ | Env Var | Purpose |
12
+ |:--------|:--------|
13
+ | `OPENROUTER_API_KEY` | API key (required to enable LLM service) |
14
+ | `OPENROUTER_APP_URL` | App URL for OpenRouter rankings |
15
+ | `OPENROUTER_APP_NAME` | App name for OpenRouter rankings |
16
+ | `LLM_DEFAULT_MODEL` | Default model ID (e.g., `anthropic/claude-sonnet-4-20250514`) |
17
+ | `LLM_DEFAULT_MAX_TOKENS` | Default max tokens |
18
+ | `LLM_DEFAULT_TEMPERATURE` | Default temperature |
19
+
20
+ ## Usage
21
+
22
+ ```ts
23
+ // In a tool handler — assumes LLM provider was initialized in setup()
24
+ // Note: chatCompletion takes RequestContext, not the unified Context.
25
+ // In services, pass the RequestContext directly. In tool handlers,
26
+ // create one via requestContextService or pass through from the service layer.
27
+ const completion = await llmProvider.chatCompletion({
28
+ model: 'anthropic/claude-sonnet-4-20250514',
29
+ messages: [{ role: 'user', content: 'Hello' }],
30
+ max_tokens: 500,
31
+ }, requestContext);
32
+ ```
33
+
34
+ Streaming variant:
35
+
36
+ ```ts
37
+ const stream = await llmProvider.chatCompletionStream({
38
+ model: 'anthropic/claude-sonnet-4-20250514',
39
+ messages: [{ role: 'user', content: 'Hello' }],
40
+ max_tokens: 500,
41
+ }, requestContext);
42
+
43
+ for await (const chunk of stream) {
44
+ // chunk is ChatCompletionChunk
45
+ }
46
+ ```