@unclick/mcp-server 0.2.3 → 0.2.5

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 (324) hide show
  1. package/README.md +139 -153
  2. package/dist/airtable-tool.d.ts +2 -0
  3. package/dist/airtable-tool.d.ts.map +1 -0
  4. package/dist/airtable-tool.js +154 -0
  5. package/dist/airtable-tool.js.map +1 -0
  6. package/dist/algolia-tool.d.ts +5 -0
  7. package/dist/algolia-tool.d.ts.map +1 -0
  8. package/dist/algolia-tool.js +121 -0
  9. package/dist/algolia-tool.js.map +1 -0
  10. package/dist/anthropic-tool.d.ts +3 -0
  11. package/dist/anthropic-tool.d.ts.map +1 -0
  12. package/dist/anthropic-tool.js +123 -0
  13. package/dist/anthropic-tool.js.map +1 -0
  14. package/dist/asana-tool.d.ts +8 -0
  15. package/dist/asana-tool.d.ts.map +1 -0
  16. package/dist/asana-tool.js +218 -0
  17. package/dist/asana-tool.js.map +1 -0
  18. package/dist/assemblyai-tool.d.ts +7 -0
  19. package/dist/assemblyai-tool.d.ts.map +1 -0
  20. package/dist/assemblyai-tool.js +127 -0
  21. package/dist/assemblyai-tool.js.map +1 -0
  22. package/dist/calendly-tool.d.ts +6 -0
  23. package/dist/calendly-tool.d.ts.map +1 -0
  24. package/dist/calendly-tool.js +182 -0
  25. package/dist/calendly-tool.js.map +1 -0
  26. package/dist/circleci-tool.d.ts +7 -0
  27. package/dist/circleci-tool.d.ts.map +1 -0
  28. package/dist/circleci-tool.js +133 -0
  29. package/dist/circleci-tool.js.map +1 -0
  30. package/dist/clickup-tool.d.ts +2 -0
  31. package/dist/clickup-tool.d.ts.map +1 -0
  32. package/dist/clickup-tool.js +153 -0
  33. package/dist/clickup-tool.js.map +1 -0
  34. package/dist/cohere-tool.d.ts +7 -0
  35. package/dist/cohere-tool.d.ts.map +1 -0
  36. package/dist/cohere-tool.js +225 -0
  37. package/dist/cohere-tool.js.map +1 -0
  38. package/dist/connectors/figma.d.ts +3 -0
  39. package/dist/connectors/figma.d.ts.map +1 -0
  40. package/dist/connectors/figma.js +18 -0
  41. package/dist/connectors/figma.js.map +1 -0
  42. package/dist/connectors/index.d.ts +3 -1
  43. package/dist/connectors/index.d.ts.map +1 -1
  44. package/dist/connectors/index.js +5 -1
  45. package/dist/connectors/index.js.map +1 -1
  46. package/dist/connectors/line.d.ts +3 -0
  47. package/dist/connectors/line.d.ts.map +1 -0
  48. package/dist/connectors/line.js +18 -0
  49. package/dist/connectors/line.js.map +1 -0
  50. package/dist/convertkit-tool.d.ts +7 -0
  51. package/dist/convertkit-tool.d.ts.map +1 -0
  52. package/dist/convertkit-tool.js +213 -0
  53. package/dist/convertkit-tool.js.map +1 -0
  54. package/dist/datadog-tool.d.ts +7 -0
  55. package/dist/datadog-tool.d.ts.map +1 -0
  56. package/dist/datadog-tool.js +121 -0
  57. package/dist/datadog-tool.js.map +1 -0
  58. package/dist/deepl-tool.d.ts +5 -0
  59. package/dist/deepl-tool.d.ts.map +1 -0
  60. package/dist/deepl-tool.js +137 -0
  61. package/dist/deepl-tool.js.map +1 -0
  62. package/dist/ebay-tool.d.ts +5 -0
  63. package/dist/ebay-tool.d.ts.map +1 -0
  64. package/dist/ebay-tool.js +179 -0
  65. package/dist/ebay-tool.js.map +1 -0
  66. package/dist/elevenlabs-tool.d.ts +6 -0
  67. package/dist/elevenlabs-tool.d.ts.map +1 -0
  68. package/dist/elevenlabs-tool.js +166 -0
  69. package/dist/elevenlabs-tool.js.map +1 -0
  70. package/dist/etsy-tool.d.ts +6 -0
  71. package/dist/etsy-tool.d.ts.map +1 -0
  72. package/dist/etsy-tool.js +125 -0
  73. package/dist/etsy-tool.js.map +1 -0
  74. package/dist/exchangerate-tool.d.ts +5 -0
  75. package/dist/exchangerate-tool.d.ts.map +1 -0
  76. package/dist/exchangerate-tool.js +139 -0
  77. package/dist/exchangerate-tool.js.map +1 -0
  78. package/dist/figma-tool.d.ts +8 -0
  79. package/dist/figma-tool.d.ts.map +1 -0
  80. package/dist/figma-tool.js +231 -0
  81. package/dist/figma-tool.js.map +1 -0
  82. package/dist/flyio-tool.d.ts +6 -0
  83. package/dist/flyio-tool.d.ts.map +1 -0
  84. package/dist/flyio-tool.js +158 -0
  85. package/dist/flyio-tool.js.map +1 -0
  86. package/dist/gdelt-tool.d.ts +5 -0
  87. package/dist/gdelt-tool.d.ts.map +1 -0
  88. package/dist/gdelt-tool.js +177 -0
  89. package/dist/gdelt-tool.js.map +1 -0
  90. package/dist/github-tool.d.ts +2 -0
  91. package/dist/github-tool.d.ts.map +1 -0
  92. package/dist/github-tool.js +165 -0
  93. package/dist/github-tool.js.map +1 -0
  94. package/dist/gitlab-tool.d.ts +2 -0
  95. package/dist/gitlab-tool.d.ts.map +1 -0
  96. package/dist/gitlab-tool.js +127 -0
  97. package/dist/gitlab-tool.js.map +1 -0
  98. package/dist/groq-tool.d.ts +3 -0
  99. package/dist/groq-tool.d.ts.map +1 -0
  100. package/dist/groq-tool.js +109 -0
  101. package/dist/groq-tool.js.map +1 -0
  102. package/dist/gumroad-tool.d.ts +6 -0
  103. package/dist/gumroad-tool.d.ts.map +1 -0
  104. package/dist/gumroad-tool.js +90 -0
  105. package/dist/gumroad-tool.js.map +1 -0
  106. package/dist/heygen-tool.d.ts +5 -0
  107. package/dist/heygen-tool.d.ts.map +1 -0
  108. package/dist/heygen-tool.js +134 -0
  109. package/dist/heygen-tool.js.map +1 -0
  110. package/dist/higgsfield-tool.d.ts +5 -0
  111. package/dist/higgsfield-tool.d.ts.map +1 -0
  112. package/dist/higgsfield-tool.js +120 -0
  113. package/dist/higgsfield-tool.js.map +1 -0
  114. package/dist/igdb-tool.d.ts +6 -0
  115. package/dist/igdb-tool.d.ts.map +1 -0
  116. package/dist/igdb-tool.js +140 -0
  117. package/dist/igdb-tool.js.map +1 -0
  118. package/dist/keychain-crypto.d.ts +24 -0
  119. package/dist/keychain-crypto.d.ts.map +1 -0
  120. package/dist/keychain-crypto.js +60 -0
  121. package/dist/keychain-crypto.js.map +1 -0
  122. package/dist/keychain-secure-input.d.ts +17 -0
  123. package/dist/keychain-secure-input.d.ts.map +1 -0
  124. package/dist/keychain-secure-input.js +229 -0
  125. package/dist/keychain-secure-input.js.map +1 -0
  126. package/dist/keychain-tool.d.ts +3 -0
  127. package/dist/keychain-tool.d.ts.map +1 -0
  128. package/dist/keychain-tool.js +516 -0
  129. package/dist/keychain-tool.js.map +1 -0
  130. package/dist/kling-tool.d.ts +3 -0
  131. package/dist/kling-tool.d.ts.map +1 -0
  132. package/dist/kling-tool.js +102 -0
  133. package/dist/kling-tool.js.map +1 -0
  134. package/dist/lemonsqueezy-tool.d.ts +7 -0
  135. package/dist/lemonsqueezy-tool.d.ts.map +1 -0
  136. package/dist/lemonsqueezy-tool.js +220 -0
  137. package/dist/lemonsqueezy-tool.js.map +1 -0
  138. package/dist/line-tool.d.ts +7 -0
  139. package/dist/line-tool.d.ts.map +1 -0
  140. package/dist/line-tool.js +188 -0
  141. package/dist/line-tool.js.map +1 -0
  142. package/dist/linear-tool.d.ts +2 -0
  143. package/dist/linear-tool.d.ts.map +1 -0
  144. package/dist/linear-tool.js +186 -0
  145. package/dist/linear-tool.js.map +1 -0
  146. package/dist/local-catalog-handlers.d.ts +3 -0
  147. package/dist/local-catalog-handlers.d.ts.map +1 -0
  148. package/dist/local-catalog-handlers.js +1254 -0
  149. package/dist/local-catalog-handlers.js.map +1 -0
  150. package/dist/mailchimp-tool.d.ts +8 -0
  151. package/dist/mailchimp-tool.d.ts.map +1 -0
  152. package/dist/mailchimp-tool.js +138 -0
  153. package/dist/mailchimp-tool.js.map +1 -0
  154. package/dist/mapbox-tool.d.ts +6 -0
  155. package/dist/mapbox-tool.d.ts.map +1 -0
  156. package/dist/mapbox-tool.js +106 -0
  157. package/dist/mapbox-tool.js.map +1 -0
  158. package/dist/mistral-tool.d.ts +4 -0
  159. package/dist/mistral-tool.d.ts.map +1 -0
  160. package/dist/mistral-tool.js +145 -0
  161. package/dist/mistral-tool.js.map +1 -0
  162. package/dist/mixpanel-tool.d.ts +6 -0
  163. package/dist/mixpanel-tool.d.ts.map +1 -0
  164. package/dist/mixpanel-tool.js +162 -0
  165. package/dist/mixpanel-tool.js.map +1 -0
  166. package/dist/monday-tool.d.ts +7 -0
  167. package/dist/monday-tool.d.ts.map +1 -0
  168. package/dist/monday-tool.js +206 -0
  169. package/dist/monday-tool.js.map +1 -0
  170. package/dist/neon-tool.d.ts +7 -0
  171. package/dist/neon-tool.d.ts.map +1 -0
  172. package/dist/neon-tool.js +156 -0
  173. package/dist/neon-tool.js.map +1 -0
  174. package/dist/openai-tool.d.ts +6 -0
  175. package/dist/openai-tool.d.ts.map +1 -0
  176. package/dist/openai-tool.js +227 -0
  177. package/dist/openai-tool.js.map +1 -0
  178. package/dist/pagerduty-tool.d.ts +8 -0
  179. package/dist/pagerduty-tool.d.ts.map +1 -0
  180. package/dist/pagerduty-tool.js +185 -0
  181. package/dist/pagerduty-tool.js.map +1 -0
  182. package/dist/paypal-tool.d.ts +3 -0
  183. package/dist/paypal-tool.d.ts.map +1 -0
  184. package/dist/paypal-tool.js +157 -0
  185. package/dist/paypal-tool.js.map +1 -0
  186. package/dist/perplexity-tool.d.ts +2 -0
  187. package/dist/perplexity-tool.d.ts.map +1 -0
  188. package/dist/perplexity-tool.js +93 -0
  189. package/dist/perplexity-tool.js.map +1 -0
  190. package/dist/pika-tool.d.ts +4 -0
  191. package/dist/pika-tool.d.ts.map +1 -0
  192. package/dist/pika-tool.js +102 -0
  193. package/dist/pika-tool.js.map +1 -0
  194. package/dist/pinecone-tool.d.ts +6 -0
  195. package/dist/pinecone-tool.d.ts.map +1 -0
  196. package/dist/pinecone-tool.js +148 -0
  197. package/dist/pinecone-tool.js.map +1 -0
  198. package/dist/pinterest-tool.d.ts +7 -0
  199. package/dist/pinterest-tool.d.ts.map +1 -0
  200. package/dist/pinterest-tool.js +219 -0
  201. package/dist/pinterest-tool.js.map +1 -0
  202. package/dist/plaid-tool.d.ts +6 -0
  203. package/dist/plaid-tool.d.ts.map +1 -0
  204. package/dist/plaid-tool.js +149 -0
  205. package/dist/plaid-tool.js.map +1 -0
  206. package/dist/postman-tool.d.ts +2 -0
  207. package/dist/postman-tool.d.ts.map +1 -0
  208. package/dist/postman-tool.js +92 -0
  209. package/dist/postman-tool.js.map +1 -0
  210. package/dist/postmark-tool.d.ts +7 -0
  211. package/dist/postmark-tool.d.ts.map +1 -0
  212. package/dist/postmark-tool.js +148 -0
  213. package/dist/postmark-tool.js.map +1 -0
  214. package/dist/pushover-tool.d.ts +6 -0
  215. package/dist/pushover-tool.d.ts.map +1 -0
  216. package/dist/pushover-tool.js +146 -0
  217. package/dist/pushover-tool.js.map +1 -0
  218. package/dist/qc-tool.d.ts +4 -0
  219. package/dist/qc-tool.d.ts.map +1 -0
  220. package/dist/qc-tool.js +415 -0
  221. package/dist/qc-tool.js.map +1 -0
  222. package/dist/quickbooks-tool.d.ts +5 -0
  223. package/dist/quickbooks-tool.d.ts.map +1 -0
  224. package/dist/quickbooks-tool.js +160 -0
  225. package/dist/quickbooks-tool.js.map +1 -0
  226. package/dist/render-tool.d.ts +7 -0
  227. package/dist/render-tool.d.ts.map +1 -0
  228. package/dist/render-tool.js +158 -0
  229. package/dist/render-tool.js.map +1 -0
  230. package/dist/replicate-tool.d.ts +7 -0
  231. package/dist/replicate-tool.d.ts.map +1 -0
  232. package/dist/replicate-tool.js +172 -0
  233. package/dist/replicate-tool.js.map +1 -0
  234. package/dist/runway-tool.d.ts +4 -0
  235. package/dist/runway-tool.d.ts.map +1 -0
  236. package/dist/runway-tool.js +110 -0
  237. package/dist/runway-tool.js.map +1 -0
  238. package/dist/segment-tool.d.ts +6 -0
  239. package/dist/segment-tool.d.ts.map +1 -0
  240. package/dist/segment-tool.js +129 -0
  241. package/dist/segment-tool.js.map +1 -0
  242. package/dist/sendgrid-tool.d.ts +7 -0
  243. package/dist/sendgrid-tool.d.ts.map +1 -0
  244. package/dist/sendgrid-tool.js +124 -0
  245. package/dist/sendgrid-tool.js.map +1 -0
  246. package/dist/sentry-tool.d.ts +2 -0
  247. package/dist/sentry-tool.d.ts.map +1 -0
  248. package/dist/sentry-tool.js +123 -0
  249. package/dist/sentry-tool.js.map +1 -0
  250. package/dist/server.d.ts.map +1 -1
  251. package/dist/server.js +10 -0
  252. package/dist/server.js.map +1 -1
  253. package/dist/speedrun-tool.d.ts +6 -0
  254. package/dist/speedrun-tool.d.ts.map +1 -0
  255. package/dist/speedrun-tool.js +192 -0
  256. package/dist/speedrun-tool.js.map +1 -0
  257. package/dist/spotify-tool.d.ts +8 -0
  258. package/dist/spotify-tool.d.ts.map +1 -0
  259. package/dist/spotify-tool.js +274 -0
  260. package/dist/spotify-tool.js.map +1 -0
  261. package/dist/square-tool.d.ts +5 -0
  262. package/dist/square-tool.d.ts.map +1 -0
  263. package/dist/square-tool.js +133 -0
  264. package/dist/square-tool.js.map +1 -0
  265. package/dist/stability-tool.d.ts +5 -0
  266. package/dist/stability-tool.d.ts.map +1 -0
  267. package/dist/stability-tool.js +190 -0
  268. package/dist/stability-tool.js.map +1 -0
  269. package/dist/steam-tool.d.ts +6 -0
  270. package/dist/steam-tool.d.ts.map +1 -0
  271. package/dist/steam-tool.js +222 -0
  272. package/dist/steam-tool.js.map +1 -0
  273. package/dist/stripe-tool.d.ts +7 -0
  274. package/dist/stripe-tool.d.ts.map +1 -0
  275. package/dist/stripe-tool.js +181 -0
  276. package/dist/stripe-tool.js.map +1 -0
  277. package/dist/tiktok-tool.d.ts +4 -0
  278. package/dist/tiktok-tool.d.ts.map +1 -0
  279. package/dist/tiktok-tool.js +129 -0
  280. package/dist/tiktok-tool.js.map +1 -0
  281. package/dist/togetherai-tool.d.ts +5 -0
  282. package/dist/togetherai-tool.d.ts.map +1 -0
  283. package/dist/togetherai-tool.js +129 -0
  284. package/dist/togetherai-tool.js.map +1 -0
  285. package/dist/toilets-tool.js +2 -2
  286. package/dist/tool-wiring.d.ts +7982 -18
  287. package/dist/tool-wiring.d.ts.map +1 -1
  288. package/dist/tool-wiring.js +5084 -18
  289. package/dist/tool-wiring.js.map +1 -1
  290. package/dist/trello-tool.d.ts +2 -0
  291. package/dist/trello-tool.d.ts.map +1 -0
  292. package/dist/trello-tool.js +166 -0
  293. package/dist/trello-tool.js.map +1 -0
  294. package/dist/turso-tool.d.ts +6 -0
  295. package/dist/turso-tool.d.ts.map +1 -0
  296. package/dist/turso-tool.js +158 -0
  297. package/dist/turso-tool.js.map +1 -0
  298. package/dist/twilio-tool.d.ts +8 -0
  299. package/dist/twilio-tool.d.ts.map +1 -0
  300. package/dist/twilio-tool.js +243 -0
  301. package/dist/twilio-tool.js.map +1 -0
  302. package/dist/upstash-tool.d.ts +8 -0
  303. package/dist/upstash-tool.d.ts.map +1 -0
  304. package/dist/upstash-tool.js +191 -0
  305. package/dist/upstash-tool.js.map +1 -0
  306. package/dist/whatsapp-tool.d.ts +6 -0
  307. package/dist/whatsapp-tool.d.ts.map +1 -0
  308. package/dist/whatsapp-tool.js +200 -0
  309. package/dist/whatsapp-tool.js.map +1 -0
  310. package/dist/woocommerce-tool.d.ts +4 -0
  311. package/dist/woocommerce-tool.d.ts.map +1 -0
  312. package/dist/woocommerce-tool.js +140 -0
  313. package/dist/woocommerce-tool.js.map +1 -0
  314. package/dist/youtube-tool.d.ts +7 -0
  315. package/dist/youtube-tool.d.ts.map +1 -0
  316. package/dist/youtube-tool.js +196 -0
  317. package/dist/youtube-tool.js.map +1 -0
  318. package/package.json +1 -1
  319. package/server.json +37 -37
  320. package/LICENSE +0 -216
  321. package/dist/cloudflare-worker.d.ts +0 -12
  322. package/dist/cloudflare-worker.d.ts.map +0 -1
  323. package/dist/cloudflare-worker.js +0 -50
  324. package/dist/cloudflare-worker.js.map +0 -1
