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 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
- # Temporary Holding Version
1
+ # cpi-saper-dev-mcp
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ [![CI](https://github.com/devstylator/cpi-saper-dev-mcp/actions/workflows/ci.yml/badge.svg)](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.