@unclick/mcp-server 0.2.4 → 0.3.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 (183) hide show
  1. package/README.md +139 -139
  2. package/dist/algolia-tool.d.ts +5 -0
  3. package/dist/algolia-tool.d.ts.map +1 -0
  4. package/dist/algolia-tool.js +121 -0
  5. package/dist/algolia-tool.js.map +1 -0
  6. package/dist/assemblyai-tool.d.ts +7 -0
  7. package/dist/assemblyai-tool.d.ts.map +1 -0
  8. package/dist/assemblyai-tool.js +127 -0
  9. package/dist/assemblyai-tool.js.map +1 -0
  10. package/dist/catalog.d.ts.map +1 -1
  11. package/dist/catalog.js +261 -0
  12. package/dist/catalog.js.map +1 -1
  13. package/dist/circleci-tool.d.ts +7 -0
  14. package/dist/circleci-tool.d.ts.map +1 -0
  15. package/dist/circleci-tool.js +133 -0
  16. package/dist/circleci-tool.js.map +1 -0
  17. package/dist/cohere-tool.d.ts +7 -0
  18. package/dist/cohere-tool.d.ts.map +1 -0
  19. package/dist/cohere-tool.js +225 -0
  20. package/dist/cohere-tool.js.map +1 -0
  21. package/dist/convertkit-tool.d.ts +7 -0
  22. package/dist/convertkit-tool.d.ts.map +1 -0
  23. package/dist/convertkit-tool.js +213 -0
  24. package/dist/convertkit-tool.js.map +1 -0
  25. package/dist/datadog-tool.d.ts +7 -0
  26. package/dist/datadog-tool.d.ts.map +1 -0
  27. package/dist/datadog-tool.js +121 -0
  28. package/dist/datadog-tool.js.map +1 -0
  29. package/dist/deepl-tool.d.ts +5 -0
  30. package/dist/deepl-tool.d.ts.map +1 -0
  31. package/dist/deepl-tool.js +137 -0
  32. package/dist/deepl-tool.js.map +1 -0
  33. package/dist/flyio-tool.d.ts +6 -0
  34. package/dist/flyio-tool.d.ts.map +1 -0
  35. package/dist/flyio-tool.js +158 -0
  36. package/dist/flyio-tool.js.map +1 -0
  37. package/dist/groq-tool.d.ts +3 -0
  38. package/dist/groq-tool.d.ts.map +1 -0
  39. package/dist/groq-tool.js +109 -0
  40. package/dist/groq-tool.js.map +1 -0
  41. package/dist/gumroad-tool.d.ts +6 -0
  42. package/dist/gumroad-tool.d.ts.map +1 -0
  43. package/dist/gumroad-tool.js +90 -0
  44. package/dist/gumroad-tool.js.map +1 -0
  45. package/dist/heygen-tool.d.ts +5 -0
  46. package/dist/heygen-tool.d.ts.map +1 -0
  47. package/dist/heygen-tool.js +134 -0
  48. package/dist/heygen-tool.js.map +1 -0
  49. package/dist/higgsfield-tool.d.ts +5 -0
  50. package/dist/higgsfield-tool.d.ts.map +1 -0
  51. package/dist/higgsfield-tool.js +120 -0
  52. package/dist/higgsfield-tool.js.map +1 -0
  53. package/dist/keychain-crypto.d.ts +24 -0
  54. package/dist/keychain-crypto.d.ts.map +1 -0
  55. package/dist/keychain-crypto.js +60 -0
  56. package/dist/keychain-crypto.js.map +1 -0
  57. package/dist/keychain-secure-input.d.ts +17 -0
  58. package/dist/keychain-secure-input.d.ts.map +1 -0
  59. package/dist/keychain-secure-input.js +229 -0
  60. package/dist/keychain-secure-input.js.map +1 -0
  61. package/dist/keychain-tool.d.ts +3 -0
  62. package/dist/keychain-tool.d.ts.map +1 -0
  63. package/dist/keychain-tool.js +516 -0
  64. package/dist/keychain-tool.js.map +1 -0
  65. package/dist/kling-tool.d.ts +3 -0
  66. package/dist/kling-tool.d.ts.map +1 -0
  67. package/dist/kling-tool.js +102 -0
  68. package/dist/kling-tool.js.map +1 -0
  69. package/dist/lemonsqueezy-tool.d.ts +7 -0
  70. package/dist/lemonsqueezy-tool.d.ts.map +1 -0
  71. package/dist/lemonsqueezy-tool.js +220 -0
  72. package/dist/lemonsqueezy-tool.js.map +1 -0
  73. package/dist/linear-tool.js +73 -73
  74. package/dist/local-catalog-handlers.d.ts +3 -0
  75. package/dist/local-catalog-handlers.d.ts.map +1 -0
  76. package/dist/local-catalog-handlers.js +1254 -0
  77. package/dist/local-catalog-handlers.js.map +1 -0
  78. package/dist/mailchimp-tool.d.ts +8 -0
  79. package/dist/mailchimp-tool.d.ts.map +1 -0
  80. package/dist/mailchimp-tool.js +138 -0
  81. package/dist/mailchimp-tool.js.map +1 -0
  82. package/dist/mapbox-tool.d.ts +6 -0
  83. package/dist/mapbox-tool.d.ts.map +1 -0
  84. package/dist/mapbox-tool.js +106 -0
  85. package/dist/mapbox-tool.js.map +1 -0
  86. package/dist/memory/db.d.ts +10 -0
  87. package/dist/memory/db.d.ts.map +1 -0
  88. package/dist/memory/db.js +22 -0
  89. package/dist/memory/db.js.map +1 -0
  90. package/dist/memory/handlers.d.ts +11 -0
  91. package/dist/memory/handlers.d.ts.map +1 -0
  92. package/dist/memory/handlers.js +125 -0
  93. package/dist/memory/handlers.js.map +1 -0
  94. package/dist/memory/local.d.ts +37 -0
  95. package/dist/memory/local.d.ts.map +1 -0
  96. package/dist/memory/local.js +386 -0
  97. package/dist/memory/local.js.map +1 -0
  98. package/dist/memory/supabase.d.ts +34 -0
  99. package/dist/memory/supabase.d.ts.map +1 -0
  100. package/dist/memory/supabase.js +209 -0
  101. package/dist/memory/supabase.js.map +1 -0
  102. package/dist/memory/types.d.ts +81 -0
  103. package/dist/memory/types.d.ts.map +1 -0
  104. package/dist/memory/types.js +5 -0
  105. package/dist/memory/types.js.map +1 -0
  106. package/dist/mistral-tool.d.ts +4 -0
  107. package/dist/mistral-tool.d.ts.map +1 -0
  108. package/dist/mistral-tool.js +145 -0
  109. package/dist/mistral-tool.js.map +1 -0
  110. package/dist/mixpanel-tool.d.ts +6 -0
  111. package/dist/mixpanel-tool.d.ts.map +1 -0
  112. package/dist/mixpanel-tool.js +162 -0
  113. package/dist/mixpanel-tool.js.map +1 -0
  114. package/dist/monday-tool.js +46 -46
  115. package/dist/musicbrainz-tool.js +1 -1
  116. package/dist/musicbrainz-tool.js.map +1 -1
  117. package/dist/neon-tool.d.ts +7 -0
  118. package/dist/neon-tool.d.ts.map +1 -0
  119. package/dist/neon-tool.js +156 -0
  120. package/dist/neon-tool.js.map +1 -0
  121. package/dist/pagerduty-tool.d.ts +8 -0
  122. package/dist/pagerduty-tool.d.ts.map +1 -0
  123. package/dist/pagerduty-tool.js +185 -0
  124. package/dist/pagerduty-tool.js.map +1 -0
  125. package/dist/perplexity-tool.d.ts +2 -0
  126. package/dist/perplexity-tool.d.ts.map +1 -0
  127. package/dist/perplexity-tool.js +93 -0
  128. package/dist/perplexity-tool.js.map +1 -0
  129. package/dist/pika-tool.d.ts +4 -0
  130. package/dist/pika-tool.d.ts.map +1 -0
  131. package/dist/pika-tool.js +102 -0
  132. package/dist/pika-tool.js.map +1 -0
  133. package/dist/pinecone-tool.d.ts +6 -0
  134. package/dist/pinecone-tool.d.ts.map +1 -0
  135. package/dist/pinecone-tool.js +148 -0
  136. package/dist/pinecone-tool.js.map +1 -0
  137. package/dist/postmark-tool.d.ts +7 -0
  138. package/dist/postmark-tool.d.ts.map +1 -0
  139. package/dist/postmark-tool.js +148 -0
  140. package/dist/postmark-tool.js.map +1 -0
  141. package/dist/qc-tool.d.ts +4 -0
  142. package/dist/qc-tool.d.ts.map +1 -0
  143. package/dist/qc-tool.js +415 -0
  144. package/dist/qc-tool.js.map +1 -0
  145. package/dist/render-tool.d.ts +7 -0
  146. package/dist/render-tool.d.ts.map +1 -0
  147. package/dist/render-tool.js +158 -0
  148. package/dist/render-tool.js.map +1 -0
  149. package/dist/runway-tool.d.ts +4 -0
  150. package/dist/runway-tool.d.ts.map +1 -0
  151. package/dist/runway-tool.js +110 -0
  152. package/dist/runway-tool.js.map +1 -0
  153. package/dist/segment-tool.d.ts +6 -0
  154. package/dist/segment-tool.d.ts.map +1 -0
  155. package/dist/segment-tool.js +129 -0
  156. package/dist/segment-tool.js.map +1 -0
  157. package/dist/sendgrid-tool.d.ts +7 -0
  158. package/dist/sendgrid-tool.d.ts.map +1 -0
  159. package/dist/sendgrid-tool.js +124 -0
  160. package/dist/sendgrid-tool.js.map +1 -0
  161. package/dist/server.d.ts.map +1 -1
  162. package/dist/server.js +129 -0
  163. package/dist/server.js.map +1 -1
  164. package/dist/togetherai-tool.d.ts +5 -0
  165. package/dist/togetherai-tool.d.ts.map +1 -0
  166. package/dist/togetherai-tool.js +129 -0
  167. package/dist/togetherai-tool.js.map +1 -0
  168. package/dist/toilets-tool.js +2 -2
  169. package/dist/tool-wiring.d.ts +4608 -692
  170. package/dist/tool-wiring.d.ts.map +1 -1
  171. package/dist/tool-wiring.js +2946 -463
  172. package/dist/tool-wiring.js.map +1 -1
  173. package/dist/turso-tool.d.ts +6 -0
  174. package/dist/turso-tool.d.ts.map +1 -0
  175. package/dist/turso-tool.js +158 -0
  176. package/dist/turso-tool.js.map +1 -0
  177. package/dist/upstash-tool.d.ts +8 -0
  178. package/dist/upstash-tool.d.ts.map +1 -0
  179. package/dist/upstash-tool.js +191 -0
  180. package/dist/upstash-tool.js.map +1 -0
  181. package/package.json +66 -65
  182. package/public/icon.svg +15 -15
  183. package/server.json +37 -37