@@ -0,0 +1,149 @@
1
+ // ─── Plaid API Tool ──────────────────────────────────────────────────────────
2
+ // Covers accounts, transactions, balances, identity, and link token creation.
3
+ // Auth: client_id + secret in request body (Plaid API convention).
4
+ // Environments: sandbox, development, production.
5
+ // Base URL: https://{env}.plaid.com
6
+ // No external dependencies - native fetch only.
7
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
8
+ function requireConfig(args) {
9
+ const client_id = String(args.client_id ?? "").trim();
10
+ const secret = String(args.secret ?? "").trim();
11
+ const environment = String(args.environment ?? "sandbox").trim();
12
+ if (!client_id)
13
+ return { error: "client_id is required (Plaid client ID)." };
14
+ if (!secret)
15
+ return { error: "secret is required (Plaid secret key)." };
16
+ const validEnvs = ["sandbox", "development", "production"];
17
+ if (!validEnvs.includes(environment)) {
18
+ return { error: `environment must be one of: ${validEnvs.join(", ")}.` };
19
+ }
20
+ return { client_id, secret, environment };
21
+ }
22
+ async function plaidFetch(cfg, path, body) {
23
+ const url = `https://${cfg.environment}.plaid.com${path}`;
24
+ let response;
25
+ try {
26
+ response = await fetch(url, {
27
+ method: "POST",
28
+ headers: {
29
+ "Content-Type": "application/json",
30
+ "Plaid-Version": "2020-09-14",
31
+ },
32
+ body: JSON.stringify({
33
+ client_id: cfg.client_id,
34
+ secret: cfg.secret,
35
+ ...body,
36
+ }),
37
+ });
38
+ }
39
+ catch (err) {
40
+ return { error: `Network error: ${err instanceof Error ? err.message : String(err)}` };
41
+ }
42
+ if (response.status === 429) {
43
+ return { error: "Plaid rate limit reached. Wait before retrying.", status: 429 };
44
+ }
45
+ let data;
46
+ try {
47
+ data = await response.json();
48
+ }
49
+ catch {
50
+ return { error: `Non-JSON response (HTTP ${response.status})`, status: response.status };
51
+ }
52
+ if (!response.ok) {
53
+ const d = data;
54
+ return {
55
+ error: d["error_message"] ?? d["message"] ?? "Plaid API error",
56
+ error_code: d["error_code"],
57
+ error_type: d["error_type"],
58
+ display_message: d["display_message"],
59
+ status: response.status,
60
+ };
61
+ }
62
+ return data;
63
+ }
64
+ // ─── plaid_accounts ───────────────────────────────────────────────────────────
65
+ export async function plaidAccounts(args) {
66
+ const cfg = requireConfig(args);
67
+ if ("error" in cfg)
68
+ return cfg;
69
+ const access_token = String(args.access_token ?? "").trim();
70
+ if (!access_token)
71
+ return { error: "access_token is required (Plaid item access token)." };
72
+ return plaidFetch(cfg, "/accounts/get", {
73
+ access_token,
74
+ options: args.account_ids ? { account_ids: args.account_ids } : undefined,
75
+ });
76
+ }
77
+ // ─── plaid_transactions ───────────────────────────────────────────────────────
78
+ export async function plaidTransactions(args) {
79
+ const cfg = requireConfig(args);
80
+ if ("error" in cfg)
81
+ return cfg;
82
+ const access_token = String(args.access_token ?? "").trim();
83
+ const start_date = String(args.start_date ?? "").trim();
84
+ const end_date = String(args.end_date ?? "").trim();
85
+ if (!access_token)
86
+ return { error: "access_token is required." };
87
+ if (!start_date)
88
+ return { error: "start_date is required (YYYY-MM-DD)." };
89
+ if (!end_date)
90
+ return { error: "end_date is required (YYYY-MM-DD)." };
91
+ return plaidFetch(cfg, "/transactions/get", {
92
+ access_token,
93
+ start_date,
94
+ end_date,
95
+ options: {
96
+ count: args.count ? Number(args.count) : 100,
97
+ offset: args.offset ? Number(args.offset) : 0,
98
+ account_ids: args.account_ids ?? undefined,
99
+ },
100
+ });
101
+ }
102
+ // ─── plaid_balances ───────────────────────────────────────────────────────────
103
+ export async function plaidBalances(args) {
104
+ const cfg = requireConfig(args);
105
+ if ("error" in cfg)
106
+ return cfg;
107
+ const access_token = String(args.access_token ?? "").trim();
108
+ if (!access_token)
109
+ return { error: "access_token is required." };
110
+ return plaidFetch(cfg, "/accounts/balance/get", {
111
+ access_token,
112
+ options: args.account_ids ? { account_ids: args.account_ids } : undefined,
113
+ });
114
+ }
115
+ // ─── plaid_identity ───────────────────────────────────────────────────────────
116
+ export async function plaidIdentity(args) {
117
+ const cfg = requireConfig(args);
118
+ if ("error" in cfg)
119
+ return cfg;
120
+ const access_token = String(args.access_token ?? "").trim();
121
+ if (!access_token)
122
+ return { error: "access_token is required." };
123
+ return plaidFetch(cfg, "/identity/get", { access_token });
124
+ }
125
+ // ─── plaid_link_token_create ──────────────────────────────────────────────────
126
+ export async function plaidLinkTokenCreate(args) {
127
+ const cfg = requireConfig(args);
128
+ if ("error" in cfg)
129
+ return cfg;
130
+ const user_client_user_id = String(args.user_client_user_id ?? "").trim();
131
+ if (!user_client_user_id)
132
+ return { error: "user_client_user_id is required (unique ID for the user)." };
133
+ const products = args.products && Array.isArray(args.products)
134
+ ? args.products
135
+ : ["transactions"];
136
+ const country_codes = args.country_codes && Array.isArray(args.country_codes)
137
+ ? args.country_codes
138
+ : ["US"];
139
+ return plaidFetch(cfg, "/link/token/create", {
140
+ user: { client_user_id: user_client_user_id },
141
+ client_name: args.client_name ? String(args.client_name) : "UnClick Agent",
142
+ products,
143
+ country_codes,
144
+ language: args.language ? String(args.language) : "en",
145
+ webhook: args.webhook ? String(args.webhook) : undefined,
146
+ access_token: args.access_token ? String(args.access_token) : undefined,
147
+ });
148
+ }
149
+ //# sourceMappingURL=plaid-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plaid-tool.js","sourceRoot":"","sources":["../src/plaid-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function postmanAction(action: string, args: Record<string, unknown>): Promise<unknown>;
2
+ //# sourceMappingURL=postman-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postman-tool.d.ts","sourceRoot":"","sources":["../src/postman-tool.ts"],"names":[],"mappings":"AA8EA,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,IAAI,EAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC,CAkBlB"}
@@ -0,0 +1,92 @@
1
+ // ── Postman API tool ───────────────────────────────────────────────────────
2
+ // Wraps the Postman API (https://api.getpostman.com) via fetch.
3
+ // Auth: API key passed as api_key (X-Api-Key header).
4
+ // No external dependencies.
5
+ const POSTMAN_API = "https://api.getpostman.com";
6
+ // ── Fetch helper ───────────────────────────────────────────────────────────────
7
+ async function postmanFetch(apiKey, path, query) {
8
+ const url = new URL(`${POSTMAN_API}${path}`);
9
+ if (query) {
10
+ for (const [k, v] of Object.entries(query)) {
11
+ if (v !== undefined && v !== "")
12
+ url.searchParams.set(k, String(v));
13
+ }
14
+ }
15
+ let response;
16
+ try {
17
+ response = await fetch(url.toString(), {
18
+ headers: {
19
+ "X-Api-Key": apiKey,
20
+ "User-Agent": "UnClick-MCP/1.0",
21
+ },
22
+ });
23
+ }
24
+ catch (err) {
25
+ return { error: `Network error reaching Postman API: ${err instanceof Error ? err.message : String(err)}` };
26
+ }
27
+ const text = await response.text();
28
+ let data;
29
+ try {
30
+ data = JSON.parse(text);
31
+ }
32
+ catch {
33
+ data = { raw: text };
34
+ }
35
+ if (response.status === 401)
36
+ return { error: "Postman API key is invalid. Check your api_key.", status: 401 };
37
+ if (response.status === 403)
38
+ return { error: "Insufficient permissions for this Postman resource.", status: 403 };
39
+ if (response.status === 404)
40
+ return { error: "Collection, environment, or monitor not found.", status: 404 };
41
+ if (response.status === 429)
42
+ return { error: "Postman API rate limit exceeded. Please wait and retry.", status: 429 };
43
+ if (!response.ok) {
44
+ const detail = data?.error ?? text;
45
+ return { error: `Postman API error ${response.status}: ${detail}`, status: response.status };
46
+ }
47
+ return data;
48
+ }
49
+ // ── Action implementations ─────────────────────────────────────────────────────
50
+ async function listCollections(apiKey, args) {
51
+ return postmanFetch(apiKey, "/collections", {
52
+ workspace: args.workspace_id ? String(args.workspace_id) : undefined,
53
+ });
54
+ }
55
+ async function getCollection(apiKey, args) {
56
+ const collectionId = String(args.collection_id ?? "").trim();
57
+ if (!collectionId)
58
+ return { error: "collection_id is required." };
59
+ return postmanFetch(apiKey, `/collections/${encodeURIComponent(collectionId)}`);
60
+ }
61
+ async function listEnvironments(apiKey, args) {
62
+ return postmanFetch(apiKey, "/environments", {
63
+ workspace: args.workspace_id ? String(args.workspace_id) : undefined,
64
+ });
65
+ }
66
+ async function listMonitors(apiKey, args) {
67
+ return postmanFetch(apiKey, "/monitors", {
68
+ workspace: args.workspace_id ? String(args.workspace_id) : undefined,
69
+ });
70
+ }
71
+ // ── Public dispatcher ──────────────────────────────────────────────────────────
72
+ export async function postmanAction(action, args) {
73
+ const apiKey = String(args.api_key ?? "").trim();
74
+ if (!apiKey)
75
+ return { error: "api_key is required." };
76
+ try {
77
+ switch (action) {
78
+ case "list_collections": return listCollections(apiKey, args);
79
+ case "get_collection": return getCollection(apiKey, args);
80
+ case "list_environments": return listEnvironments(apiKey, args);
81
+ case "list_monitors": return listMonitors(apiKey, args);
82
+ default:
83
+ return {
84
+ error: `Unknown Postman action: "${action}". Valid actions: list_collections, get_collection, list_environments, list_monitors.`,
85
+ };
86
+ }
87
+ }
88
+ catch (err) {
89
+ return { error: err instanceof Error ? err.message : String(err) };
90
+ }
91
+ }
92
+ //# sourceMappingURL=postman-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postman-tool.js","sourceRoot":"","sources":["../src/postman-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function postmark_send_email(args: Record<string, unknown>): Promise<unknown>;
2
+ export declare function postmark_send_batch(args: Record<string, unknown>): Promise<unknown>;
3
+ export declare function postmark_get_delivery_stats(args: Record<string, unknown>): Promise<unknown>;
4
+ export declare function postmark_list_templates(args: Record<string, unknown>): Promise<unknown>;
5
+ export declare function postmark_get_template(args: Record<string, unknown>): Promise<unknown>;
6
+ export declare function postmark_search_messages(args: Record<string, unknown>): Promise<unknown>;
7
+ //# sourceMappingURL=postmark-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postmark-tool.d.ts","sourceRoot":"","sources":["../src/postmark-tool.ts"],"names":[],"mappings":"AAuDA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA2BzF;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAYzF;AAED,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjG;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAc7F;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAK3F;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAkB9F"}
@@ -0,0 +1,148 @@
1
+ // Postmark Transactional Email API.
2
+ // Docs: https://postmarkapp.com/developer/api/overview
3
+ // Auth: X-Postmark-Server-Token header
4
+ // Base: https://api.postmarkapp.com
5
+ const POSTMARK_API_BASE = "https://api.postmarkapp.com";
6
+ function requireKey(args) {
7
+ const key = String(args.api_key ?? "").trim();
8
+ if (!key)
9
+ throw new Error("api_key is required. Get your Server Token from account.postmarkapp.com.");
10
+ return key;
11
+ }
12
+ async function pmGet(apiKey, path, query) {
13
+ const url = new URL(`${POSTMARK_API_BASE}${path}`);
14
+ if (query) {
15
+ for (const [k, v] of Object.entries(query)) {
16
+ if (v !== undefined && v !== "")
17
+ url.searchParams.set(k, v);
18
+ }
19
+ }
20
+ const res = await fetch(url.toString(), {
21
+ headers: {
22
+ "X-Postmark-Server-Token": apiKey,
23
+ Accept: "application/json",
24
+ "Content-Type": "application/json",
25
+ },
26
+ });
27
+ const data = await res.json();
28
+ if (!res.ok) {
29
+ const msg = data.Message ?? `HTTP ${res.status}`;
30
+ throw new Error(`Postmark error (${res.status}): ${msg}`);
31
+ }
32
+ return data;
33
+ }
34
+ async function pmPost(apiKey, path, body) {
35
+ const res = await fetch(`${POSTMARK_API_BASE}${path}`, {
36
+ method: "POST",
37
+ headers: {
38
+ "X-Postmark-Server-Token": apiKey,
39
+ Accept: "application/json",
40
+ "Content-Type": "application/json",
41
+ },
42
+ body: JSON.stringify(body),
43
+ });
44
+ const data = await res.json();
45
+ if (!res.ok) {
46
+ const msg = data.Message ?? `HTTP ${res.status}`;
47
+ throw new Error(`Postmark error (${res.status}): ${msg}`);
48
+ }
49
+ return data;
50
+ }
51
+ // ─── Operations ───────────────────────────────────────────────────────────────
52
+ export async function postmark_send_email(args) {
53
+ const apiKey = requireKey(args);
54
+ const from = String(args.from ?? "").trim();
55
+ const to = String(args.to ?? "").trim();
56
+ const subject = String(args.subject ?? "").trim();
57
+ if (!from)
58
+ throw new Error("from is required.");
59
+ if (!to)
60
+ throw new Error("to is required.");
61
+ if (!subject)
62
+ throw new Error("subject is required.");
63
+ if (!args.html_body && !args.text_body)
64
+ throw new Error("html_body or text_body is required.");
65
+ const body = { From: from, To: to, Subject: subject };
66
+ if (args.html_body)
67
+ body.HtmlBody = String(args.html_body);
68
+ if (args.text_body)
69
+ body.TextBody = String(args.text_body);
70
+ if (args.reply_to)
71
+ body.ReplyTo = String(args.reply_to);
72
+ if (args.cc)
73
+ body.Cc = String(args.cc);
74
+ if (args.bcc)
75
+ body.Bcc = String(args.bcc);
76
+ if (args.tag)
77
+ body.Tag = String(args.tag);
78
+ if (args.message_stream)
79
+ body.MessageStream = String(args.message_stream);
80
+ const data = await pmPost(apiKey, "/email", body);
81
+ return {
82
+ message_id: data.MessageID,
83
+ submitted_at: data.SubmittedAt,
84
+ to: data.To,
85
+ error_code: data.ErrorCode,
86
+ message: data.Message,
87
+ };
88
+ }
89
+ export async function postmark_send_batch(args) {
90
+ const apiKey = requireKey(args);
91
+ const messages = args.messages;
92
+ if (!Array.isArray(messages) || messages.length === 0) {
93
+ throw new Error("messages must be a non-empty array of email objects.");
94
+ }
95
+ const data = await pmPost(apiKey, "/email/batch", { Messages: messages });
96
+ return {
97
+ count: Array.isArray(data) ? data.length : 0,
98
+ results: data,
99
+ };
100
+ }
101
+ export async function postmark_get_delivery_stats(args) {
102
+ const apiKey = requireKey(args);
103
+ return pmGet(apiKey, "/deliverystats");
104
+ }
105
+ export async function postmark_list_templates(args) {
106
+ const apiKey = requireKey(args);
107
+ const query = {};
108
+ if (args.count)
109
+ query.Count = String(args.count);
110
+ if (args.offset)
111
+ query.Offset = String(args.offset);
112
+ const data = await pmGet(apiKey, "/templates", query);
113
+ return {
114
+ total: data.TotalCount,
115
+ count: data.Templates?.length ?? 0,
116
+ templates: data.Templates ?? [],
117
+ };
118
+ }
119
+ export async function postmark_get_template(args) {
120
+ const apiKey = requireKey(args);
121
+ const id = String(args.template_id ?? "").trim();
122
+ if (!id)
123
+ throw new Error("template_id is required.");
124
+ return pmGet(apiKey, `/templates/${id}`);
125
+ }
126
+ export async function postmark_search_messages(args) {
127
+ const apiKey = requireKey(args);
128
+ const query = {};
129
+ if (args.count)
130
+ query.count = String(args.count);
131
+ if (args.offset)
132
+ query.offset = String(args.offset);
133
+ if (args.recipient)
134
+ query.recipient = String(args.recipient);
135
+ if (args.from_email)
136
+ query.fromEmail = String(args.from_email);
137
+ if (args.tag)
138
+ query.tag = String(args.tag);
139
+ if (args.status)
140
+ query.status = String(args.status);
141
+ const data = await pmGet(apiKey, "/messages/outbound", query);
142
+ return {
143
+ total: data.TotalCount,
144
+ count: data.Messages?.length ?? 0,
145
+ messages: data.Messages ?? [],
146
+ };
147
+ }
148
+ //# sourceMappingURL=postmark-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postmark-tool.js","sourceRoot":"","sources":["../src/postmark-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function pushoverSendNotification(args: Record<string, unknown>): Promise<unknown>;
2
+ export declare function pushoverGetReceipt(args: Record<string, unknown>): Promise<unknown>;
3
+ export declare function pushoverCancelEmergency(args: Record<string, unknown>): Promise<unknown>;
4
+ export declare function pushoverListSounds(args: Record<string, unknown>): Promise<unknown>;
5
+ export declare function pushoverValidateUser(args: Record<string, unknown>): Promise<unknown>;
6
+ //# sourceMappingURL=pushover-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pushover-tool.d.ts","sourceRoot":"","sources":["../src/pushover-tool.ts"],"names":[],"mappings":"AAwFA,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAwC9F;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBxF;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB7F;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxF;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAY1F"}
@@ -0,0 +1,146 @@
1
+ // Pushover API integration for the UnClick MCP server.
2
+ // Uses the Pushover REST API via fetch - no external dependencies.
3
+ // Users must supply an app token (from pushover.net/apps) and a user/group key.
4
+ const PUSHOVER_API_BASE = "https://api.pushover.net/1";
5
+ // ─── Auth validation ──────────────────────────────────────────────────────────
6
+ function requireAuth(args) {
7
+ const token = String(args.app_token ?? "").trim();
8
+ const user = String(args.user_key ?? "").trim();
9
+ if (!token)
10
+ throw new Error("app_token is required. Create an app at pushover.net/apps.");
11
+ if (!user)
12
+ throw new Error("user_key is required. Find it on your Pushover dashboard.");
13
+ return { token, user };
14
+ }
15
+ // ─── API helper ───────────────────────────────────────────────────────────────
16
+ async function pushoverPost(path, params) {
17
+ const res = await fetch(`${PUSHOVER_API_BASE}${path}.json`, {
18
+ method: "POST",
19
+ headers: { "Content-Type": "application/json" },
20
+ body: JSON.stringify(params),
21
+ });
22
+ const data = await res.json();
23
+ if (data.status !== 1) {
24
+ const errors = Array.isArray(data.errors) ? data.errors.join("; ") : `HTTP ${res.status}`;
25
+ throw new Error(`Pushover error: ${errors}`);
26
+ }
27
+ return data;
28
+ }
29
+ async function pushoverGet(path, query = {}) {
30
+ const qs = new URLSearchParams(query).toString();
31
+ const res = await fetch(`${PUSHOVER_API_BASE}${path}.json${qs ? `?${qs}` : ""}`, {
32
+ headers: { "Content-Type": "application/json" },
33
+ });
34
+ const data = await res.json();
35
+ if (!res.ok && data.status !== 1) {
36
+ const errors = Array.isArray(data.errors) ? data.errors.join("; ") : `HTTP ${res.status}`;
37
+ throw new Error(`Pushover error: ${errors}`);
38
+ }
39
+ return data;
40
+ }
41
+ // ─── Operations ───────────────────────────────────────────────────────────────
42
+ export async function pushoverSendNotification(args) {
43
+ const { token, user } = requireAuth(args);
44
+ const message = String(args.message ?? "").trim();
45
+ if (!message)
46
+ throw new Error("message is required.");
47
+ const params = { token, user, message };
48
+ if (args.title)
49
+ params.title = String(args.title);
50
+ if (args.url)
51
+ params.url = String(args.url);
52
+ if (args.url_title)
53
+ params.url_title = String(args.url_title);
54
+ if (args.sound)
55
+ params.sound = String(args.sound);
56
+ if (args.device)
57
+ params.device = String(args.device);
58
+ // Priority: -2 (lowest), -1 (low), 0 (normal), 1 (high), 2 (emergency)
59
+ const priority = args.priority !== undefined ? Number(args.priority) : 0;
60
+ if (priority < -2 || priority > 2)
61
+ throw new Error("priority must be -2, -1, 0, 1, or 2.");
62
+ params.priority = priority;
63
+ // Emergency priority requires retry and expire
64
+ if (priority === 2) {
65
+ const retry = Number(args.retry ?? 60);
66
+ const expire = Number(args.expire ?? 3600);
67
+ if (retry < 30)
68
+ throw new Error("retry must be at least 30 seconds for emergency notifications.");
69
+ if (expire > 10800)
70
+ throw new Error("expire must be at most 10800 seconds (3 hours).");
71
+ params.retry = retry;
72
+ params.expire = expire;
73
+ if (args.callback)
74
+ params.callback = String(args.callback);
75
+ }
76
+ if (args.html === true || args.html === 1)
77
+ params.html = 1;
78
+ if (args.monospace === true || args.monospace === 1)
79
+ params.monospace = 1;
80
+ if (args.timestamp)
81
+ params.timestamp = Number(args.timestamp);
82
+ const result = await pushoverPost("/messages", params);
83
+ return {
84
+ success: true,
85
+ request_id: result.request,
86
+ receipt: result.receipt ?? null,
87
+ priority,
88
+ };
89
+ }
90
+ export async function pushoverGetReceipt(args) {
91
+ const token = String(args.app_token ?? "").trim();
92
+ if (!token)
93
+ throw new Error("app_token is required.");
94
+ const receipt = String(args.receipt ?? "").trim();
95
+ if (!receipt)
96
+ throw new Error("receipt is required (returned from an emergency notification).");
97
+ const result = await pushoverGet(`/receipts/${encodeURIComponent(receipt)}`, { token });
98
+ return {
99
+ acknowledged: result.acknowledged === 1,
100
+ acknowledged_at: result.acknowledged_at ? new Date(result.acknowledged_at * 1000).toISOString() : null,
101
+ acknowledged_by: result.acknowledged_by || null,
102
+ acknowledged_by_device: result.acknowledged_by_device || null,
103
+ last_delivered_at: result.last_delivered_at ? new Date(result.last_delivered_at * 1000).toISOString() : null,
104
+ expired: result.expired === 1,
105
+ expires_at: result.expires_at ? new Date(result.expires_at * 1000).toISOString() : null,
106
+ };
107
+ }
108
+ export async function pushoverCancelEmergency(args) {
109
+ const { token } = requireAuth(args);
110
+ const receipt = String(args.receipt ?? "").trim();
111
+ if (!receipt)
112
+ throw new Error("receipt is required (returned from an emergency notification).");
113
+ const res = await fetch(`${PUSHOVER_API_BASE}/receipts/${encodeURIComponent(receipt)}/cancel.json`, {
114
+ method: "POST",
115
+ headers: { "Content-Type": "application/json" },
116
+ body: JSON.stringify({ token }),
117
+ });
118
+ const data = await res.json();
119
+ if (data.status !== 1) {
120
+ const errors = Array.isArray(data.errors) ? data.errors.join("; ") : `HTTP ${res.status}`;
121
+ throw new Error(`Pushover error: ${errors}`);
122
+ }
123
+ return { success: true, receipt, cancelled: true };
124
+ }
125
+ export async function pushoverListSounds(args) {
126
+ const token = String(args.app_token ?? "").trim();
127
+ if (!token)
128
+ throw new Error("app_token is required.");
129
+ const result = await pushoverGet("/sounds", { token });
130
+ const sounds = Object.entries(result.sounds).map(([id, name]) => ({ id, name }));
131
+ return { count: sounds.length, sounds };
132
+ }
133
+ export async function pushoverValidateUser(args) {
134
+ const { token, user } = requireAuth(args);
135
+ const params = { token, user };
136
+ if (args.device)
137
+ params.device = String(args.device);
138
+ const result = await pushoverPost("/users/validate", params);
139
+ return {
140
+ valid: result.status === 1,
141
+ is_group: result.group === 1,
142
+ devices: result.devices ?? [],
143
+ licenses: result.licenses ?? [],
144
+ };
145
+ }
146
+ //# sourceMappingURL=pushover-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pushover-tool.js","sourceRoot":"","sources":["../src/pushover-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function qcRunChecklist(args: Record<string, unknown>): Promise<unknown>;
2
+ export declare function qcCheckApi(args: Record<string, unknown>): Promise<unknown>;
3
+ export declare function qcCopyAudit(args: Record<string, unknown>): Promise<unknown>;
4
+ //# sourceMappingURL=qc-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qc-tool.d.ts","sourceRoot":"","sources":["../src/qc-tool.ts"],"names":[],"mappings":"AA8RA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA2CpF;AAID,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA8ChF;AAID,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAwEjF"}