mcp-creatio 0.3.6

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 (370) hide show
  1. package/.dockerignore +12 -0
  2. package/.editorconfig +14 -0
  3. package/.eslintrc.cjs +18 -0
  4. package/.gitattributes +8 -0
  5. package/.github/workflows/docker-publish.yml +50 -0
  6. package/.prettierignore +3 -0
  7. package/.prettierrc +9 -0
  8. package/.vscode/launch.json +23 -0
  9. package/.vscode/mcp.json +13 -0
  10. package/.vscode/settings.json +16 -0
  11. package/Agent.md +187 -0
  12. package/Debug.md +32 -0
  13. package/Dockerfile +23 -0
  14. package/LICENSE +21 -0
  15. package/README.md +162 -0
  16. package/dist/cli.d.ts +3 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +135 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/config-builder.d.ts +3 -0
  21. package/dist/config-builder.d.ts.map +1 -0
  22. package/dist/config-builder.js +66 -0
  23. package/dist/config-builder.js.map +1 -0
  24. package/dist/consts.d.ts +2 -0
  25. package/dist/consts.d.ts.map +1 -0
  26. package/dist/consts.js +6 -0
  27. package/dist/consts.js.map +1 -0
  28. package/dist/creatio/auth/auth-manager.d.ts +9 -0
  29. package/dist/creatio/auth/auth-manager.d.ts.map +1 -0
  30. package/dist/creatio/auth/auth-manager.js +29 -0
  31. package/dist/creatio/auth/auth-manager.js.map +1 -0
  32. package/dist/creatio/auth/auth.d.ts +16 -0
  33. package/dist/creatio/auth/auth.d.ts.map +1 -0
  34. package/dist/creatio/auth/auth.js +20 -0
  35. package/dist/creatio/auth/auth.js.map +1 -0
  36. package/dist/creatio/auth/index.d.ts +4 -0
  37. package/dist/creatio/auth/index.d.ts.map +1 -0
  38. package/dist/creatio/auth/index.js +21 -0
  39. package/dist/creatio/auth/index.js.map +1 -0
  40. package/dist/creatio/auth/providers/base-oauth2-provider.d.ts +17 -0
  41. package/dist/creatio/auth/providers/base-oauth2-provider.d.ts.map +1 -0
  42. package/dist/creatio/auth/providers/base-oauth2-provider.js +49 -0
  43. package/dist/creatio/auth/providers/base-oauth2-provider.js.map +1 -0
  44. package/dist/creatio/auth/providers/base-provider.d.ts +15 -0
  45. package/dist/creatio/auth/providers/base-provider.d.ts.map +1 -0
  46. package/dist/creatio/auth/providers/base-provider.js +32 -0
  47. package/dist/creatio/auth/providers/base-provider.js.map +1 -0
  48. package/dist/creatio/auth/providers/index.d.ts +5 -0
  49. package/dist/creatio/auth/providers/index.d.ts.map +1 -0
  50. package/dist/creatio/auth/providers/index.js +21 -0
  51. package/dist/creatio/auth/providers/index.js.map +1 -0
  52. package/dist/creatio/auth/providers/legacy-provider.d.ts +10 -0
  53. package/dist/creatio/auth/providers/legacy-provider.d.ts.map +1 -0
  54. package/dist/creatio/auth/providers/legacy-provider.js +73 -0
  55. package/dist/creatio/auth/providers/legacy-provider.js.map +1 -0
  56. package/dist/creatio/auth/providers/oauth2-code-provider.d.ts +18 -0
  57. package/dist/creatio/auth/providers/oauth2-code-provider.d.ts.map +1 -0
  58. package/dist/creatio/auth/providers/oauth2-code-provider.js +245 -0
  59. package/dist/creatio/auth/providers/oauth2-code-provider.js.map +1 -0
  60. package/dist/creatio/auth/providers/oauth2-provider.d.ts +9 -0
  61. package/dist/creatio/auth/providers/oauth2-provider.d.ts.map +1 -0
  62. package/dist/creatio/auth/providers/oauth2-provider.js +86 -0
  63. package/dist/creatio/auth/providers/oauth2-provider.js.map +1 -0
  64. package/dist/creatio/auth/providers/type.d.ts +6 -0
  65. package/dist/creatio/auth/providers/type.d.ts.map +1 -0
  66. package/dist/creatio/auth/providers/type.js +10 -0
  67. package/dist/creatio/auth/providers/type.js.map +1 -0
  68. package/dist/creatio/client-config.d.ts +29 -0
  69. package/dist/creatio/client-config.d.ts.map +1 -0
  70. package/dist/creatio/client-config.js +3 -0
  71. package/dist/creatio/client-config.js.map +1 -0
  72. package/dist/creatio/engines/crud/crud-engine.d.ts +15 -0
  73. package/dist/creatio/engines/crud/crud-engine.d.ts.map +1 -0
  74. package/dist/creatio/engines/crud/crud-engine.js +33 -0
  75. package/dist/creatio/engines/crud/crud-engine.js.map +1 -0
  76. package/dist/creatio/engines/engine-manager.d.ts +33 -0
  77. package/dist/creatio/engines/engine-manager.d.ts.map +1 -0
  78. package/dist/creatio/engines/engine-manager.js +54 -0
  79. package/dist/creatio/engines/engine-manager.js.map +1 -0
  80. package/dist/creatio/engines/engine-registry.d.ts +15 -0
  81. package/dist/creatio/engines/engine-registry.d.ts.map +1 -0
  82. package/dist/creatio/engines/engine-registry.js +35 -0
  83. package/dist/creatio/engines/engine-registry.js.map +1 -0
  84. package/dist/creatio/engines/engine.d.ts +4 -0
  85. package/dist/creatio/engines/engine.d.ts.map +1 -0
  86. package/dist/creatio/engines/engine.js +3 -0
  87. package/dist/creatio/engines/engine.js.map +1 -0
  88. package/dist/creatio/engines/index.d.ts +8 -0
  89. package/dist/creatio/engines/index.d.ts.map +1 -0
  90. package/dist/creatio/engines/index.js +24 -0
  91. package/dist/creatio/engines/index.js.map +1 -0
  92. package/dist/creatio/engines/process/process-engine.d.ts +10 -0
  93. package/dist/creatio/engines/process/process-engine.d.ts.map +1 -0
  94. package/dist/creatio/engines/process/process-engine.js +18 -0
  95. package/dist/creatio/engines/process/process-engine.js.map +1 -0
  96. package/dist/creatio/engines/sys-settings/sys-settings-engine.d.ts +13 -0
  97. package/dist/creatio/engines/sys-settings/sys-settings-engine.d.ts.map +1 -0
  98. package/dist/creatio/engines/sys-settings/sys-settings-engine.js +27 -0
  99. package/dist/creatio/engines/sys-settings/sys-settings-engine.js.map +1 -0
  100. package/dist/creatio/engines/user/user-engine.d.ts +10 -0
  101. package/dist/creatio/engines/user/user-engine.d.ts.map +1 -0
  102. package/dist/creatio/engines/user/user-engine.js +18 -0
  103. package/dist/creatio/engines/user/user-engine.js.map +1 -0
  104. package/dist/creatio/index.d.ts +7 -0
  105. package/dist/creatio/index.d.ts.map +1 -0
  106. package/dist/creatio/index.js +23 -0
  107. package/dist/creatio/index.js.map +1 -0
  108. package/dist/creatio/provider-context.d.ts +10 -0
  109. package/dist/creatio/provider-context.d.ts.map +1 -0
  110. package/dist/creatio/provider-context.js +3 -0
  111. package/dist/creatio/provider-context.js.map +1 -0
  112. package/dist/creatio/providers/crud-provider.d.ts +40 -0
  113. package/dist/creatio/providers/crud-provider.d.ts.map +1 -0
  114. package/dist/creatio/providers/crud-provider.js +3 -0
  115. package/dist/creatio/providers/crud-provider.js.map +1 -0
  116. package/dist/creatio/providers/index.d.ts +5 -0
  117. package/dist/creatio/providers/index.d.ts.map +1 -0
  118. package/dist/creatio/providers/index.js +21 -0
  119. package/dist/creatio/providers/index.js.map +1 -0
  120. package/dist/creatio/providers/process-provider.d.ts +14 -0
  121. package/dist/creatio/providers/process-provider.d.ts.map +1 -0
  122. package/dist/creatio/providers/process-provider.js +3 -0
  123. package/dist/creatio/providers/process-provider.js.map +1 -0
  124. package/dist/creatio/providers/sys-settings-provider.d.ts +58 -0
  125. package/dist/creatio/providers/sys-settings-provider.d.ts.map +1 -0
  126. package/dist/creatio/providers/sys-settings-provider.js +3 -0
  127. package/dist/creatio/providers/sys-settings-provider.js.map +1 -0
  128. package/dist/creatio/providers/user-provider.d.ts +12 -0
  129. package/dist/creatio/providers/user-provider.d.ts.map +1 -0
  130. package/dist/creatio/providers/user-provider.js +3 -0
  131. package/dist/creatio/providers/user-provider.js.map +1 -0
  132. package/dist/creatio/services/creatio-service-context.d.ts +17 -0
  133. package/dist/creatio/services/creatio-service-context.d.ts.map +1 -0
  134. package/dist/creatio/services/creatio-service-context.js +35 -0
  135. package/dist/creatio/services/creatio-service-context.js.map +1 -0
  136. package/dist/creatio/services/http-client.d.ts +29 -0
  137. package/dist/creatio/services/http-client.d.ts.map +1 -0
  138. package/dist/creatio/services/http-client.js +136 -0
  139. package/dist/creatio/services/http-client.js.map +1 -0
  140. package/dist/creatio/services/index.d.ts +8 -0
  141. package/dist/creatio/services/index.d.ts.map +1 -0
  142. package/dist/creatio/services/index.js +24 -0
  143. package/dist/creatio/services/index.js.map +1 -0
  144. package/dist/creatio/services/metadata-store.d.ts +20 -0
  145. package/dist/creatio/services/metadata-store.d.ts.map +1 -0
  146. package/dist/creatio/services/metadata-store.js +162 -0
  147. package/dist/creatio/services/metadata-store.js.map +1 -0
  148. package/dist/creatio/services/odata-crud-provider.d.ts +21 -0
  149. package/dist/creatio/services/odata-crud-provider.d.ts.map +1 -0
  150. package/dist/creatio/services/odata-crud-provider.js +145 -0
  151. package/dist/creatio/services/odata-crud-provider.js.map +1 -0
  152. package/dist/creatio/services/process-service-provider.d.ts +11 -0
  153. package/dist/creatio/services/process-service-provider.d.ts.map +1 -0
  154. package/dist/creatio/services/process-service-provider.js +52 -0
  155. package/dist/creatio/services/process-service-provider.js.map +1 -0
  156. package/dist/creatio/services/sys-settings-service-provider.d.ts +19 -0
  157. package/dist/creatio/services/sys-settings-service-provider.d.ts.map +1 -0
  158. package/dist/creatio/services/sys-settings-service-provider.js +107 -0
  159. package/dist/creatio/services/sys-settings-service-provider.js.map +1 -0
  160. package/dist/creatio/services/user-info-provider.d.ts +10 -0
  161. package/dist/creatio/services/user-info-provider.d.ts.map +1 -0
  162. package/dist/creatio/services/user-info-provider.js +26 -0
  163. package/dist/creatio/services/user-info-provider.js.map +1 -0
  164. package/dist/index.d.ts +2 -0
  165. package/dist/index.d.ts.map +1 -0
  166. package/dist/index.js +46 -0
  167. package/dist/index.js.map +1 -0
  168. package/dist/log.d.ts +51 -0
  169. package/dist/log.d.ts.map +1 -0
  170. package/dist/log.js +137 -0
  171. package/dist/log.js.map +1 -0
  172. package/dist/server/http/creatio-oauth-handlers.d.ts +14 -0
  173. package/dist/server/http/creatio-oauth-handlers.d.ts.map +1 -0
  174. package/dist/server/http/creatio-oauth-handlers.js +137 -0
  175. package/dist/server/http/creatio-oauth-handlers.js.map +1 -0
  176. package/dist/server/http/httpServer.d.ts +23 -0
  177. package/dist/server/http/httpServer.d.ts.map +1 -0
  178. package/dist/server/http/httpServer.js +131 -0
  179. package/dist/server/http/httpServer.js.map +1 -0
  180. package/dist/server/http/index.d.ts +6 -0
  181. package/dist/server/http/index.d.ts.map +1 -0
  182. package/dist/server/http/index.js +22 -0
  183. package/dist/server/http/index.js.map +1 -0
  184. package/dist/server/http/mcp-handlers.d.ts +10 -0
  185. package/dist/server/http/mcp-handlers.d.ts.map +1 -0
  186. package/dist/server/http/mcp-handlers.js +82 -0
  187. package/dist/server/http/mcp-handlers.js.map +1 -0
  188. package/dist/server/http/mcp-oauth-handlers.d.ts +11 -0
  189. package/dist/server/http/mcp-oauth-handlers.d.ts.map +1 -0
  190. package/dist/server/http/mcp-oauth-handlers.js +106 -0
  191. package/dist/server/http/mcp-oauth-handlers.js.map +1 -0
  192. package/dist/server/http/middleware.d.ts +11 -0
  193. package/dist/server/http/middleware.d.ts.map +1 -0
  194. package/dist/server/http/middleware.js +88 -0
  195. package/dist/server/http/middleware.js.map +1 -0
  196. package/dist/server/index.d.ts +3 -0
  197. package/dist/server/index.d.ts.map +1 -0
  198. package/dist/server/index.js +19 -0
  199. package/dist/server/index.js.map +1 -0
  200. package/dist/server/mcp/filters.d.ts +2 -0
  201. package/dist/server/mcp/filters.d.ts.map +1 -0
  202. package/dist/server/mcp/filters.js +94 -0
  203. package/dist/server/mcp/filters.js.map +1 -0
  204. package/dist/server/mcp/index.d.ts +2 -0
  205. package/dist/server/mcp/index.d.ts.map +1 -0
  206. package/dist/server/mcp/index.js +18 -0
  207. package/dist/server/mcp/index.js.map +1 -0
  208. package/dist/server/mcp/prompts-data.d.ts +147 -0
  209. package/dist/server/mcp/prompts-data.d.ts.map +1 -0
  210. package/dist/server/mcp/prompts-data.js +884 -0
  211. package/dist/server/mcp/prompts-data.js.map +1 -0
  212. package/dist/server/mcp/server.d.ts +25 -0
  213. package/dist/server/mcp/server.d.ts.map +1 -0
  214. package/dist/server/mcp/server.js +233 -0
  215. package/dist/server/mcp/server.js.map +1 -0
  216. package/dist/server/mcp/tools-data.d.ts +165 -0
  217. package/dist/server/mcp/tools-data.d.ts.map +1 -0
  218. package/dist/server/mcp/tools-data.js +466 -0
  219. package/dist/server/mcp/tools-data.js.map +1 -0
  220. package/dist/server/oauth/client-manager.d.ts +6 -0
  221. package/dist/server/oauth/client-manager.d.ts.map +1 -0
  222. package/dist/server/oauth/client-manager.js +52 -0
  223. package/dist/server/oauth/client-manager.js.map +1 -0
  224. package/dist/server/oauth/index.d.ts +7 -0
  225. package/dist/server/oauth/index.d.ts.map +1 -0
  226. package/dist/server/oauth/index.js +23 -0
  227. package/dist/server/oauth/index.js.map +1 -0
  228. package/dist/server/oauth/oauth-server.d.ts +21 -0
  229. package/dist/server/oauth/oauth-server.d.ts.map +1 -0
  230. package/dist/server/oauth/oauth-server.js +146 -0
  231. package/dist/server/oauth/oauth-server.js.map +1 -0
  232. package/dist/server/oauth/storage.d.ts +31 -0
  233. package/dist/server/oauth/storage.d.ts.map +1 -0
  234. package/dist/server/oauth/storage.js +73 -0
  235. package/dist/server/oauth/storage.js.map +1 -0
  236. package/dist/server/oauth/token-manager.d.ts +13 -0
  237. package/dist/server/oauth/token-manager.d.ts.map +1 -0
  238. package/dist/server/oauth/token-manager.js +69 -0
  239. package/dist/server/oauth/token-manager.js.map +1 -0
  240. package/dist/server/oauth/types.d.ts +51 -0
  241. package/dist/server/oauth/types.d.ts.map +1 -0
  242. package/dist/server/oauth/types.js +3 -0
  243. package/dist/server/oauth/types.js.map +1 -0
  244. package/dist/server/oauth/validators.d.ts +7 -0
  245. package/dist/server/oauth/validators.d.ts.map +1 -0
  246. package/dist/server/oauth/validators.js +51 -0
  247. package/dist/server/oauth/validators.js.map +1 -0
  248. package/dist/services/index.d.ts +3 -0
  249. package/dist/services/index.d.ts.map +1 -0
  250. package/dist/services/index.js +19 -0
  251. package/dist/services/index.js.map +1 -0
  252. package/dist/services/session-context.d.ts +57 -0
  253. package/dist/services/session-context.d.ts.map +1 -0
  254. package/dist/services/session-context.js +182 -0
  255. package/dist/services/session-context.js.map +1 -0
  256. package/dist/services/token-refresh-scheduler.d.ts +16 -0
  257. package/dist/services/token-refresh-scheduler.d.ts.map +1 -0
  258. package/dist/services/token-refresh-scheduler.js +66 -0
  259. package/dist/services/token-refresh-scheduler.js.map +1 -0
  260. package/dist/types/index.d.ts +2 -0
  261. package/dist/types/index.d.ts.map +1 -0
  262. package/dist/types/index.js +18 -0
  263. package/dist/types/index.js.map +1 -0
  264. package/dist/types/network.d.ts +7 -0
  265. package/dist/types/network.d.ts.map +1 -0
  266. package/dist/types/network.js +6 -0
  267. package/dist/types/network.js.map +1 -0
  268. package/dist/utils/context.d.ts +10 -0
  269. package/dist/utils/context.d.ts.map +1 -0
  270. package/dist/utils/context.js +44 -0
  271. package/dist/utils/context.js.map +1 -0
  272. package/dist/utils/env.d.ts +3 -0
  273. package/dist/utils/env.d.ts.map +1 -0
  274. package/dist/utils/env.js +16 -0
  275. package/dist/utils/env.js.map +1 -0
  276. package/dist/utils/index.d.ts +6 -0
  277. package/dist/utils/index.d.ts.map +1 -0
  278. package/dist/utils/index.js +22 -0
  279. package/dist/utils/index.js.map +1 -0
  280. package/dist/utils/mcp.d.ts +3 -0
  281. package/dist/utils/mcp.d.ts.map +1 -0
  282. package/dist/utils/mcp.js +7 -0
  283. package/dist/utils/mcp.js.map +1 -0
  284. package/dist/utils/network.d.ts +7 -0
  285. package/dist/utils/network.d.ts.map +1 -0
  286. package/dist/utils/network.js +63 -0
  287. package/dist/utils/network.js.map +1 -0
  288. package/dist/utils/pkce.d.ts +7 -0
  289. package/dist/utils/pkce.d.ts.map +1 -0
  290. package/dist/utils/pkce.js +43 -0
  291. package/dist/utils/pkce.js.map +1 -0
  292. package/dist/version.d.ts +3 -0
  293. package/dist/version.d.ts.map +1 -0
  294. package/dist/version.js +10 -0
  295. package/dist/version.js.map +1 -0
  296. package/docs/coding-style.md +30 -0
  297. package/ecosystem.config.json +17 -0
  298. package/eslint.config.cjs +95 -0
  299. package/package.json +54 -0
  300. package/src/cli.ts +158 -0
  301. package/src/config-builder.ts +76 -0
  302. package/src/consts.ts +3 -0
  303. package/src/creatio/auth/auth-manager.ts +27 -0
  304. package/src/creatio/auth/auth.ts +31 -0
  305. package/src/creatio/auth/index.ts +3 -0
  306. package/src/creatio/auth/providers/base-oauth2-provider.ts +62 -0
  307. package/src/creatio/auth/providers/base-provider.ts +42 -0
  308. package/src/creatio/auth/providers/index.ts +4 -0
  309. package/src/creatio/auth/providers/legacy-provider.ts +70 -0
  310. package/src/creatio/auth/providers/oauth2-code-provider.ts +252 -0
  311. package/src/creatio/auth/providers/oauth2-provider.ts +91 -0
  312. package/src/creatio/auth/providers/type.ts +5 -0
  313. package/src/creatio/client-config.ts +34 -0
  314. package/src/creatio/engines/crud/crud-engine.ts +47 -0
  315. package/src/creatio/engines/engine-manager.ts +102 -0
  316. package/src/creatio/engines/engine-registry.ts +36 -0
  317. package/src/creatio/engines/engine.ts +3 -0
  318. package/src/creatio/engines/index.ts +7 -0
  319. package/src/creatio/engines/process/process-engine.ts +20 -0
  320. package/src/creatio/engines/sys-settings/sys-settings-engine.ts +41 -0
  321. package/src/creatio/engines/user/user-engine.ts +20 -0
  322. package/src/creatio/index.ts +6 -0
  323. package/src/creatio/provider-context.ts +10 -0
  324. package/src/creatio/providers/crud-provider.ts +45 -0
  325. package/src/creatio/providers/index.ts +4 -0
  326. package/src/creatio/providers/process-provider.ts +15 -0
  327. package/src/creatio/providers/sys-settings-provider.ts +63 -0
  328. package/src/creatio/providers/user-provider.ts +12 -0
  329. package/src/creatio/services/creatio-service-context.ts +38 -0
  330. package/src/creatio/services/http-client.ts +174 -0
  331. package/src/creatio/services/index.ts +7 -0
  332. package/src/creatio/services/metadata-store.ts +181 -0
  333. package/src/creatio/services/odata-crud-provider.ts +210 -0
  334. package/src/creatio/services/process-service-provider.ts +76 -0
  335. package/src/creatio/services/sys-settings-service-provider.ts +192 -0
  336. package/src/creatio/services/user-info-provider.ts +41 -0
  337. package/src/index.ts +44 -0
  338. package/src/log.ts +141 -0
  339. package/src/server/http/creatio-oauth-handlers.ts +146 -0
  340. package/src/server/http/httpServer.ts +150 -0
  341. package/src/server/http/index.ts +5 -0
  342. package/src/server/http/mcp-handlers.ts +92 -0
  343. package/src/server/http/mcp-oauth-handlers.ts +108 -0
  344. package/src/server/http/middleware.ts +91 -0
  345. package/src/server/index.ts +2 -0
  346. package/src/server/mcp/filters.ts +97 -0
  347. package/src/server/mcp/index.ts +1 -0
  348. package/src/server/mcp/prompts-data.ts +896 -0
  349. package/src/server/mcp/server.ts +331 -0
  350. package/src/server/mcp/tools-data.ts +592 -0
  351. package/src/server/oauth/client-manager.ts +47 -0
  352. package/src/server/oauth/index.ts +6 -0
  353. package/src/server/oauth/oauth-server.ts +185 -0
  354. package/src/server/oauth/storage.ts +106 -0
  355. package/src/server/oauth/token-manager.ts +80 -0
  356. package/src/server/oauth/types.ts +55 -0
  357. package/src/server/oauth/validators.ts +56 -0
  358. package/src/services/index.ts +2 -0
  359. package/src/services/session-context.ts +232 -0
  360. package/src/services/token-refresh-scheduler.ts +68 -0
  361. package/src/types/index.ts +1 -0
  362. package/src/types/network.ts +7 -0
  363. package/src/utils/context.ts +49 -0
  364. package/src/utils/env.ts +12 -0
  365. package/src/utils/index.ts +5 -0
  366. package/src/utils/mcp.ts +8 -0
  367. package/src/utils/network.ts +65 -0
  368. package/src/utils/pkce.ts +39 -0
  369. package/src/version.ts +15 -0
  370. package/tsconfig.json +28 -0
