Skip to content

Commit d3d5260

Browse files
jamesjames
authored andcommitted
fix(mcp): allow package-style server names
1 parent f26425b commit d3d5260

2 files changed

Lines changed: 18 additions & 4 deletions

File tree

code-rs/cli/src/mcp_cmd.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,12 @@ mod tests {
259259
_ => panic!("expected streamable http transport"),
260260
}
261261
}
262+
263+
#[test]
264+
fn package_style_server_name_is_valid() {
265+
assert!(validate_server_name("npm:@modelcontextprotocol/server-sequential.thinking").is_ok());
266+
assert!(validate_server_name("npm:@scope/package name").is_err());
267+
}
262268
}
263269

264270
fn run_remove(config_overrides: &CliConfigOverrides, remove_args: RemoveArgs) -> Result<()> {
@@ -591,11 +597,11 @@ fn validate_server_name(name: &str) -> Result<()> {
591597
let is_valid = !name.is_empty()
592598
&& name
593599
.chars()
594-
.all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_');
600+
.all(|c| c.is_ascii_alphanumeric() || matches!(c, '-' | '_' | ':' | '@' | '/' | '.'));
595601

596602
if is_valid {
597603
Ok(())
598604
} else {
599-
bail!("invalid server name '{name}' (use letters, numbers, '-', '_')");
605+
bail!("invalid server name '{name}' (use letters, numbers, '-', '_', ':', '@', '/', '.')");
600606
}
601607
}

code-rs/core/src/mcp_connection_manager.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ impl McpConnectionManager {
283283
// Validate server name before spawning
284284
if !is_valid_mcp_server_name(&server_name) {
285285
let message = format!(
286-
"invalid server name '{server_name}': must match pattern ^[a-zA-Z0-9_-]+$"
286+
"invalid server name '{server_name}': must match pattern ^[a-zA-Z0-9_:@/.-]+$"
287287
);
288288
errors.insert(
289289
server_name,
@@ -598,7 +598,7 @@ fn is_valid_mcp_server_name(server_name: &str) -> bool {
598598
!server_name.is_empty()
599599
&& server_name
600600
.chars()
601-
.all(|c| c.is_ascii_alphanumeric() || c == '_' || c == '-')
601+
.all(|c| c.is_ascii_alphanumeric() || matches!(c, '_' | '-' | ':' | '@' | '/' | '.'))
602602
}
603603

604604
#[cfg(test)]
@@ -632,6 +632,14 @@ mod tests {
632632
}
633633
}
634634

635+
#[test]
636+
fn package_style_server_name_is_valid() {
637+
assert!(is_valid_mcp_server_name(
638+
"npm:@modelcontextprotocol/server-sequential.thinking"
639+
));
640+
assert!(!is_valid_mcp_server_name("npm:@scope/package name"));
641+
}
642+
635643
#[test]
636644
fn test_qualify_tools_short_non_duplicated_names() {
637645
let tools = vec![

0 commit comments

Comments
 (0)