@@ -0,0 +1,415 @@
1
+ // QC Checklist tool -- runs a sequential quality checklist against a website or API.
2
+ // Pure computation with native fetch(). No external dependencies.
3
+ const TIMEOUT_MS = 10_000;
4
+ const DEFAULT_BANNED_WORDS = [
5
+ "delve", "tapestry", "landscape", "robust", "leverage", "harness",
6
+ "empower", "revolutionize", "seamlessly", "utilize", "facilitate",
7
+ "synergy",
8
+ ];
9
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
10
+ async function fetchWithTimeout(url, options = {}) {
11
+ const controller = new AbortController();
12
+ const id = setTimeout(() => controller.abort(), TIMEOUT_MS);
13
+ try {
14
+ return await fetch(url, { ...options, signal: controller.signal });
15
+ }
16
+ finally {
17
+ clearTimeout(id);
18
+ }
19
+ }
20
+ async function runCheck(name, fn) {
21
+ const start = Date.now();
22
+ try {
23
+ const partial = await fn();
24
+ return { ...partial, duration_ms: Date.now() - start };
25
+ }
26
+ catch (err) {
27
+ return {
28
+ check: name,
29
+ status: "fail",
30
+ detail: `Error: ${err instanceof Error ? err.message : String(err)}`,
31
+ duration_ms: Date.now() - start,
32
+ };
33
+ }
34
+ }
35
+ function extractVisibleText(html) {
36
+ return html
37
+ .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, " ")
38
+ .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, " ")
39
+ .replace(/<!--[\s\S]*?-->/g, " ")
40
+ .replace(/<[^>]+>/g, " ")
41
+ .replace(/&amp;/g, "&")
42
+ .replace(/&lt;/g, "<")
43
+ .replace(/&gt;/g, ">")
44
+ .replace(/&nbsp;/g, " ")
45
+ .replace(/&#\d+;/g, " ")
46
+ .replace(/\s+/g, " ")
47
+ .trim();
48
+ }
49
+ // ─── Individual checks ─────────────────────────────────────────────────────────
50
+ async function checkSiteLoads(url) {
51
+ const start = Date.now();
52
+ const res = await fetchWithTimeout(url, { method: "GET", redirect: "follow" });
53
+ const ms = Date.now() - start;
54
+ if (res.status === 200) {
55
+ return {
56
+ check: "site_loads",
57
+ status: ms > 3000 ? "warn" : "pass",
58
+ detail: `HTTP 200 in ${ms}ms`,
59
+ };
60
+ }
61
+ return { check: "site_loads", status: "fail", detail: `HTTP ${res.status}` };
62
+ }
63
+ async function checkSslValid(url) {
64
+ if (!url.startsWith("https://")) {
65
+ return { check: "ssl_valid", status: "fail", detail: "URL does not use HTTPS" };
66
+ }
67
+ const res = await fetchWithTimeout(url, { method: "HEAD" });
68
+ if (res.ok || res.status < 400) {
69
+ return { check: "ssl_valid", status: "pass", detail: "HTTPS connection succeeded" };
70
+ }
71
+ return { check: "ssl_valid", status: "fail", detail: `HTTPS returned HTTP ${res.status}` };
72
+ }
73
+ async function checkMetaTags(url) {
74
+ const res = await fetchWithTimeout(url);
75
+ const html = await res.text();
76
+ const missing = [];
77
+ const patterns = [
78
+ { name: "title", pattern: /<title[^>]*>[^<]+<\/title>/i },
79
+ { name: "meta description", pattern: /<meta[^>]+name=["']description["'][^>]+content=["'][^"']+["']/i },
80
+ { name: "og:title", pattern: /<meta[^>]+property=["']og:title["'][^>]+content=["'][^"']+["']/i },
81
+ { name: "og:description", pattern: /<meta[^>]+property=["']og:description["'][^>]+content=["'][^"']+["']/i },
82
+ { name: "og:image", pattern: /<meta[^>]+property=["']og:image["'][^>]+content=["'][^"']+["']/i },
83
+ ];
84
+ for (const c of patterns) {
85
+ if (!c.pattern.test(html))
86
+ missing.push(c.name);
87
+ }
88
+ if (missing.length === 0) {
89
+ return { check: "meta_tags", status: "pass", detail: "All required meta tags present" };
90
+ }
91
+ return { check: "meta_tags", status: "fail", detail: `Missing: ${missing.join(", ")}` };
92
+ }
93
+ async function checkOgImageValid(url) {
94
+ const res = await fetchWithTimeout(url);
95
+ const html = await res.text();
96
+ const match = html.match(/<meta[^>]+property=["']og:image["'][^>]+content=["']([^"']+)["']/i) ||
97
+ html.match(/<meta[^>]+content=["']([^"']+)["'][^>]+property=["']og:image["']/i);
98
+ if (!match) {
99
+ return { check: "og_image_valid", status: "fail", detail: "No og:image tag found" };
100
+ }
101
+ const imageUrl = match[1];
102
+ const imgRes = await fetchWithTimeout(imageUrl, { method: "HEAD" });
103
+ const contentType = imgRes.headers.get("content-type") ?? "";
104
+ if (!imgRes.ok) {
105
+ return { check: "og_image_valid", status: "fail", detail: `og:image returned HTTP ${imgRes.status}` };
106
+ }
107
+ if (contentType.startsWith("text/html")) {
108
+ return { check: "og_image_valid", status: "fail", detail: "og:image URL returns HTML, not an image" };
109
+ }
110
+ return { check: "og_image_valid", status: "pass", detail: `og:image is valid (${contentType || "unknown type"})` };
111
+ }
112
+ async function checkRobotsTxt(url) {
113
+ const base = new URL(url);
114
+ const robotsUrl = `${base.protocol}//${base.host}/robots.txt`;
115
+ const res = await fetchWithTimeout(robotsUrl);
116
+ if (res.status === 200) {
117
+ const text = await res.text();
118
+ if (text.toLowerCase().includes("user-agent")) {
119
+ return { check: "robots_txt", status: "pass", detail: "robots.txt exists with User-agent directives" };
120
+ }
121
+ return { check: "robots_txt", status: "warn", detail: "robots.txt exists but no User-agent directive found" };
122
+ }
123
+ return { check: "robots_txt", status: "fail", detail: `robots.txt returned HTTP ${res.status}` };
124
+ }
125
+ async function checkSitemap(url) {
126
+ const base = new URL(url);
127
+ const sitemapUrl = `${base.protocol}//${base.host}/sitemap.xml`;
128
+ const res = await fetchWithTimeout(sitemapUrl);
129
+ if (res.status === 200) {
130
+ return { check: "sitemap", status: "pass", detail: "sitemap.xml found" };
131
+ }
132
+ return { check: "sitemap", status: "fail", detail: `sitemap.xml returned HTTP ${res.status}` };
133
+ }
134
+ async function checkNoConsoleErrors(url) {
135
+ const res = await fetchWithTimeout(url);
136
+ const html = await res.text();
137
+ const errorPatterns = [/console\.error\s*\(/gi, /throw new Error\s*\(/gi];
138
+ let count = 0;
139
+ for (const p of errorPatterns) {
140
+ const matches = html.match(p);
141
+ if (matches)
142
+ count += matches.length;
143
+ }
144
+ if (count === 0) {
145
+ return {
146
+ check: "no_console_errors",
147
+ status: "pass",
148
+ detail: "No console.error or throw patterns in HTML source (static check only -- runtime JS not evaluated)",
149
+ };
150
+ }
151
+ return {
152
+ check: "no_console_errors",
153
+ status: "warn",
154
+ detail: `Found ${count} console.error/throw pattern(s) in HTML source (static check only)`,
155
+ };
156
+ }
157
+ async function checkLinks(url) {
158
+ const res = await fetchWithTimeout(url);
159
+ const html = await res.text();
160
+ const base = new URL(url);
161
+ const hrefPattern = /href=["']([^"'#][^"']*?)["']/gi;
162
+ const links = [];
163
+ let m;
164
+ while ((m = hrefPattern.exec(html)) !== null && links.length < 20) {
165
+ const href = m[1];
166
+ if (/^(mailto:|tel:|javascript:)/i.test(href))
167
+ continue;
168
+ try {
169
+ links.push(new URL(href, base).href);
170
+ }
171
+ catch {
172
+ // skip unparseable hrefs
173
+ }
174
+ }
175
+ const broken = [];
176
+ for (const link of links) {
177
+ try {
178
+ const linkRes = await fetchWithTimeout(link, { method: "HEAD" });
179
+ if (linkRes.status === 404)
180
+ broken.push(`${link} -> 404`);
181
+ }
182
+ catch {
183
+ broken.push(`${link} -> unreachable`);
184
+ }
185
+ }
186
+ if (broken.length === 0) {
187
+ return { check: "link_check", status: "pass", detail: `Checked ${links.length} link(s), none returned 404` };
188
+ }
189
+ return {
190
+ check: "link_check",
191
+ status: "fail",
192
+ detail: `${broken.length} broken link(s): ${broken.slice(0, 5).join("; ")}`,
193
+ };
194
+ }
195
+ function buildResponseTimeSummary(results) {
196
+ const slow = results.filter(r => r.duration_ms > 3000);
197
+ if (slow.length === 0) {
198
+ return { check: "response_time", status: "pass", detail: "All checks completed within 3 seconds" };
199
+ }
200
+ return {
201
+ check: "response_time",
202
+ status: "warn",
203
+ detail: `${slow.length} check(s) exceeded 3s: ${slow.map(r => `${r.check} (${r.duration_ms}ms)`).join(", ")}`,
204
+ };
205
+ }
206
+ async function checkCopy(url, bannedWords) {
207
+ const res = await fetchWithTimeout(url);
208
+ const html = await res.text();
209
+ const text = extractVisibleText(html);
210
+ const issues = [];
211
+ const emDashRe = /\u2014/g;
212
+ let em;
213
+ while ((em = emDashRe.exec(text)) !== null && issues.length < 5) {
214
+ const ctx = text.slice(Math.max(0, em.index - 20), em.index + 21).trim();
215
+ issues.push(`em-dash: "...${ctx}..."`);
216
+ }
217
+ const enDashRe = /\u2013/g;
218
+ let en;
219
+ while ((en = enDashRe.exec(text)) !== null && issues.length < 8) {
220
+ const ctx = text.slice(Math.max(0, en.index - 20), en.index + 21).trim();
221
+ issues.push(`en-dash: "...${ctx}..."`);
222
+ }
223
+ const lower = text.toLowerCase();
224
+ for (const word of bannedWords) {
225
+ const idx = lower.indexOf(word.toLowerCase());
226
+ if (idx !== -1) {
227
+ const ctx = text.slice(Math.max(0, idx - 30), idx + word.length + 30).trim();
228
+ issues.push(`"${word}": "...${ctx}..."`);
229
+ }
230
+ }
231
+ if (issues.length === 0) {
232
+ return { check: "copy_check", status: "pass", detail: "No em dashes, en dashes, or banned words found" };
233
+ }
234
+ return {
235
+ check: "copy_check",
236
+ status: "fail",
237
+ detail: `${issues.length} issue(s): ${issues.slice(0, 5).join(" | ")}`,
238
+ };
239
+ }
240
+ // ─── Ordered check runner ──────────────────────────────────────────────────────
241
+ const ALL_CHECKS = [
242
+ "site_loads", "ssl_valid", "meta_tags", "og_image_valid",
243
+ "robots_txt", "sitemap", "no_console_errors", "link_check",
244
+ "response_time", "copy_check",
245
+ ];
246
+ // ─── qc_run_checklist ─────────────────────────────────────────────────────────
247
+ export async function qcRunChecklist(args) {
248
+ const url = String(args.url ?? "").trim();
249
+ if (!url)
250
+ return { error: "url is required" };
251
+ const requested = Array.isArray(args.checks) ? args.checks : ALL_CHECKS;
252
+ const results = [];
253
+ for (const name of requested) {
254
+ if (name === "response_time")
255
+ continue; // computed after all other checks
256
+ let result;
257
+ switch (name) {
258
+ case "site_loads":
259
+ result = await runCheck(name, () => checkSiteLoads(url));
260
+ break;
261
+ case "ssl_valid":
262
+ result = await runCheck(name, () => checkSslValid(url));
263
+ break;
264
+ case "meta_tags":
265
+ result = await runCheck(name, () => checkMetaTags(url));
266
+ break;
267
+ case "og_image_valid":
268
+ result = await runCheck(name, () => checkOgImageValid(url));
269
+ break;
270
+ case "robots_txt":
271
+ result = await runCheck(name, () => checkRobotsTxt(url));
272
+ break;
273
+ case "sitemap":
274
+ result = await runCheck(name, () => checkSitemap(url));
275
+ break;
276
+ case "no_console_errors":
277
+ result = await runCheck(name, () => checkNoConsoleErrors(url));
278
+ break;
279
+ case "link_check":
280
+ result = await runCheck(name, () => checkLinks(url));
281
+ break;
282
+ case "copy_check":
283
+ result = await runCheck(name, () => checkCopy(url, DEFAULT_BANNED_WORDS));
284
+ break;
285
+ default:
286
+ result = { check: name, status: "warn", detail: `Unknown check "${name}" skipped`, duration_ms: 0 };
287
+ }
288
+ results.push(result);
289
+ }
290
+ if (requested.includes("response_time")) {
291
+ const rt = buildResponseTimeSummary(results);
292
+ results.push({ ...rt, duration_ms: 0 });
293
+ }
294
+ const passed = results.filter(r => r.status === "pass").length;
295
+ const failed = results.filter(r => r.status === "fail").length;
296
+ const warned = results.filter(r => r.status === "warn").length;
297
+ const totalMs = results.reduce((s, r) => s + r.duration_ms, 0);
298
+ return {
299
+ url,
300
+ summary: { passed, failed, warnings: warned, total: results.length, total_ms: totalMs },
301
+ results,
302
+ };
303
+ }
304
+ // ─── qc_check_api ─────────────────────────────────────────────────────────────
305
+ export async function qcCheckApi(args) {
306
+ const baseUrl = String(args.base_url ?? "").replace(/\/$/, "");
307
+ if (!baseUrl)
308
+ return { error: "base_url is required" };
309
+ const endpoints = Array.isArray(args.endpoints) ? args.endpoints : [];
310
+ if (endpoints.length === 0)
311
+ return { error: "endpoints array is required and must not be empty" };
312
+ const results = [];
313
+ for (const ep of endpoints) {
314
+ const fullUrl = `${baseUrl}${ep.path}`;
315
+ const method = (ep.method ?? "GET").toUpperCase();
316
+ const expected = ep.expected_status ?? 200;
317
+ const start = Date.now();
318
+ try {
319
+ const res = await fetchWithTimeout(fullUrl, { method });
320
+ results.push({
321
+ path: ep.path,
322
+ method,
323
+ expected_status: expected,
324
+ actual_status: res.status,
325
+ status: res.status === expected ? "pass" : "fail",
326
+ duration_ms: Date.now() - start,
327
+ });
328
+ }
329
+ catch (err) {
330
+ results.push({
331
+ path: ep.path,
332
+ method,
333
+ expected_status: expected,
334
+ actual_status: null,
335
+ status: "fail",
336
+ detail: err instanceof Error ? err.message : String(err),
337
+ duration_ms: Date.now() - start,
338
+ });
339
+ }
340
+ }
341
+ const passed = results.filter(r => r.status === "pass").length;
342
+ const failed = results.filter(r => r.status === "fail").length;
343
+ return {
344
+ base_url: baseUrl,
345
+ summary: { passed, failed, total: results.length },
346
+ results,
347
+ };
348
+ }
349
+ // ─── qc_copy_audit ────────────────────────────────────────────────────────────
350
+ export async function qcCopyAudit(args) {
351
+ const url = String(args.url ?? "").trim();
352
+ if (!url)
353
+ return { error: "url is required" };
354
+ const bannedWords = Array.isArray(args.banned_words)
355
+ ? args.banned_words
356
+ : DEFAULT_BANNED_WORDS;
357
+ const start = Date.now();
358
+ const res = await fetchWithTimeout(url);
359
+ const html = await res.text();
360
+ const text = extractVisibleText(html);
361
+ const fetchMs = Date.now() - start;
362
+ const occurrences = [];
363
+ // Em dash (U+2014)
364
+ const emRe = /\u2014/g;
365
+ let m;
366
+ while ((m = emRe.exec(text)) !== null) {
367
+ occurrences.push({
368
+ type: "em_dash",
369
+ value: "\u2014",
370
+ context: text.slice(Math.max(0, m.index - 40), m.index + 41).trim(),
371
+ position: m.index,
372
+ });
373
+ }
374
+ // En dash (U+2013)
375
+ const enRe = /\u2013/g;
376
+ while ((m = enRe.exec(text)) !== null) {
377
+ occurrences.push({
378
+ type: "en_dash",
379
+ value: "\u2013",
380
+ context: text.slice(Math.max(0, m.index - 40), m.index + 41).trim(),
381
+ position: m.index,
382
+ });
383
+ }
384
+ // Banned words (all occurrences)
385
+ const lower = text.toLowerCase();
386
+ for (const word of bannedWords) {
387
+ const lw = word.toLowerCase();
388
+ let pos = 0;
389
+ while (true) {
390
+ const idx = lower.indexOf(lw, pos);
391
+ if (idx === -1)
392
+ break;
393
+ occurrences.push({
394
+ type: "banned_word",
395
+ value: word,
396
+ context: text.slice(Math.max(0, idx - 40), idx + word.length + 40).trim(),
397
+ position: idx,
398
+ });
399
+ pos = idx + 1;
400
+ }
401
+ }
402
+ occurrences.sort((a, b) => a.position - b.position);
403
+ const uniqueIssues = [...new Set(occurrences.map(o => o.type === "banned_word" ? `"${o.value}"` : o.type))];
404
+ return {
405
+ url,
406
+ fetch_ms: fetchMs,
407
+ banned_words_checked: bannedWords,
408
+ total_occurrences: occurrences.length,
409
+ summary: occurrences.length === 0
410
+ ? "No issues found"
411
+ : `Found ${occurrences.length} occurrence(s): ${uniqueIssues.join(", ")}`,
412
+ occurrences,
413
+ };
414
+ }
415
+ //# sourceMappingURL=qc-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qc-tool.js","sourceRoot":"","sources":["../src/qc-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function renderListServices(args: Record<string, unknown>): Promise<unknown>;
2
+ export declare function renderGetService(args: Record<string, unknown>): Promise<unknown>;
3
+ export declare function renderListDeploys(args: Record<string, unknown>): Promise<unknown>;
4
+ export declare function renderTriggerDeploy(args: Record<string, unknown>): Promise<unknown>;
5
+ export declare function renderListEnvVars(args: Record<string, unknown>): Promise<unknown>;
6
+ export declare function renderSetEnvVar(args: Record<string, unknown>): Promise<unknown>;
7
+ //# sourceMappingURL=render-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-tool.d.ts","sourceRoot":"","sources":["../src/render-tool.ts"],"names":[],"mappings":"AAkFA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAexF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAWtF;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAcvF;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAczF;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAWvF;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBrF"}
@@ -0,0 +1,158 @@
1
+ // Render hosting API integration for the UnClick MCP server.
2
+ // Uses the Render REST API via fetch - no external dependencies.
3
+ // Users must supply an API key from dashboard.render.com/u/{user}/account/api-keys.
4
+ const RENDER_API_BASE = "https://api.render.com/v1";
5
+ // ── Fetch helper ──────────────────────────────────────────────────────────────
6
+ async function renderFetch(apiKey, method, path, body, query) {
7
+ const url = new URL(`${RENDER_API_BASE}${path}`);
8
+ if (query) {
9
+ for (const [k, v] of Object.entries(query)) {
10
+ if (v !== undefined && v !== "")
11
+ url.searchParams.set(k, String(v));
12
+ }
13
+ }
14
+ const headers = {
15
+ Authorization: `Bearer ${apiKey}`,
16
+ Accept: "application/json",
17
+ };
18
+ if (body !== undefined)
19
+ headers["Content-Type"] = "application/json";
20
+ let response;
21
+ try {
22
+ response = await fetch(url.toString(), {
23
+ method,
24
+ headers,
25
+ body: body !== undefined ? JSON.stringify(body) : undefined,
26
+ });
27
+ }
28
+ catch (err) {
29
+ return { error: `Network error reaching Render API: ${err instanceof Error ? err.message : String(err)}` };
30
+ }
31
+ // 204 No Content
32
+ if (response.status === 204)
33
+ return { success: true };
34
+ const text = await response.text();
35
+ let data;
36
+ try {
37
+ data = JSON.parse(text);
38
+ }
39
+ catch {
40
+ data = { raw: text };
41
+ }
42
+ if (response.status === 401)
43
+ return { error: "Render API key is invalid or expired. Check your api_key.", status: 401 };
44
+ if (response.status === 403)
45
+ return { error: "Render API: insufficient permissions.", status: 403 };
46
+ if (response.status === 404)
47
+ return { error: "Resource not found. Check the service_id.", status: 404 };
48
+ if (!response.ok) {
49
+ const errData = data;
50
+ const detail = errData?.message ?? errData?.id ?? text;
51
+ return { error: `Render API error ${response.status}: ${detail}`, status: response.status };
52
+ }
53
+ return data;
54
+ }
55
+ // ── Operations ────────────────────────────────────────────────────────────────
56
+ export async function renderListServices(args) {
57
+ const apiKey = String(args.api_key ?? process.env.RENDER_API_KEY ?? "").trim();
58
+ if (!apiKey)
59
+ return { error: "api_key is required. Get one at dashboard.render.com." };
60
+ try {
61
+ const query = {
62
+ limit: args.limit ? Number(args.limit) : 20,
63
+ };
64
+ if (args.cursor)
65
+ query.cursor = String(args.cursor);
66
+ if (args.type)
67
+ query.type = String(args.type);
68
+ return renderFetch(apiKey, "GET", "/services", undefined, query);
69
+ }
70
+ catch (err) {
71
+ return { error: err instanceof Error ? err.message : String(err) };
72
+ }
73
+ }
74
+ export async function renderGetService(args) {
75
+ const apiKey = String(args.api_key ?? process.env.RENDER_API_KEY ?? "").trim();
76
+ if (!apiKey)
77
+ return { error: "api_key is required. Get one at dashboard.render.com." };
78
+ const serviceId = String(args.service_id ?? "").trim();
79
+ if (!serviceId)
80
+ return { error: "service_id is required." };
81
+ try {
82
+ return renderFetch(apiKey, "GET", `/services/${encodeURIComponent(serviceId)}`);
83
+ }
84
+ catch (err) {
85
+ return { error: err instanceof Error ? err.message : String(err) };
86
+ }
87
+ }
88
+ export async function renderListDeploys(args) {
89
+ const apiKey = String(args.api_key ?? process.env.RENDER_API_KEY ?? "").trim();
90
+ if (!apiKey)
91
+ return { error: "api_key is required. Get one at dashboard.render.com." };
92
+ const serviceId = String(args.service_id ?? "").trim();
93
+ if (!serviceId)
94
+ return { error: "service_id is required." };
95
+ try {
96
+ const query = {};
97
+ if (args.limit)
98
+ query.limit = Number(args.limit);
99
+ return renderFetch(apiKey, "GET", `/services/${encodeURIComponent(serviceId)}/deploys`, undefined, query);
100
+ }
101
+ catch (err) {
102
+ return { error: err instanceof Error ? err.message : String(err) };
103
+ }
104
+ }
105
+ export async function renderTriggerDeploy(args) {
106
+ const apiKey = String(args.api_key ?? process.env.RENDER_API_KEY ?? "").trim();
107
+ if (!apiKey)
108
+ return { error: "api_key is required. Get one at dashboard.render.com." };
109
+ const serviceId = String(args.service_id ?? "").trim();
110
+ if (!serviceId)
111
+ return { error: "service_id is required." };
112
+ try {
113
+ const body = {};
114
+ if (args.clear_cache !== undefined)
115
+ body.clearCache = Boolean(args.clear_cache);
116
+ return renderFetch(apiKey, "POST", `/services/${encodeURIComponent(serviceId)}/deploys`, body);
117
+ }
118
+ catch (err) {
119
+ return { error: err instanceof Error ? err.message : String(err) };
120
+ }
121
+ }
122
+ export async function renderListEnvVars(args) {
123
+ const apiKey = String(args.api_key ?? process.env.RENDER_API_KEY ?? "").trim();
124
+ if (!apiKey)
125
+ return { error: "api_key is required. Get one at dashboard.render.com." };
126
+ const serviceId = String(args.service_id ?? "").trim();
127
+ if (!serviceId)
128
+ return { error: "service_id is required." };
129
+ try {
130
+ return renderFetch(apiKey, "GET", `/services/${encodeURIComponent(serviceId)}/env-vars`);
131
+ }
132
+ catch (err) {
133
+ return { error: err instanceof Error ? err.message : String(err) };
134
+ }
135
+ }
136
+ export async function renderSetEnvVar(args) {
137
+ const apiKey = String(args.api_key ?? process.env.RENDER_API_KEY ?? "").trim();
138
+ if (!apiKey)
139
+ return { error: "api_key is required. Get one at dashboard.render.com." };
140
+ const serviceId = String(args.service_id ?? "").trim();
141
+ if (!serviceId)
142
+ return { error: "service_id is required." };
143
+ const key = String(args.key ?? "").trim();
144
+ if (!key)
145
+ return { error: "key is required (the environment variable name)." };
146
+ if (args.value === undefined || args.value === null)
147
+ return { error: "value is required." };
148
+ const value = String(args.value);
149
+ try {
150
+ // Render PUT env-vars expects an array of {key, value} pairs
151
+ const body = [{ key, value }];
152
+ return renderFetch(apiKey, "PUT", `/services/${encodeURIComponent(serviceId)}/env-vars`, body);
153
+ }
154
+ catch (err) {
155
+ return { error: err instanceof Error ? err.message : String(err) };
156
+ }
157
+ }
158
+ //# sourceMappingURL=render-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-tool.js","sourceRoot":"","sources":["../src/render-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function runway_generate_video(args: Record<string, unknown>): Promise<unknown>;
2
+ export declare function runway_get_task(args: Record<string, unknown>): Promise<unknown>;
3
+ export declare function runway_list_models(args: Record<string, unknown>): Promise<unknown>;
4
+ //# sourceMappingURL=runway-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runway-tool.d.ts","sourceRoot":"","sources":["../src/runway-tool.ts"],"names":[],"mappings":"AAsDA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAsC3F;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBrF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAYxF"}