@mcp-consultant-tools/powerplatform 33.0.0 → 33.0.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.
- package/build/PowerPlatformService.d.ts +201 -0
- package/build/PowerPlatformService.js +305 -0
- package/build/PowerPlatformService.js.map +1 -0
- package/build/cli/commands/app-commands.d.ts +7 -0
- package/build/cli/commands/field-security-commands.d.ts +8 -0
- package/build/cli/commands/flow-commands.d.ts +7 -0
- package/build/cli/commands/form-commands.d.ts +7 -0
- package/build/cli/commands/index.d.ts +16 -0
- package/build/cli/commands/index.js +33 -0
- package/build/cli/commands/index.js.map +1 -0
- package/build/cli/commands/integration-commands.d.ts +7 -0
- package/build/cli/commands/metadata-commands.d.ts +7 -0
- package/build/cli/commands/plugin-commands.d.ts +7 -0
- package/build/cli/commands/security-commands.d.ts +7 -0
- package/build/cli/commands/solution-commands.d.ts +7 -0
- package/build/cli/output.d.ts +11 -0
- package/build/cli.d.ts +9 -0
- package/build/context-factory.d.ts +11 -0
- package/build/context-factory.js +39 -0
- package/build/context-factory.js.map +1 -0
- package/build/http-server.d.ts +3 -0
- package/build/index.d.ts +18 -0
- package/build/prompts/analysis-prompts.d.ts +3 -0
- package/build/prompts/analysis-prompts.js +286 -0
- package/build/prompts/analysis-prompts.js.map +1 -0
- package/build/prompts/entity-prompts.d.ts +3 -0
- package/build/prompts/entity-prompts.js +304 -0
- package/build/prompts/entity-prompts.js.map +1 -0
- package/build/prompts/index.d.ts +8 -0
- package/build/prompts/index.js +11 -0
- package/build/prompts/index.js.map +1 -0
- package/build/services/index.d.ts +5 -0
- package/build/services/index.js +5 -0
- package/build/services/index.js.map +1 -0
- package/build/tool-examples.d.ts +48 -0
- package/build/tools/app-tools.d.ts +3 -0
- package/build/tools/app-tools.js +127 -0
- package/build/tools/app-tools.js.map +1 -0
- package/build/tools/field-security-tools.d.ts +3 -0
- package/build/tools/field-security-tools.js +84 -0
- package/build/tools/field-security-tools.js.map +1 -0
- package/build/tools/flow-tools.d.ts +3 -0
- package/build/tools/flow-tools.js +374 -0
- package/build/tools/flow-tools.js.map +1 -0
- package/build/tools/form-view-tools.d.ts +3 -0
- package/build/tools/form-view-tools.js +162 -0
- package/build/tools/form-view-tools.js.map +1 -0
- package/build/tools/index.d.ts +14 -0
- package/build/tools/index.js +31 -0
- package/build/tools/index.js.map +1 -0
- package/build/tools/integration-tools.d.ts +3 -0
- package/build/tools/integration-tools.js +325 -0
- package/build/tools/integration-tools.js.map +1 -0
- package/build/tools/metadata-tools.d.ts +3 -0
- package/build/tools/metadata-tools.js +166 -0
- package/build/tools/metadata-tools.js.map +1 -0
- package/build/tools/plugin-tools.d.ts +3 -0
- package/build/tools/plugin-tools.js +138 -0
- package/build/tools/plugin-tools.js.map +1 -0
- package/build/tools/security-tools.d.ts +3 -0
- package/build/tools/security-tools.js +188 -0
- package/build/tools/security-tools.js.map +1 -0
- package/build/tools/solution-tools.d.ts +3 -0
- package/build/tools/solution-tools.js +318 -0
- package/build/tools/solution-tools.js.map +1 -0
- package/build/types.d.ts +9 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Tools - 4 tools for plugin inspection
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { descWithExamples, ENTITY_NAME_EXAMPLES, MESSAGE_FILTER_EXAMPLES, HOURS_BACK_EXAMPLES } from '../tool-examples.js';
|
|
6
|
+
export function registerPluginTools(server, ctx) {
|
|
7
|
+
server.tool("get-plugin-assemblies", "Get a list of all plugin assemblies in the environment", {
|
|
8
|
+
includeManaged: z.boolean().optional().describe("Include managed assemblies (default: false)"),
|
|
9
|
+
maxRecords: z.number().optional().describe("Maximum number of assemblies to return (default: 100)"),
|
|
10
|
+
}, async ({ includeManaged, maxRecords }) => {
|
|
11
|
+
try {
|
|
12
|
+
const service = ctx.pp;
|
|
13
|
+
const result = await service.getPluginAssemblies(includeManaged || false, maxRecords || 100);
|
|
14
|
+
const resultStr = JSON.stringify(result, null, 2);
|
|
15
|
+
return {
|
|
16
|
+
content: [
|
|
17
|
+
{
|
|
18
|
+
type: "text",
|
|
19
|
+
text: `Found ${result.totalCount} plugin assemblies:\n\n${resultStr}`,
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.error("Error getting plugin assemblies:", error);
|
|
26
|
+
return {
|
|
27
|
+
content: [
|
|
28
|
+
{
|
|
29
|
+
type: "text",
|
|
30
|
+
text: `Failed to get plugin assemblies: ${error.message}`,
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
server.tool("get-plugin-asm-full", "Get comprehensive information about a plugin assembly including all types, steps, images, and validation", {
|
|
37
|
+
assemblyName: z.string().describe("The name of the plugin assembly"),
|
|
38
|
+
includeDisabled: z.boolean().optional().describe("Include disabled steps (default: false)"),
|
|
39
|
+
}, async ({ assemblyName, includeDisabled }) => {
|
|
40
|
+
try {
|
|
41
|
+
const service = ctx.pp;
|
|
42
|
+
const result = await service.getPluginAssemblyComplete(assemblyName, includeDisabled || false);
|
|
43
|
+
const resultStr = JSON.stringify(result, null, 2);
|
|
44
|
+
return {
|
|
45
|
+
content: [
|
|
46
|
+
{
|
|
47
|
+
type: "text",
|
|
48
|
+
text: `Plugin assembly '${assemblyName}' complete information:\n\n${resultStr}`,
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.error("Error getting plugin assembly:", error);
|
|
55
|
+
return {
|
|
56
|
+
content: [
|
|
57
|
+
{
|
|
58
|
+
type: "text",
|
|
59
|
+
text: `Failed to get plugin assembly: ${error.message}`,
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
server.tool("get-entity-plugins", "Get all plugins that execute on a specific entity, organized by message and execution order", {
|
|
66
|
+
entityName: z.string().describe(descWithExamples("The logical name of the entity", ENTITY_NAME_EXAMPLES)),
|
|
67
|
+
messageFilter: z.string().optional().describe(descWithExamples("Filter by SDK message name", MESSAGE_FILTER_EXAMPLES)),
|
|
68
|
+
includeDisabled: z.boolean().optional().describe("Include disabled steps (default: false)"),
|
|
69
|
+
}, async ({ entityName, messageFilter, includeDisabled }) => {
|
|
70
|
+
try {
|
|
71
|
+
const service = ctx.pp;
|
|
72
|
+
const result = await service.getEntityPluginPipeline(entityName, messageFilter, includeDisabled || false);
|
|
73
|
+
const resultStr = JSON.stringify(result, null, 2);
|
|
74
|
+
return {
|
|
75
|
+
content: [
|
|
76
|
+
{
|
|
77
|
+
type: "text",
|
|
78
|
+
text: `Plugin pipeline for entity '${entityName}':\n\n${resultStr}`,
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error("Error getting entity plugin pipeline:", error);
|
|
85
|
+
return {
|
|
86
|
+
content: [
|
|
87
|
+
{
|
|
88
|
+
type: "text",
|
|
89
|
+
text: `Failed to get entity plugin pipeline: ${error.message}`,
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
server.tool("get-plugin-trace-logs", "Query plugin trace logs with filtering and exception parsing. Returns log entries with timestamps, execution duration, message block, and parsed exception details for failed executions.", {
|
|
96
|
+
entityName: z.string().optional().describe(descWithExamples("Filter by entity logical name", ENTITY_NAME_EXAMPLES)),
|
|
97
|
+
messageName: z.string().optional().describe(descWithExamples("Filter by SDK message name", MESSAGE_FILTER_EXAMPLES)),
|
|
98
|
+
correlationId: z.string().optional().describe("Filter by correlation ID (GUID from a specific request)"),
|
|
99
|
+
pluginStepId: z.string().optional().describe("Filter by specific step ID (GUID)"),
|
|
100
|
+
exceptionOnly: z.boolean().optional().describe("Only return logs with exceptions (default: false)"),
|
|
101
|
+
hoursBack: z.number().optional().describe(descWithExamples("How many hours back to search (default: 24)", HOURS_BACK_EXAMPLES)),
|
|
102
|
+
maxRecords: z.number().optional().describe("Maximum number of logs to return (default: 50)"),
|
|
103
|
+
}, async ({ entityName, messageName, correlationId, pluginStepId, exceptionOnly, hoursBack, maxRecords }) => {
|
|
104
|
+
try {
|
|
105
|
+
const service = ctx.pp;
|
|
106
|
+
const result = await service.getPluginTraceLogs({
|
|
107
|
+
entityName,
|
|
108
|
+
messageName,
|
|
109
|
+
correlationId,
|
|
110
|
+
pluginStepId,
|
|
111
|
+
exceptionOnly: exceptionOnly || false,
|
|
112
|
+
hoursBack: hoursBack || 24,
|
|
113
|
+
maxRecords: maxRecords || 50
|
|
114
|
+
});
|
|
115
|
+
const resultStr = JSON.stringify(result, null, 2);
|
|
116
|
+
return {
|
|
117
|
+
content: [
|
|
118
|
+
{
|
|
119
|
+
type: "text",
|
|
120
|
+
text: `Plugin trace logs (found ${result.totalCount}):\n\n${resultStr}`,
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error("Error getting plugin trace logs:", error);
|
|
127
|
+
return {
|
|
128
|
+
content: [
|
|
129
|
+
{
|
|
130
|
+
type: "text",
|
|
131
|
+
text: `Failed to get plugin trace logs: ${error.message}`,
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=plugin-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-tools.js","sourceRoot":"","sources":["../../src/tools/plugin-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Tools - 4 tools for connection references and security roles
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { descWithExamples, SOLUTION_NAME_EXAMPLES } from '../tool-examples.js';
|
|
6
|
+
export function registerSecurityTools(server, ctx) {
|
|
7
|
+
server.tool("get-connection-references", `Get all connection references in the environment with their connection status and connector details.
|
|
8
|
+
|
|
9
|
+
Connection references define the connector configurations used by Power Automate flows and other components.
|
|
10
|
+
Returns a summary with counts by connector type, plus the full list of connection references.`, {
|
|
11
|
+
maxRecords: z.number().optional().describe("Maximum records to return (default: 100)"),
|
|
12
|
+
managedOnly: z.boolean().optional().describe("Filter to managed connection references only (default: false)"),
|
|
13
|
+
hasConnection: z.boolean().optional().describe("Filter: true = only with connections set, false = only without connections"),
|
|
14
|
+
}, async ({ maxRecords, managedOnly, hasConnection }) => {
|
|
15
|
+
try {
|
|
16
|
+
const service = ctx.pp;
|
|
17
|
+
const result = await service.getConnectionReferences({
|
|
18
|
+
maxRecords,
|
|
19
|
+
managedOnly,
|
|
20
|
+
hasConnection,
|
|
21
|
+
});
|
|
22
|
+
const summaryLines = [
|
|
23
|
+
`Total: ${result.summary.total}`,
|
|
24
|
+
`With connection: ${result.summary.withConnection}`,
|
|
25
|
+
`Without connection: ${result.summary.withoutConnection}`,
|
|
26
|
+
`Managed: ${result.summary.managed}, Unmanaged: ${result.summary.unmanaged}`,
|
|
27
|
+
'',
|
|
28
|
+
'By connector:',
|
|
29
|
+
...Object.entries(result.summary.byConnector)
|
|
30
|
+
.sort(([, a], [, b]) => b - a)
|
|
31
|
+
.map(([name, count]) => ` ${name}: ${count}`),
|
|
32
|
+
];
|
|
33
|
+
const refLines = result.references.map((r) => `- ${r.displayName} (${r.logicalName})\n` +
|
|
34
|
+
` Connector: ${r.connectorId}\n` +
|
|
35
|
+
` Connection: ${r.connectionId ? r.connectionId : 'Not set'}\n` +
|
|
36
|
+
` State: ${r.stateCode === 0 ? 'Active' : 'Inactive'} | Managed: ${r.isManaged}`);
|
|
37
|
+
return {
|
|
38
|
+
content: [{
|
|
39
|
+
type: "text",
|
|
40
|
+
text: `Connection References\n\n${summaryLines.join('\n')}\n\n${refLines.join('\n\n')}`,
|
|
41
|
+
}],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error("Error getting connection references:", error);
|
|
46
|
+
return {
|
|
47
|
+
content: [{
|
|
48
|
+
type: "text",
|
|
49
|
+
text: `Failed to get connection references: ${error.message}`,
|
|
50
|
+
}],
|
|
51
|
+
isError: true,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
server.tool("get-security-roles", `Get custom security roles defined in the environment. By default excludes well-known system roles (System Administrator, System Customizer, etc.).
|
|
56
|
+
|
|
57
|
+
Useful for security audits and understanding what custom roles exist in the environment.`, {
|
|
58
|
+
solutionUniqueName: z.string().optional().describe(descWithExamples("Filter to roles in a specific solution", SOLUTION_NAME_EXAMPLES)),
|
|
59
|
+
excludeSystemRoles: z.boolean().optional().describe("Exclude System Administrator, System Customizer, and other built-in roles (default: true)"),
|
|
60
|
+
maxRecords: z.number().optional().describe("Maximum records to return (default: 100)"),
|
|
61
|
+
}, async ({ solutionUniqueName, excludeSystemRoles, maxRecords }) => {
|
|
62
|
+
try {
|
|
63
|
+
const service = ctx.pp;
|
|
64
|
+
const result = await service.getSecurityRoles({
|
|
65
|
+
solutionUniqueName,
|
|
66
|
+
excludeSystemRoles,
|
|
67
|
+
maxRecords,
|
|
68
|
+
});
|
|
69
|
+
const summaryLines = [
|
|
70
|
+
`Total: ${result.summary.total}`,
|
|
71
|
+
`Managed: ${result.summary.managed}, Unmanaged: ${result.summary.unmanaged}`,
|
|
72
|
+
result.summary.systemRolesExcluded > 0
|
|
73
|
+
? `System roles excluded: ${result.summary.systemRolesExcluded}`
|
|
74
|
+
: null,
|
|
75
|
+
].filter(Boolean);
|
|
76
|
+
const roleLines = result.roles.map((r) => `- ${r.name}\n` +
|
|
77
|
+
` ID: ${r.roleId}\n` +
|
|
78
|
+
` Unique ID: ${r.roleIdUnique}\n` +
|
|
79
|
+
` Managed: ${r.isManaged} | Customizable: ${r.isCustomizable}`);
|
|
80
|
+
return {
|
|
81
|
+
content: [{
|
|
82
|
+
type: "text",
|
|
83
|
+
text: `Security Roles\n\n${summaryLines.join('\n')}\n\n${roleLines.join('\n\n')}`,
|
|
84
|
+
}],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error("Error getting security roles:", error);
|
|
89
|
+
return {
|
|
90
|
+
content: [{
|
|
91
|
+
type: "text",
|
|
92
|
+
text: `Failed to get security roles: ${error.message}`,
|
|
93
|
+
}],
|
|
94
|
+
isError: true,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
server.tool("get-security-role-privileges", `Get the privilege assignments for a specific security role, showing what entities/actions the role grants access to.
|
|
99
|
+
|
|
100
|
+
Results are grouped by entity, showing the access depth (User/Business Unit/Parent:Child BU/Organization) for each action (Create, Read, Write, Delete, Append, AppendTo, Assign, Share).`, {
|
|
101
|
+
roleId: z.string().describe("The role ID (GUID) to get privileges for"),
|
|
102
|
+
entityFilter: z.string().optional().describe("Filter privileges to a specific entity name (partial match)"),
|
|
103
|
+
accessRightFilter: z.string().optional().describe("Filter by access right: Create, Read, Write, Delete, Append, AppendTo, Assign, Share"),
|
|
104
|
+
}, async ({ roleId, entityFilter, accessRightFilter }) => {
|
|
105
|
+
try {
|
|
106
|
+
const service = ctx.pp;
|
|
107
|
+
const result = await service.getSecurityRolePrivileges({
|
|
108
|
+
roleId,
|
|
109
|
+
entityFilter,
|
|
110
|
+
accessRightFilter,
|
|
111
|
+
});
|
|
112
|
+
const summaryLines = [
|
|
113
|
+
`Role ID: ${result.roleId}`,
|
|
114
|
+
`Total privileges: ${result.summary.total}`,
|
|
115
|
+
`Entities: ${result.summary.entityCount}`,
|
|
116
|
+
'',
|
|
117
|
+
'By access right:',
|
|
118
|
+
...Object.entries(result.summary.byAccessRight)
|
|
119
|
+
.sort(([, a], [, b]) => b - a)
|
|
120
|
+
.map(([right, count]) => ` ${right}: ${count}`),
|
|
121
|
+
];
|
|
122
|
+
const entityLines = Object.entries(result.groupedByEntity)
|
|
123
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
124
|
+
.map(([entity, privs]) => {
|
|
125
|
+
const privLines = privs.map((p) => ` ${p.accessRight}: ${p.depth}`);
|
|
126
|
+
return ` ${entity}:\n${privLines.join('\n')}`;
|
|
127
|
+
});
|
|
128
|
+
return {
|
|
129
|
+
content: [{
|
|
130
|
+
type: "text",
|
|
131
|
+
text: `Security Role Privileges\n\n${summaryLines.join('\n')}\n\nPrivileges by Entity:\n${entityLines.join('\n\n')}`,
|
|
132
|
+
}],
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
console.error("Error getting security role privileges:", error);
|
|
137
|
+
return {
|
|
138
|
+
content: [{
|
|
139
|
+
type: "text",
|
|
140
|
+
text: `Failed to get security role privileges: ${error.message}`,
|
|
141
|
+
}],
|
|
142
|
+
isError: true,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
server.tool("get-security-roles-by-solution", `Get all security roles that are components of a specific solution.
|
|
147
|
+
|
|
148
|
+
Queries solution components with componenttype=20 (Security Role) and fetches role details.
|
|
149
|
+
Optionally includes a privilege summary for each role (slower due to additional API calls).`, {
|
|
150
|
+
solutionUniqueName: z.string().describe(descWithExamples("The solution unique name to get roles from", SOLUTION_NAME_EXAMPLES)),
|
|
151
|
+
includePrivileges: z.boolean().optional().describe("Include privilege count summary per role (default: false, slower)"),
|
|
152
|
+
}, async ({ solutionUniqueName, includePrivileges }) => {
|
|
153
|
+
try {
|
|
154
|
+
const service = ctx.pp;
|
|
155
|
+
const result = await service.getSecurityRolesBySolution({
|
|
156
|
+
solutionUniqueName,
|
|
157
|
+
includePrivileges,
|
|
158
|
+
});
|
|
159
|
+
const roleLines = result.roles.map((r) => {
|
|
160
|
+
let line = `- ${r.name}\n` +
|
|
161
|
+
` ID: ${r.roleId}\n` +
|
|
162
|
+
` Managed: ${r.isManaged} | Customizable: ${r.isCustomizable}`;
|
|
163
|
+
if (r.privilegeSummary) {
|
|
164
|
+
line += `\n Privileges: ${r.privilegeSummary.total} across ${r.privilegeSummary.entityCount} entities`;
|
|
165
|
+
}
|
|
166
|
+
return line;
|
|
167
|
+
});
|
|
168
|
+
return {
|
|
169
|
+
content: [{
|
|
170
|
+
type: "text",
|
|
171
|
+
text: `Security Roles in Solution '${result.solutionUniqueName}'\n\n` +
|
|
172
|
+
`Total: ${result.summary.total}\n\n${roleLines.join('\n\n')}`,
|
|
173
|
+
}],
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.error("Error getting security roles by solution:", error);
|
|
178
|
+
return {
|
|
179
|
+
content: [{
|
|
180
|
+
type: "text",
|
|
181
|
+
text: `Failed to get security roles by solution: ${error.message}`,
|
|
182
|
+
}],
|
|
183
|
+
isError: true,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=security-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-tools.js","sourceRoot":"","sources":["../../src/tools/security-tools.ts"],"names":[],"mappings":"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"}
|