1+ import json
2+ from typing import Union
3+
14from redis .exceptions import RedisError
2- from redis . typing import EncodableT
5+ from redis import Redis
36
47from src .common .connection import RedisConnectionManager
58from src .common .server import mcp
69
710
811@mcp .tool ()
9- async def set (key : str , value : EncodableT , expiration : int = None ) -> str :
12+ async def set (key : str , value : Union [ str , bytes , int , float , dict ] , expiration : int = None ) -> str :
1013 """Set a Redis string value with an optional expiration time.
1114
1215 Args:
@@ -17,12 +20,23 @@ async def set(key: str, value: EncodableT, expiration: int = None) -> str:
1720 Returns:
1821 str: Confirmation message or an error message.
1922 """
23+ if isinstance (value , bytes ):
24+ encoded_value = value
25+ elif isinstance (value , dict ):
26+ encoded_value = json .dumps (value )
27+ else :
28+ encoded_value = str (value )
29+
30+ if isinstance (encoded_value , str ):
31+ encoded_value = encoded_value .encode ("utf-8" )
32+
2033 try :
21- r = RedisConnectionManager .get_connection ()
34+ r : Redis = RedisConnectionManager .get_connection ()
2235 if expiration :
23- r .setex (key , expiration , value )
36+ r .setex (key , expiration , encoded_value )
2437 else :
25- r .set (key , value )
38+ r .set (key , encoded_value )
39+
2640 return f"Successfully set { key } " + (
2741 f" with expiration { expiration } seconds" if expiration else ""
2842 )
@@ -31,7 +45,7 @@ async def set(key: str, value: EncodableT, expiration: int = None) -> str:
3145
3246
3347@mcp .tool ()
34- async def get (key : str ) -> str :
48+ async def get (key : str ) -> Union [ str , bytes ] :
3549 """Get a Redis string value.
3650
3751 Args:
@@ -43,6 +57,17 @@ async def get(key: str) -> str:
4357 try :
4458 r = RedisConnectionManager .get_connection ()
4559 value = r .get (key )
46- return value if value else f"Key { key } does not exist"
60+
61+ if value is None :
62+ return f"Key { key } does not exist"
63+
64+ if isinstance (value , bytes ):
65+ try :
66+ text = value .decode ("utf-8" )
67+ return text
68+ except UnicodeDecodeError :
69+ return value
70+
71+ return value
4772 except RedisError as e :
4873 return f"Error retrieving key { key } : { str (e )} "
0 commit comments