@@ -11,11 +11,13 @@ vi.mock('@/lib/mcp/workflow-mcp-sync', () => ({
1111 generateParameterSchemaForWorkflow : vi . fn ( ) . mockResolvedValue ( { type : 'object' , properties : { } } ) ,
1212} ) )
1313
14+ import { OrchestrationError } from '@/lib/core/orchestration/types'
1415import { MAX_MCP_PARAMETER_SCHEMA_BYTES , MAX_MCP_TOOLS_PER_SERVER } from '@/lib/mcp/constants'
1516import {
1617 performCreateWorkflowMcpServer ,
1718 performUpdateWorkflowMcpTool ,
1819} from '@/lib/mcp/orchestration/workflow-mcp-lifecycle'
20+ import { generateParameterSchemaForWorkflow } from '@/lib/mcp/workflow-mcp-sync'
1921import { hasValidStartBlock } from '@/lib/workflows/triggers/utils.server'
2022
2123describe ( 'workflow MCP lifecycle orchestration' , ( ) => {
@@ -97,6 +99,36 @@ describe('workflow MCP lifecycle orchestration', () => {
9799 expect ( dbChainMockFns . insert ) . not . toHaveBeenCalled ( )
98100 } )
99101
102+ it ( 'answers an unpublishable workflow input as a validation failure naming the field' , async ( ) => {
103+ const message =
104+ 'Workflow input "payload" has unsupported type "integer". Use one of: string, number.'
105+ vi . mocked ( hasValidStartBlock ) . mockResolvedValueOnce ( true )
106+ vi . mocked ( generateParameterSchemaForWorkflow ) . mockRejectedValueOnce (
107+ new OrchestrationError ( 'validation' , message )
108+ )
109+ dbChainMockFns . where . mockResolvedValueOnce ( [
110+ {
111+ id : 'wf-1' ,
112+ name : 'Workflow' ,
113+ description : null ,
114+ isDeployed : true ,
115+ workspaceId : 'workspace-1' ,
116+ deployedAt : new Date ( '2026-01-01T00:00:00Z' ) ,
117+ updatedAt : new Date ( '2026-01-01T00:00:00Z' ) ,
118+ } ,
119+ ] )
120+
121+ const result = await performCreateWorkflowMcpServer ( {
122+ workspaceId : 'workspace-1' ,
123+ userId : 'user-1' ,
124+ name : 'Server' ,
125+ workflowIds : [ 'wf-1' ] ,
126+ } )
127+
128+ expect ( result ) . toEqual ( { success : false , error : message , errorCode : 'validation' } )
129+ expect ( dbChainMockFns . insert ) . not . toHaveBeenCalled ( )
130+ } )
131+
100132 it ( 'rejects workflow MCP server fan-out above the per-workflow limit' , async ( ) => {
101133 vi . mocked ( hasValidStartBlock ) . mockResolvedValueOnce ( true )
102134 dbChainMockFns . where . mockResolvedValueOnce ( [
0 commit comments