1
1
import sys
2
2
import os
3
- import urllib .parse
4
3
import click
5
4
6
5
from src .common .connection import RedisConnectionManager
16
15
import src .tools .set
17
16
import src .tools .stream
18
17
import src .tools .pub_sub
19
- from src .common .config import MCP_TRANSPORT
18
+ from src .common .config import MCP_TRANSPORT , parse_redis_uri , set_redis_env_from_config
20
19
21
20
22
21
class RedisMCPServer :
@@ -26,89 +25,6 @@ def __init__(self):
26
25
def run (self ):
27
26
mcp .run (transport = MCP_TRANSPORT )
28
27
29
- def parse_redis_uri (uri : str ) -> dict :
30
- """Parse a Redis URI and return connection parameters."""
31
- parsed = urllib .parse .urlparse (uri )
32
-
33
- config = {}
34
-
35
- # Scheme determines SSL
36
- if parsed .scheme == 'rediss' :
37
- config ['ssl' ] = True
38
- elif parsed .scheme == 'redis' :
39
- config ['ssl' ] = False
40
- else :
41
- raise ValueError (f"Unsupported scheme: { parsed .scheme } " )
42
-
43
- # Host and port
44
- config ['host' ] = parsed .hostname or '127.0.0.1'
45
- config ['port' ] = parsed .port or 6379
46
-
47
- # Database
48
- if parsed .path and parsed .path != '/' :
49
- try :
50
- config ['db' ] = int (parsed .path .lstrip ('/' ))
51
- except ValueError :
52
- config ['db' ] = 0
53
- else :
54
- config ['db' ] = 0
55
-
56
- # Authentication
57
- if parsed .username :
58
- config ['username' ] = parsed .username
59
- if parsed .password :
60
- config ['password' ] = parsed .password
61
-
62
- # Parse query parameters for SSL and other options
63
- if parsed .query :
64
- query_params = urllib .parse .parse_qs (parsed .query )
65
-
66
- # Handle SSL parameters
67
- if 'ssl_cert_reqs' in query_params :
68
- config ['ssl_cert_reqs' ] = query_params ['ssl_cert_reqs' ][0 ]
69
- if 'ssl_ca_certs' in query_params :
70
- config ['ssl_ca_certs' ] = query_params ['ssl_ca_certs' ][0 ]
71
- if 'ssl_ca_path' in query_params :
72
- config ['ssl_ca_path' ] = query_params ['ssl_ca_path' ][0 ]
73
- if 'ssl_keyfile' in query_params :
74
- config ['ssl_keyfile' ] = query_params ['ssl_keyfile' ][0 ]
75
- if 'ssl_certfile' in query_params :
76
- config ['ssl_certfile' ] = query_params ['ssl_certfile' ][0 ]
77
-
78
- # Handle other parameters
79
- if 'db' in query_params :
80
- try :
81
- config ['db' ] = int (query_params ['db' ][0 ])
82
- except ValueError :
83
- pass
84
-
85
- return config
86
-
87
-
88
- def set_redis_env_from_config (config : dict ):
89
- """Set environment variables from Redis configuration."""
90
- env_mapping = {
91
- 'host' : 'REDIS_HOST' ,
92
- 'port' : 'REDIS_PORT' ,
93
- 'db' : 'REDIS_DB' ,
94
- 'username' : 'REDIS_USERNAME' ,
95
- 'password' : 'REDIS_PWD' ,
96
- 'ssl' : 'REDIS_SSL' ,
97
- 'ssl_ca_path' : 'REDIS_SSL_CA_PATH' ,
98
- 'ssl_keyfile' : 'REDIS_SSL_KEYFILE' ,
99
- 'ssl_certfile' : 'REDIS_SSL_CERTFILE' ,
100
- 'ssl_cert_reqs' : 'REDIS_SSL_CERT_REQS' ,
101
- 'ssl_ca_certs' : 'REDIS_SSL_CA_CERTS' ,
102
- 'cluster_mode' : 'REDIS_CLUSTER_MODE'
103
- }
104
-
105
- for key , env_var in env_mapping .items ():
106
- if key in config :
107
- value = config [key ]
108
- if isinstance (value , bool ):
109
- value = 'true' if value else 'false'
110
- os .environ [env_var ] = str (value )
111
-
112
28
113
29
@click .command ()
114
30
@click .option ('--url' , help = 'Redis connection URI (redis://user:pass@host:port/db or rediss:// for SSL)' )
0 commit comments