isc-transforms-mcp 1.0.4 → 1.0.6

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.
@@ -27,29 +27,11 @@
27
27
  "type": "object",
28
28
  "description": "Conditional logic configuration, plus optional dynamic variables (per docs).",
29
29
  "additionalProperties": {
30
- "description": "Dynamic variables referenced via $variableName. Can be literals or nested transforms.",
31
- "oneOf": [
30
+ "description": "Dynamic variables referenced via $variableName. Can be string literals or nested transforms.",
31
+ "anyOf": [
32
32
  {
33
33
  "type": "string"
34
34
  },
35
- {
36
- "type": "number"
37
- },
38
- {
39
- "type": "integer"
40
- },
41
- {
42
- "type": "boolean"
43
- },
44
- {
45
- "type": "array"
46
- },
47
- {
48
- "type": "object"
49
- },
50
- {
51
- "type": "null"
52
- },
53
35
  {
54
36
  "$ref": "#/$defs/NestedTransform"
55
37
  }
@@ -36,29 +36,11 @@
36
36
  }
37
37
  },
38
38
  "additionalProperties": {
39
- "description": "Dynamic variables referenced in Velocity template. Can be literals or nested transforms.",
40
- "oneOf": [
39
+ "description": "Dynamic variables referenced in Velocity template. Can be string literals or nested transforms.",
40
+ "anyOf": [
41
41
  {
42
42
  "type": "string"
43
43
  },
44
- {
45
- "type": "number"
46
- },
47
- {
48
- "type": "integer"
49
- },
50
- {
51
- "type": "boolean"
52
- },
53
- {
54
- "type": "array"
55
- },
56
- {
57
- "type": "object"
58
- },
59
- {
60
- "type": "null"
61
- },
62
44
  {
63
45
  "$ref": "#/$defs/NestedTransform"
64
46
  }
package/README.md CHANGED
@@ -1,38 +1,191 @@
1
1
  # isc-transforms-mcp
2
2
 
3
3
  > **SailPoint ISC transform authoring, right inside Claude.**
4
- > Generate · Validate · Lint · Explain · Push to tenant — without leaving your AI assistant.
4
+ > Catalog · Build · Lint · Validate · Explain — without leaving your AI assistant.
5
5
 
6
6
  [![npm version](https://img.shields.io/npm/v/isc-transforms-mcp)](https://www.npmjs.com/package/isc-transforms-mcp)
7
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
8
8
  [![MCP compatible](https://img.shields.io/badge/MCP-compatible-blue)](https://modelcontextprotocol.io)
9
9
 
10
+ > **Community Project** — This is an independent, community-built tool. It is not affiliated with, endorsed by, or supported by SailPoint Technologies.
11
+
10
12
  ---
11
13
 
12
14
  ## What is this?
13
15
 
14
16
  `isc-transforms-mcp` is a [Model Context Protocol](https://modelcontextprotocol.io) server that gives Claude a complete SailPoint ISC transform authoring toolkit. Instead of handwriting transform JSON, debugging schema errors in the UI, and cross-referencing the docs manually — you describe what you need in plain English and Claude does the rest.
15
17
 
16
- **Free (Personal)** — 10 offline tools. No ISC tenant needed. Works entirely on your laptop.
17
- **Enterprise (coming soon)** — All 14 tools, including live tenant operations (list, get, push, find references). See [Enterprise Plan](#-enterprise-plan).
18
+ **Free (Personal)** — 11 tools. No ISC tenant needed. Works entirely on your laptop.
19
+ **Enterprise (coming soon)** — All 15 tools, including live tenant operations (list, get, find references). See [Enterprise Plan](#-enterprise-plan).
20
+
21
+ > **Note on "no tenant needed":** The MCP server itself runs as a local Node.js process on your machine — it makes no calls to any ISC tenant for the free tools. Your transform JSON is validated and linted entirely locally. Claude (the AI) is a cloud service provided by Anthropic, so your conversation — including any transform JSON you share — passes through Anthropic's infrastructure as part of normal Claude usage, the same as any other Claude session.
18
22
 
19
23
  ---
20
24
 
21
- ## Demo
25
+ ## How to Use — Strict Prompt Pattern
26
+
27
+ Copy and adapt this exact structure. The explicit step numbering and the **DO NOT** rules are what keep Claude on track.
22
28
 
23
29
  ```
24
- You: Generate a SailPoint transform that concatenates first name, a dot, and last name
25
- to produce an email prefix. Then validate and lint it.
30
+ Use MCP tools only. Follow these steps exactly and do not skip any:
31
+
32
+ Step 1 — Call isc_transforms_operationCatalog to retrieve the full spec for every
33
+ operation type you plan to use. Do not build anything yet.
34
+
35
+ Step 2 — Build the complete transform JSON using only the attribute names, types,
36
+ and structure from the catalog response in Step 1.
26
37
 
27
- Claude: [calls isc_transforms_generate]
28
- { "type": "concat", "name": "email-prefix", "attributes": { "values": [ ... ] } }
29
- Confidence: high | Doc: https://developer.sailpoint.com/...
38
+ Step 3 — Call isc_transforms_lint on the JSON you built.
39
+ - If lint returns errors or warnings, fix every one of them and call
40
+ isc_transforms_lint again.
41
+ - Repeat until isc_transforms_lint returns ok: true with 0 errors and 0 warnings.
42
+ - DO NOT output the final JSON until lint passes completely.
30
43
 
31
- [calls isc_transforms_validate]
32
- → valid: true
44
+ Step 4 — Output the final lint-clean JSON and nothing else.
33
45
 
34
- [calls isc_transforms_lint]
35
- → ok: true | 0 errors | 0 warnings
46
+ [describe your transform requirement here]
47
+ ```
48
+
49
+ ---
50
+
51
+ ## Real-World Prompt Examples
52
+
53
+ ### Lifecycle State from Start/End Dates
54
+
55
+ ```
56
+ Use MCP tools only. Follow these steps exactly and do not skip any:
57
+
58
+ Step 1 — Call isc_transforms_operationCatalog to retrieve the full spec for every
59
+ operation type you plan to use. Do not build anything yet.
60
+
61
+ Step 2 — Build the complete transform JSON using only the attribute names, types,
62
+ and structure from the catalog response in Step 1.
63
+
64
+ Step 3 — Call isc_transforms_lint on the JSON you built.
65
+ - If lint returns errors or warnings, fix every one of them and call
66
+ isc_transforms_lint again.
67
+ - Repeat until isc_transforms_lint returns ok: true with 0 errors and 0 warnings.
68
+ - DO NOT output the final JSON until lint passes completely.
69
+
70
+ Step 4 — Output the final lint-clean JSON and nothing else.
71
+
72
+ Transform requirement:
73
+ Create a transform named cloudLifecycleState with requiresPeriodicRefresh: true.
74
+ Logic:
75
+ - startDate > today → prehire
76
+ - startDate ≤ today AND endDate ≥ today AND employeeStatus = LEAVE → leave
77
+ - startDate ≤ today AND endDate ≥ today AND employeeStatus = ACTIVE → active
78
+ - endDate < today AND endDate ≥ today-30 → inactive
79
+ - endDate < today-30 → archived
80
+ Inputs (source: SimplifyAuth-HRMS):
81
+ - startDate attribute: startDate, format: dd-MM-yyyy
82
+ - endDate attribute: endDate, format: dd-MM-yyyy
83
+ - leaveStatus attribute: employeeStatus
84
+ ```
85
+
86
+ ### Temporary Password from Account Attributes
87
+
88
+ ```
89
+ Use MCP tools only. Follow these steps exactly and do not skip any:
90
+
91
+ Step 1 — Call isc_transforms_operationCatalog to retrieve the full spec for every
92
+ operation type you plan to use. Do not build anything yet.
93
+
94
+ Step 2 — Build the complete transform JSON using only the attribute names, types,
95
+ and structure from the catalog response in Step 1.
96
+
97
+ Step 3 — Call isc_transforms_lint on the JSON you built.
98
+ - If lint returns errors or warnings, fix every one of them and call
99
+ isc_transforms_lint again.
100
+ - Repeat until isc_transforms_lint returns ok: true with 0 errors and 0 warnings.
101
+ - DO NOT output the final JSON until lint passes completely.
102
+
103
+ Step 4 — Output the final lint-clean JSON and nothing else.
104
+
105
+ Transform requirement:
106
+ Build a static transform named Temporary-Password that produces:
107
+ ${firstInitialLower}${lastNameProper}${hireMonth}RstP*!7
108
+ Variables (source: HRMS):
109
+ - firstInitialLower = lowercase first character of first_name
110
+ - lastNameProper = uppercase first char of last_name + remaining chars of last_name
111
+ - hireMonth = 2-digit month extracted from hire_date (input format: yyyy-MM-dd)
112
+ ```
113
+
114
+ ### Username with Uniqueness Counter
115
+
116
+ ```
117
+ Use MCP tools only. Follow these steps exactly and do not skip any:
118
+
119
+ Step 1 — Call isc_transforms_operationCatalog to retrieve the full spec for every
120
+ operation type you plan to use. Do not build anything yet.
121
+
122
+ Step 2 — Build the complete transform JSON using only the attribute names, types,
123
+ and structure from the catalog response in Step 1.
124
+
125
+ Step 3 — Call isc_transforms_lint on the JSON you built.
126
+ - If lint returns errors or warnings, fix every one of them and call
127
+ isc_transforms_lint again.
128
+ - Repeat until isc_transforms_lint returns ok: true with 0 errors and 0 warnings.
129
+ - DO NOT output the final JSON until lint passes completely.
130
+
131
+ Step 4 — Output the final lint-clean JSON and nothing else.
132
+
133
+ Transform requirement:
134
+ Create a username transform named username-generator.
135
+ - Pattern: first initial + last name, all lowercase, max 20 chars
136
+ - If the username is already taken, append a uniqueCounter
137
+ - Source: Workday HR, attributes: firstName and lastName
138
+ ```
139
+
140
+ ### Email from Name Attributes
141
+
142
+ ```
143
+ Use MCP tools only. Follow these steps exactly and do not skip any:
144
+
145
+ Step 1 — Call isc_transforms_operationCatalog to retrieve the full spec for every
146
+ operation type you plan to use. Do not build anything yet.
147
+
148
+ Step 2 — Build the complete transform JSON using only the attribute names, types,
149
+ and structure from the catalog response in Step 1.
150
+
151
+ Step 3 — Call isc_transforms_lint on the JSON you built.
152
+ - If lint returns errors or warnings, fix every one of them and call
153
+ isc_transforms_lint again.
154
+ - Repeat until isc_transforms_lint returns ok: true with 0 errors and 0 warnings.
155
+ - DO NOT output the final JSON until lint passes completely.
156
+
157
+ Step 4 — Output the final lint-clean JSON and nothing else.
158
+
159
+ Transform requirement:
160
+ Build a transform named email-generator that produces: firstname.lastname@acme.com
161
+ - Normalize both names (remove diacritics, lowercase) before concatenating
162
+ - Source: Active Directory, attributes: givenName and sn
163
+ ```
164
+
165
+ ### Fallback Chain
166
+
167
+ ```
168
+ Use MCP tools only. Follow these steps exactly and do not skip any:
169
+
170
+ Step 1 — Call isc_transforms_operationCatalog to retrieve the full spec for every
171
+ operation type you plan to use. Do not build anything yet.
172
+
173
+ Step 2 — Build the complete transform JSON using only the attribute names, types,
174
+ and structure from the catalog response in Step 1.
175
+
176
+ Step 3 — Call isc_transforms_lint on the JSON you built.
177
+ - If lint returns errors or warnings, fix every one of them and call
178
+ isc_transforms_lint again.
179
+ - Repeat until isc_transforms_lint returns ok: true with 0 errors and 0 warnings.
180
+ - DO NOT output the final JSON until lint passes completely.
181
+
182
+ Step 4 — Output the final lint-clean JSON and nothing else.
183
+
184
+ Transform requirement:
185
+ Build a transform named email-fallback that returns the first non-empty value from:
186
+ 1. workEmail (source: HR System)
187
+ 2. personalEmail (source: HR System)
188
+ 3. Static fallback: noemail@acme.com
36
189
  ```
37
190
 
38
191
  ---
@@ -74,35 +227,52 @@ Look for the 🔨 hammer icon at the bottom of the chat input — that confirms
74
227
 
75
228
  ```
76
229
  "Use isc_ping to check the server"
77
- "Generate a SailPoint transform that falls back from work email to personal email"
78
- "Validate this transform JSON: { ... }"
79
- "What SailPoint transform pattern should I use for username generation?"
230
+ ```
231
+
232
+ ```
233
+ Use MCP tools only. Follow these steps exactly and do not skip any:
234
+ Step 1 — Call isc_transforms_operationCatalog for the operations you need. Do not build yet.
235
+ Step 2 — Build the transform JSON using only specs from Step 1.
236
+ Step 3 — Call isc_transforms_lint. Fix all errors and repeat until ok: true, 0 errors, 0 warnings.
237
+ DO NOT output JSON until lint passes completely.
238
+ Step 4 — Output the final lint-clean JSON and nothing else.
239
+
240
+ Transform requirement: Build a transform that lowercases the first name from Workday HR
241
+ (source: Workday, attribute: firstName). Name it lowercase-firstname.
80
242
  ```
81
243
 
82
244
  ---
83
245
 
84
246
  ## Free Tools (Phase 1 — No ISC Tenant Required)
85
247
 
86
- All 10 tools below work completely offline. No credentials, no tenant, no internet connection needed.
248
+ All 11 tools below run locally on your machine with no ISC tenant connection required. No ISC credentials needed.
87
249
 
88
- ### `isc_transforms_generate`
89
- Converts a plain-English requirement into a SailPoint ISC transform JSON payload. Parses your description for operation keywords, attribute names, date formats, and fallback hints. Returns the transform JSON, confidence level, alternative operations, and a link to the official SailPoint docs for that operation type.
250
+ ### `isc_transforms_operationCatalog`
251
+ **Start here when building any transform.** Returns everything needed in a single call all 39 operation types with type key, title, doc URL, required attributes, scaffold JSON, and full JSON Schema. Optionally filter to specific operation types to keep the response focused.
90
252
 
91
253
  ```
92
- "Generate a transform that converts an EPOCH timestamp to ISO8601 date format"
93
- "Create a username transform using first initial plus last name with a uniqueness counter"
94
- "Fall back from department to costCenter if department is empty"
254
+ "Show me the full spec for dateCompare and dateMath"
255
+ "What attributes does accountAttribute require?"
256
+ "Give me the scaffold for a conditional transform"
95
257
  ```
96
258
 
97
- ### `isc_transforms_validate`
98
- Two-stage JSON Schema validation powered by AJV and the official SailPoint JSON Schema pack. Stage 1 validates the root shape (name, type, attributes). Stage 2 validates against the operation-specific schema for all 44 operation types, including attribute requirements, allowed values, and nested transform shapes.
99
-
100
259
  ### `isc_transforms_lint`
101
- 27 semantic lint rules that go beyond what JSON Schema can check. Catches issues like multiple source references on `accountAttribute`, using `delimiter` instead of `separator` on `join`, invalid regex patterns, `requiresPeriodicRefresh` set as a string instead of boolean, missing `default` keys on `lookup` transforms, and 22 more. Errors include the doc URL for the affected operation so you know exactly what to fix.
260
+ 27 semantic lint rules that go beyond what JSON Schema can check. Catches issues like wrong case on nested transform types (`datemath` vs `dateMath`), multiple source references on `accountAttribute`, using `delimiter` instead of `separator` on `join`, invalid regex patterns, `requiresPeriodicRefresh` as a string instead of boolean, missing `default` key on `lookup`, and more. Always run this after building fix all errors before treating the JSON as final.
261
+
262
+ ### `isc_transforms_validate`
263
+ Two-stage JSON Schema validation powered by AJV and the official SailPoint JSON Schema pack. Stage 1 validates the root shape (name, type, attributes). Stage 2 validates against the operation-specific schema for all 39 operation types, including attribute requirements, allowed values, and nested transform shapes.
102
264
 
103
265
  ### `isc_transforms_explain`
104
266
  Takes a broken transform (or an ISC error message) and returns plain-English guidance plus an auto-corrected JSON where the fix is automatable. Handles 13 known error patterns including boolean coercion, deprecated attribute names, conditional operator restrictions, and missing required fields.
105
267
 
268
+ ### `isc_transforms_generate`
269
+ Converts a plain-English requirement into a SailPoint ISC transform JSON payload. Returns the transform JSON, confidence level, alternative operations, and a link to the official SailPoint docs. Best used as a quick starting point — always follow up with `isc_transforms_operationCatalog` and `isc_transforms_lint`.
270
+
271
+ ```
272
+ "Generate a transform that converts an EPOCH timestamp to ISO8601 date format"
273
+ "Create a username transform using first initial plus last name with a uniqueness counter"
274
+ ```
275
+
106
276
  ### `isc_transforms_suggestPattern`
107
277
  Matches your description against 10 named nested-transform patterns and returns a complete working example. Patterns include: fallback email chain, conditional department → building code, username first-initial + last-name + uniqueCounter, EPOCH → ISO8601, normalize + lowercase name, country code → region lookup, email from first.last@domain, date compare for lifecycle state, E.164 phone normalisation, and split to extract domain from email.
108
278
 
@@ -110,13 +280,13 @@ Matches your description against 10 named nested-transform patterns and returns
110
280
  Generates 2–5 illustrative test cases for a transform: happy-path, null input, and edge cases. Each test case includes a description, sample input, expected output, and notes. Use these directly in the ISC transform tester.
111
281
 
112
282
  ### `isc_transforms_catalog`
113
- Returns all 44+ supported SailPoint ISC transform operation types with: type key, human-readable title, required attributes, doc URL, schema coverage flag, and scaffold example. Essential reference when you are not sure which operation to use.
283
+ Returns all 39 supported SailPoint ISC transform operation types with: type key, human-readable title, required attributes, doc URL, schema coverage flag, and scaffold example. Use `isc_transforms_operationCatalog` instead when you need full specs this is the lightweight index.
114
284
 
115
285
  ### `isc_transforms_getSchema`
116
- Returns the full JSON Schema (Draft 2020-12) for any operation type — the exact schema used internally for validation. Useful when you want to understand precisely which attributes are required, optional, and what their constraints are.
286
+ Returns the full JSON Schema (Draft 2020-12) for any single operation type. Useful when you want to inspect exactly which attributes are required, optional, and what their constraints are.
117
287
 
118
288
  ### `isc_transforms_scaffold`
119
- Generates a valid minimal starter JSON payload for any operation type. Good starting point before you fill in the actual values.
289
+ Generates a valid minimal starter JSON payload for any operation type. Good starting point before filling in actual values.
120
290
 
121
291
  ### `isc_ping`
122
292
  Health check. Returns the server status, active license tier, and whether Phase 2 tools are available.
@@ -130,7 +300,7 @@ The 4 tools below connect to a live ISC tenant and require an **Enterprise licen
130
300
  | Tool | What it does |
131
301
  |---|---|
132
302
  | `isc_transforms_list` | `GET /v3/transforms` — fetch all transforms from your tenant |
133
- | `isc_transforms_get` | `GET /v3/transforms/:id` — fetch a single transform |
303
+ | `isc_transforms_get` | `GET /v3/transforms/:id` — fetch a single transform by ID |
134
304
  | `isc_transforms_upsert` | Create or update with dry-run preview + JSON-Patch diff + lint before write |
135
305
  | `isc_transforms_findReferences` | Scan identity profiles for every place a transform is referenced |
136
306
 
@@ -186,7 +356,6 @@ All settings are optional for Personal use. Enterprise users need the `ISC_*` cr
186
356
  | `ISC_PAT_CLIENT_ID` | — | PAT client ID for authentication |
187
357
  | `ISC_PAT_CLIENT_SECRET` | — | PAT client secret for authentication |
188
358
  | `ISC_ACCESS_TOKEN` | — | Pre-minted bearer token (alternative to PAT) |
189
- | `ISC_MCP_MODE` | `readonly` | Set to `write` to allow `isc_transforms_upsert` to apply changes |
190
359
  | `ISC_MCP_DEBUG` | `false` | Enable verbose debug logging to stderr |
191
360
  | `ISC_TIMEOUT_MS` | `30000` | HTTP request timeout in milliseconds |
192
361
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "isc-transforms-mcp",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "type": "module",
5
5
  "description": "MCP server for SailPoint Identity Security Cloud (ISC) Transform authoring — scaffold, strict lint, catalog, and safe upsert to live tenants.",
6
6
  "author": {