How it works
Your assistant reads them, step by step
Add the address, log in, choose
In Claude, ChatGPT or any assistant that connects to MCP servers with OAuth, add hazelsong.com/api/mcp. It sends you to Hazelsong, where you log in with a one-time link to your own address (it works only in the browser that asked for it), pick the project, and check what it may do: read your testimonials (checked to start with), ask people for one (unchecked), read your report's figures (unchecked). Nothing is connected until you press Allow.
Or one line of configuration, with your own key
For an assistant you configure with a file: the address and the key you already made for the API. A key carries every tool.
Disconnect it from the dashboard
Every assistant connected by logging in is listed on your dashboard's API page, with what it may do, when it was connected and when it was last used, and a Disconnect button that stops it at once. Its access lasts an hour at a time and is renewed with a token that is replaced on every use; a renewal token used twice disconnects it.
It reads only what you may publish
The same permission the widget and the wall obey: a testimonial whose writer did not agree to a website is not reachable from here at all, by search or by id.
It is told how to quote
Every answer carries the instruction with it: quote the published words exactly, never shorten or correct them, never merge two testimonials into one sentence.
It can ask for one, too
Name a customer and it sends your own invitation, in your name, with your own wording — which is fixed, and not something an assistant may rewrite.
And read your report's figures
Three more tools answer "how is the wall doing" from the counts: wall_report (showings, plays, clicks and each hosted wall's button presses, this month against last, by widget and wall and by where readers came from), lift_status (each group's readers and purchases or actions, the verdict in the report's own words with its range, and whether the split is what was set), and form_funnel (how far people got through each form). They read exactly the figures a client share link shows, kept for thirty minutes. A connection needs "Read your report's figures", which starts unchecked; a key carries it.
Safe by design
The rule that makes it safe to have
Clear boundaries
What it will not do
Every capability page ends with this list. It is the part that says what you are actually buying.
- It will not write a testimonial, improve one, or produce a shorter version of somebody's sentence.
- It will not reach a testimonial whose writer kept it off websites, by any route.
- It will not change, approve, reject or delete anything. The only thing it can do besides read is send one invitation.
- It does not give an assistant your dashboard, or your dashboard link. A key is a key, a connection is a connection, and either can be taken away in one press.
- It will not connect without you choosing a project and what it may do, on a page that names the assistant and the address it will send you back to. There is no "remember this", and nothing is checked for you except reading.
- It will not ask anybody for a testimonial unless you checked that when you connected it. Without it, the assistant is told so and nothing is sent.
- It will not keep working for somebody who no longer owns the project, or after the plan stops carrying the API: both are checked on every request.
- Its report tools never carry a testimonial's words, a writer's name or an email address: counted figures only, the same fields a client share link shows.
- Its report tools never project anything: no yearly figure, no estimate of what would have happened, no relative lift, and no verdict before there are enough readers.
Where it lives in the code: app/api/mcp/route.ts · lib/report-tools.ts · lib/shares.ts · lib/api-auth.ts · lib/consent.ts · lib/oauth.ts · lib/oauth-rules.ts · app/oauth/authorize/page.tsx · app/api/oauth/token/route.ts · components/ApiClient.tsx
This is running now
Open a project and use it. Nothing on this page is a roadmap.