@unclick/mcp-server 0.2.5 → 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.
Files changed (142) hide show
  1. package/README.md +160 -139
  2. package/dist/abn-tool.js +1 -1
  3. package/dist/bgg-tool.js +1 -1
  4. package/dist/carboninterface-tool.js +1 -1
  5. package/dist/cards/card.d.ts +9 -0
  6. package/dist/cards/card.d.ts.map +1 -0
  7. package/dist/cards/card.js +4 -0
  8. package/dist/cards/card.js.map +1 -0
  9. package/dist/cards/search-memory-card.d.ts +11 -0
  10. package/dist/cards/search-memory-card.d.ts.map +1 -0
  11. package/dist/cards/search-memory-card.js +75 -0
  12. package/dist/cards/search-memory-card.js.map +1 -0
  13. package/dist/cards/search-memory-card.test.d.ts +2 -0
  14. package/dist/cards/search-memory-card.test.d.ts.map +1 -0
  15. package/dist/cards/search-memory-card.test.js +59 -0
  16. package/dist/cards/search-memory-card.test.js.map +1 -0
  17. package/dist/catalog.d.ts.map +1 -1
  18. package/dist/catalog.js +265 -4
  19. package/dist/catalog.js.map +1 -1
  20. package/dist/client.d.ts.map +1 -1
  21. package/dist/client.js +96 -6
  22. package/dist/client.js.map +1 -1
  23. package/dist/converter-tools.js +1 -1
  24. package/dist/crews-tool.d.ts +12 -0
  25. package/dist/crews-tool.d.ts.map +1 -0
  26. package/dist/crews-tool.js +125 -0
  27. package/dist/crews-tool.js.map +1 -0
  28. package/dist/gdelt-tool.js +4 -4
  29. package/dist/hackernews-tool.js +1 -1
  30. package/dist/index.js +0 -0
  31. package/dist/keychain-secure-input.js +42 -42
  32. package/dist/line-tool.js +1 -1
  33. package/dist/linear-tool.js +73 -73
  34. package/dist/local-catalog-handlers.js +1 -1
  35. package/dist/local-catalog-handlers.js.map +1 -1
  36. package/dist/local-tools.js +7 -7
  37. package/dist/local-tools.js.map +1 -1
  38. package/dist/memory/__tests__/bitemporal.test.d.ts +8 -0
  39. package/dist/memory/__tests__/bitemporal.test.d.ts.map +1 -0
  40. package/dist/memory/__tests__/bitemporal.test.js +148 -0
  41. package/dist/memory/__tests__/bitemporal.test.js.map +1 -0
  42. package/dist/memory/__tests__/hybrid-search.test.d.ts +14 -0
  43. package/dist/memory/__tests__/hybrid-search.test.d.ts.map +1 -0
  44. package/dist/memory/__tests__/hybrid-search.test.js +304 -0
  45. package/dist/memory/__tests__/hybrid-search.test.js.map +1 -0
  46. package/dist/memory/agent.d.ts +34 -0
  47. package/dist/memory/agent.d.ts.map +1 -0
  48. package/dist/memory/agent.js +69 -0
  49. package/dist/memory/agent.js.map +1 -0
  50. package/dist/memory/conflicts.d.ts +48 -0
  51. package/dist/memory/conflicts.d.ts.map +1 -0
  52. package/dist/memory/conflicts.js +209 -0
  53. package/dist/memory/conflicts.js.map +1 -0
  54. package/dist/memory/db.d.ts +25 -0
  55. package/dist/memory/db.d.ts.map +1 -0
  56. package/dist/memory/db.js +144 -0
  57. package/dist/memory/db.js.map +1 -0
  58. package/dist/memory/device.d.ts +20 -0
  59. package/dist/memory/device.d.ts.map +1 -0
  60. package/dist/memory/device.js +48 -0
  61. package/dist/memory/device.js.map +1 -0
  62. package/dist/memory/embeddings.d.ts +10 -0
  63. package/dist/memory/embeddings.d.ts.map +1 -0
  64. package/dist/memory/embeddings.js +40 -0
  65. package/dist/memory/embeddings.js.map +1 -0
  66. package/dist/memory/handlers.d.ts +11 -0
  67. package/dist/memory/handlers.d.ts.map +1 -0
  68. package/dist/memory/handlers.js +219 -0
  69. package/dist/memory/handlers.js.map +1 -0
  70. package/dist/memory/instrumentation.d.ts +38 -0
  71. package/dist/memory/instrumentation.d.ts.map +1 -0
  72. package/dist/memory/instrumentation.js +97 -0
  73. package/dist/memory/instrumentation.js.map +1 -0
  74. package/dist/memory/load-events.d.ts +18 -0
  75. package/dist/memory/load-events.d.ts.map +1 -0
  76. package/dist/memory/load-events.js +61 -0
  77. package/dist/memory/load-events.js.map +1 -0
  78. package/dist/memory/local.d.ts +40 -0
  79. package/dist/memory/local.d.ts.map +1 -0
  80. package/dist/memory/local.js +400 -0
  81. package/dist/memory/local.js.map +1 -0
  82. package/dist/memory/session-state.d.ts +37 -0
  83. package/dist/memory/session-state.d.ts.map +1 -0
  84. package/dist/memory/session-state.js +82 -0
  85. package/dist/memory/session-state.js.map +1 -0
  86. package/dist/memory/supabase.d.ts +104 -0
  87. package/dist/memory/supabase.d.ts.map +1 -0
  88. package/dist/memory/supabase.js +710 -0
  89. package/dist/memory/supabase.js.map +1 -0
  90. package/dist/memory/tenant-settings.d.ts +33 -0
  91. package/dist/memory/tenant-settings.d.ts.map +1 -0
  92. package/dist/memory/tenant-settings.js +79 -0
  93. package/dist/memory/tenant-settings.js.map +1 -0
  94. package/dist/memory/tool-awareness.d.ts +66 -0
  95. package/dist/memory/tool-awareness.d.ts.map +1 -0
  96. package/dist/memory/tool-awareness.js +307 -0
  97. package/dist/memory/tool-awareness.js.map +1 -0
  98. package/dist/memory/types.d.ts +97 -0
  99. package/dist/memory/types.d.ts.map +1 -0
  100. package/dist/memory/types.js +5 -0
  101. package/dist/memory/types.js.map +1 -0
  102. package/dist/monday-tool.js +46 -46
  103. package/dist/musicbrainz-tool.js +1 -1
  104. package/dist/musicbrainz-tool.js.map +1 -1
  105. package/dist/numbers-tool.js +2 -2
  106. package/dist/openfoodfacts-tool.js +1 -1
  107. package/dist/openmeteo-tool.js +1 -1
  108. package/dist/radiobrowser-tool.js +2 -2
  109. package/dist/server.d.ts.map +1 -1
  110. package/dist/server.js +838 -15
  111. package/dist/server.js.map +1 -1
  112. package/dist/signals/emit.d.ts +11 -0
  113. package/dist/signals/emit.d.ts.map +1 -0
  114. package/dist/signals/emit.js +26 -0
  115. package/dist/signals/emit.js.map +1 -0
  116. package/dist/testpass-tool.d.ts +12 -0
  117. package/dist/testpass-tool.d.ts.map +1 -0
  118. package/dist/testpass-tool.js +121 -0
  119. package/dist/testpass-tool.js.map +1 -0
  120. package/dist/toilets-tool.js +2 -2
  121. package/dist/tool-wiring.d.ts +320 -4
  122. package/dist/tool-wiring.d.ts.map +1 -1
  123. package/dist/tool-wiring.js +246 -5
  124. package/dist/tool-wiring.js.map +1 -1
  125. package/dist/trivia-tool.js +5 -5
  126. package/dist/usgs-tool.js +1 -1
  127. package/dist/uxpass-tool.d.ts +24 -0
  128. package/dist/uxpass-tool.d.ts.map +1 -0
  129. package/dist/uxpass-tool.js +165 -0
  130. package/dist/uxpass-tool.js.map +1 -0
  131. package/dist/vault-bridge.js +7 -7
  132. package/dist/vercel-tool.d.ts +3 -0
  133. package/dist/vercel-tool.d.ts.map +1 -1
  134. package/dist/vercel-tool.js +198 -7
  135. package/dist/vercel-tool.js.map +1 -1
  136. package/dist/web-tools.d.ts +62 -0
  137. package/dist/web-tools.d.ts.map +1 -0
  138. package/dist/web-tools.js +271 -0
  139. package/dist/web-tools.js.map +1 -0
  140. package/package.json +69 -65
  141. package/public/icon.svg +15 -15
  142. package/server.json +37 -37
