@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,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase backend for UnClick Memory.
|
|
3
|
+
*
|
|
4
|
+
* Cloud mode: data lives in the user's own Supabase project (BYOD).
|
|
5
|
+
* Requires SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY env vars.
|
|
6
|
+
*/
|
|
7
|
+
import { createClient } from "@supabase/supabase-js";
|
|
8
|
+
let client = null;
|
|
9
|
+
function getSupabase() {
|
|
10
|
+
if (client)
|
|
11
|
+
return client;
|
|
12
|
+
const url = process.env.SUPABASE_URL;
|
|
13
|
+
const key = process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_ANON_KEY;
|
|
14
|
+
if (!url || !key) {
|
|
15
|
+
throw new Error("Missing SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY (or SUPABASE_ANON_KEY) environment variables. " +
|
|
16
|
+
"Set these in your MCP config's env block.");
|
|
17
|
+
}
|
|
18
|
+
client = createClient(url, key, {
|
|
19
|
+
auth: { persistSession: false, autoRefreshToken: false },
|
|
20
|
+
});
|
|
21
|
+
return client;
|
|
22
|
+
}
|
|
23
|
+
async function rpc(fn, params = {}) {
|
|
24
|
+
const sb = getSupabase();
|
|
25
|
+
const { data, error } = await sb.rpc(fn, params);
|
|
26
|
+
if (error)
|
|
27
|
+
throw new Error(`rpc(${fn}) failed: ${error.message}`);
|
|
28
|
+
return data;
|
|
29
|
+
}
|
|
30
|
+
function now() {
|
|
31
|
+
return new Date().toISOString();
|
|
32
|
+
}
|
|
33
|
+
function truncate(s, max = 8000) {
|
|
34
|
+
return s.length > max ? s.slice(0, max) + "\n...[truncated]" : s;
|
|
35
|
+
}
|
|
36
|
+
export class SupabaseBackend {
|
|
37
|
+
constructor() {
|
|
38
|
+
// Verify connection on creation
|
|
39
|
+
getSupabase();
|
|
40
|
+
console.error("UnClick Memory: Supabase cloud mode");
|
|
41
|
+
}
|
|
42
|
+
async getStartupContext(numSessions) {
|
|
43
|
+
return rpc("get_startup_context", { num_sessions: numSessions });
|
|
44
|
+
}
|
|
45
|
+
async searchMemory(query, maxResults) {
|
|
46
|
+
return rpc("search_memory", { search_query: query, max_results: maxResults });
|
|
47
|
+
}
|
|
48
|
+
async searchFacts(query) {
|
|
49
|
+
return rpc("search_facts", { search_query: query });
|
|
50
|
+
}
|
|
51
|
+
async searchLibrary(query) {
|
|
52
|
+
return rpc("search_library", { search_query: query });
|
|
53
|
+
}
|
|
54
|
+
async getLibraryDoc(slug) {
|
|
55
|
+
return rpc("get_library_doc", { doc_slug: slug });
|
|
56
|
+
}
|
|
57
|
+
async listLibrary() {
|
|
58
|
+
return rpc("list_library");
|
|
59
|
+
}
|
|
60
|
+
async writeSessionSummary(data) {
|
|
61
|
+
const sb = getSupabase();
|
|
62
|
+
const { data: row, error } = await sb.from("session_summaries").insert({
|
|
63
|
+
session_id: data.session_id,
|
|
64
|
+
summary: data.summary,
|
|
65
|
+
topics: data.topics,
|
|
66
|
+
open_loops: data.open_loops,
|
|
67
|
+
decisions: data.decisions,
|
|
68
|
+
platform: data.platform,
|
|
69
|
+
duration_minutes: data.duration_minutes,
|
|
70
|
+
}).select().single();
|
|
71
|
+
if (error)
|
|
72
|
+
throw error;
|
|
73
|
+
return { id: row.id };
|
|
74
|
+
}
|
|
75
|
+
async addFact(data) {
|
|
76
|
+
const sb = getSupabase();
|
|
77
|
+
const { data: row, error } = await sb.from("extracted_facts").insert({
|
|
78
|
+
fact: data.fact,
|
|
79
|
+
category: data.category,
|
|
80
|
+
confidence: data.confidence,
|
|
81
|
+
source_session_id: data.source_session_id ?? null,
|
|
82
|
+
source_type: "manual",
|
|
83
|
+
status: "active",
|
|
84
|
+
decay_tier: "hot",
|
|
85
|
+
last_accessed: now(),
|
|
86
|
+
}).select().single();
|
|
87
|
+
if (error)
|
|
88
|
+
throw error;
|
|
89
|
+
return { id: row.id };
|
|
90
|
+
}
|
|
91
|
+
async supersedeFact(oldId, newText, category, confidence) {
|
|
92
|
+
const params = { old_fact_id: oldId, new_fact_text: newText };
|
|
93
|
+
if (category !== undefined)
|
|
94
|
+
params.new_category = category;
|
|
95
|
+
if (confidence !== undefined)
|
|
96
|
+
params.new_confidence = confidence;
|
|
97
|
+
const data = await rpc("supersede_fact", params);
|
|
98
|
+
return String(data);
|
|
99
|
+
}
|
|
100
|
+
async logConversation(data) {
|
|
101
|
+
const sb = getSupabase();
|
|
102
|
+
const { error } = await sb.from("conversation_log").insert({
|
|
103
|
+
session_id: data.session_id,
|
|
104
|
+
role: data.role,
|
|
105
|
+
content: truncate(data.content),
|
|
106
|
+
has_code: data.has_code,
|
|
107
|
+
});
|
|
108
|
+
if (error)
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
async getConversationDetail(sessionId) {
|
|
112
|
+
return rpc("get_conversation_detail", { sid: sessionId });
|
|
113
|
+
}
|
|
114
|
+
async storeCode(data) {
|
|
115
|
+
const sb = getSupabase();
|
|
116
|
+
const { data: row, error } = await sb.from("code_dumps").insert({
|
|
117
|
+
session_id: data.session_id,
|
|
118
|
+
language: data.language,
|
|
119
|
+
filename: data.filename ?? null,
|
|
120
|
+
content: truncate(data.content, 50000),
|
|
121
|
+
description: data.description ?? null,
|
|
122
|
+
}).select().single();
|
|
123
|
+
if (error)
|
|
124
|
+
throw error;
|
|
125
|
+
return { id: row.id };
|
|
126
|
+
}
|
|
127
|
+
async getBusinessContext() {
|
|
128
|
+
const sb = getSupabase();
|
|
129
|
+
const { data, error } = await sb.from("business_context").select("*").order("category").order("key");
|
|
130
|
+
if (error)
|
|
131
|
+
throw error;
|
|
132
|
+
return data ?? [];
|
|
133
|
+
}
|
|
134
|
+
async setBusinessContext(category, key, value, priority) {
|
|
135
|
+
const sb = getSupabase();
|
|
136
|
+
const row = {
|
|
137
|
+
category,
|
|
138
|
+
key,
|
|
139
|
+
value: typeof value === "string" ? (() => { try {
|
|
140
|
+
return JSON.parse(value);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return value;
|
|
144
|
+
} })() : value,
|
|
145
|
+
last_accessed: now(),
|
|
146
|
+
decay_tier: "hot",
|
|
147
|
+
};
|
|
148
|
+
if (priority !== undefined)
|
|
149
|
+
row.priority = priority;
|
|
150
|
+
const { error } = await sb.from("business_context")
|
|
151
|
+
.upsert(row, { onConflict: "category,key" })
|
|
152
|
+
.select().single();
|
|
153
|
+
if (error)
|
|
154
|
+
throw error;
|
|
155
|
+
}
|
|
156
|
+
async upsertLibraryDoc(data) {
|
|
157
|
+
const sb = getSupabase();
|
|
158
|
+
const { data: existing } = await sb.from("knowledge_library")
|
|
159
|
+
.select("id, version").eq("slug", data.slug).single();
|
|
160
|
+
if (existing) {
|
|
161
|
+
// DB trigger auto-archives old content and bumps version
|
|
162
|
+
const { error } = await sb.from("knowledge_library").update({
|
|
163
|
+
title: data.title,
|
|
164
|
+
category: data.category,
|
|
165
|
+
content: data.content,
|
|
166
|
+
tags: data.tags,
|
|
167
|
+
last_accessed: now(),
|
|
168
|
+
decay_tier: "hot",
|
|
169
|
+
}).eq("id", existing.id);
|
|
170
|
+
if (error)
|
|
171
|
+
throw error;
|
|
172
|
+
return `Library doc updated: "${data.title}" (v${existing.version + 1})`;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
const { error } = await sb.from("knowledge_library").insert({
|
|
176
|
+
slug: data.slug,
|
|
177
|
+
title: data.title,
|
|
178
|
+
category: data.category,
|
|
179
|
+
content: data.content,
|
|
180
|
+
tags: data.tags,
|
|
181
|
+
version: 1,
|
|
182
|
+
decay_tier: "hot",
|
|
183
|
+
last_accessed: now(),
|
|
184
|
+
});
|
|
185
|
+
if (error)
|
|
186
|
+
throw error;
|
|
187
|
+
return `Library doc created: "${data.title}" (v1)`;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async manageDecay() {
|
|
191
|
+
return rpc("manage_decay");
|
|
192
|
+
}
|
|
193
|
+
async getMemoryStatus() {
|
|
194
|
+
const sb = getSupabase();
|
|
195
|
+
const tables = ["business_context", "knowledge_library", "session_summaries", "extracted_facts", "conversation_log", "code_dumps"];
|
|
196
|
+
const counts = {};
|
|
197
|
+
for (const table of tables) {
|
|
198
|
+
const { count } = await sb.from(table).select("*", { count: "exact", head: true });
|
|
199
|
+
counts[table] = count;
|
|
200
|
+
}
|
|
201
|
+
const { data: factTiers } = await sb.from("extracted_facts").select("decay_tier").eq("status", "active");
|
|
202
|
+
const tiers = { hot: 0, warm: 0, cold: 0 };
|
|
203
|
+
for (const row of factTiers ?? []) {
|
|
204
|
+
tiers[row.decay_tier]++;
|
|
205
|
+
}
|
|
206
|
+
return { mode: "supabase", table_counts: counts, fact_decay_tiers: tiers };
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=supabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/memory/supabase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for UnClick Memory backends (local + Supabase).
|
|
3
|
+
*/
|
|
4
|
+
export interface SessionSummaryInput {
|
|
5
|
+
session_id: string;
|
|
6
|
+
summary: string;
|
|
7
|
+
topics: string[];
|
|
8
|
+
open_loops: string[];
|
|
9
|
+
decisions: string[];
|
|
10
|
+
platform: string;
|
|
11
|
+
duration_minutes?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface FactInput {
|
|
14
|
+
fact: string;
|
|
15
|
+
category: string;
|
|
16
|
+
confidence: number;
|
|
17
|
+
source_session_id?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ConversationInput {
|
|
20
|
+
session_id: string;
|
|
21
|
+
role: string;
|
|
22
|
+
content: string;
|
|
23
|
+
has_code: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface CodeInput {
|
|
26
|
+
session_id: string;
|
|
27
|
+
language: string;
|
|
28
|
+
filename?: string;
|
|
29
|
+
content: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface LibraryDocInput {
|
|
33
|
+
slug: string;
|
|
34
|
+
title: string;
|
|
35
|
+
category: string;
|
|
36
|
+
content: string;
|
|
37
|
+
tags: string[];
|
|
38
|
+
}
|
|
39
|
+
export interface MemoryBackend {
|
|
40
|
+
/** Load startup context (business context + recent sessions + hot facts). */
|
|
41
|
+
getStartupContext(numSessions: number): Promise<unknown>;
|
|
42
|
+
/** Full-text search across conversation logs. */
|
|
43
|
+
searchMemory(query: string, maxResults: number): Promise<unknown>;
|
|
44
|
+
/** Search extracted facts. */
|
|
45
|
+
searchFacts(query: string): Promise<unknown>;
|
|
46
|
+
/** Search knowledge library. */
|
|
47
|
+
searchLibrary(query: string): Promise<unknown>;
|
|
48
|
+
/** Get a specific library doc by slug. */
|
|
49
|
+
getLibraryDoc(slug: string): Promise<unknown>;
|
|
50
|
+
/** List all library documents. */
|
|
51
|
+
listLibrary(): Promise<unknown>;
|
|
52
|
+
/** Write end-of-session summary. */
|
|
53
|
+
writeSessionSummary(data: SessionSummaryInput): Promise<{
|
|
54
|
+
id: string;
|
|
55
|
+
}>;
|
|
56
|
+
/** Add an extracted fact. */
|
|
57
|
+
addFact(data: FactInput): Promise<{
|
|
58
|
+
id: string;
|
|
59
|
+
}>;
|
|
60
|
+
/** Replace a fact with a new version. */
|
|
61
|
+
supersedeFact(oldId: string, newText: string, category?: string, confidence?: number): Promise<string>;
|
|
62
|
+
/** Log a conversation message. */
|
|
63
|
+
logConversation(data: ConversationInput): Promise<void>;
|
|
64
|
+
/** Get full conversation log for a session. */
|
|
65
|
+
getConversationDetail(sessionId: string): Promise<unknown>;
|
|
66
|
+
/** Store a code block. */
|
|
67
|
+
storeCode(data: CodeInput): Promise<{
|
|
68
|
+
id: string;
|
|
69
|
+
}>;
|
|
70
|
+
/** Get all business context entries. */
|
|
71
|
+
getBusinessContext(): Promise<unknown[]>;
|
|
72
|
+
/** Set or update a business context entry. */
|
|
73
|
+
setBusinessContext(category: string, key: string, value: unknown, priority?: number): Promise<void>;
|
|
74
|
+
/** Create or update a knowledge library doc. */
|
|
75
|
+
upsertLibraryDoc(data: LibraryDocInput): Promise<string>;
|
|
76
|
+
/** Run memory decay management. */
|
|
77
|
+
manageDecay(): Promise<unknown>;
|
|
78
|
+
/** Get memory usage stats. */
|
|
79
|
+
getMemoryStatus(): Promise<unknown>;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function mistralChatCompletion(args: Record<string, unknown>): Promise<unknown>;
|
|
2
|
+
export declare function mistralListModels(args: Record<string, unknown>): Promise<unknown>;
|
|
3
|
+
export declare function mistralCreateEmbedding(args: Record<string, unknown>): Promise<unknown>;
|
|
4
|
+
//# sourceMappingURL=mistral-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mistral-tool.d.ts","sourceRoot":"","sources":["../src/mistral-tool.ts"],"names":[],"mappings":"AA+FA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA4C3F;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBvF;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA8B5F"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// Mistral AI API integration for the UnClick MCP server.
|
|
2
|
+
// Uses the Mistral REST API via fetch - no external dependencies.
|
|
3
|
+
// Users must supply an API key from console.mistral.ai.
|
|
4
|
+
const MISTRAL_API_BASE = "https://api.mistral.ai/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 console.mistral.ai.");
|
|
10
|
+
return key;
|
|
11
|
+
}
|
|
12
|
+
// --- API helpers -------------------------------------------------------------
|
|
13
|
+
async function mistralPost(apiKey, path, body) {
|
|
14
|
+
const res = await fetch(`${MISTRAL_API_BASE}${path}`, {
|
|
15
|
+
method: "POST",
|
|
16
|
+
headers: {
|
|
17
|
+
Authorization: `Bearer ${apiKey}`,
|
|
18
|
+
"Content-Type": "application/json",
|
|
19
|
+
},
|
|
20
|
+
body: JSON.stringify(body),
|
|
21
|
+
});
|
|
22
|
+
const data = await res.json();
|
|
23
|
+
if (!res.ok) {
|
|
24
|
+
const msg = data.message ?? data.error ?? `HTTP ${res.status}`;
|
|
25
|
+
throw new Error(`Mistral error: ${msg}`);
|
|
26
|
+
}
|
|
27
|
+
return data;
|
|
28
|
+
}
|
|
29
|
+
async function mistralGet(apiKey, path) {
|
|
30
|
+
const res = await fetch(`${MISTRAL_API_BASE}${path}`, {
|
|
31
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
32
|
+
});
|
|
33
|
+
const data = await res.json();
|
|
34
|
+
if (!res.ok) {
|
|
35
|
+
const msg = data.message ?? data.error ?? `HTTP ${res.status}`;
|
|
36
|
+
throw new Error(`Mistral error: ${msg}`);
|
|
37
|
+
}
|
|
38
|
+
return data;
|
|
39
|
+
}
|
|
40
|
+
// --- Operations --------------------------------------------------------------
|
|
41
|
+
export async function mistralChatCompletion(args) {
|
|
42
|
+
try {
|
|
43
|
+
const apiKey = requireKey(args);
|
|
44
|
+
const model = String(args.model ?? "mistral-small-latest");
|
|
45
|
+
// Parse messages
|
|
46
|
+
let messages;
|
|
47
|
+
if (Array.isArray(args.messages)) {
|
|
48
|
+
messages = args.messages;
|
|
49
|
+
}
|
|
50
|
+
else if (typeof args.messages === "string") {
|
|
51
|
+
try {
|
|
52
|
+
messages = JSON.parse(args.messages);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new Error("messages must be a JSON array of {role, content} objects.");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else if (args.prompt) {
|
|
59
|
+
const systemPrompt = args.system_prompt ? String(args.system_prompt) : undefined;
|
|
60
|
+
messages = [];
|
|
61
|
+
if (systemPrompt)
|
|
62
|
+
messages.push({ role: "system", content: systemPrompt });
|
|
63
|
+
messages.push({ role: "user", content: String(args.prompt) });
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
throw new Error("Either messages (array) or prompt (string) is required.");
|
|
67
|
+
}
|
|
68
|
+
if (messages.length === 0)
|
|
69
|
+
throw new Error("messages array must not be empty.");
|
|
70
|
+
const body = { model, messages, stream: false };
|
|
71
|
+
if (args.max_tokens)
|
|
72
|
+
body.max_tokens = Number(args.max_tokens);
|
|
73
|
+
if (args.temperature !== undefined)
|
|
74
|
+
body.temperature = Number(args.temperature);
|
|
75
|
+
if (args.top_p !== undefined)
|
|
76
|
+
body.top_p = Number(args.top_p);
|
|
77
|
+
const result = await mistralPost(apiKey, "/chat/completions", body);
|
|
78
|
+
return {
|
|
79
|
+
id: result.id,
|
|
80
|
+
model: result.model,
|
|
81
|
+
created: new Date(result.created * 1000).toISOString(),
|
|
82
|
+
message: result.choices[0]?.message.content ?? null,
|
|
83
|
+
finish_reason: result.choices[0]?.finish_reason ?? null,
|
|
84
|
+
choices: result.choices.map((c) => ({
|
|
85
|
+
content: c.message.content,
|
|
86
|
+
finish_reason: c.finish_reason,
|
|
87
|
+
})),
|
|
88
|
+
usage: result.usage,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export async function mistralListModels(args) {
|
|
96
|
+
try {
|
|
97
|
+
const apiKey = requireKey(args);
|
|
98
|
+
const data = await mistralGet(apiKey, "/models");
|
|
99
|
+
const models = data.data ?? [];
|
|
100
|
+
return {
|
|
101
|
+
count: models.length,
|
|
102
|
+
models: models.map((m) => ({
|
|
103
|
+
id: m.id,
|
|
104
|
+
owned_by: m.owned_by,
|
|
105
|
+
created: m.created ? new Date(m.created * 1000).toISOString() : null,
|
|
106
|
+
capabilities: m.capabilities ?? null,
|
|
107
|
+
})),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export async function mistralCreateEmbedding(args) {
|
|
115
|
+
try {
|
|
116
|
+
const apiKey = requireKey(args);
|
|
117
|
+
const model = String(args.model ?? "mistral-embed");
|
|
118
|
+
const encodingFormat = String(args.encoding_format ?? "float");
|
|
119
|
+
let input;
|
|
120
|
+
if (typeof args.input === "string") {
|
|
121
|
+
input = args.input;
|
|
122
|
+
}
|
|
123
|
+
else if (Array.isArray(args.input)) {
|
|
124
|
+
input = args.input;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
throw new Error("input is required (a string or array of strings to embed).");
|
|
128
|
+
}
|
|
129
|
+
const body = { model, input, encoding_format: encodingFormat };
|
|
130
|
+
const result = await mistralPost(apiKey, "/embeddings", body);
|
|
131
|
+
return {
|
|
132
|
+
model: result.model,
|
|
133
|
+
embeddings: result.data.map((d) => ({
|
|
134
|
+
index: d.index,
|
|
135
|
+
dimensions: d.embedding.length,
|
|
136
|
+
embedding: d.embedding,
|
|
137
|
+
})),
|
|
138
|
+
usage: result.usage,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=mistral-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mistral-tool.js","sourceRoot":"","sources":["../src/mistral-tool.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,kEAAkE;AAClE,wDAAwD;AAExD,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAgDrD,gFAAgF;AAEhF,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,qDAAqD,CAAC,CAAC;IACjF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAEhF,KAAK,UAAU,WAAW,CAAI,MAAc,EAAE,IAAY,EAAE,IAAa;IACvE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,gBAAgB,GAAG,IAAI,EAAE,EAAE;QACpD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,EAAE;YACjC,cAAc,EAAE,kBAAkB;SACnC;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,kBAAkB,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,IAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,UAAU,CAAI,MAAc,EAAE,IAAY;IACvD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,gBAAgB,GAAG,IAAI,EAAE,EAAE;QACpD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE;KAC/C,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,kBAAkB,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,IAAS,CAAC;AACnB,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAA6B;IACvE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,sBAAsB,CAAC,CAAC;QAE3D,iBAAiB;QACjB,IAAI,QAA0B,CAAC;QAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,QAAQ,GAAG,IAAI,CAAC,QAA4B,CAAC;QAC/C,CAAC;aAAM,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC7C,IAAI,CAAC;gBAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAAC,CAAC;YAC7C,MAAM,CAAC;gBAAC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAAC,CAAC;QACzF,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACjF,QAAQ,GAAG,EAAE,CAAC;YACd,IAAI,YAAY;gBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;YAC3E,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAEhF,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACzE,IAAI,IAAI,CAAC,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE9D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAsB,MAAM,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;QACzF,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;YACtD,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;YACnD,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa,IAAI,IAAI;YACvD,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO;gBAC1B,aAAa,EAAE,CAAC,CAAC,aAAa;aAC/B,CAAC,CAAC;YACH,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACrE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAA6B;IACnE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,UAAU,CAA2B,MAAM,EAAE,SAAS,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAE/B,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;gBACpE,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;aACrC,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACrE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAA6B;IACxE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;QACpD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC,CAAC;QAE/D,IAAI,KAAwB,CAAC;QAC7B,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACrB,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,KAAK,GAAG,IAAI,CAAC,KAAiB,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;QAExF,MAAM,MAAM,GAAG,MAAM,WAAW,CAA2B,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;QACxF,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClC,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM;gBAC9B,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB,CAAC,CAAC;YACH,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACrE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function mixpanelTrackEvent(args: Record<string, unknown>): Promise<unknown>;
|
|
2
|
+
export declare function mixpanelGetEvents(args: Record<string, unknown>): Promise<unknown>;
|
|
3
|
+
export declare function mixpanelGetFunnels(args: Record<string, unknown>): Promise<unknown>;
|
|
4
|
+
export declare function mixpanelGetRetention(args: Record<string, unknown>): Promise<unknown>;
|
|
5
|
+
export declare function mixpanelExportData(args: Record<string, unknown>): Promise<unknown>;
|
|
6
|
+
//# sourceMappingURL=mixpanel-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixpanel-tool.d.ts","sourceRoot":"","sources":["../src/mixpanel-tool.ts"],"names":[],"mappings":"AA6DA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAexF;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAevF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAcxF;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB1F;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBxF"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// Mixpanel API integration for the UnClick MCP server.
|
|
2
|
+
// Uses the Mixpanel REST API via fetch - no external dependencies.
|
|
3
|
+
// Users must supply a Service Account username and secret from mixpanel.com/settings/service-accounts.
|
|
4
|
+
const MP_INGEST = "https://api.mixpanel.com";
|
|
5
|
+
const MP_QUERY = "https://data.mixpanel.com/api/2.0";
|
|
6
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
7
|
+
function requireCreds(args) {
|
|
8
|
+
const username = String(args.service_account_username ?? "").trim();
|
|
9
|
+
const secret = String(args.service_account_secret ?? "").trim();
|
|
10
|
+
const projectId = String(args.project_id ?? "").trim();
|
|
11
|
+
if (!username)
|
|
12
|
+
throw new Error("service_account_username is required (from mixpanel.com/settings/service-accounts).");
|
|
13
|
+
if (!secret)
|
|
14
|
+
throw new Error("service_account_secret is required.");
|
|
15
|
+
if (!projectId)
|
|
16
|
+
throw new Error("project_id is required (numeric Mixpanel project ID).");
|
|
17
|
+
return { username, secret, projectId };
|
|
18
|
+
}
|
|
19
|
+
function basicAuth(username, secret) {
|
|
20
|
+
return `Basic ${Buffer.from(`${username}:${secret}`).toString("base64")}`;
|
|
21
|
+
}
|
|
22
|
+
async function mpGet(username, secret, baseUrl, path, params) {
|
|
23
|
+
const url = new URL(`${baseUrl}${path}`);
|
|
24
|
+
Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
|
|
25
|
+
const res = await fetch(url.toString(), {
|
|
26
|
+
headers: { Authorization: basicAuth(username, secret) },
|
|
27
|
+
});
|
|
28
|
+
const text = await res.text();
|
|
29
|
+
let data;
|
|
30
|
+
try {
|
|
31
|
+
data = JSON.parse(text);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
data = text;
|
|
35
|
+
}
|
|
36
|
+
if (!res.ok) {
|
|
37
|
+
const msg = typeof data === "object" && data !== null ? (data.error ?? JSON.stringify(data)) : String(data);
|
|
38
|
+
throw new Error(`Mixpanel error (${res.status}): ${msg}`);
|
|
39
|
+
}
|
|
40
|
+
return data;
|
|
41
|
+
}
|
|
42
|
+
async function mpPost(username, secret, baseUrl, path, body) {
|
|
43
|
+
const form = new URLSearchParams(body);
|
|
44
|
+
const res = await fetch(`${baseUrl}${path}`, {
|
|
45
|
+
method: "POST",
|
|
46
|
+
headers: {
|
|
47
|
+
Authorization: basicAuth(username, secret),
|
|
48
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
49
|
+
},
|
|
50
|
+
body: form.toString(),
|
|
51
|
+
});
|
|
52
|
+
const text = await res.text();
|
|
53
|
+
let data;
|
|
54
|
+
try {
|
|
55
|
+
data = JSON.parse(text);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
data = text;
|
|
59
|
+
}
|
|
60
|
+
if (!res.ok) {
|
|
61
|
+
const msg = typeof data === "object" && data !== null ? (data.error ?? JSON.stringify(data)) : String(data);
|
|
62
|
+
throw new Error(`Mixpanel error (${res.status}): ${msg}`);
|
|
63
|
+
}
|
|
64
|
+
return data;
|
|
65
|
+
}
|
|
66
|
+
// ─── Operations ───────────────────────────────────────────────────────────────
|
|
67
|
+
export async function mixpanelTrackEvent(args) {
|
|
68
|
+
const { username, secret } = requireCreds(args);
|
|
69
|
+
const event = String(args.event ?? "").trim();
|
|
70
|
+
if (!event)
|
|
71
|
+
throw new Error("event is required (event name to track).");
|
|
72
|
+
const properties = {
|
|
73
|
+
token: String(args.token ?? ""),
|
|
74
|
+
distinct_id: String(args.distinct_id ?? "anonymous"),
|
|
75
|
+
time: Math.floor(Date.now() / 1000),
|
|
76
|
+
...(args.properties ?? {}),
|
|
77
|
+
};
|
|
78
|
+
const data = JSON.stringify([{ event, properties }]);
|
|
79
|
+
const encoded = Buffer.from(data).toString("base64");
|
|
80
|
+
return mpPost(username, secret, MP_INGEST, "/track", { data: encoded });
|
|
81
|
+
}
|
|
82
|
+
export async function mixpanelGetEvents(args) {
|
|
83
|
+
const { username, secret, projectId } = requireCreds(args);
|
|
84
|
+
const fromDate = String(args.from_date ?? new Date(Date.now() - 7 * 86400000).toISOString().split("T")[0]);
|
|
85
|
+
const toDate = String(args.to_date ?? new Date().toISOString().split("T")[0]);
|
|
86
|
+
const params = {
|
|
87
|
+
project_id: projectId,
|
|
88
|
+
from_date: fromDate,
|
|
89
|
+
to_date: toDate,
|
|
90
|
+
unit: String(args.unit ?? "day"),
|
|
91
|
+
type: String(args.type ?? "general"),
|
|
92
|
+
};
|
|
93
|
+
if (args.event)
|
|
94
|
+
params.event = JSON.stringify(Array.isArray(args.event) ? args.event : [String(args.event)]);
|
|
95
|
+
return mpGet(username, secret, MP_QUERY, "/events", params);
|
|
96
|
+
}
|
|
97
|
+
export async function mixpanelGetFunnels(args) {
|
|
98
|
+
const { username, secret, projectId } = requireCreds(args);
|
|
99
|
+
const funnelId = String(args.funnel_id ?? "").trim();
|
|
100
|
+
if (!funnelId)
|
|
101
|
+
throw new Error("funnel_id is required.");
|
|
102
|
+
const fromDate = String(args.from_date ?? new Date(Date.now() - 30 * 86400000).toISOString().split("T")[0]);
|
|
103
|
+
const toDate = String(args.to_date ?? new Date().toISOString().split("T")[0]);
|
|
104
|
+
return mpGet(username, secret, MP_QUERY, "/funnels", {
|
|
105
|
+
project_id: projectId,
|
|
106
|
+
funnel_id: funnelId,
|
|
107
|
+
from_date: fromDate,
|
|
108
|
+
to_date: toDate,
|
|
109
|
+
unit: String(args.unit ?? "day"),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
export async function mixpanelGetRetention(args) {
|
|
113
|
+
const { username, secret, projectId } = requireCreds(args);
|
|
114
|
+
const fromDate = String(args.from_date ?? new Date(Date.now() - 30 * 86400000).toISOString().split("T")[0]);
|
|
115
|
+
const toDate = String(args.to_date ?? new Date().toISOString().split("T")[0]);
|
|
116
|
+
const params = {
|
|
117
|
+
project_id: projectId,
|
|
118
|
+
from_date: fromDate,
|
|
119
|
+
to_date: toDate,
|
|
120
|
+
retention_type: String(args.retention_type ?? "birth"),
|
|
121
|
+
unit: String(args.unit ?? "day"),
|
|
122
|
+
};
|
|
123
|
+
if (args.born_event)
|
|
124
|
+
params.born_event = String(args.born_event);
|
|
125
|
+
if (args.event)
|
|
126
|
+
params.event = String(args.event);
|
|
127
|
+
return mpGet(username, secret, MP_QUERY, "/retention", params);
|
|
128
|
+
}
|
|
129
|
+
export async function mixpanelExportData(args) {
|
|
130
|
+
const { username, secret, projectId } = requireCreds(args);
|
|
131
|
+
const fromDate = String(args.from_date ?? new Date(Date.now() - 1 * 86400000).toISOString().split("T")[0]);
|
|
132
|
+
const toDate = String(args.to_date ?? new Date().toISOString().split("T")[0]);
|
|
133
|
+
const params = {
|
|
134
|
+
project_id: projectId,
|
|
135
|
+
from_date: fromDate,
|
|
136
|
+
to_date: toDate,
|
|
137
|
+
};
|
|
138
|
+
if (args.event)
|
|
139
|
+
params.event = JSON.stringify(Array.isArray(args.event) ? args.event : [String(args.event)]);
|
|
140
|
+
if (args.where)
|
|
141
|
+
params.where = String(args.where);
|
|
142
|
+
if (args.limit)
|
|
143
|
+
params.limit = String(args.limit);
|
|
144
|
+
// Export returns NDJSON - return as raw text
|
|
145
|
+
const url = new URL(`${MP_QUERY}/export`);
|
|
146
|
+
Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
|
|
147
|
+
const res = await fetch(url.toString(), {
|
|
148
|
+
headers: { Authorization: basicAuth(username, secret) },
|
|
149
|
+
});
|
|
150
|
+
if (!res.ok)
|
|
151
|
+
throw new Error(`Mixpanel export error (${res.status})`);
|
|
152
|
+
const text = await res.text();
|
|
153
|
+
const lines = text.trim().split("\n").filter(Boolean);
|
|
154
|
+
const events = lines.map((l) => { try {
|
|
155
|
+
return JSON.parse(l);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return l;
|
|
159
|
+
} });
|
|
160
|
+
return { count: events.length, from_date: fromDate, to_date: toDate, events };
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=mixpanel-tool.js.map
|