@camunda/e2e-test-suite 0.0.623 → 0.0.624

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,34 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Web Modeler" exporterVersion="e2e-test" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.10.0">
3
+ <bpmn:process id="mcpCallStale" name="MCP Call Stale Tool" isExecutable="true">
4
+ <bpmn:startEvent id="StartEvent_1" name="Stale tool triggered">
5
+ <bpmn:extensionElements>
6
+ <zeebe:properties>
7
+ <zeebe:property name="io.camunda.tool:name" value="mcp-call-stale" />
8
+ <zeebe:property name="io.camunda.tool:purpose" value="Temporary tool used to test stale tool invocation in call-tools E2E tests." />
9
+ </zeebe:properties>
10
+ </bpmn:extensionElements>
11
+ <bpmn:outgoing>Flow_1</bpmn:outgoing>
12
+ <bpmn:messageEventDefinition id="MessageEventDefinition_1" messageRef="Message_call_stale" />
13
+ </bpmn:startEvent>
14
+ <bpmn:endEvent id="EndEvent_1">
15
+ <bpmn:incoming>Flow_1</bpmn:incoming>
16
+ </bpmn:endEvent>
17
+ <bpmn:sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="EndEvent_1" />
18
+ </bpmn:process>
19
+ <bpmn:message id="Message_call_stale" name="mcp-call-stale" />
20
+ <bpmndi:BPMNDiagram id="BPMNDiagram_1">
21
+ <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="mcpCallStale">
22
+ <bpmndi:BPMNShape id="_BPMNShape_StartEvent_1" bpmnElement="StartEvent_1">
23
+ <dc:Bounds x="150" y="100" width="36" height="36" />
24
+ </bpmndi:BPMNShape>
25
+ <bpmndi:BPMNShape id="EndEvent_1_di" bpmnElement="EndEvent_1">
26
+ <dc:Bounds x="242" y="100" width="36" height="36" />
27
+ </bpmndi:BPMNShape>
28
+ <bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1">
29
+ <di:waypoint x="186" y="118" />
30
+ <di:waypoint x="242" y="118" />
31
+ </bpmndi:BPMNEdge>
32
+ </bpmndi:BPMNPlane>
33
+ </bpmndi:BPMNDiagram>
34
+ </bpmn:definitions>
@@ -0,0 +1,28 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Web Modeler" exporterVersion="e2e-test" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.10.0">
3
+ <bpmn:process id="mcpCallStale" name="MCP Call Stale Tool" isExecutable="true">
4
+ <bpmn:startEvent id="StartEvent_1" name="Stale tool triggered (disabled)">
5
+ <bpmn:outgoing>Flow_1</bpmn:outgoing>
6
+ <bpmn:messageEventDefinition id="MessageEventDefinition_1" messageRef="Message_call_stale" />
7
+ </bpmn:startEvent>
8
+ <bpmn:endEvent id="EndEvent_1">
9
+ <bpmn:incoming>Flow_1</bpmn:incoming>
10
+ </bpmn:endEvent>
11
+ <bpmn:sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="EndEvent_1" />
12
+ </bpmn:process>
13
+ <bpmn:message id="Message_call_stale" name="mcp-call-stale" />
14
+ <bpmndi:BPMNDiagram id="BPMNDiagram_1">
15
+ <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="mcpCallStale">
16
+ <bpmndi:BPMNShape id="_BPMNShape_StartEvent_1" bpmnElement="StartEvent_1">
17
+ <dc:Bounds x="150" y="100" width="36" height="36" />
18
+ </bpmndi:BPMNShape>
19
+ <bpmndi:BPMNShape id="EndEvent_1_di" bpmnElement="EndEvent_1">
20
+ <dc:Bounds x="242" y="100" width="36" height="36" />
21
+ </bpmndi:BPMNShape>
22
+ <bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1">
23
+ <di:waypoint x="186" y="118" />
24
+ <di:waypoint x="242" y="118" />
25
+ </bpmndi:BPMNEdge>
26
+ </bpmndi:BPMNPlane>
27
+ </bpmndi:BPMNDiagram>
28
+ </bpmn:definitions>
@@ -0,0 +1,34 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Web Modeler" exporterVersion="e2e-test" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.10.0">
3
+ <bpmn:process id="mcpE2EFlowTool" name="MCP E2E Flow Tool" isExecutable="true">
4
+ <bpmn:startEvent id="StartEvent_1" name="E2E flow tool triggered">
5
+ <bpmn:extensionElements>
6
+ <zeebe:properties>
7
+ <zeebe:property name="io.camunda.tool:name" value="mcp-e2e-flow-tool" />
8
+ <zeebe:property name="io.camunda.tool:purpose" value="E2E flow tool for version-change tests (v1)." />
9
+ </zeebe:properties>
10
+ </bpmn:extensionElements>
11
+ <bpmn:outgoing>Flow_1</bpmn:outgoing>
12
+ <bpmn:messageEventDefinition id="MessageEventDefinition_1" messageRef="Message_e2e_flow" />
13
+ </bpmn:startEvent>
14
+ <bpmn:endEvent id="EndEvent_1">
15
+ <bpmn:incoming>Flow_1</bpmn:incoming>
16
+ </bpmn:endEvent>
17
+ <bpmn:sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="EndEvent_1" />
18
+ </bpmn:process>
19
+ <bpmn:message id="Message_e2e_flow" name="mcp-e2e-flow-tool" />
20
+ <bpmndi:BPMNDiagram id="BPMNDiagram_1">
21
+ <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="mcpE2EFlowTool">
22
+ <bpmndi:BPMNShape id="_BPMNShape_StartEvent_1" bpmnElement="StartEvent_1">
23
+ <dc:Bounds x="150" y="100" width="36" height="36" />
24
+ </bpmndi:BPMNShape>
25
+ <bpmndi:BPMNShape id="EndEvent_1_di" bpmnElement="EndEvent_1">
26
+ <dc:Bounds x="242" y="100" width="36" height="36" />
27
+ </bpmndi:BPMNShape>
28
+ <bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1">
29
+ <di:waypoint x="186" y="118" />
30
+ <di:waypoint x="242" y="118" />
31
+ </bpmndi:BPMNEdge>
32
+ </bpmndi:BPMNPlane>
33
+ </bpmndi:BPMNDiagram>
34
+ </bpmn:definitions>
@@ -0,0 +1,34 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Web Modeler" exporterVersion="e2e-test" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.10.0">
3
+ <bpmn:process id="mcpE2EFlowTool" name="MCP E2E Flow Tool" isExecutable="true">
4
+ <bpmn:startEvent id="StartEvent_1" name="E2E flow tool triggered">
5
+ <bpmn:extensionElements>
6
+ <zeebe:properties>
7
+ <zeebe:property name="io.camunda.tool:name" value="mcp-e2e-flow-tool" />
8
+ <zeebe:property name="io.camunda.tool:purpose" value="E2E flow tool for version-change tests (v2)." />
9
+ </zeebe:properties>
10
+ </bpmn:extensionElements>
11
+ <bpmn:outgoing>Flow_1</bpmn:outgoing>
12
+ <bpmn:messageEventDefinition id="MessageEventDefinition_1" messageRef="Message_e2e_flow" />
13
+ </bpmn:startEvent>
14
+ <bpmn:endEvent id="EndEvent_1">
15
+ <bpmn:incoming>Flow_1</bpmn:incoming>
16
+ </bpmn:endEvent>
17
+ <bpmn:sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="EndEvent_1" />
18
+ </bpmn:process>
19
+ <bpmn:message id="Message_e2e_flow" name="mcp-e2e-flow-tool" />
20
+ <bpmndi:BPMNDiagram id="BPMNDiagram_1">
21
+ <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="mcpE2EFlowTool">
22
+ <bpmndi:BPMNShape id="_BPMNShape_StartEvent_1" bpmnElement="StartEvent_1">
23
+ <dc:Bounds x="150" y="100" width="36" height="36" />
24
+ </bpmndi:BPMNShape>
25
+ <bpmndi:BPMNShape id="EndEvent_1_di" bpmnElement="EndEvent_1">
26
+ <dc:Bounds x="242" y="100" width="36" height="36" />
27
+ </bpmndi:BPMNShape>
28
+ <bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1">
29
+ <di:waypoint x="186" y="118" />
30
+ <di:waypoint x="242" y="118" />
31
+ </bpmndi:BPMNEdge>
32
+ </bpmndi:BPMNPlane>
33
+ </bpmndi:BPMNDiagram>
34
+ </bpmn:definitions>
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH under
4
+ * one or more contributor license agreements. See the NOTICE file distributed
5
+ * with this work for additional information regarding copyright ownership.
6
+ * Licensed under the Camunda License 1.0. You may not use this file
7
+ * except in compliance with the Camunda License 1.0.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ /*
11
+ * Tests for POST /mcp/processes — tools/call endpoint.
12
+ * Direct JSON-RPC 2.0 calls; no browser interaction.
13
+ */
14
+ const _8_10_1 = require("../../../../fixtures/8.10");
15
+ const test_1 = require("@playwright/test");
16
+ const apiHelpers_1 = require("../../../../utils/apiHelpers");
17
+ const constants_1 = require("../../../../utils/constants");
18
+ const mcpHelpers_1 = require("../../../../utils/mcpHelpers");
19
+ let authToken;
20
+ let mcpProcessesUrl;
21
+ let messageSubscriptionsSearchUrl;
22
+ let processInstancesSearchUrl;
23
+ let variablesSearchUrl;
24
+ let mcpSessionId = null;
25
+ // processInstanceKey of a pre-created instance used by SC-CALL-08 (getProcessInstance smoke).
26
+ let smokeProcessInstanceKey = null;
27
+ _8_10_1.test.describe.configure({ mode: 'parallel' });
28
+ _8_10_1.test.describe('Orchestration Cluster MCP Server — /mcp/processes tools/call', () => {
29
+ _8_10_1.test.beforeAll(async () => {
30
+ authToken = await (0, apiHelpers_1.authSaasAPI)(undefined, 'agentic_cluster');
31
+ mcpProcessesUrl = (0, apiHelpers_1.buildZeebeApiUrl)('/mcp/processes', 'saas', 'agentic_cluster');
32
+ messageSubscriptionsSearchUrl = (0, apiHelpers_1.buildZeebeApiUrl)('/v2/message-subscriptions/search', 'saas', 'agentic_cluster');
33
+ processInstancesSearchUrl = (0, apiHelpers_1.buildZeebeApiUrl)('/v2/process-instances/search', 'saas', 'agentic_cluster');
34
+ variablesSearchUrl = (0, apiHelpers_1.buildZeebeApiUrl)('/v2/variables/search', 'saas', 'agentic_cluster');
35
+ const apiContext = await (0, apiHelpers_1.getApiRequestContext)();
36
+ mcpSessionId = await (0, mcpHelpers_1.initializeMcpSession)(apiContext, mcpProcessesUrl, authToken, mcpSessionId);
37
+ // Deploy processes needed by this suite concurrently.
38
+ const [toolProcessKey, withInputsKey] = await Promise.all([
39
+ (0, apiHelpers_1.deployProcess)('./resources/mcp_server_saas/mcp_as_tool_process.bpmn', authToken, 'saas', 'agentic_cluster'),
40
+ (0, apiHelpers_1.deployProcess)('./resources/mcp_server_saas/mcp_as_tool_with_inputs.bpmn', authToken, 'saas', 'agentic_cluster'),
41
+ ]);
42
+ if (toolProcessKey == null)
43
+ throw new Error('Failed to deploy mcp_as_tool_process.bpmn');
44
+ if (withInputsKey == null)
45
+ throw new Error('Failed to deploy mcp_as_tool_with_inputs.bpmn');
46
+ // Pre-create a process instance for SC-CALL-08 (getProcessInstance smoke).
47
+ const restRes = await apiContext.post((0, apiHelpers_1.buildZeebeApiUrl)('/v2/process-instances', 'saas', 'agentic_cluster'), {
48
+ headers: (0, mcpHelpers_1.buildMcpHeaders)(authToken, mcpSessionId),
49
+ data: { processDefinitionId: 'mcpAsToolProcess', variables: {} },
50
+ });
51
+ if (restRes.ok()) {
52
+ const body = (await restRes.json());
53
+ smokeProcessInstanceKey = body.processInstanceKey
54
+ ? String(body.processInstanceKey)
55
+ : null;
56
+ }
57
+ });
58
+ (0, _8_10_1.test)('SC-CALL-01 — Tool invocation starts a process instance', async () => {
59
+ const apiContext = await (0, apiHelpers_1.getApiRequestContext)();
60
+ let toolName = null;
61
+ await _8_10_1.test.step('Resolve latest subscription key for mcpAsToolProcess', async () => {
62
+ await (0, test_1.expect)(async () => {
63
+ const res = await apiContext.post(messageSubscriptionsSearchUrl, {
64
+ headers: (0, mcpHelpers_1.buildMcpHeaders)(authToken, mcpSessionId),
65
+ data: {
66
+ filter: {
67
+ processDefinitionId: 'mcpAsToolProcess',
68
+ messageSubscriptionType: 'START_EVENT',
69
+ },
70
+ sort: [{ field: 'processDefinitionVersion', order: 'desc' }],
71
+ page: { limit: 1 },
72
+ },
73
+ });
74
+ await (0, mcpHelpers_1.assertResponseStatus)(res, 200);
75
+ const json = (await res.json());
76
+ (0, test_1.expect)(json.items.length).toBeGreaterThanOrEqual(1);
77
+ toolName = `mcp-as-tool-process_${json.items[0].messageSubscriptionKey}`;
78
+ }).toPass(constants_1.defaultAssertionOptions);
79
+ });
80
+ await _8_10_1.test.step('Invoke tool and assert processInstanceKey returned', async () => {
81
+ const body = await (0, mcpHelpers_1.callTool)(apiContext, mcpProcessesUrl, authToken, mcpSessionId, toolName, {});
82
+ (0, test_1.expect)(body.result).toBeDefined();
83
+ (0, test_1.expect)(body.result.isError).not.toBe(true);
84
+ const text = body.result.content[0]?.text ?? '';
85
+ const processInstanceKey = (0, mcpHelpers_1.extractProcessInstanceKey)(text);
86
+ (0, test_1.expect)(processInstanceKey, `Expected a numeric processInstanceKey in tool result, got: ${text}`).not.toBeNull();
87
+ });
88
+ });
89
+ (0, _8_10_1.test)('SC-CALL-02 — Tool arguments become process variables', async () => {
90
+ const apiContext = await (0, apiHelpers_1.getApiRequestContext)();
91
+ let toolName = null;
92
+ let processInstanceKey = null;
93
+ await _8_10_1.test.step('Resolve latest subscription key for mcpAsToolWithInputs', async () => {
94
+ await (0, test_1.expect)(async () => {
95
+ const res = await apiContext.post(messageSubscriptionsSearchUrl, {
96
+ headers: (0, mcpHelpers_1.buildMcpHeaders)(authToken, mcpSessionId),
97
+ data: {
98
+ filter: {
99
+ processDefinitionId: 'mcpAsToolWithInputs',
100
+ messageSubscriptionType: 'START_EVENT',
101
+ },
102
+ sort: [{ field: 'processDefinitionVersion', order: 'desc' }],
103
+ page: { limit: 1 },
104
+ },
105
+ });
106
+ await (0, mcpHelpers_1.assertResponseStatus)(res, 200);
107
+ const json = (await res.json());
108
+ (0, test_1.expect)(json.items.length).toBeGreaterThanOrEqual(1);
109
+ toolName = `mcp-as-tool-with-inputs_${json.items[0].messageSubscriptionKey}`;
110
+ }).toPass(constants_1.defaultAssertionOptions);
111
+ });
112
+ await _8_10_1.test.step('Invoke tool with arguments', async () => {
113
+ const body = await (0, mcpHelpers_1.callTool)(apiContext, mcpProcessesUrl, authToken, mcpSessionId, toolName, { firstName: 'TestUser', amount: 42 });
114
+ (0, test_1.expect)(body.result).toBeDefined();
115
+ (0, test_1.expect)(body.result.isError).not.toBe(true);
116
+ const text = body.result.content[0]?.text ?? '';
117
+ processInstanceKey = (0, mcpHelpers_1.extractProcessInstanceKey)(text);
118
+ (0, test_1.expect)(processInstanceKey).not.toBeNull();
119
+ });
120
+ await _8_10_1.test.step('Verify tool arguments visible as process variables', async () => {
121
+ await (0, test_1.expect)(async () => {
122
+ const varRes = await apiContext.post(variablesSearchUrl, {
123
+ headers: (0, mcpHelpers_1.buildMcpHeaders)(authToken, mcpSessionId),
124
+ data: { filter: { processInstanceKey }, page: { limit: 50 } },
125
+ });
126
+ await (0, mcpHelpers_1.assertResponseStatus)(varRes, 200);
127
+ const varJson = (await varRes.json());
128
+ const varMap = Object.fromEntries(varJson.items.map((v) => [v.name, v.value]));
129
+ (0, test_1.expect)(varMap['firstName']).toBe('"TestUser"');
130
+ (0, test_1.expect)(varMap['amount']).toBe('42');
131
+ }).toPass(constants_1.defaultAssertionOptions);
132
+ });
133
+ });
134
+ (0, _8_10_1.test)('SC-CALL-05 — Calling a non-existent tool returns an error', async () => {
135
+ const apiContext = await (0, apiHelpers_1.getApiRequestContext)();
136
+ const body = await (0, mcpHelpers_1.callTool)(apiContext, mcpProcessesUrl, authToken, mcpSessionId, 'non-existent-tool_000', {});
137
+ const hasJsonRpcError = body.error != null;
138
+ const hasMcpError = body.result?.isError === true;
139
+ (0, test_1.expect)(hasJsonRpcError || hasMcpError, `Expected an error for unknown tool, got: ${JSON.stringify(body)}`).toBe(true);
140
+ });
141
+ (0, _8_10_1.test)('SC-CALL-06 — Calling a stale tool after redeployment without annotation returns an error', async () => {
142
+ const apiContext = await (0, apiHelpers_1.getApiRequestContext)();
143
+ let staleToolName = null;
144
+ await _8_10_1.test.step('Deploy stale process with MCP annotation', async () => {
145
+ const staleKey = await (0, apiHelpers_1.deployProcess)('./resources/mcp_server_saas/mcp_as_tool_call_stale.bpmn', authToken, 'saas', 'agentic_cluster');
146
+ if (staleKey == null)
147
+ throw new Error('Failed to deploy mcp_as_tool_call_stale.bpmn');
148
+ });
149
+ await _8_10_1.test.step('Wait for stale tool to appear in tools/list', async () => {
150
+ await (0, test_1.expect)(async () => {
151
+ const tools = await (0, mcpHelpers_1.listTools)(apiContext, mcpProcessesUrl, authToken, mcpSessionId);
152
+ const match = tools.find((t) => /^mcp-call-stale_\d+$/.test(t.name));
153
+ (0, test_1.expect)(match).toBeDefined();
154
+ staleToolName = match.name;
155
+ }).toPass(constants_1.defaultAssertionOptions);
156
+ });
157
+ await _8_10_1.test.step('Redeploy without MCP annotation', async () => {
158
+ const disabledKey = await (0, apiHelpers_1.deployProcess)('./resources/mcp_server_saas/mcp_as_tool_call_stale_disabled.bpmn', authToken, 'saas', 'agentic_cluster');
159
+ if (disabledKey == null)
160
+ throw new Error('Failed to deploy mcp_as_tool_call_stale_disabled.bpmn');
161
+ });
162
+ await _8_10_1.test.step('Wait for stale tool to disappear from tools/list', async () => {
163
+ await (0, test_1.expect)(async () => {
164
+ const tools = await (0, mcpHelpers_1.listTools)(apiContext, mcpProcessesUrl, authToken, mcpSessionId);
165
+ (0, test_1.expect)(tools.some((t) => /^mcp-call-stale_\d+$/.test(t.name))).toBe(false);
166
+ }).toPass(constants_1.deletionAssertionOptions);
167
+ });
168
+ await _8_10_1.test.step('Invoke stale tool name and assert error', async () => {
169
+ const body = await (0, mcpHelpers_1.callTool)(apiContext, mcpProcessesUrl, authToken, mcpSessionId, staleToolName, {});
170
+ const hasJsonRpcError = body.error != null;
171
+ const hasMcpError = body.result?.isError === true;
172
+ (0, test_1.expect)(hasJsonRpcError || hasMcpError, `Expected an error invoking stale tool ${staleToolName}, got: ${JSON.stringify(body)}`).toBe(true);
173
+ });
174
+ });
175
+ (0, _8_10_1.test)('SC-CALL-08 — getProcessInstance static tool is accessible on /mcp/processes', async () => {
176
+ const apiContext = await (0, apiHelpers_1.getApiRequestContext)();
177
+ let instanceKey = smokeProcessInstanceKey;
178
+ await _8_10_1.test.step('Resolve process instance key', async () => {
179
+ if (!instanceKey) {
180
+ // Attempt to find any mcpAsToolProcess instance via the search API.
181
+ const searchRes = await apiContext.post(processInstancesSearchUrl, {
182
+ headers: (0, mcpHelpers_1.buildMcpHeaders)(authToken, mcpSessionId),
183
+ data: {
184
+ filter: { processDefinitionId: 'mcpAsToolProcess' },
185
+ sort: [{ field: 'processInstanceKey', order: 'desc' }],
186
+ page: { limit: 1 },
187
+ },
188
+ });
189
+ if (searchRes.ok()) {
190
+ const searchJson = (await searchRes.json());
191
+ instanceKey = searchJson.items[0]?.processInstanceKey ?? null;
192
+ }
193
+ }
194
+ (0, test_1.expect)(instanceKey, 'No mcpAsToolProcess instance available for getProcessInstance smoke test').not.toBeNull();
195
+ });
196
+ await _8_10_1.test.step('Call getProcessInstance tool and verify response', async () => {
197
+ const body = await (0, mcpHelpers_1.callTool)(apiContext, mcpProcessesUrl, authToken, mcpSessionId, 'getProcessInstance', { processInstanceKey: instanceKey });
198
+ (0, test_1.expect)(body.result).toBeDefined();
199
+ (0, test_1.expect)(body.result.isError).not.toBe(true);
200
+ const text = body.result.content[0]?.text ?? '';
201
+ (0, test_1.expect)(text).toContain(instanceKey);
202
+ (0, test_1.expect)(text.toLowerCase()).toMatch(/state|status/);
203
+ });
204
+ });
205
+ });
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH under
4
+ * one or more contributor license agreements. See the NOTICE file distributed
5
+ * with this work for additional information regarding copyright ownership.
6
+ * Licensed under the Camunda License 1.0. You may not use this file
7
+ * except in compliance with the Camunda License 1.0.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ /*
11
+ * Full end-to-end flow tests for /mcp/processes.
12
+ * Deploy a process, discover via tools/list, invoke via tools/call, verify in Operate.
13
+ */
14
+ const _8_10_1 = require("../../../../fixtures/8.10");
15
+ const test_1 = require("@playwright/test");
16
+ const apiHelpers_1 = require("../../../../utils/apiHelpers");
17
+ const constants_1 = require("../../../../utils/constants");
18
+ const mcpHelpers_1 = require("../../../../utils/mcpHelpers");
19
+ let authToken;
20
+ let mcpProcessesUrl;
21
+ let messageSubscriptionsSearchUrl;
22
+ let processInstancesSearchUrl;
23
+ let mcpSessionId = null;
24
+ _8_10_1.test.describe.configure({ mode: 'parallel' });
25
+ _8_10_1.test.describe('Orchestration Cluster MCP Server — /mcp/processes full E2E flows', () => {
26
+ _8_10_1.test.beforeAll(async () => {
27
+ authToken = await (0, apiHelpers_1.authSaasAPI)(undefined, 'agentic_cluster');
28
+ mcpProcessesUrl = (0, apiHelpers_1.buildZeebeApiUrl)('/mcp/processes', 'saas', 'agentic_cluster');
29
+ messageSubscriptionsSearchUrl = (0, apiHelpers_1.buildZeebeApiUrl)('/v2/message-subscriptions/search', 'saas', 'agentic_cluster');
30
+ processInstancesSearchUrl = (0, apiHelpers_1.buildZeebeApiUrl)('/v2/process-instances/search', 'saas', 'agentic_cluster');
31
+ const apiContext = await (0, apiHelpers_1.getApiRequestContext)();
32
+ mcpSessionId = await (0, mcpHelpers_1.initializeMcpSession)(apiContext, mcpProcessesUrl, authToken, mcpSessionId);
33
+ });
34
+ (0, _8_10_1.test)('SC-E2E-01 — Complete flow: deploy → discover via subscriptions → invoke via tools/call → verify instance in Operate', async () => {
35
+ const apiContext = await (0, apiHelpers_1.getApiRequestContext)();
36
+ let subscriptionKey = null;
37
+ let processInstanceKey = null;
38
+ await _8_10_1.test.step('Deploy process', async () => {
39
+ const processKey = await (0, apiHelpers_1.deployProcess)('./resources/mcp_server_saas/mcp_as_tool_process.bpmn', authToken, 'saas', 'agentic_cluster');
40
+ (0, test_1.expect)(processKey).not.toBeNull();
41
+ });
42
+ await _8_10_1.test.step('Discover tool via message-subscriptions search', async () => {
43
+ await (0, test_1.expect)(async () => {
44
+ const res = await apiContext.post(messageSubscriptionsSearchUrl, {
45
+ headers: (0, mcpHelpers_1.buildMcpHeaders)(authToken, mcpSessionId),
46
+ data: {
47
+ filter: {
48
+ processDefinitionId: 'mcpAsToolProcess',
49
+ messageSubscriptionType: 'START_EVENT',
50
+ },
51
+ sort: [{ field: 'processDefinitionVersion', order: 'desc' }],
52
+ page: { limit: 1 },
53
+ },
54
+ });
55
+ await (0, mcpHelpers_1.assertResponseStatus)(res, 200);
56
+ const json = (await res.json());
57
+ (0, test_1.expect)(json.items.length).toBeGreaterThanOrEqual(1);
58
+ subscriptionKey = String(json.items[0].messageSubscriptionKey);
59
+ }).toPass(constants_1.defaultAssertionOptions);
60
+ });
61
+ const expectedToolName = `mcp-as-tool-process_${subscriptionKey}`;
62
+ await _8_10_1.test.step('Confirm tool appears in tools/list', async () => {
63
+ await (0, test_1.expect)(async () => {
64
+ const tools = await (0, mcpHelpers_1.listTools)(apiContext, mcpProcessesUrl, authToken, mcpSessionId);
65
+ (0, test_1.expect)(tools.some((t) => t.name === expectedToolName)).toBe(true);
66
+ }).toPass(constants_1.defaultAssertionOptions);
67
+ });
68
+ await _8_10_1.test.step('Invoke tool via tools/call', async () => {
69
+ const body = await (0, mcpHelpers_1.callTool)(apiContext, mcpProcessesUrl, authToken, mcpSessionId, expectedToolName, {});
70
+ (0, test_1.expect)(body.result).toBeDefined();
71
+ (0, test_1.expect)(body.result.isError).not.toBe(true);
72
+ const text = body.result.content[0]?.text ?? '';
73
+ processInstanceKey = (0, mcpHelpers_1.extractProcessInstanceKey)(text);
74
+ (0, test_1.expect)(processInstanceKey, `Expected processInstanceKey in tools/call result, got: ${text}`).not.toBeNull();
75
+ });
76
+ await _8_10_1.test.step('Verify process instance visible in Operate', async () => {
77
+ await (0, test_1.expect)(async () => {
78
+ const searchRes = await apiContext.post(processInstancesSearchUrl, {
79
+ headers: (0, mcpHelpers_1.buildMcpHeaders)(authToken, mcpSessionId),
80
+ data: { filter: { processInstanceKey } },
81
+ });
82
+ await (0, mcpHelpers_1.assertResponseStatus)(searchRes, 200);
83
+ const searchJson = (await searchRes.json());
84
+ (0, test_1.expect)(searchJson.items.length).toBeGreaterThanOrEqual(1);
85
+ (0, test_1.expect)(searchJson.items[0].processInstanceKey).toBe(processInstanceKey);
86
+ }).toPass(constants_1.defaultAssertionOptions);
87
+ });
88
+ });
89
+ (0, _8_10_1.test)('SC-E2E-03 — Redeploying a process supersedes the old subscription; the new tool is discoverable and callable', async () => {
90
+ // Intra-process redeployment: new version supersedes the previous message
91
+ // subscription, so v1 disappears from tools/list and v2 takes its place.
92
+ const apiContext = await (0, apiHelpers_1.getApiRequestContext)();
93
+ let v1SubscriptionKey = null;
94
+ let v2ToolName = null;
95
+ await _8_10_1.test.step('Deploy v1 of mcpE2EFlowTool', async () => {
96
+ const v1Key = await (0, apiHelpers_1.deployProcess)('./resources/mcp_server_saas/mcp_e2e_v1.bpmn', authToken, 'saas', 'agentic_cluster');
97
+ if (v1Key == null)
98
+ throw new Error('Failed to deploy mcp_e2e_v1.bpmn');
99
+ });
100
+ await _8_10_1.test.step('Wait for v1 subscription and capture key', async () => {
101
+ await (0, test_1.expect)(async () => {
102
+ const res = await apiContext.post(messageSubscriptionsSearchUrl, {
103
+ headers: (0, mcpHelpers_1.buildMcpHeaders)(authToken, mcpSessionId),
104
+ data: {
105
+ filter: {
106
+ processDefinitionId: 'mcpE2EFlowTool',
107
+ messageSubscriptionType: 'START_EVENT',
108
+ },
109
+ sort: [{ field: 'processDefinitionVersion', order: 'desc' }],
110
+ page: { limit: 1 },
111
+ },
112
+ });
113
+ await (0, mcpHelpers_1.assertResponseStatus)(res, 200);
114
+ const json = (await res.json());
115
+ (0, test_1.expect)(json.items.length).toBeGreaterThanOrEqual(1);
116
+ v1SubscriptionKey = String(json.items[0].messageSubscriptionKey);
117
+ }).toPass(constants_1.defaultAssertionOptions);
118
+ });
119
+ const v1ToolName = `mcp-e2e-flow-tool_${v1SubscriptionKey}`;
120
+ await _8_10_1.test.step('Confirm v1 tool appears in tools/list', async () => {
121
+ await (0, test_1.expect)(async () => {
122
+ const tools = await (0, mcpHelpers_1.listTools)(apiContext, mcpProcessesUrl, authToken, mcpSessionId);
123
+ (0, test_1.expect)(tools.some((t) => t.name === v1ToolName)).toBe(true);
124
+ }).toPass(constants_1.defaultAssertionOptions);
125
+ });
126
+ await _8_10_1.test.step('Deploy v2 of mcpE2EFlowTool', async () => {
127
+ const v2Key = await (0, apiHelpers_1.deployProcess)('./resources/mcp_server_saas/mcp_e2e_v2.bpmn', authToken, 'saas', 'agentic_cluster');
128
+ if (v2Key == null)
129
+ throw new Error('Failed to deploy mcp_e2e_v2.bpmn');
130
+ });
131
+ await _8_10_1.test.step('Wait for v1 subscription to be superseded and v2 tool to appear', async () => {
132
+ await (0, test_1.expect)(async () => {
133
+ const tools = await (0, mcpHelpers_1.listTools)(apiContext, mcpProcessesUrl, authToken, mcpSessionId);
134
+ const toolNames = tools.map((t) => t.name);
135
+ (0, test_1.expect)(toolNames).not.toContain(v1ToolName);
136
+ const newTool = tools.find((t) => /^mcp-e2e-flow-tool_\d+$/.test(t.name) && t.name !== v1ToolName);
137
+ (0, test_1.expect)(newTool).toBeDefined();
138
+ v2ToolName = newTool.name;
139
+ }).toPass(constants_1.deletionAssertionOptions);
140
+ });
141
+ (0, test_1.expect)(v2ToolName).not.toBe(v1ToolName);
142
+ await _8_10_1.test.step('Invoke v2 tool and assert it starts a process instance', async () => {
143
+ const body = await (0, mcpHelpers_1.callTool)(apiContext, mcpProcessesUrl, authToken, mcpSessionId, v2ToolName, {});
144
+ (0, test_1.expect)(body.result).toBeDefined();
145
+ (0, test_1.expect)(body.result.isError, `Expected v2 tool ${v2ToolName} to be callable, got: ${JSON.stringify(body)}`).not.toBe(true);
146
+ const text = body.result.content[0]?.text ?? '';
147
+ const pik = (0, mcpHelpers_1.extractProcessInstanceKey)(text);
148
+ (0, test_1.expect)(pik, `Expected processInstanceKey in v2 tool result, got: ${text}`).not.toBeNull();
149
+ });
150
+ });
151
+ });
@@ -1,4 +1,11 @@
1
1
  import type { APIRequestContext, APIResponse } from '@playwright/test';
