@unclick/mcp-server 0.3.0 → 0.3.1
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 +34 -13
- package/dist/abn-tool.js +1 -1
- package/dist/bgg-tool.js +1 -1
- package/dist/carboninterface-tool.js +1 -1
- package/dist/cards/card.d.ts +9 -0
- package/dist/cards/card.d.ts.map +1 -0
- package/dist/cards/card.js +4 -0
- package/dist/cards/card.js.map +1 -0
- package/dist/cards/search-memory-card.d.ts +11 -0
- package/dist/cards/search-memory-card.d.ts.map +1 -0
- package/dist/cards/search-memory-card.js +75 -0
- package/dist/cards/search-memory-card.js.map +1 -0
- package/dist/cards/search-memory-card.test.d.ts +2 -0
- package/dist/cards/search-memory-card.test.d.ts.map +1 -0
- package/dist/cards/search-memory-card.test.js +59 -0
- package/dist/cards/search-memory-card.test.js.map +1 -0
- package/dist/catalog.js +36 -36
- package/dist/catalog.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +96 -6
- package/dist/client.js.map +1 -1
- package/dist/converter-tools.js +1 -1
- package/dist/crews-tool.d.ts +12 -0
- package/dist/crews-tool.d.ts.map +1 -0
- package/dist/crews-tool.js +125 -0
- package/dist/crews-tool.js.map +1 -0
- package/dist/gdelt-tool.js +4 -4
- package/dist/hackernews-tool.js +1 -1
- package/dist/index.js +0 -0
- package/dist/line-tool.js +1 -1
- package/dist/local-catalog-handlers.js +1 -1
- package/dist/local-catalog-handlers.js.map +1 -1
- package/dist/local-tools.js +7 -7
- package/dist/local-tools.js.map +1 -1
- package/dist/memory/__tests__/bitemporal.test.d.ts +8 -0
- package/dist/memory/__tests__/bitemporal.test.d.ts.map +1 -0
- package/dist/memory/__tests__/bitemporal.test.js +148 -0
- package/dist/memory/__tests__/bitemporal.test.js.map +1 -0
- package/dist/memory/__tests__/hybrid-search.test.d.ts +14 -0
- package/dist/memory/__tests__/hybrid-search.test.d.ts.map +1 -0
- package/dist/memory/__tests__/hybrid-search.test.js +304 -0
- package/dist/memory/__tests__/hybrid-search.test.js.map +1 -0
- package/dist/memory/agent.d.ts +34 -0
- package/dist/memory/agent.d.ts.map +1 -0
- package/dist/memory/agent.js +69 -0
- package/dist/memory/agent.js.map +1 -0
- package/dist/memory/conflicts.d.ts +48 -0
- package/dist/memory/conflicts.d.ts.map +1 -0
- package/dist/memory/conflicts.js +209 -0
- package/dist/memory/conflicts.js.map +1 -0
- package/dist/memory/db.d.ts +18 -3
- package/dist/memory/db.d.ts.map +1 -1
- package/dist/memory/db.js +133 -11
- package/dist/memory/db.js.map +1 -1
- package/dist/memory/device.d.ts +20 -0
- package/dist/memory/device.d.ts.map +1 -0
- package/dist/memory/device.js +48 -0
- package/dist/memory/device.js.map +1 -0
- package/dist/memory/embeddings.d.ts +10 -0
- package/dist/memory/embeddings.d.ts.map +1 -0
- package/dist/memory/embeddings.js +40 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/handlers.d.ts.map +1 -1
- package/dist/memory/handlers.js +98 -4
- package/dist/memory/handlers.js.map +1 -1
- package/dist/memory/instrumentation.d.ts +38 -0
- package/dist/memory/instrumentation.d.ts.map +1 -0
- package/dist/memory/instrumentation.js +97 -0
- package/dist/memory/instrumentation.js.map +1 -0
- package/dist/memory/load-events.d.ts +18 -0
- package/dist/memory/load-events.d.ts.map +1 -0
- package/dist/memory/load-events.js +61 -0
- package/dist/memory/load-events.js.map +1 -0
- package/dist/memory/local.d.ts +4 -1
- package/dist/memory/local.d.ts.map +1 -1
- package/dist/memory/local.js +14 -0
- package/dist/memory/local.js.map +1 -1
- package/dist/memory/session-state.d.ts +37 -0
- package/dist/memory/session-state.d.ts.map +1 -0
- package/dist/memory/session-state.js +82 -0
- package/dist/memory/session-state.js.map +1 -0
- package/dist/memory/supabase.d.ts +75 -5
- package/dist/memory/supabase.d.ts.map +1 -1
- package/dist/memory/supabase.js +584 -83
- package/dist/memory/supabase.js.map +1 -1
- package/dist/memory/tenant-settings.d.ts +33 -0
- package/dist/memory/tenant-settings.d.ts.map +1 -0
- package/dist/memory/tenant-settings.js +79 -0
- package/dist/memory/tenant-settings.js.map +1 -0
- package/dist/memory/tool-awareness.d.ts +66 -0
- package/dist/memory/tool-awareness.d.ts.map +1 -0
- package/dist/memory/tool-awareness.js +307 -0
- package/dist/memory/tool-awareness.js.map +1 -0
- package/dist/memory/types.d.ts +18 -2
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/numbers-tool.js +2 -2
- package/dist/openfoodfacts-tool.js +1 -1
- package/dist/openmeteo-tool.js +1 -1
- package/dist/radiobrowser-tool.js +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +759 -55
- package/dist/server.js.map +1 -1
- package/dist/signals/emit.d.ts +11 -0
- package/dist/signals/emit.d.ts.map +1 -0
- package/dist/signals/emit.js +26 -0
- package/dist/signals/emit.js.map +1 -0
- package/dist/testpass-tool.d.ts +12 -0
- package/dist/testpass-tool.d.ts.map +1 -0
- package/dist/testpass-tool.js +121 -0
- package/dist/testpass-tool.js.map +1 -0
- package/dist/tool-wiring.d.ts +320 -4
- package/dist/tool-wiring.d.ts.map +1 -1
- package/dist/tool-wiring.js +246 -5
- package/dist/tool-wiring.js.map +1 -1
- package/dist/trivia-tool.js +5 -5
- package/dist/usgs-tool.js +1 -1
- package/dist/uxpass-tool.d.ts +24 -0
- package/dist/uxpass-tool.d.ts.map +1 -0
- package/dist/uxpass-tool.js +165 -0
- package/dist/uxpass-tool.js.map +1 -0
- package/dist/vault-bridge.js +7 -7
- package/dist/vercel-tool.d.ts +3 -0
- package/dist/vercel-tool.d.ts.map +1 -1
- package/dist/vercel-tool.js +198 -7
- package/dist/vercel-tool.js.map +1 -1
- package/dist/web-tools.d.ts +62 -0
- package/dist/web-tools.d.ts.map +1 -0
- package/dist/web-tools.js +271 -0
- package/dist/web-tools.js.map +1 -0
- package/package.json +6 -3
- package/server.json +1 -1
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session state tracker for the UnClick MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Records per-process state about the current MCP session so we can
|
|
5
|
+
* answer "did startup context actually get loaded, and how?". Populated
|
|
6
|
+
* by hooks in server.ts (Initialize, GetPrompt, ReadResource, CallTool)
|
|
7
|
+
* and flushed to memory_load_events by load-events.ts.
|
|
8
|
+
*/
|
|
9
|
+
function randomSessionId() {
|
|
10
|
+
return `sess_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
|
|
11
|
+
}
|
|
12
|
+
export const sessionState = {
|
|
13
|
+
sessionId: randomSessionId(),
|
|
14
|
+
clientInfo: null,
|
|
15
|
+
instructionsSent: false,
|
|
16
|
+
contextLoaded: false,
|
|
17
|
+
contextLoadMethod: null,
|
|
18
|
+
promptUsed: false,
|
|
19
|
+
resourcesRead: [],
|
|
20
|
+
firstToolCall: null,
|
|
21
|
+
toolsCalledBeforeContext: 0,
|
|
22
|
+
sessionStart: new Date(),
|
|
23
|
+
logged: false,
|
|
24
|
+
};
|
|
25
|
+
export function setClientInfo(info) {
|
|
26
|
+
if (!info)
|
|
27
|
+
return;
|
|
28
|
+
sessionState.clientInfo = {
|
|
29
|
+
name: info.name ?? "unknown",
|
|
30
|
+
version: info.version ?? "unknown",
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function setInstructionsSent(sent) {
|
|
34
|
+
sessionState.instructionsSent = sent;
|
|
35
|
+
}
|
|
36
|
+
export function markPromptUsed(name) {
|
|
37
|
+
if (name === "load-memory" || name === "load_memory") {
|
|
38
|
+
sessionState.promptUsed = true;
|
|
39
|
+
if (!sessionState.contextLoaded) {
|
|
40
|
+
sessionState.contextLoaded = true;
|
|
41
|
+
sessionState.contextLoadMethod = "prompt";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function markResourceRead(uri) {
|
|
46
|
+
if (!uri)
|
|
47
|
+
return;
|
|
48
|
+
if (!sessionState.resourcesRead.includes(uri)) {
|
|
49
|
+
sessionState.resourcesRead.push(uri);
|
|
50
|
+
}
|
|
51
|
+
if (uri.startsWith("memory://") && !sessionState.contextLoaded) {
|
|
52
|
+
sessionState.contextLoaded = true;
|
|
53
|
+
sessionState.contextLoadMethod = "resource";
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function markContextLoaded(method) {
|
|
57
|
+
if (sessionState.contextLoaded)
|
|
58
|
+
return;
|
|
59
|
+
sessionState.contextLoaded = true;
|
|
60
|
+
sessionState.contextLoadMethod = method;
|
|
61
|
+
}
|
|
62
|
+
export function recordToolCall(name) {
|
|
63
|
+
if (!sessionState.firstToolCall) {
|
|
64
|
+
sessionState.firstToolCall = name;
|
|
65
|
+
}
|
|
66
|
+
// Treat get_startup_context itself as the "loaded via tool_description" path.
|
|
67
|
+
if (name === "get_startup_context") {
|
|
68
|
+
if (!sessionState.contextLoaded) {
|
|
69
|
+
sessionState.contextLoaded = true;
|
|
70
|
+
sessionState.contextLoadMethod =
|
|
71
|
+
sessionState.contextLoadMethod ?? "tool_description";
|
|
72
|
+
}
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (!sessionState.contextLoaded) {
|
|
76
|
+
sessionState.toolsCalledBeforeContext += 1;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export function snapshotSessionState() {
|
|
80
|
+
return { ...sessionState, resourcesRead: [...sessionState.resourcesRead] };
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=session-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/memory/session-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,78 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Supabase backend for UnClick Memory.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Two tenancy modes:
|
|
5
|
+
*
|
|
6
|
+
* BYOD - data lives in the user's own Supabase project. Single-tenant
|
|
7
|
+
* tables (business_context, extracted_facts, ...) and the
|
|
8
|
+
* original RPC names. This is what the wizard (memory-admin
|
|
9
|
+
* setup) installs into a user's Supabase.
|
|
10
|
+
*
|
|
11
|
+
* managed - data lives in UnClick's central Supabase. Multi-tenant
|
|
12
|
+
* tables (mc_business_context, mc_extracted_facts, ...) where
|
|
13
|
+
* every row is tagged with api_key_hash. RPCs are mc_-prefixed
|
|
14
|
+
* and take p_api_key_hash as their first parameter. The backend
|
|
15
|
+
* is responsible for filtering / inserting api_key_hash on
|
|
16
|
+
* every operation.
|
|
6
17
|
*/
|
|
7
|
-
import type { MemoryBackend, SessionSummaryInput, FactInput, ConversationInput, CodeInput, LibraryDocInput } from "./types.js";
|
|
18
|
+
import type { MemoryBackend, SessionSummaryInput, FactInput, InvalidateFactInput, ConversationInput, CodeInput, LibraryDocInput } from "./types.js";
|
|
19
|
+
export type Tenancy = {
|
|
20
|
+
mode: "byod";
|
|
21
|
+
} | {
|
|
22
|
+
mode: "managed";
|
|
23
|
+
apiKeyHash: string;
|
|
24
|
+
};
|
|
25
|
+
export interface SupabaseBackendConfig {
|
|
26
|
+
url: string;
|
|
27
|
+
serviceRoleKey: string;
|
|
28
|
+
tenancy: Tenancy;
|
|
29
|
+
}
|
|
30
|
+
export declare const FREE_TIER_CAPS: {
|
|
31
|
+
readonly storage_bytes: number;
|
|
32
|
+
readonly facts: 5000;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Thrown when a free-tier user tries to write past their cap. The MCP
|
|
36
|
+
* handlers surface the message verbatim back to the agent so the user
|
|
37
|
+
* sees an actionable upgrade path.
|
|
38
|
+
*/
|
|
39
|
+
export declare class CapExceededError extends Error {
|
|
40
|
+
constructor(message: string);
|
|
41
|
+
}
|
|
8
42
|
export declare class SupabaseBackend implements MemoryBackend {
|
|
9
|
-
|
|
43
|
+
private client;
|
|
44
|
+
private tenancy;
|
|
45
|
+
private tables;
|
|
46
|
+
constructor(config: SupabaseBackendConfig);
|
|
47
|
+
/** Adds api_key_hash to a row in managed mode; passes through in BYOD. */
|
|
48
|
+
private withTenancy;
|
|
49
|
+
/**
|
|
50
|
+
* Enforce free-tier caps on writes. Only runs in managed cloud mode.
|
|
51
|
+
* BYOD users own their database, so caps don't apply. Pro tier (or any
|
|
52
|
+
* non-free tier) skips the check.
|
|
53
|
+
*
|
|
54
|
+
* `kind` selects which cap to check first. Storage is always verified;
|
|
55
|
+
* `kind: "fact"` additionally verifies the fact-count cap because
|
|
56
|
+
* extracted_facts has a separate row count limit.
|
|
57
|
+
*/
|
|
58
|
+
private enforceCaps;
|
|
59
|
+
/** Calls an RPC, choosing the BYOD or managed name based on tenancy. */
|
|
60
|
+
private rpc;
|
|
10
61
|
getStartupContext(numSessions: number): Promise<unknown>;
|
|
11
|
-
searchMemory(query: string, maxResults: number): Promise<unknown>;
|
|
62
|
+
searchMemory(query: string, maxResults: number, asOf?: string): Promise<unknown>;
|
|
63
|
+
/**
|
|
64
|
+
* ILIKE-based keyword fallback over mc_extracted_facts +
|
|
65
|
+
* mc_session_summaries. Used when hybrid retrieval returns []. Returns
|
|
66
|
+
* rows shaped to mirror mc_search_memory_hybrid so callers don't branch.
|
|
67
|
+
* Never widens RLS: tenant scoping via api_key_hash is preserved.
|
|
68
|
+
*
|
|
69
|
+
* Phrase support: the query is tokenized on whitespace. Tokens shorter
|
|
70
|
+
* than 2 chars or containing PostgREST .or() metacharacters are dropped.
|
|
71
|
+
* We try AND-of-tokens first (every token must appear, in any order); if
|
|
72
|
+
* that returns nothing we degrade to OR-of-tokens and rank rows by how
|
|
73
|
+
* many tokens they contain so partial matches at least surface something.
|
|
74
|
+
*/
|
|
75
|
+
private keywordFallback;
|
|
12
76
|
searchFacts(query: string): Promise<unknown>;
|
|
13
77
|
searchLibrary(query: string): Promise<unknown>;
|
|
14
78
|
getLibraryDoc(slug: string): Promise<unknown>;
|
|
@@ -19,6 +83,12 @@ export declare class SupabaseBackend implements MemoryBackend {
|
|
|
19
83
|
addFact(data: FactInput): Promise<{
|
|
20
84
|
id: string;
|
|
21
85
|
}>;
|
|
86
|
+
private embedAndStore;
|
|
87
|
+
private saveBlob;
|
|
88
|
+
private writeFactAudit;
|
|
89
|
+
invalidateFact(input: InvalidateFactInput): Promise<{
|
|
90
|
+
invalidated_at: string;
|
|
91
|
+
}>;
|
|
22
92
|
supersedeFact(oldId: string, newText: string, category?: string, confidence?: number): Promise<string>;
|
|
23
93
|
logConversation(data: ConversationInput): Promise<void>;
|
|
24
94
|
getConversationDetail(sessionId: string): Promise<unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/memory/supabase.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/memory/supabase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,SAAS,EACT,mBAAmB,EACnB,iBAAiB,EACjB,SAAS,EACT,eAAe,EAChB,MAAM,YAAY,CAAC;AAmDpB,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AA4CD,eAAO,MAAM,cAAc;;;CAGjB,CAAC;AAEX;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,eAAgB,YAAW,aAAa;IACnD,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,qBAAqB;IAkBzC,0EAA0E;IAC1E,OAAO,CAAC,WAAW;IAOnB;;;;;;;;OAQG;YACW,WAAW;IAyCzB,wEAAwE;YAC1D,GAAG;IAkBX,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBxD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkCtF;;;;;;;;;;;OAWG;YACW,eAAe;IAyFvB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS5C,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS9C,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS7C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAwBvE,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;YA8DzC,aAAa;YAcb,QAAQ;YA8ER,cAAc;IAStB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAW/E,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC;IAwBZ,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAevD,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1D,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAmBnD,kBAAkB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAcxC,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IA+BV,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IA8CxD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;CAsC1C"}
|