@@ -0,0 +1,97 @@
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
+ valid_from?: string;
19
+ extractor_id?: string;
20
+ prompt_version?: string;
21
+ model_id?: string;
22
+ preserve_as_blob?: boolean;
23
+ commit_sha?: string;
24
+ pr_number?: number;
25
+ }
26
+ export interface InvalidateFactInput {
27
+ fact_id: string;
28
+ reason?: string;
29
+ session_id?: string;
30
+ }
31
+ export interface ConversationInput {
32
+ session_id: string;
33
+ role: string;
34
+ content: string;
35
+ has_code: boolean;
36
+ }
37
+ export interface CodeInput {
38
+ session_id: string;
39
+ language: string;
40
+ filename?: string;
41
+ content: string;
42
+ description?: string;
43
+ }
44
+ export interface LibraryDocInput {
45
+ slug: string;
46
+ title: string;
47
+ category: string;
48
+ content: string;
49
+ tags: string[];
50
+ }
51
+ export interface MemoryBackend {
52
+ /** Load startup context (business context + recent sessions + hot facts). */
53
+ getStartupContext(numSessions: number): Promise<unknown>;
54
+ /** Full-text / hybrid search across facts and session summaries. */
55
+ searchMemory(query: string, maxResults: number, asOf?: string): Promise<unknown>;
56
+ /** Search extracted facts. */
57
+ searchFacts(query: string): Promise<unknown>;
58
+ /** Search knowledge library. */
59
+ searchLibrary(query: string): Promise<unknown>;
60
+ /** Get a specific library doc by slug. */
61
+ getLibraryDoc(slug: string): Promise<unknown>;
62
+ /** List all library documents. */
63
+ listLibrary(): Promise<unknown>;
64
+ /** Write end-of-session summary. */
65
+ writeSessionSummary(data: SessionSummaryInput): Promise<{
66
+ id: string;
67
+ }>;
68
+ /** Add an extracted fact. */
69
+ addFact(data: FactInput): Promise<{
70
+ id: string;
71
+ }>;
72
+ /** Replace a fact with a new version. */
73
+ supersedeFact(oldId: string, newText: string, category?: string, confidence?: number): Promise<string>;
74
+ /** Log a conversation message. */
75
+ logConversation(data: ConversationInput): Promise<void>;
76
+ /** Get full conversation log for a session. */
77
+ getConversationDetail(sessionId: string): Promise<unknown>;
78
+ /** Store a code block. */
79
+ storeCode(data: CodeInput): Promise<{
80
+ id: string;
81
+ }>;
82
+ /** Get all business context entries. */
83
+ getBusinessContext(): Promise<unknown[]>;
84
+ /** Set or update a business context entry. */
85
+ setBusinessContext(category: string, key: string, value: unknown, priority?: number): Promise<void>;
86
+ /** Create or update a knowledge library doc. */
87
+ upsertLibraryDoc(data: LibraryDocInput): Promise<string>;
88
+ /** Run memory decay management. */
89
+ manageDecay(): Promise<unknown>;
90
+ /** Get memory usage stats. */
91
+ getMemoryStatus(): Promise<unknown>;
92
+ /** Mark a fact as invalidated (does not delete it). Writes an audit row. */
93
+ invalidateFact(input: InvalidateFactInput): Promise<{
94
+ invalidated_at: string;
95
+ }>;
96
+ }
97
+ //# 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,5 @@
1
+ /**
2
+ * Shared types for UnClick Memory backends (local + Supabase).
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -39,13 +39,13 @@ export async function listMondayBoards(args) {
39
39
  try {
40
40
  const apiKey = getApiKey(args);
41
41
  const limit = Number(args.limit ?? 25);
42
- const query = `
43
- query($limit: Int) {
44
- boards(limit: $limit) {
45
- id name description state board_kind
46
- columns { id title type }
47
- }
48
- }
42
+ const query = `
43
+ query($limit: Int) {
44
+ boards(limit: $limit) {
45
+ id name description state board_kind
46
+ columns { id title type }
47
+ }
48
+ }
49
49
  `;
50
50
  const data = await mondayQuery(apiKey, query, { limit });
51
51
  const boards = (data.boards ?? []);
@@ -62,14 +62,14 @@ export async function getMondayBoard(args) {
62
62
  const boardId = String(args.board_id ?? "").trim();
63
63
  if (!boardId)
64
64
  return { error: "board_id is required." };
65
- const query = `
66
- query($ids: [ID!]) {
67
- boards(ids: $ids) {
68
- id name description state board_kind
69
- columns { id title type }
70
- groups { id title color }
71
- }
72
- }
65
+ const query = `
66
+ query($ids: [ID!]) {
67
+ boards(ids: $ids) {
68
+ id name description state board_kind
69
+ columns { id title type }
70
+ groups { id title color }
71
+ }
72
+ }
73
73
  `;
74
74
  const data = await mondayQuery(apiKey, query, { ids: [boardId] });
75
75
  const boards = (data.boards ?? []);
@@ -87,18 +87,18 @@ export async function listMondayItems(args) {
87
87
  if (!boardId)
88
88
  return { error: "board_id is required." };
89
89
  const limit = Number(args.limit ?? 50);
90
- const query = `
91
- query($ids: [ID!], $limit: Int) {
92
- boards(ids: $ids) {
93
- items_page(limit: $limit) {
94
- items {
95
- id name state created_at updated_at
96
- column_values { id text value }
97
- group { id title }
98
- }
99
- }
100
- }
101
- }
90
+ const query = `
91
+ query($ids: [ID!], $limit: Int) {
92
+ boards(ids: $ids) {
93
+ items_page(limit: $limit) {
94
+ items {
95
+ id name state created_at updated_at
96
+ column_values { id text value }
97
+ group { id title }
98
+ }
99
+ }
100
+ }
101
+ }
102
102
  `;
103
103
  const data = await mondayQuery(apiKey, query, { ids: [boardId], limit });
104
104
  const boards = (data.boards ?? []);
@@ -120,12 +120,12 @@ export async function createMondayItem(args) {
120
120
  const itemName = String(args.item_name ?? "").trim();
121
121
  if (!itemName)
122
122
  return { error: "item_name is required." };
123
- const mutation = `
124
- mutation($board_id: ID!, $item_name: String!, $group_id: String, $column_values: JSON) {
125
- create_item(board_id: $board_id, item_name: $item_name, group_id: $group_id, column_values: $column_values) {
126
- id name state created_at
127
- }
128
- }
123
+ const mutation = `
124
+ mutation($board_id: ID!, $item_name: String!, $group_id: String, $column_values: JSON) {
125
+ create_item(board_id: $board_id, item_name: $item_name, group_id: $group_id, column_values: $column_values) {
126
+ id name state created_at
127
+ }
128
+ }
129
129
  `;
130
130
  const variables = { board_id: boardId, item_name: itemName };
131
131
  if (args.group_id)
@@ -157,12 +157,12 @@ export async function updateMondayItem(args) {
157
157
  const value = args.value;
158
158
  if (value === undefined)
159
159
  return { error: "value is required." };
160
- const mutation = `
161
- mutation($board_id: ID!, $item_id: ID!, $column_id: String!, $value: JSON!) {
162
- change_column_value(board_id: $board_id, item_id: $item_id, column_id: $column_id, value: $value) {
163
- id name
164
- }
165
- }
160
+ const mutation = `
161
+ mutation($board_id: ID!, $item_id: ID!, $column_id: String!, $value: JSON!) {
162
+ change_column_value(board_id: $board_id, item_id: $item_id, column_id: $column_id, value: $value) {
163
+ id name
164
+ }
165
+ }
166
166
  `;
167
167
  const data = await mondayQuery(apiKey, mutation, {
168
168
  board_id: boardId,
@@ -187,13 +187,13 @@ export async function searchMondayItems(args) {
187
187
  if (!query_text)
188
188
  return { error: "query is required." };
189
189
  const limit = Number(args.limit ?? 25);
190
- const query = `
191
- query($board_id: ID!, $query: String!, $limit: Int) {
192
- items_by_multiple_column_values(board_id: $board_id, limit: $limit, column_id: "name", column_values: [$query]) {
193
- id name state created_at updated_at
194
- column_values { id text value }
195
- }
196
- }
190
+ const query = `
191
+ query($board_id: ID!, $query: String!, $limit: Int) {
192
+ items_by_multiple_column_values(board_id: $board_id, limit: $limit, column_id: "name", column_values: [$query]) {
193
+ id name state created_at updated_at
194
+ column_values { id text value }
195
+ }
196
+ }
197
197
  `;
198
198
  const data = await mondayQuery(apiKey, query, { board_id: boardId, query: query_text, limit });
199
199
  const items = (data.items_by_multiple_column_values ?? []);
@@ -2,7 +2,7 @@
2
2
  // Uses the MusicBrainz REST API via fetch - no external dependencies.
3
3
  // No auth required. Identifies with a User-Agent header as required by MusicBrainz policy.
4
4
  const MB_BASE = "https://musicbrainz.org/ws/2";
5
- const MB_USER_AGENT = "UnClick/1.0 (creativelead@malamutemayhem.com)";
5
+ const MB_USER_AGENT = "UnClick/1.0 (support@unclick.world)";
6
6
  // ─── API helper ───────────────────────────────────────────────────────────────
7
7
  async function mbCall(path, params = {}) {
8
8
  const url = new URL(`${MB_BASE}${path}`);
@@ -1 +1 @@
1
- {"version":3,"file":"musicbrainz-tool.js","sourceRoot":"","sources":["../src/musicbrainz-tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"musicbrainz-tool.js","sourceRoot":"","sources":["../src/musicbrainz-tool.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- // Numbers API integration interesting facts about numbers, dates, and years.
2
- // No authentication required completely free and open.
1
+ // Numbers API integration - interesting facts about numbers, dates, and years.
2
+ // No authentication required - completely free and open.
3
3
  // Base URL: http://numbersapi.com/
4
4
  const NUMBERS_BASE = "http://numbersapi.com";
5
5
  const VALID_TYPES = ["trivia", "math", "date", "year"];
@@ -1,5 +1,5 @@
1
1
  // ─── Open Food Facts Product Database ────────────────────────────────────────
2
- // Free, open-source food product database no auth required.
2
+ // Free, open-source food product database - no auth required.
3
3
  // Docs: https://wiki.openfoodfacts.org/API
4
4
  const OFF_BASE = "https://world.openfoodfacts.org";
5
5
  // ─── API helper ──────────────────────────────────────────────────────────────
@@ -1,5 +1,5 @@
1
1
  // Open-Meteo weather API integration.
2
- // No authentication required completely free and open.
2
+ // No authentication required - completely free and open.
3
3
  // Base URL: https://api.open-meteo.com/v1/
4
4
  // Geocoding: https://geocoding-api.open-meteo.com/v1/search
5
5
  const WEATHER_BASE = "https://api.open-meteo.com/v1";
@@ -1,5 +1,5 @@
1
- // Radio Browser API integration 50,000+ internet radio stations worldwide.
2
- // No authentication required completely free and open.
1
+ // Radio Browser API integration - 50,000+ internet radio stations worldwide.
2
+ // No authentication required - completely free and open.
3
3
  // Base URL: https://de1.api.radio-browser.info/json/
4
4
  const RADIO_BASE = "https://de1.api.radio-browser.info/json";
5
5
  // ─── API helper ───────────────────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AA6fnE,wBAAgB,YAAY,IAAI,MAAM,CAuNrC;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAMjD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AA6lCnE,wBAAgB,YAAY,IAAI,MAAM,CAqdrC;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAMjD"}