@addai/tables-mcp 0.7.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 +127 -0
- package/dist/api-client.d.ts +12 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +53 -0
- package/dist/api-client.js.map +1 -0
- package/dist/helpers/column-settings.d.ts +25 -0
- package/dist/helpers/column-settings.d.ts.map +1 -0
- package/dist/helpers/column-settings.js +96 -0
- package/dist/helpers/column-settings.js.map +1 -0
- package/dist/helpers/column-types.d.ts +8 -0
- package/dist/helpers/column-types.d.ts.map +1 -0
- package/dist/helpers/column-types.js +83 -0
- package/dist/helpers/column-types.js.map +1 -0
- package/dist/helpers/errors.d.ts +16 -0
- package/dist/helpers/errors.d.ts.map +1 -0
- package/dist/helpers/errors.js +19 -0
- package/dist/helpers/errors.js.map +1 -0
- package/dist/helpers/mapped-columns.d.ts +21 -0
- package/dist/helpers/mapped-columns.d.ts.map +1 -0
- package/dist/helpers/mapped-columns.js +119 -0
- package/dist/helpers/mapped-columns.js.map +1 -0
- package/dist/helpers/validate-options.d.ts +34 -0
- package/dist/helpers/validate-options.d.ts.map +1 -0
- package/dist/helpers/validate-options.js +120 -0
- package/dist/helpers/validate-options.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/logo.d.ts +2 -0
- package/dist/logo.d.ts.map +1 -0
- package/dist/logo.js +64 -0
- package/dist/logo.js.map +1 -0
- package/dist/preview.d.ts +3 -0
- package/dist/preview.d.ts.map +1 -0
- package/dist/preview.js +4 -0
- package/dist/preview.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +136 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +128 -0
- package/dist/setup.js.map +1 -0
- package/dist/tools/comments.d.ts +4 -0
- package/dist/tools/comments.d.ts.map +1 -0
- package/dist/tools/comments.js +63 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/dashboards.d.ts +4 -0
- package/dist/tools/dashboards.d.ts.map +1 -0
- package/dist/tools/dashboards.js +560 -0
- package/dist/tools/dashboards.js.map +1 -0
- package/dist/tools/discovery.d.ts +4 -0
- package/dist/tools/discovery.d.ts.map +1 -0
- package/dist/tools/discovery.js +115 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/files.d.ts +4 -0
- package/dist/tools/files.d.ts.map +1 -0
- package/dist/tools/files.js +115 -0
- package/dist/tools/files.js.map +1 -0
- package/dist/tools/folders.d.ts +4 -0
- package/dist/tools/folders.d.ts.map +1 -0
- package/dist/tools/folders.js +164 -0
- package/dist/tools/folders.js.map +1 -0
- package/dist/tools/history.d.ts +4 -0
- package/dist/tools/history.d.ts.map +1 -0
- package/dist/tools/history.js +50 -0
- package/dist/tools/history.js.map +1 -0
- package/dist/tools/rows.d.ts +4 -0
- package/dist/tools/rows.d.ts.map +1 -0
- package/dist/tools/rows.js +244 -0
- package/dist/tools/rows.js.map +1 -0
- package/dist/tools/search.d.ts +4 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +89 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/structure.d.ts +4 -0
- package/dist/tools/structure.d.ts.map +1 -0
- package/dist/tools/structure.js +172 -0
- package/dist/tools/structure.js.map +1 -0
- package/dist/tools/views.d.ts +4 -0
- package/dist/tools/views.d.ts.map +1 -0
- package/dist/tools/views.js +169 -0
- package/dist/tools/views.js.map +1 -0
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { mcpError, mcpResult } from '../helpers/errors.js';
|
|
3
|
+
import { buildColumnMap, translateToIds } from '../helpers/mapped-columns.js';
|
|
4
|
+
import { findOptionViolations, formatOptionViolations, addMissingOptions, } from '../helpers/validate-options.js';
|
|
5
|
+
export function registerRowTools(server, client) {
|
|
6
|
+
// ── list_rows ──
|
|
7
|
+
server.tool('list_rows', 'List rows from a table with optional filtering and sorting. Returns data with human-readable column names. Call get_table_schema first to understand the columns.', {
|
|
8
|
+
table_id: z.string().uuid().describe('The table to read rows from'),
|
|
9
|
+
page: z.number().int().positive().default(1).optional().describe('Page number (default 1)'),
|
|
10
|
+
page_size: z
|
|
11
|
+
.number()
|
|
12
|
+
.int()
|
|
13
|
+
.min(1)
|
|
14
|
+
.max(200)
|
|
15
|
+
.default(50)
|
|
16
|
+
.optional()
|
|
17
|
+
.describe('Rows per page, max 200 (default 50)'),
|
|
18
|
+
sort_by: z
|
|
19
|
+
.enum(['created_date', 'updated_date', 'sort_order'])
|
|
20
|
+
.default('created_date')
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('Field to sort by'),
|
|
23
|
+
sort_order: z
|
|
24
|
+
.enum(['asc', 'desc'])
|
|
25
|
+
.default('asc')
|
|
26
|
+
.optional()
|
|
27
|
+
.describe('Sort direction'),
|
|
28
|
+
filters: z
|
|
29
|
+
.array(z.object({
|
|
30
|
+
column: z.string().describe('Column name (human-readable, not UUID)'),
|
|
31
|
+
operator: z
|
|
32
|
+
.enum([
|
|
33
|
+
'eq', 'neq', 'contains', 'gt', 'lt', 'gte', 'lte', 'is_null', 'not_null',
|
|
34
|
+
'equals', 'not_equals', 'is', 'is_not', 'not_contains', 'starts_with', 'ends_with',
|
|
35
|
+
'greater_than', 'less_than', 'greater_than_or_equal', 'less_than_or_equal',
|
|
36
|
+
'is_empty', 'is_not_empty', 'is_any_of', 'is_none_of',
|
|
37
|
+
'is_checked', 'is_not_checked', 'is_true', 'is_false',
|
|
38
|
+
])
|
|
39
|
+
.describe('Filter operator'),
|
|
40
|
+
value: z.unknown().optional().describe('Value to compare against'),
|
|
41
|
+
}))
|
|
42
|
+
.optional()
|
|
43
|
+
.describe('Filter rows by column values'),
|
|
44
|
+
columns: z
|
|
45
|
+
.array(z.string())
|
|
46
|
+
.optional()
|
|
47
|
+
.describe('Return only these columns (by name) — much smaller payloads. Omit for all columns. Ideal for scans/rankings, e.g. ["Name","Status","Impact","Effort"].'),
|
|
48
|
+
}, async ({ table_id, page, page_size, sort_by, sort_order, filters, columns }) => {
|
|
49
|
+
const params = {
|
|
50
|
+
mapped_columns: 'true',
|
|
51
|
+
page: String(page ?? 1),
|
|
52
|
+
page_size: String(page_size ?? 50),
|
|
53
|
+
};
|
|
54
|
+
if (sort_by)
|
|
55
|
+
params.sort_by = sort_by;
|
|
56
|
+
if (sort_order)
|
|
57
|
+
params.sort_order = sort_order;
|
|
58
|
+
if (columns && columns.length > 0)
|
|
59
|
+
params.columns = columns.join(',');
|
|
60
|
+
// Translate column name filters to column ID filters
|
|
61
|
+
if (filters && filters.length > 0) {
|
|
62
|
+
const colMap = await buildColumnMap(client, table_id);
|
|
63
|
+
const apiFilters = filters.map((f) => ({
|
|
64
|
+
column_id: colMap.nameToId.get(f.column) || f.column,
|
|
65
|
+
operator: f.operator,
|
|
66
|
+
value: f.value,
|
|
67
|
+
}));
|
|
68
|
+
params.filters = JSON.stringify(apiFilters);
|
|
69
|
+
}
|
|
70
|
+
const res = await client.get(`/tables/${table_id}/rows`, params);
|
|
71
|
+
if (res.error)
|
|
72
|
+
return mcpError(res.error.message);
|
|
73
|
+
return mcpResult({
|
|
74
|
+
rows: res.data,
|
|
75
|
+
pagination: res.pagination,
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
// ── get_row ──
|
|
79
|
+
server.tool('get_row', 'Fetch a single row/record by its ID and return its full contents with human-readable column names. ' +
|
|
80
|
+
'If you already know which table the record is in, pass table_id (fastest). ' +
|
|
81
|
+
'If you only have the record ID (e.g. a task/bug id) omit table_id — the server finds which table it ' +
|
|
82
|
+
'belongs to (works for both native and BYODB/direct-query tables) and returns that table context, so ' +
|
|
83
|
+
'you can immediately update it or comment on it without hunting for the table_id first. Returns { row, table }.', {
|
|
84
|
+
row_id: z
|
|
85
|
+
.string()
|
|
86
|
+
.min(1)
|
|
87
|
+
.describe('The record/row ID (primary key). For BYODB tables this is the external primary key value.'),
|
|
88
|
+
table_id: z
|
|
89
|
+
.string()
|
|
90
|
+
.uuid()
|
|
91
|
+
.optional()
|
|
92
|
+
.describe('Optional — the table the record is in, if you already know it. Omit to resolve automatically from the row ID.'),
|
|
93
|
+
}, async ({ row_id, table_id }) => {
|
|
94
|
+
const params = { mapped_columns: 'true' };
|
|
95
|
+
const path = table_id
|
|
96
|
+
? `/tables/${table_id}/rows/${row_id}`
|
|
97
|
+
: `/rows/${encodeURIComponent(row_id)}`;
|
|
98
|
+
const res = await client.get(path, params);
|
|
99
|
+
if (res.error)
|
|
100
|
+
return mcpError(res.error.message);
|
|
101
|
+
// The resolver endpoint also returns a `table` context block; the per-table
|
|
102
|
+
// endpoint does not. Surface whichever is present.
|
|
103
|
+
const table = res.table;
|
|
104
|
+
return mcpResult(table !== undefined ? { row: res.data, table } : { row: res.data });
|
|
105
|
+
});
|
|
106
|
+
// ── create_rows ──
|
|
107
|
+
server.tool('create_rows', 'Create one or more rows in a table. Use column names (not UUIDs) as keys. For select/multiselect columns, values must match the column\'s defined options exactly — an unmatched value is rejected with the list of valid options (set add_missing_options: true to add it as a new option instead). Call get_table_schema first to know the column names.', {
|
|
108
|
+
table_id: z.string().uuid().describe('The table to add rows to'),
|
|
109
|
+
rows: z
|
|
110
|
+
.array(z.record(z.string(), z.unknown()))
|
|
111
|
+
.min(1)
|
|
112
|
+
.describe('Array of row objects. Keys are column names, values are cell data. ' +
|
|
113
|
+
'For select: use the option value string (e.g. "High"). ' +
|
|
114
|
+
'For date: use ISO 8601 (e.g. "2026-04-01"). ' +
|
|
115
|
+
'For boolean: use true/false. ' +
|
|
116
|
+
'For multiselect: use an array of strings.'),
|
|
117
|
+
add_missing_options: z
|
|
118
|
+
.boolean()
|
|
119
|
+
.optional()
|
|
120
|
+
.default(false)
|
|
121
|
+
.describe('When true, any select/multiselect value that is not already a configured option is ' +
|
|
122
|
+
'added as a new option on that column (auto-assigned colour) before the rows are written. ' +
|
|
123
|
+
'When false (default), unmatched values are rejected with an error listing the valid options.'),
|
|
124
|
+
}, async ({ table_id, rows, add_missing_options }) => {
|
|
125
|
+
const colMap = await buildColumnMap(client, table_id);
|
|
126
|
+
// Validate select/multiselect values against configured options.
|
|
127
|
+
const violations = findOptionViolations(rows, colMap);
|
|
128
|
+
if (violations.length > 0) {
|
|
129
|
+
if (!add_missing_options)
|
|
130
|
+
return mcpError(formatOptionViolations(violations));
|
|
131
|
+
const addRes = await addMissingOptions(client, table_id, violations, colMap);
|
|
132
|
+
if (addRes.error)
|
|
133
|
+
return mcpError(addRes.error);
|
|
134
|
+
}
|
|
135
|
+
// Translate column names to UUIDs
|
|
136
|
+
const apiRows = rows.map((row) => ({
|
|
137
|
+
data: translateToIds(row, colMap),
|
|
138
|
+
}));
|
|
139
|
+
const res = await client.post(`/tables/${table_id}/rows`, { rows: apiRows });
|
|
140
|
+
if (res.error)
|
|
141
|
+
return mcpError(res.error.message);
|
|
142
|
+
return mcpResult({
|
|
143
|
+
message: `Created ${res.count || apiRows.length} row(s)`,
|
|
144
|
+
rows: res.data,
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
// ── update_rows ──
|
|
148
|
+
server.tool('update_rows', 'Update one or more existing rows. Specify row IDs and the columns to change. Only specified columns are updated; others remain unchanged. Use column names, not UUIDs. For select/multiselect columns, values must match the column\'s defined options exactly — an unmatched value is rejected (set add_missing_options: true to add it as a new option instead).', {
|
|
149
|
+
table_id: z.string().uuid().describe('The table containing the rows'),
|
|
150
|
+
updates: z
|
|
151
|
+
.array(z.object({
|
|
152
|
+
row_id: z.string().uuid().describe('The row ID to update'),
|
|
153
|
+
data: z
|
|
154
|
+
.record(z.string(), z.unknown())
|
|
155
|
+
.describe('Column name → new value pairs'),
|
|
156
|
+
}))
|
|
157
|
+
.min(1)
|
|
158
|
+
.max(500)
|
|
159
|
+
.describe('Array of row updates'),
|
|
160
|
+
add_missing_options: z
|
|
161
|
+
.boolean()
|
|
162
|
+
.optional()
|
|
163
|
+
.default(false)
|
|
164
|
+
.describe('When true, any select/multiselect value that is not already a configured option is ' +
|
|
165
|
+
'added as a new option on that column (auto-assigned colour) before the rows are written. ' +
|
|
166
|
+
'When false (default), unmatched values are rejected with an error listing the valid options.'),
|
|
167
|
+
}, async ({ table_id, updates, add_missing_options }) => {
|
|
168
|
+
const colMap = await buildColumnMap(client, table_id);
|
|
169
|
+
// Validate select/multiselect values against configured options.
|
|
170
|
+
const violations = findOptionViolations(updates.map((u) => u.data), colMap);
|
|
171
|
+
if (violations.length > 0) {
|
|
172
|
+
if (!add_missing_options)
|
|
173
|
+
return mcpError(formatOptionViolations(violations));
|
|
174
|
+
const addRes = await addMissingOptions(client, table_id, violations, colMap);
|
|
175
|
+
if (addRes.error)
|
|
176
|
+
return mcpError(addRes.error);
|
|
177
|
+
}
|
|
178
|
+
if (updates.length === 1) {
|
|
179
|
+
// Single row update
|
|
180
|
+
const update = updates[0];
|
|
181
|
+
const translatedData = translateToIds(update.data, colMap);
|
|
182
|
+
const res = await client.patch(`/tables/${table_id}/rows/${update.row_id}`, {
|
|
183
|
+
data: translatedData,
|
|
184
|
+
});
|
|
185
|
+
if (res.error)
|
|
186
|
+
return mcpError(res.error.message);
|
|
187
|
+
return mcpResult({ message: 'Row updated', row: res.data });
|
|
188
|
+
}
|
|
189
|
+
// Bulk update
|
|
190
|
+
const apiRows = updates.map((u) => ({
|
|
191
|
+
id: u.row_id,
|
|
192
|
+
data: translateToIds(u.data, colMap),
|
|
193
|
+
}));
|
|
194
|
+
const res = await client.post('/rows/bulk-update', {
|
|
195
|
+
table_id,
|
|
196
|
+
rows: apiRows,
|
|
197
|
+
});
|
|
198
|
+
if (res.error)
|
|
199
|
+
return mcpError(res.error.message);
|
|
200
|
+
// Surface per-row failures — the API returns { data, updated_count, errors },
|
|
201
|
+
// and a total failure (e.g. an unsupported table kind) must not look like an
|
|
202
|
+
// empty-array success.
|
|
203
|
+
const bulk = res;
|
|
204
|
+
const updatedRows = Array.isArray(bulk.data) ? bulk.data : [];
|
|
205
|
+
const bulkErrors = bulk.errors ?? [];
|
|
206
|
+
const updatedCount = bulk.updated_count ?? updatedRows.length;
|
|
207
|
+
if (updatedCount === 0) {
|
|
208
|
+
const detail = bulkErrors.length
|
|
209
|
+
? ' ' + bulkErrors.map((e) => `${e.id}: ${e.error}`).join('; ')
|
|
210
|
+
: '';
|
|
211
|
+
return mcpError(`No rows were updated (${bulkErrors.length} error(s)).${detail}`);
|
|
212
|
+
}
|
|
213
|
+
return mcpResult({
|
|
214
|
+
message: `Updated ${updatedCount} row(s)` +
|
|
215
|
+
(bulkErrors.length ? `, ${bulkErrors.length} failed` : ''),
|
|
216
|
+
rows: updatedRows,
|
|
217
|
+
updated_count: updatedCount,
|
|
218
|
+
...(bulkErrors.length ? { errors: bulkErrors } : {}),
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
// ── delete_rows ──
|
|
222
|
+
server.tool('delete_rows', 'Delete one or more rows from a table. This action cannot be undone.', {
|
|
223
|
+
table_id: z.string().uuid().describe('The table containing the rows'),
|
|
224
|
+
row_ids: z
|
|
225
|
+
.array(z.string().uuid())
|
|
226
|
+
.min(1)
|
|
227
|
+
.describe('Array of row IDs to delete'),
|
|
228
|
+
}, async ({ table_id, row_ids }) => {
|
|
229
|
+
if (row_ids.length === 1) {
|
|
230
|
+
const res = await client.delete(`/tables/${table_id}/rows/${row_ids[0]}`);
|
|
231
|
+
if (res.error)
|
|
232
|
+
return mcpError(res.error.message);
|
|
233
|
+
return mcpResult({ message: 'Row deleted' });
|
|
234
|
+
}
|
|
235
|
+
const res = await client.post('/rows/bulk-delete', {
|
|
236
|
+
table_id,
|
|
237
|
+
row_ids,
|
|
238
|
+
});
|
|
239
|
+
if (res.error)
|
|
240
|
+
return mcpError(res.error.message);
|
|
241
|
+
return mcpResult(res.data);
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=rows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rows.js","sourceRoot":"","sources":["../../src/tools/rows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAWvD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,QAgG5E"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { mcpError, mcpResult } from '../helpers/errors.js';
|
|
3
|
+
// Column types that contain searchable text
|
|
4
|
+
const TEXT_COLUMN_TYPES = new Set([
|
|
5
|
+
'text', 'richtext', 'email', 'url', 'phone',
|
|
6
|
+
'select', 'multiselect', 'tags', 'label',
|
|
7
|
+
'country', 'location',
|
|
8
|
+
]);
|
|
9
|
+
export function registerSearchTools(server, client) {
|
|
10
|
+
// ── search_rows ──
|
|
11
|
+
server.tool('search_rows', 'Search for rows containing specific text across all text-based columns. Useful for finding rows without knowing which column contains the data.', {
|
|
12
|
+
table_id: z.string().uuid().describe('The table to search in'),
|
|
13
|
+
query: z.string().min(1).describe('The text to search for (case-insensitive)'),
|
|
14
|
+
max_results: z
|
|
15
|
+
.number()
|
|
16
|
+
.int()
|
|
17
|
+
.min(1)
|
|
18
|
+
.max(100)
|
|
19
|
+
.default(20)
|
|
20
|
+
.optional()
|
|
21
|
+
.describe('Maximum results to return (default 20)'),
|
|
22
|
+
}, async ({ table_id, query, max_results }) => {
|
|
23
|
+
// Fetch columns to know which are text-searchable
|
|
24
|
+
const colRes = await client.get(`/tables/${table_id}/columns`);
|
|
25
|
+
if (colRes.error)
|
|
26
|
+
return mcpError(colRes.error.message);
|
|
27
|
+
const columns = colRes.data || [];
|
|
28
|
+
const textColumnIds = columns
|
|
29
|
+
.filter((c) => TEXT_COLUMN_TYPES.has(c.column_type))
|
|
30
|
+
.map((c) => c.id);
|
|
31
|
+
const idToName = new Map(columns.map((c) => [c.id, c.name]));
|
|
32
|
+
if (textColumnIds.length === 0) {
|
|
33
|
+
return mcpResult({ message: 'No text-searchable columns in this table', rows: [] });
|
|
34
|
+
}
|
|
35
|
+
// Fetch rows (up to 1000 for search)
|
|
36
|
+
const rowRes = await client.get(`/tables/${table_id}/rows`, {
|
|
37
|
+
page_size: '1000',
|
|
38
|
+
page: '1',
|
|
39
|
+
});
|
|
40
|
+
if (rowRes.error)
|
|
41
|
+
return mcpError(rowRes.error.message);
|
|
42
|
+
const rows = rowRes.data || [];
|
|
43
|
+
// Client-side text search across text columns
|
|
44
|
+
const lowerQuery = query.toLowerCase();
|
|
45
|
+
const limit = max_results ?? 20;
|
|
46
|
+
const matches = [];
|
|
47
|
+
for (const row of rows) {
|
|
48
|
+
if (matches.length >= limit)
|
|
49
|
+
break;
|
|
50
|
+
const data = row.data || {};
|
|
51
|
+
let found = false;
|
|
52
|
+
for (const colId of textColumnIds) {
|
|
53
|
+
const value = data[colId];
|
|
54
|
+
if (value == null)
|
|
55
|
+
continue;
|
|
56
|
+
const str = Array.isArray(value) ? value.join(' ') : String(value);
|
|
57
|
+
if (str.toLowerCase().includes(lowerQuery)) {
|
|
58
|
+
found = true;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (found) {
|
|
63
|
+
// Map column IDs to names in the result
|
|
64
|
+
const mappedData = {};
|
|
65
|
+
for (const [key, value] of Object.entries(data)) {
|
|
66
|
+
mappedData[idToName.get(key) || key] = value;
|
|
67
|
+
}
|
|
68
|
+
matches.push({ id: row.id, data: mappedData });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return mcpResult({
|
|
72
|
+
query,
|
|
73
|
+
matches: matches.length,
|
|
74
|
+
rows: matches,
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
// ── export_table ──
|
|
78
|
+
server.tool('export_table', 'Export all data from a table including column definitions and all rows. Returns human-readable column names.', {
|
|
79
|
+
table_id: z.string().uuid().describe('The table to export'),
|
|
80
|
+
}, async ({ table_id }) => {
|
|
81
|
+
const res = await client.get(`/tables/${table_id}/export`, {
|
|
82
|
+
mapped_columns: 'true',
|
|
83
|
+
});
|
|
84
|
+
if (res.error)
|
|
85
|
+
return mcpError(res.error.message);
|
|
86
|
+
return mcpResult(res.data);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../src/tools/structure.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA6BvD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,QA0L/E"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { mcpError, mcpResult } from '../helpers/errors.js';
|
|
3
|
+
import { buildColumnPayload, mergeSelectOptions } from '../helpers/column-settings.js';
|
|
4
|
+
const columnSchema = z.object({
|
|
5
|
+
name: z.string().describe('Column name'),
|
|
6
|
+
type: z
|
|
7
|
+
.string()
|
|
8
|
+
.describe('Column type. Common types: text, number, boolean, date, select, multiselect, ' +
|
|
9
|
+
'tags, label, rating, progress, email, url, phone, richtext, people, ' +
|
|
10
|
+
'duration, timeline, checklist, country, autonumber'),
|
|
11
|
+
options: z
|
|
12
|
+
.array(z.string())
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("For select/multiselect/tags: list of option values. Colors are auto-assigned. Example: ['Todo', 'In Progress', 'Done']"),
|
|
15
|
+
required: z.boolean().optional().default(false),
|
|
16
|
+
settings: z
|
|
17
|
+
.record(z.string(), z.unknown())
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Advanced column settings override. Usually not needed — the server applies smart defaults.'),
|
|
20
|
+
});
|
|
21
|
+
export function registerStructureTools(server, client) {
|
|
22
|
+
// ── create_table ──
|
|
23
|
+
server.tool('create_table', 'Create a new table in a database with columns. The server automatically configures column settings (adds colors to select options, applies smart defaults). If you omit columns, defaults are: Name (text), Notes (richtext), Status (select).', {
|
|
24
|
+
database_id: z.string().uuid().describe('The database to create the table in'),
|
|
25
|
+
name: z.string().min(1).describe('Table name'),
|
|
26
|
+
description: z.string().optional().describe('Table description'),
|
|
27
|
+
columns: z
|
|
28
|
+
.array(columnSchema)
|
|
29
|
+
.optional()
|
|
30
|
+
.describe('Column definitions. Omit for default columns (Name, Notes, Status).'),
|
|
31
|
+
}, async ({ database_id, name, description, columns }) => {
|
|
32
|
+
// Build enriched column payloads
|
|
33
|
+
let apiColumns;
|
|
34
|
+
if (columns && columns.length > 0) {
|
|
35
|
+
apiColumns = columns.map((col) => buildColumnPayload(col));
|
|
36
|
+
}
|
|
37
|
+
const body = {
|
|
38
|
+
database_id,
|
|
39
|
+
name,
|
|
40
|
+
};
|
|
41
|
+
if (description)
|
|
42
|
+
body.description = description;
|
|
43
|
+
if (apiColumns)
|
|
44
|
+
body.columns = apiColumns;
|
|
45
|
+
const res = await client.post('/tables', body);
|
|
46
|
+
if (res.error)
|
|
47
|
+
return mcpError(res.error.message);
|
|
48
|
+
// Fetch the created table with columns to show the full result
|
|
49
|
+
const table = res.data;
|
|
50
|
+
const tableId = table?.id;
|
|
51
|
+
if (tableId) {
|
|
52
|
+
const full = await client.get(`/tables/${tableId}`);
|
|
53
|
+
if (full.data)
|
|
54
|
+
return mcpResult(full.data);
|
|
55
|
+
}
|
|
56
|
+
return mcpResult(table);
|
|
57
|
+
});
|
|
58
|
+
// ── update_table ──
|
|
59
|
+
server.tool('update_table', 'Update a table\'s name, description, or icon. Only the fields you pass are changed. To change columns use add_columns / update_column.', {
|
|
60
|
+
table_id: z.string().uuid().describe('The table to update'),
|
|
61
|
+
name: z.string().min(1).optional().describe('New table name'),
|
|
62
|
+
description: z.string().optional().describe('New table description'),
|
|
63
|
+
icon: z.string().optional().describe('New icon name'),
|
|
64
|
+
}, async ({ table_id, name, description, icon }) => {
|
|
65
|
+
const body = {};
|
|
66
|
+
if (name !== undefined)
|
|
67
|
+
body.name = name;
|
|
68
|
+
if (description !== undefined)
|
|
69
|
+
body.description = description;
|
|
70
|
+
if (icon !== undefined)
|
|
71
|
+
body.icon = icon;
|
|
72
|
+
if (Object.keys(body).length === 0) {
|
|
73
|
+
return mcpError('Nothing to update — provide name, description, or icon');
|
|
74
|
+
}
|
|
75
|
+
const res = await client.patch(`/tables/${table_id}`, body);
|
|
76
|
+
if (res.error)
|
|
77
|
+
return mcpError(res.error.message);
|
|
78
|
+
return mcpResult({ message: 'Table updated', table: res.data });
|
|
79
|
+
});
|
|
80
|
+
// ── delete_table ──
|
|
81
|
+
server.tool('delete_table', 'Permanently delete a table and ALL of its columns and rows. This cannot be undone — confirm with the user before calling.', {
|
|
82
|
+
table_id: z.string().uuid().describe('The table to delete'),
|
|
83
|
+
}, async ({ table_id }) => {
|
|
84
|
+
const res = await client.delete(`/tables/${table_id}`);
|
|
85
|
+
if (res.error)
|
|
86
|
+
return mcpError(res.error.message);
|
|
87
|
+
return mcpResult({ message: 'Table deleted' });
|
|
88
|
+
});
|
|
89
|
+
// ── add_columns ──
|
|
90
|
+
server.tool('add_columns', 'Add one or more columns to an existing table. For select/multiselect, provide option values and colors will be auto-assigned.', {
|
|
91
|
+
table_id: z.string().uuid().describe('The table to add columns to'),
|
|
92
|
+
columns: z
|
|
93
|
+
.array(columnSchema)
|
|
94
|
+
.min(1)
|
|
95
|
+
.describe('Column definitions to add'),
|
|
96
|
+
}, async ({ table_id, columns }) => {
|
|
97
|
+
const created = [];
|
|
98
|
+
for (const col of columns) {
|
|
99
|
+
const payload = buildColumnPayload(col);
|
|
100
|
+
const res = await client.post(`/tables/${table_id}/columns`, payload);
|
|
101
|
+
if (res.error) {
|
|
102
|
+
return mcpError(`Failed to create column "${col.name}": ${res.error.message}`);
|
|
103
|
+
}
|
|
104
|
+
created.push(res.data);
|
|
105
|
+
}
|
|
106
|
+
return mcpResult({
|
|
107
|
+
message: `Added ${created.length} column(s)`,
|
|
108
|
+
columns: created,
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
// ── update_column ──
|
|
112
|
+
server.tool('update_column', 'Update a column\'s name, settings, or options. For select/multiselect: include ALL options (existing + new) — the full list replaces the current one. Get column_id from get_table_schema.', {
|
|
113
|
+
table_id: z.string().uuid().describe('The table containing the column'),
|
|
114
|
+
column_id: z
|
|
115
|
+
.string()
|
|
116
|
+
.uuid()
|
|
117
|
+
.describe('The column ID to update (get this from get_table_schema)'),
|
|
118
|
+
name: z.string().optional().describe('New column name'),
|
|
119
|
+
options: z
|
|
120
|
+
.array(z.string())
|
|
121
|
+
.optional()
|
|
122
|
+
.describe('For select/multiselect: the complete list of options. ' +
|
|
123
|
+
'Existing options keep their colors; new options get auto-assigned colors.'),
|
|
124
|
+
settings: z
|
|
125
|
+
.record(z.string(), z.unknown())
|
|
126
|
+
.optional()
|
|
127
|
+
.describe('Column settings to update (replaces entire settings object)'),
|
|
128
|
+
}, async ({ table_id, column_id, name, options, settings }) => {
|
|
129
|
+
const body = {};
|
|
130
|
+
if (name)
|
|
131
|
+
body.name = name;
|
|
132
|
+
if (options) {
|
|
133
|
+
// Fetch existing column to preserve colors
|
|
134
|
+
const tableRes = await client.get(`/tables/${table_id}`);
|
|
135
|
+
const table = tableRes.data;
|
|
136
|
+
const columns = (table?.columns || []);
|
|
137
|
+
const existing = columns.find((c) => c.id === column_id);
|
|
138
|
+
if (existing) {
|
|
139
|
+
const existingSettings = existing.column_settings || {};
|
|
140
|
+
const existingOptions = (existingSettings.options || []);
|
|
141
|
+
const merged = mergeSelectOptions(existingOptions, options);
|
|
142
|
+
body.column_settings = { ...existingSettings, ...settings, options: merged };
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// Column not found in table response, just assign fresh colors
|
|
146
|
+
const { assignColors } = await import('../helpers/column-settings.js');
|
|
147
|
+
body.column_settings = { ...settings, options: assignColors(options) };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else if (settings) {
|
|
151
|
+
body.column_settings = settings;
|
|
152
|
+
}
|
|
153
|
+
if (Object.keys(body).length === 0) {
|
|
154
|
+
return mcpError('Nothing to update — provide name, options, or settings');
|
|
155
|
+
}
|
|
156
|
+
const res = await client.patch(`/tables/${table_id}/columns/${column_id}`, body);
|
|
157
|
+
if (res.error)
|
|
158
|
+
return mcpError(res.error.message);
|
|
159
|
+
return mcpResult({ message: 'Column updated', column: res.data });
|
|
160
|
+
});
|
|
161
|
+
// ── delete_column ──
|
|
162
|
+
server.tool('delete_column', 'Permanently delete a column from a table, including its data in every row. This cannot be undone — confirm with the user before calling. Get column_id from get_table_schema.', {
|
|
163
|
+
table_id: z.string().uuid().describe('The table containing the column'),
|
|
164
|
+
column_id: z.string().uuid().describe('The column to delete (from get_table_schema)'),
|
|
165
|
+
}, async ({ table_id, column_id }) => {
|
|
166
|
+
const res = await client.delete(`/tables/${table_id}/columns/${column_id}`);
|
|
167
|
+
if (res.error)
|
|
168
|
+
return mcpError(res.error.message);
|
|
169
|
+
return mcpResult({ message: 'Column deleted' });
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=structure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/tools/structure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/tools/views.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAoBvD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,QAuL1E"}
|