@aaron-pienza/mcp-server-salesforce 1.0.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.
Files changed (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +398 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.js +392 -0
  5. package/dist/tools/aggregateQuery.d.ts +18 -0
  6. package/dist/tools/aggregateQuery.js +275 -0
  7. package/dist/tools/describe.d.ts +9 -0
  8. package/dist/tools/describe.js +45 -0
  9. package/dist/tools/describeAnalytics.d.ts +13 -0
  10. package/dist/tools/describeAnalytics.js +178 -0
  11. package/dist/tools/dml.d.ts +15 -0
  12. package/dist/tools/dml.js +133 -0
  13. package/dist/tools/executeAnonymous.d.ts +19 -0
  14. package/dist/tools/executeAnonymous.js +139 -0
  15. package/dist/tools/listAnalytics.d.ts +13 -0
  16. package/dist/tools/listAnalytics.js +149 -0
  17. package/dist/tools/manageDebugLogs.d.ts +31 -0
  18. package/dist/tools/manageDebugLogs.js +451 -0
  19. package/dist/tools/manageField.d.ts +32 -0
  20. package/dist/tools/manageField.js +358 -0
  21. package/dist/tools/manageFieldPermissions.d.ts +17 -0
  22. package/dist/tools/manageFieldPermissions.js +256 -0
  23. package/dist/tools/manageObject.d.ts +20 -0
  24. package/dist/tools/manageObject.js +138 -0
  25. package/dist/tools/query.d.ts +17 -0
  26. package/dist/tools/query.js +237 -0
  27. package/dist/tools/readApex.d.ts +28 -0
  28. package/dist/tools/readApex.js +188 -0
  29. package/dist/tools/readApexTrigger.d.ts +28 -0
  30. package/dist/tools/readApexTrigger.js +188 -0
  31. package/dist/tools/refreshDashboard.d.ts +13 -0
  32. package/dist/tools/refreshDashboard.js +91 -0
  33. package/dist/tools/restApi.d.ts +17 -0
  34. package/dist/tools/restApi.js +150 -0
  35. package/dist/tools/runAnalytics.d.ts +30 -0
  36. package/dist/tools/runAnalytics.js +367 -0
  37. package/dist/tools/search.d.ts +14 -0
  38. package/dist/tools/search.js +69 -0
  39. package/dist/tools/searchAll.d.ts +29 -0
  40. package/dist/tools/searchAll.js +258 -0
  41. package/dist/tools/writeApex.d.ts +27 -0
  42. package/dist/tools/writeApex.js +159 -0
  43. package/dist/tools/writeApexTrigger.d.ts +28 -0
  44. package/dist/tools/writeApexTrigger.js +187 -0
  45. package/dist/types/analytics.d.ts +2 -0
  46. package/dist/types/analytics.js +1 -0
  47. package/dist/types/connection.d.ts +52 -0
  48. package/dist/types/connection.js +21 -0
  49. package/dist/types/metadata.d.ts +43 -0
  50. package/dist/types/metadata.js +1 -0
  51. package/dist/types/salesforce.d.ts +33 -0
  52. package/dist/types/salesforce.js +1 -0
  53. package/dist/utils/connection.d.ts +7 -0
  54. package/dist/utils/connection.js +169 -0
  55. package/dist/utils/errorHandler.d.ts +15 -0
  56. package/dist/utils/errorHandler.js +23 -0
  57. package/dist/utils/logging.d.ts +12 -0
  58. package/dist/utils/logging.js +23 -0
  59. package/dist/utils/pagination.d.ts +14 -0
  60. package/dist/utils/pagination.js +26 -0
  61. package/dist/utils/sanitize.d.ts +44 -0
  62. package/dist/utils/sanitize.js +73 -0
  63. package/dist/utils/validate.d.ts +13 -0
  64. package/dist/utils/validate.js +60 -0
  65. package/package.json +52 -0
@@ -0,0 +1,367 @@
1
+ const DEFAULT_DETAIL_ROW_LIMIT = 100;
2
+ const DISPLAY_ROW_CAP = 100;
3
+ export const RUN_ANALYTICS = {
4
+ name: "salesforce_run_analytics",
5
+ description: `Execute a Salesforce report or retrieve current dashboard component data.
6
+
7
+ For reports: runs the report synchronously via the Analytics API. Supports optional runtime filter overrides, date filter overrides, and detail row inclusion. When includeDetails is true, defaults to returning 100 rows (override with topRows). The sync API has a hard maximum of 2,000 detail rows — a warning is included if results are truncated. Aggregates and grouping summaries are always returned in full.
8
+
9
+ For dashboards: retrieves each component's current data (aggregates, grouping summaries) without triggering a refresh. To refresh first, use salesforce_refresh_dashboard.
10
+
11
+ Examples:
12
+ 1. Run a report with saved defaults:
13
+ - type: "report"
14
+ - resourceId: "00Oxx000000XXXXX"
15
+
16
+ 2. Run a report with detail rows:
17
+ - type: "report"
18
+ - resourceId: "00Oxx000000XXXXX"
19
+ - includeDetails: true
20
+
21
+ 3. Run a report with filter overrides:
22
+ - type: "report"
23
+ - resourceId: "00Oxx000000XXXXX"
24
+ - includeDetails: true
25
+ - filters: [{ "column": "STAGE_NAME", "operator": "equals", "value": "Closed Won" }]
26
+ - standardDateFilter: { "column": "CLOSE_DATE", "durationValue": "LAST_N_DAYS:90" }
27
+
28
+ 4. Run a report with row limit:
29
+ - type: "report"
30
+ - resourceId: "00Oxx000000XXXXX"
31
+ - includeDetails: true
32
+ - topRows: { "rowLimit": 50, "direction": "Desc" }
33
+
34
+ 5. Run a report with multiple filters and boolean logic:
35
+ - type: "report"
36
+ - resourceId: "00Oxx000000XXXXX"
37
+ - filters: [
38
+ { "column": "STAGE_NAME", "operator": "equals", "value": "Closed Won" },
39
+ { "column": "AMOUNT", "operator": "greaterThan", "value": "10000" }
40
+ ]
41
+ - booleanFilter: "1 AND 2"
42
+
43
+ 6. Get current dashboard component data:
44
+ - type: "dashboard"
45
+ - resourceId: "01Zxx000000XXXXX"`,
46
+ inputSchema: {
47
+ type: "object",
48
+ properties: {
49
+ type: {
50
+ type: "string",
51
+ enum: ["report", "dashboard"],
52
+ description: 'Type of analytics resource: "report" or "dashboard"'
53
+ },
54
+ resourceId: {
55
+ type: "string",
56
+ description: "The 15 or 18-character Salesforce report or dashboard ID"
57
+ },
58
+ includeDetails: {
59
+ type: "boolean",
60
+ description: "Reports only. Include detail rows in results (default false). Capped at 2,000 rows by the API."
61
+ },
62
+ filters: {
63
+ type: "array",
64
+ items: {
65
+ type: "object",
66
+ properties: {
67
+ column: { type: "string", description: "API name of the filter column (from salesforce_describe_analytics)" },
68
+ operator: {
69
+ type: "string",
70
+ enum: ["equals", "notEqual", "lessThan", "greaterThan", "lessOrEqual",
71
+ "greaterOrEqual", "contains", "notContain", "startsWith",
72
+ "includes", "excludes", "within"],
73
+ description: "Filter operator"
74
+ },
75
+ value: { type: "string", description: "Filter value" }
76
+ },
77
+ required: ["column", "operator", "value"]
78
+ },
79
+ description: "Reports only. Runtime filter overrides applied for this execution only."
80
+ },
81
+ booleanFilter: {
82
+ type: "string",
83
+ description: 'Reports only. Boolean filter logic string (e.g., "1 AND (2 OR 3)").'
84
+ },
85
+ standardDateFilter: {
86
+ type: "object",
87
+ properties: {
88
+ column: { type: "string", description: "Date column API name" },
89
+ durationValue: { type: "string", description: 'Relative date value (e.g., "THIS_FISCAL_QUARTER", "LAST_N_DAYS:90", "CUSTOM")' },
90
+ startDate: { type: "string", description: "Start date (YYYY-MM-DD) when durationValue is CUSTOM" },
91
+ endDate: { type: "string", description: "End date (YYYY-MM-DD) when durationValue is CUSTOM" }
92
+ },
93
+ description: "Reports only. Standard date filter override."
94
+ },
95
+ topRows: {
96
+ type: "object",
97
+ properties: {
98
+ rowLimit: { type: "number", description: "Maximum number of rows" },
99
+ direction: { type: "string", enum: ["Asc", "Desc"], description: "Sort direction for limiting" }
100
+ },
101
+ description: "Reports only. Row limit with sort direction."
102
+ }
103
+ },
104
+ required: ["type", "resourceId"]
105
+ }
106
+ };
107
+ export async function handleRunAnalytics(conn, args) {
108
+ const { type, resourceId } = args;
109
+ try {
110
+ if (type === 'report') {
111
+ return await runReport(conn, args);
112
+ }
113
+ else {
114
+ // Warn if report-only params are provided for dashboards
115
+ if (args.filters || args.includeDetails || args.booleanFilter || args.standardDateFilter || args.topRows) {
116
+ return {
117
+ content: [{
118
+ type: "text",
119
+ text: 'filters, includeDetails, booleanFilter, standardDateFilter, and topRows only apply to reports, not dashboards. Remove these parameters and try again.'
120
+ }],
121
+ isError: true,
122
+ };
123
+ }
124
+ return await runDashboard(conn, resourceId);
125
+ }
126
+ }
127
+ catch (error) {
128
+ const errorMessage = error instanceof Error ? error.message : String(error);
129
+ let enhancedError = errorMessage;
130
+ if (errorMessage.includes('NOT_FOUND') || errorMessage.includes('ENTITY_IS_DELETED')) {
131
+ enhancedError = `${type === 'report' ? 'Report' : 'Dashboard'} with ID "${resourceId}" not found. Use salesforce_list_analytics to find valid IDs.`;
132
+ }
133
+ else if (errorMessage.includes('INVALID_REPORT_METADATA')) {
134
+ enhancedError = `Invalid filter column or operator. Use salesforce_describe_analytics to see available columns and operators.`;
135
+ }
136
+ else if (errorMessage.includes('INSUFFICIENT_ACCESS') || errorMessage.includes('INSUFFICIENT_PRIVILEGES')) {
137
+ enhancedError = `Insufficient permissions. The connected user needs '${type === 'report' ? 'Run Reports' : 'View Dashboards'}' permission.`;
138
+ }
139
+ return {
140
+ content: [{
141
+ type: "text",
142
+ text: `Error running ${type}: ${enhancedError}`
143
+ }],
144
+ isError: true,
145
+ };
146
+ }
147
+ }
148
+ async function runReport(conn, args) {
149
+ const report = conn.analytics.report(args.resourceId);
150
+ // Apply default detail row cap when includeDetails is true and no explicit topRows
151
+ let defaultApplied = !!(args.includeDetails && !args.topRows);
152
+ let effectiveTopRows = args.topRows ??
153
+ (args.includeDetails ? { rowLimit: DEFAULT_DETAIL_ROW_LIMIT, direction: "Desc" } : undefined);
154
+ // Build execution options
155
+ const options = {
156
+ details: args.includeDetails ?? false,
157
+ };
158
+ if (args.filters || args.booleanFilter || args.standardDateFilter || effectiveTopRows) {
159
+ options.metadata = {
160
+ reportMetadata: {
161
+ ...(args.filters && { reportFilters: args.filters }),
162
+ ...(args.booleanFilter && { reportBooleanFilter: args.booleanFilter }),
163
+ ...(args.standardDateFilter && { standardDateFilter: args.standardDateFilter }),
164
+ ...(effectiveTopRows && { topRows: effectiveTopRows }),
165
+ }
166
+ };
167
+ }
168
+ let result;
169
+ let topRowsIgnored = false;
170
+ try {
171
+ result = await report.execute(options);
172
+ }
173
+ catch (error) {
174
+ // Some report formats/configurations don't support topRows — retry without it
175
+ const msg = error instanceof Error ? error.message : String(error);
176
+ if (msg.includes('row limit filter') && effectiveTopRows) {
177
+ defaultApplied = false;
178
+ topRowsIgnored = !!args.topRows; // track if user-provided topRows was dropped
179
+ effectiveTopRows = undefined;
180
+ if (options.metadata?.reportMetadata) {
181
+ delete options.metadata.reportMetadata.topRows;
182
+ if (Object.keys(options.metadata.reportMetadata).length === 0) {
183
+ delete options.metadata;
184
+ }
185
+ }
186
+ result = await report.execute(options);
187
+ }
188
+ else {
189
+ throw error;
190
+ }
191
+ }
192
+ // Format the result
193
+ const output = formatReportResult(result, defaultApplied, topRowsIgnored);
194
+ return {
195
+ content: [{
196
+ type: "text",
197
+ text: output
198
+ }],
199
+ isError: false,
200
+ };
201
+ }
202
+ function formatReportResult(result, defaultCapApplied, topRowsIgnored = false) {
203
+ const metadata = result.reportMetadata;
204
+ const extMetadata = result.reportExtendedMetadata;
205
+ const warnings = [];
206
+ let output = `Report: ${metadata.name}\n`;
207
+ output += `Format: ${metadata.reportFormat}\n\n`;
208
+ // Grand totals (always at T!T)
209
+ const grandTotal = result.factMap['T!T'];
210
+ if (grandTotal) {
211
+ output += `Grand Totals:\n`;
212
+ const aggKeys = Object.keys(extMetadata.aggregateColumnInfo);
213
+ grandTotal.aggregates.forEach((agg, i) => {
214
+ const label = aggKeys[i] ? extMetadata.aggregateColumnInfo[aggKeys[i]]?.label || aggKeys[i] : `Aggregate ${i + 1}`;
215
+ output += ` ${label}: ${agg.label}\n`;
216
+ });
217
+ output += '\n';
218
+ }
219
+ // Grouping summaries
220
+ if (result.groupingsDown?.groupings && result.groupingsDown.groupings.length > 0) {
221
+ output += `Grouping Summary:\n`;
222
+ output += formatGroupings(result.groupingsDown.groupings, result.factMap, extMetadata, 'T', 1);
223
+ output += '\n';
224
+ }
225
+ // Matrix: column groupings
226
+ if (result.groupingsAcross?.groupings && result.groupingsAcross.groupings.length > 0) {
227
+ output += `Column Groupings:\n`;
228
+ for (const g of result.groupingsAcross.groupings) {
229
+ output += ` ${g.label}\n`;
230
+ }
231
+ output += '\n';
232
+ }
233
+ // Detail rows
234
+ if (result.hasDetailRows) {
235
+ const allRows = collectDetailRows(result);
236
+ if (allRows.length > 0) {
237
+ // Column headers
238
+ const detailCols = metadata.detailColumns || [];
239
+ const headers = detailCols.map(col => {
240
+ const info = extMetadata.detailColumnInfo[col];
241
+ return info?.label || col;
242
+ });
243
+ output += `Detail Rows:\n`;
244
+ output += ` ${headers.join('\t')}\n`;
245
+ const displayCount = Math.min(allRows.length, DISPLAY_ROW_CAP);
246
+ for (let i = 0; i < displayCount; i++) {
247
+ const row = allRows[i];
248
+ const cells = row.dataCells.map((cell) => cell.label ?? String(cell.value ?? '')).join('\t');
249
+ output += ` ${cells}\n`;
250
+ }
251
+ if (allRows.length > DISPLAY_ROW_CAP) {
252
+ warnings.push(`Showing ${DISPLAY_ROW_CAP} of ${allRows.length} detail rows. Use topRows to adjust.`);
253
+ }
254
+ }
255
+ }
256
+ // Warnings
257
+ if (!result.allData) {
258
+ warnings.push('Results are truncated. The report has more rows than the 2,000 row API limit. Use salesforce_describe_analytics to see available filter columns, then narrow with filters or adjust topRows.');
259
+ }
260
+ if (defaultCapApplied) {
261
+ warnings.push(`Showing up to ${DEFAULT_DETAIL_ROW_LIMIT} detail rows (default limit). Provide topRows to adjust.`);
262
+ }
263
+ if (topRowsIgnored) {
264
+ warnings.push('topRows was ignored because this report format does not support row limit filters. All available detail rows are included.');
265
+ }
266
+ if (warnings.length > 0) {
267
+ output += '\n';
268
+ for (const w of warnings) {
269
+ output += `Note: ${w}\n`;
270
+ }
271
+ }
272
+ return output;
273
+ }
274
+ function formatGroupings(groupings, factMap, extMetadata, acrossKey, depth) {
275
+ let output = '';
276
+ const indent = ' '.repeat(depth);
277
+ for (const g of groupings) {
278
+ output += `${indent}${g.label}:\n`;
279
+ // Look up this grouping's factMap entry
280
+ const factKey = `${g.key}!${acrossKey}`;
281
+ const fact = factMap[factKey];
282
+ if (fact) {
283
+ const aggKeys = Object.keys(extMetadata.aggregateColumnInfo);
284
+ fact.aggregates.forEach((agg, i) => {
285
+ const label = aggKeys[i] ? extMetadata.aggregateColumnInfo[aggKeys[i]]?.label || aggKeys[i] : `Aggregate ${i + 1}`;
286
+ output += `${indent} ${label}: ${agg.label}\n`;
287
+ });
288
+ }
289
+ // Recurse into nested groupings
290
+ if (g.groupings && g.groupings.length > 0) {
291
+ output += formatGroupings(g.groupings, factMap, extMetadata, acrossKey, depth + 1);
292
+ }
293
+ }
294
+ return output;
295
+ }
296
+ function collectDetailRows(result) {
297
+ const rows = [];
298
+ for (const key of Object.keys(result.factMap)) {
299
+ const fact = result.factMap[key];
300
+ if (fact.rows) {
301
+ rows.push(...fact.rows);
302
+ }
303
+ }
304
+ return rows;
305
+ }
306
+ async function runDashboard(conn, dashboardId) {
307
+ const dashboard = conn.analytics.dashboard(dashboardId);
308
+ const result = await dashboard.components();
309
+ const meta = result.dashboardMetadata;
310
+ let output = `Dashboard: ${meta.name}\n`;
311
+ output += `Running User: ${meta.runningUser?.displayName || '(unknown)'}\n\n`;
312
+ if (!result.componentData || result.componentData.length === 0) {
313
+ output += 'No component data available.\n';
314
+ return {
315
+ content: [{
316
+ type: "text",
317
+ text: output
318
+ }],
319
+ isError: false,
320
+ };
321
+ }
322
+ // Build a lookup from component index to component metadata
323
+ const componentMeta = meta.components || [];
324
+ for (const cd of result.componentData) {
325
+ const comp = componentMeta.find((c) => c.id === cd.componentId);
326
+ const header = comp?.header || cd.componentId;
327
+ const vizType = comp?.properties?.visualizationType || comp?.type || 'unknown';
328
+ output += `--- ${header} [${vizType}] ---\n`;
329
+ // Component status
330
+ if (cd.status) {
331
+ if (cd.status.dataStatus === 'ERROR') {
332
+ output += ` Status: ERROR — ${cd.status.errorMessage || 'Unknown error'}\n`;
333
+ continue;
334
+ }
335
+ if (cd.status.dataStatus === 'NODATA') {
336
+ output += ` No data available\n`;
337
+ continue;
338
+ }
339
+ }
340
+ // Report result for this component
341
+ const rr = cd.reportResult;
342
+ if (rr) {
343
+ const extMeta = rr.reportExtendedMetadata;
344
+ // Grand total
345
+ const gt = rr.factMap['T!T'];
346
+ if (gt) {
347
+ const aggKeys = Object.keys(extMeta.aggregateColumnInfo);
348
+ gt.aggregates.forEach((agg, i) => {
349
+ const label = aggKeys[i] ? extMeta.aggregateColumnInfo[aggKeys[i]]?.label || aggKeys[i] : `Aggregate ${i + 1}`;
350
+ output += ` ${label}: ${agg.label}\n`;
351
+ });
352
+ }
353
+ // Grouping summaries
354
+ if (rr.groupingsDown?.groupings && rr.groupingsDown.groupings.length > 0) {
355
+ output += formatGroupings(rr.groupingsDown.groupings, rr.factMap, extMeta, 'T', 1);
356
+ }
357
+ }
358
+ output += '\n';
359
+ }
360
+ return {
361
+ content: [{
362
+ type: "text",
363
+ text: output
364
+ }],
365
+ isError: false,
366
+ };
367
+ }
@@ -0,0 +1,14 @@
1
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const SEARCH_OBJECTS: Tool;
3
+ export interface SearchObjectsArgs {
4
+ searchPattern: string;
5
+ limit?: number;
6
+ offset?: number;
7
+ }
8
+ export declare function handleSearchObjects(conn: any, args: SearchObjectsArgs): Promise<{
9
+ content: {
10
+ type: string;
11
+ text: string;
12
+ }[];
13
+ isError: boolean;
14
+ }>;
@@ -0,0 +1,69 @@
1
+ import { DEFAULT_LIMITS, applyDefaults, formatPaginationFooter } from "../utils/pagination.js";
2
+ export const SEARCH_OBJECTS = {
3
+ name: "salesforce_search_objects",
4
+ description: "Search for Salesforce standard and custom objects by name pattern. Examples: 'Account' will find Account, AccountHistory; 'Order' will find WorkOrder, ServiceOrder__c etc.",
5
+ inputSchema: {
6
+ type: "object",
7
+ properties: {
8
+ searchPattern: {
9
+ type: "string",
10
+ description: "Search pattern to find objects (e.g., 'Account Coverage' will find objects like 'AccountCoverage__c')"
11
+ },
12
+ limit: {
13
+ type: "number",
14
+ description: "Maximum number of results to return (default 50)"
15
+ },
16
+ offset: {
17
+ type: "number",
18
+ description: "Number of results to skip for pagination (default 0)"
19
+ }
20
+ },
21
+ required: ["searchPattern"]
22
+ }
23
+ };
24
+ export async function handleSearchObjects(conn, args) {
25
+ const { searchPattern } = args;
26
+ const { limit, offset } = applyDefaults({ limit: args.limit, offset: args.offset }, DEFAULT_LIMITS.search_objects);
27
+ // Get list of all objects
28
+ const describeGlobal = await conn.describeGlobal();
29
+ // Process search pattern to create a more flexible search
30
+ const searchTerms = searchPattern.toLowerCase().split(' ').filter(term => term.length > 0);
31
+ // Filter objects based on search pattern
32
+ const matchingObjects = describeGlobal.sobjects.filter((obj) => {
33
+ const objectName = obj.name.toLowerCase();
34
+ const objectLabel = obj.label.toLowerCase();
35
+ // Check if all search terms are present in either the API name or label
36
+ return searchTerms.every(term => objectName.includes(term) || objectLabel.includes(term));
37
+ });
38
+ const totalSize = matchingObjects.length;
39
+ if (totalSize === 0) {
40
+ return {
41
+ content: [{
42
+ type: "text",
43
+ text: `No Salesforce objects found matching "${searchPattern}".`
44
+ }],
45
+ isError: false,
46
+ };
47
+ }
48
+ // Apply pagination
49
+ const paged = matchingObjects.slice(offset, offset + limit);
50
+ const returned = paged.length;
51
+ const hasMore = (offset + returned) < totalSize;
52
+ // Format the output
53
+ const formattedResults = paged.map((obj) => `${obj.name}${obj.custom ? ' (Custom)' : ''}\n Label: ${obj.label}`).join('\n\n');
54
+ let text = `Found ${totalSize} matching objects:\n\n${formattedResults}`;
55
+ text += formatPaginationFooter({
56
+ totalSize,
57
+ returned,
58
+ offset,
59
+ limit,
60
+ hasMore,
61
+ });
62
+ return {
63
+ content: [{
64
+ type: "text",
65
+ text,
66
+ }],
67
+ isError: false,
68
+ };
69
+ }
@@ -0,0 +1,29 @@
1
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const SEARCH_ALL: Tool;
3
+ export interface SearchObject {
4
+ name: string;
5
+ fields: string[];
6
+ where?: string;
7
+ orderBy?: string;
8
+ limit?: number;
9
+ }
10
+ export interface WithClause {
11
+ type: "DATA CATEGORY" | "DIVISION" | "METADATA" | "NETWORK" | "PRICEBOOKID" | "SNIPPET" | "SECURITY_ENFORCED";
12
+ value?: string;
13
+ fields?: string[];
14
+ }
15
+ export interface SearchAllArgs {
16
+ searchTerm: string;
17
+ searchIn?: "ALL FIELDS" | "NAME FIELDS" | "EMAIL FIELDS" | "PHONE FIELDS" | "SIDEBAR FIELDS";
18
+ objects: SearchObject[];
19
+ withClauses?: WithClause[];
20
+ updateable?: boolean;
21
+ viewable?: boolean;
22
+ }
23
+ export declare function handleSearchAll(conn: any, args: SearchAllArgs): Promise<{
24
+ content: {
25
+ type: string;
26
+ text: string;
27
+ }[];
28
+ isError: boolean;
29
+ }>;