mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-16 09:36:44 +00:00
feat(core): Allow filtering workflows by availableInMCP (#18646)
This commit is contained in:
@@ -435,6 +435,30 @@ export class WorkflowRepository extends Repository<WorkflowEntity> {
|
||||
this.applyTagsFilter(qb, filter);
|
||||
this.applyProjectFilter(qb, filter);
|
||||
this.applyParentFolderFilter(qb, filter);
|
||||
this.applyAvailableInMCPFilter(qb, filter);
|
||||
}
|
||||
|
||||
private applyAvailableInMCPFilter(
|
||||
qb: SelectQueryBuilder<WorkflowEntity>,
|
||||
filter: ListQuery.Options['filter'],
|
||||
): void {
|
||||
if (typeof filter?.availableInMCP === 'boolean') {
|
||||
const dbType = this.globalConfig.database.type;
|
||||
|
||||
if (['postgresdb'].includes(dbType)) {
|
||||
qb.andWhere("workflow.settings ->> 'availableInMCP' = :availableInMCP", {
|
||||
availableInMCP: filter.availableInMCP.toString(),
|
||||
});
|
||||
} else if (['mysqldb', 'mariadb'].includes(dbType)) {
|
||||
qb.andWhere("JSON_EXTRACT(workflow.settings, '$.availableInMCP') = :availableInMCP", {
|
||||
availableInMCP: filter.availableInMCP,
|
||||
});
|
||||
} else if (dbType === 'sqlite') {
|
||||
qb.andWhere("JSON_EXTRACT(workflow.settings, '$.availableInMCP') = :availableInMCP", {
|
||||
availableInMCP: filter.availableInMCP ? 1 : 0, // SQLite stores booleans as 0/1
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private applyNameFilter(
|
||||
|
||||
@@ -35,6 +35,11 @@ export class WorkflowFilter extends BaseFilter {
|
||||
@Expose()
|
||||
parentFolderId?: string;
|
||||
|
||||
@IsBoolean()
|
||||
@IsOptional()
|
||||
@Expose()
|
||||
availableInMCP?: boolean;
|
||||
|
||||
static async fromString(rawFilter: string) {
|
||||
return await this.toFilter(rawFilter, WorkflowFilter);
|
||||
}
|
||||
|
||||
@@ -53,6 +53,7 @@ export declare namespace WorkflowRequest {
|
||||
includeScopes?: string;
|
||||
includeFolders?: string;
|
||||
onlySharedWithMe?: string;
|
||||
availableInMCP?: string;
|
||||
}
|
||||
> & {
|
||||
listQueryOptions: ListQuery.Options;
|
||||
|
||||
@@ -859,6 +859,21 @@ describe('GET /workflows', () => {
|
||||
});
|
||||
});
|
||||
|
||||
test('should filter workflows by field: availableInMCP', async () => {
|
||||
const workflow1 = await createWorkflow({ settings: { availableInMCP: true } }, owner);
|
||||
await createWorkflow({ settings: {} }, owner);
|
||||
|
||||
const response = await authOwnerAgent
|
||||
.get('/workflows')
|
||||
.query('filter={ "availableInMCP": true }')
|
||||
.expect(200);
|
||||
|
||||
expect(response.body).toEqual({
|
||||
count: 1,
|
||||
data: [objectContaining({ id: workflow1.id })],
|
||||
});
|
||||
});
|
||||
|
||||
test('should filter workflows by field: tags (AND operator)', async () => {
|
||||
const workflow1 = await createWorkflow({ name: 'First' }, owner);
|
||||
const workflow2 = await createWorkflow({ name: 'Second' }, owner);
|
||||
|
||||
@@ -2604,6 +2604,7 @@ export interface IWorkflowSettings {
|
||||
executionTimeout?: number;
|
||||
executionOrder?: 'v0' | 'v1';
|
||||
timeSavedPerExecution?: number;
|
||||
availableInMCP?: boolean;
|
||||
}
|
||||
|
||||
export interface WorkflowFEMeta {
|
||||
|
||||
Reference in New Issue
Block a user