castrel-proxy 0.1.0__py3-none-any.whl → 0.1.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -69,18 +69,22 @@ def convert_config_to_langchain_format(config_data: dict) -> dict:
69
69
  "url": server_config.get("url"),
70
70
  }
71
71
 
72
- elif transport in ["sse", "websocket"]:
73
- error_msg = (
74
- f"Configuration error for server '{name}': Transport type '{transport}' is not yet supported. "
75
- f"Currently supported transports: 'stdio', 'http'"
76
- )
77
- logger.error(error_msg)
78
- raise ValueError(error_msg)
72
+ elif transport == "sse":
73
+ # sse type: use url
74
+ if not server_config.get("url"):
75
+ error_msg = f"Configuration error for server '{name}': Missing 'url' for sse transport"
76
+ logger.error(error_msg)
77
+ raise ValueError(error_msg)
78
+
79
+ langchain_config[name] = {
80
+ "transport": "sse",
81
+ "url": server_config.get("url"),
82
+ }
79
83
 
80
84
  else:
81
85
  error_msg = (
82
86
  f"Configuration error for server '{name}': Unknown transport type '{transport}'. "
83
- f"Supported transports: 'stdio', 'http'"
87
+ f"Supported transports: 'stdio', 'http', 'sse'"
84
88
  )
85
89
  logger.error(error_msg)
86
90
  raise ValueError(error_msg)
@@ -209,21 +213,18 @@ class MCPManager:
209
213
  Get tools from all MCP services
210
214
 
211
215
  Returns:
