Подключиться к BPMSoft
bpm_initInitializes connection to BPMSoft by providing URL, username, password, OData version, and platform. Verifies credentials and must be run first to enable other tools.
Instructions
Инициализирует подключение к BPMSoft (URL, логин, пароль, версия OData, платформа) и проверяет учётные данные. Должен быть вызван первым, если сервер запущен без переменных окружения BPMSOFT_URL/USERNAME/PASSWORD. После успешного вызова все остальные инструменты становятся работоспособными.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL приложения BPMSoft (например: https://mycompany.bpmsoft.com) | |
| username | Yes | Имя пользователя для входа | |
| password | Yes | Пароль пользователя | |
| odata_version | No | Версия OData протокола: 4 (по умолчанию) или 3 | |
| platform | No | Платформа: "net8" (по умолчанию) или "netframework" |
Implementation Reference
- src/tools/init-tool.ts:62-166 (handler)Core handler function that registers the bpm_init MCP tool. Builds config from user input, initializes service container (HttpClient, AuthManager, ODataClient, etc.), attempts login, and on success triggers onInitialized callback to make all other tools operational.
export function registerInitTool( server: McpServer, _container: ServiceContainer, onInitialized: (newContainer: ServiceContainer) => void ): void { const meta = getTool('bpm_init'); server.registerTool( meta.name, { title: meta.title, description: meta.description, inputSchema: { url: z.string().describe('URL приложения BPMSoft (например: https://mycompany.bpmsoft.com)'), username: z.string().describe('Имя пользователя для входа'), password: z.string().describe('Пароль пользователя'), odata_version: z .number() .optional() .describe('Версия OData протокола: 4 (по умолчанию) или 3'), platform: z .string() .optional() .describe('Платформа: "net8" (по умолчанию) или "netframework"'), }, annotations: meta.annotations, }, async (params): Promise<CallToolResult> => { try { const config = buildConfig(params.url, params.username, params.password, { odata_version: params.odata_version, platform: params.platform, }); const newContainer = initializeServices(config); try { await newContainer.authManager.login(); } catch (authError) { return { content: [ { type: 'text', text: [ '❌ Ошибка подключения к BPMSoft', '', `URL: ${config.bpmsoft_url}`, `Пользователь: ${config.username}`, `OData: v${config.odata_version}`, `Платформа: ${config.platform}`, '', `Ошибка: ${authError instanceof Error ? authError.message : String(authError)}`, '', 'Проверьте URL, логин и пароль и попробуйте снова.', ].join('\n'), }, ], isError: true, }; } onInitialized(newContainer); const odataBaseUrl = getODataBaseUrl(config); return { content: [ { type: 'text', text: [ '✅ Подключение к BPMSoft установлено', '', `URL: ${config.bpmsoft_url}`, `OData endpoint: ${odataBaseUrl}`, `Пользователь: ${config.username}`, `OData: v${config.odata_version}`, `Платформа: ${config.platform}`, '', 'Доступные инструменты:', listToolBlurbs(), ].join('\n'), }, ], structuredContent: { url: config.bpmsoft_url, odata_endpoint: odataBaseUrl, odata_version: config.odata_version, platform: config.platform, username: config.username, initialized: true, }, }; } catch (error) { return { content: [ { type: 'text', text: `Ошибка инициализации: ${error instanceof Error ? error.message : String(error)}`, }, ], isError: true, }; } } ); } - src/tools/registry.ts:29-37 (schema)Tool metadata descriptor for bpm_init: defines name, title, description, MCP annotations (idempotent, open-world), category='init', and a blurb for success listing.
{ name: 'bpm_init', title: 'Подключиться к BPMSoft', description: 'Инициализирует подключение к BPMSoft (URL, логин, пароль, версия OData, платформа) и проверяет учётные данные. Должен быть вызван первым, если сервер запущен без переменных окружения BPMSOFT_URL/USERNAME/PASSWORD. После успешного вызова все остальные инструменты становятся работоспособными.', annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }, blurb: 'инициализация подключения (URL, логин/пароль, OData v3/4, платформа)', category: 'init', }, - src/index.ts:62-64 (registration)Registration call in the main entry point. Registers the bpm_init tool on the MCP server, passing a callback that replaces the global service container upon successful initialization.
registerInitTool(server, services, (newContainer) => { services = newContainer; }); - src/config.ts:44-60 (helper)Helper used by bpm_init to build BpmConfig from user-provided URL, username, password, OData version, and platform. Also validates compatibility (OData 3 requires .NET Framework).
export function buildConfig( url: string, username: string, password: string, options?: { odata_version?: string | number; platform?: string; } ): BpmConfig { const odataVersion = parseODataVersion( typeof options?.odata_version === 'number' ? String(options.odata_version) : options?.odata_version ); const platform = parsePlatform(options?.platform); if (odataVersion === 3 && platform === 'net8') { - src/tools/init-tool.ts:42-166 (helper)Creates and wires together all service dependencies (HTTP client, auth, OData, metadata, lookup, process engine) after successful bpm_init.
export function initializeServices(config: BpmConfig): ServiceContainer { const httpClient = new HttpClient(config); const authManager = new AuthManager(config, httpClient); const odataClient = new ODataClient(config, httpClient); const metadataManager = new MetadataManager(config, odataClient, httpClient); const lookupResolver = new LookupResolver(config, odataClient, metadataManager); const processEngine = new ProcessEngineClient(config, httpClient); return { config, httpClient, authManager, odataClient, metadataManager, lookupResolver, processEngine, initialized: true, }; } export function registerInitTool( server: McpServer, _container: ServiceContainer, onInitialized: (newContainer: ServiceContainer) => void ): void { const meta = getTool('bpm_init'); server.registerTool( meta.name, { title: meta.title, description: meta.description, inputSchema: { url: z.string().describe('URL приложения BPMSoft (например: https://mycompany.bpmsoft.com)'), username: z.string().describe('Имя пользователя для входа'), password: z.string().describe('Пароль пользователя'), odata_version: z .number() .optional() .describe('Версия OData протокола: 4 (по умолчанию) или 3'), platform: z .string() .optional() .describe('Платформа: "net8" (по умолчанию) или "netframework"'), }, annotations: meta.annotations, }, async (params): Promise<CallToolResult> => { try { const config = buildConfig(params.url, params.username, params.password, { odata_version: params.odata_version, platform: params.platform, }); const newContainer = initializeServices(config); try { await newContainer.authManager.login(); } catch (authError) { return { content: [ { type: 'text', text: [ '❌ Ошибка подключения к BPMSoft', '', `URL: ${config.bpmsoft_url}`, `Пользователь: ${config.username}`, `OData: v${config.odata_version}`, `Платформа: ${config.platform}`, '', `Ошибка: ${authError instanceof Error ? authError.message : String(authError)}`, '', 'Проверьте URL, логин и пароль и попробуйте снова.', ].join('\n'), }, ], isError: true, }; } onInitialized(newContainer); const odataBaseUrl = getODataBaseUrl(config); return { content: [ { type: 'text', text: [ '✅ Подключение к BPMSoft установлено', '', `URL: ${config.bpmsoft_url}`, `OData endpoint: ${odataBaseUrl}`, `Пользователь: ${config.username}`, `OData: v${config.odata_version}`, `Платформа: ${config.platform}`, '', 'Доступные инструменты:', listToolBlurbs(), ].join('\n'), }, ], structuredContent: { url: config.bpmsoft_url, odata_endpoint: odataBaseUrl, odata_version: config.odata_version, platform: config.platform, username: config.username, initialized: true, }, }; } catch (error) { return { content: [ { type: 'text', text: `Ошибка инициализации: ${error instanceof Error ? error.message : String(error)}`, }, ], isError: true, }; } } ); }