@@ -581,3 +581,254 @@ async def empty_tags():
581
581
exclude_tags_mcp = FastApiMCP (app , exclude_tags = ["items" ])
582
582
assert len (exclude_tags_mcp .tools ) == 1
583
583
assert {tool .name for tool in exclude_tags_mcp .tools } == {"empty_tags" }
584
+
585
+
586
+ def test_ignore_deprecated_default_behavior (simple_fastapi_app : FastAPI ):
587
+ """Test that deprecated operations are ignored by default in FastApiMCP."""
588
+
589
+ # Add deprecated operations to the simple app
590
+ @simple_fastapi_app .get (
591
+ "/deprecated/items/" ,
592
+ response_model = list ,
593
+ tags = ["deprecated" ],
594
+ operation_id = "list_deprecated_items" ,
595
+ deprecated = True ,
596
+ )
597
+ async def list_deprecated_items ():
598
+ """[DEPRECATED] List all items (deprecated version)."""
599
+ return []
600
+
601
+ @simple_fastapi_app .get (
602
+ "/deprecated/items/{item_id}" ,
603
+ response_model = dict ,
604
+ tags = ["deprecated" ],
605
+ operation_id = "get_deprecated_item" ,
606
+ deprecated = True ,
607
+ )
608
+ async def get_deprecated_item (item_id : int ):
609
+ """[DEPRECATED] Get a specific item by its ID (deprecated version)."""
610
+ return {"id" : item_id }
611
+
612
+ @simple_fastapi_app .post (
613
+ "/deprecated/items/" ,
614
+ response_model = dict ,
615
+ tags = ["deprecated" ],
616
+ operation_id = "create_deprecated_item" ,
617
+ deprecated = True ,
618
+ )
619
+ async def create_deprecated_item ():
620
+ """[DEPRECATED] Create a new item in the database (deprecated version)."""
621
+ return {"id" : 1 }
622
+
623
+ mcp_server = FastApiMCP (simple_fastapi_app )
624
+
625
+ # Should include regular operations but exclude deprecated ones
626
+ expected_operations = ["list_items" , "get_item" , "create_item" , "update_item" , "delete_item" , "raise_error" ]
627
+ deprecated_operations = ["list_deprecated_items" , "get_deprecated_item" , "create_deprecated_item" ]
628
+
629
+ assert len (mcp_server .tools ) == len (expected_operations )
630
+ assert len (mcp_server .operation_map ) == len (expected_operations )
631
+
632
+ for op in expected_operations :
633
+ assert op in mcp_server .operation_map
634
+
635
+ for op in deprecated_operations :
636
+ assert op not in mcp_server .operation_map
637
+
638
+ for tool in mcp_server .tools :
639
+ assert tool .name in expected_operations
640
+ assert tool .name not in deprecated_operations
641
+
642
+
643
+ def test_ignore_deprecated_false (simple_fastapi_app : FastAPI ):
644
+ """Test that deprecated operations are included when ignore_deprecated=False."""
645
+
646
+ # Add deprecated operations to the simple app
647
+ @simple_fastapi_app .get (
648
+ "/deprecated/items/" ,
649
+ response_model = list ,
650
+ tags = ["deprecated" ],
651
+ operation_id = "list_deprecated_items" ,
652
+ deprecated = True ,
653
+ )
654
+ async def list_deprecated_items ():
655
+ """[DEPRECATED] List all items (deprecated version)."""
656
+ return []
657
+
658
+ @simple_fastapi_app .get (
659
+ "/deprecated/items/{item_id}" ,
660
+ response_model = dict ,
661
+ tags = ["deprecated" ],
662
+ operation_id = "get_deprecated_item" ,
663
+ deprecated = True ,
664
+ )
665
+ async def get_deprecated_item (item_id : int ):
666
+ """[DEPRECATED] Get a specific item by its ID (deprecated version)."""
667
+ return {"id" : item_id }
668
+
669
+ @simple_fastapi_app .post (
670
+ "/deprecated/items/" ,
671
+ response_model = dict ,
672
+ tags = ["deprecated" ],
673
+ operation_id = "create_deprecated_item" ,
674
+ deprecated = True ,
675
+ )
676
+ async def create_deprecated_item ():
677
+ """[DEPRECATED] Create a new item in the database (deprecated version)."""
678
+ return {"id" : 1 }
679
+
680
+ mcp_server = FastApiMCP (simple_fastapi_app , ignore_deprecated = False )
681
+
682
+ # Should include both regular and deprecated operations
683
+ expected_operations = ["list_items" , "get_item" , "create_item" , "update_item" , "delete_item" , "raise_error" ]
684
+ deprecated_operations = ["list_deprecated_items" , "get_deprecated_item" , "create_deprecated_item" ]
685
+ all_operations = expected_operations + deprecated_operations
686
+
687
+ assert len (mcp_server .tools ) == len (all_operations )
688
+ assert len (mcp_server .operation_map ) == len (all_operations )
689
+
690
+ for op in all_operations :
691
+ assert op in mcp_server .operation_map
692
+
693
+ for tool in mcp_server .tools :
694
+ assert tool .name in all_operations
695
+
696
+
697
+ def test_ignore_deprecated_true_explicit (simple_fastapi_app : FastAPI ):
698
+ """Test that deprecated operations are excluded when ignore_deprecated=True explicitly."""
699
+
700
+ # Add deprecated operations to the simple app
701
+ @simple_fastapi_app .get (
702
+ "/deprecated/items/" ,
703
+ response_model = list ,
704
+ tags = ["deprecated" ],
705
+ operation_id = "list_deprecated_items" ,
706
+ deprecated = True ,
707
+ )
708
+ async def list_deprecated_items ():
709
+ """[DEPRECATED] List all items (deprecated version)."""
710
+ return []
711
+
712
+ @simple_fastapi_app .get (
713
+ "/deprecated/items/{item_id}" ,
714
+ response_model = dict ,
715
+ tags = ["deprecated" ],
716
+ operation_id = "get_deprecated_item" ,
717
+ deprecated = True ,
718
+ )
719
+ async def get_deprecated_item (item_id : int ):
720
+ """[DEPRECATED] Get a specific item by its ID (deprecated version)."""
721
+ return {"id" : item_id }
722
+
723
+ @simple_fastapi_app .post (
724
+ "/deprecated/items/" ,
725
+ response_model = dict ,
726
+ tags = ["deprecated" ],
727
+ operation_id = "create_deprecated_item" ,
728
+ deprecated = True ,
729
+ )
730
+ async def create_deprecated_item ():
731
+ """[DEPRECATED] Create a new item in the database (deprecated version)."""
732
+ return {"id" : 1 }
733
+
734
+ mcp_server = FastApiMCP (simple_fastapi_app , ignore_deprecated = True )
735
+
736
+ # Should include regular operations but exclude deprecated ones
737
+ expected_operations = ["list_items" , "get_item" , "create_item" , "update_item" , "delete_item" , "raise_error" ]
738
+ deprecated_operations = ["list_deprecated_items" , "get_deprecated_item" , "create_deprecated_item" ]
739
+
740
+ assert len (mcp_server .tools ) == len (expected_operations )
741
+ assert len (mcp_server .operation_map ) == len (expected_operations )
742
+
743
+ for op in expected_operations :
744
+ assert op in mcp_server .operation_map
745
+
746
+ for op in deprecated_operations :
747
+ assert op not in mcp_server .operation_map
748
+
749
+ for tool in mcp_server .tools :
750
+ assert tool .name in expected_operations
751
+ assert tool .name not in deprecated_operations
752
+
753
+
754
+ def test_ignore_deprecated_with_no_deprecated_operations (simple_fastapi_app : FastAPI ):
755
+ """Test that ignore_deprecated works correctly when there are no deprecated operations."""
756
+ mcp_server_ignore_true = FastApiMCP (simple_fastapi_app , ignore_deprecated = True )
757
+ mcp_server_ignore_false = FastApiMCP (simple_fastapi_app , ignore_deprecated = False )
758
+
759
+ # Both should return the same results when there are no deprecated operations
760
+ assert len (mcp_server_ignore_true .tools ) == len (mcp_server_ignore_false .tools )
761
+ assert len (mcp_server_ignore_true .operation_map ) == len (mcp_server_ignore_false .operation_map )
762
+
763
+ expected_operations = ["list_items" , "get_item" , "create_item" , "update_item" , "delete_item" , "raise_error" ]
764
+
765
+ for op in expected_operations :
766
+ assert op in mcp_server_ignore_true .operation_map
767
+ assert op in mcp_server_ignore_false .operation_map
768
+
769
+ for tool in mcp_server_ignore_true .tools :
770
+ assert tool .name in expected_operations
771
+
772
+ for tool in mcp_server_ignore_false .tools :
773
+ assert tool .name in expected_operations
774
+
775
+
776
+ def test_ignore_deprecated_combined_with_filtering (simple_fastapi_app : FastAPI ):
777
+ """Test that ignore_deprecated works correctly when combined with other filtering options."""
778
+
779
+ # Add deprecated operations to the simple app
780
+ @simple_fastapi_app .get (
781
+ "/deprecated/items/" ,
782
+ response_model = list ,
783
+ tags = ["deprecated" ],
784
+ operation_id = "list_deprecated_items" ,
785
+ deprecated = True ,
786
+ )
787
+ async def list_deprecated_items ():
788
+ """[DEPRECATED] List all items (deprecated version)."""
789
+ return []
790
+
791
+ @simple_fastapi_app .get (
792
+ "/deprecated/items/{item_id}" ,
793
+ response_model = dict ,
794
+ tags = ["deprecated" ],
795
+ operation_id = "get_deprecated_item" ,
796
+ deprecated = True ,
797
+ )
798
+ async def get_deprecated_item (item_id : int ):
799
+ """[DEPRECATED] Get a specific item by its ID (deprecated version)."""
800
+ return {"id" : item_id }
801
+
802
+ @simple_fastapi_app .post (
803
+ "/deprecated/items/" ,
804
+ response_model = dict ,
805
+ tags = ["deprecated" ],
806
+ operation_id = "create_deprecated_item" ,
807
+ deprecated = True ,
808
+ )
809
+ async def create_deprecated_item ():
810
+ """[DEPRECATED] Create a new item in the database (deprecated version)."""
811
+ return {"id" : 1 }
812
+
813
+ # Test with include_operations
814
+ mcp_server = FastApiMCP (
815
+ simple_fastapi_app , ignore_deprecated = True , include_operations = ["list_items" , "get_deprecated_item" ]
816
+ )
817
+
818
+ # Should only include list_items since get_deprecated_item is deprecated and ignored
819
+ assert len (mcp_server .tools ) == 1
820
+ assert "list_items" in mcp_server .operation_map
821
+ assert "get_deprecated_item" not in mcp_server .operation_map
822
+
823
+ # Test with include_tags
824
+ mcp_server = FastApiMCP (simple_fastapi_app , ignore_deprecated = True , include_tags = ["deprecated" ])
825
+
826
+ # Should not include any deprecated operations
827
+ assert len (mcp_server .tools ) == 0
828
+
829
+ # Test with exclude_tags
830
+ mcp_server = FastApiMCP (simple_fastapi_app , ignore_deprecated = True , exclude_tags = ["items" ])
831
+
832
+ # Should only include raise_error since items are excluded and deprecated are ignored
833
+ assert len (mcp_server .tools ) == 1
834
+ assert "raise_error" in mcp_server .operation_map
0 commit comments