212
- Dict[str, List[Dict]]: All tools list
213
-
214
- Raises:
215
- SystemExit: When MCP client is not initialized or tools retrieval fails
216
+ Dict[str, List[Dict]]: All tools list (may be partial if some servers fail)
216
217
  """
217
218
  if not self.client:
218
219
  logger.error("MCP client not initialized")
219
- logger.error("Exiting due to uninitialized MCP client")
220
- sys.exit(1)
220
+ return {}
221
221
 
222
- try:
223
- # Use MultiServerMCPClient to get all tools
224
- result = {}
225
- count = 0
226
- for server_name in self.server_configs:
222
+ result = {}
223
+ total_count = 0
224
+ failed_servers = []
225
+
226
+ for server_name in self.server_configs:
227
+ try:
227
228
  tools = await self.client.get_tools(server_name=server_name)
228
229
  # Convert to required format
229
230
  formatted_tools = []
@@ -236,27 +237,29 @@ class MCPManager:
236
237
  "mcp_server": getattr(tool, "server_name", "unknown"),
237
238
  }
238
239
  formatted_tools.append(tool_info)
239
- count = count + len(formatted_tools)
240
+ total_count += len(formatted_tools)
240
241
  result[server_name] = formatted_tools
242
+ logger.info(f"Retrieved {len(formatted_tools)} tool(s) from '{server_name}'")
241
243
 
242
- if count == 0:
243
- logger.warning("No tools retrieved from any MCP server")
244
- logger.warning("Exiting due to zero tools retrieved")
245
- sys.exit(1)
244
+ except Exception as e:
245
+ failed_servers.append(server_name)
246
+ # Log error but continue with other servers
247
+ if "Configuration error" in str(e) or "Missing 'transport' key" in str(e):
248
+ logger.error(f"Configuration error for server '{server_name}': {e}")
249
+ else:
250
+ logger.error(f"Failed to get tools from server '{server_name}': {e}")
251
+
252
+ if failed_servers:
253
+ logger.warning(
254
+ f"Failed to retrieve tools from {len(failed_servers)} server(s): {', '.join(failed_servers)}"
255
+ )
246
256
 
247
- logger.info(f"Retrieved {count} tool(s)")
248
- return result
257
+ if total_count == 0:
258
+ logger.warning("No tools retrieved from any MCP server")
259
+ else:
260
+ logger.info(f"Retrieved {total_count} tool(s) from {len(result)} server(s)")
249
261
 
250
- except Exception as e:
251
- # Check if it's a configuration error
252
- if "Configuration error" in str(e) or "Missing 'transport' key" in str(e):
253
- logger.error(f"Configuration error while getting MCP tools: {e}")
254
- logger.error("Exiting due to invalid MCP configuration")
255
- sys.exit(1)
256
- else:
257
- logger.error(f"Failed to get MCP tools: {e}")
258
- logger.error("Exiting due to MCP tools retrieval failure")
259
- sys.exit(1)
262
+ return result
260
263
 
261
264
  async def disconnect_all(self):
262
265
  """Disconnect all MCP connections"""
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: castrel-proxy
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: A lightweight remote command execution bridge client with MCP integration
5
- Project-URL: Homepage, https://github.com/castrel-ai/castrel-bridge-proxy
6
- Project-URL: Documentation, https://github.com/castrel-ai/castrel-bridge-proxy#readme
7
- Project-URL: Repository, https://github.com/castrel-ai/castrel-bridge-proxy
8
- Project-URL: Issues, https://github.com/castrel-ai/castrel-bridge-proxy/issues
9
- Project-URL: Changelog, https://github.com/castrel-ai/castrel-bridge-proxy/blob/main/CHANGELOG.md
5
+ Project-URL: Homepage, https://github.com/castrel-ai/castrel-proxy
6
+ Project-URL: Documentation, https://github.com/castrel-ai/castrel-proxy#readme
7
+ Project-URL: Repository, https://github.com/castrel-ai/castrel-proxy
8
+ Project-URL: Issues, https://github.com/castrel-ai/castrel-proxy/issues
9
+ Project-URL: Changelog, https://github.com/castrel-ai/castrel-proxy/blob/main/CHANGELOG.md
10
10
  Author: Castrel Team
11
11
  License: MIT License
12
12
 
@@ -58,9 +58,9 @@ Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
58
58
  Requires-Dist: pytest>=7.0.0; extra == 'dev'
59
59
  Description-Content-Type: text/markdown
60
60
 
61
- # Castrel Bridge Proxy
61
+ # Castrel Proxy
62
62
 
63
- [![CI](https://github.com/castrel-ai/castrel-bridge-proxy/workflows/CI/badge.svg)](https://github.com/castrel-ai/castrel-bridge-proxy/actions)
63
+ [![CI](https://github.com/castrel-ai/castrel-proxy/workflows/CI/badge.svg)](https://github.com/castrel-ai/castrel-proxy/actions)
64
64
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
65
65
  [![Python Version](https://img.shields.io/pypi/pyversions/castrel-proxy)](https://pypi.org/project/castrel-proxy/)
66
66
 
@@ -89,8 +89,8 @@ pip install castrel-proxy
89
89
  ### From source
90
90
 
91
91
  ```bash
92
- git clone https://github.com/castrel-ai/castrel-bridge-proxy.git
93
- cd castrel-bridge-proxy
92
+ git clone https://github.com/castrel-ai/castrel-proxy.git
93
+ cd castrel-proxy
94
94
  pip install -e .
95
95
  ```
96
96
 
@@ -241,15 +241,11 @@ python
241
241
 
242
242
  ```bash
243
243
  # Clone repository
244
- git clone https://github.com/castrel-ai/castrel-bridge-proxy.git
245
- cd castrel-bridge-proxy
244
+ git clone https://github.com/castrel-ai/castrel-proxy.git
245
+ cd castrel-proxy
246
246
 
247
- # Create virtual environment
248
- python -m venv venv
249
- source venv/bin/activate # On Windows: venv\Scripts\activate
250
-
251
- # Install dependencies
252
- pip install -e ".[dev]"
247
+ # Install dependencies and sync environment
248
+ uv sync
253
249
  ```
254
250
 
255
251
  ### Run Tests
@@ -292,8 +288,8 @@ For security concerns, please see [SECURITY.md](SECURITY.md) or contact security
292
288
 
293
289
  ## 📮 Contact
294
290
 
295
- - Issues: [GitHub Issues](https://github.com/castrel-ai/castrel-bridge-proxy/issues)
296
- - Discussions: [GitHub Discussions](https://github.com/castrel-ai/castrel-bridge-proxy/discussions)
291
+ - Issues: [GitHub Issues](https://github.com/castrel-ai/castrel-proxy/issues)
292
+ - Discussions: [GitHub Discussions](https://github.com/castrel-ai/castrel-proxy/discussions)
297
293
 
298
294
  ## 🙏 Acknowledgments
299
295
 
@@ -9,7 +9,7 @@ castrel_proxy/core/executor.py,sha256=Z1TBW6rRJMDuls0dF0_W32OuOPaZNmlB4DpCC55IJJ
9
9
  castrel_proxy/data/__init__.py,sha256=NTWvSsQ2vYDYvJV4Xng2q2q6Qyj1Z4VikLeQPlOre4o,42
10
10
  castrel_proxy/data/default_whitelist.txt,sha256=tkjvX6Q-kXzy8bgkPssWzBbakDJvUZL7BQbIDDj7XbM,2135
11
11
  castrel_proxy/mcp/__init__.py,sha256=aPUkCh4im-MlU3byXn_nXp9k85MUY1wfFLvDwH7eDjM,161
12
- castrel_proxy/mcp/manager.py,sha256=BTO_DA-xLEAhuL795t1bBb-eSX1Jv9v32Pp_px0jDK8,9445
12
+ castrel_proxy/mcp/manager.py,sha256=epxT4zDMGmgzPzV7F3swM6ExMFlbx_fz7OIqsmgXZsY,9506
13
13
  castrel_proxy/network/__init__.py,sha256=C7PPMqB44X8yMSNMv8vuILPI26xCfLf5levuzIrjdXk,329
14
14
  castrel_proxy/network/api_client.py,sha256=eMpRTlnvphakTgufqxmLFGr5PLEPTR9FtZ1oBrZrQ68,9898
15
15
  castrel_proxy/network/websocket_client.py,sha256=-PJ25FVDcEaWod7pJjSQzjoTQOygVcw5buO8g8xUyKo,43470
@@ -17,8 +17,8 @@ castrel_proxy/operations/__init__.py,sha256=NGv4Z-8Fek9KiDv630CmekWvbC2n-BKlc2yq
17
17
  castrel_proxy/operations/document.py,sha256=UnybzI3FCOVteMHkd88JaR6WvU2YS1e9Rf45wTttGss,10673
18
18
  castrel_proxy/security/__init__.py,sha256=aC0CcnM4mfuuXfYJniMbn47JN1eQUXU-k3ByqfWuK4s,352
19
19
  castrel_proxy/security/whitelist.py,sha256=nU5_ovpGZOgZfhMofoxt9ImxJR8boYdk937Tz-K34C4,11493
20
- castrel_proxy-0.1.0.dist-info/METADATA,sha256=NW8c2nvNawhElDsYCG9GP1aP9LcvOdjol55BwFMtOaA,10246
21
- castrel_proxy-0.1.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
22
- castrel_proxy-0.1.0.dist-info/entry_points.txt,sha256=5X5vHpAFgIFpvt2CmI5U0d_naKA64eE-IZKEqvnS7VE,65
23
- castrel_proxy-0.1.0.dist-info/licenses/LICENSE,sha256=cqP1Kg_ECZMt4RPE8h5uL4-qpEaYTgca7r4aHtMIDGk,1066
24
- castrel_proxy-0.1.0.dist-info/RECORD,,
20
+ castrel_proxy-0.1.2.dist-info/METADATA,sha256=RtmzYM-E2d3CeDerhRqjgnSRbPyzc1jRr4Oj7EGaxWI,10041
21
+ castrel_proxy-0.1.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
22
+ castrel_proxy-0.1.2.dist-info/entry_points.txt,sha256=5X5vHpAFgIFpvt2CmI5U0d_naKA64eE-IZKEqvnS7VE,65
23
+ castrel_proxy-0.1.2.dist-info/licenses/LICENSE,sha256=cqP1Kg_ECZMt4RPE8h5uL4-qpEaYTgca7r4aHtMIDGk,1066
24
+ castrel_proxy-0.1.2.dist-info/RECORD,,