@@ -529,3 +529,209 @@ async def test_cross_user_mcp_server_access_prevention(
529529
530530 response_two = await client .get (f"/api/v2/mcp/servers/{ server_name } " , headers = {"x-api-key" : user_two_api_key })
531531 assert response_two .json () is None
532+
533+
534+ class TestMCPWithDefaultFolderName :
535+ """Test MCP configuration with different DEFAULT_FOLDER_NAME values."""
536+
537+ @pytest .mark .asyncio
538+ async def test_mcp_finds_default_folder_standard_mode (self , client : AsyncClient ): # noqa: ARG002
539+ """Test that MCP finds the correct folder in standard mode (Starter Project)."""
540+ user_id = uuid4 ()
541+ project_id = uuid4 ()
542+ flow_id = uuid4 ()
543+
544+ async with session_scope () as session :
545+ # Create user
546+ user = User (id = user_id , username = f"test_default_folder_{ user_id } " , password = "hashed_password" ) # noqa: S106
547+ session .add (user )
548+
549+ # Create folder with DEFAULT_FOLDER_NAME (should match current setting)
550+ folder = Folder (id = project_id , name = DEFAULT_FOLDER_NAME , user_id = user_id , description = "Test folder" )
551+ session .add (folder )
552+
553+ # Create flow in folder
554+ flow = Flow (
555+ id = flow_id ,
556+ name = "Test Flow" ,
557+ description = "A test flow" ,
558+ folder_id = project_id ,
559+ user_id = user_id ,
560+ is_component = False ,
561+ mcp_enabled = None ,
562+ )
563+ session .add (flow )
564+
565+ await session .commit ()
566+
567+ try :
568+ async with session_scope () as session :
569+ from langflow .services .deps import get_settings_service
570+
571+ settings_service = get_settings_service ()
572+ original_setting = settings_service .settings .add_projects_to_mcp_servers
573+
574+ try :
575+ settings_service .settings .add_projects_to_mcp_servers = True
576+ await auto_configure_starter_projects_mcp (session )
577+
578+ # Verify folder was found and processed
579+ updated_folder = await session .get (Folder , project_id )
580+ assert updated_folder is not None
581+ assert updated_folder .name == DEFAULT_FOLDER_NAME
582+
583+ finally :
584+ settings_service .settings .add_projects_to_mcp_servers = original_setting
585+
586+ finally :
587+ # Cleanup
588+ async with session_scope () as session :
589+ flow_to_delete = await session .get (Flow , flow_id )
590+ if flow_to_delete :
591+ await session .delete (flow_to_delete )
592+ folder_to_delete = await session .get (Folder , project_id )
593+ if folder_to_delete :
594+ await session .delete (folder_to_delete )
595+ user_to_delete = await session .get (User , user_id )
596+ if user_to_delete :
597+ await session .delete (user_to_delete )
598+ await session .commit ()
599+
600+ @pytest .mark .asyncio
601+ async def test_mcp_with_legacy_folder_after_migration (self , client : AsyncClient ): # noqa: ARG002
602+ """Test that MCP finds migrated folders after setting custom DEFAULT_FOLDER_NAME."""
603+ user_id = uuid4 ()
604+ project_id = uuid4 ()
605+ flow_id = uuid4 ()
606+
607+ # Only run this test when DEFAULT_FOLDER_NAME is set to custom value (e.g., "OpenRAG")
608+ if DEFAULT_FOLDER_NAME in ["Starter Project" , "My Collection" ]:
609+ pytest .skip ("Test only applicable when DEFAULT_FOLDER_NAME is set to custom value" )
610+
611+ async with session_scope () as session :
612+ # Create user
613+ user = User (id = user_id , username = f"test_migrated_{ user_id } " , password = "hashed_password" ) # noqa: S106
614+ session .add (user )
615+
616+ # Create folder with legacy name that will be migrated
617+ legacy_folder = Folder (id = project_id , name = "Starter Project" , user_id = user_id , description = "Legacy folder" )
618+ session .add (legacy_folder )
619+
620+ # Create flow in folder
621+ flow = Flow (
622+ id = flow_id ,
623+ name = "Test Flow in Legacy Folder" ,
624+ description = "A test flow" ,
625+ folder_id = project_id ,
626+ user_id = user_id ,
627+ is_component = False ,
628+ mcp_enabled = None ,
629+ )
630+ session .add (flow )
631+
632+ await session .commit ()
633+
634+ try :
635+ # Trigger migration by calling get_or_create_default_folder
636+ from langflow .initial_setup .setup import get_or_create_default_folder
637+
638+ async with session_scope () as session :
639+ migrated_folder = await get_or_create_default_folder (session , user_id )
640+ assert migrated_folder .name == DEFAULT_FOLDER_NAME
641+ assert migrated_folder .id == project_id # Same folder, renamed
642+
643+ # Now test that MCP can find the migrated folder
644+ async with session_scope () as session :
645+ from langflow .services .deps import get_settings_service
646+
647+ settings_service = get_settings_service ()
648+ original_setting = settings_service .settings .add_projects_to_mcp_servers
649+
650+ try :
651+ settings_service .settings .add_projects_to_mcp_servers = True
652+ await auto_configure_starter_projects_mcp (session )
653+
654+ # Verify MCP found the migrated folder
655+ updated_folder = await session .get (Folder , project_id )
656+ assert updated_folder is not None
657+ assert updated_folder .name == DEFAULT_FOLDER_NAME
658+
659+ finally :
660+ settings_service .settings .add_projects_to_mcp_servers = original_setting
661+
662+ finally :
663+ # Cleanup
664+ async with session_scope () as session :
665+ flow_to_delete = await session .get (Flow , flow_id )
666+ if flow_to_delete :
667+ await session .delete (flow_to_delete )
668+ folder_to_delete = await session .get (Folder , project_id )
669+ if folder_to_delete :
670+ await session .delete (folder_to_delete )
671+ user_to_delete = await session .get (User , user_id )
672+ if user_to_delete :
673+ await session .delete (user_to_delete )
674+ await session .commit ()
675+
676+ @pytest .mark .asyncio
677+ async def test_mcp_skips_wrong_folder_name (self , client : AsyncClient ): # noqa: ARG002
678+ """Test that MCP skips folders that don't match DEFAULT_FOLDER_NAME."""
679+ user_id = uuid4 ()
680+ project_id = uuid4 ()
681+ flow_id = uuid4 ()
682+
683+ async with session_scope () as session :
684+ # Create user
685+ user = User (id = user_id , username = f"test_wrong_folder_{ user_id } " , password = "hashed_password" ) # noqa: S106
686+ session .add (user )
687+
688+ # Create folder with different name
689+ folder = Folder (id = project_id , name = "Some Other Folder" , user_id = user_id , description = "Wrong folder" )
690+ session .add (folder )
691+
692+ # Create flow in folder
693+ flow = Flow (
694+ id = flow_id ,
695+ name = "Test Flow" ,
696+ description = "A test flow" ,
697+ folder_id = project_id ,
698+ user_id = user_id ,
699+ is_component = False ,
700+ mcp_enabled = None ,
701+ )
702+ session .add (flow )
703+
704+ await session .commit ()
705+
706+ try :
707+ async with session_scope () as session :
708+ from langflow .services .deps import get_settings_service
709+
710+ settings_service = get_settings_service ()
711+ original_setting = settings_service .settings .add_projects_to_mcp_servers
712+
713+ try :
714+ settings_service .settings .add_projects_to_mcp_servers = True
715+ # Should not raise an error, just skip this user
716+ await auto_configure_starter_projects_mcp (session )
717+
718+ # Verify flow was NOT configured (still None or False)
719+ updated_flow = await session .get (Flow , flow_id )
720+ assert updated_flow .mcp_enabled in [None , False ]
721+
722+ finally :
723+ settings_service .settings .add_projects_to_mcp_servers = original_setting
724+
725+ finally :
726+ # Cleanup
727+ async with session_scope () as session :
728+ flow_to_delete = await session .get (Flow , flow_id )
729+ if flow_to_delete :
730+ await session .delete (flow_to_delete )
731+ folder_to_delete = await session .get (Folder , project_id )
732+ if folder_to_delete :
733+ await session .delete (folder_to_delete )
734+ user_to_delete = await session .get (User , user_id )
735+ if user_to_delete :
736+ await session .delete (user_to_delete )
737+ await session .commit ()
0 commit comments