@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.
- package/README.md +139 -139
- 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/catalog.d.ts.map +1 -1
- package/dist/catalog.js +261 -0
- package/dist/catalog.js.map +1 -1
- 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/linear-tool.js +73 -73
- 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/memory/db.d.ts +10 -0
- package/dist/memory/db.d.ts.map +1 -0
- package/dist/memory/db.js +22 -0
- package/dist/memory/db.js.map +1 -0
- package/dist/memory/handlers.d.ts +11 -0
- package/dist/memory/handlers.d.ts.map +1 -0
- package/dist/memory/handlers.js +125 -0
- package/dist/memory/handlers.js.map +1 -0
- package/dist/memory/local.d.ts +37 -0
- package/dist/memory/local.d.ts.map +1 -0
- package/dist/memory/local.js +386 -0
- package/dist/memory/local.js.map +1 -0
- package/dist/memory/supabase.d.ts +34 -0
- package/dist/memory/supabase.d.ts.map +1 -0
- package/dist/memory/supabase.js +209 -0
- package/dist/memory/supabase.js.map +1 -0
- package/dist/memory/types.d.ts +81 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +5 -0
- package/dist/memory/types.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/monday-tool.js +46 -46
- package/dist/musicbrainz-tool.js +1 -1
- package/dist/musicbrainz-tool.js.map +1 -1
- 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 +129 -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/toilets-tool.js +2 -2
- 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 +66 -65
- package/public/icon.svg +15 -15
- package/server.json +37 -37
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// Runway ML API integration for the UnClick MCP server.
|
|
2
|
+
// Uses the Runway REST API via fetch - no external dependencies.
|
|
3
|
+
// Users must supply an API key from app.runwayml.com/account/api-keys.
|
|
4
|
+
const RW_API_BASE = "https://api.dev.runwayml.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 app.runwayml.com/account/api-keys.");
|
|
10
|
+
return key;
|
|
11
|
+
}
|
|
12
|
+
// ─── API helpers ──────────────────────────────────────────────────────────────
|
|
13
|
+
async function rwGet(apiKey, path) {
|
|
14
|
+
const res = await fetch(`${RW_API_BASE}${path}`, {
|
|
15
|
+
headers: {
|
|
16
|
+
Authorization: `Bearer ${apiKey}`,
|
|
17
|
+
"Content-Type": "application/json",
|
|
18
|
+
"X-Runway-Version": "2024-11-06",
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
const data = await res.json();
|
|
22
|
+
if (!res.ok) {
|
|
23
|
+
const msg = data.message ?? data.error ?? `HTTP ${res.status}`;
|
|
24
|
+
throw new Error(`Runway error (${res.status}): ${msg}`);
|
|
25
|
+
}
|
|
26
|
+
return data;
|
|
27
|
+
}
|
|
28
|
+
async function rwPost(apiKey, path, body) {
|
|
29
|
+
const res = await fetch(`${RW_API_BASE}${path}`, {
|
|
30
|
+
method: "POST",
|
|
31
|
+
headers: {
|
|
32
|
+
Authorization: `Bearer ${apiKey}`,
|
|
33
|
+
"Content-Type": "application/json",
|
|
34
|
+
"X-Runway-Version": "2024-11-06",
|
|
35
|
+
},
|
|
36
|
+
body: JSON.stringify(body),
|
|
37
|
+
});
|
|
38
|
+
const data = await res.json();
|
|
39
|
+
if (!res.ok) {
|
|
40
|
+
const msg = data.message ?? data.error ?? `HTTP ${res.status}`;
|
|
41
|
+
throw new Error(`Runway error (${res.status}): ${msg}`);
|
|
42
|
+
}
|
|
43
|
+
return data;
|
|
44
|
+
}
|
|
45
|
+
// ─── Operations ───────────────────────────────────────────────────────────────
|
|
46
|
+
export async function runway_generate_video(args) {
|
|
47
|
+
const apiKey = requireKey(args);
|
|
48
|
+
const promptText = String(args.prompt ?? "").trim();
|
|
49
|
+
const imageUrl = args.image_url ? String(args.image_url).trim() : undefined;
|
|
50
|
+
if (!promptText && !imageUrl) {
|
|
51
|
+
throw new Error("Either prompt (text description) or image_url is required.");
|
|
52
|
+
}
|
|
53
|
+
const model = String(args.model ?? "gen3a_turbo");
|
|
54
|
+
const duration = Number(args.duration ?? 5);
|
|
55
|
+
const ratio = String(args.ratio ?? "1280:768");
|
|
56
|
+
// Runway supports image_to_video (with promptImage) or text_to_video
|
|
57
|
+
const body = {
|
|
58
|
+
model,
|
|
59
|
+
ratio,
|
|
60
|
+
duration,
|
|
61
|
+
};
|
|
62
|
+
if (imageUrl) {
|
|
63
|
+
body.promptImage = imageUrl;
|
|
64
|
+
if (promptText)
|
|
65
|
+
body.promptText = promptText;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
body.promptText = promptText;
|
|
69
|
+
}
|
|
70
|
+
if (args.seed !== undefined)
|
|
71
|
+
body.seed = Number(args.seed);
|
|
72
|
+
const result = await rwPost(apiKey, "/image_to_video", body);
|
|
73
|
+
return {
|
|
74
|
+
task_id: result.id ?? null,
|
|
75
|
+
status: result.status ?? "submitted",
|
|
76
|
+
model,
|
|
77
|
+
note: "Use runway_get_task with the task_id to poll for completion.",
|
|
78
|
+
raw: result,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export async function runway_get_task(args) {
|
|
82
|
+
const apiKey = requireKey(args);
|
|
83
|
+
const taskId = String(args.task_id ?? "").trim();
|
|
84
|
+
if (!taskId)
|
|
85
|
+
throw new Error("task_id is required.");
|
|
86
|
+
const result = await rwGet(apiKey, `/tasks/${encodeURIComponent(taskId)}`);
|
|
87
|
+
const output = result.output;
|
|
88
|
+
return {
|
|
89
|
+
task_id: taskId,
|
|
90
|
+
status: result.status ?? null,
|
|
91
|
+
progress: result.progress ?? null,
|
|
92
|
+
video_url: Array.isArray(output) && output.length > 0 ? output[0] : null,
|
|
93
|
+
outputs: output ?? [],
|
|
94
|
+
failure: result.failure ?? null,
|
|
95
|
+
failure_code: result.failureCode ?? null,
|
|
96
|
+
created_at: result.createdAt ?? null,
|
|
97
|
+
raw: result,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export async function runway_list_models(args) {
|
|
101
|
+
const apiKey = requireKey(args);
|
|
102
|
+
const data = await rwGet(apiKey, "/models");
|
|
103
|
+
const models = data.data ?? data.models ?? [];
|
|
104
|
+
return {
|
|
105
|
+
count: Array.isArray(models) ? models.length : 0,
|
|
106
|
+
models,
|
|
107
|
+
note: "Common models: gen3a_turbo (fast), gen3a (quality). Use model name in runway_generate_video.",
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=runway-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runway-tool.js","sourceRoot":"","sources":["../src/runway-tool.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,iEAAiE;AACjE,uEAAuE;AAEvE,MAAM,WAAW,GAAG,iCAAiC,CAAC;AAEtD,iFAAiF;AAEjF,SAAS,UAAU,CAAC,IAA6B;IAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IAChG,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,KAAK,CAAI,MAAc,EAAE,IAAY;IAClD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,GAAG,IAAI,EAAE,EAAE;QAC/C,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,EAAE;YACjC,cAAc,EAAE,kBAAkB;YAClC,kBAAkB,EAAE,YAAY;SACjC;KACF,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA6B,CAAC;IACzD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,GAAI,IAAI,CAAC,OAAkB,IAAK,IAAI,CAAC,KAAgB,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QACvF,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,IAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,MAAM,CAAI,MAAc,EAAE,IAAY,EAAE,IAAa;IAClE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,GAAG,IAAI,EAAE,EAAE;QAC/C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,EAAE;YACjC,cAAc,EAAE,kBAAkB;YAClC,kBAAkB,EAAE,YAAY;SACjC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA6B,CAAC;IACzD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,GAAI,IAAI,CAAC,OAAkB,IAAK,IAAI,CAAC,KAAgB,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QACvF,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,IAAS,CAAC;AACnB,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAA6B;IACvE,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5E,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC;IAE/C,qEAAqE;IACrE,MAAM,IAAI,GAA4B;QACpC,KAAK;QACL,KAAK;QACL,QAAQ;KACT,CAAC;IAEF,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC5B,IAAI,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAG,MAAM,MAAM,CAA0B,MAAM,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAEtF,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,EAAE,IAAI,IAAI;QAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,WAAW;QACpC,KAAK;QACL,IAAI,EAAE,8DAA8D;QACpE,GAAG,EAAE,MAAM;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAA6B;IACjE,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,MAAM,KAAK,CAA0B,MAAM,EAAE,UAAU,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAEpG,MAAM,MAAM,GAAG,MAAM,CAAC,MAA8B,CAAC;IACrD,OAAO;QACL,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;QACjC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QACxE,OAAO,EAAE,MAAM,IAAI,EAAE;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;QAC/B,YAAY,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;QACxC,UAAU,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;QACpC,GAAG,EAAE,MAAM;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAA6B;IACpE,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,KAAK,CACtB,MAAM,EAAE,SAAS,CAClB,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IAC9C,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM;QACN,IAAI,EAAE,8FAA8F;KACrG,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function segment_track_event(args: Record<string, unknown>): Promise<unknown>;
|
|
2
|
+
export declare function segment_identify_user(args: Record<string, unknown>): Promise<unknown>;
|
|
3
|
+
export declare function segment_list_sources(args: Record<string, unknown>): Promise<unknown>;
|
|
4
|
+
export declare function segment_list_destinations(args: Record<string, unknown>): Promise<unknown>;
|
|
5
|
+
export declare function segment_get_source(args: Record<string, unknown>): Promise<unknown>;
|
|
6
|
+
//# sourceMappingURL=segment-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segment-tool.d.ts","sourceRoot":"","sources":["../src/segment-tool.ts"],"names":[],"mappings":"AA8DA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBzF;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB3F;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAU1F;AAED,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAU/F;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CASxF"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// Segment Customer Data Platform API.
|
|
2
|
+
// Docs: https://segment.com/docs/connections/sources/catalog/libraries/server/http-api/
|
|
3
|
+
// https://docs.segmentapis.com/
|
|
4
|
+
// Auth: write_key (Basic auth, base64 encoded) for tracking; api_token (Bearer) for management
|
|
5
|
+
// Base: https://api.segment.io/v1 (tracking) / https://api.segmentapis.com (management)
|
|
6
|
+
const SEGMENT_TRACK_BASE = "https://api.segment.io/v1";
|
|
7
|
+
const SEGMENT_MGMT_BASE = "https://api.segmentapis.com";
|
|
8
|
+
function requireWriteKey(args) {
|
|
9
|
+
const key = String(args.write_key ?? args.api_key ?? "").trim();
|
|
10
|
+
if (!key)
|
|
11
|
+
throw new Error("write_key is required. Get one from your Segment source settings.");
|
|
12
|
+
return key;
|
|
13
|
+
}
|
|
14
|
+
function requireApiToken(args) {
|
|
15
|
+
const token = String(args.api_token ?? args.api_key ?? "").trim();
|
|
16
|
+
if (!token)
|
|
17
|
+
throw new Error("api_token is required. Get one from app.segment.com/goto-my-workspace/settings/access-management.");
|
|
18
|
+
return token;
|
|
19
|
+
}
|
|
20
|
+
async function segmentTrackPost(writeKey, path, body) {
|
|
21
|
+
const encoded = Buffer.from(`${writeKey}:`).toString("base64");
|
|
22
|
+
const res = await fetch(`${SEGMENT_TRACK_BASE}${path}`, {
|
|
23
|
+
method: "POST",
|
|
24
|
+
headers: {
|
|
25
|
+
Authorization: `Basic ${encoded}`,
|
|
26
|
+
"Content-Type": "application/json",
|
|
27
|
+
},
|
|
28
|
+
body: JSON.stringify(body),
|
|
29
|
+
});
|
|
30
|
+
if (!res.ok) {
|
|
31
|
+
const text = await res.text().catch(() => "");
|
|
32
|
+
throw new Error(`Segment tracking error (${res.status}): ${text || res.statusText}`);
|
|
33
|
+
}
|
|
34
|
+
return res.json();
|
|
35
|
+
}
|
|
36
|
+
async function segmentMgmtGet(apiToken, path, query) {
|
|
37
|
+
const url = new URL(`${SEGMENT_MGMT_BASE}${path}`);
|
|
38
|
+
if (query) {
|
|
39
|
+
for (const [k, v] of Object.entries(query)) {
|
|
40
|
+
if (v !== undefined && v !== "")
|
|
41
|
+
url.searchParams.set(k, v);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const res = await fetch(url.toString(), {
|
|
45
|
+
headers: {
|
|
46
|
+
Authorization: `Bearer ${apiToken}`,
|
|
47
|
+
"Content-Type": "application/json",
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
const data = await res.json();
|
|
51
|
+
if (!res.ok) {
|
|
52
|
+
const err = data.errors?.[0];
|
|
53
|
+
const msg = err?.message ?? `HTTP ${res.status}`;
|
|
54
|
+
throw new Error(`Segment management error (${res.status}): ${msg}`);
|
|
55
|
+
}
|
|
56
|
+
return data;
|
|
57
|
+
}
|
|
58
|
+
// ─── Operations ───────────────────────────────────────────────────────────────
|
|
59
|
+
export async function segment_track_event(args) {
|
|
60
|
+
const writeKey = requireWriteKey(args);
|
|
61
|
+
const event = String(args.event ?? "").trim();
|
|
62
|
+
const userId = String(args.user_id ?? "").trim();
|
|
63
|
+
const anonymousId = String(args.anonymous_id ?? "").trim();
|
|
64
|
+
if (!event)
|
|
65
|
+
throw new Error("event is required.");
|
|
66
|
+
if (!userId && !anonymousId)
|
|
67
|
+
throw new Error("user_id or anonymous_id is required.");
|
|
68
|
+
const body = {
|
|
69
|
+
event,
|
|
70
|
+
timestamp: args.timestamp ?? new Date().toISOString(),
|
|
71
|
+
};
|
|
72
|
+
if (userId)
|
|
73
|
+
body.userId = userId;
|
|
74
|
+
if (anonymousId)
|
|
75
|
+
body.anonymousId = anonymousId;
|
|
76
|
+
if (args.properties && typeof args.properties === "object")
|
|
77
|
+
body.properties = args.properties;
|
|
78
|
+
if (args.context && typeof args.context === "object")
|
|
79
|
+
body.context = args.context;
|
|
80
|
+
const data = await segmentTrackPost(writeKey, "/track", body);
|
|
81
|
+
return { success: true, raw: data };
|
|
82
|
+
}
|
|
83
|
+
export async function segment_identify_user(args) {
|
|
84
|
+
const writeKey = requireWriteKey(args);
|
|
85
|
+
const userId = String(args.user_id ?? "").trim();
|
|
86
|
+
const anonymousId = String(args.anonymous_id ?? "").trim();
|
|
87
|
+
if (!userId && !anonymousId)
|
|
88
|
+
throw new Error("user_id or anonymous_id is required.");
|
|
89
|
+
const body = {
|
|
90
|
+
timestamp: args.timestamp ?? new Date().toISOString(),
|
|
91
|
+
};
|
|
92
|
+
if (userId)
|
|
93
|
+
body.userId = userId;
|
|
94
|
+
if (anonymousId)
|
|
95
|
+
body.anonymousId = anonymousId;
|
|
96
|
+
if (args.traits && typeof args.traits === "object")
|
|
97
|
+
body.traits = args.traits;
|
|
98
|
+
if (args.context && typeof args.context === "object")
|
|
99
|
+
body.context = args.context;
|
|
100
|
+
const data = await segmentTrackPost(writeKey, "/identify", body);
|
|
101
|
+
return { success: true, raw: data };
|
|
102
|
+
}
|
|
103
|
+
export async function segment_list_sources(args) {
|
|
104
|
+
const apiToken = requireApiToken(args);
|
|
105
|
+
const workspaceId = String(args.workspace_id ?? "").trim();
|
|
106
|
+
if (!workspaceId)
|
|
107
|
+
throw new Error("workspace_id is required.");
|
|
108
|
+
const data = await segmentMgmtGet(apiToken, `/workspaces/${workspaceId}/sources`);
|
|
109
|
+
const sources = data.data?.sources ?? [];
|
|
110
|
+
return { count: sources.length, sources };
|
|
111
|
+
}
|
|
112
|
+
export async function segment_list_destinations(args) {
|
|
113
|
+
const apiToken = requireApiToken(args);
|
|
114
|
+
const sourceId = String(args.source_id ?? "").trim();
|
|
115
|
+
if (!sourceId)
|
|
116
|
+
throw new Error("source_id is required.");
|
|
117
|
+
const data = await segmentMgmtGet(apiToken, `/sources/${sourceId}/destinations`);
|
|
118
|
+
const destinations = data.data?.destinations ?? [];
|
|
119
|
+
return { count: destinations.length, destinations };
|
|
120
|
+
}
|
|
121
|
+
export async function segment_get_source(args) {
|
|
122
|
+
const apiToken = requireApiToken(args);
|
|
123
|
+
const sourceId = String(args.source_id ?? "").trim();
|
|
124
|
+
if (!sourceId)
|
|
125
|
+
throw new Error("source_id is required.");
|
|
126
|
+
const data = await segmentMgmtGet(apiToken, `/sources/${sourceId}`);
|
|
127
|
+
return data.data?.source ?? data;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=segment-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segment-tool.js","sourceRoot":"","sources":["../src/segment-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function sendgridSendEmail(args: Record<string, unknown>): Promise<unknown>;
|
|
2
|
+
export declare function sendgridListTemplates(args: Record<string, unknown>): Promise<unknown>;
|
|
3
|
+
export declare function sendgridGetTemplate(args: Record<string, unknown>): Promise<unknown>;
|
|
4
|
+
export declare function sendgridListContacts(args: Record<string, unknown>): Promise<unknown>;
|
|
5
|
+
export declare function sendgridAddContact(args: Record<string, unknown>): Promise<unknown>;
|
|
6
|
+
export declare function sendgridGetStats(args: Record<string, unknown>): Promise<unknown>;
|
|
7
|
+
//# sourceMappingURL=sendgrid-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendgrid-tool.d.ts","sourceRoot":"","sources":["../src/sendgrid-tool.ts"],"names":[],"mappings":"AAmDA,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBvF;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAK3F;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAKzF;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAG1F;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAcxF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAOtF"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// SendGrid v3 API integration for the UnClick MCP server.
|
|
2
|
+
// Uses the SendGrid REST API via fetch - no external dependencies.
|
|
3
|
+
// Users must supply an API key from app.sendgrid.com.
|
|
4
|
+
const SG_BASE = "https://api.sendgrid.com/v3";
|
|
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 app.sendgrid.com/settings/api-keys.");
|
|
10
|
+
return key;
|
|
11
|
+
}
|
|
12
|
+
async function sgGet(apiKey, path, params) {
|
|
13
|
+
const url = new URL(`${SG_BASE}${path}`);
|
|
14
|
+
if (params)
|
|
15
|
+
Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
|
|
16
|
+
const res = await fetch(url.toString(), {
|
|
17
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
18
|
+
});
|
|
19
|
+
if (res.status === 204)
|
|
20
|
+
return {};
|
|
21
|
+
const data = await res.json();
|
|
22
|
+
if (!res.ok) {
|
|
23
|
+
const errs = data.errors;
|
|
24
|
+
const msg = errs?.[0]?.message ?? `HTTP ${res.status}`;
|
|
25
|
+
throw new Error(`SendGrid error (${res.status}): ${msg}`);
|
|
26
|
+
}
|
|
27
|
+
return data;
|
|
28
|
+
}
|
|
29
|
+
async function sgPost(apiKey, path, body) {
|
|
30
|
+
const res = await fetch(`${SG_BASE}${path}`, {
|
|
31
|
+
method: "POST",
|
|
32
|
+
headers: {
|
|
33
|
+
Authorization: `Bearer ${apiKey}`,
|
|
34
|
+
"Content-Type": "application/json",
|
|
35
|
+
},
|
|
36
|
+
body: JSON.stringify(body),
|
|
37
|
+
});
|
|
38
|
+
if (res.status === 202 || res.status === 204)
|
|
39
|
+
return { success: true, status: res.status };
|
|
40
|
+
const data = await res.json();
|
|
41
|
+
if (!res.ok) {
|
|
42
|
+
const errs = data.errors;
|
|
43
|
+
const msg = errs?.[0]?.message ?? `HTTP ${res.status}`;
|
|
44
|
+
throw new Error(`SendGrid error (${res.status}): ${msg}`);
|
|
45
|
+
}
|
|
46
|
+
return data;
|
|
47
|
+
}
|
|
48
|
+
// ─── Operations ───────────────────────────────────────────────────────────────
|
|
49
|
+
export async function sendgridSendEmail(args) {
|
|
50
|
+
const apiKey = requireKey(args);
|
|
51
|
+
const to = String(args.to ?? "").trim();
|
|
52
|
+
const from = String(args.from ?? "").trim();
|
|
53
|
+
const subject = String(args.subject ?? "").trim();
|
|
54
|
+
if (!to)
|
|
55
|
+
throw new Error("to is required (recipient email address).");
|
|
56
|
+
if (!from)
|
|
57
|
+
throw new Error("from is required (sender email address).");
|
|
58
|
+
if (!subject)
|
|
59
|
+
throw new Error("subject is required.");
|
|
60
|
+
if (!args.text && !args.html)
|
|
61
|
+
throw new Error("Either text or html content is required.");
|
|
62
|
+
const content = [];
|
|
63
|
+
if (args.text)
|
|
64
|
+
content.push({ type: "text/plain", value: String(args.text) });
|
|
65
|
+
if (args.html)
|
|
66
|
+
content.push({ type: "text/html", value: String(args.html) });
|
|
67
|
+
const body = {
|
|
68
|
+
personalizations: [{ to: [{ email: to, name: args.to_name ? String(args.to_name) : undefined }] }],
|
|
69
|
+
from: { email: from, name: args.from_name ? String(args.from_name) : undefined },
|
|
70
|
+
subject,
|
|
71
|
+
content,
|
|
72
|
+
};
|
|
73
|
+
if (args.template_id)
|
|
74
|
+
body.template_id = String(args.template_id);
|
|
75
|
+
if (args.reply_to)
|
|
76
|
+
body.reply_to = { email: String(args.reply_to) };
|
|
77
|
+
return sgPost(apiKey, "/mail/send", body);
|
|
78
|
+
}
|
|
79
|
+
export async function sendgridListTemplates(args) {
|
|
80
|
+
const apiKey = requireKey(args);
|
|
81
|
+
const params = { generations: "dynamic" };
|
|
82
|
+
if (args.page_size)
|
|
83
|
+
params.page_size = String(Math.min(200, Math.max(1, Number(args.page_size))));
|
|
84
|
+
return sgGet(apiKey, "/templates", params);
|
|
85
|
+
}
|
|
86
|
+
export async function sendgridGetTemplate(args) {
|
|
87
|
+
const apiKey = requireKey(args);
|
|
88
|
+
const id = String(args.template_id ?? "").trim();
|
|
89
|
+
if (!id)
|
|
90
|
+
throw new Error("template_id is required.");
|
|
91
|
+
return sgGet(apiKey, `/templates/${encodeURIComponent(id)}`);
|
|
92
|
+
}
|
|
93
|
+
export async function sendgridListContacts(args) {
|
|
94
|
+
const apiKey = requireKey(args);
|
|
95
|
+
return sgGet(apiKey, "/marketing/contacts");
|
|
96
|
+
}
|
|
97
|
+
export async function sendgridAddContact(args) {
|
|
98
|
+
const apiKey = requireKey(args);
|
|
99
|
+
const email = String(args.email ?? "").trim();
|
|
100
|
+
if (!email)
|
|
101
|
+
throw new Error("email is required.");
|
|
102
|
+
const contact = { email };
|
|
103
|
+
if (args.first_name)
|
|
104
|
+
contact.first_name = String(args.first_name);
|
|
105
|
+
if (args.last_name)
|
|
106
|
+
contact.last_name = String(args.last_name);
|
|
107
|
+
if (args.phone_number)
|
|
108
|
+
contact.phone_number = String(args.phone_number);
|
|
109
|
+
const body = { contacts: [contact] };
|
|
110
|
+
if (args.list_ids)
|
|
111
|
+
body.list_ids = args.list_ids;
|
|
112
|
+
return sgPost(apiKey, "/marketing/contacts", body);
|
|
113
|
+
}
|
|
114
|
+
export async function sendgridGetStats(args) {
|
|
115
|
+
const apiKey = requireKey(args);
|
|
116
|
+
const startDate = String(args.start_date ?? new Date(Date.now() - 7 * 86400000).toISOString().split("T")[0]);
|
|
117
|
+
const params = { start_date: startDate };
|
|
118
|
+
if (args.end_date)
|
|
119
|
+
params.end_date = String(args.end_date);
|
|
120
|
+
if (args.aggregated_by)
|
|
121
|
+
params.aggregated_by = String(args.aggregated_by);
|
|
122
|
+
return sgGet(apiKey, "/stats", params);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=sendgrid-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendgrid-tool.js","sourceRoot":"","sources":["../src/sendgrid-tool.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AA8lBnE,wBAAgB,YAAY,IAAI,MAAM,CAqPrC;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAMjD"}
|
package/dist/server.js
CHANGED
|
@@ -4,6 +4,8 @@ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextpro
|
|
|
4
4
|
import { CATALOG, TOOL_MAP, ENDPOINT_MAP } from "./catalog.js";
|
|
5
5
|
import { createClient } from "./client.js";
|
|
6
6
|
import { ADDITIONAL_HANDLERS } from "./tool-wiring.js";
|
|
7
|
+
import { LOCAL_CATALOG_HANDLERS } from "./local-catalog-handlers.js";
|
|
8
|
+
import { MEMORY_HANDLERS } from "./memory/handlers.js";
|
|
7
9
|
// ─── Search helper ──────────────────────────────────────────────────────────
|
|
8
10
|
function searchTools(query, category) {
|
|
9
11
|
const q = query.toLowerCase();
|
|
@@ -104,6 +106,97 @@ const META_TOOLS = [
|
|
|
104
106
|
required: ["endpoint_id", "params"],
|
|
105
107
|
},
|
|
106
108
|
},
|
|
109
|
+
// ── UnClick Memory (persistent cross-session memory) ─────────────────────
|
|
110
|
+
// These 5 tools implement the session-start / session-end protocol agents
|
|
111
|
+
// should follow. The other 12 memory operations are available via unclick_call
|
|
112
|
+
// with endpoint_id like "memory.add_fact", "memory.search_memory", etc.
|
|
113
|
+
{
|
|
114
|
+
name: "get_startup_context",
|
|
115
|
+
description: "Load persistent UnClick Memory at session start. Returns business context (standing rules), " +
|
|
116
|
+
"recent session summaries, and hot facts. Call this FIRST in every new session to understand " +
|
|
117
|
+
"the user's ongoing projects, preferences, and open loops. Works zero-config locally, or with " +
|
|
118
|
+
"Supabase for cross-machine sync.",
|
|
119
|
+
inputSchema: {
|
|
120
|
+
type: "object",
|
|
121
|
+
properties: {
|
|
122
|
+
num_sessions: {
|
|
123
|
+
type: "number",
|
|
124
|
+
description: "Number of recent session summaries to load (1-20, default 5)",
|
|
125
|
+
default: 5,
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
name: "write_session_summary",
|
|
132
|
+
description: "Write a session summary at the end of a session. Critical for cross-session continuity. " +
|
|
133
|
+
"Call this BEFORE the session ends (when the user says goodbye, or context is running low). " +
|
|
134
|
+
"Include key decisions, open loops, and topics discussed.",
|
|
135
|
+
inputSchema: {
|
|
136
|
+
type: "object",
|
|
137
|
+
properties: {
|
|
138
|
+
session_id: { type: "string", description: "Unique session identifier (timestamp or UUID)" },
|
|
139
|
+
summary: { type: "string", description: "Narrative of what happened - decisions, work completed, problems solved" },
|
|
140
|
+
topics: { type: "array", items: { type: "string" }, description: "Topic tags for searchability" },
|
|
141
|
+
open_loops: { type: "array", items: { type: "string" }, description: "Unfinished tasks or questions to carry forward" },
|
|
142
|
+
decisions: { type: "array", items: { type: "string" }, description: "Key decisions made during the session" },
|
|
143
|
+
platform: { type: "string", description: "Platform this session ran on", default: "claude-code" },
|
|
144
|
+
duration_minutes: { type: "number", description: "Approximate session duration" },
|
|
145
|
+
},
|
|
146
|
+
required: ["session_id", "summary"],
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: "add_fact",
|
|
151
|
+
description: "Add a new atomic fact to UnClick Memory. One fact = one statement. " +
|
|
152
|
+
"Use when the user states a preference, makes a decision, or shares important info. " +
|
|
153
|
+
"Good: 'Team prefers Tailwind over CSS modules'. Bad: 'We talked about styling'.",
|
|
154
|
+
inputSchema: {
|
|
155
|
+
type: "object",
|
|
156
|
+
properties: {
|
|
157
|
+
fact: { type: "string", description: "The fact - a single atomic statement" },
|
|
158
|
+
category: {
|
|
159
|
+
type: "string",
|
|
160
|
+
description: "Category: preference, decision, technical, contact, project, general",
|
|
161
|
+
default: "general",
|
|
162
|
+
},
|
|
163
|
+
confidence: { type: "number", minimum: 0, maximum: 1, default: 0.9 },
|
|
164
|
+
source_session_id: { type: "string", description: "Session ID where this fact was learned" },
|
|
165
|
+
},
|
|
166
|
+
required: ["fact"],
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
name: "search_memory",
|
|
171
|
+
description: "Full-text search across UnClick Memory conversation logs. Use when you need to recall " +
|
|
172
|
+
"something specific from a previous session.",
|
|
173
|
+
inputSchema: {
|
|
174
|
+
type: "object",
|
|
175
|
+
properties: {
|
|
176
|
+
query: { type: "string", description: "Search query" },
|
|
177
|
+
max_results: { type: "number", minimum: 1, maximum: 50, default: 10 },
|
|
178
|
+
},
|
|
179
|
+
required: ["query"],
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
name: "set_business_context",
|
|
184
|
+
description: "Add or update a standing rule in UnClick Memory (Layer 1). Business context is ALWAYS loaded " +
|
|
185
|
+
"at session start. Use for standing rules, client info, and preferences that are always relevant.",
|
|
186
|
+
inputSchema: {
|
|
187
|
+
type: "object",
|
|
188
|
+
properties: {
|
|
189
|
+
category: {
|
|
190
|
+
type: "string",
|
|
191
|
+
description: "Category: identity, preference, client, workflow, technical, standing_rule",
|
|
192
|
+
},
|
|
193
|
+
key: { type: "string", description: "Unique key within category (e.g. 'timezone', 'preferred_stack')" },
|
|
194
|
+
value: { type: "string", description: "The value to store (plain text or JSON string)" },
|
|
195
|
+
priority: { type: "number", description: "Priority for loading order (higher = loaded first)" },
|
|
196
|
+
},
|
|
197
|
+
required: ["category", "key", "value"],
|
|
198
|
+
},
|
|
199
|
+
},
|
|
107
200
|
];
|
|
108
201
|
const DIRECT_TOOLS = [
|
|
109
202
|
{
|
|
@@ -467,6 +560,13 @@ export function createServer() {
|
|
|
467
560
|
const { name, arguments: rawArgs } = request.params;
|
|
468
561
|
const args = (rawArgs ?? {});
|
|
469
562
|
try {
|
|
563
|
+
// ── UnClick Memory (direct tools + memory.* endpoints) ───────
|
|
564
|
+
if (MEMORY_HANDLERS[name]) {
|
|
565
|
+
const result = await MEMORY_HANDLERS[name](args);
|
|
566
|
+
return {
|
|
567
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
568
|
+
};
|
|
569
|
+
}
|
|
470
570
|
// ── Meta tools ──────────────────────────────────────────────
|
|
471
571
|
if (name === "unclick_search") {
|
|
472
572
|
const results = searchTools(String(args.query ?? ""), args.category);
|
|
@@ -556,6 +656,25 @@ export function createServer() {
|
|
|
556
656
|
if (name === "unclick_call") {
|
|
557
657
|
const endpointId = String(args.endpoint_id ?? "");
|
|
558
658
|
const params = (args.params ?? {});
|
|
659
|
+
// Memory endpoints: "memory.add_fact", "memory.store_code", etc.
|
|
660
|
+
if (endpointId.startsWith("memory.")) {
|
|
661
|
+
const op = endpointId.slice("memory.".length);
|
|
662
|
+
const memHandler = MEMORY_HANDLERS[op];
|
|
663
|
+
if (memHandler) {
|
|
664
|
+
const result = await memHandler(params);
|
|
665
|
+
return {
|
|
666
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
// Check local handlers first (avoids remote API dependency)
|
|
671
|
+
const localHandler = LOCAL_CATALOG_HANDLERS[endpointId];
|
|
672
|
+
if (localHandler) {
|
|
673
|
+
const result = await localHandler(params);
|
|
674
|
+
return {
|
|
675
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
676
|
+
};
|
|
677
|
+
}
|
|
559
678
|
const entry = ENDPOINT_MAP.get(endpointId);
|
|
560
679
|
if (!entry) {
|
|
561
680
|
return {
|
|
@@ -568,6 +687,16 @@ export function createServer() {
|
|
|
568
687
|
isError: true,
|
|
569
688
|
};
|
|
570
689
|
}
|
|
690
|
+
// Try ADDITIONAL_HANDLERS via dot-to-underscore key conversion ("foo.bar" -> "foo_bar")
|
|
691
|
+
const handlerKey = endpointId.replace(/\./g, "_");
|
|
692
|
+
const additionalHandler = ADDITIONAL_HANDLERS[handlerKey];
|
|
693
|
+
if (additionalHandler) {
|
|
694
|
+
const result = await additionalHandler(params);
|
|
695
|
+
return {
|
|
696
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
697
|
+
};
|
|
698
|
+
}
|
|
699
|
+
// Fall back to remote API for endpoints without local implementations
|
|
571
700
|
const client = createClient();
|
|
572
701
|
const result = await client.call(entry.endpoint.method, entry.endpoint.path, params);
|
|
573
702
|
return {
|