@unclick/mcp-server 0.2.3 → 0.2.4

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 (177) 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/anthropic-tool.d.ts +3 -0
  7. package/dist/anthropic-tool.d.ts.map +1 -0
  8. package/dist/anthropic-tool.js +123 -0
  9. package/dist/anthropic-tool.js.map +1 -0
  10. package/dist/asana-tool.d.ts +8 -0
  11. package/dist/asana-tool.d.ts.map +1 -0
  12. package/dist/asana-tool.js +218 -0
  13. package/dist/asana-tool.js.map +1 -0
  14. package/dist/calendly-tool.d.ts +6 -0
  15. package/dist/calendly-tool.d.ts.map +1 -0
  16. package/dist/calendly-tool.js +182 -0
  17. package/dist/calendly-tool.js.map +1 -0
  18. package/dist/clickup-tool.d.ts +2 -0
  19. package/dist/clickup-tool.d.ts.map +1 -0
  20. package/dist/clickup-tool.js +153 -0
  21. package/dist/clickup-tool.js.map +1 -0
  22. package/dist/connectors/figma.d.ts +3 -0
  23. package/dist/connectors/figma.d.ts.map +1 -0
  24. package/dist/connectors/figma.js +18 -0
  25. package/dist/connectors/figma.js.map +1 -0
  26. package/dist/connectors/index.d.ts +3 -1
  27. package/dist/connectors/index.d.ts.map +1 -1
  28. package/dist/connectors/index.js +5 -1
  29. package/dist/connectors/index.js.map +1 -1
  30. package/dist/connectors/line.d.ts +3 -0
  31. package/dist/connectors/line.d.ts.map +1 -0
  32. package/dist/connectors/line.js +18 -0
  33. package/dist/connectors/line.js.map +1 -0
  34. package/dist/ebay-tool.d.ts +5 -0
  35. package/dist/ebay-tool.d.ts.map +1 -0
  36. package/dist/ebay-tool.js +179 -0
  37. package/dist/ebay-tool.js.map +1 -0
  38. package/dist/elevenlabs-tool.d.ts +6 -0
  39. package/dist/elevenlabs-tool.d.ts.map +1 -0
  40. package/dist/elevenlabs-tool.js +166 -0
  41. package/dist/elevenlabs-tool.js.map +1 -0
  42. package/dist/etsy-tool.d.ts +6 -0
  43. package/dist/etsy-tool.d.ts.map +1 -0
  44. package/dist/etsy-tool.js +125 -0
  45. package/dist/etsy-tool.js.map +1 -0
  46. package/dist/exchangerate-tool.d.ts +5 -0
  47. package/dist/exchangerate-tool.d.ts.map +1 -0
  48. package/dist/exchangerate-tool.js +139 -0
  49. package/dist/exchangerate-tool.js.map +1 -0
  50. package/dist/figma-tool.d.ts +8 -0
  51. package/dist/figma-tool.d.ts.map +1 -0
  52. package/dist/figma-tool.js +231 -0
  53. package/dist/figma-tool.js.map +1 -0
  54. package/dist/gdelt-tool.d.ts +5 -0
  55. package/dist/gdelt-tool.d.ts.map +1 -0
  56. package/dist/gdelt-tool.js +177 -0
  57. package/dist/gdelt-tool.js.map +1 -0
  58. package/dist/github-tool.d.ts +2 -0
  59. package/dist/github-tool.d.ts.map +1 -0
  60. package/dist/github-tool.js +165 -0
  61. package/dist/github-tool.js.map +1 -0
  62. package/dist/gitlab-tool.d.ts +2 -0
  63. package/dist/gitlab-tool.d.ts.map +1 -0
  64. package/dist/gitlab-tool.js +127 -0
  65. package/dist/gitlab-tool.js.map +1 -0
  66. package/dist/igdb-tool.d.ts +6 -0
  67. package/dist/igdb-tool.d.ts.map +1 -0
  68. package/dist/igdb-tool.js +140 -0
  69. package/dist/igdb-tool.js.map +1 -0
  70. package/dist/line-tool.d.ts +7 -0
  71. package/dist/line-tool.d.ts.map +1 -0
  72. package/dist/line-tool.js +188 -0
  73. package/dist/line-tool.js.map +1 -0
  74. package/dist/linear-tool.d.ts +2 -0
  75. package/dist/linear-tool.d.ts.map +1 -0
  76. package/dist/linear-tool.js +186 -0
  77. package/dist/linear-tool.js.map +1 -0
  78. package/dist/monday-tool.d.ts +7 -0
  79. package/dist/monday-tool.d.ts.map +1 -0
  80. package/dist/monday-tool.js +206 -0
  81. package/dist/monday-tool.js.map +1 -0
  82. package/dist/openai-tool.d.ts +6 -0
  83. package/dist/openai-tool.d.ts.map +1 -0
  84. package/dist/openai-tool.js +227 -0
  85. package/dist/openai-tool.js.map +1 -0
  86. package/dist/paypal-tool.d.ts +3 -0
  87. package/dist/paypal-tool.d.ts.map +1 -0
  88. package/dist/paypal-tool.js +157 -0
  89. package/dist/paypal-tool.js.map +1 -0
  90. package/dist/pinterest-tool.d.ts +7 -0
  91. package/dist/pinterest-tool.d.ts.map +1 -0
  92. package/dist/pinterest-tool.js +219 -0
  93. package/dist/pinterest-tool.js.map +1 -0
  94. package/dist/plaid-tool.d.ts +6 -0
  95. package/dist/plaid-tool.d.ts.map +1 -0
  96. package/dist/plaid-tool.js +149 -0
  97. package/dist/plaid-tool.js.map +1 -0
  98. package/dist/postman-tool.d.ts +2 -0
  99. package/dist/postman-tool.d.ts.map +1 -0
  100. package/dist/postman-tool.js +92 -0
  101. package/dist/postman-tool.js.map +1 -0
  102. package/dist/pushover-tool.d.ts +6 -0
  103. package/dist/pushover-tool.d.ts.map +1 -0
  104. package/dist/pushover-tool.js +146 -0
  105. package/dist/pushover-tool.js.map +1 -0
  106. package/dist/quickbooks-tool.d.ts +5 -0
  107. package/dist/quickbooks-tool.d.ts.map +1 -0
  108. package/dist/quickbooks-tool.js +160 -0
  109. package/dist/quickbooks-tool.js.map +1 -0
  110. package/dist/replicate-tool.d.ts +7 -0
  111. package/dist/replicate-tool.d.ts.map +1 -0
  112. package/dist/replicate-tool.js +172 -0
  113. package/dist/replicate-tool.js.map +1 -0
  114. package/dist/sentry-tool.d.ts +2 -0
  115. package/dist/sentry-tool.d.ts.map +1 -0
  116. package/dist/sentry-tool.js +123 -0
  117. package/dist/sentry-tool.js.map +1 -0
  118. package/dist/speedrun-tool.d.ts +6 -0
  119. package/dist/speedrun-tool.d.ts.map +1 -0
  120. package/dist/speedrun-tool.js +192 -0
  121. package/dist/speedrun-tool.js.map +1 -0
  122. package/dist/spotify-tool.d.ts +8 -0
  123. package/dist/spotify-tool.d.ts.map +1 -0
  124. package/dist/spotify-tool.js +274 -0
  125. package/dist/spotify-tool.js.map +1 -0
  126. package/dist/square-tool.d.ts +5 -0
  127. package/dist/square-tool.d.ts.map +1 -0
  128. package/dist/square-tool.js +133 -0
  129. package/dist/square-tool.js.map +1 -0
  130. package/dist/stability-tool.d.ts +5 -0
  131. package/dist/stability-tool.d.ts.map +1 -0
  132. package/dist/stability-tool.js +190 -0
  133. package/dist/stability-tool.js.map +1 -0
  134. package/dist/steam-tool.d.ts +6 -0
  135. package/dist/steam-tool.d.ts.map +1 -0
  136. package/dist/steam-tool.js +222 -0
  137. package/dist/steam-tool.js.map +1 -0
  138. package/dist/stripe-tool.d.ts +7 -0
  139. package/dist/stripe-tool.d.ts.map +1 -0
  140. package/dist/stripe-tool.js +181 -0
  141. package/dist/stripe-tool.js.map +1 -0
  142. package/dist/tiktok-tool.d.ts +4 -0
  143. package/dist/tiktok-tool.d.ts.map +1 -0
  144. package/dist/tiktok-tool.js +129 -0
  145. package/dist/tiktok-tool.js.map +1 -0
  146. package/dist/toilets-tool.js +2 -2
  147. package/dist/tool-wiring.d.ts +4066 -18
  148. package/dist/tool-wiring.d.ts.map +1 -1
  149. package/dist/tool-wiring.js +2601 -18
  150. package/dist/tool-wiring.js.map +1 -1
  151. package/dist/trello-tool.d.ts +2 -0
  152. package/dist/trello-tool.d.ts.map +1 -0
  153. package/dist/trello-tool.js +166 -0
  154. package/dist/trello-tool.js.map +1 -0
  155. package/dist/twilio-tool.d.ts +8 -0
  156. package/dist/twilio-tool.d.ts.map +1 -0
  157. package/dist/twilio-tool.js +243 -0
  158. package/dist/twilio-tool.js.map +1 -0
  159. package/dist/whatsapp-tool.d.ts +6 -0
  160. package/dist/whatsapp-tool.d.ts.map +1 -0
  161. package/dist/whatsapp-tool.js +200 -0
  162. package/dist/whatsapp-tool.js.map +1 -0
  163. package/dist/woocommerce-tool.d.ts +4 -0
  164. package/dist/woocommerce-tool.d.ts.map +1 -0
  165. package/dist/woocommerce-tool.js +140 -0
  166. package/dist/woocommerce-tool.js.map +1 -0
  167. package/dist/youtube-tool.d.ts +7 -0
  168. package/dist/youtube-tool.d.ts.map +1 -0
  169. package/dist/youtube-tool.js +196 -0
  170. package/dist/youtube-tool.js.map +1 -0
  171. package/package.json +1 -1
  172. package/server.json +37 -37
  173. package/LICENSE +0 -216
  174. package/dist/cloudflare-worker.d.ts +0 -12
  175. package/dist/cloudflare-worker.d.ts.map +0 -1
  176. package/dist/cloudflare-worker.js +0 -50
  177. package/dist/cloudflare-worker.js.map +0 -1
