A couple of other things turned up along the way. vLLM was returning a truncated tool call as if it finished (half a file on disk, "wrote successfully"), and Bifrost was shuffling the tool definition fields between requests so the prefix cache missed. I have PRs (now merged) with Bifrost and mcp-go for the shuffling.
It was a very interesting learning experience about model serving and harnesses. This post really only covers the latter, but I'll do another on the vLLM side soon.