@mcp-consultant-tools/powerplatform-data 27.0.0 → 28.0.0-beta.10
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/cli/commands/data-commands.d.ts +7 -0
- package/build/cli/commands/data-commands.d.ts.map +1 -0
- package/build/cli/commands/data-commands.js +142 -0
- package/build/cli/commands/data-commands.js.map +1 -0
- package/build/cli/commands/flow-commands.d.ts +7 -0
- package/build/cli/commands/flow-commands.d.ts.map +1 -0
- package/build/cli/commands/flow-commands.js +67 -0
- package/build/cli/commands/flow-commands.js.map +1 -0
- package/build/cli/commands/index.d.ts +10 -0
- package/build/cli/commands/index.d.ts.map +1 -0
- package/build/cli/commands/index.js +15 -0
- package/build/cli/commands/index.js.map +1 -0
- package/build/cli/commands/metadata-commands.d.ts +7 -0
- package/build/cli/commands/metadata-commands.d.ts.map +1 -0
- package/build/cli/commands/metadata-commands.js +94 -0
- package/build/cli/commands/metadata-commands.js.map +1 -0
- package/build/cli/output.d.ts +11 -0
- package/build/cli/output.d.ts.map +1 -0
- package/build/cli/output.js +10 -0
- package/build/cli/output.js.map +1 -0
- package/build/cli.d.ts +9 -0
- package/build/cli.d.ts.map +1 -0
- package/build/cli.js +27 -0
- package/build/cli.js.map +1 -0
- package/build/context-factory.d.ts +8 -0
- package/build/context-factory.d.ts.map +1 -0
- package/build/context-factory.js +52 -0
- package/build/context-factory.js.map +1 -0
- package/build/index.d.ts +11 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +45 -557
- package/build/index.js.map +1 -1
- package/build/services/index.d.ts +5 -0
- package/build/services/index.d.ts.map +1 -0
- package/build/services/index.js +5 -0
- package/build/services/index.js.map +1 -0
- package/build/tool-examples.d.ts +30 -0
- package/build/tool-examples.d.ts.map +1 -0
- package/build/tool-examples.js +36 -0
- package/build/tool-examples.js.map +1 -0
- package/build/tools/index.d.ts +8 -0
- package/build/tools/index.d.ts.map +1 -0
- package/build/tools/index.js +11 -0
- package/build/tools/index.js.map +1 -0
- package/build/tools/read-tools.d.ts +3 -0
- package/build/tools/read-tools.d.ts.map +1 -0
- package/build/tools/read-tools.js +342 -0
- package/build/tools/read-tools.js.map +1 -0
- package/build/tools/write-tools.d.ts +3 -0
- package/build/tools/write-tools.d.ts.map +1 -0
- package/build/tools/write-tools.js +203 -0
- package/build/tools/write-tools.js.map +1 -0
- package/build/types.d.ts +13 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/package.json +6 -4
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data CRUD CLI Commands - 6 commands mapping to data MCP tools
|
|
3
|
+
*/
|
|
4
|
+
import type { Command } from 'commander';
|
|
5
|
+
import type { ServiceContext } from '../../types.js';
|
|
6
|
+
export declare function registerDataCommands(program: Command, ctx: ServiceContext): void;
|
|
7
|
+
//# sourceMappingURL=data-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/data-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CA4JhF"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data CRUD CLI Commands - 6 commands mapping to data MCP tools
|
|
3
|
+
*/
|
|
4
|
+
import { getGlobalFlags, handleCliError } from '@mcp-consultant-tools/core';
|
|
5
|
+
import { outputResult } from '../output.js';
|
|
6
|
+
export function registerDataCommands(program, ctx) {
|
|
7
|
+
const record = program.command('record').description('Dataverse record CRUD operations');
|
|
8
|
+
record
|
|
9
|
+
.command('query')
|
|
10
|
+
.description('Query records using an OData filter expression')
|
|
11
|
+
.argument('<entityNamePlural>', 'Plural entity name (e.g., accounts, contacts)')
|
|
12
|
+
.argument('<filter>', 'OData filter expression')
|
|
13
|
+
.option('-s, --select <columns...>', 'Columns to return')
|
|
14
|
+
.option('-m, --max-records <n>', 'Maximum records to retrieve', '50')
|
|
15
|
+
.action(async (entityNamePlural, filter, opts) => {
|
|
16
|
+
try {
|
|
17
|
+
const select = opts.select || undefined;
|
|
18
|
+
const maxRecords = parseInt(opts.maxRecords, 10);
|
|
19
|
+
const result = await ctx.pp.queryRecords(entityNamePlural, filter, maxRecords, select);
|
|
20
|
+
outputResult({
|
|
21
|
+
fileName: `query-${entityNamePlural}`,
|
|
22
|
+
data: result,
|
|
23
|
+
summary: `Retrieved ${result.returnedCount} records from '${entityNamePlural}'${result.hasMore ? ' (more available)' : ''}`,
|
|
24
|
+
}, getGlobalFlags(program));
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
handleCliError(error, 'query records');
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
record
|
|
31
|
+
.command('get')
|
|
32
|
+
.description('Get a specific record by entity name and ID')
|
|
33
|
+
.argument('<entityNamePlural>', 'Plural entity name (e.g., accounts, contacts)')
|
|
34
|
+
.argument('<recordId>', 'Record GUID')
|
|
35
|
+
.action(async (entityNamePlural, recordId) => {
|
|
36
|
+
try {
|
|
37
|
+
const result = await ctx.pp.getRecord(entityNamePlural, recordId);
|
|
38
|
+
outputResult({
|
|
39
|
+
fileName: `record-${entityNamePlural}-${recordId}`,
|
|
40
|
+
data: result,
|
|
41
|
+
summary: `Record from '${entityNamePlural}' with ID '${recordId}'`,
|
|
42
|
+
}, getGlobalFlags(program));
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
handleCliError(error, 'get record');
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
record
|
|
49
|
+
.command('create')
|
|
50
|
+
.description('Create a new record (requires POWERPLATFORM_ENABLE_CREATE=true)')
|
|
51
|
+
.argument('<entityNamePlural>', 'Plural entity name (e.g., accounts, contacts)')
|
|
52
|
+
.argument('<data>', 'Record data as JSON string')
|
|
53
|
+
.action(async (entityNamePlural, dataJson) => {
|
|
54
|
+
try {
|
|
55
|
+
ctx.checkCreateEnabled();
|
|
56
|
+
const data = JSON.parse(dataJson);
|
|
57
|
+
const result = await ctx.pp.createRecord(entityNamePlural, data);
|
|
58
|
+
outputResult({
|
|
59
|
+
fileName: `created-${entityNamePlural}`,
|
|
60
|
+
data: result,
|
|
61
|
+
summary: `Record created successfully in '${entityNamePlural}'`,
|
|
62
|
+
}, getGlobalFlags(program));
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
handleCliError(error, 'create record');
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
record
|
|
69
|
+
.command('update')
|
|
70
|
+
.description('Update an existing record (requires POWERPLATFORM_ENABLE_UPDATE=true)')
|
|
71
|
+
.argument('<entityNamePlural>', 'Plural entity name (e.g., accounts, contacts)')
|
|
72
|
+
.argument('<recordId>', 'Record GUID')
|
|
73
|
+
.argument('<data>', 'Partial record data as JSON string')
|
|
74
|
+
.action(async (entityNamePlural, recordId, dataJson) => {
|
|
75
|
+
try {
|
|
76
|
+
ctx.checkUpdateEnabled();
|
|
77
|
+
const data = JSON.parse(dataJson);
|
|
78
|
+
const result = await ctx.pp.updateRecord(entityNamePlural, recordId, data);
|
|
79
|
+
outputResult({
|
|
80
|
+
fileName: `updated-${entityNamePlural}-${recordId}`,
|
|
81
|
+
data: result,
|
|
82
|
+
summary: `Record '${recordId}' updated successfully in '${entityNamePlural}'`,
|
|
83
|
+
}, getGlobalFlags(program));
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
handleCliError(error, 'update record');
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
record
|
|
90
|
+
.command('delete')
|
|
91
|
+
.description('Delete a record (requires POWERPLATFORM_ENABLE_DELETE=true)')
|
|
92
|
+
.argument('<entityNamePlural>', 'Plural entity name (e.g., accounts, contacts)')
|
|
93
|
+
.argument('<recordId>', 'Record GUID')
|
|
94
|
+
.option('--confirm', 'Confirm deletion (required)', false)
|
|
95
|
+
.action(async (entityNamePlural, recordId, opts) => {
|
|
96
|
+
try {
|
|
97
|
+
ctx.checkDeleteEnabled();
|
|
98
|
+
if (!opts.confirm) {
|
|
99
|
+
process.stderr.write(`Delete operation requires --confirm flag.\n` +
|
|
100
|
+
`You are about to delete record '${recordId}' from '${entityNamePlural}'.\n` +
|
|
101
|
+
`This operation is permanent and cannot be undone.\n` +
|
|
102
|
+
`To proceed, run again with --confirm.\n`);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
await ctx.pp.deleteRecord(entityNamePlural, recordId);
|
|
106
|
+
outputResult({
|
|
107
|
+
fileName: `deleted-${entityNamePlural}-${recordId}`,
|
|
108
|
+
data: { entity: entityNamePlural, recordId, deleted: true },
|
|
109
|
+
summary: `Record '${recordId}' deleted from '${entityNamePlural}'`,
|
|
110
|
+
}, getGlobalFlags(program));
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
handleCliError(error, 'delete record');
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
record
|
|
117
|
+
.command('execute-action')
|
|
118
|
+
.description('Execute a Custom API or Action (requires POWERPLATFORM_ENABLE_ACTIONS=true)')
|
|
119
|
+
.argument('<actionName>', 'Action unique name (e.g., WhoAmI, new_MyCustomAction)')
|
|
120
|
+
.option('-p, --parameters <json>', 'Input parameters as JSON string')
|
|
121
|
+
.option('--bound-entity <entityNamePlural>', 'Bound entity plural name')
|
|
122
|
+
.option('--bound-record <recordId>', 'Bound record GUID')
|
|
123
|
+
.action(async (actionName, opts) => {
|
|
124
|
+
try {
|
|
125
|
+
ctx.checkActionsEnabled();
|
|
126
|
+
const parameters = opts.parameters ? JSON.parse(opts.parameters) : undefined;
|
|
127
|
+
const boundTo = opts.boundEntity && opts.boundRecord
|
|
128
|
+
? { entityNamePlural: opts.boundEntity, recordId: opts.boundRecord }
|
|
129
|
+
: undefined;
|
|
130
|
+
const result = await ctx.pp.executeAction(actionName, parameters, boundTo);
|
|
131
|
+
outputResult({
|
|
132
|
+
fileName: `action-${actionName}`,
|
|
133
|
+
data: result,
|
|
134
|
+
summary: `Action '${actionName}' executed successfully${boundTo ? ` (bound to ${boundTo.entityNamePlural}/${boundTo.recordId})` : ' (unbound)'}`,
|
|
135
|
+
}, getGlobalFlags(program));
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
handleCliError(error, 'execute action');
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=data-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-commands.js","sourceRoot":"","sources":["../../../src/cli/commands/data-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flow CLI Commands - 2 commands mapping to flow MCP tools
|
|
3
|
+
*/
|
|
4
|
+
import type { Command } from 'commander';
|
|
5
|
+
import type { ServiceContext } from '../../types.js';
|
|
6
|
+
export declare function registerFlowCommands(program: Command, ctx: ServiceContext): void;
|
|
7
|
+
//# sourceMappingURL=flow-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/flow-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CA+DhF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flow CLI Commands - 2 commands mapping to flow MCP tools
|
|
3
|
+
*/
|
|
4
|
+
import { getGlobalFlags, handleCliError } from '@mcp-consultant-tools/core';
|
|
5
|
+
import { outputResult } from '../output.js';
|
|
6
|
+
export function registerFlowCommands(program, ctx) {
|
|
7
|
+
const flow = program.command('flow').description('Power Automate flow operations');
|
|
8
|
+
flow
|
|
9
|
+
.command('runs')
|
|
10
|
+
.description('Get run history for a flow')
|
|
11
|
+
.argument('<flowId>', 'Flow GUID (workflowid)')
|
|
12
|
+
.option('-s, --status <status>', 'Filter by status: Succeeded, Failed, Running, Waiting, Cancelled')
|
|
13
|
+
.option('--started-after <date>', 'Only runs started after this date (ISO 8601)')
|
|
14
|
+
.option('--started-before <date>', 'Only runs started before this date (ISO 8601)')
|
|
15
|
+
.option('-m, --max-records <n>', 'Maximum runs to return', '50')
|
|
16
|
+
.action(async (flowId, opts) => {
|
|
17
|
+
try {
|
|
18
|
+
const result = await ctx.pp.getFlowRuns(flowId, {
|
|
19
|
+
status: opts.status,
|
|
20
|
+
startedAfter: opts.startedAfter,
|
|
21
|
+
startedBefore: opts.startedBefore,
|
|
22
|
+
maxRecords: parseInt(opts.maxRecords, 10),
|
|
23
|
+
});
|
|
24
|
+
const stats = (result.runs || []).reduce((acc, run) => {
|
|
25
|
+
if (run.status === 'Succeeded')
|
|
26
|
+
acc.succeeded++;
|
|
27
|
+
else if (run.status === 'Failed' || run.status === 'Faulted' || run.status === 'TimedOut')
|
|
28
|
+
acc.failed++;
|
|
29
|
+
else if (run.status === 'Running' || run.status === 'Waiting')
|
|
30
|
+
acc.inProgress++;
|
|
31
|
+
else if (run.status === 'Cancelled')
|
|
32
|
+
acc.cancelled++;
|
|
33
|
+
else
|
|
34
|
+
acc.other++;
|
|
35
|
+
return acc;
|
|
36
|
+
}, { succeeded: 0, failed: 0, inProgress: 0, cancelled: 0, other: 0 });
|
|
37
|
+
outputResult({
|
|
38
|
+
fileName: `flow-runs-${flowId}`,
|
|
39
|
+
data: result,
|
|
40
|
+
summary: `Flow ${flowId}: ${result.totalCount} runs (OK: ${stats.succeeded}, Failed: ${stats.failed}, Running: ${stats.inProgress})`,
|
|
41
|
+
}, getGlobalFlags(program));
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
handleCliError(error, 'get flow runs');
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
flow
|
|
48
|
+
.command('run-details')
|
|
49
|
+
.description('Get detailed info about a specific flow run')
|
|
50
|
+
.argument('<flowId>', 'Flow GUID (workflowid)')
|
|
51
|
+
.argument('<runId>', 'Flow run GUID')
|
|
52
|
+
.action(async (flowId, runId) => {
|
|
53
|
+
try {
|
|
54
|
+
const result = await ctx.pp.getFlowRunDetails(flowId, runId);
|
|
55
|
+
const summary = result.actionsSummary || {};
|
|
56
|
+
outputResult({
|
|
57
|
+
fileName: `flow-run-${flowId}-${runId}`,
|
|
58
|
+
data: result,
|
|
59
|
+
summary: `Flow run ${runId}: ${result.status} (${summary.total || 0} actions, ${summary.failed || 0} failed)`,
|
|
60
|
+
}, getGlobalFlags(program));
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
handleCliError(error, 'get flow run details');
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=flow-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-commands.js","sourceRoot":"","sources":["../../../src/cli/commands/flow-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Commands barrel export + combined registration
|
|
3
|
+
*/
|
|
4
|
+
import type { Command } from 'commander';
|
|
5
|
+
import type { ServiceContext } from '../../types.js';
|
|
6
|
+
export declare function registerAllCommands(program: Command, ctx: ServiceContext): void;
|
|
7
|
+
export { registerDataCommands } from './data-commands.js';
|
|
8
|
+
export { registerMetadataCommands } from './metadata-commands.js';
|
|
9
|
+
export { registerFlowCommands } from './flow-commands.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKrD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAI/E;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Commands barrel export + combined registration
|
|
3
|
+
*/
|
|
4
|
+
import { registerDataCommands } from './data-commands.js';
|
|
5
|
+
import { registerMetadataCommands } from './metadata-commands.js';
|
|
6
|
+
import { registerFlowCommands } from './flow-commands.js';
|
|
7
|
+
export function registerAllCommands(program, ctx) {
|
|
8
|
+
registerDataCommands(program, ctx);
|
|
9
|
+
registerMetadataCommands(program, ctx);
|
|
10
|
+
registerFlowCommands(program, ctx);
|
|
11
|
+
}
|
|
12
|
+
export { registerDataCommands } from './data-commands.js';
|
|
13
|
+
export { registerMetadataCommands } from './metadata-commands.js';
|
|
14
|
+
export { registerFlowCommands } from './flow-commands.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,GAAmB;IACvE,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACnC,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACvC,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata CLI Commands - 2 commands mapping to metadata MCP tools
|
|
3
|
+
*/
|
|
4
|
+
import type { Command } from 'commander';
|
|
5
|
+
import type { ServiceContext } from '../../types.js';
|
|
6
|
+
export declare function registerMetadataCommands(program: Command, ctx: ServiceContext): void;
|
|
7
|
+
//# sourceMappingURL=metadata-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/metadata-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAqGpF"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata CLI Commands - 2 commands mapping to metadata MCP tools
|
|
3
|
+
*/
|
|
4
|
+
import { getGlobalFlags, handleCliError } from '@mcp-consultant-tools/core';
|
|
5
|
+
import { outputResult } from '../output.js';
|
|
6
|
+
export function registerMetadataCommands(program, ctx) {
|
|
7
|
+
const metadata = program.command('metadata').description('Dataverse entity metadata operations');
|
|
8
|
+
metadata
|
|
9
|
+
.command('get')
|
|
10
|
+
.description('Get entity metadata (EntitySetName, PrimaryIdAttribute, etc.)')
|
|
11
|
+
.argument('<entityLogicalName>', 'Logical name of the entity (e.g., account, contact)')
|
|
12
|
+
.action(async (entityLogicalName) => {
|
|
13
|
+
try {
|
|
14
|
+
const raw = await ctx.pp.getEntityMetadata(entityLogicalName);
|
|
15
|
+
const summary = {
|
|
16
|
+
LogicalName: raw.LogicalName,
|
|
17
|
+
EntitySetName: raw.EntitySetName,
|
|
18
|
+
PrimaryIdAttribute: raw.PrimaryIdAttribute,
|
|
19
|
+
PrimaryNameAttribute: raw.PrimaryNameAttribute,
|
|
20
|
+
DisplayName: raw.DisplayName?.UserLocalizedLabel?.Label,
|
|
21
|
+
DisplayCollectionName: raw.DisplayCollectionName?.UserLocalizedLabel?.Label,
|
|
22
|
+
SchemaName: raw.SchemaName,
|
|
23
|
+
LogicalCollectionName: raw.LogicalCollectionName,
|
|
24
|
+
IsCustomEntity: raw.IsCustomEntity,
|
|
25
|
+
MetadataId: raw.MetadataId,
|
|
26
|
+
};
|
|
27
|
+
outputResult({
|
|
28
|
+
fileName: `metadata-${entityLogicalName}`,
|
|
29
|
+
data: summary,
|
|
30
|
+
summary: `Entity '${entityLogicalName}': EntitySetName=${summary.EntitySetName}, PrimaryId=${summary.PrimaryIdAttribute}`,
|
|
31
|
+
}, getGlobalFlags(program));
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
handleCliError(error, 'get entity metadata');
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
metadata
|
|
38
|
+
.command('lookup-target')
|
|
39
|
+
.description('Get lookup field target entity info (for @odata.bind syntax)')
|
|
40
|
+
.argument('<entityLogicalName>', 'Entity containing the lookup (e.g., ste_transaction)')
|
|
41
|
+
.argument('<lookupAttributeName>', 'Lookup attribute name (e.g., parentaccountid)')
|
|
42
|
+
.action(async (entityLogicalName, lookupAttributeName) => {
|
|
43
|
+
try {
|
|
44
|
+
const attribute = await ctx.pp.getEntityAttribute(entityLogicalName, lookupAttributeName);
|
|
45
|
+
if (!attribute.Targets || attribute.Targets.length === 0) {
|
|
46
|
+
process.stderr.write(`Attribute '${lookupAttributeName}' on entity '${entityLogicalName}' is not a lookup field or has no targets.\n`);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
const lookupSchemaName = attribute.SchemaName;
|
|
50
|
+
const isPolymorphic = attribute.Targets.length > 1;
|
|
51
|
+
const targetResults = await Promise.all(attribute.Targets.map(async (targetEntity) => {
|
|
52
|
+
try {
|
|
53
|
+
const targetMetadata = await ctx.pp.getEntityMetadata(targetEntity);
|
|
54
|
+
const bindingPropertyName = isPolymorphic
|
|
55
|
+
? `${lookupSchemaName}_${targetEntity}`
|
|
56
|
+
: lookupSchemaName;
|
|
57
|
+
return {
|
|
58
|
+
LogicalName: targetEntity,
|
|
59
|
+
EntitySetName: targetMetadata.EntitySetName,
|
|
60
|
+
PrimaryIdAttribute: targetMetadata.PrimaryIdAttribute,
|
|
61
|
+
DisplayName: targetMetadata.DisplayName?.UserLocalizedLabel?.Label,
|
|
62
|
+
BindingPropertyName: bindingPropertyName,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return {
|
|
67
|
+
LogicalName: targetEntity,
|
|
68
|
+
EntitySetName: `${targetEntity}s`,
|
|
69
|
+
BindingPropertyName: isPolymorphic ? `${lookupSchemaName}_${targetEntity}` : lookupSchemaName,
|
|
70
|
+
error: 'Could not fetch metadata',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}));
|
|
74
|
+
const result = {
|
|
75
|
+
lookupAttribute: {
|
|
76
|
+
SchemaName: lookupSchemaName,
|
|
77
|
+
LogicalName: lookupAttributeName,
|
|
78
|
+
IsPolymorphic: isPolymorphic,
|
|
79
|
+
},
|
|
80
|
+
targets: targetResults,
|
|
81
|
+
bindingSyntax: `${targetResults[0].BindingPropertyName}@odata.bind: /${targetResults[0].EntitySetName}(<guid>)`,
|
|
82
|
+
};
|
|
83
|
+
outputResult({
|
|
84
|
+
fileName: `lookup-${entityLogicalName}-${lookupAttributeName}`,
|
|
85
|
+
data: result,
|
|
86
|
+
summary: `Lookup '${lookupAttributeName}' on '${entityLogicalName}': bind via ${targetResults[0].BindingPropertyName}@odata.bind -> /${targetResults[0].EntitySetName}(<guid>)`,
|
|
87
|
+
}, getGlobalFlags(program));
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
handleCliError(error, 'get lookup target');
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=metadata-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-commands.js","sourceRoot":"","sources":["../../../src/cli/commands/metadata-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI output helper for powerplatform-data package.
|
|
3
|
+
* Thin wrapper setting the package-specific cache directory.
|
|
4
|
+
*/
|
|
5
|
+
import { type GlobalFlags } from '@mcp-consultant-tools/core';
|
|
6
|
+
export declare function outputResult(opts: {
|
|
7
|
+
fileName: string;
|
|
8
|
+
data: unknown;
|
|
9
|
+
summary: string;
|
|
10
|
+
}, flags: GlobalFlags): void;
|
|
11
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAIhG,wBAAgB,YAAY,CAC1B,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAC1D,KAAK,EAAE,WAAW,GACjB,IAAI,CAEN"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI output helper for powerplatform-data package.
|
|
3
|
+
* Thin wrapper setting the package-specific cache directory.
|
|
4
|
+
*/
|
|
5
|
+
import { outputResult as coreOutputResult } from '@mcp-consultant-tools/core';
|
|
6
|
+
const CACHE_DIR = '.mcp-pp-data-cache';
|
|
7
|
+
export function outputResult(opts, flags) {
|
|
8
|
+
coreOutputResult({ ...opts, cacheDir: CACHE_DIR }, flags);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAoB,MAAM,4BAA4B,CAAC;AAEhG,MAAM,SAAS,GAAG,oBAAoB,CAAC;AAEvC,MAAM,UAAU,YAAY,CAC1B,IAA0D,EAC1D,KAAkB;IAElB,gBAAgB,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;AAC5D,CAAC"}
|
package/build/cli.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @mcp-consultant-tools/powerplatform-data CLI
|
|
4
|
+
*
|
|
5
|
+
* Command-line interface for PowerPlatform data CRUD operations.
|
|
6
|
+
* Reuses the same ServiceContext and services as the MCP server.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
|
package/build/cli.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @mcp-consultant-tools/powerplatform-data CLI
|
|
4
|
+
*
|
|
5
|
+
* Command-line interface for PowerPlatform data CRUD operations.
|
|
6
|
+
* Reuses the same ServiceContext and services as the MCP server.
|
|
7
|
+
*/
|
|
8
|
+
import { createCliProgram, loadEnvForCli } from '@mcp-consultant-tools/core';
|
|
9
|
+
import { createServiceContext } from './context-factory.js';
|
|
10
|
+
import { registerAllCommands } from './cli/commands/index.js';
|
|
11
|
+
const program = createCliProgram({
|
|
12
|
+
name: 'mcp-pp-data-cli',
|
|
13
|
+
description: 'PowerPlatform Data CLI - records, metadata, flows',
|
|
14
|
+
version: '28.0.0-beta.8',
|
|
15
|
+
});
|
|
16
|
+
// Load env before parsing (--env-file handled by commander hook)
|
|
17
|
+
program.hook('preAction', (thisCommand) => {
|
|
18
|
+
const opts = thisCommand.opts();
|
|
19
|
+
loadEnvForCli(opts.envFile);
|
|
20
|
+
});
|
|
21
|
+
const ctx = createServiceContext();
|
|
22
|
+
registerAllCommands(program, ctx);
|
|
23
|
+
program.parseAsync(process.argv).catch((error) => {
|
|
24
|
+
console.error('CLI error:', error instanceof Error ? error.message : String(error));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=cli.js.map
|
package/build/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,OAAO,GAAG,gBAAgB,CAAC;IAC/B,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,mDAAmD;IAChE,OAAO,EAAE,eAAe;CACzB,CAAC,CAAC;AAEH,iEAAiE;AACjE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,WAAoB,EAAE,EAAE;IACjD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAChC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,MAAM,GAAG,GAAG,oBAAoB,EAAE,CAAC;AACnC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAElC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACxD,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared service context factory - used by both MCP server and CLI.
|
|
3
|
+
*/
|
|
4
|
+
import { PowerPlatformService } from './PowerPlatformService.js';
|
|
5
|
+
import type { ServiceContext } from './types.js';
|
|
6
|
+
export type { ServiceContext } from './types.js';
|
|
7
|
+
export declare function createServiceContext(service?: PowerPlatformService): ServiceContext;
|
|
8
|
+
//# sourceMappingURL=context-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-factory.d.ts","sourceRoot":"","sources":["../src/context-factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAuB,MAAM,2BAA2B,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,cAAc,CAkDnF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared service context factory - used by both MCP server and CLI.
|
|
3
|
+
*/
|
|
4
|
+
import { PowerPlatformService } from './PowerPlatformService.js';
|
|
5
|
+
export function createServiceContext(service) {
|
|
6
|
+
let ppService = service || null;
|
|
7
|
+
function getPowerPlatformService() {
|
|
8
|
+
if (!ppService) {
|
|
9
|
+
const requiredVars = [
|
|
10
|
+
'POWERPLATFORM_URL',
|
|
11
|
+
'POWERPLATFORM_CLIENT_ID',
|
|
12
|
+
'POWERPLATFORM_TENANT_ID'
|
|
13
|
+
];
|
|
14
|
+
const missing = requiredVars.filter(v => !process.env[v]);
|
|
15
|
+
if (missing.length > 0) {
|
|
16
|
+
throw new Error(`Missing required PowerPlatform configuration: ${missing.join(', ')}`);
|
|
17
|
+
}
|
|
18
|
+
const config = {
|
|
19
|
+
organizationUrl: process.env.POWERPLATFORM_URL,
|
|
20
|
+
clientId: process.env.POWERPLATFORM_CLIENT_ID,
|
|
21
|
+
clientSecret: process.env.POWERPLATFORM_CLIENT_SECRET,
|
|
22
|
+
tenantId: process.env.POWERPLATFORM_TENANT_ID,
|
|
23
|
+
};
|
|
24
|
+
ppService = new PowerPlatformService(config);
|
|
25
|
+
}
|
|
26
|
+
return ppService;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
get pp() { return getPowerPlatformService(); },
|
|
30
|
+
checkCreateEnabled() {
|
|
31
|
+
if (process.env.POWERPLATFORM_ENABLE_CREATE !== 'true') {
|
|
32
|
+
throw new Error('Create operations are disabled. Set POWERPLATFORM_ENABLE_CREATE=true to enable.');
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
checkUpdateEnabled() {
|
|
36
|
+
if (process.env.POWERPLATFORM_ENABLE_UPDATE !== 'true') {
|
|
37
|
+
throw new Error('Update operations are disabled. Set POWERPLATFORM_ENABLE_UPDATE=true to enable.');
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
checkDeleteEnabled() {
|
|
41
|
+
if (process.env.POWERPLATFORM_ENABLE_DELETE !== 'true') {
|
|
42
|
+
throw new Error('Delete operations are disabled. Set POWERPLATFORM_ENABLE_DELETE=true to enable.');
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
checkActionsEnabled() {
|
|
46
|
+
if (process.env.POWERPLATFORM_ENABLE_ACTIONS !== 'true') {
|
|
47
|
+
throw new Error('Action execution is disabled. Set POWERPLATFORM_ENABLE_ACTIONS=true to enable.');
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=context-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-factory.js","sourceRoot":"","sources":["../src/context-factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAuB,MAAM,2BAA2B,CAAC;AAKtF,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,IAAI,SAAS,GAAgC,OAAO,IAAI,IAAI,CAAC;IAE7D,SAAS,uBAAuB;QAC9B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,YAAY,GAAG;gBACnB,mBAAmB;gBACnB,yBAAyB;gBACzB,yBAAyB;aAC1B,CAAC;YACF,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,iDAAiD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzF,CAAC;YAED,MAAM,MAAM,GAAwB;gBAClC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAkB;gBAC/C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAwB;gBAC9C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B;gBACrD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAwB;aAC/C,CAAC;YAEF,SAAS,GAAG,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,KAAK,OAAO,uBAAuB,EAAE,CAAC,CAAC,CAAC;QAC9C,kBAAkB;YAChB,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,MAAM,EAAE,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;QACD,kBAAkB;YAChB,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,MAAM,EAAE,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;QACD,kBAAkB;YAChB,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,MAAM,EAAE,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;QACD,mBAAmB;YACjB,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,KAAK,MAAM,EAAE,CAAC;gBACxD,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;YACpG,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/build/index.d.ts
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @mcp-consultant-tools/powerplatform-data
|
|
4
|
+
*
|
|
5
|
+
* MCP server for PowerPlatform/Dataverse data CRUD operations.
|
|
6
|
+
* Entry point: MCP server startup + backward-compatible registerPowerplatformDataTools().
|
|
7
|
+
*/
|
|
2
8
|
import { PowerPlatformService } from './PowerPlatformService.js';
|
|
3
9
|
/**
|
|
4
|
-
* Register powerplatform-data tools with an MCP server
|
|
10
|
+
* Register powerplatform-data tools with an MCP server.
|
|
11
|
+
* Backward-compatible API for the meta package.
|
|
5
12
|
* @param server - MCP server instance
|
|
6
13
|
* @param service - Optional pre-initialized PowerPlatformService (for testing)
|
|
7
14
|
*/
|
|
8
15
|
export declare function registerPowerplatformDataTools(server: any, service?: PowerPlatformService): void;
|
|
16
|
+
export { PowerPlatformService } from './PowerPlatformService.js';
|
|
17
|
+
export type { PowerPlatformConfig } from './PowerPlatformService.js';
|
|
18
|
+
export type { ServiceContext } from './types.js';
|
|
9
19
|
//# sourceMappingURL=index.d.ts.map
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAMH,OAAO,EAAE,oBAAoB,EAAuB,MAAM,2BAA2B,CAAC;AA6DtF;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAGhG;AAGD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|