@@ -0,0 +1,227 @@
1
+ // OpenAI API integration for the UnClick MCP server.
2
+ // Uses the OpenAI REST API via fetch - no external dependencies.
3
+ // Users must supply an API key from platform.openai.com.
4
+ const OPENAI_API_BASE = "https://api.openai.com/v1";
5
+ // ─── Auth validation ──────────────────────────────────────────────────────────
6
+ function requireKey(args) {
7
+ const key = String(args.api_key ?? "").trim();
8
+ if (!key)
9
+ throw new Error("api_key is required. Get one at platform.openai.com/api-keys.");
10
+ return key;
11
+ }
12
+ // ─── API helpers ──────────────────────────────────────────────────────────────
13
+ async function openaiPost(apiKey, path, body, orgId) {
14
+ const headers = {
15
+ Authorization: `Bearer ${apiKey}`,
16
+ "Content-Type": "application/json",
17
+ };
18
+ if (orgId)
19
+ headers["OpenAI-Organization"] = orgId;
20
+ const res = await fetch(`${OPENAI_API_BASE}${path}`, {
21
+ method: "POST",
22
+ headers,
23
+ body: JSON.stringify(body),
24
+ });
25
+ const data = await res.json();
26
+ if (!res.ok) {
27
+ const err = data.error;
28
+ const msg = err?.message ?? `HTTP ${res.status}`;
29
+ const code = err?.code ? ` (${err.code})` : "";
30
+ const type = err?.type ? ` [${err.type}]` : "";
31
+ throw new Error(`OpenAI error${type}${code}: ${msg}`);
32
+ }
33
+ return data;
34
+ }
35
+ async function openaiGet(apiKey, path) {
36
+ const res = await fetch(`${OPENAI_API_BASE}${path}`, {
37
+ headers: { Authorization: `Bearer ${apiKey}` },
38
+ });
39
+ const data = await res.json();
40
+ if (!res.ok) {
41
+ const err = data.error;
42
+ const msg = err?.message ?? `HTTP ${res.status}`;
43
+ throw new Error(`OpenAI error: ${msg}`);
44
+ }
45
+ return data;
46
+ }
47
+ // ─── Operations ───────────────────────────────────────────────────────────────
48
+ export async function openaiChatCompletion(args) {
49
+ const apiKey = requireKey(args);
50
+ const model = String(args.model ?? "gpt-4o-mini");
51
+ const orgId = args.org_id ? String(args.org_id) : undefined;
52
+ // Parse messages
53
+ let messages;
54
+ if (Array.isArray(args.messages)) {
55
+ messages = args.messages;
56
+ }
57
+ else if (typeof args.messages === "string") {
58
+ try {
59
+ messages = JSON.parse(args.messages);
60
+ }
61
+ catch {
62
+ throw new Error("messages must be a JSON array of {role, content} objects.");
63
+ }
64
+ }
65
+ else if (args.prompt) {
66
+ // Convenience: single user message via 'prompt'
67
+ const systemPrompt = args.system_prompt ? String(args.system_prompt) : undefined;
68
+ messages = [];
69
+ if (systemPrompt)
70
+ messages.push({ role: "system", content: systemPrompt });
71
+ messages.push({ role: "user", content: String(args.prompt) });
72
+ }
73
+ else {
74
+ throw new Error("Either messages (array) or prompt (string) is required.");
75
+ }
76
+ if (messages.length === 0)
77
+ throw new Error("messages array must not be empty.");
78
+ const body = { model, messages };
79
+ if (args.max_tokens)
80
+ body.max_tokens = Number(args.max_tokens);
81
+ if (args.temperature !== undefined)
82
+ body.temperature = Number(args.temperature);
83
+ if (args.top_p !== undefined)
84
+ body.top_p = Number(args.top_p);
85
+ if (args.n !== undefined)
86
+ body.n = Number(args.n);
87
+ if (args.stop)
88
+ body.stop = args.stop;
89
+ if (args.response_format)
90
+ body.response_format = args.response_format;
91
+ if (args.seed !== undefined)
92
+ body.seed = Number(args.seed);
93
+ const result = await openaiPost(apiKey, "/chat/completions", body, orgId);
94
+ return {
95
+ id: result.id,
96
+ model: result.model,
97
+ created: new Date(result.created * 1000).toISOString(),
98
+ message: result.choices[0]?.message.content ?? null,
99
+ finish_reason: result.choices[0]?.finish_reason ?? null,
100
+ choices: result.choices.map((c) => ({
101
+ content: c.message.content,
102
+ finish_reason: c.finish_reason,
103
+ })),
104
+ usage: result.usage,
105
+ };
106
+ }
107
+ export async function openaiCreateEmbedding(args) {
108
+ const apiKey = requireKey(args);
109
+ const model = String(args.model ?? "text-embedding-3-small");
110
+ const orgId = args.org_id ? String(args.org_id) : undefined;
111
+ let input;
112
+ if (typeof args.input === "string") {
113
+ input = args.input;
114
+ }
115
+ else if (Array.isArray(args.input)) {
116
+ input = args.input;
117
+ }
118
+ else {
119
+ throw new Error("input is required (a string or array of strings to embed).");
120
+ }
121
+ const body = { model, input };
122
+ if (args.dimensions)
123
+ body.dimensions = Number(args.dimensions);
124
+ const result = await openaiPost(apiKey, "/embeddings", body, orgId);
125
+ return {
126
+ model: result.model,
127
+ embeddings: result.data.map((d) => ({
128
+ index: d.index,
129
+ dimensions: d.embedding.length,
130
+ embedding: d.embedding,
131
+ })),
132
+ usage: result.usage,
133
+ };
134
+ }
135
+ export async function openaiGenerateImage(args) {
136
+ const apiKey = requireKey(args);
137
+ const prompt = String(args.prompt ?? "").trim();
138
+ if (!prompt)
139
+ throw new Error("prompt is required.");
140
+ const model = String(args.model ?? "dall-e-3");
141
+ const n = Math.min(10, Math.max(1, Number(args.n ?? 1)));
142
+ const size = String(args.size ?? "1024x1024");
143
+ const quality = String(args.quality ?? "standard");
144
+ const style = args.style ? String(args.style) : undefined;
145
+ const responseFormat = String(args.response_format ?? "url");
146
+ const body = { model, prompt, n, size, quality, response_format: responseFormat };
147
+ if (style)
148
+ body.style = style;
149
+ const result = await openaiPost(apiKey, "/images/generations", body);
150
+ return {
151
+ count: result.data.length,
152
+ images: result.data.map((img) => ({
153
+ url: img.url ?? null,
154
+ b64_json: img.b64_json ?? null,
155
+ revised_prompt: img.revised_prompt ?? null,
156
+ })),
157
+ };
158
+ }
159
+ export async function openaiCreateTranscription(args) {
160
+ const apiKey = requireKey(args);
161
+ const audioUrl = String(args.audio_url ?? "").trim();
162
+ if (!audioUrl)
163
+ throw new Error("audio_url is required (URL of the audio file to transcribe).");
164
+ const model = String(args.model ?? "whisper-1");
165
+ const language = args.language ? String(args.language) : undefined;
166
+ const responseFormat = String(args.response_format ?? "json");
167
+ // Fetch the audio file
168
+ const audioRes = await fetch(audioUrl);
169
+ if (!audioRes.ok)
170
+ throw new Error(`Failed to fetch audio_url: HTTP ${audioRes.status}`);
171
+ const audioBlob = await audioRes.blob();
172
+ const filename = args.filename ? String(args.filename) : "audio.mp3";
173
+ const form = new FormData();
174
+ form.append("file", audioBlob, filename);
175
+ form.append("model", model);
176
+ form.append("response_format", responseFormat);
177
+ if (language)
178
+ form.append("language", language);
179
+ if (args.prompt)
180
+ form.append("prompt", String(args.prompt));
181
+ if (args.temperature !== undefined)
182
+ form.append("temperature", String(args.temperature));
183
+ const res = await fetch(`${OPENAI_API_BASE}/audio/transcriptions`, {
184
+ method: "POST",
185
+ headers: { Authorization: `Bearer ${apiKey}` },
186
+ body: form,
187
+ });
188
+ if (!res.ok) {
189
+ let msg = `HTTP ${res.status}`;
190
+ try {
191
+ const data = await res.json();
192
+ const err = data.error;
193
+ msg = err?.message ?? msg;
194
+ }
195
+ catch { /* ignore */ }
196
+ throw new Error(`OpenAI transcription error: ${msg}`);
197
+ }
198
+ if (responseFormat === "json" || responseFormat === "verbose_json") {
199
+ const data = await res.json();
200
+ return {
201
+ text: data.text,
202
+ language: data.language ?? null,
203
+ duration: data.duration ?? null,
204
+ model,
205
+ };
206
+ }
207
+ else {
208
+ const text = await res.text();
209
+ return { text, model };
210
+ }
211
+ }
212
+ export async function openaiListModels(args) {
213
+ const apiKey = requireKey(args);
214
+ const data = await openaiGet(apiKey, "/models");
215
+ const models = data.data ?? [];
216
+ // Sort by creation date descending
217
+ models.sort((a, b) => b.created - a.created);
218
+ return {
219
+ count: models.length,
220
+ models: models.map((m) => ({
221
+ id: m.id,
222
+ created: new Date(m.created * 1000).toISOString(),
223
+ owned_by: m.owned_by,
224
+ })),
225
+ };
226
+ }
227
+ //# sourceMappingURL=openai-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-tool.js","sourceRoot":"","sources":["../src/openai-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function paypalOrders(args: Record<string, unknown>): Promise<unknown>;
2
+ export declare function paypalInvoices(args: Record<string, unknown>): Promise<unknown>;
3
+ //# sourceMappingURL=paypal-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paypal-tool.d.ts","sourceRoot":"","sources":["../src/paypal-tool.ts"],"names":[],"mappings":"AAoHA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBlF;AAID,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BpF"}
@@ -0,0 +1,157 @@
1
+ // ─── PayPal REST API Tool ────────────────────────────────────────────────────
2
+ // Covers orders, payments, and invoices.
3
+ // Auth: OAuth 2.0 client credentials (client_id + client_secret).
4
+ // Access token is fetched automatically per request.
5
+ // Base URLs:
6
+ // Live: https://api-m.paypal.com
7
+ // Sandbox: https://api-m.sandbox.paypal.com
8
+ // No external dependencies - native fetch only.
9
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
10
+ function requireConfig(args) {
11
+ const client_id = String(args.client_id ?? "").trim();
12
+ const client_secret = String(args.client_secret ?? "").trim();
13
+ if (!client_id)
14
+ return { error: "client_id is required (PayPal application Client ID)." };
15
+ if (!client_secret)
16
+ return { error: "client_secret is required (PayPal application Client Secret)." };
17
+ return {
18
+ client_id,
19
+ client_secret,
20
+ sandbox: args.sandbox === true || String(args.sandbox) === "true",
21
+ };
22
+ }
23
+ function baseUrl(cfg) {
24
+ return cfg.sandbox ? "https://api-m.sandbox.paypal.com" : "https://api-m.paypal.com";
25
+ }
26
+ async function getPayPalToken(cfg) {
27
+ const credentials = Buffer.from(`${cfg.client_id}:${cfg.client_secret}`).toString("base64");
28
+ let response;
29
+ try {
30
+ response = await fetch(`${baseUrl(cfg)}/v1/oauth2/token`, {
31
+ method: "POST",
32
+ headers: {
33
+ Authorization: `Basic ${credentials}`,
34
+ "Content-Type": "application/x-www-form-urlencoded",
35
+ "Accept": "application/json",
36
+ },
37
+ body: "grant_type=client_credentials",
38
+ });
39
+ }
40
+ catch (err) {
41
+ return { error: `Network error fetching PayPal token: ${err instanceof Error ? err.message : String(err)}` };
42
+ }
43
+ let data;
44
+ try {
45
+ data = await response.json();
46
+ }
47
+ catch {
48
+ return { error: "Non-JSON response from PayPal token endpoint." };
49
+ }
50
+ if (!response.ok) {
51
+ const d = data;
52
+ return { error: `PayPal auth failed (${response.status}): ${d["error_description"] ?? d["message"] ?? "unknown"}` };
53
+ }
54
+ return String(data["access_token"] ?? "");
55
+ }
56
+ async function paypalFetch(cfg, method, path, body, query) {
57
+ const tokenResult = await getPayPalToken(cfg);
58
+ if (typeof tokenResult === "object" && "error" in tokenResult)
59
+ return tokenResult;
60
+ const url = new URL(`${baseUrl(cfg)}${path}`);
61
+ if (query) {
62
+ for (const [k, v] of Object.entries(query)) {
63
+ if (v !== undefined)
64
+ url.searchParams.set(k, String(v));
65
+ }
66
+ }
67
+ let response;
68
+ try {
69
+ response = await fetch(url.toString(), {
70
+ method,
71
+ headers: {
72
+ Authorization: `Bearer ${tokenResult}`,
73
+ "Content-Type": "application/json",
74
+ "Accept": "application/json",
75
+ },
76
+ body: body !== undefined ? JSON.stringify(body) : undefined,
77
+ });
78
+ }
79
+ catch (err) {
80
+ return { error: `Network error: ${err instanceof Error ? err.message : String(err)}` };
81
+ }
82
+ if (response.status === 429) {
83
+ return { error: "PayPal rate limit reached. Wait before retrying.", status: 429 };
84
+ }
85
+ if (response.status === 204) {
86
+ return { success: true };
87
+ }
88
+ let data;
89
+ try {
90
+ data = await response.json();
91
+ }
92
+ catch {
93
+ return { error: `Non-JSON response (HTTP ${response.status})`, status: response.status };
94
+ }
95
+ if (!response.ok) {
96
+ const d = data;
97
+ return { error: d["message"] ?? d["error_description"] ?? "PayPal API error", status: response.status, detail: d };
98
+ }
99
+ return data;
100
+ }
101
+ // ─── paypal_orders ────────────────────────────────────────────────────────────
102
+ export async function paypalOrders(args) {
103
+ const cfg = requireConfig(args);
104
+ if ("error" in cfg)
105
+ return cfg;
106
+ const action = String(args.action ?? "get");
107
+ switch (action) {
108
+ case "create": {
109
+ const intent = String(args.intent ?? "CAPTURE");
110
+ const purchase_units = args.purchase_units;
111
+ if (!purchase_units || !Array.isArray(purchase_units)) {
112
+ return { error: "purchase_units (array) is required for action='create'." };
113
+ }
114
+ return paypalFetch(cfg, "POST", "/v2/checkout/orders", { intent, purchase_units });
115
+ }
116
+ case "get": {
117
+ const order_id = String(args.order_id ?? "").trim();
118
+ if (!order_id)
119
+ return { error: "order_id is required for action='get'." };
120
+ return paypalFetch(cfg, "GET", `/v2/checkout/orders/${encodeURIComponent(order_id)}`);
121
+ }
122
+ default:
123
+ return { error: `Unknown action "${action}". Valid: create, get.` };
124
+ }
125
+ }
126
+ // ─── paypal_invoices ──────────────────────────────────────────────────────────
127
+ export async function paypalInvoices(args) {
128
+ const cfg = requireConfig(args);
129
+ if ("error" in cfg)
130
+ return cfg;
131
+ const action = String(args.action ?? "list");
132
+ switch (action) {
133
+ case "list": {
134
+ return paypalFetch(cfg, "GET", "/v2/invoicing/invoices", undefined, {
135
+ page: args.page ? Number(args.page) : 1,
136
+ page_size: args.page_size ? Number(args.page_size) : 20,
137
+ });
138
+ }
139
+ case "create": {
140
+ if (!args.invoice || typeof args.invoice !== "object") {
141
+ return { error: "invoice object is required for action='create'." };
142
+ }
143
+ return paypalFetch(cfg, "POST", "/v2/invoicing/invoices", args.invoice);
144
+ }
145
+ case "send": {
146
+ const invoice_id = String(args.invoice_id ?? "").trim();
147
+ if (!invoice_id)
148
+ return { error: "invoice_id is required for action='send'." };
149
+ return paypalFetch(cfg, "POST", `/v2/invoicing/invoices/${encodeURIComponent(invoice_id)}/send`, {
150
+ send_to_invoicer: args.send_to_invoicer !== false,
151
+ });
152
+ }
153
+ default:
154
+ return { error: `Unknown action "${action}". Valid: list, create, send.` };
155
+ }
156
+ }
157
+ //# sourceMappingURL=paypal-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paypal-tool.js","sourceRoot":"","sources":["../src/paypal-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function listPinterestBoards(args: Record<string, unknown>): Promise<unknown>;
2
+ export declare function getPinterestBoard(args: Record<string, unknown>): Promise<unknown>;
3
+ export declare function listPinterestPins(args: Record<string, unknown>): Promise<unknown>;
4
+ export declare function createPinterestPin(args: Record<string, unknown>): Promise<unknown>;
5
+ export declare function searchPinterestPins(args: Record<string, unknown>): Promise<unknown>;
6
+ export declare function getPinterestUser(args: Record<string, unknown>): Promise<unknown>;
7
+ //# sourceMappingURL=pinterest-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pinterest-tool.d.ts","sourceRoot":"","sources":["../src/pinterest-tool.ts"],"names":[],"mappings":"AAiEA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA2BzF;AAGD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CASvF;AAGD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA4BvF;AAGD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBxF;AAGD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BzF;AAGD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBtF"}
@@ -0,0 +1,219 @@
1
+ // Pinterest visual discovery API.
2
+ // Docs: https://developers.pinterest.com/docs/api/v5/
3
+ // Auth: PINTEREST_ACCESS_TOKEN (Bearer)
4
+ // Base: https://api.pinterest.com/v5
5
+ const PINTEREST_BASE = "https://api.pinterest.com/v5";
6
+ function getToken(args) {
7
+ const token = String(args.access_token ?? process.env.PINTEREST_ACCESS_TOKEN ?? "").trim();
8
+ if (!token)
9
+ throw new Error("access_token is required (or set PINTEREST_ACCESS_TOKEN env var).");
10
+ return token;
11
+ }
12
+ async function pinterestGet(token, path, params) {
13
+ const url = new URL(`${PINTEREST_BASE}${path}`);
14
+ if (params) {
15
+ for (const [k, v] of Object.entries(params)) {
16
+ if (v !== undefined && v !== "")
17
+ url.searchParams.set(k, v);
18
+ }
19
+ }
20
+ const res = await fetch(url.toString(), {
21
+ headers: {
22
+ Authorization: `Bearer ${token}`,
23
+ "Content-Type": "application/json",
24
+ },
25
+ });
26
+ if (res.status === 401)
27
+ throw new Error("Invalid Pinterest access token.");
28
+ if (res.status === 403)
29
+ throw new Error("Pinterest: access forbidden. Ensure your token has the required scopes.");
30
+ if (res.status === 404)
31
+ throw new Error(`Pinterest: resource not found at ${path}.`);
32
+ if (res.status === 429)
33
+ throw new Error("Pinterest rate limit exceeded.");
34
+ if (!res.ok) {
35
+ const body = await res.text().catch(() => "");
36
+ throw new Error(`Pinterest HTTP ${res.status}: ${body || res.statusText}`);
37
+ }
38
+ return res.json();
39
+ }
40
+ async function pinterestPost(token, path, body) {
41
+ const res = await fetch(`${PINTEREST_BASE}${path}`, {
42
+ method: "POST",
43
+ headers: {
44
+ Authorization: `Bearer ${token}`,
45
+ "Content-Type": "application/json",
46
+ },
47
+ body: JSON.stringify(body),
48
+ });
49
+ if (res.status === 401)
50
+ throw new Error("Invalid Pinterest access token.");
51
+ if (res.status === 403)
52
+ throw new Error("Pinterest: access forbidden.");
53
+ if (res.status === 429)
54
+ throw new Error("Pinterest rate limit exceeded.");
55
+ if (!res.ok) {
56
+ const b = await res.text().catch(() => "");
57
+ throw new Error(`Pinterest HTTP ${res.status}: ${b || res.statusText}`);
58
+ }
59
+ return res.json();
60
+ }
61
+ // list_pinterest_boards
62
+ export async function listPinterestBoards(args) {
63
+ try {
64
+ const token = getToken(args);
65
+ const params = {};
66
+ if (args.page_size)
67
+ params.page_size = String(args.page_size);
68
+ if (args.bookmark)
69
+ params.bookmark = String(args.bookmark);
70
+ if (args.privacy)
71
+ params.privacy = String(args.privacy);
72
+ const json = await pinterestGet(token, "/boards", params);
73
+ const items = (json.items ?? []);
74
+ return {
75
+ count: items.length,
76
+ bookmark: json.bookmark,
77
+ boards: items.map((b) => ({
78
+ id: b.id,
79
+ name: b.name,
80
+ description: b.description,
81
+ privacy: b.privacy,
82
+ pin_count: b.pin_count,
83
+ follower_count: b.follower_count,
84
+ created_at: b.created_at,
85
+ media: b.media,
86
+ })),
87
+ };
88
+ }
89
+ catch (err) {
90
+ return { error: err instanceof Error ? err.message : String(err) };
91
+ }
92
+ }
93
+ // get_pinterest_board
94
+ export async function getPinterestBoard(args) {
95
+ try {
96
+ const token = getToken(args);
97
+ const boardId = String(args.board_id ?? "").trim();
98
+ if (!boardId)
99
+ return { error: "board_id is required." };
100
+ return pinterestGet(token, `/boards/${boardId}`);
101
+ }
102
+ catch (err) {
103
+ return { error: err instanceof Error ? err.message : String(err) };
104
+ }
105
+ }
106
+ // list_pinterest_pins
107
+ export async function listPinterestPins(args) {
108
+ try {
109
+ const token = getToken(args);
110
+ const boardId = String(args.board_id ?? "").trim();
111
+ if (!boardId)
112
+ return { error: "board_id is required." };
113
+ const params = {};
114
+ if (args.page_size)
115
+ params.page_size = String(args.page_size);
116
+ if (args.bookmark)
117
+ params.bookmark = String(args.bookmark);
118
+ if (args.creative_types)
119
+ params.creative_types = String(args.creative_types);
120
+ const json = await pinterestGet(token, `/boards/${boardId}/pins`, params);
121
+ const items = (json.items ?? []);
122
+ return {
123
+ count: items.length,
124
+ bookmark: json.bookmark,
125
+ pins: items.map((p) => ({
126
+ id: p.id,
127
+ title: p.title,
128
+ description: p.description,
129
+ link: p.link,
130
+ media: p.media,
131
+ board_id: p.board_id,
132
+ created_at: p.created_at,
133
+ })),
134
+ };
135
+ }
136
+ catch (err) {
137
+ return { error: err instanceof Error ? err.message : String(err) };
138
+ }
139
+ }
140
+ // create_pinterest_pin
141
+ export async function createPinterestPin(args) {
142
+ try {
143
+ const token = getToken(args);
144
+ const boardId = String(args.board_id ?? "").trim();
145
+ if (!boardId)
146
+ return { error: "board_id is required." };
147
+ const mediaSourceUrl = String(args.media_source_url ?? "").trim();
148
+ if (!mediaSourceUrl)
149
+ return { error: "media_source_url is required." };
150
+ const body = {
151
+ board_id: boardId,
152
+ media_source: { source_type: "image_url", url: mediaSourceUrl },
153
+ };
154
+ if (args.title)
155
+ body.title = String(args.title);
156
+ if (args.description)
157
+ body.description = String(args.description);
158
+ if (args.link)
159
+ body.link = String(args.link);
160
+ if (args.board_section_id)
161
+ body.board_section_id = String(args.board_section_id);
162
+ return pinterestPost(token, "/pins", body);
163
+ }
164
+ catch (err) {
165
+ return { error: err instanceof Error ? err.message : String(err) };
166
+ }
167
+ }
168
+ // search_pinterest_pins
169
+ export async function searchPinterestPins(args) {
170
+ try {
171
+ const token = getToken(args);
172
+ const query = String(args.query ?? "").trim();
173
+ if (!query)
174
+ return { error: "query is required." };
175
+ const params = { query };
176
+ if (args.page_size)
177
+ params.page_size = String(args.page_size);
178
+ if (args.bookmark)
179
+ params.bookmark = String(args.bookmark);
180
+ const json = await pinterestGet(token, "/pins/search", params);
181
+ const items = (json.items ?? []);
182
+ return {
183
+ count: items.length,
184
+ bookmark: json.bookmark,
185
+ pins: items.map((p) => ({
186
+ id: p.id,
187
+ title: p.title,
188
+ description: p.description,
189
+ link: p.link,
190
+ media: p.media,
191
+ board_id: p.board_id,
192
+ })),
193
+ };
194
+ }
195
+ catch (err) {
196
+ return { error: err instanceof Error ? err.message : String(err) };
197
+ }
198
+ }
199
+ // get_pinterest_user
200
+ export async function getPinterestUser(args) {
201
+ try {
202
+ const token = getToken(args);
203
+ const json = await pinterestGet(token, "/user_account");
204
+ return {
205
+ username: json.username,
206
+ account_type: json.account_type,
207
+ profile_image: json.profile_image,
208
+ website_url: json.website_url,
209
+ pin_count: json.pin_count,
210
+ follower_count: json.follower_count,
211
+ following_count: json.following_count,
212
+ board_count: json.board_count,
213
+ };
214
+ }
215
+ catch (err) {
216
+ return { error: err instanceof Error ? err.message : String(err) };
217
+ }
218
+ }
219
+ //# sourceMappingURL=pinterest-tool.js.map