@unclick/mcp-server 0.2.4 → 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.
- package/dist/algolia-tool.d.ts +5 -0
- package/dist/algolia-tool.d.ts.map +1 -0
- package/dist/algolia-tool.js +121 -0
- package/dist/algolia-tool.js.map +1 -0
- package/dist/assemblyai-tool.d.ts +7 -0
- package/dist/assemblyai-tool.d.ts.map +1 -0
- package/dist/assemblyai-tool.js +127 -0
- package/dist/assemblyai-tool.js.map +1 -0
- package/dist/circleci-tool.d.ts +7 -0
- package/dist/circleci-tool.d.ts.map +1 -0
- package/dist/circleci-tool.js +133 -0
- package/dist/circleci-tool.js.map +1 -0
- package/dist/cohere-tool.d.ts +7 -0
- package/dist/cohere-tool.d.ts.map +1 -0
- package/dist/cohere-tool.js +225 -0
- package/dist/cohere-tool.js.map +1 -0
- package/dist/convertkit-tool.d.ts +7 -0
- package/dist/convertkit-tool.d.ts.map +1 -0
- package/dist/convertkit-tool.js +213 -0
- package/dist/convertkit-tool.js.map +1 -0
- package/dist/datadog-tool.d.ts +7 -0
- package/dist/datadog-tool.d.ts.map +1 -0
- package/dist/datadog-tool.js +121 -0
- package/dist/datadog-tool.js.map +1 -0
- package/dist/deepl-tool.d.ts +5 -0
- package/dist/deepl-tool.d.ts.map +1 -0
- package/dist/deepl-tool.js +137 -0
- package/dist/deepl-tool.js.map +1 -0
- package/dist/flyio-tool.d.ts +6 -0
- package/dist/flyio-tool.d.ts.map +1 -0
- package/dist/flyio-tool.js +158 -0
- package/dist/flyio-tool.js.map +1 -0
- package/dist/groq-tool.d.ts +3 -0
- package/dist/groq-tool.d.ts.map +1 -0
- package/dist/groq-tool.js +109 -0
- package/dist/groq-tool.js.map +1 -0
- package/dist/gumroad-tool.d.ts +6 -0
- package/dist/gumroad-tool.d.ts.map +1 -0
- package/dist/gumroad-tool.js +90 -0
- package/dist/gumroad-tool.js.map +1 -0
- package/dist/heygen-tool.d.ts +5 -0
- package/dist/heygen-tool.d.ts.map +1 -0
- package/dist/heygen-tool.js +134 -0
- package/dist/heygen-tool.js.map +1 -0
- package/dist/higgsfield-tool.d.ts +5 -0
- package/dist/higgsfield-tool.d.ts.map +1 -0
- package/dist/higgsfield-tool.js +120 -0
- package/dist/higgsfield-tool.js.map +1 -0
- package/dist/keychain-crypto.d.ts +24 -0
- package/dist/keychain-crypto.d.ts.map +1 -0
- package/dist/keychain-crypto.js +60 -0
- package/dist/keychain-crypto.js.map +1 -0
- package/dist/keychain-secure-input.d.ts +17 -0
- package/dist/keychain-secure-input.d.ts.map +1 -0
- package/dist/keychain-secure-input.js +229 -0
- package/dist/keychain-secure-input.js.map +1 -0
- package/dist/keychain-tool.d.ts +3 -0
- package/dist/keychain-tool.d.ts.map +1 -0
- package/dist/keychain-tool.js +516 -0
- package/dist/keychain-tool.js.map +1 -0
- package/dist/kling-tool.d.ts +3 -0
- package/dist/kling-tool.d.ts.map +1 -0
- package/dist/kling-tool.js +102 -0
- package/dist/kling-tool.js.map +1 -0
- package/dist/lemonsqueezy-tool.d.ts +7 -0
- package/dist/lemonsqueezy-tool.d.ts.map +1 -0
- package/dist/lemonsqueezy-tool.js +220 -0
- package/dist/lemonsqueezy-tool.js.map +1 -0
- package/dist/local-catalog-handlers.d.ts +3 -0
- package/dist/local-catalog-handlers.d.ts.map +1 -0
- package/dist/local-catalog-handlers.js +1254 -0
- package/dist/local-catalog-handlers.js.map +1 -0
- package/dist/mailchimp-tool.d.ts +8 -0
- package/dist/mailchimp-tool.d.ts.map +1 -0
- package/dist/mailchimp-tool.js +138 -0
- package/dist/mailchimp-tool.js.map +1 -0
- package/dist/mapbox-tool.d.ts +6 -0
- package/dist/mapbox-tool.d.ts.map +1 -0
- package/dist/mapbox-tool.js +106 -0
- package/dist/mapbox-tool.js.map +1 -0
- package/dist/mistral-tool.d.ts +4 -0
- package/dist/mistral-tool.d.ts.map +1 -0
- package/dist/mistral-tool.js +145 -0
- package/dist/mistral-tool.js.map +1 -0
- package/dist/mixpanel-tool.d.ts +6 -0
- package/dist/mixpanel-tool.d.ts.map +1 -0
- package/dist/mixpanel-tool.js +162 -0
- package/dist/mixpanel-tool.js.map +1 -0
- package/dist/neon-tool.d.ts +7 -0
- package/dist/neon-tool.d.ts.map +1 -0
- package/dist/neon-tool.js +156 -0
- package/dist/neon-tool.js.map +1 -0
- package/dist/pagerduty-tool.d.ts +8 -0
- package/dist/pagerduty-tool.d.ts.map +1 -0
- package/dist/pagerduty-tool.js +185 -0
- package/dist/pagerduty-tool.js.map +1 -0
- package/dist/perplexity-tool.d.ts +2 -0
- package/dist/perplexity-tool.d.ts.map +1 -0
- package/dist/perplexity-tool.js +93 -0
- package/dist/perplexity-tool.js.map +1 -0
- package/dist/pika-tool.d.ts +4 -0
- package/dist/pika-tool.d.ts.map +1 -0
- package/dist/pika-tool.js +102 -0
- package/dist/pika-tool.js.map +1 -0
- package/dist/pinecone-tool.d.ts +6 -0
- package/dist/pinecone-tool.d.ts.map +1 -0
- package/dist/pinecone-tool.js +148 -0
- package/dist/pinecone-tool.js.map +1 -0
- package/dist/postmark-tool.d.ts +7 -0
- package/dist/postmark-tool.d.ts.map +1 -0
- package/dist/postmark-tool.js +148 -0
- package/dist/postmark-tool.js.map +1 -0
- package/dist/qc-tool.d.ts +4 -0
- package/dist/qc-tool.d.ts.map +1 -0
- package/dist/qc-tool.js +415 -0
- package/dist/qc-tool.js.map +1 -0
- package/dist/render-tool.d.ts +7 -0
- package/dist/render-tool.d.ts.map +1 -0
- package/dist/render-tool.js +158 -0
- package/dist/render-tool.js.map +1 -0
- package/dist/runway-tool.d.ts +4 -0
- package/dist/runway-tool.d.ts.map +1 -0
- package/dist/runway-tool.js +110 -0
- package/dist/runway-tool.js.map +1 -0
- package/dist/segment-tool.d.ts +6 -0
- package/dist/segment-tool.d.ts.map +1 -0
- package/dist/segment-tool.js +129 -0
- package/dist/segment-tool.js.map +1 -0
- package/dist/sendgrid-tool.d.ts +7 -0
- package/dist/sendgrid-tool.d.ts.map +1 -0
- package/dist/sendgrid-tool.js +124 -0
- package/dist/sendgrid-tool.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +10 -0
- package/dist/server.js.map +1 -1
- package/dist/togetherai-tool.d.ts +5 -0
- package/dist/togetherai-tool.d.ts.map +1 -0
- package/dist/togetherai-tool.js +129 -0
- package/dist/togetherai-tool.js.map +1 -0
- package/dist/tool-wiring.d.ts +4608 -692
- package/dist/tool-wiring.d.ts.map +1 -1
- package/dist/tool-wiring.js +2946 -463
- package/dist/tool-wiring.js.map +1 -1
- package/dist/turso-tool.d.ts +6 -0
- package/dist/turso-tool.d.ts.map +1 -0
- package/dist/turso-tool.js +158 -0
- package/dist/turso-tool.js.map +1 -0
- package/dist/upstash-tool.d.ts +8 -0
- package/dist/upstash-tool.d.ts.map +1 -0
- package/dist/upstash-tool.js +191 -0
- package/dist/upstash-tool.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// DeepL Translation API integration for the UnClick MCP server.
|
|
2
|
+
// Uses the DeepL REST API via fetch - no external dependencies.
|
|
3
|
+
// Users must supply an auth key from deepl.com. Free keys end with :fx.
|
|
4
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
5
|
+
function requireKey(args) {
|
|
6
|
+
const key = String(args.auth_key ?? "").trim();
|
|
7
|
+
if (!key)
|
|
8
|
+
throw new Error("auth_key is required. Get one at deepl.com/pro-api. Free keys end with :fx.");
|
|
9
|
+
// Free tier uses api-free.deepl.com, paid uses api.deepl.com
|
|
10
|
+
const base = key.endsWith(":fx") ? "https://api-free.deepl.com/v2" : "https://api.deepl.com/v2";
|
|
11
|
+
return { key, base };
|
|
12
|
+
}
|
|
13
|
+
async function dlPost(key, base, path, body) {
|
|
14
|
+
const form = new URLSearchParams();
|
|
15
|
+
Object.entries(body).forEach(([k, v]) => {
|
|
16
|
+
if (Array.isArray(v))
|
|
17
|
+
v.forEach((item) => form.append(k, item));
|
|
18
|
+
else
|
|
19
|
+
form.set(k, v);
|
|
20
|
+
});
|
|
21
|
+
const res = await fetch(`${base}${path}`, {
|
|
22
|
+
method: "POST",
|
|
23
|
+
headers: {
|
|
24
|
+
"DeepL-Auth-Key": key,
|
|
25
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
26
|
+
},
|
|
27
|
+
body: form.toString(),
|
|
28
|
+
});
|
|
29
|
+
const data = await res.json();
|
|
30
|
+
if (!res.ok) {
|
|
31
|
+
const msg = data.message ?? `HTTP ${res.status}`;
|
|
32
|
+
throw new Error(`DeepL error (${res.status}): ${msg}`);
|
|
33
|
+
}
|
|
34
|
+
return data;
|
|
35
|
+
}
|
|
36
|
+
async function dlGet(key, base, path) {
|
|
37
|
+
const res = await fetch(`${base}${path}`, {
|
|
38
|
+
headers: { "DeepL-Auth-Key": key },
|
|
39
|
+
});
|
|
40
|
+
const data = await res.json();
|
|
41
|
+
if (!res.ok) {
|
|
42
|
+
const msg = data.message ?? `HTTP ${res.status}`;
|
|
43
|
+
throw new Error(`DeepL error (${res.status}): ${msg}`);
|
|
44
|
+
}
|
|
45
|
+
return data;
|
|
46
|
+
}
|
|
47
|
+
// ─── Operations ───────────────────────────────────────────────────────────────
|
|
48
|
+
export async function deeplTranslateText(args) {
|
|
49
|
+
const { key, base } = requireKey(args);
|
|
50
|
+
const targetLang = String(args.target_lang ?? "").trim().toUpperCase();
|
|
51
|
+
if (!targetLang)
|
|
52
|
+
throw new Error("target_lang is required (e.g. EN-US, DE, FR, JA).");
|
|
53
|
+
let texts;
|
|
54
|
+
if (Array.isArray(args.text)) {
|
|
55
|
+
texts = args.text.map(String);
|
|
56
|
+
}
|
|
57
|
+
else if (typeof args.text === "string" && args.text.trim()) {
|
|
58
|
+
texts = [args.text.trim()];
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
throw new Error("text is required (a string or array of strings to translate).");
|
|
62
|
+
}
|
|
63
|
+
if (texts.length > 50)
|
|
64
|
+
throw new Error("Maximum 50 texts per call.");
|
|
65
|
+
const body = {
|
|
66
|
+
text: texts,
|
|
67
|
+
target_lang: targetLang,
|
|
68
|
+
};
|
|
69
|
+
if (args.source_lang)
|
|
70
|
+
body.source_lang = String(args.source_lang).toUpperCase();
|
|
71
|
+
if (args.formality)
|
|
72
|
+
body.formality = String(args.formality);
|
|
73
|
+
if (args.preserve_formatting !== undefined)
|
|
74
|
+
body.preserve_formatting = args.preserve_formatting ? "1" : "0";
|
|
75
|
+
if (args.tag_handling)
|
|
76
|
+
body.tag_handling = String(args.tag_handling);
|
|
77
|
+
const data = await dlPost(key, base, "/translate", body);
|
|
78
|
+
return {
|
|
79
|
+
target_lang: targetLang,
|
|
80
|
+
translations: data.translations.map((t) => ({
|
|
81
|
+
detected_source_language: t.detected_source_language,
|
|
82
|
+
text: t.text,
|
|
83
|
+
})),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export async function deeplGetUsage(args) {
|
|
87
|
+
const { key, base } = requireKey(args);
|
|
88
|
+
return dlGet(key, base, "/usage");
|
|
89
|
+
}
|
|
90
|
+
export async function deeplListLanguages(args) {
|
|
91
|
+
const { key, base } = requireKey(args);
|
|
92
|
+
const type = String(args.type ?? "target");
|
|
93
|
+
const res = await fetch(`${base}/languages?type=${encodeURIComponent(type)}`, {
|
|
94
|
+
headers: { "DeepL-Auth-Key": key },
|
|
95
|
+
});
|
|
96
|
+
const data = await res.json();
|
|
97
|
+
if (!res.ok)
|
|
98
|
+
throw new Error(`DeepL error (${res.status})`);
|
|
99
|
+
return { type, count: data.length, languages: data };
|
|
100
|
+
}
|
|
101
|
+
export async function deeplTranslateDocument(args) {
|
|
102
|
+
const { key, base } = requireKey(args);
|
|
103
|
+
const documentUrl = String(args.document_url ?? "").trim();
|
|
104
|
+
const targetLang = String(args.target_lang ?? "").trim().toUpperCase();
|
|
105
|
+
if (!documentUrl)
|
|
106
|
+
throw new Error("document_url is required (publicly accessible URL of the document to translate).");
|
|
107
|
+
if (!targetLang)
|
|
108
|
+
throw new Error("target_lang is required.");
|
|
109
|
+
// Fetch the document
|
|
110
|
+
const docRes = await fetch(documentUrl);
|
|
111
|
+
if (!docRes.ok)
|
|
112
|
+
throw new Error(`Failed to fetch document_url: HTTP ${docRes.status}`);
|
|
113
|
+
const docBlob = await docRes.blob();
|
|
114
|
+
const filename = args.filename ? String(args.filename) : documentUrl.split("/").pop() ?? "document.pdf";
|
|
115
|
+
const form = new FormData();
|
|
116
|
+
form.append("file", docBlob, filename);
|
|
117
|
+
form.append("target_lang", targetLang);
|
|
118
|
+
if (args.source_lang)
|
|
119
|
+
form.append("source_lang", String(args.source_lang).toUpperCase());
|
|
120
|
+
if (args.formality)
|
|
121
|
+
form.append("formality", String(args.formality));
|
|
122
|
+
const uploadRes = await fetch(`${base}/document`, {
|
|
123
|
+
method: "POST",
|
|
124
|
+
headers: { "DeepL-Auth-Key": key },
|
|
125
|
+
body: form,
|
|
126
|
+
});
|
|
127
|
+
const uploadData = await uploadRes.json();
|
|
128
|
+
if (!uploadRes.ok)
|
|
129
|
+
throw new Error(`DeepL document upload error (${uploadRes.status}): ${uploadData.message ?? "unknown error"}`);
|
|
130
|
+
return {
|
|
131
|
+
document_id: uploadData.document_id,
|
|
132
|
+
document_key: uploadData.document_key,
|
|
133
|
+
target_lang: targetLang,
|
|
134
|
+
note: "Use the document_id and document_key to poll /document/{document_id} for status and download the result.",
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=deepl-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepl-tool.js","sourceRoot":"","sources":["../src/deepl-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function flyListApps(args: Record<string, unknown>): Promise<unknown>;
|
|
2
|
+
export declare function flyGetApp(args: Record<string, unknown>): Promise<unknown>;
|
|
3
|
+
export declare function flyListMachines(args: Record<string, unknown>): Promise<unknown>;
|
|
4
|
+
export declare function flyCreateMachine(args: Record<string, unknown>): Promise<unknown>;
|
|
5
|
+
export declare function flyListVolumes(args: Record<string, unknown>): Promise<unknown>;
|
|
6
|
+
//# sourceMappingURL=flyio-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flyio-tool.d.ts","sourceRoot":"","sources":["../src/flyio-tool.ts"],"names":[],"mappings":"AAqEA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAYjF;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAW/E;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAcrF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAiCtF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAWpF"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// Fly.io Machines API integration for the UnClick MCP server.
|
|
2
|
+
// Uses the Fly.io Machines REST API via fetch - no external dependencies.
|
|
3
|
+
// Users must supply an API token from fly.io (fly auth token).
|
|
4
|
+
const FLY_API_BASE = "https://api.machines.dev/v1";
|
|
5
|
+
// ── Fetch helper ──────────────────────────────────────────────────────────────
|
|
6
|
+
async function flyFetch(apiKey, method, path, body, query) {
|
|
7
|
+
const url = new URL(`${FLY_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 Fly.io 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: "Fly.io API token is invalid or expired. Check your api_key.", status: 401 };
|
|
44
|
+
if (response.status === 403)
|
|
45
|
+
return { error: "Fly.io API: insufficient permissions.", status: 403 };
|
|
46
|
+
if (response.status === 404)
|
|
47
|
+
return { error: "Resource not found. Check the app_name or machine ID.", status: 404 };
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
const errData = data;
|
|
50
|
+
const detail = errData?.error ?? errData?.message ?? text;
|
|
51
|
+
return { error: `Fly.io API error ${response.status}: ${detail}`, status: response.status };
|
|
52
|
+
}
|
|
53
|
+
return data;
|
|
54
|
+
}
|
|
55
|
+
// ── Operations ────────────────────────────────────────────────────────────────
|
|
56
|
+
export async function flyListApps(args) {
|
|
57
|
+
const apiKey = String(args.api_key ?? process.env.FLY_API_KEY ?? "").trim();
|
|
58
|
+
if (!apiKey)
|
|
59
|
+
return { error: "api_key is required. Get one by running 'fly auth token'." };
|
|
60
|
+
try {
|
|
61
|
+
const query = {};
|
|
62
|
+
if (args.org_slug)
|
|
63
|
+
query.org_slug = String(args.org_slug);
|
|
64
|
+
return flyFetch(apiKey, "GET", "/apps", undefined, query);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export async function flyGetApp(args) {
|
|
71
|
+
const apiKey = String(args.api_key ?? process.env.FLY_API_KEY ?? "").trim();
|
|
72
|
+
if (!apiKey)
|
|
73
|
+
return { error: "api_key is required. Get one by running 'fly auth token'." };
|
|
74
|
+
const appName = String(args.app_name ?? "").trim();
|
|
75
|
+
if (!appName)
|
|
76
|
+
return { error: "app_name is required." };
|
|
77
|
+
try {
|
|
78
|
+
return flyFetch(apiKey, "GET", `/apps/${encodeURIComponent(appName)}`);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export async function flyListMachines(args) {
|
|
85
|
+
const apiKey = String(args.api_key ?? process.env.FLY_API_KEY ?? "").trim();
|
|
86
|
+
if (!apiKey)
|
|
87
|
+
return { error: "api_key is required. Get one by running 'fly auth token'." };
|
|
88
|
+
const appName = String(args.app_name ?? "").trim();
|
|
89
|
+
if (!appName)
|
|
90
|
+
return { error: "app_name is required." };
|
|
91
|
+
try {
|
|
92
|
+
const query = {};
|
|
93
|
+
if (args.include_deleted !== undefined)
|
|
94
|
+
query.include_deleted = Boolean(args.include_deleted);
|
|
95
|
+
return flyFetch(apiKey, "GET", `/apps/${encodeURIComponent(appName)}/machines`, undefined, query);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export async function flyCreateMachine(args) {
|
|
102
|
+
const apiKey = String(args.api_key ?? process.env.FLY_API_KEY ?? "").trim();
|
|
103
|
+
if (!apiKey)
|
|
104
|
+
return { error: "api_key is required. Get one by running 'fly auth token'." };
|
|
105
|
+
const appName = String(args.app_name ?? "").trim();
|
|
106
|
+
if (!appName)
|
|
107
|
+
return { error: "app_name is required." };
|
|
108
|
+
const image = String(args.image ?? "").trim();
|
|
109
|
+
if (!image)
|
|
110
|
+
return { error: "image is required (Docker image reference, e.g. 'nginx:latest')." };
|
|
111
|
+
try {
|
|
112
|
+
// Parse optional env (accept JSON string or object)
|
|
113
|
+
let env;
|
|
114
|
+
if (args.env !== undefined) {
|
|
115
|
+
if (typeof args.env === "string") {
|
|
116
|
+
try {
|
|
117
|
+
env = JSON.parse(args.env);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return { error: "env must be a JSON object or a valid JSON string representing an object." };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else if (typeof args.env === "object" && !Array.isArray(args.env)) {
|
|
124
|
+
env = args.env;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
return { error: "env must be a JSON object mapping environment variable names to string values." };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const config = { image };
|
|
131
|
+
if (env)
|
|
132
|
+
config.env = env;
|
|
133
|
+
if (args.services)
|
|
134
|
+
config.services = Array.isArray(args.services) ? args.services : [];
|
|
135
|
+
const body = { config };
|
|
136
|
+
if (args.machine_name)
|
|
137
|
+
body.name = String(args.machine_name);
|
|
138
|
+
return flyFetch(apiKey, "POST", `/apps/${encodeURIComponent(appName)}/machines`, body);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export async function flyListVolumes(args) {
|
|
145
|
+
const apiKey = String(args.api_key ?? process.env.FLY_API_KEY ?? "").trim();
|
|
146
|
+
if (!apiKey)
|
|
147
|
+
return { error: "api_key is required. Get one by running 'fly auth token'." };
|
|
148
|
+
const appName = String(args.app_name ?? "").trim();
|
|
149
|
+
if (!appName)
|
|
150
|
+
return { error: "app_name is required." };
|
|
151
|
+
try {
|
|
152
|
+
return flyFetch(apiKey, "GET", `/apps/${encodeURIComponent(appName)}/volumes`);
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=flyio-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flyio-tool.js","sourceRoot":"","sources":["../src/flyio-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groq-tool.d.ts","sourceRoot":"","sources":["../src/groq-tool.ts"],"names":[],"mappings":"AAqFA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAyCxF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAcpF"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// Groq Fast Inference API integration for the UnClick MCP server.
|
|
2
|
+
// Uses the Groq REST API via fetch - no external dependencies.
|
|
3
|
+
// Compatible with OpenAI API format. Users must supply an API key from console.groq.com.
|
|
4
|
+
const GROQ_BASE = "https://api.groq.com/openai/v1";
|
|
5
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
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 console.groq.com/keys.");
|
|
10
|
+
return key;
|
|
11
|
+
}
|
|
12
|
+
async function groqPost(apiKey, path, body) {
|
|
13
|
+
const res = await fetch(`${GROQ_BASE}${path}`, {
|
|
14
|
+
method: "POST",
|
|
15
|
+
headers: {
|
|
16
|
+
Authorization: `Bearer ${apiKey}`,
|
|
17
|
+
"Content-Type": "application/json",
|
|
18
|
+
},
|
|
19
|
+
body: JSON.stringify(body),
|
|
20
|
+
});
|
|
21
|
+
const data = await res.json();
|
|
22
|
+
if (!res.ok) {
|
|
23
|
+
const err = data.error;
|
|
24
|
+
const msg = err?.message ?? `HTTP ${res.status}`;
|
|
25
|
+
throw new Error(`Groq error: ${msg}`);
|
|
26
|
+
}
|
|
27
|
+
return data;
|
|
28
|
+
}
|
|
29
|
+
async function groqGet(apiKey, path) {
|
|
30
|
+
const res = await fetch(`${GROQ_BASE}${path}`, {
|
|
31
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
32
|
+
});
|
|
33
|
+
const data = await res.json();
|
|
34
|
+
if (!res.ok) {
|
|
35
|
+
const err = data.error;
|
|
36
|
+
const msg = err?.message ?? `HTTP ${res.status}`;
|
|
37
|
+
throw new Error(`Groq error: ${msg}`);
|
|
38
|
+
}
|
|
39
|
+
return data;
|
|
40
|
+
}
|
|
41
|
+
// ─── Operations ───────────────────────────────────────────────────────────────
|
|
42
|
+
export async function groqChatCompletion(args) {
|
|
43
|
+
const apiKey = requireKey(args);
|
|
44
|
+
const model = String(args.model ?? "llama-3.3-70b-versatile");
|
|
45
|
+
let messages;
|
|
46
|
+
if (Array.isArray(args.messages)) {
|
|
47
|
+
messages = args.messages;
|
|
48
|
+
}
|
|
49
|
+
else if (typeof args.messages === "string") {
|
|
50
|
+
try {
|
|
51
|
+
messages = JSON.parse(args.messages);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
throw new Error("messages must be a JSON array of {role, content} objects.");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else if (args.prompt) {
|
|
58
|
+
const systemPrompt = args.system_prompt ? String(args.system_prompt) : undefined;
|
|
59
|
+
messages = [];
|
|
60
|
+
if (systemPrompt)
|
|
61
|
+
messages.push({ role: "system", content: systemPrompt });
|
|
62
|
+
messages.push({ role: "user", content: String(args.prompt) });
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
throw new Error("Either messages (array) or prompt (string) is required.");
|
|
66
|
+
}
|
|
67
|
+
if (messages.length === 0)
|
|
68
|
+
throw new Error("messages array must not be empty.");
|
|
69
|
+
const body = { model, messages };
|
|
70
|
+
if (args.max_tokens)
|
|
71
|
+
body.max_tokens = Number(args.max_tokens);
|
|
72
|
+
if (args.temperature !== undefined)
|
|
73
|
+
body.temperature = Number(args.temperature);
|
|
74
|
+
if (args.top_p !== undefined)
|
|
75
|
+
body.top_p = Number(args.top_p);
|
|
76
|
+
if (args.stop)
|
|
77
|
+
body.stop = args.stop;
|
|
78
|
+
if (args.stream !== undefined)
|
|
79
|
+
body.stream = Boolean(args.stream);
|
|
80
|
+
const result = await groqPost(apiKey, "/chat/completions", body);
|
|
81
|
+
return {
|
|
82
|
+
id: result.id,
|
|
83
|
+
model: result.model,
|
|
84
|
+
created: new Date(result.created * 1000).toISOString(),
|
|
85
|
+
message: result.choices[0]?.message.content ?? null,
|
|
86
|
+
finish_reason: result.choices[0]?.finish_reason ?? null,
|
|
87
|
+
choices: result.choices.map((c) => ({
|
|
88
|
+
content: c.message.content,
|
|
89
|
+
finish_reason: c.finish_reason,
|
|
90
|
+
})),
|
|
91
|
+
usage: result.usage,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export async function groqListModels(args) {
|
|
95
|
+
const apiKey = requireKey(args);
|
|
96
|
+
const data = await groqGet(apiKey, "/models");
|
|
97
|
+
const models = (data.data ?? []).filter((m) => m.active !== false);
|
|
98
|
+
models.sort((a, b) => b.created - a.created);
|
|
99
|
+
return {
|
|
100
|
+
count: models.length,
|
|
101
|
+
models: models.map((m) => ({
|
|
102
|
+
id: m.id,
|
|
103
|
+
owned_by: m.owned_by,
|
|
104
|
+
context_window: m.context_window,
|
|
105
|
+
created: new Date(m.created * 1000).toISOString(),
|
|
106
|
+
})),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=groq-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groq-tool.js","sourceRoot":"","sources":["../src/groq-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function gumroad_list_products(args: Record<string, unknown>): Promise<unknown>;
|
|
2
|
+
export declare function gumroad_get_product(args: Record<string, unknown>): Promise<unknown>;
|
|
3
|
+
export declare function gumroad_list_sales(args: Record<string, unknown>): Promise<unknown>;
|
|
4
|
+
export declare function gumroad_get_sale(args: Record<string, unknown>): Promise<unknown>;
|
|
5
|
+
export declare function gumroad_list_subscribers(args: Record<string, unknown>): Promise<unknown>;
|
|
6
|
+
//# sourceMappingURL=gumroad-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gumroad-tool.d.ts","sourceRoot":"","sources":["../src/gumroad-tool.ts"],"names":[],"mappings":"AAkCA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3F;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAMzF;AAED,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,CAMtF;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAc9F"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Gumroad Digital Sales API.
|
|
2
|
+
// Docs: https://app.gumroad.com/api
|
|
3
|
+
// Auth: access_token query param
|
|
4
|
+
// Base: https://api.gumroad.com/v2
|
|
5
|
+
const GUMROAD_API_BASE = "https://api.gumroad.com/v2";
|
|
6
|
+
function requireKey(args) {
|
|
7
|
+
const key = String(args.api_key ?? args.access_token ?? "").trim();
|
|
8
|
+
if (!key)
|
|
9
|
+
throw new Error("api_key is required. Get your access token from app.gumroad.com/settings/advanced.");
|
|
10
|
+
return key;
|
|
11
|
+
}
|
|
12
|
+
async function grGet(accessToken, path, query) {
|
|
13
|
+
const url = new URL(`${GUMROAD_API_BASE}${path}`);
|
|
14
|
+
url.searchParams.set("access_token", accessToken);
|
|
15
|
+
if (query) {
|
|
16
|
+
for (const [k, v] of Object.entries(query)) {
|
|
17
|
+
if (v !== undefined && v !== "")
|
|
18
|
+
url.searchParams.set(k, v);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const res = await fetch(url.toString(), {
|
|
22
|
+
headers: { "Content-Type": "application/json" },
|
|
23
|
+
});
|
|
24
|
+
const data = await res.json();
|
|
25
|
+
if (!data.success) {
|
|
26
|
+
const msg = data.message ?? `HTTP ${res.status}`;
|
|
27
|
+
throw new Error(`Gumroad error: ${msg}`);
|
|
28
|
+
}
|
|
29
|
+
return data;
|
|
30
|
+
}
|
|
31
|
+
// ─── Operations ───────────────────────────────────────────────────────────────
|
|
32
|
+
export async function gumroad_list_products(args) {
|
|
33
|
+
const token = requireKey(args);
|
|
34
|
+
const data = await grGet(token, "/products");
|
|
35
|
+
return {
|
|
36
|
+
count: data.products?.length ?? 0,
|
|
37
|
+
products: data.products ?? [],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export async function gumroad_get_product(args) {
|
|
41
|
+
const token = requireKey(args);
|
|
42
|
+
const id = String(args.product_id ?? "").trim();
|
|
43
|
+
if (!id)
|
|
44
|
+
throw new Error("product_id is required.");
|
|
45
|
+
const data = await grGet(token, `/products/${encodeURIComponent(id)}`);
|
|
46
|
+
return data.product;
|
|
47
|
+
}
|
|
48
|
+
export async function gumroad_list_sales(args) {
|
|
49
|
+
const token = requireKey(args);
|
|
50
|
+
const query = {};
|
|
51
|
+
if (args.product_id)
|
|
52
|
+
query.product_id = String(args.product_id);
|
|
53
|
+
if (args.email)
|
|
54
|
+
query.email = String(args.email);
|
|
55
|
+
if (args.after)
|
|
56
|
+
query.after = String(args.after);
|
|
57
|
+
if (args.before)
|
|
58
|
+
query.before = String(args.before);
|
|
59
|
+
if (args.page)
|
|
60
|
+
query.page = String(args.page);
|
|
61
|
+
const data = await grGet(token, "/sales", query);
|
|
62
|
+
return {
|
|
63
|
+
count: data.sales?.length ?? 0,
|
|
64
|
+
next_page_url: data.next_page_url ?? null,
|
|
65
|
+
sales: data.sales ?? [],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export async function gumroad_get_sale(args) {
|
|
69
|
+
const token = requireKey(args);
|
|
70
|
+
const id = String(args.sale_id ?? "").trim();
|
|
71
|
+
if (!id)
|
|
72
|
+
throw new Error("sale_id is required.");
|
|
73
|
+
const data = await grGet(token, `/sales/${encodeURIComponent(id)}`);
|
|
74
|
+
return data.sale;
|
|
75
|
+
}
|
|
76
|
+
export async function gumroad_list_subscribers(args) {
|
|
77
|
+
const token = requireKey(args);
|
|
78
|
+
const productId = String(args.product_id ?? "").trim();
|
|
79
|
+
if (!productId)
|
|
80
|
+
throw new Error("product_id is required.");
|
|
81
|
+
const query = {};
|
|
82
|
+
if (args.email)
|
|
83
|
+
query.email = String(args.email);
|
|
84
|
+
const data = await grGet(token, `/products/${encodeURIComponent(productId)}/subscribers`, query);
|
|
85
|
+
return {
|
|
86
|
+
count: data.subscribers?.length ?? 0,
|
|
87
|
+
subscribers: data.subscribers ?? [],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=gumroad-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gumroad-tool.js","sourceRoot":"","sources":["../src/gumroad-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function heygen_create_avatar_video(args: Record<string, unknown>): Promise<unknown>;
|
|
2
|
+
export declare function heygen_list_avatars(args: Record<string, unknown>): Promise<unknown>;
|
|
3
|
+
export declare function heygen_get_video_status(args: Record<string, unknown>): Promise<unknown>;
|
|
4
|
+
export declare function heygen_list_voices(args: Record<string, unknown>): Promise<unknown>;
|
|
5
|
+
//# sourceMappingURL=heygen-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heygen-tool.d.ts","sourceRoot":"","sources":["../src/heygen-tool.ts"],"names":[],"mappings":"AAsEA,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA8ChG;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBzF;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAoB7F;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBxF"}
|