1+ """
2+ Simple example of using FastAPI-MCP to add an MCP server to a FastAPI app.
3+ """
4+
5+ from fastapi import FastAPI , HTTPException , Query
6+ from pydantic import BaseModel
7+ from typing import List , Optional
8+
9+
10+ router = FastAPI ()
11+
12+
13+ class Item (BaseModel ):
14+ id : int
15+ name : str
16+ description : Optional [str ] = None
17+ price : float
18+ tags : List [str ] = []
19+
20+
21+ items_db : dict [int , Item ] = {}
22+
23+
24+ @router .get ("/items/" , response_model = List [Item ], tags = ["items" ], operation_id = "list_items" )
25+ async def list_items (skip : int = 0 , limit : int = 10 ):
26+ """
27+ List all items in the database.
28+
29+ Returns a list of items, with pagination support.
30+ """
31+ return list (items_db .values ())[skip : skip + limit ]
32+
33+
34+ @router .get ("/items/{item_id}" , response_model = Item , tags = ["items" ], operation_id = "get_item" )
35+ async def read_item (item_id : int ):
36+ """
37+ Get a specific item by its ID.
38+
39+ Raises a 404 error if the item does not exist.
40+ """
41+ if item_id not in items_db :
42+ raise HTTPException (status_code = 404 , detail = "Item not found" )
43+ return items_db [item_id ]
44+
45+
46+ @router .post ("/items/" , response_model = Item , tags = ["items" ], operation_id = "create_item" )
47+ async def create_item (item : Item ):
48+ """
49+ Create a new item in the database.
50+
51+ Returns the created item with its assigned ID.
52+ """
53+ items_db [item .id ] = item
54+ return item
55+
56+
57+ @router .put ("/items/{item_id}" , response_model = Item , tags = ["items" ], operation_id = "update_item" )
58+ async def update_item (item_id : int , item : Item ):
59+ """
60+ Update an existing item.
61+
62+ Raises a 404 error if the item does not exist.
63+ """
64+ if item_id not in items_db :
65+ raise HTTPException (status_code = 404 , detail = "Item not found" )
66+
67+ item .id = item_id
68+ items_db [item_id ] = item
69+ return item
70+
71+
72+ @router .delete ("/items/{item_id}" , tags = ["items" ], operation_id = "delete_item" )
73+ async def delete_item (item_id : int ):
74+ """
75+ Delete an item from the database.
76+
77+ Raises a 404 error if the item does not exist.
78+ """
79+ if item_id not in items_db :
80+ raise HTTPException (status_code = 404 , detail = "Item not found" )
81+
82+ del items_db [item_id ]
83+ return {"message" : "Item deleted successfully" }
84+
85+
86+ @router .get ("/items/search/" , response_model = List [Item ], tags = ["search" ], operation_id = "search_items" )
87+ async def search_items (
88+ q : Optional [str ] = Query (None , description = "Search query string" ),
89+ min_price : Optional [float ] = Query (None , description = "Minimum price" ),
90+ max_price : Optional [float ] = Query (None , description = "Maximum price" ),
91+ tags : List [str ] = Query ([], description = "Filter by tags" ),
92+ ):
93+ """
94+ Search for items with various filters.
95+
96+ Returns a list of items that match the search criteria.
97+ """
98+ results = list (items_db .values ())
99+
100+ if q :
101+ q = q .lower ()
102+ results = [
103+ item for item in results if q in item .name .lower () or (item .description and q in item .description .lower ())
104+ ]
105+
106+ if min_price is not None :
107+ results = [item for item in results if item .price >= min_price ]
108+ if max_price is not None :
109+ results = [item for item in results if item .price <= max_price ]
110+
111+ if tags :
112+ results = [item for item in results if all (tag in item .tags for tag in tags )]
113+
114+ return results
115+
116+
117+ sample_items = [
118+ Item (id = 1 , name = "Hammer" , description = "A tool for hammering nails" , price = 9.99 , tags = ["tool" , "hardware" ]),
119+ Item (id = 2 , name = "Screwdriver" , description = "A tool for driving screws" , price = 7.99 , tags = ["tool" , "hardware" ]),
120+ Item (id = 3 , name = "Wrench" , description = "A tool for tightening bolts" , price = 12.99 , tags = ["tool" , "hardware" ]),
121+ Item (id = 4 , name = "Saw" , description = "A tool for cutting wood" , price = 19.99 , tags = ["tool" , "hardware" , "cutting" ]),
122+ Item (id = 5 , name = "Drill" , description = "A tool for drilling holes" , price = 49.99 , tags = ["tool" , "hardware" , "power" ]),
123+ ]
124+ for item in sample_items :
125+ items_db [item .id ] = item
0 commit comments