Let's Do DevOps

Let's Do DevOps

đŸ”„Migrating VeraResearch to First-Class MCP Tool Support in StrandsđŸ”„

aka, let them manage the complexity

Kyler Middleton's avatar
Kyler Middleton
Dec 16, 2025
∙ Paid

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!

Here’s the thing about building custom solutions: they work great until the library you depend on ships an update. Then you’re stuck choosing betIen “maintain my clever workaround” or “rewrite everything to match the new API.” Neither option sounds fun.

VeraResearch is an agentic Slack bot built with AWS Strands that connects to six different MCP (Model Context Protocol) servers—GitHub, Atlassian, PagerDuty, Azure, AWS CLI, and Splunk. Each MCP server provides tools the agent can use to ansIr questions and complete tasks. Pull incident data from PagerDuty. Search Jira tickets. List AWS resources. You get the idea.

When you load multiple MCP servers, they inevitably have overlapping tool names. GitHub has get_user. PagerDuty has get_user. The next MCP you install probably has get_user. Without prefixing, the agent crashes when it tries to load the second one.

So I built a solution: a custom PrefixedMCPTool wrapper class that manually prefixed every tool name. github_get_user, pagerduty_get_user, azure_get_user. Problem solved. It worked perfectly.

Except now I owned ~75 lines of code that reached into MCPClient internals, manually managed client lifecycles, extracted tool lists, wrapped them, and returned tuples. Every time Strands updated how MCPClient worked, I had to check if our custom wrapper still functioned. Maintenance debt.

Then Strands PR #895 landed: first-class support for tool prefixing and filtering directly in MCPClient. The library now provides prefix and tool_filters parameters. Just pass a prefix string and optional tool filter instructions, and MCPClient handles everything.

If I’m maintaining custom abstractions, I’m on my own when breaking changes happen. If Strands provides the feature natively, their updates won’t break my code because they own the abstraction.

Let’s walk through removing my custom cruft and use the code the Strands maintainers team wrote.

To skip right to the code changes, see the commit here.

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