2
+ export type McpToolResult = {
3
+ content: Array<{
4
+ type: string;
5
+ text: string;
6
+ }>;
7
+ isError?: boolean;
8
+ };
2
9
  export declare function assertResponseStatus(res: APIResponse, expected: number | number[], label?: string): Promise<void>;
3
10
  export declare function buildMcpHeaders(authToken: string, mcpSessionId: string | null): Record<string, string>;
4
11
  export declare function initializeMcpSession(apiContext: APIRequestContext, mcpProcessesUrl: string, authToken: string, mcpSessionId: string | null): Promise<string | null>;
@@ -7,3 +14,12 @@ export declare function listTools(apiContext: APIRequestContext, mcpProcessesUrl
7
14
  description?: string;
8
15
  inputSchema?: unknown;
9
16
  }[]>;
17
+ export declare function callTool(apiContext: APIRequestContext, mcpProcessesUrl: string, authToken: string, mcpSessionId: string | null, toolName: string, args?: Record<string, unknown>): Promise<{
18
+ result?: McpToolResult;
19
+ error?: {
20
+ code: number;
21
+ message: string;
22
+ };
23
+ }>;
24
+ /** Extract processInstanceKey from MCP tool result text content (JSON or plain text). */
25
+ export declare function extractProcessInstanceKey(text: string): string | null;
@@ -1,6 +1,13 @@
1
1
  "use strict";