@@ -0,0 +1,232 @@
1
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
2
+
3
+ import log from '../log';
4
+
5
+ export interface SessionInfo {
6
+ id: string;
7
+ userKey?: string | undefined;
8
+ transport?: StreamableHTTPServerTransport | undefined;
9
+ isLogged: boolean;
10
+ createdAt: Date;
11
+ remoteIp?: string | undefined;
12
+ }
13
+
14
+ export interface UserTokens {
15
+ accessToken: string;
16
+ accessTokenExpiryMs: number;
17
+ refreshToken?: string | undefined;
18
+ }
19
+
20
+ export interface OAuthState {
21
+ userKey: string;
22
+ createdAt: number;
23
+ expiresAt: number;
24
+ }
25
+
26
+ export class SessionContext {
27
+ private static _instance: SessionContext | undefined;
28
+ private readonly _sessions = new Map<string, SessionInfo>();
29
+ private readonly _userTokens = new Map<string, UserTokens>();
30
+ private readonly _oauthStates = new Map<string, OAuthState>();
31
+ private readonly _deletingSessions = new Set<string>();
32
+
33
+ public static get instance(): SessionContext {
34
+ if (!SessionContext._instance) {
35
+ SessionContext._instance = new SessionContext();
36
+ }
37
+ return SessionContext._instance;
38
+ }
39
+
40
+ private _generateState(): string {
41
+ return (
42
+ Math.random().toString(36).substring(2, 15) +
43
+ Math.random().toString(36).substring(2, 15)
44
+ );
45
+ }
46
+
47
+ public createSession(sessionId: string, userKey?: string, remoteIp?: string): SessionInfo {
48
+ const session: SessionInfo = {
49
+ id: sessionId,
50
+ isLogged: false,
51
+ createdAt: new Date(),
52
+ };
53
+ if (userKey !== undefined) {
54
+ session.userKey = userKey;
55
+ }
56
+ if (remoteIp !== undefined) {
57
+ session.remoteIp = remoteIp;
58
+ }
59
+ this._sessions.set(sessionId, session);
60
+ return session;
61
+ }
62
+
63
+ public getSession(sessionId: string): SessionInfo | undefined {
64
+ return this._sessions.get(sessionId);
65
+ }
66
+
67
+ public hasSession(sessionId: string): boolean {
68
+ return this._sessions.has(sessionId);
69
+ }
70
+
71
+ public markSessionAsLogged(sessionId: string): boolean {
72
+ const session = this._sessions.get(sessionId);
73
+ if (session) {
74
+ session.isLogged = true;
75
+ return true;
76
+ }
77
+ return false;
78
+ }
79
+
80
+ public setSessionTransport(sessionId: string, transport: StreamableHTTPServerTransport): void {
81
+ const session = this._sessions.get(sessionId);
82
+ if (session) {
83
+ session.transport = transport;
84
+ }
85
+ }
86
+
87
+ public mapSessionToUser(sessionId: string, userKey: string): void {
88
+ const session = this._sessions.get(sessionId);
89
+ if (session) {
90
+ session.userKey = userKey;
91
+ log.info('session_mapping.set', { sessionId, userKey });
92
+ }
93
+ }
94
+
95
+ public deleteSession(sessionId: string): void {
96
+ if (this._deletingSessions.has(sessionId)) {
97
+ return;
98
+ }
99
+ this._deletingSessions.add(sessionId);
100
+ const session = this._sessions.get(sessionId);
101
+ this._sessions.delete(sessionId);
102
+ if (session?.transport) {
103
+ try {
104
+ session.transport.close();
105
+ } catch (err) {
106
+ log.warn('transport.close.failed', { sessionId, error: String(err) });
107
+ }
108
+ }
109
+ this._deletingSessions.delete(sessionId);
110
+ }
111
+
112
+ public getAllSessions(): SessionInfo[] {
113
+ return Array.from(this._sessions.values());
114
+ }
115
+
116
+ public getSessionsForUser(userKey: string): SessionInfo[] {
117
+ return Array.from(this._sessions.values()).filter((s) => s.userKey === userKey);
118
+ }
119
+
120
+ public async getTokensForSession(sessionId: string): Promise<UserTokens | null> {
121
+ const session = this._sessions.get(sessionId);
122
+ if (!session?.userKey) {
123
+ return null;
124
+ }
125
+ return this.getTokensForUser(session.userKey);
126
+ }
127
+
128
+ public async getTokensForUser(userKey: string): Promise<UserTokens | null> {
129
+ return this._userTokens.get(userKey) || null;
130
+ }
131
+
132
+ public async setTokensForUser(userKey: string, tokens: UserTokens): Promise<void> {
133
+ this._userTokens.set(userKey, tokens);
134
+ }
135
+
136
+ public async deleteTokensForUser(userKey: string): Promise<void> {
137
+ this._userTokens.delete(userKey);
138
+ }
139
+
140
+ public createOAuthState(userKey: string): string {
141
+ const state = this._generateState();
142
+ const stateInfo: OAuthState = {
143
+ userKey,
144
+ createdAt: Date.now(),
145
+ expiresAt: Date.now() + 10 * 60 * 1000,
146
+ };
147
+ this._oauthStates.set(state, stateInfo);
148
+ return state;
149
+ }
150
+
151
+ public validateOAuthState(state: string): {
152
+ userKey: string;
153
+ } | null {
154
+ const stateInfo = this._oauthStates.get(state);
155
+ if (!stateInfo) {
156
+ return null;
157
+ }
158
+ if (Date.now() > stateInfo.expiresAt) {
159
+ this._oauthStates.delete(state);
160
+ return null;
161
+ }
162
+ this._oauthStates.delete(state);
163
+ return { userKey: stateInfo.userKey };
164
+ }
165
+
166
+ public validateAndConsumeOAuthState(state: string): string | undefined {
167
+ const result = this.validateOAuthState(state);
168
+ return result?.userKey;
169
+ }
170
+
171
+ public setSessionUserKey(sessionId: string, userKey: string): void {
172
+ const session = this._sessions.get(sessionId);
173
+ if (session) {
174
+ session.userKey = userKey;
175
+ log.info('session_mapping.set', { sessionId, userKey });
176
+ }
177
+ }
178
+
179
+ public cleanupExpiredOAuthStates(): void {
180
+ const now = Date.now();
181
+ for (const [state, stateInfo] of this._oauthStates.entries()) {
182
+ if (now > stateInfo.expiresAt) {
183
+ this._oauthStates.delete(state);
184
+ }
185
+ }
186
+ }
187
+
188
+ public async getEffectiveTokens(
189
+ sessionId?: string,
190
+ userKey?: string,
191
+ ): Promise<UserTokens | null> {
192
+ if (userKey) {
193
+ return this.getTokensForUser(userKey);
194
+ }
195
+ if (sessionId) {
196
+ return this.getTokensForSession(sessionId);
197
+ }
198
+ return null;
199
+ }
200
+
201
+ public async createSessionWithUser(
202
+ sessionId: string,
203
+ userKey: string,
204
+ remoteIp?: string,
205
+ ): Promise<SessionInfo> {
206
+ const session = this.createSession(sessionId, userKey, remoteIp);
207
+ return session;
208
+ }
209
+
210
+ public mapAllSessionsToUser(userKey: string): void {
211
+ const sessionIds: string[] = [];
212
+ for (const [sessionId, session] of this._sessions.entries()) {
213
+ if (session.transport) {
214
+ session.userKey = userKey;
215
+ sessionIds.push(sessionId);
216
+ }
217
+ }
218
+ log.info('mapping_all_sessions', {
219
+ userKey,
220
+ sessionCount: sessionIds.length,
221
+ sessionIds,
222
+ });
223
+ }
224
+
225
+ public getStats(): { sessionsCount: number; tokensCount: number; oauthStatesCount: number } {
226
+ return {
227
+ sessionsCount: this._sessions.size,
228
+ tokensCount: this._userTokens.size,
229
+ oauthStatesCount: this._oauthStates.size,
230
+ };
231
+ }
232
+ }
@@ -0,0 +1,68 @@
1
+ import log from '../log';
2
+ import { SessionContext } from '../services';
3
+ export type TokenRefreshCallback = (userKey: string) => Promise<void>;
4
+
5
+ export class TokenRefreshScheduler {
6
+ private readonly _refreshIntervals = new Map<string, NodeJS.Timeout>();
7
+ private readonly _sessionContext = SessionContext.instance;
8
+ private _refreshCallback?: TokenRefreshCallback;
9
+
10
+ private async _refreshUserTokens(userKey: string): Promise<void> {
11
+ if (!this._refreshCallback) {
12
+ throw new Error('no_refresh_callback');
13
+ }
14
+ const tokens = await this._sessionContext.getTokensForUser(userKey);
15
+ if (!tokens?.refreshToken) {
16
+ throw new Error('no_refresh_token');
17
+ }
18
+ const sessions = this._sessionContext.getSessionsForUser(userKey);
19
+ if (sessions.length === 0) {
20
+ throw new Error('no_active_sessions');
21
+ }
22
+ await this._refreshCallback(userKey);
23
+ log.info('background_token_refresh_success', { userKey, sessionsCount: sessions.length });
24
+ }
25
+
26
+ public setRefreshCallback(callback: TokenRefreshCallback): void {
27
+ this._refreshCallback = callback;
28
+ }
29
+
30
+ public scheduleRefresh(userKey: string): void {
31
+ this.cancelRefresh(userKey);
32
+ const refreshInterval = setInterval(
33
+ async () => {
34
+ try {
35
+ await this._refreshUserTokens(userKey);
36
+ } catch (err) {
37
+ log.warn('background_token_refresh_failed', { userKey, error: String(err) });
38
+ this.cancelRefresh(userKey);
39
+ }
40
+ },
41
+ 15 * 60 * 1000,
42
+ );
43
+ this._refreshIntervals.set(userKey, refreshInterval);
44
+ log.info('token_refresh_scheduled', { userKey });
45
+ }
46
+
47
+ public cancelRefresh(userKey: string): void {
48
+ const interval = this._refreshIntervals.get(userKey);
49
+ if (interval) {
50
+ clearInterval(interval);
51
+ this._refreshIntervals.delete(userKey);
52
+ log.info('token_refresh_cancelled', { userKey });
53
+ }
54
+ }
55
+
56
+ public cancelAllRefresh(): void {
57
+ for (const userKey of this._refreshIntervals.keys()) {
58
+ this.cancelRefresh(userKey);
59
+ }
60
+ }
61
+
62
+ public getStats(): { activeRefreshCount: number; userKeys: string[] } {
63
+ return {
64
+ activeRefreshCount: this._refreshIntervals.size,
65
+ userKeys: Array.from(this._refreshIntervals.keys()),
66
+ };
67
+ }
68
+ }
@@ -0,0 +1 @@
1
+ export * from './network';
@@ -0,0 +1,7 @@
1
+ export type CookieKV = {
2
+ name: string;
3
+ value: string;
4
+ };
5
+
6
+ export const JSON_ACCEPT = 'application/json';
7
+ export const XML_ACCEPT = 'application/xml';
@@ -0,0 +1,49 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+
3
+ import { SessionContext } from '../services';
4
+
5
+ export type RequestContext = {
6
+ userKey?: string | undefined;
7
+ sessionId?: string | undefined;
8
+ };
9
+
10
+ const als = new AsyncLocalStorage<RequestContext>();
11
+
12
+ const sessionContext = SessionContext.instance;
13
+
14
+ export function runWithContext<T>(ctx: Partial<RequestContext>, fn: () => Promise<T>): Promise<T> {
15
+ const store: RequestContext = {};
16
+ if (typeof ctx.userKey === 'string') {
17
+ store.userKey = ctx.userKey;
18
+ }
19
+ if (typeof ctx.sessionId === 'string') {
20
+ store.sessionId = ctx.sessionId;
21
+ }
22
+ return als.run(store, fn);
23
+ }
24
+
25
+ export function getRequestContext(): RequestContext | undefined {
26
+ return als.getStore();
27
+ }
28
+
29
+ export function getUserKey(): string | undefined {
30
+ return als.getStore()?.userKey;
31
+ }
32
+
33
+ export function getSessionId(): string | undefined {
34
+ return als.getStore()?.sessionId;
35
+ }
36
+
37
+ export function getEffectiveUserKey(): string | undefined {
38
+ const ctx = als.getStore();
39
+ if (ctx?.userKey) {
40
+ return ctx.userKey;
41
+ }
42
+ if (ctx?.sessionId) {
43
+ const session = sessionContext.getSession(ctx.sessionId);
44
+ if (session?.userKey) {
45
+ return session.userKey;
46
+ }
47
+ }
48
+ return ctx?.sessionId;
49
+ }
@@ -0,0 +1,12 @@
1
+ export function env(name: string): string | undefined {
2
+ const v = process.env[name];
3
+ return (v && v.trim()) || undefined;
4
+ }
5
+
6
+ export function envBool(name: string, def: boolean): boolean {
7
+ const v = env(name);
8
+ if (v == null) {
9
+ return def;
10
+ }
11
+ return v.toLowerCase() === 'true' || v === '1';
12
+ }
@@ -0,0 +1,5 @@
1
+ export * from './env';
2
+ export * from './mcp';
3
+ export * from './network';
4
+ export * from './pkce';
5
+ export * from './context';
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+
3
+ export function withValidation<T extends z.ZodTypeAny>(
4
+ schema: T,
5
+ handler: (args: z.infer<T>) => Promise<any>,
6
+ ) {
7
+ return async (payload: unknown) => handler(schema.parse(payload));
8
+ }
@@ -0,0 +1,65 @@
1
+ import { CookieKV } from '../types';
2
+
3
+ import type express from 'express';
4
+
5
+ export function getClientIp(req: express.Request): string | undefined {
6
+ const forwarded = req.headers['x-forwarded-for'] as string | string[] | undefined;
7
+ if (forwarded) {
8
+ if (Array.isArray(forwarded)) {
9
+ return forwarded[0];
10
+ }
11
+ const parts = forwarded.split(',').map((s) => s.trim());
12
+ if (parts.length) {
13
+ return parts[0];
14
+ }
15
+ }
16
+ if (req.ip) {
17
+ return req.ip;
18
+ }
19
+ if (req.socket && req.socket.remoteAddress) {
20
+ return req.socket.remoteAddress;
21
+ }
22
+ return undefined;
23
+ }
24
+
25
+ export function parseSetCookie(setCookie: string[]): CookieKV[] {
26
+ const out: CookieKV[] = [];
27
+ for (const raw of setCookie || []) {
28
+ const first = raw.split(';')[0]?.trim();
29
+ if (!first) {
30
+ continue;
31
+ }
32
+ const idx = first.indexOf('=');
33
+ if (idx > 0) {
34
+ out.push({ name: first.slice(0, idx), value: first.slice(idx + 1) });
35
+ }
36
+ }
37
+ return out;
38
+ }
39
+
40
+ export function getUserKeyFromRequest(req: express.Request): string | undefined {
41
+ const fromHeader = req.headers['x-user-key'];
42
+ if (typeof fromHeader === 'string' && fromHeader) {
43
+ return fromHeader;
44
+ }
45
+ const fromQuery = (req.query as any)?.userKey;
46
+ if (typeof fromQuery === 'string' && fromQuery) {
47
+ return fromQuery;
48
+ }
49
+ const sessionId = getSessionIdFromRequest(req as any);
50
+ if (sessionId) {
51
+ return `user_${sessionId}`;
52
+ }
53
+ return undefined;
54
+ }
55
+
56
+ export function getSessionIdFromRequest(req: any) {
57
+ return (
58
+ req.headers['mcp-session-id'] ||
59
+ req.query?.session_id ||
60
+ req.headers['x-session-id'] ||
61
+ req.body?.params?.session_id ||
62
+ req.body?.session_id ||
63
+ null
64
+ );
65
+ }
@@ -0,0 +1,39 @@
1
+ function base64UrlEncode(bytes: Uint8Array): string {
2
+ let bin = '';
3
+ for (let i = 0; i < bytes.length; i++) {
4
+ bin += String.fromCharCode(bytes[i]!);
5
+ }
6
+ const b64 = Buffer.from(bin, 'binary').toString('base64');
7
+ return b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
8
+ }
9
+
10
+ export function generateCodeVerifier(length: number = 32): string {
11
+ const arr = new Uint8Array(length);
12
+ if (typeof crypto !== 'undefined' && typeof (crypto as any).getRandomValues === 'function') {
13
+ (crypto as any).getRandomValues(arr);
14
+ } else {
15
+ const { randomBytes } = require('node:crypto');
16
+ const rb: Buffer = randomBytes(length);
17
+ for (let i = 0; i < length; i++) {
18
+ arr[i] = rb[i]!;
19
+ }
20
+ }
21
+ return base64UrlEncode(arr);
22
+ }
23
+
24
+ export async function challengeS256(verifier: string): Promise<string> {
25
+ const data = new TextEncoder().encode(verifier);
26
+ if (typeof crypto !== 'undefined' && (crypto as any).subtle?.digest) {
27
+ const hash = await (crypto as any).subtle.digest('SHA-256', data);
28
+ return base64UrlEncode(new Uint8Array(hash));
29
+ }
30
+ const { createHash } = require('node:crypto');
31
+ const hash = createHash('sha256').update(Buffer.from(data)).digest();
32
+ return base64UrlEncode(new Uint8Array(hash));
33
+ }
34
+
35
+ export async function generatePkcePair() {
36
+ const verifier = generateCodeVerifier();
37
+ const challenge = await challengeS256(verifier);
38
+ return { verifier, challenge } as const;
39
+ }
package/src/version.ts ADDED
@@ -0,0 +1,15 @@
1
+ import pkg from '../package.json';
2
+
3
+ export const NAME: string =
4
+ (
5
+ pkg as {
6
+ name?: string;
7
+ }
8
+ ).name || 'creatio-mcp';
9
+
10
+ export const VERSION: string =
11
+ (
12
+ pkg as {
13
+ version?: string;
14
+ }
15
+ ).version || '0.0.0';
package/tsconfig.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "compilerOptions": {
3
+ "rootDir": "./src",
4
+ "outDir": "./dist",
5
+ "module": "Node16",
6
+ "target": "es2022",
7
+ "lib": ["esnext"],
8
+ "types": ["node"],
9
+ "sourceMap": true,
10
+ "declaration": true,
11
+ "declarationMap": true,
12
+ "noUncheckedIndexedAccess": true,
13
+ "exactOptionalPropertyTypes": true,
14
+ "strict": true,
15
+ "jsx": "react-jsx",
16
+ "verbatimModuleSyntax": false,
17
+ "esModuleInterop": true,
18
+ "resolveJsonModule": true,
19
+ "moduleResolution": "Node16",
20
+ "isolatedModules": true,
21
+ "noUncheckedSideEffectImports": true,
22
+ "moduleDetection": "force",
23
+ "skipLibCheck": true
24
+ }
25
+ ,
26
+ "include": ["src/**/*.ts"],
27
+ "exclude": ["scripts/**"]
28
+ }