Skip to content

Commit 1cb797e

Browse files
committed
fix(mcp): filter credentials per-server in _embed_credentials
1 parent 60aa393 commit 1cb797e

1 file changed

Lines changed: 27 additions & 7 deletions

File tree

src/dedalus_labs/lib/mcp/request.py

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -165,35 +165,55 @@ def _encrypt_credentials(
165165
return EncryptedCredentials(**encrypted)
166166

167167

168+
def _server_connection_name(name: str) -> str:
169+
"""Derive the connection name for a server from its slug or name.
170+
171+
Connection names use dashes instead of slashes.
172+
E.g. "dedalus-labs/gmail-mcp" -> "dedalus-labs-gmail-mcp".
173+
174+
Args:
175+
name: Server slug, URL, or name string.
176+
177+
Returns:
178+
Connection name with slashes replaced by dashes.
179+
180+
"""
181+
return name.replace("/", "-")
182+
183+
168184
def _embed_credentials(
169185
servers: List[MCPServerItem],
170186
encrypted: EncryptedCredentials,
171187
) -> List[MCPServerSpec]:
172188
"""Embed encrypted credentials into each server spec.
173189
174-
Converts slug strings to full specs and adds credentials to all servers.
190+
Each server receives only its own credentials, matched by connection name.
175191
176192
Args:
177193
servers: Serialized MCP servers (slug strings or spec dicts).
178194
encrypted: EncryptedCredentials instance.
179195
180196
Returns:
181-
List of MCPServerSpec dicts with credentials embedded.
197+
List of MCPServerSpec dicts with per-server credentials embedded.
182198
183199
"""
184-
creds_dict = encrypted.to_dict()
200+
all_creds = encrypted.to_dict()
185201
result: List[MCPServerSpec] = []
186202

187203
for server in servers:
188204
if isinstance(server, str):
205+
name = server
206+
conn_name = _server_connection_name(name)
207+
server_creds = {k: v for k, v in all_creds.items() if k == conn_name} or None
189208
if server.startswith(("http://", "https://")):
190-
result.append({"url": server, "name": server, "credentials": creds_dict})
209+
result.append({"url": server, "name": name, "credentials": server_creds})
191210
else:
192-
result.append({"slug": server, "name": server, "credentials": creds_dict})
211+
result.append({"slug": server, "name": name, "credentials": server_creds})
193212
elif isinstance(server, dict):
194-
# Existing spec -> add name (if missing) and credentials
195213
name = server.get("name") or server.get("slug") or server.get("url") or ""
196-
spec: MCPServerSpec = {**server, "name": name, "credentials": creds_dict}
214+
conn_name = _server_connection_name(name)
215+
server_creds = {k: v for k, v in all_creds.items() if k == conn_name} or None
216+
spec: MCPServerSpec = {**server, "name": name, "credentials": server_creds}
197217
result.append(spec)
198218

199219
return result

0 commit comments

Comments
 (0)