@qikdev/mcp 6.7.2 → 6.7.6
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/build/src/tools/content.d.ts +29 -0
- package/build/src/tools/content.d.ts.map +1 -0
- package/build/src/tools/content.js +153 -0
- package/build/src/tools/content.js.map +1 -0
- package/build/src/tools/create.d.ts.map +1 -1
- package/build/src/tools/create.js +48 -634
- package/build/src/tools/create.js.map +1 -1
- package/build/src/tools/duplicates.d.ts +27 -0
- package/build/src/tools/duplicates.d.ts.map +1 -0
- package/build/src/tools/duplicates.js +142 -0
- package/build/src/tools/duplicates.js.map +1 -0
- package/build/src/tools/index.d.ts.map +1 -1
- package/build/src/tools/index.js +66 -0
- package/build/src/tools/index.js.map +1 -1
- package/build/src/tools/list.d.ts.map +1 -1
- package/build/src/tools/list.js +79 -323
- package/build/src/tools/list.js.map +1 -1
- package/build/src/tools/merge.d.ts +34 -0
- package/build/src/tools/merge.d.ts.map +1 -0
- package/build/src/tools/merge.js +192 -0
- package/build/src/tools/merge.js.map +1 -0
- package/build/src/tools/profile-access.d.ts +47 -0
- package/build/src/tools/profile-access.d.ts.map +1 -0
- package/build/src/tools/profile-access.js +264 -0
- package/build/src/tools/profile-access.js.map +1 -0
- package/build/src/tools/profile-relationships.d.ts +43 -0
- package/build/src/tools/profile-relationships.d.ts.map +1 -0
- package/build/src/tools/profile-relationships.js +270 -0
- package/build/src/tools/profile-relationships.js.map +1 -0
- package/build/src/tools/scope.d.ts +47 -0
- package/build/src/tools/scope.d.ts.map +1 -0
- package/build/src/tools/scope.js +263 -0
- package/build/src/tools/scope.js.map +1 -0
- package/build/src/tools/search.d.ts +19 -0
- package/build/src/tools/search.d.ts.map +1 -0
- package/build/src/tools/search.js +84 -0
- package/build/src/tools/search.js.map +1 -0
- package/build/src/tools/smartlist.d.ts +26 -0
- package/build/src/tools/smartlist.d.ts.map +1 -0
- package/build/src/tools/smartlist.js +126 -0
- package/build/src/tools/smartlist.js.map +1 -0
- package/build/src/tools/update.d.ts.map +1 -1
- package/build/src/tools/update.js +44 -345
- package/build/src/tools/update.js.map +1 -1
- package/package.json +2 -2
package/build/src/tools/list.js
CHANGED
|
@@ -3,133 +3,102 @@ export const listContentTool = {
|
|
|
3
3
|
name: "list_content",
|
|
4
4
|
description: `Query and filter content in Qik's database.
|
|
5
5
|
|
|
6
|
-
**
|
|
7
|
-
1. Use \`search_content_types\` first if you're unsure about the typeKey
|
|
8
|
-
2. Use \`get_content_type_details\` to understand available fields
|
|
9
|
-
3. Use \`get_filter_comparators\` to understand filter syntax
|
|
10
|
-
4. Use \`get_entity_relationships\` to understand how entities connect
|
|
6
|
+
**Endpoint:** POST /content/:typeKey/list
|
|
11
7
|
|
|
12
|
-
**
|
|
8
|
+
**Required:**
|
|
9
|
+
- typeKey: The content type key (e.g., 'article', 'profile', 'checkin')
|
|
10
|
+
|
|
11
|
+
**Request Body Structure:**
|
|
13
12
|
\`\`\`json
|
|
14
13
|
{
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
]
|
|
14
|
+
"search": "keywords",
|
|
15
|
+
"sort": { "key": "fieldPath", "direction": "asc|desc", "type": "string|number|date" },
|
|
16
|
+
"page": { "size": 20, "index": 1 },
|
|
17
|
+
"select": ["_id", "title", "meta.created"],
|
|
18
|
+
"filter": {
|
|
19
|
+
"operator": "and|or|nor",
|
|
20
|
+
"filters": [
|
|
21
|
+
{ "key": "fieldPath", "comparator": "equal", "value": "someValue" }
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
"date": { "startDate": "ISO", "endDate": "ISO", "timezone": "UTC" },
|
|
25
|
+
"rolodexPrimary": "A",
|
|
26
|
+
"rolodexSecondary": "B"
|
|
19
27
|
}
|
|
20
28
|
\`\`\`
|
|
21
29
|
|
|
22
|
-
**
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
- Has email: { "key": "emails", "comparator": "notempty" }
|
|
30
|
+
**Common Comparators:**
|
|
31
|
+
- Text: equal, notequal, contains, startswith, endswith
|
|
32
|
+
- Number: greater, lesser, between (uses value2)
|
|
33
|
+
- Date: datetoday, datebetween, datenext, datepast
|
|
34
|
+
- Anniversary: anniversarynext (for birthdays)
|
|
35
|
+
- Collection: empty, notempty, in (uses values array), notin
|
|
29
36
|
|
|
30
|
-
|
|
31
|
-
- typeKey: "checkin"
|
|
32
|
-
- Filter by event: { "key": "event", "comparator": "equal", "value": "EVENT_ID" }
|
|
33
|
-
- Filter by date: { "key": "checkinDate", "comparator": "datebetween", "value": "START", "value2": "END" }
|
|
37
|
+
**Examples:**
|
|
34
38
|
|
|
35
|
-
*
|
|
36
|
-
|
|
37
|
-
|
|
39
|
+
*List profiles with email:*
|
|
40
|
+
\`\`\`json
|
|
41
|
+
{
|
|
42
|
+
"typeKey": "profile",
|
|
43
|
+
"filter": {
|
|
44
|
+
"operator": "and",
|
|
45
|
+
"filters": [{ "key": "emails", "comparator": "notempty" }]
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
\`\`\`
|
|
38
49
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
50
|
+
*List checkins for an event:*
|
|
51
|
+
\`\`\`json
|
|
52
|
+
{
|
|
53
|
+
"typeKey": "checkin",
|
|
54
|
+
"filter": {
|
|
55
|
+
"operator": "and",
|
|
56
|
+
"filters": [{ "key": "event", "comparator": "equal", "value": "EVENT_ID" }]
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
\`\`\``,
|
|
45
60
|
inputSchema: {
|
|
46
61
|
type: "object",
|
|
47
62
|
properties: {
|
|
48
63
|
typeKey: {
|
|
49
64
|
type: "string",
|
|
50
|
-
description: "The content type key
|
|
65
|
+
description: "The content type key (e.g., 'article', 'profile', 'checkin')"
|
|
51
66
|
},
|
|
52
67
|
search: {
|
|
53
68
|
type: "string",
|
|
54
|
-
description: "Keywords to search
|
|
69
|
+
description: "Keywords to search within content"
|
|
55
70
|
},
|
|
56
71
|
filter: {
|
|
57
72
|
type: "object",
|
|
58
|
-
description: "
|
|
59
|
-
properties: {
|
|
60
|
-
operator: { type: "string", enum: ["and", "or", "nor"], description: "Logic operator for combining filters" },
|
|
61
|
-
filters: {
|
|
62
|
-
type: "array",
|
|
63
|
-
description: "Array of filter conditions or nested filter groups",
|
|
64
|
-
items: {
|
|
65
|
-
oneOf: [
|
|
66
|
-
{
|
|
67
|
-
type: "object",
|
|
68
|
-
properties: {
|
|
69
|
-
key: { type: "string", description: "Field path to filter on (e.g., 'title', 'meta.created')" },
|
|
70
|
-
comparator: { type: "string", description: "Filter operator (equal, contains, greater, dateafter, etc.)" },
|
|
71
|
-
value: { description: "Primary filter value" },
|
|
72
|
-
value2: { description: "Secondary filter value (for between, range operations)" },
|
|
73
|
-
values: { type: "array", description: "Array of values (for in, notin operations)" }
|
|
74
|
-
},
|
|
75
|
-
required: ["key", "comparator"]
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
type: "object",
|
|
79
|
-
properties: {
|
|
80
|
-
operator: { type: "string", enum: ["and", "or", "nor"] },
|
|
81
|
-
filters: { type: "array" }
|
|
82
|
-
},
|
|
83
|
-
required: ["operator", "filters"]
|
|
84
|
-
}
|
|
85
|
-
]
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
},
|
|
89
|
-
required: ["operator", "filters"]
|
|
73
|
+
description: "Filter criteria with nested AND/OR/NOR logic"
|
|
90
74
|
},
|
|
91
75
|
sort: {
|
|
92
76
|
type: "object",
|
|
93
|
-
description: "Sorting
|
|
94
|
-
properties: {
|
|
95
|
-
key: { type: "string", description: "Field to sort by" },
|
|
96
|
-
direction: { type: "string", enum: ["asc", "desc"], description: "Sort direction" },
|
|
97
|
-
type: { type: "string", description: "Data type for sorting (string, number, date)" }
|
|
98
|
-
}
|
|
77
|
+
description: "Sorting: { key, direction, type }"
|
|
99
78
|
},
|
|
100
79
|
page: {
|
|
101
80
|
type: "object",
|
|
102
|
-
description: "Pagination
|
|
103
|
-
properties: {
|
|
104
|
-
size: { type: "number", description: "Number of items per page (default: 20)" },
|
|
105
|
-
index: { type: "number", description: "Page number (1-based, default: 1)" }
|
|
106
|
-
}
|
|
81
|
+
description: "Pagination: { size, index }"
|
|
107
82
|
},
|
|
108
83
|
select: {
|
|
109
84
|
type: "array",
|
|
110
|
-
|
|
111
|
-
|
|
85
|
+
items: { type: "string" },
|
|
86
|
+
description: "Fields to return"
|
|
112
87
|
},
|
|
113
88
|
date: {
|
|
114
89
|
type: "object",
|
|
115
|
-
description: "Date range
|
|
116
|
-
properties: {
|
|
117
|
-
startDate: { type: "string", description: "Start date (ISO string or natural language like 'last week')" },
|
|
118
|
-
endDate: { type: "string", description: "End date (ISO string or natural language like 'today')" },
|
|
119
|
-
timezone: { type: "string", description: "Timezone for date filtering (default: user's timezone)" }
|
|
120
|
-
}
|
|
90
|
+
description: "Date range: { startDate, endDate, timezone }"
|
|
121
91
|
},
|
|
122
92
|
rolodexPrimary: {
|
|
123
93
|
type: "string",
|
|
124
|
-
description: "Letter for primary alphabetical filtering
|
|
94
|
+
description: "Letter for primary alphabetical filtering"
|
|
125
95
|
},
|
|
126
96
|
rolodexSecondary: {
|
|
127
97
|
type: "string",
|
|
128
98
|
description: "Letter for secondary alphabetical filtering"
|
|
129
99
|
}
|
|
130
100
|
},
|
|
131
|
-
required: ["typeKey"]
|
|
132
|
-
additionalProperties: false
|
|
101
|
+
required: ["typeKey"]
|
|
133
102
|
},
|
|
134
103
|
};
|
|
135
104
|
export async function handleListContent(args) {
|
|
@@ -139,250 +108,37 @@ export async function handleListContent(args) {
|
|
|
139
108
|
if (!config) {
|
|
140
109
|
throw new Error('Qik MCP server not configured. Run setup first.');
|
|
141
110
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
return createErrorResponse(`I couldn't find a content type matching "${args.typeKey}". Please check available types using get_glossary.`);
|
|
111
|
+
const { typeKey, ...payload } = args;
|
|
112
|
+
if (!typeKey) {
|
|
113
|
+
throw new Error('typeKey is required');
|
|
146
114
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
catch (error) {
|
|
155
|
-
return createErrorResponse(`Failed to list content: ${error.message}`);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
// Find content type from natural language (reuse from create tool)
|
|
159
|
-
async function findContentTypeFromNaturalLanguage(config, naturalLanguage) {
|
|
160
|
-
// Get the glossary index
|
|
161
|
-
const indexResponse = await fetch(`${config.apiUrl || 'https://api.qik.dev'}/glossary/ai`, {
|
|
162
|
-
headers: {
|
|
163
|
-
'Authorization': `Bearer ${config.accessToken}`,
|
|
164
|
-
'Content-Type': 'application/json',
|
|
165
|
-
},
|
|
166
|
-
});
|
|
167
|
-
if (!indexResponse.ok) {
|
|
168
|
-
throw new Error(`Failed to fetch glossary: HTTP ${indexResponse.status}`);
|
|
169
|
-
}
|
|
170
|
-
const glossary = await indexResponse.json();
|
|
171
|
-
// Find matching content type
|
|
172
|
-
const searchTerm = naturalLanguage.toLowerCase().trim();
|
|
173
|
-
let matchedType = null;
|
|
174
|
-
// Try exact key match first
|
|
175
|
-
matchedType = glossary.find(ct => ct.key === searchTerm);
|
|
176
|
-
// Try fuzzy matching on title, plural, and key
|
|
177
|
-
if (!matchedType) {
|
|
178
|
-
matchedType = glossary.find(ct => {
|
|
179
|
-
const title = (ct.title || '').toLowerCase();
|
|
180
|
-
const plural = (ct.plural || '').toLowerCase();
|
|
181
|
-
const key = (ct.key || '').toLowerCase();
|
|
182
|
-
return title.includes(searchTerm) ||
|
|
183
|
-
plural.includes(searchTerm) ||
|
|
184
|
-
key.includes(searchTerm) ||
|
|
185
|
-
searchTerm.includes(title) ||
|
|
186
|
-
searchTerm.includes(plural) ||
|
|
187
|
-
searchTerm.includes(key);
|
|
115
|
+
const response = await fetch(`${config.apiUrl || 'https://api.qik.dev'}/content/${typeKey}/list`, {
|
|
116
|
+
method: 'POST',
|
|
117
|
+
headers: {
|
|
118
|
+
'Authorization': `Bearer ${config.accessToken}`,
|
|
119
|
+
'Content-Type': 'application/json',
|
|
120
|
+
},
|
|
121
|
+
body: JSON.stringify(payload)
|
|
188
122
|
});
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
}
|
|
193
|
-
// Return basic content type info (we don't need full details for listing)
|
|
194
|
-
return {
|
|
195
|
-
key: matchedType.key,
|
|
196
|
-
title: matchedType.title,
|
|
197
|
-
plural: matchedType.plural,
|
|
198
|
-
definesType: matchedType.definesType,
|
|
199
|
-
urls: matchedType.urls
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
// Build the complete list request payload
|
|
203
|
-
async function buildListRequest(args, contentType) {
|
|
204
|
-
const request = {};
|
|
205
|
-
// Search keywords
|
|
206
|
-
if (args.search) {
|
|
207
|
-
request.search = args.search;
|
|
208
|
-
}
|
|
209
|
-
// Sorting
|
|
210
|
-
if (args.sort) {
|
|
211
|
-
request.sort = {
|
|
212
|
-
key: args.sort.key,
|
|
213
|
-
direction: args.sort.direction || 'desc',
|
|
214
|
-
type: args.sort.type || 'string'
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
else {
|
|
218
|
-
// Default sorting by creation date, newest first
|
|
219
|
-
request.sort = {
|
|
220
|
-
key: 'meta.created',
|
|
221
|
-
direction: 'desc',
|
|
222
|
-
type: 'date'
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
// Pagination
|
|
226
|
-
request.page = {
|
|
227
|
-
size: args.page?.size || 20,
|
|
228
|
-
index: args.page?.index || 1
|
|
229
|
-
};
|
|
230
|
-
// Field selection
|
|
231
|
-
if (args.select && Array.isArray(args.select)) {
|
|
232
|
-
request.select = args.select;
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
// Default fields to return
|
|
236
|
-
request.select = [
|
|
237
|
-
'_id',
|
|
238
|
-
'title',
|
|
239
|
-
'meta.created',
|
|
240
|
-
'meta.updated',
|
|
241
|
-
'meta.status',
|
|
242
|
-
'meta.scopes'
|
|
243
|
-
];
|
|
244
|
-
}
|
|
245
|
-
// Complex filters
|
|
246
|
-
if (args.filter) {
|
|
247
|
-
request.filter = args.filter;
|
|
248
|
-
}
|
|
249
|
-
// Date range filtering
|
|
250
|
-
if (args.date) {
|
|
251
|
-
const dateFilter = await buildDateFilter(args.date);
|
|
252
|
-
if (dateFilter) {
|
|
253
|
-
request.date = dateFilter;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
// Rolodex filtering
|
|
257
|
-
if (args.rolodexPrimary) {
|
|
258
|
-
request.rolodexPrimary = args.rolodexPrimary.toUpperCase();
|
|
259
|
-
}
|
|
260
|
-
if (args.rolodexSecondary) {
|
|
261
|
-
request.rolodexSecondary = args.rolodexSecondary.toUpperCase();
|
|
262
|
-
}
|
|
263
|
-
return request;
|
|
264
|
-
}
|
|
265
|
-
// Build date filter from natural language or ISO strings
|
|
266
|
-
async function buildDateFilter(dateRange) {
|
|
267
|
-
try {
|
|
268
|
-
let startDate;
|
|
269
|
-
let endDate;
|
|
270
|
-
const timezone = dateRange.timezone || 'UTC';
|
|
271
|
-
// Parse start date
|
|
272
|
-
if (dateRange.startDate) {
|
|
273
|
-
startDate = parseNaturalDate(dateRange.startDate);
|
|
274
|
-
}
|
|
275
|
-
else {
|
|
276
|
-
// Default to 30 days ago
|
|
277
|
-
startDate = new Date();
|
|
278
|
-
startDate.setDate(startDate.getDate() - 30);
|
|
279
|
-
}
|
|
280
|
-
// Parse end date
|
|
281
|
-
if (dateRange.endDate) {
|
|
282
|
-
endDate = parseNaturalDate(dateRange.endDate);
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
// Default to now
|
|
286
|
-
endDate = new Date();
|
|
123
|
+
if (!response.ok) {
|
|
124
|
+
const errorText = await response.text();
|
|
125
|
+
throw new Error(`HTTP ${response.status}: ${errorText}`);
|
|
287
126
|
}
|
|
127
|
+
const data = await response.json();
|
|
288
128
|
return {
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
129
|
+
content: [{
|
|
130
|
+
type: "text",
|
|
131
|
+
text: JSON.stringify(data, null, 2)
|
|
132
|
+
}]
|
|
292
133
|
};
|
|
293
134
|
}
|
|
294
135
|
catch (error) {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
const input = dateInput.toLowerCase().trim();
|
|
302
|
-
const now = new Date();
|
|
303
|
-
// Try ISO date first
|
|
304
|
-
if (dateInput.includes('T') || dateInput.includes('-')) {
|
|
305
|
-
const parsed = new Date(dateInput);
|
|
306
|
-
if (!isNaN(parsed.getTime())) {
|
|
307
|
-
return parsed;
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
// Natural language parsing
|
|
311
|
-
if (input === 'today' || input === 'now') {
|
|
312
|
-
return now;
|
|
313
|
-
}
|
|
314
|
-
if (input === 'yesterday') {
|
|
315
|
-
const date = new Date(now);
|
|
316
|
-
date.setDate(date.getDate() - 1);
|
|
317
|
-
return date;
|
|
318
|
-
}
|
|
319
|
-
if (input === 'tomorrow') {
|
|
320
|
-
const date = new Date(now);
|
|
321
|
-
date.setDate(date.getDate() + 1);
|
|
322
|
-
return date;
|
|
323
|
-
}
|
|
324
|
-
// Week-based
|
|
325
|
-
if (input.includes('week')) {
|
|
326
|
-
const date = new Date(now);
|
|
327
|
-
if (input.includes('last')) {
|
|
328
|
-
date.setDate(date.getDate() - 7);
|
|
329
|
-
}
|
|
330
|
-
else if (input.includes('next')) {
|
|
331
|
-
date.setDate(date.getDate() + 7);
|
|
332
|
-
}
|
|
333
|
-
return date;
|
|
334
|
-
}
|
|
335
|
-
// Month-based
|
|
336
|
-
if (input.includes('month')) {
|
|
337
|
-
const date = new Date(now);
|
|
338
|
-
if (input.includes('last')) {
|
|
339
|
-
date.setMonth(date.getMonth() - 1);
|
|
340
|
-
}
|
|
341
|
-
else if (input.includes('next')) {
|
|
342
|
-
date.setMonth(date.getMonth() + 1);
|
|
343
|
-
}
|
|
344
|
-
return date;
|
|
345
|
-
}
|
|
346
|
-
// Default to parsing as-is
|
|
347
|
-
const parsed = new Date(dateInput);
|
|
348
|
-
if (!isNaN(parsed.getTime())) {
|
|
349
|
-
return parsed;
|
|
350
|
-
}
|
|
351
|
-
// Fallback to now
|
|
352
|
-
return now;
|
|
353
|
-
}
|
|
354
|
-
// Execute the list request against the API
|
|
355
|
-
async function executeListRequest(config, contentTypeKey, request) {
|
|
356
|
-
const response = await fetch(`${config.apiUrl || 'https://api.qik.dev'}/content/${contentTypeKey}/list`, {
|
|
357
|
-
method: 'POST',
|
|
358
|
-
headers: {
|
|
359
|
-
'Authorization': `Bearer ${config.accessToken}`,
|
|
360
|
-
'Content-Type': 'application/json',
|
|
361
|
-
},
|
|
362
|
-
body: JSON.stringify(request)
|
|
363
|
-
});
|
|
364
|
-
if (!response.ok) {
|
|
365
|
-
const errorText = await response.text();
|
|
366
|
-
throw new Error(`HTTP ${response.status} - ${errorText}`);
|
|
136
|
+
return {
|
|
137
|
+
content: [{
|
|
138
|
+
type: "text",
|
|
139
|
+
text: JSON.stringify({ error: error.message }, null, 2)
|
|
140
|
+
}]
|
|
141
|
+
};
|
|
367
142
|
}
|
|
368
|
-
return await response.json();
|
|
369
|
-
}
|
|
370
|
-
// Helper functions for responses
|
|
371
|
-
function createErrorResponse(message) {
|
|
372
|
-
return {
|
|
373
|
-
content: [{
|
|
374
|
-
type: "text",
|
|
375
|
-
text: `❌ ${message}`
|
|
376
|
-
}]
|
|
377
|
-
};
|
|
378
|
-
}
|
|
379
|
-
function createSuccessResponse(contentType, results, request) {
|
|
380
|
-
// Return the raw API response as JSON - Claude can understand and parse it directly
|
|
381
|
-
return {
|
|
382
|
-
content: [{
|
|
383
|
-
type: "text",
|
|
384
|
-
text: JSON.stringify(results, null, 2)
|
|
385
|
-
}]
|
|
386
|
-
};
|
|
387
143
|
}
|
|
388
144
|
//# sourceMappingURL=list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/tools/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/tools/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Merge Tools
|
|
4
|
+
*
|
|
5
|
+
* Preview and execute merging of duplicate profiles.
|
|
6
|
+
*/
|
|
7
|
+
export declare const previewMergeTool: Tool;
|
|
8
|
+
export declare const startMergeTool: Tool;
|
|
9
|
+
export declare const getMergeProgressTool: Tool;
|
|
10
|
+
export declare function handlePreviewMerge(args: {
|
|
11
|
+
ids: string[];
|
|
12
|
+
}): Promise<{
|
|
13
|
+
content: Array<{
|
|
14
|
+
type: string;
|
|
15
|
+
text: string;
|
|
16
|
+
}>;
|
|
17
|
+
}>;
|
|
18
|
+
export declare function handleStartMerge(args: {
|
|
19
|
+
ids: string[];
|
|
20
|
+
}): Promise<{
|
|
21
|
+
content: Array<{
|
|
22
|
+
type: string;
|
|
23
|
+
text: string;
|
|
24
|
+
}>;
|
|
25
|
+
}>;
|
|
26
|
+
export declare function handleGetMergeProgress(args: {
|
|
27
|
+
mergeId: string;
|
|
28
|
+
}): Promise<{
|
|
29
|
+
content: Array<{
|
|
30
|
+
type: string;
|
|
31
|
+
text: string;
|
|
32
|
+
}>;
|
|
33
|
+
}>;
|
|
34
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/tools/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAG1D;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,IA0B9B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,IA0B5B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,IAoBlC,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,GAAG,EAAE,MAAM,EAAE,CAAC;CACf,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA0C9D;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,EAAE,MAAM,EAAE,CAAC;CACf,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA0C9D;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAsC9D"}
|