Skip to content

Commit 8fe526f

Browse files
committed
Support dynamic list for mcp tool
1 parent a7bb16d commit 8fe526f

File tree

18 files changed

+133
-36
lines changed

18 files changed

+133
-36
lines changed

apps/Standalone/src/designer/app/AzureLogicAppsDesigner/laDesigner.tsx

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,20 +141,40 @@ const DesignerEditor = () => {
141141
addOrUpdateAppSettings(connectionAndSetting.settings, settingsData?.properties ?? {});
142142
};
143143

144-
const getConnectionConfiguration = async (connectionId: string): Promise<any> => {
144+
const getConnectionConfiguration = async (connectionId: string, _manifest: any, useMcpConnections?: boolean): Promise<any> => {
145145
if (!connectionId) {
146146
return Promise.resolve();
147147
}
148148

149149
const connectionName = connectionId.split('/').splice(-1)[0];
150-
const connectionInfo =
151-
connectionsData?.serviceProviderConnections?.[connectionName] ?? connectionsData?.apiManagementConnections?.[connectionName];
150+
let connectionInfo: any;
151+
let isAgentMcpConnection = false;
152+
153+
if (useMcpConnections) {
154+
connectionInfo = connectionsData?.agentMcpConnections?.[connectionName];
155+
156+
if (connectionInfo) {
157+
isAgentMcpConnection = true;
158+
}
159+
160+
connectionInfo = connectionInfo ?? connectionsData?.managedApiConnections?.[connectionName];
161+
} else {
162+
connectionInfo =
163+
connectionsData?.serviceProviderConnections?.[connectionName] ?? connectionsData?.apiManagementConnections?.[connectionName];
164+
}
152165

153166
if (connectionInfo) {
154167
// TODO(psamband): Add new settings in this blade so that we do not resolve all the appsettings in the connectionInfo.
155168
const resolvedConnectionInfo = resolveConnectionsReferences(JSON.stringify(connectionInfo), {}, settingsData?.properties);
156169
delete resolvedConnectionInfo.displayName;
157170

171+
if (useMcpConnections) {
172+
return {
173+
isAgentMcpConnection,
174+
connection: resolvedConnectionInfo,
175+
};
176+
}
177+
158178
return {
159179
connection: resolvedConnectionInfo,
160180
};
@@ -627,6 +647,7 @@ const getDesignerServices = (
627647
});
628648
const connectorService = new StandardConnectorService({
629649
...defaultServiceParams,
650+
workflowName,
630651
clientSupportedOperations: [
631652
['connectionProviders/localWorkflowOperation', 'invokeWorkflow'],
632653
['connectionProviders/xmlOperations', 'xmlValidation'],

apps/Standalone/src/designer/app/AzureLogicAppsDesigner/laDesignerV2.tsx

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,20 +156,40 @@ const DesignerEditor = () => {
156156
setIsDraftMode(draftMode);
157157
}, []);
158158

159-
const getConnectionConfiguration = async (connectionId: string): Promise<any> => {
159+
const getConnectionConfiguration = async (connectionId: string, _manifest: any, useMcpConnections?: boolean): Promise<any> => {
160160
if (!connectionId) {
161161
return Promise.resolve();
162162
}
163163

164164
const connectionName = connectionId.split('/').splice(-1)[0];
165-
const connectionInfo =
166-
connectionsData?.serviceProviderConnections?.[connectionName] ?? connectionsData?.apiManagementConnections?.[connectionName];
165+
let connectionInfo: any;
166+
let isAgentMcpConnection = false;
167+
168+
if (useMcpConnections) {
169+
connectionInfo = connectionsData?.agentMcpConnections?.[connectionName];
170+
171+
if (connectionInfo) {
172+
isAgentMcpConnection = true;
173+
}
174+
175+
connectionInfo = connectionInfo ?? connectionsData?.managedApiConnections?.[connectionName];
176+
} else {
177+
connectionInfo =
178+
connectionsData?.serviceProviderConnections?.[connectionName] ?? connectionsData?.apiManagementConnections?.[connectionName];
179+
}
167180

168181
if (connectionInfo) {
169182
// TODO(psamband): Add new settings in this blade so that we do not resolve all the appsettings in the connectionInfo.
170183
const resolvedConnectionInfo = resolveConnectionsReferences(JSON.stringify(connectionInfo), {}, settingsData?.properties);
171184
delete resolvedConnectionInfo.displayName;
172185

186+
if (useMcpConnections) {
187+
return {
188+
isAgentMcpConnection,
189+
connection: resolvedConnectionInfo,
190+
};
191+
}
192+
173193
return {
174194
connection: resolvedConnectionInfo,
175195
};
@@ -578,7 +598,7 @@ const DesignerEditor = () => {
578598
options={{
579599
services,
580600
isDarkMode,
581-
readOnly: isReadOnly || isMonitoringView || !isDraftMode,
601+
readOnly: isReadOnly || isMonitoringView,
582602
isMonitoringView,
583603
isDraft: isDraftMode,
584604
isUnitTest,
@@ -771,6 +791,7 @@ const getDesignerServices = (
771791
});
772792
const connectorService = new StandardConnectorService({
773793
...defaultServiceParams,
794+
workflowName,
774795
clientSupportedOperations: [
775796
['connectionProviders/localWorkflowOperation', 'invokeWorkflow'],
776797
['connectionProviders/xmlOperations', 'xmlValidation'],

apps/Standalone/src/mcp/app/McpStandard.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ const getResourceBasedServices = (
240240

241241
const connectorService = new StandardConnectorService({
242242
...defaultServiceParams,
243+
workflowName: '',
243244
clientSupportedOperations: [],
244245
getConfiguration: () => Promise.resolve({}),
245246
schemaClient: {},

apps/Standalone/src/templates/app/TemplatesStandard.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,7 @@ const getResourceBasedServices = (
524524
});
525525
const connectorService = new StandardConnectorService({
526526
...defaultServiceParams,
527+
workflowName: '',
527528
clientSupportedOperations: [
528529
['connectionProviders/localWorkflowOperation', 'invokeWorkflow'],
529530
['connectionProviders/xmlOperations', 'xmlValidation'],

libs/designer-v2/src/lib/core/actions/bjsworkflow/__test__/operationdeserializer.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ describe('operationdeserializer', () => {
249249
operationId: 'test-operation',
250250
type: 'McpClientTool',
251251
kind: 'Managed',
252+
operationPath: '/servers/filesystem',
252253
}),
253254
})
254255
);

libs/designer-v2/src/lib/core/actions/bjsworkflow/operationdeserializer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ export const initializeOperationDetailsForManagedMcpServer = async (
273273
};
274274
const builtinMcpServerManifest = await getOperationManifest(builtinMcpServerOperationInfo);
275275

276-
const operationInfo = { connectorId, operationId, type: operation.type, kind: operation.kind };
276+
const operationInfo = { connectorId, operationId, type: operation.type, kind: operation.kind, operationPath: mcpServerPath };
277277
dispatch(initializeOperationInfo({ id: nodeId, ...operationInfo }));
278278

279279
const operationForParameters = {

libs/designer-v2/src/lib/core/queries/connector.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ export const getListDynamicValues = async (
105105
connectorId: string,
106106
operationId: string,
107107
parameters: Record<string, any>,
108-
dynamicState: any
108+
dynamicState: any,
109+
operationPath?: string
109110
): Promise<ListDynamicValue[]> => {
110111
const queryClient = getReactQueryClient();
111112
const service = ConnectorService();
@@ -119,7 +120,7 @@ export const getListDynamicValues = async (
119120
dynamicState.operationId?.toLowerCase(),
120121
getParametersKey({ ...dynamicState.parameters, ...parameters }),
121122
],
122-
() => service.getListDynamicValues(connectionId, connectorId, operationId, parameters, dynamicState)
123+
() => service.getListDynamicValues(connectionId, connectorId, operationId, parameters, dynamicState, undefined, operationPath)
123124
);
124125
};
125126

libs/designer-v2/src/lib/core/state/operation/operationMetadataSlice.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,8 +262,8 @@ export const operationMetadataSlice = createSlice({
262262
state.loadStatus.nodesInitialized = true;
263263
},
264264
initializeOperationInfo: (state, action: PayloadAction<AddNodeOperationPayload>) => {
265-
const { id, connectorId, operationId, type, kind } = action.payload;
266-
state.operationInfo[id] = { connectorId, operationId, type, kind };
265+
const { id, connectorId, operationId, type, kind, operationPath } = action.payload;
266+
state.operationInfo[id] = { connectorId, operationId, type, kind, operationPath };
267267
},
268268
initializeNodes: (state, action: PayloadAction<InitializeNodesPayload>) => {
269269
const { nodes, clearExisting = false } = action.payload;

libs/designer-v2/src/lib/core/utils/parameters/dynamicdata.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ export async function getDynamicValues(
118118
operationInfo.connectorId,
119119
operationInfo.operationId,
120120
operationParameters,
121-
dynamicState
121+
dynamicState,
122+
operationInfo.operationPath
122123
);
123124
}
124125
if (isLegacyDynamicValuesExtension(definition)) {

libs/designer/src/lib/core/actions/bjsworkflow/add.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import {
5050
UserPreferenceService,
5151
LoggerService,
5252
LogEntryLevel,
53+
removeConnectionPrefix,
5354
} from '@microsoft/logic-apps-shared';
5455
import type {
5556
Connection,
@@ -187,11 +188,17 @@ export const initializeOperationDetails = async (
187188

188189
if (isManagedMcpClient) {
189190
// managed mcp client ignores the swagger and uses a fixed set of parameters similar to manifest based native mcp client
190-
const { connector: swaggerConnector } = await getConnectorWithSwagger(connectorId);
191+
const { connector: swaggerConnector, parsedSwagger } = await getConnectorWithSwagger(connectorId);
191192
connector = swaggerConnector;
192193
const iconUri = getIconUriFromConnector(connector);
193194
const brandColor = getBrandColorFromConnector(connector);
194195

196+
const swaggerOperation = parsedSwagger.getOperationByOperationId(operationId);
197+
const operationPath = swaggerOperation ? removeConnectionPrefix(swaggerOperation.path) : undefined;
198+
if (operationPath) {
199+
dispatch(initializeOperationInfo({ id: nodeId, ...operationInfo, operationPath }));
200+
}
201+
195202
const nativeMcpOperationInfo = { connectorId: 'connectionProviders/mcpclient', operationId: 'nativemcpclient' };
196203
const nativeMcpManifest = await getOperationManifest(nativeMcpOperationInfo);
197204
isConnectionRequired = isConnectionRequiredForOperation(nativeMcpManifest);

0 commit comments

Comments
 (0)