@mcp-consultant-tools/powerplatform-core 26.0.0 → 27.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,286 @@
1
+ /**
2
+ * Flow URL Extractor & Secret Detector
3
+ *
4
+ * Extracts URL references from Power Automate flow definitions and
5
+ * detects hardcoded secrets that should use environment variables
6
+ * or secure inputs instead.
7
+ */
8
+ // ---------------------------------------------------------------------------
9
+ // Regex for secret-like input keys
10
+ // ---------------------------------------------------------------------------
11
+ const SECRET_KEY_PATTERN = /client_secret|clientSecret|password|api_key|apiKey|secret|authorization/i;
12
+ // ---------------------------------------------------------------------------
13
+ // Internal helpers
14
+ // ---------------------------------------------------------------------------
15
+ /**
16
+ * Attempt to extract an environment variable name from a Power Automate
17
+ * parameter expression such as:
18
+ * @parameters('new_MyEnvVar')
19
+ * @{parameters('new_MyEnvVar')}
20
+ */
21
+ function extractEnvVarName(expression) {
22
+ const match = expression.match(/@\{?parameters\(\s*'([^']+)'\s*\)\}?/);
23
+ return match ? match[1] : undefined;
24
+ }
25
+ /**
26
+ * Resolve a URL that may be a parameter expression.
27
+ * Returns the original URL plus optional environment variable metadata.
28
+ */
29
+ function resolveUrl(url, envVarMap) {
30
+ if (!url.startsWith('@parameters(') && !url.startsWith('@{parameters(')) {
31
+ return { url };
32
+ }
33
+ const envVarName = extractEnvVarName(url);
34
+ if (!envVarName) {
35
+ return { url };
36
+ }
37
+ const resolved = envVarMap?.get(envVarName);
38
+ return {
39
+ url: resolved ?? url,
40
+ environmentVariable: envVarName,
41
+ environmentVariableValue: resolved,
42
+ };
43
+ }
44
+ /**
45
+ * Safely read a nested property from an unknown record.
46
+ */
47
+ function asRecord(value) {
48
+ if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
49
+ return value;
50
+ }
51
+ return undefined;
52
+ }
53
+ // ---------------------------------------------------------------------------
54
+ // URL extraction
55
+ // ---------------------------------------------------------------------------
56
+ /**
57
+ * Extract all URL references from a Power Automate flow definition.
58
+ *
59
+ * Traverses the definition recursively, following the same nesting pattern
60
+ * as `complexity-calculator.ts` (scope, foreach, if/else, switch/default).
61
+ */
62
+ export function extractUrlsFromFlowDefinition(flowDefinition, envVarMap) {
63
+ const urls = [];
64
+ try {
65
+ const properties = asRecord(flowDefinition.properties);
66
+ const definition = asRecord(properties?.definition);
67
+ if (!definition)
68
+ return urls;
69
+ // --- Triggers -----------------------------------------------------------
70
+ const triggers = asRecord(definition.triggers);
71
+ if (triggers) {
72
+ for (const triggerName of Object.keys(triggers)) {
73
+ const trigger = asRecord(triggers[triggerName]);
74
+ if (!trigger)
75
+ continue;
76
+ const inputs = asRecord(trigger.inputs);
77
+ if (inputs && typeof inputs.uri === 'string') {
78
+ const resolved = resolveUrl(inputs.uri, envVarMap);
79
+ urls.push({
80
+ actionName: triggerName,
81
+ source: 'trigger',
82
+ ...resolved,
83
+ });
84
+ }
85
+ }
86
+ }
87
+ // --- Parameters (environment variables) ---------------------------------
88
+ const parameters = asRecord(definition.parameters);
89
+ if (parameters) {
90
+ for (const paramName of Object.keys(parameters)) {
91
+ const param = asRecord(parameters[paramName]);
92
+ if (!param)
93
+ continue;
94
+ const metadata = asRecord(param.metadata);
95
+ const schemaId = metadata?.schemaId;
96
+ if (typeof schemaId === 'string' &&
97
+ schemaId.toLowerCase().includes('environmentvariable')) {
98
+ const defaultValue = typeof param.defaultValue === 'string'
99
+ ? param.defaultValue
100
+ : undefined;
101
+ const resolvedValue = envVarMap?.get(paramName);
102
+ const url = resolvedValue ?? defaultValue;
103
+ if (url) {
104
+ urls.push({
105
+ actionName: paramName,
106
+ url,
107
+ environmentVariable: paramName,
108
+ environmentVariableValue: resolvedValue,
109
+ source: 'parameter',
110
+ });
111
+ }
112
+ }
113
+ }
114
+ }
115
+ // --- Actions (recursive) ------------------------------------------------
116
+ const actions = asRecord(definition.actions);
117
+ if (actions) {
118
+ processActions(actions, urls, envVarMap);
119
+ }
120
+ }
121
+ catch {
122
+ // Return partial results on parse errors
123
+ }
124
+ return urls;
125
+ }
126
+ /**
127
+ * Recursively traverse actions, extracting URL references.
128
+ */
129
+ function processActions(actions, urls, envVarMap) {
130
+ for (const actionName of Object.keys(actions)) {
131
+ const action = asRecord(actions[actionName]);
132
+ if (!action)
133
+ continue;
134
+ const actionType = action.type || '';
135
+ // HTTP actions: inputs.uri
136
+ if (actionType === 'Http') {
137
+ const inputs = asRecord(action.inputs);
138
+ if (inputs && typeof inputs.uri === 'string') {
139
+ const resolved = resolveUrl(inputs.uri, envVarMap);
140
+ urls.push({
141
+ actionName,
142
+ source: 'http-action',
143
+ ...resolved,
144
+ });
145
+ }
146
+ }
147
+ // OpenApiConnection actions: inputs.parameters.uri or .url
148
+ if (actionType === 'OpenApiConnection' ||
149
+ actionType === 'ApiConnection') {
150
+ const inputs = asRecord(action.inputs);
151
+ const params = asRecord(inputs?.parameters);
152
+ const rawUrl = typeof params?.uri === 'string'
153
+ ? params.uri
154
+ : typeof params?.url === 'string'
155
+ ? params.url
156
+ : undefined;
157
+ if (rawUrl) {
158
+ const resolved = resolveUrl(rawUrl, envVarMap);
159
+ urls.push({
160
+ actionName,
161
+ source: 'openapi-connection',
162
+ ...resolved,
163
+ });
164
+ }
165
+ }
166
+ // --- Recurse into nested structures ------------------------------------
167
+ const nested = asRecord(action.actions);
168
+ if (nested) {
169
+ processActions(nested, urls, envVarMap);
170
+ }
171
+ const thenBranch = asRecord(action.then);
172
+ if (thenBranch) {
173
+ processActions(thenBranch, urls, envVarMap);
174
+ }
175
+ const elseBranch = asRecord(action.else);
176
+ if (elseBranch) {
177
+ processActions(elseBranch, urls, envVarMap);
178
+ }
179
+ const cases = asRecord(action.cases);
180
+ if (cases) {
181
+ for (const caseName of Object.keys(cases)) {
182
+ const caseData = asRecord(cases[caseName]);
183
+ const caseActions = asRecord(caseData?.actions);
184
+ if (caseActions) {
185
+ processActions(caseActions, urls, envVarMap);
186
+ }
187
+ }
188
+ }
189
+ const defaultBranch = asRecord(action.default);
190
+ if (defaultBranch) {
191
+ const defaultActions = asRecord(defaultBranch.actions);
192
+ if (defaultActions) {
193
+ processActions(defaultActions, urls, envVarMap);
194
+ }
195
+ }
196
+ }
197
+ }
198
+ // ---------------------------------------------------------------------------
199
+ // Hardcoded secret detection
200
+ // ---------------------------------------------------------------------------
201
+ /**
202
+ * Scan a flow definition for hardcoded secrets in action inputs.
203
+ *
204
+ * Flags literal string values (not expressions starting with `@`) whose
205
+ * key names match common secret patterns such as `client_secret`,
206
+ * `password`, `api_key`, `authorization`, etc.
207
+ */
208
+ export function detectHardcodedSecrets(flowDefinition) {
209
+ const warnings = [];
210
+ try {
211
+ const properties = asRecord(flowDefinition.properties);
212
+ const definition = asRecord(properties?.definition);
213
+ const actions = asRecord(definition?.actions);
214
+ if (actions) {
215
+ scanActionsForSecrets(actions, warnings);
216
+ }
217
+ }
218
+ catch {
219
+ // Return partial results on parse errors
220
+ }
221
+ return warnings;
222
+ }
223
+ /**
224
+ * Recursively scan actions for hardcoded secrets.
225
+ */
226
+ function scanActionsForSecrets(actions, warnings) {
227
+ for (const actionName of Object.keys(actions)) {
228
+ const action = asRecord(actions[actionName]);
229
+ if (!action)
230
+ continue;
231
+ // Scan inputs for secret-like keys with literal values
232
+ const inputs = asRecord(action.inputs);
233
+ if (inputs) {
234
+ scanObjectForSecrets(inputs, actionName, 'inputs', warnings);
235
+ }
236
+ // --- Recurse into nested structures ------------------------------------
237
+ const nested = asRecord(action.actions);
238
+ if (nested)
239
+ scanActionsForSecrets(nested, warnings);
240
+ const thenBranch = asRecord(action.then);
241
+ if (thenBranch)
242
+ scanActionsForSecrets(thenBranch, warnings);
243
+ const elseBranch = asRecord(action.else);
244
+ if (elseBranch)
245
+ scanActionsForSecrets(elseBranch, warnings);
246
+ const cases = asRecord(action.cases);
247
+ if (cases) {
248
+ for (const caseName of Object.keys(cases)) {
249
+ const caseData = asRecord(cases[caseName]);
250
+ const caseActions = asRecord(caseData?.actions);
251
+ if (caseActions)
252
+ scanActionsForSecrets(caseActions, warnings);
253
+ }
254
+ }
255
+ const defaultBranch = asRecord(action.default);
256
+ if (defaultBranch) {
257
+ const defaultActions = asRecord(defaultBranch.actions);
258
+ if (defaultActions)
259
+ scanActionsForSecrets(defaultActions, warnings);
260
+ }
261
+ }
262
+ }
263
+ /**
264
+ * Recursively scan an object's keys and values for hardcoded secrets.
265
+ */
266
+ function scanObjectForSecrets(obj, actionName, currentPath, warnings) {
267
+ for (const key of Object.keys(obj)) {
268
+ const fieldPath = `${currentPath}.${key}`;
269
+ const value = obj[key];
270
+ if (SECRET_KEY_PATTERN.test(key) && typeof value === 'string' && !value.startsWith('@')) {
271
+ warnings.push({
272
+ actionName,
273
+ fieldPath,
274
+ warningType: 'hardcoded-secret',
275
+ message: `Hardcoded value found for '${key}' in action '${actionName}'. ` +
276
+ 'Consider using a secure input parameter or environment variable instead.',
277
+ });
278
+ }
279
+ // Recurse into nested objects
280
+ const nested = asRecord(value);
281
+ if (nested) {
282
+ scanObjectForSecrets(nested, actionName, fieldPath, warnings);
283
+ }
284
+ }
285
+ }
286
+ //# sourceMappingURL=flow-url-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-url-extractor.js","sourceRoot":"","sources":["../../src/utils/flow-url-extractor.ts"],"names":[],"mappings":"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"}
@@ -9,4 +9,6 @@ export { batchExecute, RateLimiter, rateLimiter, type RateLimiterOptions, type R
9
9
  export { ATTRIBUTE_DETAILS, ENTITY_OVERVIEW, QUERY_TEMPLATE, RELATIONSHIP_MAP, } from './prompt-templates.js';
10
10
  export { getPublisherPrefix, initializePublisherPrefix, isPublisherPrefixConfigured, normalizePrefix, resetPublisherPrefix, } from './publisherConfig.js';
11
11
  export { calculateFlowComplexity, calculateComplexityScore, extractComplexityFactors, extractComplexityFlags, getRiskLevel, type FlowComplexityBreakdown, type FlowComplexityFlags, type FlowComplexityResult, type RiskLevel, } from './complexity-calculator.js';
12
+ export { extractUrlsFromFlowDefinition, detectHardcodedSecrets, type FlowUrlReference, type SecretWarning, } from './flow-url-extractor.js';
13
+ export { generateAuditMarkdownReport, type AuditReportData, } from './audit-report-formatter.js';
12
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,WAAW,EACX,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,WAAW,EACX,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,2BAA2B,EAC3B,eAAe,EACf,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EACZ,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,SAAS,GACf,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,WAAW,EACX,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,WAAW,EACX,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,2BAA2B,EAC3B,eAAe,EACf,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EACZ,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,SAAS,GACf,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,aAAa,GACnB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,2BAA2B,EAC3B,KAAK,eAAe,GACrB,MAAM,6BAA6B,CAAC"}
@@ -17,4 +17,8 @@ export { ATTRIBUTE_DETAILS, ENTITY_OVERVIEW, QUERY_TEMPLATE, RELATIONSHIP_MAP, }
17
17
  export { getPublisherPrefix, initializePublisherPrefix, isPublisherPrefixConfigured, normalizePrefix, resetPublisherPrefix, } from './publisherConfig.js';
18
18
  // Flow complexity calculator
19
19
  export { calculateFlowComplexity, calculateComplexityScore, extractComplexityFactors, extractComplexityFlags, getRiskLevel, } from './complexity-calculator.js';
20
+ // Flow URL extraction and secret detection
21
+ export { extractUrlsFromFlowDefinition, detectHardcodedSecrets, } from './flow-url-extractor.js';
22
+ // Audit report formatter
23
+ export { generateAuditMarkdownReport, } from './audit-report-formatter.js';
20
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gBAAgB;AAChB,OAAO,EACL,WAAW,EACX,WAAW,GAGZ,MAAM,kBAAkB,CAAC;AAE1B,4BAA4B;AAC5B,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,sBAAsB,GAGvB,MAAM,oBAAoB,CAAC;AAE5B,4BAA4B;AAC5B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,gCAAgC,CAAC;AAExC,kBAAkB;AAClB,OAAO,EACL,WAAW,EACX,WAAW,GAGZ,MAAM,kBAAkB,CAAC;AAE1B,gBAAgB;AAChB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,WAAW,EAGX,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,mBAAmB;AACnB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAE/B,0BAA0B;AAC1B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,2BAA2B,EAC3B,eAAe,EACf,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,6BAA6B;AAC7B,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,GAKb,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gBAAgB;AAChB,OAAO,EACL,WAAW,EACX,WAAW,GAGZ,MAAM,kBAAkB,CAAC;AAE1B,4BAA4B;AAC5B,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,sBAAsB,GAGvB,MAAM,oBAAoB,CAAC;AAE5B,4BAA4B;AAC5B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,gCAAgC,CAAC;AAExC,kBAAkB;AAClB,OAAO,EACL,WAAW,EACX,WAAW,GAGZ,MAAM,kBAAkB,CAAC;AAE1B,gBAAgB;AAChB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,WAAW,EAGX,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,mBAAmB;AACnB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAE/B,0BAA0B;AAC1B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,2BAA2B,EAC3B,eAAe,EACf,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,6BAA6B;AAC7B,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,GAKb,MAAM,4BAA4B,CAAC;AAEpC,2CAA2C;AAC3C,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,GAGvB,MAAM,yBAAyB,CAAC;AAEjC,yBAAyB;AACzB,OAAO,EACL,2BAA2B,GAE5B,MAAM,6BAA6B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-consultant-tools/powerplatform-core",
3
- "version": "26.0.0",
3
+ "version": "27.0.0-beta.1",
4
4
  "description": "Shared core infrastructure for PowerPlatform MCP packages - authentication, HTTP client, and modular services",
5
5
  "type": "module",
6
6
  "main": "./build/index.js",
@@ -55,7 +55,7 @@
55
55
  "dependencies": {
56
56
  "@azure/identity": "^4.13.0",
57
57
  "@azure/msal-node": "^3.3.0",
58
- "@mcp-consultant-tools/core": "^22.0.0",
58
+ "@mcp-consultant-tools/core": "27.0.0-beta.1",
59
59
  "axios": "^1.8.3",
60
60
  "open": "^10.1.0"
61
61
  },