attio-mcp 1.1.1 → 1.1.3

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 (84) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +3 -2
  3. package/dist/api/client-context.d.ts.map +1 -1
  4. package/dist/api/client-context.js +39 -1
  5. package/dist/api/client-context.js.map +1 -1
  6. package/dist/api/operations/search.d.ts +5 -2
  7. package/dist/api/operations/search.d.ts.map +1 -1
  8. package/dist/api/operations/search.js +469 -9
  9. package/dist/api/operations/search.js.map +1 -1
  10. package/dist/handlers/tool-configs/openai/index.d.ts +2 -2
  11. package/dist/handlers/tool-configs/openai/index.d.ts.map +1 -1
  12. package/dist/handlers/tool-configs/openai/index.js +13 -2
  13. package/dist/handlers/tool-configs/openai/index.js.map +1 -1
  14. package/dist/handlers/tool-configs/universal/core/crud-operations.d.ts.map +1 -1
  15. package/dist/handlers/tool-configs/universal/core/crud-operations.js +22 -3
  16. package/dist/handlers/tool-configs/universal/core/crud-operations.js.map +1 -1
  17. package/dist/handlers/tool-configs/universal/index.d.ts +26 -2
  18. package/dist/handlers/tool-configs/universal/index.d.ts.map +1 -1
  19. package/dist/handlers/tool-configs/universal/index.js +10 -1
  20. package/dist/handlers/tool-configs/universal/index.js.map +1 -1
  21. package/dist/handlers/tool-configs/universal/smithery-diagnostics.d.ts +37 -0
  22. package/dist/handlers/tool-configs/universal/smithery-diagnostics.d.ts.map +1 -0
  23. package/dist/handlers/tool-configs/universal/smithery-diagnostics.js +103 -0
  24. package/dist/handlers/tool-configs/universal/smithery-diagnostics.js.map +1 -0
  25. package/dist/handlers/tools/registry.d.ts +26 -2
  26. package/dist/handlers/tools/registry.d.ts.map +1 -1
  27. package/dist/objects/deals/index.d.ts +1 -0
  28. package/dist/objects/deals/index.d.ts.map +1 -1
  29. package/dist/objects/deals/index.js +2 -0
  30. package/dist/objects/deals/index.js.map +1 -1
  31. package/dist/objects/deals/search.d.ts +16 -0
  32. package/dist/objects/deals/search.d.ts.map +1 -0
  33. package/dist/objects/deals/search.js +59 -0
  34. package/dist/objects/deals/search.js.map +1 -0
  35. package/dist/server/createServer.d.ts.map +1 -1
  36. package/dist/server/createServer.js +27 -4
  37. package/dist/server/createServer.js.map +1 -1
  38. package/dist/services/CachingService.d.ts +57 -0
  39. package/dist/services/CachingService.d.ts.map +1 -1
  40. package/dist/services/CachingService.js +112 -0
  41. package/dist/services/CachingService.js.map +1 -1
  42. package/dist/services/UniversalSearchService.d.ts +0 -12
  43. package/dist/services/UniversalSearchService.d.ts.map +1 -1
  44. package/dist/services/UniversalSearchService.js +19 -133
  45. package/dist/services/UniversalSearchService.js.map +1 -1
  46. package/dist/services/search-strategies/CompanySearchStrategy.d.ts.map +1 -1
  47. package/dist/services/search-strategies/CompanySearchStrategy.js +13 -11
  48. package/dist/services/search-strategies/CompanySearchStrategy.js.map +1 -1
  49. package/dist/services/search-strategies/DealSearchStrategy.d.ts +38 -0
  50. package/dist/services/search-strategies/DealSearchStrategy.d.ts.map +1 -0
  51. package/dist/services/search-strategies/DealSearchStrategy.js +119 -0
  52. package/dist/services/search-strategies/DealSearchStrategy.js.map +1 -0
  53. package/dist/services/search-strategies/NoteSearchStrategy.d.ts +62 -0
  54. package/dist/services/search-strategies/NoteSearchStrategy.d.ts.map +1 -0
  55. package/dist/services/search-strategies/NoteSearchStrategy.js +224 -0
  56. package/dist/services/search-strategies/NoteSearchStrategy.js.map +1 -0
  57. package/dist/services/search-strategies/PeopleSearchStrategy.d.ts.map +1 -1
  58. package/dist/services/search-strategies/PeopleSearchStrategy.js +13 -15
  59. package/dist/services/search-strategies/PeopleSearchStrategy.js.map +1 -1
  60. package/dist/services/search-strategies/index.d.ts +2 -0
  61. package/dist/services/search-strategies/index.d.ts.map +1 -1
  62. package/dist/services/search-strategies/index.js +2 -0
  63. package/dist/services/search-strategies/index.js.map +1 -1
  64. package/dist/services/search-strategies/interfaces.d.ts +6 -0
  65. package/dist/services/search-strategies/interfaces.d.ts.map +1 -1
  66. package/dist/services/search-utilities/SearchScorer.d.ts +4 -0
  67. package/dist/services/search-utilities/SearchScorer.d.ts.map +1 -0
  68. package/dist/services/search-utilities/SearchScorer.js +243 -0
  69. package/dist/services/search-utilities/SearchScorer.js.map +1 -0
  70. package/dist/services/search-utilities/SearchUtilities.d.ts +5 -0
  71. package/dist/services/search-utilities/SearchUtilities.d.ts.map +1 -1
  72. package/dist/services/search-utilities/SearchUtilities.js +20 -0
  73. package/dist/services/search-utilities/SearchUtilities.js.map +1 -1
  74. package/dist/smithery.d.ts +1 -1
  75. package/dist/smithery.d.ts.map +1 -1
  76. package/dist/smithery.js +45 -11
  77. package/dist/smithery.js.map +1 -1
  78. package/dist/utils/client-resolver.d.ts.map +1 -1
  79. package/dist/utils/client-resolver.js +30 -2
  80. package/dist/utils/client-resolver.js.map +1 -1
  81. package/dist/utils/mcp-discovery.d.ts.map +1 -1
  82. package/dist/utils/mcp-discovery.js +19 -1
  83. package/dist/utils/mcp-discovery.js.map +1 -1
  84. package/package.json +5 -1
