Let's Do DevOps

Let's Do DevOps

đŸ”„Fixing MCP Tool Name Collisions When Using Multiple MCP Servers

aka: Why does every MCP server define "search" as a tool?

Kyler Middleton's avatar
Kyler Middleton
Oct 28, 2025
∙ Paid
Share

This blog series focuses on presenting complex DevOps projects as simple and approachable via plain language and lots of pictures. You can do it!

These articles are supported by readers, please consider subscribing to support me writing more of these articles <3 :)

Hey all!

I’ve been building out my Slack Strands Agentic bot, a bot that comes with built-in MCPs that could connect to:

  • PagerDuty

  • Confluence / Jira

  • GitHub

as well as read our Bedrock knowledge base. I want the bot to be able to read the real status of resources, like in AWS or Azure.

When I added the Azure MCP, I worked through the bugs, and when I got it right
 it crashed.

ERROR: Tool name ‘search’ already exists

MCP (Model Context Protocol) is how AI agents connect to external tools. It’s basically an API, but instead of you calling endpoints, the agent does. You give it access to a GitHub MCP server, and suddenly it can search code, open issues, list repos. Same with Atlassian - it gets tools for Confluence and Jira. Add PagerDuty and Azure, and you’ve got a pretty capable agent.

Except when two servers both provide a tool called `search`.

Apparently when you import tools to your bots, if the tool names are identical, it crashes the bot (at least for the Strands library).

Atlassian MCP has search for finding Confluence pages, and Azure MCP has search for Azure resources. Both correct, and both needed, but both have the same name.

It’s apparently not like variable scoping where context matters. This is a flat namespace.

I debugged the tools that are registering, you can see them below.

This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Show hidden characters
GitHub MCP: Returning 25 tools: ['get_commit', 'get_file_contents', 'get_issue', 'get_issue_comments', 'get_label', 'get_latest_release', 'get_me', 'get_release_by_tag', 'get_tag', 'get_team_members', 'get_teams', 'list_branches', 'list_commits', 'list_issue_types', 'list_issues', 'list_label', 'list_pull_requests', 'list_releases', 'list_sub_issues', 'list_tags', 'search_code', 'search_issues', 'search_pull_requests', 'search_repositories', 'search_users']
Atlassian MCP: Returning 19 tools: ['atlassianUserInfo', 'getAccessibleAtlassianResources', 'getConfluenceSpaces', 'getConfluencePage', 'getPagesInConfluenceSpace', 'getConfluencePageFooterComments', 'getConfluencePageInlineComments', 'getConfluencePageDescendants', 'searchConfluenceUsingCql', 'getJiraIssue', 'getTransitionsForJiraIssue', 'lookupJiraAccountId', 'searchJiraIssuesUsingJql', 'getJiraIssueRemoteIssueLinks', 'getVisibleJiraProjects', 'getJiraProjectIssueTypesMetadata', 'getJiraIssueTypeMetaWithFields', 'search', 'fetch']
PagerDuty MCP: Returning 15 tools: ['list_incidents', 'get_incident', 'list_services', 'get_service', 'list_teams', 'get_team', 'list_team_members', 'get_user_data', 'list_users', 'list_schedules', 'get_schedule', 'list_schedule_users', 'list_oncalls', 'list_escalation_policies', 'get_escalation_policy']
Azure MCP: Returning 47 tools: ['documentation', 'azd', 'get_bestpractices', 'aks', 'appconfig', 'applens', 'appservice', 'role', 'datadog', 'managedlustre', 'azureterraformbestpractices', 'deploy', 'eventgrid', 'acr', 'bicepschema', 'cosmos', 'cloudarchitect', 'confidentialledger', 'eventhubs', 'foundry', 'functionapp', 'grafana', 'keyvault', 'kusto', 'loadtesting', 'marketplace', 'quota', 'monitor', 'applicationinsights', 'mysql', 'postgres', 'redis', 'communication', 'resourcehealth', 'search', 'speech', 'servicebus', 'signalr', 'sql', 'storage', 'virtualdesktop', 'workbooks', 'group_list', 'subscription_list', 'extension_azqr', 'extension_cli_generate', 'extension_cli_install']
ERROR: Tool name 'search' already exists
view raw mcp-tool-collision-logs.txt hosted with ❀ by GitHub

Both Atlassian and the new Azure MCP try to register a tool called “search”, which isn’t permitted.

When you connect multiple independent MCP servers to the same agent, eventually their tool names will overlap. The more servers you add, the more likely it becomes.

I don’t want to prune back those tools, I want all of them! Which meant I needed to fix the collision without modifying the MCP servers themselves (they’re first-party remote and hosted by the companies) and without breaking how the Strands SDK registers tools.

Cool! Lets do this.

Keep reading with a 7-day free trial

Subscribe to Let's Do DevOps to keep reading this post and get 7 days of free access to the full post archives.

Already a paid subscriber? Sign in
© 2025 Kyler Middleton
Privacy ∙ Terms ∙ Collection notice
Start your SubstackGet the app
Substack is the home for great culture