bitrix24-tasks-mcp-server 1.6.6 → 1.8.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/CRM_MAIL_TO_LEAD.md +193 -0
- package/README.md +42 -2
- package/build/bitrix24/client.d.ts +7 -0
- package/build/bitrix24/client.d.ts.map +1 -1
- package/build/bitrix24/client.js +10 -1
- package/build/bitrix24/client.js.map +1 -1
- package/build/bitrix24/crm.d.ts +71 -0
- package/build/bitrix24/crm.d.ts.map +1 -0
- package/build/bitrix24/crm.js +369 -0
- package/build/bitrix24/crm.js.map +1 -0
- package/build/bitrix24/crmMetadata.d.ts +25 -0
- package/build/bitrix24/crmMetadata.d.ts.map +1 -0
- package/build/bitrix24/crmMetadata.js +117 -0
- package/build/bitrix24/crmMetadata.js.map +1 -0
- package/build/index.js +1 -1
- package/build/tools/crm.d.ts +17 -0
- package/build/tools/crm.d.ts.map +1 -0
- package/build/tools/crm.js +246 -0
- package/build/tools/crm.js.map +1 -0
- package/build/tools/index.d.ts.map +1 -1
- package/build/tools/index.js +10 -2
- package/build/tools/index.js.map +1 -1
- package/build/utils/toolLogging.d.ts.map +1 -1
- package/build/utils/toolLogging.js +9 -3
- package/build/utils/toolLogging.js.map +1 -1
- package/package.json +7 -4
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { withCrossProcessCompositeLock } from './compositeLock.js';
|
|
3
|
+
import { listCrmRecords } from './crmMetadata.js';
|
|
4
|
+
const CRM_FIELD_PATTERN = /^UF_CRM_[A-Z0-9_]+$/i;
|
|
5
|
+
const RESERVED_LEAD_FIELDS = new Set([
|
|
6
|
+
'TITLE', 'SOURCE_ID', 'STATUS_ID', 'ASSIGNED_BY_ID', 'COMMENTS', 'COMPANY_ID',
|
|
7
|
+
'CONTACT_ID', 'NAME', 'LAST_NAME', 'PHONE', 'EMAIL'
|
|
8
|
+
]);
|
|
9
|
+
function optionalString(value) {
|
|
10
|
+
const result = String(value ?? '').trim();
|
|
11
|
+
return result || undefined;
|
|
12
|
+
}
|
|
13
|
+
function normalizeCompanyTitle(value) {
|
|
14
|
+
return String(value ?? '')
|
|
15
|
+
.normalize('NFKC')
|
|
16
|
+
.toLocaleLowerCase('ru-RU')
|
|
17
|
+
.replace(/ё/g, 'е')
|
|
18
|
+
.replace(/[«»"']/g, '')
|
|
19
|
+
.replace(/[^\p{L}\p{N}]+/gu, ' ')
|
|
20
|
+
.replace(/(^|\s)(ооо|ао|пао|зао|оао|ип)(?=\s|$)/giu, ' ')
|
|
21
|
+
.replace(/\s+/g, ' ')
|
|
22
|
+
.trim();
|
|
23
|
+
}
|
|
24
|
+
function normalizeEmail(value) {
|
|
25
|
+
return String(value ?? '').trim().toLocaleLowerCase('en-US');
|
|
26
|
+
}
|
|
27
|
+
function recordId(record) {
|
|
28
|
+
return String(record.ID ?? record.id ?? '').trim();
|
|
29
|
+
}
|
|
30
|
+
function resultIds(value, entity) {
|
|
31
|
+
const record = value && typeof value === 'object' ? value : {};
|
|
32
|
+
const raw = record[entity.toUpperCase()] ?? record[entity] ?? [];
|
|
33
|
+
const values = Array.isArray(raw) ? raw : raw === undefined ? [] : [raw];
|
|
34
|
+
return [...new Set(values.map(String).map((id) => id.trim()).filter(Boolean))];
|
|
35
|
+
}
|
|
36
|
+
function stripReservedFields(fields, reserved) {
|
|
37
|
+
return Object.fromEntries(Object.entries(fields ?? {}).filter(([key]) => !reserved.has(key.toUpperCase())));
|
|
38
|
+
}
|
|
39
|
+
export class Bitrix24CrmService {
|
|
40
|
+
client;
|
|
41
|
+
constructor(client) {
|
|
42
|
+
this.client = client;
|
|
43
|
+
}
|
|
44
|
+
entityUrl(entity, id) {
|
|
45
|
+
const origin = this.client.getPortalOrigin();
|
|
46
|
+
return origin ? `${origin}/crm/${entity}/details/${encodeURIComponent(id)}/` : undefined;
|
|
47
|
+
}
|
|
48
|
+
async getEntities(entity, ids) {
|
|
49
|
+
if (ids.length === 0)
|
|
50
|
+
return [];
|
|
51
|
+
const result = await listCrmRecords(this.client, `crm.${entity}.list`, {
|
|
52
|
+
filter: { '@ID': ids },
|
|
53
|
+
select: ['*', 'UF_*'],
|
|
54
|
+
order: { ID: 'ASC' }
|
|
55
|
+
});
|
|
56
|
+
return result.filter((item) => recordId(item));
|
|
57
|
+
}
|
|
58
|
+
async getEntity(entity, id) {
|
|
59
|
+
const result = await this.client.callRest(`crm.${entity}.get`, { id });
|
|
60
|
+
const item = (result ?? {});
|
|
61
|
+
return { ...item, detailUrl: this.entityUrl(entity, recordId(item) || id) };
|
|
62
|
+
}
|
|
63
|
+
async findActiveUserByEmail(email) {
|
|
64
|
+
const normalizedEmail = normalizeEmail(email);
|
|
65
|
+
const result = await listCrmRecords(this.client, 'user.get', {
|
|
66
|
+
FILTER: { EMAIL: normalizedEmail, ACTIVE: 'Y' }
|
|
67
|
+
});
|
|
68
|
+
const matches = result
|
|
69
|
+
.filter((item) => normalizeEmail(item.EMAIL) === normalizedEmail)
|
|
70
|
+
.filter((item) => {
|
|
71
|
+
const active = item.ACTIVE;
|
|
72
|
+
return active === true || String(active).toUpperCase() === 'Y';
|
|
73
|
+
})
|
|
74
|
+
.map((item) => item);
|
|
75
|
+
return { status: this.status(matches), matches };
|
|
76
|
+
}
|
|
77
|
+
async findCompany(lookup) {
|
|
78
|
+
const inn = optionalString(lookup.inn)?.replace(/\D/g, '');
|
|
79
|
+
if (inn) {
|
|
80
|
+
const requisites = await listCrmRecords(this.client, 'crm.requisite.list', {
|
|
81
|
+
filter: { ENTITY_TYPE_ID: 4, RQ_INN: inn },
|
|
82
|
+
select: ['ID', 'ENTITY_ID', 'RQ_INN']
|
|
83
|
+
});
|
|
84
|
+
const ids = [...new Set(requisites
|
|
85
|
+
.map((item) => String(item.ENTITY_ID ?? '').trim())
|
|
86
|
+
.filter(Boolean))];
|
|
87
|
+
if (ids.length > 0) {
|
|
88
|
+
const matches = await this.getEntities('company', ids);
|
|
89
|
+
return { status: this.status(matches), matchedBy: 'inn', matches };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
for (const [type, value] of [['PHONE', lookup.phone], ['EMAIL', lookup.email]]) {
|
|
93
|
+
const normalizedValue = optionalString(value);
|
|
94
|
+
if (!normalizedValue)
|
|
95
|
+
continue;
|
|
96
|
+
const duplicates = await this.client.callRest('crm.duplicate.findbycomm', {
|
|
97
|
+
entity_type: 'COMPANY', type, values: [normalizedValue]
|
|
98
|
+
});
|
|
99
|
+
const ids = resultIds(duplicates, 'company');
|
|
100
|
+
if (ids.length > 0) {
|
|
101
|
+
const matches = await this.getEntities('company', ids);
|
|
102
|
+
return {
|
|
103
|
+
status: this.status(matches),
|
|
104
|
+
matchedBy: type === 'PHONE' ? 'phone' : 'email',
|
|
105
|
+
matches
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const title = optionalString(lookup.title);
|
|
110
|
+
if (title) {
|
|
111
|
+
const normalizedTitle = normalizeCompanyTitle(title);
|
|
112
|
+
if (!normalizedTitle)
|
|
113
|
+
return { status: 'none', matches: [] };
|
|
114
|
+
// Search by a name token, not the raw legal form/quotes/punctuation: the
|
|
115
|
+
// latter excludes companies before their normalized title can be compared.
|
|
116
|
+
// Exclude е from the candidate substring so either е or ё in CRM can match.
|
|
117
|
+
// A name made only of these letters needs the complete bounded list.
|
|
118
|
+
const titleToken = normalizedTitle.split(/[\sе]+/u)
|
|
119
|
+
.sort((left, right) => right.length - left.length)[0];
|
|
120
|
+
const result = await listCrmRecords(this.client, 'crm.company.list', {
|
|
121
|
+
...(titleToken ? { filter: { '%TITLE': titleToken } } : {}),
|
|
122
|
+
select: ['*', 'UF_*'],
|
|
123
|
+
order: { ID: 'ASC' }
|
|
124
|
+
});
|
|
125
|
+
const matches = result.filter((item) => normalizeCompanyTitle(item.TITLE) === normalizedTitle);
|
|
126
|
+
if (matches.length > 0) {
|
|
127
|
+
return { status: this.status(matches), matchedBy: 'title', matches };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return { status: 'none', matches: [] };
|
|
131
|
+
}
|
|
132
|
+
async resolveOrCreateCompany(input) {
|
|
133
|
+
const lookup = await this.findCompany(input);
|
|
134
|
+
if (lookup.status === 'unique') {
|
|
135
|
+
const company = lookup.matches[0];
|
|
136
|
+
const id = recordId(company);
|
|
137
|
+
return { action: 'reused', matchedBy: lookup.matchedBy, companyId: id, company,
|
|
138
|
+
detailUrl: this.entityUrl('company', id) };
|
|
139
|
+
}
|
|
140
|
+
if (lookup.status === 'ambiguous') {
|
|
141
|
+
return {
|
|
142
|
+
action: 'ambiguous', matchedBy: lookup.matchedBy,
|
|
143
|
+
candidates: lookup.matches.map((company) => ({
|
|
144
|
+
...company, detailUrl: this.entityUrl('company', recordId(company))
|
|
145
|
+
}))
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const title = optionalString(input.title);
|
|
149
|
+
if (!title)
|
|
150
|
+
throw new Error('title is required when no existing company is found');
|
|
151
|
+
const fields = {
|
|
152
|
+
...stripReservedFields(input.additionalFields, new Set(['TITLE', 'ASSIGNED_BY_ID', 'COMMENTS'])),
|
|
153
|
+
TITLE: title,
|
|
154
|
+
...(input.assignedById ? { ASSIGNED_BY_ID: input.assignedById } : {}),
|
|
155
|
+
...(input.phone ? { PHONE: [{ VALUE: input.phone, VALUE_TYPE: 'WORK' }] } : {}),
|
|
156
|
+
...(input.email ? { EMAIL: [{ VALUE: input.email, VALUE_TYPE: 'WORK' }] } : {}),
|
|
157
|
+
...(input.comments ? { COMMENTS: input.comments } : {})
|
|
158
|
+
};
|
|
159
|
+
let companyId;
|
|
160
|
+
let recoveredCompany;
|
|
161
|
+
let recoveredMatchedBy;
|
|
162
|
+
try {
|
|
163
|
+
companyId = String(await this.client.callRest('crm.company.add', { fields }));
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
const recovered = await this.findCompany(input);
|
|
167
|
+
if (recovered.status === 'unique') {
|
|
168
|
+
companyId = recordId(recovered.matches[0]);
|
|
169
|
+
recoveredCompany = recovered.matches[0];
|
|
170
|
+
recoveredMatchedBy = recovered.matchedBy;
|
|
171
|
+
}
|
|
172
|
+
else if (recovered.status === 'ambiguous') {
|
|
173
|
+
return { action: 'ambiguous', matchedBy: recovered.matchedBy,
|
|
174
|
+
candidates: recovered.matches.map((company) => ({
|
|
175
|
+
...company, detailUrl: this.entityUrl('company', recordId(company))
|
|
176
|
+
})) };
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
let requisiteId;
|
|
183
|
+
const inn = optionalString(input.inn)?.replace(/\D/g, '');
|
|
184
|
+
if (inn) {
|
|
185
|
+
if (recoveredCompany)
|
|
186
|
+
requisiteId = await this.findCompanyRequisite(companyId, inn);
|
|
187
|
+
if (!requisiteId) {
|
|
188
|
+
try {
|
|
189
|
+
requisiteId = String(await this.client.callRest('crm.requisite.add', {
|
|
190
|
+
fields: { ENTITY_TYPE_ID: 4, ENTITY_ID: companyId,
|
|
191
|
+
PRESET_ID: input.requisitePresetId ?? '1',
|
|
192
|
+
NAME: `Реквизиты ${title}`, RQ_INN: inn }
|
|
193
|
+
}));
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
requisiteId = await this.findCompanyRequisite(companyId, inn);
|
|
197
|
+
if (!requisiteId)
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const company = recoveredCompany ?? await this.getEntity('company', companyId);
|
|
203
|
+
return { action: recoveredCompany ? 'recovered' : 'created',
|
|
204
|
+
...(recoveredMatchedBy ? { matchedBy: recoveredMatchedBy } : {}), companyId, requisiteId, company,
|
|
205
|
+
detailUrl: this.entityUrl('company', companyId) };
|
|
206
|
+
}
|
|
207
|
+
async findCompanyRequisite(companyId, inn) {
|
|
208
|
+
const records = await listCrmRecords(this.client, 'crm.requisite.list', {
|
|
209
|
+
filter: { ENTITY_TYPE_ID: 4, ENTITY_ID: companyId, RQ_INN: inn },
|
|
210
|
+
select: ['ID', 'ENTITY_TYPE_ID', 'ENTITY_ID', 'RQ_INN'],
|
|
211
|
+
order: { ID: 'ASC' }
|
|
212
|
+
});
|
|
213
|
+
const matches = records.filter((record) => String(record.ENTITY_TYPE_ID) === '4' &&
|
|
214
|
+
String(record.ENTITY_ID) === companyId &&
|
|
215
|
+
String(record.RQ_INN ?? '').replace(/\D/g, '') === inn && recordId(record));
|
|
216
|
+
if (matches.length > 1) {
|
|
217
|
+
throw new Error(`Multiple matching requisites found for company ${companyId}; manual review is required`);
|
|
218
|
+
}
|
|
219
|
+
return matches.length === 1 ? recordId(matches[0]) : undefined;
|
|
220
|
+
}
|
|
221
|
+
async findContact(phone, email) {
|
|
222
|
+
for (const [type, value] of [['PHONE', phone], ['EMAIL', email]]) {
|
|
223
|
+
const normalizedValue = optionalString(value);
|
|
224
|
+
if (!normalizedValue)
|
|
225
|
+
continue;
|
|
226
|
+
const duplicates = await this.client.callRest('crm.duplicate.findbycomm', {
|
|
227
|
+
entity_type: 'CONTACT', type, values: [normalizedValue]
|
|
228
|
+
});
|
|
229
|
+
const ids = resultIds(duplicates, 'contact');
|
|
230
|
+
if (ids.length > 0) {
|
|
231
|
+
const matches = await this.getEntities('contact', ids);
|
|
232
|
+
return { status: this.status(matches), matchedBy: type === 'PHONE' ? 'phone' : 'email', matches };
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return { status: 'none', matches: [] };
|
|
236
|
+
}
|
|
237
|
+
async resolveOrCreateContact(input) {
|
|
238
|
+
if (!optionalString(input.phone) && !optionalString(input.email)) {
|
|
239
|
+
throw new Error('phone or email is required to search or create a client contact');
|
|
240
|
+
}
|
|
241
|
+
const lookup = await this.findContact(input.phone, input.email);
|
|
242
|
+
if (lookup.status === 'unique') {
|
|
243
|
+
const contact = lookup.matches[0];
|
|
244
|
+
const id = recordId(contact);
|
|
245
|
+
return { action: 'reused', matchedBy: lookup.matchedBy, contactId: id, contact,
|
|
246
|
+
detailUrl: this.entityUrl('contact', id) };
|
|
247
|
+
}
|
|
248
|
+
if (lookup.status === 'ambiguous') {
|
|
249
|
+
return { action: 'ambiguous', matchedBy: lookup.matchedBy,
|
|
250
|
+
candidates: lookup.matches.map((contact) => ({
|
|
251
|
+
...contact, detailUrl: this.entityUrl('contact', recordId(contact))
|
|
252
|
+
})) };
|
|
253
|
+
}
|
|
254
|
+
const fields = {
|
|
255
|
+
...stripReservedFields(input.additionalFields, new Set(['NAME', 'LAST_NAME', 'SECOND_NAME', 'PHONE', 'EMAIL', 'COMPANY_ID', 'ASSIGNED_BY_ID', 'COMMENTS'])),
|
|
256
|
+
NAME: input.name,
|
|
257
|
+
...(input.lastName ? { LAST_NAME: input.lastName } : {}),
|
|
258
|
+
...(input.secondName ? { SECOND_NAME: input.secondName } : {}),
|
|
259
|
+
...(input.phone ? { PHONE: [{ VALUE: input.phone, VALUE_TYPE: 'WORK' }] } : {}),
|
|
260
|
+
...(input.email ? { EMAIL: [{ VALUE: input.email, VALUE_TYPE: 'WORK' }] } : {}),
|
|
261
|
+
...(input.companyId ? { COMPANY_ID: input.companyId } : {}),
|
|
262
|
+
...(input.assignedById ? { ASSIGNED_BY_ID: input.assignedById } : {}),
|
|
263
|
+
...(input.comments ? { COMMENTS: input.comments } : {})
|
|
264
|
+
};
|
|
265
|
+
let contactId;
|
|
266
|
+
try {
|
|
267
|
+
contactId = String(await this.client.callRest('crm.contact.add', { fields }));
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
const recovered = await this.findContact(input.phone, input.email);
|
|
271
|
+
if (recovered.status === 'unique') {
|
|
272
|
+
contactId = recordId(recovered.matches[0]);
|
|
273
|
+
return { action: 'recovered', matchedBy: recovered.matchedBy, contactId,
|
|
274
|
+
contact: recovered.matches[0], detailUrl: this.entityUrl('contact', contactId) };
|
|
275
|
+
}
|
|
276
|
+
if (recovered.status === 'ambiguous') {
|
|
277
|
+
return { action: 'ambiguous', matchedBy: recovered.matchedBy,
|
|
278
|
+
candidates: recovered.matches.map((contact) => ({
|
|
279
|
+
...contact, detailUrl: this.entityUrl('contact', recordId(contact))
|
|
280
|
+
})) };
|
|
281
|
+
}
|
|
282
|
+
throw error;
|
|
283
|
+
}
|
|
284
|
+
const contact = await this.getEntity('contact', contactId);
|
|
285
|
+
return { action: 'created', contactId, contact,
|
|
286
|
+
detailUrl: this.entityUrl('contact', contactId) };
|
|
287
|
+
}
|
|
288
|
+
validateServiceField(value, label) {
|
|
289
|
+
if (!CRM_FIELD_PATTERN.test(value)) {
|
|
290
|
+
throw new Error(`${label} must be a Bitrix24 CRM custom field code (UF_CRM_*)`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
async findLeadByMessageId(field, messageId) {
|
|
294
|
+
return listCrmRecords(this.client, 'crm.lead.list', {
|
|
295
|
+
filter: { [`=${field}`]: messageId }, select: ['*', 'UF_*'], order: { ID: 'ASC' }
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
async createLeadIdempotent(input) {
|
|
299
|
+
this.validateServiceField(input.messageIdField, 'messageIdField');
|
|
300
|
+
this.validateServiceField(input.runIdField, 'runIdField');
|
|
301
|
+
if (input.parseStatusField)
|
|
302
|
+
this.validateServiceField(input.parseStatusField, 'parseStatusField');
|
|
303
|
+
if (input.parseStatusField && !input.parseStatus) {
|
|
304
|
+
throw new Error('parseStatus is required when parseStatusField is supplied');
|
|
305
|
+
}
|
|
306
|
+
const serviceFields = [input.messageIdField, input.runIdField, input.parseStatusField]
|
|
307
|
+
.filter((field) => Boolean(field)).map((field) => field.toUpperCase());
|
|
308
|
+
if (new Set(serviceFields).size !== serviceFields.length) {
|
|
309
|
+
throw new Error('messageIdField, runIdField, and parseStatusField must use distinct CRM fields');
|
|
310
|
+
}
|
|
311
|
+
// The shared lock serializes lookup + write across server processes on one
|
|
312
|
+
// host. Hash the field/Message-ID so lock errors never expose email metadata.
|
|
313
|
+
const lockKey = `crm-lead:${createHash('sha256')
|
|
314
|
+
.update(`${input.messageIdField.toUpperCase()}\u0000${input.messageId}`).digest('hex')}`;
|
|
315
|
+
return withCrossProcessCompositeLock(this.client.getPortalOrigin(), lockKey, () => this.createLeadLocked(input));
|
|
316
|
+
}
|
|
317
|
+
async createLeadLocked(input) {
|
|
318
|
+
const existing = await this.findLeadByMessageId(input.messageIdField, input.messageId);
|
|
319
|
+
if (existing.length > 1) {
|
|
320
|
+
return { action: 'ambiguous', messageId: input.messageId,
|
|
321
|
+
candidates: existing.map((lead) => ({ ...lead,
|
|
322
|
+
detailUrl: this.entityUrl('lead', recordId(lead)) })) };
|
|
323
|
+
}
|
|
324
|
+
if (existing.length === 1) {
|
|
325
|
+
const leadId = recordId(existing[0]);
|
|
326
|
+
return { action: 'reused', leadId, lead: existing[0],
|
|
327
|
+
detailUrl: this.entityUrl('lead', leadId) };
|
|
328
|
+
}
|
|
329
|
+
const fields = {
|
|
330
|
+
...stripReservedFields(input.additionalFields, RESERVED_LEAD_FIELDS),
|
|
331
|
+
TITLE: input.title,
|
|
332
|
+
SOURCE_ID: input.sourceId,
|
|
333
|
+
STATUS_ID: 'NEW',
|
|
334
|
+
ASSIGNED_BY_ID: input.assignedById,
|
|
335
|
+
COMMENTS: input.comments,
|
|
336
|
+
[input.messageIdField]: input.messageId,
|
|
337
|
+
[input.runIdField]: input.runId,
|
|
338
|
+
...(input.parseStatusField ? { [input.parseStatusField]: input.parseStatus } : {}),
|
|
339
|
+
...(input.companyId ? { COMPANY_ID: input.companyId } : {}),
|
|
340
|
+
...(input.contactId ? { CONTACT_ID: input.contactId } : {}),
|
|
341
|
+
...(input.name ? { NAME: input.name } : {}),
|
|
342
|
+
...(input.lastName ? { LAST_NAME: input.lastName } : {}),
|
|
343
|
+
...(input.phone ? { PHONE: [{ VALUE: input.phone, VALUE_TYPE: 'WORK' }] } : {}),
|
|
344
|
+
...(input.email ? { EMAIL: [{ VALUE: input.email, VALUE_TYPE: 'WORK' }] } : {})
|
|
345
|
+
};
|
|
346
|
+
let leadId;
|
|
347
|
+
try {
|
|
348
|
+
leadId = String(await this.client.callRest('crm.lead.add', { fields }));
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
const recovered = await this.findLeadByMessageId(input.messageIdField, input.messageId);
|
|
352
|
+
if (recovered.length !== 1)
|
|
353
|
+
throw error;
|
|
354
|
+
leadId = recordId(recovered[0]);
|
|
355
|
+
return { action: 'recovered', leadId, lead: recovered[0],
|
|
356
|
+
detailUrl: this.entityUrl('lead', leadId) };
|
|
357
|
+
}
|
|
358
|
+
const lead = await this.getEntity('lead', leadId);
|
|
359
|
+
if (String(lead[input.messageIdField] ?? '') !== input.messageId) {
|
|
360
|
+
throw new Error(`Lead ${leadId} was created but Message-ID verification failed`);
|
|
361
|
+
}
|
|
362
|
+
return { action: 'created', leadId, lead,
|
|
363
|
+
detailUrl: this.entityUrl('lead', leadId) };
|
|
364
|
+
}
|
|
365
|
+
status(matches) {
|
|
366
|
+
return matches.length === 0 ? 'none' : matches.length === 1 ? 'unique' : 'ambiguous';
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
//# sourceMappingURL=crm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crm.js","sourceRoot":"","sources":["../../src/bitrix24/crm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Bitrix24Client } from './client.js';
|
|
2
|
+
type CrmSchemaEntity = 'lead' | 'company' | 'contact';
|
|
3
|
+
type CrmRecord = Record<string, unknown>;
|
|
4
|
+
type MetadataClient = Pick<Bitrix24Client, 'callRest' | 'callRestPage' | 'getPortalOrigin'>;
|
|
5
|
+
export interface CrmFieldsOptions {
|
|
6
|
+
customOnly?: boolean;
|
|
7
|
+
fieldNames?: string[];
|
|
8
|
+
}
|
|
9
|
+
/** Complete list or a failure: partial reads must never authorize creation. */
|
|
10
|
+
export declare function listCrmRecords(client: Pick<Bitrix24Client, 'callRestPage'>, method: string, params: Record<string, unknown>): Promise<CrmRecord[]>;
|
|
11
|
+
export declare class Bitrix24CrmMetadataService {
|
|
12
|
+
private readonly client;
|
|
13
|
+
constructor(client: MetadataClient);
|
|
14
|
+
getSources(): Promise<CrmRecord[]>;
|
|
15
|
+
getLeadStages(): Promise<CrmRecord[]>;
|
|
16
|
+
private getStatuses;
|
|
17
|
+
getFields(entity?: CrmSchemaEntity, options?: CrmFieldsOptions): Promise<Record<string, CrmRecord>>;
|
|
18
|
+
getUserFields(entity?: CrmSchemaEntity, options?: Pick<CrmFieldsOptions, 'fieldNames'>): Promise<Record<string, CrmRecord>>;
|
|
19
|
+
findLeadByMessageId(messageIdField: string, messageId: string): Promise<{
|
|
20
|
+
status: 'none' | 'unique' | 'ambiguous';
|
|
21
|
+
matches: CrmRecord[];
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=crmMetadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crmMetadata.d.ts","sourceRoot":"","sources":["../../src/bitrix24/crmMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,KAAK,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AACtD,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACzC,KAAK,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,cAAc,GAAG,iBAAiB,CAAC,CAAC;AAE5F,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAWD,+EAA+E;AAC/E,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,EAC5C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,SAAS,EAAE,CAAC,CAyBtB;AAED,qBAAa,0BAA0B;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAE7C,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAI7B,WAAW;IAcnB,SAAS,CACb,MAAM,GAAE,eAAwB,EAChC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IA0B/B,aAAa,CACjB,MAAM,GAAE,eAAwB,EAChC,OAAO,GAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAM,GACjD,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAI/B,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAC5E,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;QACxC,OAAO,EAAE,SAAS,EAAE,CAAC;KACtB,CAAC;CA6BH"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
const MAX_LIST_PAGES = 200;
|
|
2
|
+
const MAX_LIST_RECORDS = 10_000;
|
|
3
|
+
const FIELD_NAME = /^[A-Z][A-Z0-9_]{0,99}$/;
|
|
4
|
+
const CUSTOM_FIELD_NAME = /^UF_CRM_[A-Z0-9_]+$/;
|
|
5
|
+
function isRecord(value) {
|
|
6
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
/** Complete list or a failure: partial reads must never authorize creation. */
|
|
9
|
+
export async function listCrmRecords(client, method, params) {
|
|
10
|
+
const records = [];
|
|
11
|
+
let start = 0;
|
|
12
|
+
for (let pageIndex = 0; pageIndex < MAX_LIST_PAGES; pageIndex++) {
|
|
13
|
+
const page = await client.callRestPage(method, { ...params, start });
|
|
14
|
+
if (!page || !Array.isArray(page.result) || !page.result.every(isRecord)) {
|
|
15
|
+
throw new Error(`Invalid ${method} response: expected an array of records`);
|
|
16
|
+
}
|
|
17
|
+
records.push(...page.result);
|
|
18
|
+
if (records.length > MAX_LIST_RECORDS) {
|
|
19
|
+
throw new Error(`${method} exceeded the safe list limit; narrow the search`);
|
|
20
|
+
}
|
|
21
|
+
if (page.next === undefined) {
|
|
22
|
+
if (page.total !== undefined && (!Number.isSafeInteger(page.total) ||
|
|
23
|
+
page.total < 0 || page.total > records.length)) {
|
|
24
|
+
throw new Error(`Incomplete ${method} response: missing pagination cursor`);
|
|
25
|
+
}
|
|
26
|
+
return records;
|
|
27
|
+
}
|
|
28
|
+
if (!Number.isSafeInteger(page.next) || page.next <= start || page.result.length === 0) {
|
|
29
|
+
throw new Error(`Invalid ${method} pagination cursor`);
|
|
30
|
+
}
|
|
31
|
+
start = page.next;
|
|
32
|
+
}
|
|
33
|
+
throw new Error(`${method} exceeded the safe page limit; narrow the search`);
|
|
34
|
+
}
|
|
35
|
+
export class Bitrix24CrmMetadataService {
|
|
36
|
+
client;
|
|
37
|
+
constructor(client) {
|
|
38
|
+
this.client = client;
|
|
39
|
+
}
|
|
40
|
+
async getSources() {
|
|
41
|
+
return this.getStatuses('SOURCE');
|
|
42
|
+
}
|
|
43
|
+
async getLeadStages() {
|
|
44
|
+
return this.getStatuses('STATUS');
|
|
45
|
+
}
|
|
46
|
+
async getStatuses(entityId) {
|
|
47
|
+
const records = await listCrmRecords(this.client, 'crm.status.list', {
|
|
48
|
+
filter: { ENTITY_ID: entityId }, order: { SORT: 'ASC', ID: 'ASC' }
|
|
49
|
+
});
|
|
50
|
+
for (const item of records) {
|
|
51
|
+
if (typeof item.STATUS_ID !== 'string' || !item.STATUS_ID ||
|
|
52
|
+
typeof item.NAME !== 'string' ||
|
|
53
|
+
(item.ENTITY_ID !== undefined && item.ENTITY_ID !== entityId)) {
|
|
54
|
+
throw new Error('Invalid crm.status.list response: directory item is malformed');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return records;
|
|
58
|
+
}
|
|
59
|
+
async getFields(entity = 'lead', options = {}) {
|
|
60
|
+
if (!['lead', 'company', 'contact'].includes(entity)) {
|
|
61
|
+
throw new Error('Unsupported CRM entity: expected lead, company, or contact');
|
|
62
|
+
}
|
|
63
|
+
if (options.fieldNames !== undefined &&
|
|
64
|
+
(!Array.isArray(options.fieldNames) || options.fieldNames.length < 1 ||
|
|
65
|
+
options.fieldNames.length > 100 ||
|
|
66
|
+
!options.fieldNames.every((field) => typeof field === 'string' && FIELD_NAME.test(field)))) {
|
|
67
|
+
throw new Error('fieldNames must contain 1-100 Bitrix24 field codes');
|
|
68
|
+
}
|
|
69
|
+
const result = await this.client.callRest(`crm.${entity}.fields`);
|
|
70
|
+
if (!isRecord(result) || !Object.values(result).every(isRecord)) {
|
|
71
|
+
throw new Error(`Invalid crm.${entity}.fields response: expected a field metadata object`);
|
|
72
|
+
}
|
|
73
|
+
const fields = Object.fromEntries(Object.entries(result)
|
|
74
|
+
.filter(([code]) => options.customOnly !== true || CUSTOM_FIELD_NAME.test(code)));
|
|
75
|
+
if (options.fieldNames) {
|
|
76
|
+
const missing = options.fieldNames.filter((field) => !Object.hasOwn(fields, field));
|
|
77
|
+
if (missing.length > 0) {
|
|
78
|
+
throw new Error(`Unknown or unavailable CRM fields: ${missing.join(', ')}`);
|
|
79
|
+
}
|
|
80
|
+
return Object.fromEntries([...new Set(options.fieldNames)].map((code) => [code, fields[code]]));
|
|
81
|
+
}
|
|
82
|
+
return fields;
|
|
83
|
+
}
|
|
84
|
+
async getUserFields(entity = 'lead', options = {}) {
|
|
85
|
+
return this.getFields(entity, { ...options, customOnly: true });
|
|
86
|
+
}
|
|
87
|
+
async findLeadByMessageId(messageIdField, messageId) {
|
|
88
|
+
if (!CUSTOM_FIELD_NAME.test(messageIdField)) {
|
|
89
|
+
throw new Error('messageIdField must be a CRM custom field code (UF_CRM_*)');
|
|
90
|
+
}
|
|
91
|
+
if (typeof messageId !== 'string' || !messageId.trim() || messageId.length > 998) {
|
|
92
|
+
throw new Error('messageId must contain 1-998 characters');
|
|
93
|
+
}
|
|
94
|
+
const fields = await this.getUserFields('lead', { fieldNames: [messageIdField] });
|
|
95
|
+
const field = fields[messageIdField];
|
|
96
|
+
if (field.type !== 'string' || field.isMultiple === true || field.isMultiple === 'Y') {
|
|
97
|
+
throw new Error('Message-ID field must be a single-valued string field');
|
|
98
|
+
}
|
|
99
|
+
const records = await listCrmRecords(this.client, 'crm.lead.list', {
|
|
100
|
+
filter: { [`=${messageIdField}`]: messageId },
|
|
101
|
+
select: ['ID', 'TITLE', 'STATUS_ID', 'SOURCE_ID', 'ASSIGNED_BY_ID', 'COMPANY_ID',
|
|
102
|
+
'CONTACT_ID', messageIdField],
|
|
103
|
+
order: { ID: 'ASC' }
|
|
104
|
+
});
|
|
105
|
+
// A missing/ignored filter is not an empty result and cannot authorize a retry.
|
|
106
|
+
const matches = records.map((lead) => {
|
|
107
|
+
const id = String(lead.ID ?? '');
|
|
108
|
+
if (!/^\d+$/.test(id) || String(lead[messageIdField] ?? '') !== messageId) {
|
|
109
|
+
throw new Error('Lead lookup verification failed: ID or Message-ID does not match');
|
|
110
|
+
}
|
|
111
|
+
const origin = this.client.getPortalOrigin();
|
|
112
|
+
return { ...lead, ...(origin ? { detailUrl: `${origin}/crm/lead/details/${id}/` } : {}) };
|
|
113
|
+
});
|
|
114
|
+
return { status: matches.length === 0 ? 'none' : matches.length === 1 ? 'unique' : 'ambiguous', matches };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=crmMetadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crmMetadata.js","sourceRoot":"","sources":["../../src/bitrix24/crmMetadata.ts"],"names":[],"mappings":"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"}
|
package/build/index.js
CHANGED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
export declare const findCrmUserByEmailTool: Tool;
|
|
3
|
+
export declare const findCrmCompanyTool: Tool;
|
|
4
|
+
export declare const resolveCrmCompanyTool: Tool;
|
|
5
|
+
export declare const findCrmContactTool: Tool;
|
|
6
|
+
export declare const resolveCrmContactTool: Tool;
|
|
7
|
+
export declare const createCrmLeadTool: Tool;
|
|
8
|
+
export declare const getCrmEntityTool: Tool;
|
|
9
|
+
export declare const getCrmSourcesTool: Tool;
|
|
10
|
+
export declare const getCrmLeadStagesTool: Tool;
|
|
11
|
+
export declare const getCrmFieldsTool: Tool;
|
|
12
|
+
export declare const getCrmUserFieldsTool: Tool;
|
|
13
|
+
export declare const findCrmLeadByMessageIdTool: Tool;
|
|
14
|
+
export declare const crmTools: Tool[];
|
|
15
|
+
export declare function isCrmToolName(name: string): boolean;
|
|
16
|
+
export declare function executeCrmToolCall(name: string, args: Record<string, any>): Promise<any>;
|
|
17
|
+
//# sourceMappingURL=crm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crm.d.ts","sourceRoot":"","sources":["../../src/tools/crm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAoB/D,eAAO,MAAM,sBAAsB,EAAE,IAWpC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,IAYhC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,IAgBnC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,IAUhC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,IAkBnC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,IA0B/B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,IAW9B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,IAI/B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,IAIlC,CAAC;AAYF,eAAO,MAAM,gBAAgB,EAAE,IAW9B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,IAOlC,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,IAWxC,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,IAAI,EAa1B,CAAC;AAIF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAoD9F"}
|