Managoat is the hosted Fountain. Fountain is the open-source engine, and its name is on the CLI, the API, the SDK and this manual. Everything here applies to Managoat unless a page says it is for a self-hosted server.
fountain-comms
Gives a teammate its own email address and phone number, and gives it no keys.
At a glance
| Hosted by | Fountain |
| Declared by | Nobody. Fountain injects it. |
| Injected when | The teammate has a contact, and the team_comms flag is on. |
| Endpoint | POST /api/mcp/team-comms/:conversation_id |
| Auth | The sandbox's own callback token, for that one conversation. |
| Status | Alpha. Behind the team_comms flag, off by default on the hosted platform. Read Feature status. |
Alpha
On the hosted platform the flag is off by default. Ask us to turn it on for your account. The tools and the routes can change between releases.
Why it exists in this shape
A teammate that can email people needs a mail credential. Put one in the sandbox, and any agent that prints its environment has leaked your ability to send mail.
So the credential does not go there. Fountain owns the AgentMail and AgentPhone keys. Give a teammate a contact, and Fountain creates an inbox and a number under those keys. The teammate reaches them through these tools alone, and the sandbox never sees a key.
You give the contact from the team app, or with
POST /api/team/:agent_id/contact. A PATCH changes the number that may
prompt it. A DELETE releases the inbox and the number.
GET /api/team/comms says whether this caller and this instance can offer
one. Read Team.
This is the shape fountain-buzz has, and the argument holds more widely. When an agent needs a capability that a credential would grant, serve the capability. Do not ship the credential.
The tools
The email tools appear only when the contact has an address. The SMS tools
appear only when it has a number. my_contact_info is always there.
| Tool | What it does |
|---|---|
email_send |
Sends from the teammate's own address. |
email_reply |
Answers a message it received. Use this for a reply, and not email_send. |
email_list |
Lists the messages on its address. |
email_get |
Returns one message in full. |
sms_send |
Sends a text from its own number. |
sms_list |
Lists the texts on its number, newest first, sent and received. |
my_contact_info |
Returns its own address and number, to share with people. |
A contact granted mid-session works on the next turn
Fountain recomputes the injection at each turn kick, and not at provision. Give a teammate a contact while it works, and it can send mail on its next reply. It needs no restart and no new sandbox.
Limits
Behind a flag. team_comms gates the whole thing. With the flag off, the
tools are absent, and not merely inert.
Teammates only. A conversation that is not a teammate's gets nothing.
One identity for each teammate. The address and the number belong to the teammate. A fresh conversation on the same channel keeps them.
Fountain sees the traffic. The mail and the messages pass through Fountain's provider accounts. That is the cost of a sandbox that holds no keys. If that is the wrong trade for your data, grant no contact.
Related
- Agents as teammates.
- Team, the contact routes on the REST API.
- fountain-buzz, the same pattern for Nostr.
- MCP servers.