@@ -9,6 +9,248 @@ import { FilterValidationError } from '../../errors/api-errors.js';
9
9
  import { ErrorEnhancer } from '../../errors/enhanced-api-errors.js';
10
10
  import { transformFiltersToApiFormat } from '../../utils/record-utils.js';
11
11
  import { ResourceType, } from '../../types/attio.js';
12
+ import { LRUCache } from 'lru-cache';
13
+ import { scoreAndRank } from '../../services/search-utilities/SearchScorer.js';
14
+ import { createScopedLogger } from '../../utils/logger.js';
15
+ const logger = createScopedLogger('api.operations', 'search');
16
+ const ENABLE_SEARCH_SCORING = process.env.ENABLE_SEARCH_SCORING !== 'false';
17
+ const SEARCH_CACHE_TTL_MS = Number.parseInt(process.env.SEARCH_CACHE_TTL_MS ?? `${5 * 60 * 1000}`, 10);
18
+ const SEARCH_CACHE_MAX = Number.parseInt(process.env.SEARCH_CACHE_MAX ?? '500', 10);
19
+ const SEARCH_FETCH_MULTIPLIER = Number.parseInt(process.env.SEARCH_FETCH_MULTIPLIER ?? '5', 10);
20
+ const SEARCH_FETCH_MIN = Number.parseInt(process.env.SEARCH_FETCH_MIN ?? '50', 10);
21
+ const SEARCH_FAST_PATH_LIMIT = Number.parseInt(process.env.SEARCH_FAST_PATH_LIMIT ?? '5', 10);
22
+ const DEFAULT_FETCH_LIMIT = Number.parseInt(process.env.SEARCH_DEFAULT_LIMIT ?? '20', 10);
23
+ const searchCache = new LRUCache({
24
+ max: Number.isFinite(SEARCH_CACHE_MAX) ? SEARCH_CACHE_MAX : 500,
25
+ ttl: Number.isFinite(SEARCH_CACHE_TTL_MS)
26
+ ? SEARCH_CACHE_TTL_MS
27
+ : 5 * 60 * 1000,
28
+ });
29
+ function getCacheKey(objectType, query, limit) {
30
+ return `${objectType}:${limit}:${query.toLowerCase()}`;
31
+ }
32
+ function normalizeDomainValue(value) {
33
+ return value
34
+ .toLowerCase()
35
+ .replace(/^https?:\/\//, '')
36
+ .replace(/^www\./, '')
37
+ .trim();
38
+ }
39
+ function normalizePlainValue(value) {
40
+ return value.toLowerCase().trim();
41
+ }
42
+ function extractStringsFromField(fieldValue, keys = []) {
43
+ const results = [];
44
+ const pushString = (candidate) => {
45
+ if (typeof candidate === 'string' && candidate.trim()) {
46
+ results.push(candidate);
47
+ }
48
+ };
49
+ if (!fieldValue) {
50
+ return results;
51
+ }
52
+ if (typeof fieldValue === 'string') {
53
+ pushString(fieldValue);
54
+ return results;
55
+ }
56
+ if (Array.isArray(fieldValue)) {
57
+ fieldValue.forEach((item) => {
58
+ if (typeof item === 'string') {
59
+ pushString(item);
60
+ }
61
+ else if (item && typeof item === 'object') {
62
+ keys.forEach((key) => {
63
+ pushString(item[key]);
64
+ });
65
+ }
66
+ });
67
+ return results;
68
+ }
69
+ if (fieldValue && typeof fieldValue === 'object') {
70
+ keys.forEach((key) => {
71
+ pushString(fieldValue[key]);
72
+ });
73
+ }
74
+ return results;
75
+ }
76
+ function extractNormalizedName(record) {
77
+ const values = (record?.values ?? {});
78
+ const candidates = [];
79
+ if ('name' in values) {
80
+ candidates.push(values.name);
81
+ }
82
+ if ('full_name' in values) {
83
+ candidates.push(values.full_name);
84
+ }
85
+ if ('title' in values) {
86
+ candidates.push(values.title);
87
+ }
88
+ const normalizeCandidate = (candidate) => {
89
+ if (typeof candidate === 'string' && candidate.trim()) {
90
+ return normalizePlainValue(candidate);
91
+ }
92
+ if (Array.isArray(candidate)) {
93
+ for (const item of candidate) {
94
+ const normalized = normalizeCandidate(item);
95
+ if (normalized) {
96
+ return normalized;
97
+ }
98
+ }
99
+ }
100
+ if (candidate && typeof candidate === 'object') {
101
+ const obj = candidate;
102
+ const nested = obj.full_name ?? obj.formatted ?? obj.value ?? obj.name;
103
+ if (typeof nested === 'string' && nested.trim()) {
104
+ return normalizePlainValue(nested);
105
+ }
106
+ }
107
+ return null;
108
+ };
109
+ for (const candidate of candidates) {
110
+ const normalized = normalizeCandidate(candidate);
111
+ if (normalized) {
112
+ return normalized;
113
+ }
114
+ }
115
+ return '';
116
+ }
117
+ /**
118
+ * Build fast-path candidates for structured queries.
119
+ *
120
+ * Issue #885: Attio API supports $eq operator (verified 2025-10-07)
121
+ * Supported operators: $eq, $contains, $starts_with, $ends_with, $not_empty
122
+ * NOT supported: $equals, $in
123
+ *
124
+ * @see scripts/test-attio-operators.mjs for operator verification tests
125
+ */
126
+ function buildFastPathCandidates(objectType, parsed, originalQuery) {
127
+ const candidates = [];
128
+ const trimmedQuery = originalQuery.trim();
129
+ if (objectType === ResourceType.COMPANIES && parsed.domains.length === 1) {
130
+ const normalizedDomain = normalizeDomainValue(parsed.domains[0]);
131
+ candidates.push({
132
+ filter: { domains: { $eq: normalizedDomain } },
133
+ kind: 'domain',
134
+ strategy: 'eq',
135
+ value: normalizedDomain,
136
+ });
137
+ candidates.push({
138
+ filter: { domains: { $contains: normalizedDomain } },
139
+ kind: 'domain',
140
+ strategy: 'contains',
141
+ value: normalizedDomain,
142
+ });
143
+ }
144
+ if (parsed.emails.length === 1) {
145
+ const emailValue = parsed.emails[0].toLowerCase();
146
+ candidates.push({
147
+ filter: { email_addresses: { $eq: emailValue } },
148
+ kind: 'email',
149
+ strategy: 'eq',
150
+ value: emailValue,
151
+ });
152
+ candidates.push({
153
+ filter: { email_addresses: { $contains: emailValue } },
154
+ kind: 'email',
155
+ strategy: 'contains',
156
+ value: emailValue,
157
+ });
158
+ }
159
+ // Try all phone variants as fast path candidates (parser creates normalized forms)
160
+ if (parsed.phones.length > 0) {
161
+ parsed.phones.forEach((phoneValue) => {
162
+ candidates.push({
163
+ filter: { phone_numbers: { $eq: phoneValue } },
164
+ kind: 'phone',
165
+ strategy: 'eq',
166
+ value: phoneValue,
167
+ });
168
+ });
169
+ }
170
+ const hasStructuredQuery = parsed.domains.length > 0 ||
171
+ parsed.emails.length > 0 ||
172
+ parsed.phones.length > 0;
173
+ if (trimmedQuery &&
174
+ !hasStructuredQuery &&
175
+ (objectType === ResourceType.COMPANIES ||
176
+ objectType === ResourceType.PEOPLE ||
177
+ objectType === ResourceType.DEALS)) {
178
+ const normalizedName = normalizePlainValue(trimmedQuery);
179
+ candidates.push({
180
+ filter: { name: { $eq: trimmedQuery } },
181
+ kind: 'name',
182
+ strategy: 'eq',
183
+ value: normalizedName,
184
+ });
185
+ candidates.push({
186
+ filter: { name: { $contains: trimmedQuery } },
187
+ kind: 'name',
188
+ strategy: 'contains',
189
+ value: normalizedName,
190
+ });
191
+ }
192
+ return candidates;
193
+ }
194
+ function recordMatchesFastPath(record, candidate) {
195
+ const values = (record?.values ?? {});
196
+ switch (candidate.kind) {
197
+ case 'domain': {
198
+ const domains = extractStringsFromField(values.domains, [
199
+ 'domain',
200
+ 'value',
201
+ ]).map(normalizeDomainValue);
202
+ if (candidate.strategy === 'eq') {
203
+ return domains.includes(candidate.value);
204
+ }
205
+ return domains.some((domain) => domain.includes(candidate.value));
206
+ }
207
+ case 'email': {
208
+ const emails = extractStringsFromField(values.email_addresses, [
209
+ 'email_address',
210
+ 'value',
211
+ ]).map(normalizePlainValue);
212
+ if (candidate.strategy === 'eq') {
213
+ return emails.includes(candidate.value);
214
+ }
215
+ return emails.some((email) => email.includes(candidate.value));
216
+ }
217
+ case 'phone': {
218
+ const phones = extractStringsFromField(values.phone_numbers, [
219
+ 'phone_number', // Main normalized field
220
+ 'original_phone_number', // Original input
221
+ 'number', // Legacy fallback
222
+ 'normalized', // Legacy fallback
223
+ 'value', // Legacy fallback
224
+ ]);
225
+ const normalizedSet = new Set();
226
+ phones.forEach((phone) => {
227
+ normalizedSet.add(phone);
228
+ normalizedSet.add(phone.replace(/\s+/g, ''));
229
+ // Also try with/without leading +
230
+ if (phone.startsWith('+')) {
231
+ normalizedSet.add(phone.substring(1));
232
+ }
233
+ else {
234
+ normalizedSet.add(`+${phone}`);
235
+ }
236
+ });
237
+ return (normalizedSet.has(candidate.value) ||
238
+ normalizedSet.has(candidate.value.replace(/\s+/g, '')));
239
+ }
240
+ case 'name': {
241
+ const recordName = extractNormalizedName(record);
242
+ if (!recordName) {
243
+ return false;
244
+ }
245
+ if (candidate.strategy === 'eq') {
246
+ return recordName === candidate.value;
247
+ }
248
+ return recordName.includes(candidate.value);
249
+ }
250
+ default:
251
+ return false;
252
+ }
253
+ }
12
254
  function createLegacyFilter(objectType, query) {
13
255
  if (objectType === ResourceType.PEOPLE) {
14
256
  return {
@@ -28,12 +270,12 @@ function addCondition(collection, seen, condition) {
28
270
  collection.push(condition);
29
271
  }
30
272
  }
31
- function buildSearchFilter(objectType, query) {
273
+ function buildSearchFilter(objectType, query, parsedOverride) {
32
274
  const trimmedQuery = query.trim();
33
275
  if (!trimmedQuery) {
34
276
  return createLegacyFilter(objectType, query);
35
277
  }
36
- const parsed = parseQuery(trimmedQuery);
278
+ const parsed = parsedOverride ?? parseQuery(trimmedQuery);
37
279
  const conditions = [];
38
280
  const seen = new Set();
39
281
  parsed.emails.forEach((email) => {
@@ -63,6 +305,99 @@ function buildSearchFilter(objectType, query) {
63
305
  tokenTargets.add('domains');
64
306
  }
65
307
  const uniqueTokens = Array.from(new Set(parsed.tokens.filter((token) => token.length > 1)));
308
+ // AND-of-OR search strategy (#885 fix):
309
+ // For each token, allow it to match ANY field (name OR domains OR email/phone)
310
+ // But ALL tokens must match SOMEWHERE
311
+ // This provides precision (all tokens required) + cross-field flexibility (name + domain tokens)
312
+ //
313
+ // Example: "Elite Styles Beauty Mindful Program"
314
+ // - "Elite" can match name OR domains
315
+ // - "Styles" can match name OR domains
316
+ // - "Mindful" can match name OR domains (will match domain mindfulbeautyprogram.com)
317
+ // - etc.
318
+ //
319
+ // Result: Company "Elite Styles And Beauty" (mindfulbeautyprogram.com) matches because:
320
+ // - "Elite" matches name ✓
321
+ // - "Styles" matches name ✓
322
+ // - "Beauty" matches name ✓
323
+ // - "Mindful" matches domain ✓
324
+ // - "Program" matches domain ✓
325
+ if (uniqueTokens.length > 0) {
326
+ if (uniqueTokens.length === 1) {
327
+ // Single token: create OR condition across all relevant fields
328
+ const token = uniqueTokens[0];
329
+ tokenTargets.forEach((field) => {
330
+ addCondition(conditions, seen, {
331
+ [field]: { $contains: token },
332
+ });
333
+ });
334
+ }
335
+ else {
336
+ // Multiple tokens: each token must match at least one field (AND of ORs)
337
+ const tokenAndConditions = uniqueTokens.map((token) => {
338
+ const tokenFieldConditions = [];
339
+ tokenTargets.forEach((field) => {
340
+ tokenFieldConditions.push({
341
+ [field]: { $contains: token },
342
+ });
343
+ });
344
+ return {
345
+ $or: tokenFieldConditions,
346
+ };
347
+ });
348
+ // Combine all token conditions with AND
349
+ addCondition(conditions, seen, {
350
+ $and: tokenAndConditions,
351
+ });
352
+ }
353
+ }
354
+ if (conditions.length === 0) {
355
+ return createLegacyFilter(objectType, trimmedQuery);
356
+ }
357
+ if (conditions.length === 1) {
358
+ return conditions[0];
359
+ }
360
+ return {
361
+ $or: conditions,
362
+ };
363
+ }
364
+ /**
365
+ * Build OR-only fallback filter for when AND-of-OR returns zero results
366
+ * Uses the same parsed structure but allows ANY token to match (no AND requirement)
367
+ */
368
+ function buildORFallbackFilter(objectType, parsed) {
369
+ const conditions = [];
370
+ const seen = new Set();
371
+ // Include all structured fields as before
372
+ parsed.emails.forEach((email) => {
373
+ addCondition(conditions, seen, {
374
+ email_addresses: { $contains: email },
375
+ });
376
+ });
377
+ parsed.phones.forEach((phone) => {
378
+ addCondition(conditions, seen, {
379
+ phone_numbers: { $contains: phone },
380
+ });
381
+ });
382
+ if (objectType === ResourceType.COMPANIES) {
383
+ parsed.domains.forEach((domain) => {
384
+ addCondition(conditions, seen, {
385
+ domains: { $contains: domain },
386
+ });
387
+ });
388
+ }
389
+ const tokenTargets = new Set();
390
+ tokenTargets.add('name');
391
+ if (objectType === ResourceType.PEOPLE) {
392
+ tokenTargets.add('email_addresses');
393
+ tokenTargets.add('phone_numbers');
394
+ }
395
+ if (objectType === ResourceType.COMPANIES) {
396
+ tokenTargets.add('domains');
397
+ }
398
+ const uniqueTokens = Array.from(new Set(parsed.tokens.filter((token) => token.length > 1)));
399
+ // OR-only fallback: each token can match any field (no AND requirement)
400
+ // This provides maximum recall when the stricter AND-of-OR filter returns zero results
66
401
  uniqueTokens.forEach((token) => {
67
402
  tokenTargets.forEach((field) => {
68
403
  addCondition(conditions, seen, {
@@ -71,7 +406,8 @@ function buildSearchFilter(objectType, query) {
71
406
  });
72
407
  });
73
408
  if (conditions.length === 0) {
74
- return createLegacyFilter(objectType, trimmedQuery);
409
+ // Shouldn't happen, but return safe fallback
410
+ return { name: { $contains: parsed.tokens.join(' ') } };
75
411
  }
76
412
  if (conditions.length === 1) {
77
413
  return conditions[0];
@@ -85,27 +421,151 @@ function buildSearchFilter(objectType, query) {
85
421
  *
86
422
  * @param objectType - The type of object to search (people or companies)
87
423
  * @param query - Search query string
88
- * @param retryConfig - Optional retry configuration
424
+ * @param options - Optional search options (limit, retryConfig)
89
425
  * @returns Array of matching records
90
426
  */
91
- export async function searchObject(objectType, query, retryConfig) {
427
+ export async function searchObject(objectType, query, options) {
428
+ const retryConfig = options?.retryConfig;
92
429
  const api = getLazyAttioClient();
93
430
  const path = `/objects/${objectType}/records/query`;
94
- const filter = buildSearchFilter(objectType, query);
431
+ const trimmedQuery = query.trim();
432
+ const scoringEnabled = ENABLE_SEARCH_SCORING && trimmedQuery.length > 0;
433
+ // Use caller's limit if provided, otherwise fall back to default
434
+ const requestedLimit = options?.limit;
435
+ const baseLimit = requestedLimit !== undefined && requestedLimit > 0
436
+ ? requestedLimit
437
+ : Number.isFinite(DEFAULT_FETCH_LIMIT) && DEFAULT_FETCH_LIMIT > 0
438
+ ? DEFAULT_FETCH_LIMIT
439
+ : 20;
440
+ const multiplier = Number.isFinite(SEARCH_FETCH_MULTIPLIER) && SEARCH_FETCH_MULTIPLIER > 0
441
+ ? SEARCH_FETCH_MULTIPLIER
442
+ : 5;
443
+ const minimumFetch = Number.isFinite(SEARCH_FETCH_MIN) && SEARCH_FETCH_MIN > 0
444
+ ? SEARCH_FETCH_MIN
445
+ : 50;
446
+ const fastPathLimit = Number.isFinite(SEARCH_FAST_PATH_LIMIT) && SEARCH_FAST_PATH_LIMIT > 0
447
+ ? Math.max(baseLimit, SEARCH_FAST_PATH_LIMIT)
448
+ : baseLimit;
449
+ const parsedQuery = trimmedQuery ? parseQuery(trimmedQuery) : null;
450
+ const cacheKey = scoringEnabled && trimmedQuery
451
+ ? getCacheKey(objectType, trimmedQuery, baseLimit)
452
+ : null;
453
+ if (scoringEnabled && cacheKey) {
454
+ const cached = searchCache.get(cacheKey);
455
+ if (cached) {
456
+ return cached;
457
+ }
458
+ }
459
+ if (scoringEnabled && parsedQuery) {
460
+ const fastCandidates = buildFastPathCandidates(objectType, parsedQuery, trimmedQuery);
461
+ for (const candidate of fastCandidates) {
462
+ const candidateLimit = candidate.kind === 'name' && candidate.strategy === 'contains'
463
+ ? Math.min(100, Math.max(minimumFetch, baseLimit * multiplier))
464
+ : candidate.kind === 'name' && candidate.strategy === 'eq'
465
+ ? baseLimit
466
+ : fastPathLimit;
467
+ logger.debug('[FastPath] Trying candidate', {
468
+ kind: candidate.kind,
469
+ strategy: candidate.strategy,
470
+ filter: candidate.filter,
471
+ limit: candidateLimit,
472
+ });
473
+ try {
474
+ const fastResponse = await callWithRetry(async () => {
475
+ return api.post(path, {
476
+ filter: candidate.filter,
477
+ limit: candidateLimit,
478
+ });
479
+ }, retryConfig);
480
+ const fastData = Array.isArray(fastResponse?.data?.data)
481
+ ? fastResponse?.data?.data
482
+ : [];
483
+ logger.debug('[FastPath] Received results', {
484
+ count: fastData.length,
485
+ });
486
+ if (!fastData.length) {
487
+ logger.debug('[FastPath] No results for candidate');
488
+ continue;
489
+ }
490
+ const hasMatch = fastData.some((record) => recordMatchesFastPath(record, candidate));
491
+ if (!hasMatch) {
492
+ logger.debug('[FastPath] Validation failed', {
493
+ candidateKind: candidate.kind,
494
+ candidateStrategy: candidate.strategy,
495
+ candidateValue: candidate.value,
496
+ resultCount: fastData.length,
497
+ });
498
+ continue;
499
+ }
500
+ logger.debug('[FastPath] Validation passed, ranking');
501
+ const rankedFast = scoreAndRank(trimmedQuery, fastData, parsedQuery);
502
+ const truncatedFast = rankedFast.slice(0, baseLimit);
503
+ if (cacheKey) {
504
+ searchCache.set(cacheKey, truncatedFast);
505
+ }
506
+ return truncatedFast;
507
+ }
508
+ catch (error) {
509
+ logger.debug('[FastPath] Error executing candidate', {
510
+ kind: candidate.kind,
511
+ strategy: candidate.strategy,
512
+ filter: candidate.filter,
513
+ error: error instanceof Error ? error.message : String(error),
514
+ });
515
+ void error; // Non-fatal fast-path failure; fall back to next candidate
516
+ }
517
+ }
518
+ }
519
+ const filter = buildSearchFilter(objectType, query, parsedQuery ?? undefined);
520
+ const fetchLimit = scoringEnabled
521
+ ? Math.max(minimumFetch, baseLimit * multiplier)
522
+ : baseLimit;
95
523
  return callWithRetry(async () => {
96
524
  try {
97
525
  const response = await api.post(path, {
98
526
  filter,
527
+ limit: fetchLimit,
99
528
  });
100
- return response?.data?.data || [];
529
+ const rawData = response?.data?.data;
530
+ let data = Array.isArray(rawData) ? rawData : [];
531
+ // OR-only fallback when AND-of-OR returns zero results (#885 recall fix)
532
+ // This handles over-constrained queries like "Beauty Glow Aesthetics Frisco"
533
+ // where some tokens don't exist but the record should still match
534
+ // Runs regardless of scoring state - scoring only affects ranking, not recall
535
+ if (data.length === 0 && parsedQuery) {
536
+ logger.debug('[Fallback] Zero results from AND-of-OR, trying OR-only', {
537
+ query: trimmedQuery,
538
+ objectType,
539
+ });
540
+ const fallbackFilter = buildORFallbackFilter(objectType, parsedQuery);
541
+ const fallbackResponse = await api.post(path, {
542
+ filter: fallbackFilter,
543
+ limit: fetchLimit,
544
+ });
545
+ const fallbackRawData = fallbackResponse?.data?.data;
546
+ data = Array.isArray(fallbackRawData)
547
+ ? fallbackRawData
548
+ : [];
549
+ logger.debug('[Fallback] OR-only results', {
550
+ count: data.length,
551
+ });
552
+ }
553
+ if (!scoringEnabled || data.length <= 1) {
554
+ const truncated = data.slice(0, baseLimit);
555
+ return truncated;
556
+ }
557
+ const ranked = scoreAndRank(trimmedQuery, data, parsedQuery ?? undefined);
558
+ const truncated = ranked.slice(0, baseLimit);
559
+ if (cacheKey) {
560
+ searchCache.set(cacheKey, truncated);
561
+ }
562
+ return truncated;
101
563
  }
102
564
  catch (error) {
103
565
  const apiError = error;
104
- // Handle 404 errors with custom message
105
566
  if (apiError.response && apiError.response.status === 404) {
106
567
  throw new Error(`No ${objectType} found matching '${query}'`);
107
568
  }
108
- // Let upstream handlers create specific, rich error objects from the original Axios error.
109
569
  throw error;
110
570
  }
111
571
  }, retryConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/api/operations/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/api/operations/search.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ export declare const openAiToolConfigs: {
6
6
  export declare const openAiToolDefinitions: {
7
7
  readonly 'openai-search': {
8
8
  readonly name: "search";
9
- readonly description: "Simple search by query string across companies, people, lists, and tasks. For advanced filtering, date ranges, or relationships, use records.search instead.";
9
+ readonly description: string;
10
10
  readonly inputSchema: {
11
11
  type: "object";
12
12
  properties: {
@@ -36,7 +36,7 @@ export declare const openAiToolDefinitions: {
36
36
  };
37
37
  readonly 'openai-fetch': {
38
38
  readonly name: "fetch";
39
- readonly description: "Retrieve the full record payload for a search result ID.";
39
+ readonly description: string;
40
40
  readonly inputSchema: {
41
41
  type: "object";
42
42
  properties: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/handlers/tool-configs/openai/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAkIjD,eAAO,MAAM,iBAAiB;;;CAGpB,CAAC;AAEX,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoBxB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/handlers/tool-configs/openai/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAmIjD,eAAO,MAAM,iBAAiB;;;CAGpB,CAAC;AAEX,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCxB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { OpenAiCompatibilityService, } from '../../../services/OpenAiCompatibilityService.js';
3
+ import { formatToolDescription } from '../../../handlers/tools/standards/index.js';
3
4
  const searchParamsValidator = z.object({
4
5
  query: z.string().min(1, 'Query is required'),
5
6
  type: z.enum(['companies', 'people', 'lists', 'tasks', 'all']).optional(),
@@ -122,7 +123,12 @@ export const openAiToolConfigs = {
122
123
  export const openAiToolDefinitions = {
123
124
  'openai-search': {
124
125
  name: 'search',
125
- description: 'Simple search by query string across companies, people, lists, and tasks. For advanced filtering, date ranges, or relationships, use records.search instead.',
126
+ description: formatToolDescription({
127
+ capability: 'Run lightweight compatibility search across companies, people, lists, and tasks for ChatGPT MCP.',
128
+ boundaries: 'support complex filters, batch queries, or return rich record payloads (use records_search* tools).',
129
+ constraints: 'Requires query string (min 1 char); optional type filter; limit up to 25 results per call.',
130
+ recoveryHint: 'When you need pagination or attribute filtering, switch to records_search or records_search_advanced.',
131
+ }),
126
132
  inputSchema: searchInputSchema,
127
133
  annotations: {
128
134
  readOnlyHint: true,
@@ -131,7 +137,12 @@ export const openAiToolDefinitions = {
131
137
  },
132
138
  'openai-fetch': {
133
139
  name: 'fetch',
134
- description: 'Retrieve the full record payload for a search result ID.',
140
+ description: formatToolDescription({
141
+ capability: 'Return the canonical Attio record payload for a search connector reference.',
142
+ boundaries: 'perform write operations or resolve IDs not emitted by the search tool.',
143
+ constraints: 'Accepts identifier generated by search (<resource>:<uuid>) and returns JSON serialized as text.',
144
+ recoveryHint: 'If fetch fails, rerun search to refresh the identifier or verify the record still exists.',
145
+ }),
135
146
  inputSchema: fetchInputSchema,
136
147
  annotations: {
137
148
  readOnlyHint: true,