Release Notes:
- Fixed an issue where a request could fail if an MCP server with names
containing whitespace was used
## Summary
When multiple MCP servers expose tools with the same name, Zed
disambiguates them by prefixing the tool name with the server ID from
settings.json. If the server ID contains spaces or special characters
(e.g., `"Azure DevOps"`), the resulting tool name like `Azure
DevOps_echo` violates Anthropic's API pattern `^[a-zA-Z0-9_-]{1,128}$`,
causing API errors:
> "Received an error from the Anthropic API: tools.0.custom.name: String
should match pattern '^[a-zA-Z0-9_-]{1,128}$'"
## Solution
Convert server IDs to snake_case (using the `heck` crate already
available in the workspace) before using them as prefixes during tool
name disambiguation.
| Server ID in settings.json | Disambiguated Tool Name |
|---------------------------|------------------------|
| `"Azure DevOps"` | `azure_dev_ops_echo` |
| `"My MCP Server"` | `my_mcp_server_echo` |
## Test plan
- [x] Added test case for server name with spaces ("Azure DevOps") in
`test_mcp_tool_truncation`
- [x] Verified existing tests pass
- [x] Manually tested with two MCP servers having overlapping tool names
After (left), Before (right):
<img width="2880" height="1800" alt="Screenshot_20251228_163249"
src="https://github.com/user-attachments/assets/09c4e8f0-e282-4620-9db3-3e2c7d428d15"
/>
🤖 Generated with (some) help from [Claude
Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Bennet Bo Fenner <bennetbo@gmx.de>
109 lines
3.1 KiB
TOML
109 lines
3.1 KiB
TOML
[package]
|
|
name = "agent"
|
|
version = "0.1.0"
|
|
edition.workspace = true
|
|
publish.workspace = true
|
|
license = "GPL-3.0-or-later"
|
|
|
|
[lib]
|
|
path = "src/agent.rs"
|
|
|
|
[features]
|
|
test-support = ["db/test-support"]
|
|
eval = []
|
|
unit-eval = []
|
|
e2e = []
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[dependencies]
|
|
acp_thread.workspace = true
|
|
action_log.workspace = true
|
|
agent-client-protocol.workspace = true
|
|
agent_servers.workspace = true
|
|
agent_settings.workspace = true
|
|
anyhow.workspace = true
|
|
chrono.workspace = true
|
|
client.workspace = true
|
|
cloud_api_types.workspace = true
|
|
cloud_llm_client.workspace = true
|
|
collections.workspace = true
|
|
context_server.workspace = true
|
|
db.workspace = true
|
|
derive_more.workspace = true
|
|
feature_flags.workspace = true
|
|
fs.workspace = true
|
|
futures.workspace = true
|
|
git.workspace = true
|
|
gpui.workspace = true
|
|
handlebars = { workspace = true, features = ["rust-embed"] }
|
|
heck.workspace = true
|
|
html_to_markdown.workspace = true
|
|
http_client.workspace = true
|
|
indoc.workspace = true
|
|
itertools.workspace = true
|
|
language.workspace = true
|
|
language_model.workspace = true
|
|
language_models.workspace = true
|
|
log.workspace = true
|
|
open.workspace = true
|
|
parking_lot.workspace = true
|
|
paths.workspace = true
|
|
project.workspace = true
|
|
prompt_store.workspace = true
|
|
regex.workspace = true
|
|
rust-embed.workspace = true
|
|
schemars.workspace = true
|
|
serde.workspace = true
|
|
serde_json.workspace = true
|
|
settings.workspace = true
|
|
shell_command_parser.workspace = true
|
|
smallvec.workspace = true
|
|
smol.workspace = true
|
|
sqlez.workspace = true
|
|
streaming_diff.workspace = true
|
|
strsim.workspace = true
|
|
task.workspace = true
|
|
telemetry.workspace = true
|
|
text.workspace = true
|
|
thiserror.workspace = true
|
|
ui.workspace = true
|
|
url.workspace = true
|
|
util.workspace = true
|
|
uuid.workspace = true
|
|
watch.workspace = true
|
|
web_search.workspace = true
|
|
zed_env_vars.workspace = true
|
|
zstd.workspace = true
|
|
|
|
[dev-dependencies]
|
|
agent_servers = { workspace = true, "features" = ["test-support"] }
|
|
client = { workspace = true, "features" = ["test-support"] }
|
|
clock = { workspace = true, "features" = ["test-support"] }
|
|
context_server = { workspace = true, "features" = ["test-support"] }
|
|
ctor.workspace = true
|
|
db = { workspace = true, "features" = ["test-support"] }
|
|
editor = { workspace = true, "features" = ["test-support"] }
|
|
env_logger.workspace = true
|
|
eval_utils.workspace = true
|
|
fs = { workspace = true, "features" = ["test-support"] }
|
|
git = { workspace = true, "features" = ["test-support"] }
|
|
gpui = { workspace = true, "features" = ["test-support"] }
|
|
gpui_tokio.workspace = true
|
|
language = { workspace = true, "features" = ["test-support"] }
|
|
language_model = { workspace = true, "features" = ["test-support"] }
|
|
lsp = { workspace = true, "features" = ["test-support"] }
|
|
pretty_assertions.workspace = true
|
|
project = { workspace = true, "features" = ["test-support"] }
|
|
rand.workspace = true
|
|
reqwest_client.workspace = true
|
|
settings = { workspace = true, "features" = ["test-support"] }
|
|
tempfile.workspace = true
|
|
terminal = { workspace = true, "features" = ["test-support"] }
|
|
theme = { workspace = true, "features" = ["test-support"] }
|
|
tree-sitter-rust.workspace = true
|
|
unindent = { workspace = true }
|
|
worktree = { workspace = true, "features" = ["test-support"] }
|
|
zlog.workspace = true
|