@codeqr/ts-mcp 0.9.0 → 0.24.0

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 (488) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +16 -218
  3. package/auth.d.mts +6 -0
  4. package/auth.d.mts.map +1 -0
  5. package/auth.d.ts +6 -0
  6. package/auth.d.ts.map +1 -0
  7. package/auth.js +37 -0
  8. package/auth.js.map +1 -0
  9. package/{headers.mjs → auth.mjs} +16 -2
  10. package/auth.mjs.map +1 -0
  11. package/code-tool-paths.cjs +8 -0
  12. package/code-tool-paths.cjs.map +1 -0
  13. package/code-tool-paths.d.cts +2 -0
  14. package/code-tool-paths.d.cts.map +1 -0
  15. package/code-tool-types.d.mts +7 -9
  16. package/code-tool-types.d.mts.map +1 -1
  17. package/code-tool-types.d.ts +7 -9
  18. package/code-tool-types.d.ts.map +1 -1
  19. package/code-tool-worker.d.mts +5 -0
  20. package/code-tool-worker.d.mts.map +1 -0
  21. package/code-tool-worker.d.ts +5 -0
  22. package/code-tool-worker.d.ts.map +1 -0
  23. package/code-tool-worker.js +291 -0
  24. package/code-tool-worker.js.map +1 -0
  25. package/code-tool-worker.mjs +253 -0
  26. package/code-tool-worker.mjs.map +1 -0
  27. package/code-tool.d.mts +12 -45
  28. package/code-tool.d.mts.map +1 -1
  29. package/code-tool.d.ts +12 -45
  30. package/code-tool.d.ts.map +1 -1
  31. package/code-tool.js +264 -27
  32. package/code-tool.js.map +1 -1
  33. package/code-tool.mjs +231 -27
  34. package/code-tool.mjs.map +1 -1
  35. package/docs-search-tool.d.mts +12 -3
  36. package/docs-search-tool.d.mts.map +1 -1
  37. package/docs-search-tool.d.ts +12 -3
  38. package/docs-search-tool.d.ts.map +1 -1
  39. package/docs-search-tool.js +23 -10
  40. package/docs-search-tool.js.map +1 -1
  41. package/docs-search-tool.mjs +22 -10
  42. package/docs-search-tool.mjs.map +1 -1
  43. package/http.d.mts +6 -3
  44. package/http.d.mts.map +1 -1
  45. package/http.d.ts +6 -3
  46. package/http.d.ts.map +1 -1
  47. package/http.js +130 -48
  48. package/http.js.map +1 -1
  49. package/http.mjs +130 -48
  50. package/http.mjs.map +1 -1
  51. package/index.js +19 -50
  52. package/index.js.map +1 -1
  53. package/index.mjs +19 -50
  54. package/index.mjs.map +1 -1
  55. package/instructions.d.mts +5 -0
  56. package/instructions.d.mts.map +1 -0
  57. package/instructions.d.ts +5 -0
  58. package/instructions.d.ts.map +1 -0
  59. package/instructions.js +45 -0
  60. package/instructions.js.map +1 -0
  61. package/instructions.mjs +39 -0
  62. package/instructions.mjs.map +1 -0
  63. package/local-docs-search.d.mts +28 -0
  64. package/local-docs-search.d.mts.map +1 -0
  65. package/local-docs-search.d.ts +28 -0
  66. package/local-docs-search.d.ts.map +1 -0
  67. package/local-docs-search.js +1259 -0
  68. package/local-docs-search.js.map +1 -0
  69. package/local-docs-search.mjs +1219 -0
  70. package/local-docs-search.mjs.map +1 -0
  71. package/logger.d.mts +7 -0
  72. package/logger.d.mts.map +1 -0
  73. package/logger.d.ts +7 -0
  74. package/logger.d.ts.map +1 -0
  75. package/logger.js +29 -0
  76. package/logger.js.map +1 -0
  77. package/logger.mjs +22 -0
  78. package/logger.mjs.map +1 -0
  79. package/methods.d.mts +10 -0
  80. package/methods.d.mts.map +1 -0
  81. package/methods.d.ts +10 -0
  82. package/methods.d.ts.map +1 -0
  83. package/methods.js +215 -0
  84. package/methods.js.map +1 -0
  85. package/methods.mjs +211 -0
  86. package/methods.mjs.map +1 -0
  87. package/options.d.mts +12 -9
  88. package/options.d.mts.map +1 -1
  89. package/options.d.ts +12 -9
  90. package/options.d.ts.map +1 -1
  91. package/options.js +67 -353
  92. package/options.js.map +1 -1
  93. package/options.mjs +67 -353
  94. package/options.mjs.map +1 -1
  95. package/package.json +94 -60
  96. package/server.d.mts +19 -16
  97. package/server.d.mts.map +1 -1
  98. package/server.d.ts +19 -16
  99. package/server.d.ts.map +1 -1
  100. package/server.js +95 -101
  101. package/server.js.map +1 -1
  102. package/server.mjs +94 -96
  103. package/server.mjs.map +1 -1
  104. package/src/{headers.ts → auth.ts} +18 -1
  105. package/src/code-tool-paths.cts +5 -0
  106. package/src/code-tool-types.ts +8 -9
  107. package/src/code-tool-worker.ts +304 -0
  108. package/src/code-tool.ts +292 -36
  109. package/src/docs-search-tool.ts +34 -14
  110. package/src/http.ts +154 -54
  111. package/src/index.ts +22 -63
  112. package/src/instructions.ts +57 -0
  113. package/src/local-docs-search.ts +1368 -0
  114. package/src/logger.ts +28 -0
  115. package/src/methods.ts +236 -0
  116. package/src/options.ts +90 -378
  117. package/src/server.ts +118 -117
  118. package/src/stdio.ts +9 -5
  119. package/src/{tools/types.ts → types.ts} +16 -5
  120. package/src/util.ts +25 -0
  121. package/stdio.d.mts +1 -1
  122. package/stdio.d.mts.map +1 -1
  123. package/stdio.d.ts +1 -1
  124. package/stdio.d.ts.map +1 -1
  125. package/stdio.js +8 -4
  126. package/stdio.js.map +1 -1
  127. package/stdio.mjs +8 -4
  128. package/stdio.mjs.map +1 -1
  129. package/{tools/types.d.mts → types.d.mts} +15 -2
  130. package/types.d.mts.map +1 -0
  131. package/{tools/types.d.ts → types.d.ts} +15 -2
  132. package/types.d.ts.map +1 -0
  133. package/types.js.map +1 -0
  134. package/types.mjs.map +1 -0
  135. package/util.d.mts +4 -0
  136. package/util.d.mts.map +1 -0
  137. package/util.d.ts +4 -0
  138. package/util.d.ts.map +1 -0
  139. package/util.js +30 -0
  140. package/util.js.map +1 -0
  141. package/util.mjs +24 -0
  142. package/util.mjs.map +1 -0
  143. package/compat.d.mts +0 -58
  144. package/compat.d.mts.map +0 -1
  145. package/compat.d.ts +0 -58
  146. package/compat.d.ts.map +0 -1
  147. package/compat.js +0 -387
  148. package/compat.js.map +0 -1
  149. package/compat.mjs +0 -378
  150. package/compat.mjs.map +0 -1
  151. package/dynamic-tools.d.mts +0 -12
  152. package/dynamic-tools.d.mts.map +0 -1
  153. package/dynamic-tools.d.ts +0 -12
  154. package/dynamic-tools.d.ts.map +0 -1
  155. package/dynamic-tools.js +0 -135
  156. package/dynamic-tools.js.map +0 -1
  157. package/dynamic-tools.mjs +0 -132
  158. package/dynamic-tools.mjs.map +0 -1
  159. package/filtering.d.mts +0 -3
  160. package/filtering.d.mts.map +0 -1
  161. package/filtering.d.ts +0 -3
  162. package/filtering.d.ts.map +0 -1
  163. package/filtering.js +0 -24
  164. package/filtering.js.map +0 -1
  165. package/filtering.mjs +0 -16
  166. package/filtering.mjs.map +0 -1
  167. package/headers.d.mts +0 -4
  168. package/headers.d.mts.map +0 -1
  169. package/headers.d.ts +0 -4
  170. package/headers.d.ts.map +0 -1
  171. package/headers.js +0 -22
  172. package/headers.js.map +0 -1
  173. package/headers.mjs.map +0 -1
  174. package/src/compat.ts +0 -483
  175. package/src/dynamic-tools.ts +0 -153
  176. package/src/filtering.ts +0 -18
  177. package/src/tools/analytics/retrieve-analytics.ts +0 -441
  178. package/src/tools/domains/create-domains.ts +0 -75
  179. package/src/tools/domains/delete-domains.ts +0 -55
  180. package/src/tools/domains/list-domains.ts +0 -68
  181. package/src/tools/domains/update-domains.ts +0 -79
  182. package/src/tools/events/list-events.ts +0 -421
  183. package/src/tools/index.ts +0 -133
  184. package/src/tools/links/bulk/create-links-bulk.ts +0 -966
  185. package/src/tools/links/bulk/delete-links-bulk.ts +0 -59
  186. package/src/tools/links/count-links.ts +0 -957
  187. package/src/tools/links/create-links.ts +0 -957
  188. package/src/tools/links/delete-links.ts +0 -56
  189. package/src/tools/links/list-links.ts +0 -980
  190. package/src/tools/links/retrieve-info-links.ts +0 -75
  191. package/src/tools/links/update-links.ts +0 -964
  192. package/src/tools/links/upsert-links.ts +0 -958
  193. package/src/tools/projects/list-projects.ts +0 -51
  194. package/src/tools/projects/retrieve-projects.ts +0 -56
  195. package/src/tools/qrcodes/bulk/create-qrcodes-bulk.ts +0 -1077
  196. package/src/tools/qrcodes/bulk/delete-qrcodes-bulk.ts +0 -59
  197. package/src/tools/qrcodes/count-qrcodes.ts +0 -220
  198. package/src/tools/qrcodes/create-qrcodes.ts +0 -1067
  199. package/src/tools/qrcodes/delete-qrcodes.ts +0 -56
  200. package/src/tools/qrcodes/list-qrcodes.ts +0 -221
  201. package/src/tools/qrcodes/retrieve-qrcodes.ts +0 -67
  202. package/src/tools/qrcodes/update-qrcodes.ts +0 -1074
  203. package/src/tools/qrcodes/upsert-qrcodes.ts +0 -1068
  204. package/src/tools/tags/create-tags.ts +0 -59
  205. package/src/tools/tags/delete-tags.ts +0 -55
  206. package/src/tools/tags/list-tags.ts +0 -87
  207. package/src/tools/tags/update-tags.ts +0 -63
  208. package/src/tools/track/track-lead-track.ts +0 -93
  209. package/src/tools/track/track-sale-track.ts +0 -108
  210. package/src/tools.ts +0 -1
  211. package/tools/analytics/retrieve-analytics.d.mts +0 -51
  212. package/tools/analytics/retrieve-analytics.d.mts.map +0 -1
  213. package/tools/analytics/retrieve-analytics.d.ts +0 -51
  214. package/tools/analytics/retrieve-analytics.d.ts.map +0 -1
  215. package/tools/analytics/retrieve-analytics.js +0 -438
  216. package/tools/analytics/retrieve-analytics.js.map +0 -1
  217. package/tools/analytics/retrieve-analytics.mjs +0 -431
  218. package/tools/analytics/retrieve-analytics.mjs.map +0 -1
  219. package/tools/domains/create-domains.d.mts +0 -51
  220. package/tools/domains/create-domains.d.mts.map +0 -1
  221. package/tools/domains/create-domains.d.ts +0 -51
  222. package/tools/domains/create-domains.d.ts.map +0 -1
  223. package/tools/domains/create-domains.js +0 -74
  224. package/tools/domains/create-domains.js.map +0 -1
  225. package/tools/domains/create-domains.mjs +0 -67
  226. package/tools/domains/create-domains.mjs.map +0 -1
  227. package/tools/domains/delete-domains.d.mts +0 -51
  228. package/tools/domains/delete-domains.d.mts.map +0 -1
  229. package/tools/domains/delete-domains.d.ts +0 -51
  230. package/tools/domains/delete-domains.d.ts.map +0 -1
  231. package/tools/domains/delete-domains.js +0 -55
  232. package/tools/domains/delete-domains.js.map +0 -1
  233. package/tools/domains/delete-domains.mjs +0 -48
  234. package/tools/domains/delete-domains.mjs.map +0 -1
  235. package/tools/domains/list-domains.d.mts +0 -51
  236. package/tools/domains/list-domains.d.mts.map +0 -1
  237. package/tools/domains/list-domains.d.ts +0 -51
  238. package/tools/domains/list-domains.d.ts.map +0 -1
  239. package/tools/domains/list-domains.js +0 -67
  240. package/tools/domains/list-domains.js.map +0 -1
  241. package/tools/domains/list-domains.mjs +0 -60
  242. package/tools/domains/list-domains.mjs.map +0 -1
  243. package/tools/domains/update-domains.d.mts +0 -51
  244. package/tools/domains/update-domains.d.mts.map +0 -1
  245. package/tools/domains/update-domains.d.ts +0 -51
  246. package/tools/domains/update-domains.d.ts.map +0 -1
  247. package/tools/domains/update-domains.js +0 -78
  248. package/tools/domains/update-domains.js.map +0 -1
  249. package/tools/domains/update-domains.mjs +0 -71
  250. package/tools/domains/update-domains.mjs.map +0 -1
  251. package/tools/events/list-events.d.mts +0 -51
  252. package/tools/events/list-events.d.mts.map +0 -1
  253. package/tools/events/list-events.d.ts +0 -51
  254. package/tools/events/list-events.d.ts.map +0 -1
  255. package/tools/events/list-events.js +0 -418
  256. package/tools/events/list-events.js.map +0 -1
  257. package/tools/events/list-events.mjs +0 -411
  258. package/tools/events/list-events.mjs.map +0 -1
  259. package/tools/index.d.mts +0 -10
  260. package/tools/index.d.mts.map +0 -1
  261. package/tools/index.d.ts +0 -10
  262. package/tools/index.d.ts.map +0 -1
  263. package/tools/index.js +0 -117
  264. package/tools/index.js.map +0 -1
  265. package/tools/index.mjs +0 -110
  266. package/tools/index.mjs.map +0 -1
  267. package/tools/links/bulk/create-links-bulk.d.mts +0 -51
  268. package/tools/links/bulk/create-links-bulk.d.mts.map +0 -1
  269. package/tools/links/bulk/create-links-bulk.d.ts +0 -51
  270. package/tools/links/bulk/create-links-bulk.d.ts.map +0 -1
  271. package/tools/links/bulk/create-links-bulk.js +0 -956
  272. package/tools/links/bulk/create-links-bulk.js.map +0 -1
  273. package/tools/links/bulk/create-links-bulk.mjs +0 -949
  274. package/tools/links/bulk/create-links-bulk.mjs.map +0 -1
  275. package/tools/links/bulk/delete-links-bulk.d.mts +0 -51
  276. package/tools/links/bulk/delete-links-bulk.d.mts.map +0 -1
  277. package/tools/links/bulk/delete-links-bulk.d.ts +0 -51
  278. package/tools/links/bulk/delete-links-bulk.d.ts.map +0 -1
  279. package/tools/links/bulk/delete-links-bulk.js +0 -58
  280. package/tools/links/bulk/delete-links-bulk.js.map +0 -1
  281. package/tools/links/bulk/delete-links-bulk.mjs +0 -51
  282. package/tools/links/bulk/delete-links-bulk.mjs.map +0 -1
  283. package/tools/links/count-links.d.mts +0 -51
  284. package/tools/links/count-links.d.mts.map +0 -1
  285. package/tools/links/count-links.d.ts +0 -51
  286. package/tools/links/count-links.d.ts.map +0 -1
  287. package/tools/links/count-links.js +0 -951
  288. package/tools/links/count-links.js.map +0 -1
  289. package/tools/links/count-links.mjs +0 -944
  290. package/tools/links/count-links.mjs.map +0 -1
  291. package/tools/links/create-links.d.mts +0 -51
  292. package/tools/links/create-links.d.mts.map +0 -1
  293. package/tools/links/create-links.d.ts +0 -51
  294. package/tools/links/create-links.d.ts.map +0 -1
  295. package/tools/links/create-links.js +0 -947
  296. package/tools/links/create-links.js.map +0 -1
  297. package/tools/links/create-links.mjs +0 -940
  298. package/tools/links/create-links.mjs.map +0 -1
  299. package/tools/links/delete-links.d.mts +0 -51
  300. package/tools/links/delete-links.d.mts.map +0 -1
  301. package/tools/links/delete-links.d.ts +0 -51
  302. package/tools/links/delete-links.d.ts.map +0 -1
  303. package/tools/links/delete-links.js +0 -55
  304. package/tools/links/delete-links.js.map +0 -1
  305. package/tools/links/delete-links.mjs +0 -48
  306. package/tools/links/delete-links.mjs.map +0 -1
  307. package/tools/links/list-links.d.mts +0 -51
  308. package/tools/links/list-links.d.mts.map +0 -1
  309. package/tools/links/list-links.d.ts +0 -51
  310. package/tools/links/list-links.d.ts.map +0 -1
  311. package/tools/links/list-links.js +0 -973
  312. package/tools/links/list-links.js.map +0 -1
  313. package/tools/links/list-links.mjs +0 -966
  314. package/tools/links/list-links.mjs.map +0 -1
  315. package/tools/links/retrieve-info-links.d.mts +0 -51
  316. package/tools/links/retrieve-info-links.d.mts.map +0 -1
  317. package/tools/links/retrieve-info-links.d.ts +0 -51
  318. package/tools/links/retrieve-info-links.d.ts.map +0 -1
  319. package/tools/links/retrieve-info-links.js +0 -71
  320. package/tools/links/retrieve-info-links.js.map +0 -1
  321. package/tools/links/retrieve-info-links.mjs +0 -64
  322. package/tools/links/retrieve-info-links.mjs.map +0 -1
  323. package/tools/links/update-links.d.mts +0 -51
  324. package/tools/links/update-links.d.mts.map +0 -1
  325. package/tools/links/update-links.d.ts +0 -51
  326. package/tools/links/update-links.d.ts.map +0 -1
  327. package/tools/links/update-links.js +0 -953
  328. package/tools/links/update-links.js.map +0 -1
  329. package/tools/links/update-links.mjs +0 -946
  330. package/tools/links/update-links.mjs.map +0 -1
  331. package/tools/links/upsert-links.d.mts +0 -51
  332. package/tools/links/upsert-links.d.mts.map +0 -1
  333. package/tools/links/upsert-links.d.ts +0 -51
  334. package/tools/links/upsert-links.d.ts.map +0 -1
  335. package/tools/links/upsert-links.js +0 -947
  336. package/tools/links/upsert-links.js.map +0 -1
  337. package/tools/links/upsert-links.mjs +0 -940
  338. package/tools/links/upsert-links.mjs.map +0 -1
  339. package/tools/projects/list-projects.d.mts +0 -51
  340. package/tools/projects/list-projects.d.mts.map +0 -1
  341. package/tools/projects/list-projects.d.ts +0 -51
  342. package/tools/projects/list-projects.d.ts.map +0 -1
  343. package/tools/projects/list-projects.js +0 -51
  344. package/tools/projects/list-projects.js.map +0 -1
  345. package/tools/projects/list-projects.mjs +0 -44
  346. package/tools/projects/list-projects.mjs.map +0 -1
  347. package/tools/projects/retrieve-projects.d.mts +0 -51
  348. package/tools/projects/retrieve-projects.d.mts.map +0 -1
  349. package/tools/projects/retrieve-projects.d.ts +0 -51
  350. package/tools/projects/retrieve-projects.d.ts.map +0 -1
  351. package/tools/projects/retrieve-projects.js +0 -55
  352. package/tools/projects/retrieve-projects.js.map +0 -1
  353. package/tools/projects/retrieve-projects.mjs +0 -48
  354. package/tools/projects/retrieve-projects.mjs.map +0 -1
  355. package/tools/qrcodes/bulk/create-qrcodes-bulk.d.mts +0 -51
  356. package/tools/qrcodes/bulk/create-qrcodes-bulk.d.mts.map +0 -1
  357. package/tools/qrcodes/bulk/create-qrcodes-bulk.d.ts +0 -51
  358. package/tools/qrcodes/bulk/create-qrcodes-bulk.d.ts.map +0 -1
  359. package/tools/qrcodes/bulk/create-qrcodes-bulk.js +0 -1068
  360. package/tools/qrcodes/bulk/create-qrcodes-bulk.js.map +0 -1
  361. package/tools/qrcodes/bulk/create-qrcodes-bulk.mjs +0 -1061
  362. package/tools/qrcodes/bulk/create-qrcodes-bulk.mjs.map +0 -1
  363. package/tools/qrcodes/bulk/delete-qrcodes-bulk.d.mts +0 -51
  364. package/tools/qrcodes/bulk/delete-qrcodes-bulk.d.mts.map +0 -1
  365. package/tools/qrcodes/bulk/delete-qrcodes-bulk.d.ts +0 -51
  366. package/tools/qrcodes/bulk/delete-qrcodes-bulk.d.ts.map +0 -1
  367. package/tools/qrcodes/bulk/delete-qrcodes-bulk.js +0 -58
  368. package/tools/qrcodes/bulk/delete-qrcodes-bulk.js.map +0 -1
  369. package/tools/qrcodes/bulk/delete-qrcodes-bulk.mjs +0 -51
  370. package/tools/qrcodes/bulk/delete-qrcodes-bulk.mjs.map +0 -1
  371. package/tools/qrcodes/count-qrcodes.d.mts +0 -51
  372. package/tools/qrcodes/count-qrcodes.d.mts.map +0 -1
  373. package/tools/qrcodes/count-qrcodes.d.ts +0 -51
  374. package/tools/qrcodes/count-qrcodes.d.ts.map +0 -1
  375. package/tools/qrcodes/count-qrcodes.js +0 -215
  376. package/tools/qrcodes/count-qrcodes.js.map +0 -1
  377. package/tools/qrcodes/count-qrcodes.mjs +0 -208
  378. package/tools/qrcodes/count-qrcodes.mjs.map +0 -1
  379. package/tools/qrcodes/create-qrcodes.d.mts +0 -51
  380. package/tools/qrcodes/create-qrcodes.d.mts.map +0 -1
  381. package/tools/qrcodes/create-qrcodes.d.ts +0 -51
  382. package/tools/qrcodes/create-qrcodes.d.ts.map +0 -1
  383. package/tools/qrcodes/create-qrcodes.js +0 -1059
  384. package/tools/qrcodes/create-qrcodes.js.map +0 -1
  385. package/tools/qrcodes/create-qrcodes.mjs +0 -1052
  386. package/tools/qrcodes/create-qrcodes.mjs.map +0 -1
  387. package/tools/qrcodes/delete-qrcodes.d.mts +0 -51
  388. package/tools/qrcodes/delete-qrcodes.d.mts.map +0 -1
  389. package/tools/qrcodes/delete-qrcodes.d.ts +0 -51
  390. package/tools/qrcodes/delete-qrcodes.d.ts.map +0 -1
  391. package/tools/qrcodes/delete-qrcodes.js +0 -55
  392. package/tools/qrcodes/delete-qrcodes.js.map +0 -1
  393. package/tools/qrcodes/delete-qrcodes.mjs +0 -48
  394. package/tools/qrcodes/delete-qrcodes.mjs.map +0 -1
  395. package/tools/qrcodes/list-qrcodes.d.mts +0 -51
  396. package/tools/qrcodes/list-qrcodes.d.mts.map +0 -1
  397. package/tools/qrcodes/list-qrcodes.d.ts +0 -51
  398. package/tools/qrcodes/list-qrcodes.d.ts.map +0 -1
  399. package/tools/qrcodes/list-qrcodes.js +0 -217
  400. package/tools/qrcodes/list-qrcodes.js.map +0 -1
  401. package/tools/qrcodes/list-qrcodes.mjs +0 -210
  402. package/tools/qrcodes/list-qrcodes.mjs.map +0 -1
  403. package/tools/qrcodes/retrieve-qrcodes.d.mts +0 -51
  404. package/tools/qrcodes/retrieve-qrcodes.d.mts.map +0 -1
  405. package/tools/qrcodes/retrieve-qrcodes.d.ts +0 -51
  406. package/tools/qrcodes/retrieve-qrcodes.d.ts.map +0 -1
  407. package/tools/qrcodes/retrieve-qrcodes.js +0 -65
  408. package/tools/qrcodes/retrieve-qrcodes.js.map +0 -1
  409. package/tools/qrcodes/retrieve-qrcodes.mjs +0 -58
  410. package/tools/qrcodes/retrieve-qrcodes.mjs.map +0 -1
  411. package/tools/qrcodes/update-qrcodes.d.mts +0 -51
  412. package/tools/qrcodes/update-qrcodes.d.mts.map +0 -1
  413. package/tools/qrcodes/update-qrcodes.d.ts +0 -51
  414. package/tools/qrcodes/update-qrcodes.d.ts.map +0 -1
  415. package/tools/qrcodes/update-qrcodes.js +0 -1065
  416. package/tools/qrcodes/update-qrcodes.js.map +0 -1
  417. package/tools/qrcodes/update-qrcodes.mjs +0 -1058
  418. package/tools/qrcodes/update-qrcodes.mjs.map +0 -1
  419. package/tools/qrcodes/upsert-qrcodes.d.mts +0 -51
  420. package/tools/qrcodes/upsert-qrcodes.d.mts.map +0 -1
  421. package/tools/qrcodes/upsert-qrcodes.d.ts +0 -51
  422. package/tools/qrcodes/upsert-qrcodes.d.ts.map +0 -1
  423. package/tools/qrcodes/upsert-qrcodes.js +0 -1059
  424. package/tools/qrcodes/upsert-qrcodes.js.map +0 -1
  425. package/tools/qrcodes/upsert-qrcodes.mjs +0 -1052
  426. package/tools/qrcodes/upsert-qrcodes.mjs.map +0 -1
  427. package/tools/tags/create-tags.d.mts +0 -51
  428. package/tools/tags/create-tags.d.mts.map +0 -1
  429. package/tools/tags/create-tags.d.ts +0 -51
  430. package/tools/tags/create-tags.d.ts.map +0 -1
  431. package/tools/tags/create-tags.js +0 -58
  432. package/tools/tags/create-tags.js.map +0 -1
  433. package/tools/tags/create-tags.mjs +0 -51
  434. package/tools/tags/create-tags.mjs.map +0 -1
  435. package/tools/tags/delete-tags.d.mts +0 -51
  436. package/tools/tags/delete-tags.d.mts.map +0 -1
  437. package/tools/tags/delete-tags.d.ts +0 -51
  438. package/tools/tags/delete-tags.d.ts.map +0 -1
  439. package/tools/tags/delete-tags.js +0 -55
  440. package/tools/tags/delete-tags.js.map +0 -1
  441. package/tools/tags/delete-tags.mjs +0 -48
  442. package/tools/tags/delete-tags.mjs.map +0 -1
  443. package/tools/tags/list-tags.d.mts +0 -51
  444. package/tools/tags/list-tags.d.mts.map +0 -1
  445. package/tools/tags/list-tags.d.ts +0 -51
  446. package/tools/tags/list-tags.d.ts.map +0 -1
  447. package/tools/tags/list-tags.js +0 -87
  448. package/tools/tags/list-tags.js.map +0 -1
  449. package/tools/tags/list-tags.mjs +0 -80
  450. package/tools/tags/list-tags.mjs.map +0 -1
  451. package/tools/tags/update-tags.d.mts +0 -51
  452. package/tools/tags/update-tags.d.mts.map +0 -1
  453. package/tools/tags/update-tags.d.ts +0 -51
  454. package/tools/tags/update-tags.d.ts.map +0 -1
  455. package/tools/tags/update-tags.js +0 -63
  456. package/tools/tags/update-tags.js.map +0 -1
  457. package/tools/tags/update-tags.mjs +0 -56
  458. package/tools/tags/update-tags.mjs.map +0 -1
  459. package/tools/track/track-lead-track.d.mts +0 -51
  460. package/tools/track/track-lead-track.d.mts.map +0 -1
  461. package/tools/track/track-lead-track.d.ts +0 -51
  462. package/tools/track/track-lead-track.d.ts.map +0 -1
  463. package/tools/track/track-lead-track.js +0 -87
  464. package/tools/track/track-lead-track.js.map +0 -1
  465. package/tools/track/track-lead-track.mjs +0 -80
  466. package/tools/track/track-lead-track.mjs.map +0 -1
  467. package/tools/track/track-sale-track.d.mts +0 -51
  468. package/tools/track/track-sale-track.d.mts.map +0 -1
  469. package/tools/track/track-sale-track.d.ts +0 -51
  470. package/tools/track/track-sale-track.d.ts.map +0 -1
  471. package/tools/track/track-sale-track.js +0 -99
  472. package/tools/track/track-sale-track.js.map +0 -1
  473. package/tools/track/track-sale-track.mjs +0 -92
  474. package/tools/track/track-sale-track.mjs.map +0 -1
  475. package/tools/types.d.mts.map +0 -1
  476. package/tools/types.d.ts.map +0 -1
  477. package/tools/types.js.map +0 -1
  478. package/tools/types.mjs.map +0 -1
  479. package/tools.d.mts +0 -2
  480. package/tools.d.mts.map +0 -1
  481. package/tools.d.ts +0 -2
  482. package/tools.d.ts.map +0 -1
  483. package/tools.js +0 -18
  484. package/tools.js.map +0 -1
  485. package/tools.mjs +0 -2
  486. package/tools.mjs.map +0 -1
  487. /package/{tools/types.js → types.js} +0 -0
  488. /package/{tools/types.mjs → types.mjs} +0 -0