2
+ /*
3
+ * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH under
4
+ * one or more contributor license agreements. See the NOTICE file distributed
5
+ * with this work for additional information regarding copyright ownership.
6
+ * Licensed under the Camunda License 1.0. You may not use this file
7
+ * except in compliance with the Camunda License 1.0.
8
+ */
2
9
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.listTools = exports.initializeMcpSession = exports.buildMcpHeaders = exports.assertResponseStatus = void 0;
10
+ exports.extractProcessInstanceKey = exports.callTool = exports.listTools = exports.initializeMcpSession = exports.buildMcpHeaders = exports.assertResponseStatus = void 0;
4
11
  const test_1 = require("@playwright/test");
5
12
  async function assertResponseStatus(res, expected, label) {
6
13
  const matches = Array.isArray(expected)
@@ -92,3 +99,35 @@ async function listTools(apiContext, mcpProcessesUrl, authToken, mcpSessionId) {
92
99
  return body.result.tools;
93
100
  }
94
101
  exports.listTools = listTools;
102
+ async function callTool(apiContext, mcpProcessesUrl, authToken, mcpSessionId, toolName, args = {}) {
103
+ const res = await apiContext.post(mcpProcessesUrl, {
104
+ headers: buildMcpHeaders(authToken, mcpSessionId),
105
+ data: {
106
+ jsonrpc: '2.0',
107
+ id: Date.now(),
108
+ method: 'tools/call',
109
+ params: { name: toolName, arguments: args },
110
+ },
111
+ });
112
+ if (res.status() !== 200) {
113
+ const body = await res.text().catch(() => '<no-body>');
114
+ console.error('callTool: unexpected HTTP status', res.status(), body);
115
+ }
116
+ (0, test_1.expect)(res.status()).toBe(200);
117
+ return res.json();
118
+ }
119
+ exports.callTool = callTool;
120
+ /** Extract processInstanceKey from MCP tool result text content (JSON or plain text). */
121
+ function extractProcessInstanceKey(text) {
122
+ try {
123
+ const parsed = JSON.parse(text);
124
+ if (parsed['processInstanceKey'])
125
+ return String(parsed['processInstanceKey']);
126
+ }
127
+ catch {
128
+ // not JSON — fall through to regex
129
+ }
130
+ const match = text.match(/\b(\d{10,})\b/);
131
+ return match ? match[1] : null;
132
+ }
133
+ exports.extractProcessInstanceKey = extractProcessInstanceKey;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/e2e-test-suite",
3
- "version": "0.0.623",
3
+ "version": "0.0.624",
4
4
  "description": "End-to-end test helpers for Camunda 8",
5
5
  "repository": {
6
6
  "type": "git",
@@ -0,0 +1,34 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Web Modeler" exporterVersion="e2e-test" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.10.0">
3
+ <bpmn:process id="mcpCallStale" name="MCP Call Stale Tool" isExecutable="true">
4
+ <bpmn:startEvent id="StartEvent_1" name="Stale tool triggered">
5
+ <bpmn:extensionElements>
6
+ <zeebe:properties>
7
+ <zeebe:property name="io.camunda.tool:name" value="mcp-call-stale" />
8
+ <zeebe:property name="io.camunda.tool:purpose" value="Temporary tool used to test stale tool invocation in call-tools E2E tests." />
9
+ </zeebe:properties>
10
+ </bpmn:extensionElements>
11
+ <bpmn:outgoing>Flow_1</bpmn:outgoing>
12
+ <bpmn:messageEventDefinition id="MessageEventDefinition_1" messageRef="Message_call_stale" />
13
+ </bpmn:startEvent>
14
+ <bpmn:endEvent id="EndEvent_1">
15
+ <bpmn:incoming>Flow_1</bpmn:incoming>
16
+ </bpmn:endEvent>
17
+ <bpmn:sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="EndEvent_1" />
18
+ </bpmn:process>
19
+ <bpmn:message id="Message_call_stale" name="mcp-call-stale" />
20
+ <bpmndi:BPMNDiagram id="BPMNDiagram_1">
21
+ <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="mcpCallStale">
22
+ <bpmndi:BPMNShape id="_BPMNShape_StartEvent_1" bpmnElement="StartEvent_1">
23
+ <dc:Bounds x="150" y="100" width="36" height="36" />
24
+ </bpmndi:BPMNShape>
25
+ <bpmndi:BPMNShape id="EndEvent_1_di" bpmnElement="EndEvent_1">
26
+ <dc:Bounds x="242" y="100" width="36" height="36" />
27
+ </bpmndi:BPMNShape>
28
+ <bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1">
29
+ <di:waypoint x="186" y="118" />
30
+ <di:waypoint x="242" y="118" />
31
+ </bpmndi:BPMNEdge>
32
+ </bpmndi:BPMNPlane>
33
+ </bpmndi:BPMNDiagram>
34
+ </bpmn:definitions>
@@ -0,0 +1,28 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Web Modeler" exporterVersion="e2e-test" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.10.0">
3
+ <bpmn:process id="mcpCallStale" name="MCP Call Stale Tool" isExecutable="true">
4
+ <bpmn:startEvent id="StartEvent_1" name="Stale tool triggered (disabled)">
5
+ <bpmn:outgoing>Flow_1</bpmn:outgoing>
6
+ <bpmn:messageEventDefinition id="MessageEventDefinition_1" messageRef="Message_call_stale" />
7
+ </bpmn:startEvent>
8
+ <bpmn:endEvent id="EndEvent_1">
9
+ <bpmn:incoming>Flow_1</bpmn:incoming>
10
+ </bpmn:endEvent>
11
+ <bpmn:sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="EndEvent_1" />
12
+ </bpmn:process>
13
+ <bpmn:message id="Message_call_stale" name="mcp-call-stale" />
14
+ <bpmndi:BPMNDiagram id="BPMNDiagram_1">
15
+ <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="mcpCallStale">
16
+ <bpmndi:BPMNShape id="_BPMNShape_StartEvent_1" bpmnElement="StartEvent_1">
17
+ <dc:Bounds x="150" y="100" width="36" height="36" />
18
+ </bpmndi:BPMNShape>
19
+ <bpmndi:BPMNShape id="EndEvent_1_di" bpmnElement="EndEvent_1">
20
+ <dc:Bounds x="242" y="100" width="36" height="36" />
21
+ </bpmndi:BPMNShape>
22
+ <bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1">
23
+ <di:waypoint x="186" y="118" />
24
+ <di:waypoint x="242" y="118" />
25
+ </bpmndi:BPMNEdge>
26
+ </bpmndi:BPMNPlane>
27
+ </bpmndi:BPMNDiagram>
28
+ </bpmn:definitions>
@@ -0,0 +1,34 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Web Modeler" exporterVersion="e2e-test" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.10.0">
3
+ <bpmn:process id="mcpE2EFlowTool" name="MCP E2E Flow Tool" isExecutable="true">
4
+ <bpmn:startEvent id="StartEvent_1" name="E2E flow tool triggered">
5
+ <bpmn:extensionElements>
6
+ <zeebe:properties>
7
+ <zeebe:property name="io.camunda.tool:name" value="mcp-e2e-flow-tool" />
8
+ <zeebe:property name="io.camunda.tool:purpose" value="E2E flow tool for version-change tests (v1)." />
9
+ </zeebe:properties>
10
+ </bpmn:extensionElements>
11
+ <bpmn:outgoing>Flow_1</bpmn:outgoing>
12
+ <bpmn:messageEventDefinition id="MessageEventDefinition_1" messageRef="Message_e2e_flow" />
13
+ </bpmn:startEvent>
14
+ <bpmn:endEvent id="EndEvent_1">
15
+ <bpmn:incoming>Flow_1</bpmn:incoming>
16
+ </bpmn:endEvent>
17
+ <bpmn:sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="EndEvent_1" />
18
+ </bpmn:process>
19
+ <bpmn:message id="Message_e2e_flow" name="mcp-e2e-flow-tool" />
20
+ <bpmndi:BPMNDiagram id="BPMNDiagram_1">
21
+ <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="mcpE2EFlowTool">
22
+ <bpmndi:BPMNShape id="_BPMNShape_StartEvent_1" bpmnElement="StartEvent_1">
23
+ <dc:Bounds x="150" y="100" width="36" height="36" />
24
+ </bpmndi:BPMNShape>
25
+ <bpmndi:BPMNShape id="EndEvent_1_di" bpmnElement="EndEvent_1">
26
+ <dc:Bounds x="242" y="100" width="36" height="36" />
27
+ </bpmndi:BPMNShape>
28
+ <bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1">
29
+ <di:waypoint x="186" y="118" />
30
+ <di:waypoint x="242" y="118" />
31
+ </bpmndi:BPMNEdge>
32
+ </bpmndi:BPMNPlane>
33
+ </bpmndi:BPMNDiagram>
34
+ </bpmn:definitions>
@@ -0,0 +1,34 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Web Modeler" exporterVersion="e2e-test" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.10.0">
3
+ <bpmn:process id="mcpE2EFlowTool" name="MCP E2E Flow Tool" isExecutable="true">
4
+ <bpmn:startEvent id="StartEvent_1" name="E2E flow tool triggered">
5
+ <bpmn:extensionElements>
6
+ <zeebe:properties>
7
+ <zeebe:property name="io.camunda.tool:name" value="mcp-e2e-flow-tool" />
8
+ <zeebe:property name="io.camunda.tool:purpose" value="E2E flow tool for version-change tests (v2)." />
9
+ </zeebe:properties>
10
+ </bpmn:extensionElements>
11
+ <bpmn:outgoing>Flow_1</bpmn:outgoing>
12
+ <bpmn:messageEventDefinition id="MessageEventDefinition_1" messageRef="Message_e2e_flow" />
13
+ </bpmn:startEvent>
14
+ <bpmn:endEvent id="EndEvent_1">
15
+ <bpmn:incoming>Flow_1</bpmn:incoming>
16
+ </bpmn:endEvent>
17
+ <bpmn:sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="EndEvent_1" />
18
+ </bpmn:process>
19
+ <bpmn:message id="Message_e2e_flow" name="mcp-e2e-flow-tool" />
20
+ <bpmndi:BPMNDiagram id="BPMNDiagram_1">
21
+ <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="mcpE2EFlowTool">
22
+ <bpmndi:BPMNShape id="_BPMNShape_StartEvent_1" bpmnElement="StartEvent_1">
23
+ <dc:Bounds x="150" y="100" width="36" height="36" />
24
+ </bpmndi:BPMNShape>
25
+ <bpmndi:BPMNShape id="EndEvent_1_di" bpmnElement="EndEvent_1">
26
+ <dc:Bounds x="242" y="100" width="36" height="36" />
27
+ </bpmndi:BPMNShape>
28
+ <bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1">
29
+ <di:waypoint x="186" y="118" />
30
+ <di:waypoint x="242" y="118" />
31
+ </bpmndi:BPMNEdge>
32
+ </bpmndi:BPMNPlane>
33
+ </bpmndi:BPMNDiagram>
34
+ </bpmn:definitions>