bitrix24-tasks-mcp-server 1.6.5 → 1.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.
@@ -0,0 +1,69 @@
1
+ import type { Bitrix24Client } from './client.js';
2
+ export type MatchStatus = 'none' | 'unique' | 'ambiguous';
3
+ export interface CrmMatchResult<T = Record<string, unknown>> {
4
+ status: MatchStatus;
5
+ matchedBy?: 'inn' | 'phone' | 'email' | 'title';
6
+ matches: T[];
7
+ }
8
+ export interface CompanyLookup {
9
+ inn?: string;
10
+ phone?: string;
11
+ email?: string;
12
+ title?: string;
13
+ }
14
+ export interface ResolveCompanyInput extends CompanyLookup {
15
+ assignedById?: string;
16
+ requisitePresetId?: string;
17
+ comments?: string;
18
+ additionalFields?: Record<string, unknown>;
19
+ }
20
+ export interface ResolveContactInput {
21
+ name: string;
22
+ lastName?: string;
23
+ secondName?: string;
24
+ phone?: string;
25
+ email?: string;
26
+ companyId?: string;
27
+ assignedById?: string;
28
+ comments?: string;
29
+ additionalFields?: Record<string, unknown>;
30
+ }
31
+ export interface CreateLeadInput {
32
+ title: string;
33
+ sourceId: string;
34
+ assignedById: string;
35
+ comments: string;
36
+ messageId: string;
37
+ runId: string;
38
+ messageIdField: string;
39
+ runIdField: string;
40
+ parseStatusField?: string;
41
+ parseStatus?: string;
42
+ companyId?: string;
43
+ contactId?: string;
44
+ name?: string;
45
+ lastName?: string;
46
+ phone?: string;
47
+ email?: string;
48
+ additionalFields?: Record<string, unknown>;
49
+ }
50
+ type CrmEntityType = 'lead' | 'company' | 'contact';
51
+ type RecordValue = Record<string, unknown>;
52
+ export declare class Bitrix24CrmService {
53
+ private readonly client;
54
+ constructor(client: Pick<Bitrix24Client, 'callRest' | 'getPortalOrigin'>);
55
+ private entityUrl;
56
+ private getEntities;
57
+ getEntity(entity: CrmEntityType, id: string): Promise<RecordValue>;
58
+ findActiveUserByEmail(email: string): Promise<CrmMatchResult>;
59
+ findCompany(lookup: CompanyLookup): Promise<CrmMatchResult>;
60
+ resolveOrCreateCompany(input: ResolveCompanyInput): Promise<RecordValue>;
61
+ findContact(phone?: string, email?: string): Promise<CrmMatchResult>;
62
+ resolveOrCreateContact(input: ResolveContactInput): Promise<RecordValue>;
63
+ private validateServiceField;
64
+ private findLeadByMessageId;
65
+ createLeadIdempotent(input: CreateLeadInput): Promise<RecordValue>;
66
+ private status;
67
+ }
68
+ export {};
69
+ //# sourceMappingURL=crm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crm.d.ts","sourceRoot":"","sources":["../../src/bitrix24/crm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,321 @@
1
+ const CRM_FIELD_PATTERN = /^UF_CRM_[A-Z0-9_]+$/i;
2
+ const RESERVED_LEAD_FIELDS = new Set([
3
+ 'TITLE', 'SOURCE_ID', 'STATUS_ID', 'ASSIGNED_BY_ID', 'COMMENTS', 'COMPANY_ID',
4
+ 'CONTACT_ID', 'NAME', 'LAST_NAME', 'PHONE', 'EMAIL'
5
+ ]);
6
+ function optionalString(value) {
7
+ const result = String(value ?? '').trim();
8
+ return result || undefined;
9
+ }
10
+ function normalizeCompanyTitle(value) {
11
+ return String(value ?? '')
12
+ .normalize('NFKC')
13
+ .toLocaleLowerCase('ru-RU')
14
+ .replace(/ё/g, 'е')
15
+ .replace(/[«»"']/g, '')
16
+ .replace(/(^|\s)(ооо|ао|пао|зао|оао|ип)(?=\s|$)/giu, ' ')
17
+ .replace(/[^\p{L}\p{N}]+/gu, ' ')
18
+ .replace(/\s+/g, ' ')
19
+ .trim();
20
+ }
21
+ function normalizeEmail(value) {
22
+ return String(value ?? '').trim().toLocaleLowerCase('en-US');
23
+ }
24
+ function recordId(record) {
25
+ return String(record.ID ?? record.id ?? '').trim();
26
+ }
27
+ function resultIds(value, entity) {
28
+ const record = value && typeof value === 'object' ? value : {};
29
+ const raw = record[entity.toUpperCase()] ?? record[entity] ?? [];
30
+ const values = Array.isArray(raw) ? raw : raw === undefined ? [] : [raw];
31
+ return [...new Set(values.map(String).map((id) => id.trim()).filter(Boolean))];
32
+ }
33
+ function stripReservedFields(fields, reserved) {
34
+ return Object.fromEntries(Object.entries(fields ?? {}).filter(([key]) => !reserved.has(key.toUpperCase())));
35
+ }
36
+ export class Bitrix24CrmService {
37
+ client;
38
+ constructor(client) {
39
+ this.client = client;
40
+ }
41
+ entityUrl(entity, id) {
42
+ const origin = this.client.getPortalOrigin();
43
+ return origin ? `${origin}/crm/${entity}/details/${encodeURIComponent(id)}/` : undefined;
44
+ }
45
+ async getEntities(entity, ids) {
46
+ if (ids.length === 0)
47
+ return [];
48
+ const result = await this.client.callRest(`crm.${entity}.list`, {
49
+ filter: { '@ID': ids },
50
+ select: ['*', 'UF_*'],
51
+ order: { ID: 'ASC' }
52
+ });
53
+ return (Array.isArray(result) ? result : [])
54
+ .map((item) => item)
55
+ .filter((item) => recordId(item));
56
+ }
57
+ async getEntity(entity, id) {
58
+ const result = await this.client.callRest(`crm.${entity}.get`, { id });
59
+ const item = (result ?? {});
60
+ return { ...item, detailUrl: this.entityUrl(entity, recordId(item) || id) };
61
+ }
62
+ async findActiveUserByEmail(email) {
63
+ const normalizedEmail = normalizeEmail(email);
64
+ const result = await this.client.callRest('user.get', {
65
+ FILTER: { EMAIL: normalizedEmail, ACTIVE: 'Y' }
66
+ });
67
+ const matches = (Array.isArray(result) ? result : [])
68
+ .filter((item) => normalizeEmail(item.EMAIL) === normalizedEmail)
69
+ .filter((item) => {
70
+ const active = item.ACTIVE;
71
+ return active === true || String(active).toUpperCase() === 'Y';
72
+ })
73
+ .map((item) => item);
74
+ return { status: this.status(matches), matches };
75
+ }
76
+ async findCompany(lookup) {
77
+ const inn = optionalString(lookup.inn)?.replace(/\D/g, '');
78
+ if (inn) {
79
+ const requisites = await this.client.callRest('crm.requisite.list', {
80
+ filter: { ENTITY_TYPE_ID: 4, RQ_INN: inn },
81
+ select: ['ID', 'ENTITY_ID', 'RQ_INN']
82
+ });
83
+ const ids = [...new Set((Array.isArray(requisites) ? requisites : [])
84
+ .map((item) => String(item.ENTITY_ID ?? '').trim())
85
+ .filter(Boolean))];
86
+ if (ids.length > 0) {
87
+ const matches = await this.getEntities('company', ids);
88
+ return { status: this.status(matches), matchedBy: 'inn', matches };
89
+ }
90
+ }
91
+ for (const [type, value] of [['PHONE', lookup.phone], ['EMAIL', lookup.email]]) {
92
+ const normalizedValue = optionalString(value);
93
+ if (!normalizedValue)
94
+ continue;
95
+ const duplicates = await this.client.callRest('crm.duplicate.findbycomm', {
96
+ entity_type: 'COMPANY', type, values: [normalizedValue]
97
+ });
98
+ const ids = resultIds(duplicates, 'company');
99
+ if (ids.length > 0) {
100
+ const matches = await this.getEntities('company', ids);
101
+ return {
102
+ status: this.status(matches),
103
+ matchedBy: type === 'PHONE' ? 'phone' : 'email',
104
+ matches
105
+ };
106
+ }
107
+ }
108
+ const title = optionalString(lookup.title);
109
+ if (title) {
110
+ const result = await this.client.callRest('crm.company.list', {
111
+ filter: { '%TITLE': title },
112
+ select: ['*', 'UF_*'],
113
+ order: { ID: 'ASC' }
114
+ });
115
+ const normalizedTitle = normalizeCompanyTitle(title);
116
+ const matches = (Array.isArray(result) ? result : [])
117
+ .map((item) => item)
118
+ .filter((item) => normalizeCompanyTitle(item.TITLE) === normalizedTitle);
119
+ if (matches.length > 0) {
120
+ return { status: this.status(matches), matchedBy: 'title', matches };
121
+ }
122
+ }
123
+ return { status: 'none', matches: [] };
124
+ }
125
+ async resolveOrCreateCompany(input) {
126
+ const lookup = await this.findCompany(input);
127
+ if (lookup.status === 'unique') {
128
+ const company = lookup.matches[0];
129
+ const id = recordId(company);
130
+ return { action: 'reused', matchedBy: lookup.matchedBy, companyId: id, company,
131
+ detailUrl: this.entityUrl('company', id) };
132
+ }
133
+ if (lookup.status === 'ambiguous') {
134
+ return {
135
+ action: 'ambiguous', matchedBy: lookup.matchedBy,
136
+ candidates: lookup.matches.map((company) => ({
137
+ ...company, detailUrl: this.entityUrl('company', recordId(company))
138
+ }))
139
+ };
140
+ }
141
+ const title = optionalString(input.title);
142
+ if (!title)
143
+ throw new Error('title is required when no existing company is found');
144
+ const fields = {
145
+ ...stripReservedFields(input.additionalFields, new Set(['TITLE', 'ASSIGNED_BY_ID', 'COMMENTS'])),
146
+ TITLE: title,
147
+ ...(input.assignedById ? { ASSIGNED_BY_ID: input.assignedById } : {}),
148
+ ...(input.phone ? { PHONE: [{ VALUE: input.phone, VALUE_TYPE: 'WORK' }] } : {}),
149
+ ...(input.email ? { EMAIL: [{ VALUE: input.email, VALUE_TYPE: 'WORK' }] } : {}),
150
+ ...(input.comments ? { COMMENTS: input.comments } : {})
151
+ };
152
+ let companyId;
153
+ try {
154
+ companyId = String(await this.client.callRest('crm.company.add', { fields }));
155
+ }
156
+ catch (error) {
157
+ const recovered = await this.findCompany(input);
158
+ if (recovered.status === 'unique') {
159
+ companyId = recordId(recovered.matches[0]);
160
+ return { action: 'recovered', matchedBy: recovered.matchedBy, companyId,
161
+ company: recovered.matches[0], detailUrl: this.entityUrl('company', companyId) };
162
+ }
163
+ if (recovered.status === 'ambiguous') {
164
+ return { action: 'ambiguous', matchedBy: recovered.matchedBy,
165
+ candidates: recovered.matches.map((company) => ({
166
+ ...company, detailUrl: this.entityUrl('company', recordId(company))
167
+ })) };
168
+ }
169
+ throw error;
170
+ }
171
+ let requisiteId;
172
+ const inn = optionalString(input.inn)?.replace(/\D/g, '');
173
+ if (inn) {
174
+ requisiteId = String(await this.client.callRest('crm.requisite.add', {
175
+ fields: { ENTITY_TYPE_ID: 4, ENTITY_ID: companyId,
176
+ PRESET_ID: input.requisitePresetId ?? '1',
177
+ NAME: `Реквизиты ${title}`, RQ_INN: inn }
178
+ }));
179
+ }
180
+ const company = await this.getEntity('company', companyId);
181
+ return { action: 'created', companyId, requisiteId, company,
182
+ detailUrl: this.entityUrl('company', companyId) };
183
+ }
184
+ async findContact(phone, email) {
185
+ for (const [type, value] of [['PHONE', phone], ['EMAIL', email]]) {
186
+ const normalizedValue = optionalString(value);
187
+ if (!normalizedValue)
188
+ continue;
189
+ const duplicates = await this.client.callRest('crm.duplicate.findbycomm', {
190
+ entity_type: 'CONTACT', type, values: [normalizedValue]
191
+ });
192
+ const ids = resultIds(duplicates, 'contact');
193
+ if (ids.length > 0) {
194
+ const matches = await this.getEntities('contact', ids);
195
+ return { status: this.status(matches), matchedBy: type === 'PHONE' ? 'phone' : 'email', matches };
196
+ }
197
+ }
198
+ return { status: 'none', matches: [] };
199
+ }
200
+ async resolveOrCreateContact(input) {
201
+ if (!optionalString(input.phone) && !optionalString(input.email)) {
202
+ throw new Error('phone or email is required to search or create a client contact');
203
+ }
204
+ const lookup = await this.findContact(input.phone, input.email);
205
+ if (lookup.status === 'unique') {
206
+ const contact = lookup.matches[0];
207
+ const id = recordId(contact);
208
+ return { action: 'reused', matchedBy: lookup.matchedBy, contactId: id, contact,
209
+ detailUrl: this.entityUrl('contact', id) };
210
+ }
211
+ if (lookup.status === 'ambiguous') {
212
+ return { action: 'ambiguous', matchedBy: lookup.matchedBy,
213
+ candidates: lookup.matches.map((contact) => ({
214
+ ...contact, detailUrl: this.entityUrl('contact', recordId(contact))
215
+ })) };
216
+ }
217
+ const fields = {
218
+ ...stripReservedFields(input.additionalFields, new Set(['NAME', 'LAST_NAME', 'SECOND_NAME', 'PHONE', 'EMAIL', 'COMPANY_ID', 'ASSIGNED_BY_ID', 'COMMENTS'])),
219
+ NAME: input.name,
220
+ ...(input.lastName ? { LAST_NAME: input.lastName } : {}),
221
+ ...(input.secondName ? { SECOND_NAME: input.secondName } : {}),
222
+ ...(input.phone ? { PHONE: [{ VALUE: input.phone, VALUE_TYPE: 'WORK' }] } : {}),
223
+ ...(input.email ? { EMAIL: [{ VALUE: input.email, VALUE_TYPE: 'WORK' }] } : {}),
224
+ ...(input.companyId ? { COMPANY_ID: input.companyId } : {}),
225
+ ...(input.assignedById ? { ASSIGNED_BY_ID: input.assignedById } : {}),
226
+ ...(input.comments ? { COMMENTS: input.comments } : {})
227
+ };
228
+ let contactId;
229
+ try {
230
+ contactId = String(await this.client.callRest('crm.contact.add', { fields }));
231
+ }
232
+ catch (error) {
233
+ const recovered = await this.findContact(input.phone, input.email);
234
+ if (recovered.status === 'unique') {
235
+ contactId = recordId(recovered.matches[0]);
236
+ return { action: 'recovered', matchedBy: recovered.matchedBy, contactId,
237
+ contact: recovered.matches[0], detailUrl: this.entityUrl('contact', contactId) };
238
+ }
239
+ if (recovered.status === 'ambiguous') {
240
+ return { action: 'ambiguous', matchedBy: recovered.matchedBy,
241
+ candidates: recovered.matches.map((contact) => ({
242
+ ...contact, detailUrl: this.entityUrl('contact', recordId(contact))
243
+ })) };
244
+ }
245
+ throw error;
246
+ }
247
+ const contact = await this.getEntity('contact', contactId);
248
+ return { action: 'created', contactId, contact,
249
+ detailUrl: this.entityUrl('contact', contactId) };
250
+ }
251
+ validateServiceField(value, label) {
252
+ if (!CRM_FIELD_PATTERN.test(value)) {
253
+ throw new Error(`${label} must be a Bitrix24 CRM custom field code (UF_CRM_*)`);
254
+ }
255
+ }
256
+ async findLeadByMessageId(field, messageId) {
257
+ const result = await this.client.callRest('crm.lead.list', {
258
+ filter: { [`=${field}`]: messageId }, select: ['*', 'UF_*'], order: { ID: 'ASC' }
259
+ });
260
+ return (Array.isArray(result) ? result : []).map((item) => item);
261
+ }
262
+ async createLeadIdempotent(input) {
263
+ this.validateServiceField(input.messageIdField, 'messageIdField');
264
+ this.validateServiceField(input.runIdField, 'runIdField');
265
+ if (input.parseStatusField)
266
+ this.validateServiceField(input.parseStatusField, 'parseStatusField');
267
+ if (input.parseStatusField && !input.parseStatus) {
268
+ throw new Error('parseStatus is required when parseStatusField is supplied');
269
+ }
270
+ const existing = await this.findLeadByMessageId(input.messageIdField, input.messageId);
271
+ if (existing.length > 1) {
272
+ return { action: 'ambiguous', messageId: input.messageId,
273
+ candidates: existing.map((lead) => ({ ...lead,
274
+ detailUrl: this.entityUrl('lead', recordId(lead)) })) };
275
+ }
276
+ if (existing.length === 1) {
277
+ const leadId = recordId(existing[0]);
278
+ return { action: 'reused', leadId, lead: existing[0],
279
+ detailUrl: this.entityUrl('lead', leadId) };
280
+ }
281
+ const fields = {
282
+ ...stripReservedFields(input.additionalFields, RESERVED_LEAD_FIELDS),
283
+ TITLE: input.title,
284
+ SOURCE_ID: input.sourceId,
285
+ STATUS_ID: 'NEW',
286
+ ASSIGNED_BY_ID: input.assignedById,
287
+ COMMENTS: input.comments,
288
+ [input.messageIdField]: input.messageId,
289
+ [input.runIdField]: input.runId,
290
+ ...(input.parseStatusField ? { [input.parseStatusField]: input.parseStatus } : {}),
291
+ ...(input.companyId ? { COMPANY_ID: input.companyId } : {}),
292
+ ...(input.contactId ? { CONTACT_ID: input.contactId } : {}),
293
+ ...(input.name ? { NAME: input.name } : {}),
294
+ ...(input.lastName ? { LAST_NAME: input.lastName } : {}),
295
+ ...(input.phone ? { PHONE: [{ VALUE: input.phone, VALUE_TYPE: 'WORK' }] } : {}),
296
+ ...(input.email ? { EMAIL: [{ VALUE: input.email, VALUE_TYPE: 'WORK' }] } : {})
297
+ };
298
+ let leadId;
299
+ try {
300
+ leadId = String(await this.client.callRest('crm.lead.add', { fields }));
301
+ }
302
+ catch (error) {
303
+ const recovered = await this.findLeadByMessageId(input.messageIdField, input.messageId);
304
+ if (recovered.length !== 1)
305
+ throw error;
306
+ leadId = recordId(recovered[0]);
307
+ return { action: 'recovered', leadId, lead: recovered[0],
308
+ detailUrl: this.entityUrl('lead', leadId) };
309
+ }
310
+ const lead = await this.getEntity('lead', leadId);
311
+ if (String(lead[input.messageIdField] ?? '') !== input.messageId) {
312
+ throw new Error(`Lead ${leadId} was created but Message-ID verification failed`);
313
+ }
314
+ return { action: 'created', leadId, lead,
315
+ detailUrl: this.entityUrl('lead', leadId) };
316
+ }
317
+ status(matches) {
318
+ return matches.length === 0 ? 'none' : matches.length === 1 ? 'unique' : 'ambiguous';
319
+ }
320
+ }
321
+ //# 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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"}
package/build/index.js CHANGED
@@ -7,7 +7,7 @@ import { formatToolArgumentsForLog } from './utils/toolLogging.js';
7
7
  // Initialize the MCP server
8
8
  const server = new Server({
9
9
  name: 'bitrix24-mcp-server',
10
- version: '1.6.5',
10
+ version: '1.7.0',
11
11
  capabilities: {
12
12
  tools: {}
13
13
  }
@@ -0,0 +1,12 @@
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 crmTools: Tool[];
10
+ export declare function isCrmToolName(name: string): boolean;
11
+ export declare function executeCrmToolCall(name: string, args: Record<string, any>): Promise<any>;
12
+ //# 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;AAkB/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,QAAQ,EAAE,IAAI,EAQ1B,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,CAkC9F"}
@@ -0,0 +1,170 @@
1
+ import { Bitrix24CrmService } from '../bitrix24/crm.js';
2
+ import { bitrix24Client } from '../bitrix24/client.js';
3
+ const crmService = new Bitrix24CrmService(bitrix24Client);
4
+ const optionalId = { type: 'string', minLength: 1, maxLength: 32, pattern: '^\\d+$' };
5
+ const optionalText = { type: 'string', minLength: 1, maxLength: 10000 };
6
+ const optionalEmail = { type: 'string', minLength: 3, maxLength: 320 };
7
+ const customFields = {
8
+ type: 'object',
9
+ description: 'Optional confirmed Bitrix24 field values. Core fields cannot override safe defaults.'
10
+ };
11
+ export const findCrmUserByEmailTool = {
12
+ name: 'bitrix24_find_crm_user_by_email',
13
+ description: 'Find one active Bitrix24 employee by exact email and select a configured fallback when none is found.',
14
+ inputSchema: {
15
+ type: 'object', additionalProperties: false,
16
+ properties: {
17
+ email: optionalEmail,
18
+ fallbackUserId: optionalId
19
+ },
20
+ required: ['email']
21
+ }
22
+ };
23
+ export const findCrmCompanyTool = {
24
+ name: 'bitrix24_find_crm_company',
25
+ description: 'Find a CRM company sequentially by exact INN, phone, email, then exact normalized title. Returns none, unique, or ambiguous.',
26
+ inputSchema: {
27
+ type: 'object', additionalProperties: false,
28
+ properties: {
29
+ inn: { type: 'string', minLength: 8, maxLength: 20 },
30
+ phone: { type: 'string', minLength: 3, maxLength: 64 },
31
+ email: optionalEmail,
32
+ title: { type: 'string', minLength: 1, maxLength: 512 }
33
+ }
34
+ }
35
+ };
36
+ export const resolveCrmCompanyTool = {
37
+ name: 'bitrix24_resolve_or_create_crm_company',
38
+ description: 'Reuse one matching company, return candidates on ambiguity, or create a draft company without creating an obvious duplicate.',
39
+ inputSchema: {
40
+ type: 'object', additionalProperties: false,
41
+ properties: {
42
+ inn: { type: 'string', minLength: 8, maxLength: 20 },
43
+ phone: { type: 'string', minLength: 3, maxLength: 64 },
44
+ email: optionalEmail,
45
+ title: { type: 'string', minLength: 1, maxLength: 512 },
46
+ assignedById: optionalId,
47
+ requisitePresetId: optionalId,
48
+ comments: optionalText,
49
+ additionalFields: customFields
50
+ }
51
+ }
52
+ };
53
+ export const findCrmContactTool = {
54
+ name: 'bitrix24_find_crm_contact',
55
+ description: 'Find a CRM contact by client phone and then client email. Does not infer contact data.',
56
+ inputSchema: {
57
+ type: 'object', additionalProperties: false,
58
+ properties: {
59
+ phone: { type: 'string', minLength: 3, maxLength: 64 },
60
+ email: optionalEmail
61
+ }
62
+ }
63
+ };
64
+ export const resolveCrmContactTool = {
65
+ name: 'bitrix24_resolve_or_create_crm_contact',
66
+ description: 'Reuse one matching client contact, report ambiguity, or create a contact only when phone or email is supplied.',
67
+ inputSchema: {
68
+ type: 'object', additionalProperties: false,
69
+ properties: {
70
+ name: { type: 'string', minLength: 1, maxLength: 255 },
71
+ lastName: { type: 'string', minLength: 1, maxLength: 255 },
72
+ secondName: { type: 'string', minLength: 1, maxLength: 255 },
73
+ phone: { type: 'string', minLength: 3, maxLength: 64 },
74
+ email: optionalEmail,
75
+ companyId: optionalId,
76
+ assignedById: optionalId,
77
+ comments: optionalText,
78
+ additionalFields: customFields
79
+ },
80
+ required: ['name']
81
+ }
82
+ };
83
+ export const createCrmLeadTool = {
84
+ name: 'bitrix24_create_crm_lead_idempotent',
85
+ description: 'Create a NEW CRM lead exactly once using Message-ID, verify the write, and recover a lead after an uncertain REST response.',
86
+ inputSchema: {
87
+ type: 'object', additionalProperties: false,
88
+ properties: {
89
+ title: { type: 'string', minLength: 1, maxLength: 512 },
90
+ sourceId: { type: 'string', minLength: 1, maxLength: 100 },
91
+ assignedById: optionalId,
92
+ comments: { type: 'string', minLength: 1, maxLength: 200000 },
93
+ messageId: { type: 'string', minLength: 1, maxLength: 998 },
94
+ runId: { type: 'string', minLength: 1, maxLength: 255 },
95
+ messageIdField: { type: 'string', pattern: '^UF_CRM_[A-Za-z0-9_]+$', maxLength: 100 },
96
+ runIdField: { type: 'string', pattern: '^UF_CRM_[A-Za-z0-9_]+$', maxLength: 100 },
97
+ parseStatusField: { type: 'string', pattern: '^UF_CRM_[A-Za-z0-9_]+$', maxLength: 100 },
98
+ parseStatus: { type: 'string', minLength: 1, maxLength: 255 },
99
+ companyId: optionalId,
100
+ contactId: optionalId,
101
+ name: { type: 'string', minLength: 1, maxLength: 255 },
102
+ lastName: { type: 'string', minLength: 1, maxLength: 255 },
103
+ phone: { type: 'string', minLength: 3, maxLength: 64 },
104
+ email: optionalEmail,
105
+ additionalFields: customFields
106
+ },
107
+ required: ['title', 'sourceId', 'assignedById', 'comments', 'messageId', 'runId', 'messageIdField', 'runIdField']
108
+ }
109
+ };
110
+ export const getCrmEntityTool = {
111
+ name: 'bitrix24_get_crm_entity',
112
+ description: 'Get a CRM lead, company, or contact by ID and return its Bitrix24 detail URL.',
113
+ inputSchema: {
114
+ type: 'object', additionalProperties: false,
115
+ properties: {
116
+ entity: { type: 'string', enum: ['lead', 'company', 'contact'] },
117
+ id: optionalId
118
+ },
119
+ required: ['entity', 'id']
120
+ }
121
+ };
122
+ export const crmTools = [
123
+ findCrmUserByEmailTool,
124
+ findCrmCompanyTool,
125
+ resolveCrmCompanyTool,
126
+ findCrmContactTool,
127
+ resolveCrmContactTool,
128
+ createCrmLeadTool,
129
+ getCrmEntityTool
130
+ ];
131
+ const crmToolNames = new Set(crmTools.map((tool) => tool.name));
132
+ export function isCrmToolName(name) {
133
+ return crmToolNames.has(name);
134
+ }
135
+ export async function executeCrmToolCall(name, args) {
136
+ switch (name) {
137
+ case 'bitrix24_find_crm_user_by_email': {
138
+ const result = await crmService.findActiveUserByEmail(args.email);
139
+ const selectedUserId = result.status === 'unique'
140
+ ? String(result.matches[0].ID)
141
+ : result.status === 'none' ? args.fallbackUserId : undefined;
142
+ return {
143
+ success: true, ...result, selectedUserId,
144
+ usedFallback: result.status === 'none' && Boolean(args.fallbackUserId),
145
+ requiresManualChoice: result.status === 'ambiguous'
146
+ };
147
+ }
148
+ case 'bitrix24_find_crm_company':
149
+ return { success: true, ...(await crmService.findCompany(args)) };
150
+ case 'bitrix24_resolve_or_create_crm_company':
151
+ return { success: true, ...(await crmService.resolveOrCreateCompany(args)) };
152
+ case 'bitrix24_find_crm_contact':
153
+ return { success: true, ...(await crmService.findContact(args.phone, args.email)) };
154
+ case 'bitrix24_resolve_or_create_crm_contact':
155
+ return {
156
+ success: true,
157
+ ...(await crmService.resolveOrCreateContact(args))
158
+ };
159
+ case 'bitrix24_create_crm_lead_idempotent':
160
+ return {
161
+ success: true,
162
+ ...(await crmService.createLeadIdempotent(args))
163
+ };
164
+ case 'bitrix24_get_crm_entity':
165
+ return { success: true, entity: await crmService.getEntity(args.entity, args.id) };
166
+ default:
167
+ throw new Error(`Unknown CRM tool: ${name}`);
168
+ }
169
+ }
170
+ //# sourceMappingURL=crm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crm.js","sourceRoot":"","sources":["../../src/tools/crm.ts"],"names":[],"mappings":"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"}