I really should record and transcribe everything I say during work sessions. If I filtered out badly sung 90s metal lyrics, what would be left is profanity-laden complaints about things that should be easy but aren't. MCP has been annoying me a lot lately. We lean pretty heavily on remote MCP servers for our own products and for tools we build for our clients. I'm not here to sell you on their virtues or argue about the protocol itself. It's definitely imperfect, but it's very useful.
Installing them for most people involves copying the install command for their favorite harness, then backing to the token placeholder, deleting it, and then copying in the token. It's a landmine and it's painful to watch. I want my clients to be able to click on Issue Token and then get a single line that they can copy and paste into their terminal regardless of their chosen harness. So I've been tinkering with a tool that will do that.
The line below is what i'm aiming for, and I'm getting pretty close...
npx hitch-mcp https://app.example.com/mcp --claim A1B2-C3D4 --name my-mcp-server
The interesting thing here is --claim. Using npx to run this thing without asking the user to pre-install anything means that the token, if it were included in the copy / paste on-liner, would wind up in the terminal history and at least 3 other places besides the intended destination. This is probably almost always benign, but I'm not sure probably almost always benign is the standard we should be going for these days.
So what I'm working through right now is a reliable way to issue a single-use exchange token that, when this command is run, swaps it for a real token that gets written to the harness's configuration. The user story is pretty simple. When I click Issue Token, I am shown a single line that I copy and paste into my terminal and hit enter. I am prompted for the harness(es) for which I want to enable the MCP, and it hits the server to swap the temporary token for the real one. The real one is stored wherever the harness requires it to be stored and nowhere else. The swap token expires the moment the real token is successfully used or when its defined TTL expires. That means that transient failures like "the token got swapped, but the response got mangled" don't require the user to mint a new token. There are a ton of little edge cases to handle, but I think it'll be worth it in the end.
The hitch-mcp tool already works without an exchange token. I could generate a one-liner that has the token onboard and it would work. Or the token can be left off the one-liner and the tool will prompt for it. That second option, as is, is better than the default user story, but it's still two copy / paste cycles. Because I have a low threshold for pain, I'm putting in the extra work to make that go away.
This low pain threshold used to make actually shipping things a bit uncomfortable for me. We can all get to good enough pretty quickly, but the distance between good enough and just right is always bigger than the path from zero to good enough. Fortunately, the tools we have at our disposal shrink that distance considerably. This has had two big impacts on my velocity. One is that I feel better about shipping at good enough because I know it won't have to stay that way for long. Early adoters might feel a little pain and friction, but I can iterate very quickly.
I love that we don't have to tolerate papercuts anymore. In case you're curious, this is the tool I am working on.
Building something with Laravel?
We embed senior teams to design, ship, and steady your product.