@@ -1,8 +1,9 @@
1
1
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
- import { Metadata, asTextContentResult } from './tools/types';
4
-
5
3
  import { Tool } from '@modelcontextprotocol/sdk/types.js';
4
+ import { Metadata, McpRequestContext, asTextContentResult } from './types';
5
+
6
+ import type { LocalDocsSearch } from './local-docs-search';
6
7
 
7
8
  export const metadata: Metadata = {
8
9
  resource: 'all',
@@ -13,7 +14,8 @@ export const metadata: Metadata = {
13
14
 
14
15
  export const tool: Tool = {
15
16
  name: 'search_docs',
16
- description: 'Search for documentation for how to use the client to interact with the API.',
17
+ description:
18
+ 'Search SDK documentation to find methods, parameters, and usage examples for interacting with the API. Use this before writing code when you need to discover the right approach.',
17
19
  inputSchema: {
18
20
  type: 'object',
19
21
  properties: {
@@ -39,21 +41,39 @@ export const tool: Tool = {
39
41
  },
40
42
  };
41
43
 
42
- const docsSearchURL =
43
- process.env['DOCS_SEARCH_URL'] || 'https://api.stainless.com/api/projects/codeqr/docs/search';
44
+ let _localSearch: LocalDocsSearch | undefined;
44
45
 
45
- export const handler = async (_: unknown, args: Record<string, unknown> | undefined) => {
46
- const body = args as any;
47
- const query = new URLSearchParams(body).toString();
48
- const result = await fetch(`${docsSearchURL}?${query}`);
46
+ export function setLocalSearch(search: LocalDocsSearch): void {
47
+ _localSearch = search;
48
+ }
49
49
 
50
- if (!result.ok) {
51
- throw new Error(
52
- `${result.status}: ${result.statusText} when using doc search tool. Details: ${await result.text()}`,
53
- );
50
+ async function searchLocal(args: Record<string, unknown>): Promise<unknown> {
51
+ if (!_localSearch) {
52
+ throw new Error('Local search not initialized');
54
53
  }
55
54
 
56
- return asTextContentResult(await result.json());
55
+ const query = (args['query'] as string) ?? '';
56
+ const language = (args['language'] as string) ?? 'typescript';
57
+ const detail = (args['detail'] as string) ?? 'default';
58
+
59
+ return _localSearch.search({
60
+ query,
61
+ language,
62
+ detail,
63
+ maxResults: 10,
64
+ }).results;
65
+ }
66
+
67
+ export const handler = async ({
68
+ reqContext,
69
+ args,
70
+ }: {
71
+ reqContext: McpRequestContext;
72
+ args: Record<string, unknown> | undefined;
73
+ }) => {
74
+ const body = args ?? {};
75
+
76
+ return asTextContentResult(await searchLocal(body));
57
77
  };
58
78
 
59
79
  export default { metadata, tool, handler };
package/src/http.ts CHANGED
@@ -2,16 +2,18 @@
2
2
 
3
3
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp';
4
4
  import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
5
-
5
+ import { ClientOptions } from '@codeqr/ts';
6
6
  import express from 'express';
7
- import { fromError } from 'zod-validation-error/v3';
8
- import { McpOptions, parseQueryOptions } from './options';
9
- import { ClientOptions, initMcpServer, newMcpServer } from './server';
10
- import { parseAuthHeaders } from './headers';
7
+ import pino from 'pino';
8
+ import pinoHttp from 'pino-http';
9
+ import { getStainlessApiKey, parseClientAuthHeaders } from './auth';
10
+ import { getLogger } from './logger';
11
+ import { McpOptions } from './options';
12
+ import { initMcpServer, newMcpServer } from './server';
11
13
 
12
- const newServer = ({
14
+ const newServer = async ({
13
15
  clientOptions,
14
- mcpOptions: defaultMcpOptions,
16
+ mcpOptions,
15
17
  req,
16
18
  res,
17
19
  }: {
@@ -19,42 +21,74 @@ const newServer = ({
19
21
  mcpOptions: McpOptions;
20
22
  req: express.Request;
21
23
  res: express.Response;
22
- }): McpServer | null => {
23
- const server = newMcpServer();
24
-
25
- let mcpOptions: McpOptions;
26
- try {
27
- mcpOptions = parseQueryOptions(defaultMcpOptions, req.query);
28
- } catch (error) {
29
- res.status(400).json({
30
- jsonrpc: '2.0',
31
- error: {
32
- code: -32000,
33
- message: `Invalid request: ${fromError(error)}`,
34
- },
35
- });
36
- return null;
24
+ }): Promise<McpServer | null> => {
25
+ const stainlessApiKey = getStainlessApiKey(req, mcpOptions);
26
+ const customInstructionsPath = mcpOptions.customInstructionsPath;
27
+ const server = await newMcpServer({ stainlessApiKey, customInstructionsPath });
28
+
29
+ const authOptions = parseClientAuthHeaders(req, false);
30
+
31
+ let upstreamClientEnvs: Record<string, string> | undefined;
32
+ const clientEnvsHeader = req.headers['x-stainless-mcp-client-envs'];
33
+ if (typeof clientEnvsHeader === 'string') {
34
+ try {
35
+ const parsed = JSON.parse(clientEnvsHeader);
36
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
37
+ upstreamClientEnvs = parsed;
38
+ }
39
+ } catch {
40
+ // Ignore malformed header
41
+ }
37
42
  }
38
43
 
39
- try {
40
- const authOptions = parseAuthHeaders(req);
41
- initMcpServer({
42
- server: server,
43
- clientOptions: {
44
- ...clientOptions,
45
- ...authOptions,
46
- },
47
- mcpOptions,
48
- });
49
- } catch (error) {
50
- res.status(401).json({
51
- jsonrpc: '2.0',
52
- error: {
53
- code: -32000,
54
- message: `Unauthorized: ${error instanceof Error ? error.message : error}`,
55
- },
56
- });
57
- return null;
44
+ // Parse x-stainless-mcp-client-permissions header to override permission options
45
+ //
46
+ // Note: Permissions are best-effort and intended to prevent clients from doing unexpected things;
47
+ // they're not a hard security boundary, so we allow arbitrary, client-driven overrides.
48
+ //
49
+ // See the Stainless MCP documentation for more details.
50
+ let effectiveMcpOptions = mcpOptions;
51
+ const clientPermissionsHeader = req.headers['x-stainless-mcp-client-permissions'];
52
+ if (typeof clientPermissionsHeader === 'string') {
53
+ try {
54
+ const parsed = JSON.parse(clientPermissionsHeader);
55
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
56
+ effectiveMcpOptions = {
57
+ ...mcpOptions,
58
+ ...(typeof parsed.allow_http_gets === 'boolean' && { codeAllowHttpGets: parsed.allow_http_gets }),
59
+ ...(Array.isArray(parsed.allowed_methods) && { codeAllowedMethods: parsed.allowed_methods }),
60
+ ...(Array.isArray(parsed.blocked_methods) && { codeBlockedMethods: parsed.blocked_methods }),
61
+ };
62
+ getLogger().info(
63
+ { clientPermissions: parsed },
64
+ 'Overriding code execution permissions from x-stainless-mcp-client-permissions header',
65
+ );
66
+ }
67
+ } catch (error) {
68
+ getLogger().warn({ error }, 'Failed to parse x-stainless-mcp-client-permissions header');
69
+ }
70
+ }
71
+
72
+ const mcpClientInfo =
73
+ typeof req.body?.params?.clientInfo?.name === 'string' ?
74
+ { name: req.body.params.clientInfo.name, version: String(req.body.params.clientInfo.version ?? '') }
75
+ : undefined;
76
+
77
+ await initMcpServer({
78
+ server: server,
79
+ mcpOptions: effectiveMcpOptions,
80
+ clientOptions: {
81
+ ...clientOptions,
82
+ ...authOptions,
83
+ },
84
+ stainlessApiKey: stainlessApiKey,
85
+ upstreamClientEnvs,
86
+ mcpSessionId: (req as any).mcpSessionId,
87
+ mcpClientInfo,
88
+ });
89
+
90
+ if (mcpClientInfo) {
91
+ getLogger().info({ mcpSessionId: (req as any).mcpSessionId, mcpClientInfo }, 'MCP client connected');
58
92
  }
59
93
 
60
94
  return server;
@@ -63,14 +97,11 @@ const newServer = ({
63
97
  const post =
64
98
  (options: { clientOptions: ClientOptions; mcpOptions: McpOptions }) =>
65
99
  async (req: express.Request, res: express.Response) => {
66
- const server = newServer({ ...options, req, res });
100
+ const server = await newServer({ ...options, req, res });
67
101
  // If we return null, we already set the authorization error.
68
102
  if (server === null) return;
69
- const transport = new StreamableHTTPServerTransport({
70
- // Stateless server
71
- sessionIdGenerator: undefined,
72
- });
73
- await server.connect(transport);
103
+ const transport = new StreamableHTTPServerTransport();
104
+ await server.connect(transport as any);
74
105
  await transport.handleRequest(req, res, req.body);
75
106
  };
76
107
 
@@ -94,17 +125,78 @@ const del = async (req: express.Request, res: express.Response) => {
94
125
  });
95
126
  };
96
127
 
128
+ const redactHeaders = (headers: Record<string, any>) => {
129
+ const hiddenHeaders = /auth|cookie|key|token|x-stainless-mcp-client-envs/i;
130
+ const filtered = { ...headers };
131
+ Object.keys(filtered).forEach((key) => {
132
+ if (hiddenHeaders.test(key)) {
133
+ filtered[key] = '[REDACTED]';
134
+ }
135
+ });
136
+ return filtered;
137
+ };
138
+
97
139
  export const streamableHTTPApp = ({
98
140
  clientOptions = {},
99
- mcpOptions = {},
141
+ mcpOptions,
100
142
  }: {
101
143
  clientOptions?: ClientOptions;
102
- mcpOptions?: McpOptions;
144
+ mcpOptions: McpOptions;
103
145
  }): express.Express => {
104
146
  const app = express();
105
147
  app.set('query parser', 'extended');
106
148
  app.use(express.json());
149
+ app.use((req: express.Request, res: express.Response, next: express.NextFunction) => {
150
+ const existing = req.headers['mcp-session-id'];
151
+ const sessionId = (Array.isArray(existing) ? existing[0] : existing) || crypto.randomUUID();
152
+ (req as any).mcpSessionId = sessionId;
153
+ const origWriteHead = res.writeHead.bind(res);
154
+ res.writeHead = function (statusCode: number, ...rest: any[]) {
155
+ res.setHeader('mcp-session-id', sessionId);
156
+ return origWriteHead(statusCode, ...rest);
157
+ } as typeof res.writeHead;
158
+ next();
159
+ });
160
+ app.use(
161
+ pinoHttp({
162
+ logger: getLogger(),
163
+ customProps: (req) => ({
164
+ mcpSessionId: (req as any).mcpSessionId,
165
+ }),
166
+ customLogLevel: (req, res) => {
167
+ if (res.statusCode >= 500) {
168
+ return 'error';
169
+ } else if (res.statusCode >= 400) {
170
+ return 'warn';
171
+ }
172
+ return 'info';
173
+ },
174
+ customSuccessMessage: function (req, res) {
175
+ return `Request ${req.method} to ${req.url} completed with status ${res.statusCode}`;
176
+ },
177
+ customErrorMessage: function (req, res, err) {
178
+ return `Request ${req.method} to ${req.url} errored with status ${res.statusCode}`;
179
+ },
180
+ serializers: {
181
+ req: pino.stdSerializers.wrapRequestSerializer((req) => {
182
+ return {
183
+ ...req,
184
+ headers: redactHeaders(req.raw.headers),
185
+ };
186
+ }),
187
+ res: pino.stdSerializers.wrapResponseSerializer((res) => {
188
+ return {
189
+ ...res,
190
+ headers: redactHeaders(res.headers),
191
+ };
192
+ }),
193
+ },
194
+ }),
195
+ );
107
196
 
197
+ app.get('/health', async (req: express.Request, res: express.Response) => {
198
+ res.status(200).send('OK');
199
+ });
108
200
  app.get('/', get);
109
201
  app.post('/', post({ clientOptions, mcpOptions }));
110
202
  app.delete('/', del);
@@ -112,16 +204,24 @@ export const streamableHTTPApp = ({
112
204
  return app;
113
205
  };
114
206
 
115
- export const launchStreamableHTTPServer = async (options: McpOptions, port: number | string | undefined) => {
116
- const app = streamableHTTPApp({ mcpOptions: options });
207
+ export const launchStreamableHTTPServer = async ({
208
+ mcpOptions,
209
+ port,
210
+ }: {
211
+ mcpOptions: McpOptions;
212
+ port: number | string | undefined;
213
+ }) => {
214
+ const app = streamableHTTPApp({ mcpOptions });
117
215
  const server = app.listen(port);
118
216
  const address = server.address();
119
217
 
218
+ const logger = getLogger();
219
+
120
220
  if (typeof address === 'string') {
121
- console.error(`MCP Server running on streamable HTTP at ${address}`);
221
+ logger.info(`MCP Server running on streamable HTTP at ${address}`);
122
222
  } else if (address !== null) {
123
- console.error(`MCP Server running on streamable HTTP on port ${address.port}`);
223
+ logger.info(`MCP Server running on streamable HTTP on port ${address.port}`);
124
224
  } else {
125
- console.error(`MCP Server running on streamable HTTP on port ${port}`);
225
+ logger.info(`MCP Server running on streamable HTTP on port ${port}`);
126
226
  }
127
227
  };
package/src/index.ts CHANGED
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { selectTools } from './server';
4
- import { Endpoint, endpoints } from './tools';
5
4
  import { McpOptions, parseCLIOptions } from './options';
6
5
  import { launchStdioServer } from './stdio';
7
6
  import { launchStreamableHTTPServer } from './http';
7
+ import type { McpTool } from './types';
8
+ import { configureLogger, getLogger } from './logger';
8
9
 
9
10
  async function main() {
10
11
  const options = parseOptionsOrError();
12
+ configureLogger({
13
+ level: options.debug ? 'debug' : 'info',
14
+ pretty: options.logFormat === 'pretty',
15
+ });
11
16
 
12
- if (options.list) {
13
- listAllTools();
14
- return;
15
- }
16
-
17
- const selectedTools = await selectToolsOrError(endpoints, options);
17
+ const selectedTools = await selectToolsOrError(options);
18
18
 
19
- console.error(
20
- `MCP Server starting with ${selectedTools.length} tools:`,
21
- selectedTools.map((e) => e.tool.name),
19
+ getLogger().info(
20
+ { tools: selectedTools.map((e) => e.tool.name) },
21
+ `MCP Server starting with ${selectedTools.length} tools`,
22
22
  );
23
23
 
24
24
  switch (options.transport) {
@@ -26,14 +26,18 @@ async function main() {
26
26
  await launchStdioServer(options);
27
27
  break;
28
28
  case 'http':
29
- await launchStreamableHTTPServer(options, options.port ?? options.socket);
29
+ await launchStreamableHTTPServer({
30
+ mcpOptions: options,
31
+ port: options.socket ?? options.port,
32
+ });
30
33
  break;
31
34
  }
32
35
  }
33
36
 
34
37
  if (require.main === module) {
35
38
  main().catch((error) => {
36
- console.error('Fatal error in main():', error);
39
+ // Logger might not be initialized yet
40
+ console.error('Fatal error in main()', error);
37
41
  process.exit(1);
38
42
  });
39
43
  }
@@ -42,67 +46,22 @@ function parseOptionsOrError() {
42
46
  try {
43
47
  return parseCLIOptions();
44
48
  } catch (error) {
45
- console.error('Error parsing options:', error);
49
+ // Logger is initialized after options, so use console.error here
50
+ console.error('Error parsing options', error);
46
51
  process.exit(1);
47
52
  }
48
53
  }
49
54
 
50
- async function selectToolsOrError(endpoints: Endpoint[], options: McpOptions): Promise<Endpoint[]> {
55
+ async function selectToolsOrError(options: McpOptions): Promise<McpTool[]> {
51
56
  try {
52
- const includedTools = await selectTools(endpoints, options);
57
+ const includedTools = selectTools(options);
53
58
  if (includedTools.length === 0) {
54
- console.error('No tools match the provided filters.');
59
+ getLogger().error('No tools match the provided filters');
55
60
  process.exit(1);
56
61
  }
57
62
  return includedTools;
58
63
  } catch (error) {
59
- if (error instanceof Error) {
60
- console.error('Error filtering tools:', error.message);
61
- } else {
62
- console.error('Error filtering tools:', error);
63
- }
64
+ getLogger().error({ error }, 'Error filtering tools');
64
65
  process.exit(1);
65
66
  }
66
67
  }
67
-
68
- function listAllTools() {
69
- if (endpoints.length === 0) {
70
- console.log('No tools available.');
71
- return;
72
- }
73
- console.log('Available tools:\n');
74
-
75
- // Group endpoints by resource
76
- const resourceGroups = new Map<string, typeof endpoints>();
77
-
78
- for (const endpoint of endpoints) {
79
- const resource = endpoint.metadata.resource;
80
- if (!resourceGroups.has(resource)) {
81
- resourceGroups.set(resource, []);
82
- }
83
- resourceGroups.get(resource)!.push(endpoint);
84
- }
85
-
86
- // Sort resources alphabetically
87
- const sortedResources = Array.from(resourceGroups.keys()).sort();
88
-
89
- // Display hierarchically by resource
90
- for (const resource of sortedResources) {
91
- console.log(`Resource: ${resource}`);
92
-
93
- const resourceEndpoints = resourceGroups.get(resource)!;
94
- // Sort endpoints by tool name
95
- resourceEndpoints.sort((a, b) => a.tool.name.localeCompare(b.tool.name));
96
-
97
- for (const endpoint of resourceEndpoints) {
98
- const {
99
- tool,
100
- metadata: { operation, tags },
101
- } = endpoint;
102
-
103
- console.log(` - ${tool.name} (${operation}) ${tags.length > 0 ? `tags: ${tags.join(', ')}` : ''}`);
104
- console.log(` Description: ${tool.description}`);
105
- }
106
- console.log('');
107
- }
108
- }
@@ -0,0 +1,57 @@
1
+ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ import fs from 'fs/promises';
4
+ import { getLogger } from './logger';
5
+
6
+ const INSTRUCTIONS_CACHE_TTL_MS = 15 * 60 * 1000; // 15 minutes
7
+
8
+ interface InstructionsCacheEntry {
9
+ fetchedInstructions: string;
10
+ fetchedAt: number;
11
+ }
12
+
13
+ const instructionsCache = new Map<string, InstructionsCacheEntry>();
14
+
15
+ export async function getInstructions({
16
+ stainlessApiKey,
17
+ customInstructionsPath,
18
+ }: {
19
+ stainlessApiKey?: string | undefined;
20
+ customInstructionsPath?: string | undefined;
21
+ }): Promise<string> {
22
+ const now = Date.now();
23
+ const cacheKey = customInstructionsPath ?? stainlessApiKey ?? '';
24
+ const cached = instructionsCache.get(cacheKey);
25
+
26
+ if (cached && now - cached.fetchedAt <= INSTRUCTIONS_CACHE_TTL_MS) {
27
+ return cached.fetchedInstructions;
28
+ }
29
+
30
+ // Evict stale entries so the cache doesn't grow unboundedly.
31
+ for (const [key, entry] of instructionsCache) {
32
+ if (now - entry.fetchedAt > INSTRUCTIONS_CACHE_TTL_MS) {
33
+ instructionsCache.delete(key);
34
+ }
35
+ }
36
+
37
+ let fetchedInstructions: string;
38
+
39
+ if (customInstructionsPath) {
40
+ fetchedInstructions = await fetchLatestInstructionsFromFile(customInstructionsPath);
41
+ } else {
42
+ fetchedInstructions =
43
+ '\n This is the codeqr MCP server.\n\n Available tools:\n - search_docs: Search SDK documentation to find the right methods and parameters.\n - execute: Run TypeScript code against a pre-authenticated SDK client. Define an async run(client) function.\n\n Workflow:\n - If unsure about the API, call search_docs first.\n - Write complete solutions in a single execute call when possible. For large datasets, use API filters to narrow results or paginate within a single execute block.\n - If execute returns an error, read the error and fix your code rather than retrying the same approach.\n - Variables do not persist between execute calls. Return or log all data you need.\n - Individual HTTP requests to the API have a 30-second timeout. If a request times out, try a smaller query or add filters.\n - Code execution has a total timeout of approximately 5 minutes. If your code times out, simplify it or break it into smaller steps.\n ';
44
+ }
45
+
46
+ instructionsCache.set(cacheKey, { fetchedInstructions, fetchedAt: now });
47
+ return fetchedInstructions;
48
+ }
49
+
50
+ async function fetchLatestInstructionsFromFile(path: string): Promise<string> {
51
+ try {
52
+ return await fs.readFile(path, 'utf-8');
53
+ } catch (error) {
54
+ getLogger().error({ error, path }, 'Error fetching instructions from file');
55
+ throw error;
56
+ }
57
+ }