cpi-saper-dev-mcp 0.0.0-stage → 0.9.0-beta.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/CHANGELOG.md +44 -0
- package/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +275 -2
- package/bundle/index.js +6107 -0
- package/catalog/cpi-catalog.json +3560 -0
- package/package.json +52 -4
- package/rules/versioning.md +42 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes of the `cpi-saper-dev-mcp` server. Versions follow [semantic versioning](https://semver.org/);
|
|
4
|
+
before 1.0, names and behaviour may still change between versions.
|
|
5
|
+
|
|
6
|
+
## 0.9.0-beta.0 (2026-11-02)
|
|
7
|
+
|
|
8
|
+
First public beta. **For development tenants only**: do not connect a production tenant (see the README).
|
|
9
|
+
|
|
10
|
+
### Tools (51)
|
|
11
|
+
|
|
12
|
+
- **Tenant, read:** `cpi_tenants`, `cpi_packages`, `cpi_artifacts` (iFlows and script collections), `cpi_pull`,
|
|
13
|
+
`cpi_status` (local vs pulled vs tenant: in sync, modified, changed on the tenant, conflict), `cpi_runtime_status`,
|
|
14
|
+
`cpi_endpoints`, `cpi_security_material` (names, types, validity; never secrets), `cpi_config_get`.
|
|
15
|
+
- **Understand:** `iflow_describe`, `iflow_render` (Mermaid), `iflow_diff` (also as a `git diff` driver:
|
|
16
|
+
`cpi-saper-dev-mcp textconv`), `mapping_describe` (message mappings, read-only), `templates_list` (step and adapter
|
|
17
|
+
catalog).
|
|
18
|
+
- **Edit locally:** `iflow_edit`: steps from the catalog, adapters with their Sender/Receiver boxes, exception
|
|
19
|
+
subprocess, routers and parallel/sequential multicasts with Join, steps on routes, XSLT and message mapping files,
|
|
20
|
+
Filter expressions, scripts from script collections, settings, headers and properties, layout of the process;
|
|
21
|
+
all-or-nothing batches with a dry run. `params_set` for externalized parameters.
|
|
22
|
+
- **Check:** `iflow_validate` (structure, missing files, undeclared parameters, and settings the tenant refuses only at
|
|
23
|
+
deploy), `xslt_run`, `script_run` (Groovy on the tenant's script runner), `cpi_guidelines`, `cpi_check`.
|
|
24
|
+
- **Change the tenant (development tenants, allowed packages):** `iflow_create`, `iflow_delete`, `cpi_push` (every
|
|
25
|
+
upload a version, number and comment confirmed by you), `cpi_version_proposal`, `cpi_save_version`, `cpi_deploy`
|
|
26
|
+
(with SAP's guideline check as an optional gate), `cpi_undeploy`, `cpi_config_set`.
|
|
27
|
+
- **Script collections:** `script_collection_create`, `_pull`, `_push`, `_deploy`, `_delete`.
|
|
28
|
+
- **Test and monitor:** `cpi_send_message`, `cpi_messages`, `cpi_message`, `cpi_trace` (experimental), `cpi_login`.
|
|
29
|
+
- **Runtime data:** `cpi_datastores`, `cpi_datastore_entry`, `cpi_datastore_delete`, `cpi_variables`,
|
|
30
|
+
`cpi_variable_delete`, `cpi_queues`, `cpi_queue_action` (JMS), `cpi_number_ranges`, `cpi_number_range_set`,
|
|
31
|
+
`cpi_duplicate_checks`, `cpi_duplicate_check_delete`, `cpi_message_store`.
|
|
32
|
+
|
|
33
|
+
### Safety
|
|
34
|
+
|
|
35
|
+
Read-only and development roles per tenant, allowed packages, confirmation of changes through your MCP client
|
|
36
|
+
(configurable; `unattendedTestMode` for agent test runs only), an audit log, credential values never returned.
|
|
37
|
+
|
|
38
|
+
### Known gaps
|
|
39
|
+
|
|
40
|
+
- Tried against one tenant (a BTP trial); other tenants may answer differently in places
|
|
41
|
+
([docs/KNOWN_LIMITATIONS.md](docs/KNOWN_LIMITATIONS.md) lists every difference found).
|
|
42
|
+
- iFlows with local integration processes cannot be laid out or branched by `iflow_edit`.
|
|
43
|
+
- Not offered by design: creating or deleting packages, editing message mappings, managing locks.
|
|
44
|
+
- Planned: `lint`, PNG rendering, user roles for sender authorization.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
|
|
2
|
+
Apache License
|
|
3
|
+
Version 2.0, January 2004
|
|
4
|
+
http://www.apache.org/licenses/
|
|
5
|
+
|
|
6
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
7
|
+
|
|
8
|
+
1. Definitions.
|
|
9
|
+
|
|
10
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
11
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
12
|
+
|
|
13
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
14
|
+
the copyright owner that is granting the License.
|
|
15
|
+
|
|
16
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
17
|
+
other entities that control, are controlled by, or are under common
|
|
18
|
+
control with that entity. For the purposes of this definition,
|
|
19
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
20
|
+
direction or management of such entity, whether by contract or
|
|
21
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
22
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
23
|
+
|
|
24
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
25
|
+
exercising permissions granted by this License.
|
|
26
|
+
|
|
27
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
28
|
+
including but not limited to software source code, documentation
|
|
29
|
+
source, and configuration files.
|
|
30
|
+
|
|
31
|
+
"Object" form shall mean any form resulting from mechanical
|
|
32
|
+
transformation or translation of a Source form, including but
|
|
33
|
+
not limited to compiled object code, generated documentation,
|
|
34
|
+
and conversions to other media types.
|
|
35
|
+
|
|
36
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
37
|
+
Object form, made available under the License, as indicated by a
|
|
38
|
+
copyright notice that is included in or attached to the work
|
|
39
|
+
(an example is provided in the Appendix below).
|
|
40
|
+
|
|
41
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
42
|
+
form, that is based on (or derived from) the Work and for which the
|
|
43
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
44
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
45
|
+
of this License, Derivative Works shall not include works that remain
|
|
46
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
47
|
+
the Work and Derivative Works thereof.
|
|
48
|
+
|
|
49
|
+
"Contribution" shall mean any work of authorship, including
|
|
50
|
+
the original version of the Work and any modifications or additions
|
|
51
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
52
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
53
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
54
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
55
|
+
means any form of electronic, verbal, or written communication sent
|
|
56
|
+
to the Licensor or its representatives, including but not limited to
|
|
57
|
+
communication on electronic mailing lists, source code control systems,
|
|
58
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
59
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
60
|
+
excluding communication that is conspicuously marked or otherwise
|
|
61
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
62
|
+
|
|
63
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
64
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
65
|
+
subsequently incorporated within the Work.
|
|
66
|
+
|
|
67
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
68
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
69
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
70
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
71
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
72
|
+
Work and such Derivative Works in Source or Object form.
|
|
73
|
+
|
|
74
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
75
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
76
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
77
|
+
(except as stated in this section) patent license to make, have made,
|
|
78
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
79
|
+
where such license applies only to those patent claims licensable
|
|
80
|
+
by such Contributor that are necessarily infringed by their
|
|
81
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
82
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
83
|
+
institute patent litigation against any entity (including a
|
|
84
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
85
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
86
|
+
or contributory patent infringement, then any patent licenses
|
|
87
|
+
granted to You under this License for that Work shall terminate
|
|
88
|
+
as of the date such litigation is filed.
|
|
89
|
+
|
|
90
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
91
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
92
|
+
modifications, and in Source or Object form, provided that You
|
|
93
|
+
meet the following conditions:
|
|
94
|
+
|
|
95
|
+
(a) You must give any other recipients of the Work or
|
|
96
|
+
Derivative Works a copy of this License; and
|
|
97
|
+
|
|
98
|
+
(b) You must cause any modified files to carry prominent notices
|
|
99
|
+
stating that You changed the files; and
|
|
100
|
+
|
|
101
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
102
|
+
that You distribute, all copyright, patent, trademark, and
|
|
103
|
+
attribution notices from the Source form of the Work,
|
|
104
|
+
excluding those notices that do not pertain to any part of
|
|
105
|
+
the Derivative Works; and
|
|
106
|
+
|
|
107
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
108
|
+
distribution, then any Derivative Works that You distribute must
|
|
109
|
+
include a readable copy of the attribution notices contained
|
|
110
|
+
within such NOTICE file, excluding those notices that do not
|
|
111
|
+
pertain to any part of the Derivative Works, in at least one
|
|
112
|
+
of the following places: within a NOTICE text file distributed
|
|
113
|
+
as part of the Derivative Works; within the Source form or
|
|
114
|
+
documentation, if provided along with the Derivative Works; or,
|
|
115
|
+
within a display generated by the Derivative Works, if and
|
|
116
|
+
wherever such third-party notices normally appear. The contents
|
|
117
|
+
of the NOTICE file are for informational purposes only and
|
|
118
|
+
do not modify the License. You may add Your own attribution
|
|
119
|
+
notices within Derivative Works that You distribute, alongside
|
|
120
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
121
|
+
that such additional attribution notices cannot be construed
|
|
122
|
+
as modifying the License.
|
|
123
|
+
|
|
124
|
+
You may add Your own copyright statement to Your modifications and
|
|
125
|
+
may provide additional or different license terms and conditions
|
|
126
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
127
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
128
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
129
|
+
the conditions stated in this License.
|
|
130
|
+
|
|
131
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
132
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
133
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
134
|
+
this License, without any additional terms or conditions.
|
|
135
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
136
|
+
the terms of any separate license agreement you may have executed
|
|
137
|
+
with Licensor regarding such Contributions.
|
|
138
|
+
|
|
139
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
140
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
141
|
+
except as required for reasonable and customary use in describing the
|
|
142
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
143
|
+
|
|
144
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
145
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
146
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
147
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
148
|
+
implied, including, without limitation, any warranties or conditions
|
|
149
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
150
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
151
|
+
appropriateness of using or redistributing the Work and assume any
|
|
152
|
+
risks associated with Your exercise of permissions under this License.
|
|
153
|
+
|
|
154
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
155
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
156
|
+
unless required by applicable law (such as deliberate and grossly
|
|
157
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
158
|
+
liable to You for damages, including any direct, indirect, special,
|
|
159
|
+
incidental, or consequential damages of any character arising as a
|
|
160
|
+
result of this License or out of the use or inability to use the
|
|
161
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
162
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
163
|
+
other commercial damages or losses), even if such Contributor
|
|
164
|
+
has been advised of the possibility of such damages.
|
|
165
|
+
|
|
166
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
167
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
168
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
169
|
+
or other liability obligations and/or rights consistent with this
|
|
170
|
+
License. However, in accepting such obligations, You may act only
|
|
171
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
172
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
173
|
+
defend, and hold each Contributor harmless for any liability
|
|
174
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
175
|
+
of your accepting any such warranty or additional liability.
|
|
176
|
+
|
|
177
|
+
END OF TERMS AND CONDITIONS
|
|
178
|
+
|
|
179
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
180
|
+
|
|
181
|
+
To apply the Apache License to your work, attach the following
|
|
182
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
183
|
+
replaced with your own identifying information. (Don't include
|
|
184
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
185
|
+
comment syntax for the file format. We also recommend that a
|
|
186
|
+
file or class name and description of purpose be included on the
|
|
187
|
+
same "printed page" as the copyright notice for easier
|
|
188
|
+
identification within third-party archives.
|
|
189
|
+
|
|
190
|
+
Copyright [yyyy] [name of copyright owner]
|
|
191
|
+
|
|
192
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
193
|
+
you may not use this file except in compliance with the License.
|
|
194
|
+
You may obtain a copy of the License at
|
|
195
|
+
|
|
196
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
197
|
+
|
|
198
|
+
Unless required by applicable law or agreed to in writing, software
|
|
199
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
200
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
201
|
+
See the License for the specific language governing permissions and
|
|
202
|
+
limitations under the License.
|
package/NOTICE
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
cpi-saper-dev-mcp
|
|
2
|
+
Copyright 2026 Damian Kolasa (devstylator)
|
|
3
|
+
|
|
4
|
+
Originally created by Damian Kolasa (devstylator): https://github.com/devstylator/cpi-saper-dev-mcp
|
|
5
|
+
|
|
6
|
+
This product is licensed under the Apache License, Version 2.0 (see LICENSE). Redistributions, including modified
|
|
7
|
+
versions and derivative works, must keep this NOTICE file (Apache License 2.0, section 4(d)), so the original creator
|
|
8
|
+
stays credited, and modified files must carry a notice that they were changed (section 4(b)).
|
package/README.md
CHANGED
|
@@ -1,3 +1,276 @@
|
|
|
1
|
-
#
|
|
1
|
+
# cpi-saper-dev-mcp
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://github.com/devstylator/cpi-saper-dev-mcp/actions/workflows/ci.yml)
|
|
4
|
+
|
|
5
|
+
> [!WARNING]
|
|
6
|
+
> **For development tenants only. Do not connect this server to a production tenant**, not even with `role:
|
|
7
|
+
> readonly`. It is built for developing and testing on development systems: it uploads, deploys and deletes content,
|
|
8
|
+
> sends test messages, runs scripts, and reads and changes runtime data (data stores, variables, number ranges,
|
|
9
|
+
> queues). Its safety rules protect a development tenant from mistakes, not a production system from risk.
|
|
10
|
+
|
|
11
|
+
An MCP server that lets an AI agent **develop** SAP Cloud Integration (CPI) content: edit iFlows, Groovy scripts
|
|
12
|
+
and XSLT as local files under git, check them locally, then push, deploy and test them on a development tenant.
|
|
13
|
+
|
|
14
|
+
> **Status: public beta (0.9.0-beta).** Everything listed as Available was tried against a BTP trial tenant, by
|
|
15
|
+
> the author and by AI agents in test runs. Expect rough edges and report them as
|
|
16
|
+
> [issues](https://github.com/devstylator/cpi-saper-dev-mcp/issues); names and behaviour may still change before
|
|
17
|
+
> 1.0 ([CHANGELOG](CHANGELOG.md)).
|
|
18
|
+
|
|
19
|
+
## What it does
|
|
20
|
+
|
|
21
|
+
- **Read** packages, iFlows and their status; pull an iFlow into a local folder.
|
|
22
|
+
- **Understand** an iFlow without reading BPMN XML: a compact model, a Mermaid diagram, readable message mappings.
|
|
23
|
+
- **Edit** iFlows safely: insert steps with correct default settings from a bundled step catalog
|
|
24
|
+
([catalog](packages/core/catalog/)), change settings, headers and properties; keep the file formatted like SAP's designer.
|
|
25
|
+
- **Check** locally: structure validation, XSLT 1.0–3.0 runs, readable model-level diffs (also for `git diff`).
|
|
26
|
+
- **Test on the tenant** (development tenants only): push, run SAP's design guideline check, deploy, send a test
|
|
27
|
+
message, read the message log with the failing step by name, run a single Groovy script without deploying.
|
|
28
|
+
|
|
29
|
+
## Tools
|
|
30
|
+
|
|
31
|
+
**Available** tools work and were tried against a real tenant; **Planned** means designed but not built yet.
|
|
32
|
+
|
|
33
|
+
The agent's own environment (for example Claude Code or VS Code) reads and writes the local files, so the server
|
|
34
|
+
adds no generic file tools.
|
|
35
|
+
|
|
36
|
+
### Tenant: read
|
|
37
|
+
|
|
38
|
+
| Tool | What it does | Status |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| `cpi_login` | Log in with your own SAP account, so the tenant records **you** (not a technical client) as the one who changed or deployed content ([how to set it up](docs/CONFIGURATION.md#recording-changes-under-your-name)) | **Available** |
|
|
41
|
+
| `cpi_tenants` | Configured tenants and what the agent may do on each (read only, or development with writes) | **Available** |
|
|
42
|
+
| `cpi_packages` | List packages; a package can be named by its ID or its display name | **Available** |
|
|
43
|
+
| `cpi_artifacts` | List the iFlows and script collections of a package with version and runtime status | **Available** |
|
|
44
|
+
| `cpi_pull` | Download an iFlow into the local workspace (`<workspace>/<package>/<iflow>/`, SAP's file layout); never overwrites local changes unless asked | **Available** |
|
|
45
|
+
| `cpi_status` | For every pulled iFlow and script collection (or one, or a package's): in sync, modified locally, changed on the tenant, or conflict, with pulled, tenant and deployed versions; with a package also what is not pulled | **Available** |
|
|
46
|
+
| `cpi_runtime_status` | Deployment state and deploy errors, with step IDs translated to step names | **Available** |
|
|
47
|
+
| `cpi_endpoints` | HTTP endpoint URLs of deployed iFlows | **Available** |
|
|
48
|
+
| `cpi_security_material` | Names, types, expiry (days left) and deploy status of keystore entries, user credentials, OAuth2 clients and secure parameters; passwords, secrets, user names, secure values and certificates are never returned | **Available** |
|
|
49
|
+
| `cpi_config_get` | Configured values of externalized parameters, compared with the local `parameters.prop` | **Available** |
|
|
50
|
+
|
|
51
|
+
### Understand
|
|
52
|
+
|
|
53
|
+
| Tool | What it does | Status |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| `iflow_describe` | Compact model of an iFlow (steps, adapters, settings, routes, decoded header tables) instead of BPMN XML; steps numbered `#1`, `#2` … in flow order | **Available** |
|
|
56
|
+
| `iflow_render` | Mermaid diagram of an iFlow; PNG later | **Available** (Mermaid) |
|
|
57
|
+
| `iflow_diff` | Model-level changes between two versions: steps added or removed, settings old → new, table rows, rewired flows; ignores layout and IDs the designer regenerates. Also available as a [`git diff` driver](#readable-git-diff) | **Available** |
|
|
58
|
+
| `mapping_describe` | Message mapping as one line per target field, `target <- expression` (read-only) | **Available** |
|
|
59
|
+
| `templates_list` | The bundled step and adapter catalog ([catalog](packages/core/catalog/)): 106 variants with default settings | **Available** |
|
|
60
|
+
|
|
61
|
+
### Edit locally
|
|
62
|
+
|
|
63
|
+
| Tool | What it does | Status |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| `iflow_edit` | Semantic edits in one all-or-nothing batch: insert a step from the catalog (with settings, headers, properties; for XSLT and message mappings the mapping file, for a Filter its XPath, for a script step a script from a script collection), remove a step, add or remove an adapter (sender to a start event or Poll Enrich, receiver from Request Reply, Send, Content Enricher or an end event; the Sender/Receiver box is reused or created, receivers drawn below their step), add or remove an exception subprocess (steps go inside like anywhere else), add routers (conditions, default route) and parallel or sequential multicasts with a Join, put steps on their routes, edit or remove them, lay out the process (branches in rows, exception subprocess below), change settings of steps, adapters or the iFlow (unknown keys refused), rename, edit Content Modifier headers and properties. Keeps SAP's formatting, lays out the diagram, refuses edits that would break the iFlow, supports a dry run | **Available** |
|
|
66
|
+
| `params_set` | Declare, change or remove externalized parameters: `parameters.propdef` and `parameters.prop` kept consistent in the designer's format; shows where each `{{name}}` is used | **Available** |
|
|
67
|
+
|
|
68
|
+
### Check
|
|
69
|
+
|
|
70
|
+
| Tool | What it does | Status |
|
|
71
|
+
|---|---|---|
|
|
72
|
+
| `iflow_validate` | Structural checks: dangling flows, missing diagram shapes, unreachable steps, missing script or mapping files, undeclared parameters; settings the tenant refuses only at deploy (empty split or Filter expression, key alias or mapping file, a Content Enricher or Request Reply without adapter, sender authorization values, Receiver names with spaces) | **Available** |
|
|
73
|
+
| `xslt_run` | Run an XSLT (1.0–3.0) locally with headers and properties as parameters, like a CPI XSLT Mapping step; errors with line numbers | **Available** |
|
|
74
|
+
| `script_run` | Run one Groovy script (also from a script collection) on the tenant without deploying (script runner iFlow, development tenants only); Groovy 2.4 or 4 chosen from the script's imports; returns body, headers, properties, console output and what changed | **Available** |
|
|
75
|
+
| `cpi_guidelines` | Run SAP's design guideline check on the tenant (deploys through the API skip it) | **Available** |
|
|
76
|
+
| `cpi_check` | Run the tenant's model check ("Check for problems") | **Available** |
|
|
77
|
+
| `lint` | Local rules for common mistakes, including those SAP's guideline check flags | Planned |
|
|
78
|
+
|
|
79
|
+
### Tenant: change (development tenants only)
|
|
80
|
+
|
|
81
|
+
Changes ask for your confirmation, and every version needs a number and comment you confirm. For letting AI agents
|
|
82
|
+
test the server on their own there is an
|
|
83
|
+
[unattended test mode](docs/CONFIGURATION.md#unattended-test-mode-test-only): **test only, not for real
|
|
84
|
+
development.**
|
|
85
|
+
|
|
86
|
+
| Tool | What it does | Status |
|
|
87
|
+
|---|---|---|
|
|
88
|
+
| `cpi_push` | Upload a local iFlow as a **new version**: the agent proposes number and one-line comment by the versioning rules, you confirm both in a dialog, and Cloud Integration's version history shows exactly that entry. Refuses when the tenant changed since the pull or the iFlow is open in the designer | **Available** |
|
|
89
|
+
| `cpi_version_proposal` | The versioning rules (default or your own file), the local changes since the last version and a hint (major/minor/patch), so the agent can propose number and comment | **Available** |
|
|
90
|
+
| `cpi_save_version` | Record the tenant's current content as a new version with number and comment, for example after work in the designer | **Available** |
|
|
91
|
+
| `iflow_create` | Create an empty iFlow in an allowed package (as the designer does: Sender and Receiver box, Start → End, version 1.0.0) and pull it; build it with `iflow_edit`, then `cpi_push` gives it its first version | **Available** |
|
|
92
|
+
| `cpi_deploy` | Deploy the current version and wait; SAP's guideline check as an optional gate; errors are reported with step names, one line per problem. A failed deploy also stops the version that was running (Cloud Integration's behaviour), which the confirmation and result point out | **Available** |
|
|
93
|
+
| `cpi_undeploy` | Remove a deployed iFlow or script collection from the runtime | **Available** |
|
|
94
|
+
| `iflow_delete` | Delete an iFlow with its whole version history (for cleaning up test iFlows); refuses deployed iFlows and always asks for confirmation by default | **Available** |
|
|
95
|
+
| `cpi_config_set` | Configure parameter values on the tenant like "Configure" in the designer (no new version; the running iFlow uses them after the next deploy); the local `parameters.prop` follows | **Available** |
|
|
96
|
+
|
|
97
|
+
### Script collections (development tenants only)
|
|
98
|
+
|
|
99
|
+
Scripts shared by the iFlows of a package. A Groovy or JavaScript step uses one with `iflow_edit` `insert_step`
|
|
100
|
+
`scriptCollection` (the collection's Id, `settings.script` the file name); the iFlow's manifest requirement is written
|
|
101
|
+
as the designer does. `iflow_validate` checks the script against a collection pulled into the same package folder, and
|
|
102
|
+
`cpi_deploy` refuses while a collection the iFlow uses is missing, in another package or not deployed in its latest version.
|
|
103
|
+
|
|
104
|
+
| Tool | What it does | Status |
|
|
105
|
+
|---|---|---|
|
|
106
|
+
| `script_collection_create` | Create an empty collection in an allowed package and pull it (`<workspace>/<package>/<id>/`, scripts in `src/main/resources/script/`) | **Available** |
|
|
107
|
+
| `script_collection_pull` | Download a collection; never overwrites local changes unless asked | **Available** |
|
|
108
|
+
| `script_collection_push` | Upload it as a new version: version and comment confirmed by you (hint: a removed script is major, a new one minor); the comment goes to the changelog, since the tenant keeps none for collections | **Available** |
|
|
109
|
+
| `script_collection_deploy` | Deploy it (before the iFlows that use it); with `deploy: manual` you deploy it in the designer | **Available** |
|
|
110
|
+
| `script_collection_delete` | Delete it with its version history; refuses a deployed collection; always asks by default | **Available** |
|
|
111
|
+
|
|
112
|
+
### Runtime data
|
|
113
|
+
|
|
114
|
+
What iFlows keep on the tenant between messages. Reading works on every configured tenant; changing only on
|
|
115
|
+
development tenants, for data of iFlows in allowed packages (global data: any development tenant; a JMS queue: every
|
|
116
|
+
iFlow using it must be in an allowed package), with your confirmation (`runtime_data`).
|
|
117
|
+
|
|
118
|
+
| Tool | What it does | Status |
|
|
119
|
+
|---|---|---|
|
|
120
|
+
| `cpi_datastores` | Data stores (Write steps): all stores with their iFlow or global, entries and overdue entries; with a store, its entries | **Available** |
|
|
121
|
+
| `cpi_datastore_entry` | One entry's stored message: body and headers (credential-like values hidden) | **Available** |
|
|
122
|
+
| `cpi_datastore_delete` | Delete entries or a whole store, for example to reset test data | **Available** |
|
|
123
|
+
| `cpi_variables` | Variables (Write Variables): all with their iFlow or global; with a name, its value | **Available** |
|
|
124
|
+
| `cpi_variable_delete` | Delete a variable, for example to restart a delta load | **Available** |
|
|
125
|
+
| `cpi_queues` | JMS broker (capacity, queues used of the maximum, warnings) and queues with messages, size, state and the iFlows that read or write them; with a queue, its messages (failed, retries, next retry, message log) | **Available** |
|
|
126
|
+
| `cpi_queue_action` | Retry failed messages now, move messages to another queue, delete messages, activate or deactivate a queue | **Available** |
|
|
127
|
+
| `cpi_number_ranges` | Number ranges (used by number range steps): min, max, current value, field length, rotate | **Available** |
|
|
128
|
+
| `cpi_number_range_set` | Create, change (for example reset the current value) or delete a number range; values checked before you are asked | **Available** |
|
|
129
|
+
| `cpi_duplicate_checks` | What was already processed and is skipped when it comes again (idempotent repository: file names of SFTP senders, ids of Idempotent Process Call steps), with expiry | **Available** |
|
|
130
|
+
| `cpi_duplicate_check_delete` | Remove such entries so the same file or id is processed again in the next test | **Available** |
|
|
131
|
+
| `cpi_message_store` | What the Persist steps of one message stored: entries, and an entry's body and headers | **Available** |
|
|
132
|
+
|
|
133
|
+
### Test
|
|
134
|
+
|
|
135
|
+
| Tool | What it does | Status |
|
|
136
|
+
|---|---|---|
|
|
137
|
+
| `cpi_send_message` | Call a deployed iFlow's HTTP endpoint; fetches a CSRF token when the sender adapter requires one (the HTTPS sender default); returns status, response and the message log ID (also for failed calls) | **Available** |
|
|
138
|
+
| `cpi_messages` | Search message processing logs | **Available** |
|
|
139
|
+
| `cpi_message` | One message log: status, error, and the processing steps by name (at log level INFO, SAP keeps steps for failed messages only) | **Available** |
|
|
140
|
+
| `cpi_trace` | Body, headers and properties as they entered each step of one message. Uses an undocumented SAP endpoint to switch on tracing, so it sits behind an "experimental" setting | **Available** |
|
|
141
|
+
|
|
142
|
+
### Not offered, by design
|
|
143
|
+
|
|
144
|
+
- **Creating or deleting packages.** Packages are set up by people (with their names, vendors and access); the agent
|
|
145
|
+
works inside existing packages that the configuration allows.
|
|
146
|
+
- **Managing locks.** Message and design-time locks are held by the runtime and the designer for running work; the
|
|
147
|
+
agent does not release them. Tools only report a lock where it blocks something (for example a push to an iFlow
|
|
148
|
+
open in the designer).
|
|
149
|
+
- **Editing message mappings.** Message mappings can be read (`mapping_describe`) but not changed: edit them in the
|
|
150
|
+
designer's mapping editor.
|
|
151
|
+
|
|
152
|
+
**Safety:** changes are only allowed on tenants configured as development tenants, in allowed packages that are not
|
|
153
|
+
read-only content. A push stops when the iFlow is open in the designer or changed on the tenant since the pull. Create,
|
|
154
|
+
delete, push, deploy and undeploy ask **you** for confirmation through the MCP client (MCP *elicitation*, showing the actual
|
|
155
|
+
changes); clients that cannot ask are refused rather than skipping the question. Every change is written to an audit
|
|
156
|
+
log, and credential values are never shown to the agent. With `"login": "user"`, the tenant records your own user
|
|
157
|
+
for every change instead of the service key's technical client.
|
|
158
|
+
|
|
159
|
+
## Install
|
|
160
|
+
|
|
161
|
+
Requires Node.js 22 or later. The server is published on npm as
|
|
162
|
+
[`cpi-saper-dev-mcp`](https://www.npmjs.com/package/cpi-saper-dev-mcp): your AI client starts it with `npx`, which
|
|
163
|
+
downloads it on first use. During the beta the examples use `cpi-saper-dev-mcp@beta` (the newest beta); to pin one
|
|
164
|
+
version, write for example `cpi-saper-dev-mcp@0.9.0-beta.0`.
|
|
165
|
+
|
|
166
|
+
Create `.cpi/config.json` in your project folder ([docs/CONFIGURATION.md](docs/CONFIGURATION.md)), then connect the
|
|
167
|
+
server to your AI client as shown below.
|
|
168
|
+
|
|
169
|
+
**How the server finds your configuration:** it asks the client which project folders are open (MCP *roots*) and
|
|
170
|
+
uses the first one that contains `.cpi/config.json`. Clients that do not report roots get the server's working
|
|
171
|
+
folder instead. Without a project, it falls back to `~/.config/cpi-saper-dev-mcp/config.json`, or to the file named
|
|
172
|
+
in the environment variable `CPI_MCP_CONFIG`.
|
|
173
|
+
|
|
174
|
+
### Claude Code
|
|
175
|
+
|
|
176
|
+
From your project folder:
|
|
177
|
+
|
|
178
|
+
```sh
|
|
179
|
+
claude mcp add cpi-saper-dev-mcp -- npx -y cpi-saper-dev-mcp@beta
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### GitHub Copilot in VS Code
|
|
183
|
+
|
|
184
|
+
Add the server to your project in `.vscode/mcp.json` (create the file if it does not exist):
|
|
185
|
+
|
|
186
|
+
```json
|
|
187
|
+
{
|
|
188
|
+
"servers": {
|
|
189
|
+
"cpi-saper-dev-mcp": {
|
|
190
|
+
"type": "stdio",
|
|
191
|
+
"command": "npx",
|
|
192
|
+
"args": ["-y", "cpi-saper-dev-mcp@beta"],
|
|
193
|
+
"cwd": "${workspaceFolder}"
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
VS Code asks you to trust the server the first time it starts it. The tools are then available to Copilot's agent in
|
|
200
|
+
Copilot Chat. `cwd` makes the project folder the server's working folder, so it finds `.cpi/config.json` even if
|
|
201
|
+
roots are not reported.
|
|
202
|
+
|
|
203
|
+
VS Code also reads a workspace-root `.mcp.json` in the shared format (the same file Claude Code uses), when the
|
|
204
|
+
setting `chat.mcp.workspaceRootConfig.enabled` is on:
|
|
205
|
+
|
|
206
|
+
```json
|
|
207
|
+
{
|
|
208
|
+
"mcpServers": {
|
|
209
|
+
"cpi-saper-dev-mcp": {
|
|
210
|
+
"command": "npx",
|
|
211
|
+
"args": ["-y", "cpi-saper-dev-mcp@beta"]
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
This format has no working-folder setting; the server then relies on the roots VS Code reports.
|
|
218
|
+
|
|
219
|
+
### GitHub Copilot CLI and other projects
|
|
220
|
+
|
|
221
|
+
For all projects at once, add the server to Copilot's user configuration `~/.copilot/mcp-config.json` (or
|
|
222
|
+
`$COPILOT_HOME/mcp-config.json`), with the same `mcpServers` entry as above. Keep a shared configuration in
|
|
223
|
+
`~/.config/cpi-saper-dev-mcp/config.json` (with absolute paths to your service keys); a project's own
|
|
224
|
+
`.cpi/config.json` still takes precedence when the client reports that project as a root.
|
|
225
|
+
|
|
226
|
+
### From source
|
|
227
|
+
|
|
228
|
+
To run the latest code from this repository instead:
|
|
229
|
+
|
|
230
|
+
```sh
|
|
231
|
+
git clone https://github.com/devstylator/cpi-saper-dev-mcp.git
|
|
232
|
+
cd cpi-saper-dev-mcp
|
|
233
|
+
npm install
|
|
234
|
+
npm test # builds and runs the tests
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
and use `node /path/to/cpi-saper-dev-mcp/packages/mcp-server/dist/index.js` as the command (in place of
|
|
238
|
+
`npx -y cpi-saper-dev-mcp@beta`). `npm run pack:check` builds the npm package and tries it the way users install it.
|
|
239
|
+
|
|
240
|
+
### Readable git diff
|
|
241
|
+
|
|
242
|
+
`git diff` of an `.iflw` file shows BPMN XML and diagram coordinates. With the server as git's diff driver, it shows
|
|
243
|
+
the model instead, one fact per line (steps with their settings, adapters, flows; message mappings as
|
|
244
|
+
`target <- expression`), so a change reads as "+ step … / - flow …". In your repository:
|
|
245
|
+
|
|
246
|
+
```sh
|
|
247
|
+
printf '*.iflw diff=cpi\n*.mmap diff=cpi\n' >> .gitattributes
|
|
248
|
+
git config diff.cpi.textconv "npx -y cpi-saper-dev-mcp@beta textconv"
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
`npx` looks the package up on every start, which makes diffs of many files slow: for regular use install it once
|
|
252
|
+
(`npm install -g cpi-saper-dev-mcp@beta`) and use `cpi-saper-dev-mcp textconv` as the textconv command.
|
|
253
|
+
|
|
254
|
+
`git diff --no-textconv` still shows the XML. It applies wherever git shows diffs (`git diff`, `git log -p`, `git show`); merges are unchanged.
|
|
255
|
+
|
|
256
|
+
## Requirements
|
|
257
|
+
|
|
258
|
+
- Node.js 22 or later.
|
|
259
|
+
- A Cloud Integration tenant (a BTP trial works) and two service keys of the *Process Integration Runtime*
|
|
260
|
+
service: plan `api` (OData API) and plan `integration-flow` (calling deployed iFlows).
|
|
261
|
+
- **Optional, for running Groovy scripts on the tenant:** the script runner iFlow from
|
|
262
|
+
[devstylator/CPI_Iflow_GroovyScriptExe](https://github.com/devstylator/CPI_Iflow_GroovyScriptExe) deployed on a development tenant.
|
|
263
|
+
Its API is described in [docs/script-runner.openapi.yaml](docs/script-runner.openapi.yaml). The runner executes
|
|
264
|
+
any code it receives, so never deploy it on test or production tenants.
|
|
265
|
+
|
|
266
|
+
## Documentation
|
|
267
|
+
|
|
268
|
+
- [docs/CONFIGURATION.md](docs/CONFIGURATION.md): tenants, roles, service keys and safety settings (planned).
|
|
269
|
+
- [docs/KNOWN_LIMITATIONS.md](docs/KNOWN_LIMITATIONS.md): where local checks differ from Cloud Integration.
|
|
270
|
+
- [docs/script-runner.openapi.yaml](docs/script-runner.openapi.yaml): API of the script runner iFlow.
|
|
271
|
+
|
|
272
|
+
## License
|
|
273
|
+
|
|
274
|
+
[Apache License 2.0](LICENSE). Created by Damian Kolasa ([devstylator](https://github.com/devstylator)).
|
|
275
|
+
Free to use, change and share, also commercially; copies and modified versions must keep the [NOTICE](NOTICE)
|
|
276
|
+
file, which credits the original creator, and mark the files they changed.
|