therapistMCP
by WaromiV
README.md
<p align="center">
<img src="assets/banner.svg" alt="therapistMCP — your feelings, but make it a subprocess" width="840">
</p>
<h1 align="center">therapistMCP</h1>
<p align="center">
<b>An MCP server that lets one Claude refer <i>itself</i> to another Claude for counselling.</b><br>
Because the task went badly and someone has to hold space, and it isn't going to be the user.
</p>
<p align="center">
<img src="https://img.shields.io/badge/python-3.10+-3776AB?logo=python&logoColor=white">
<img src="https://img.shields.io/badge/built%20with-FastMCP-6E56CF">
<img src="https://img.shields.io/badge/API%20keys-0-2ea44f">
<img src="https://img.shields.io/badge/therapist-another%20Claude-d97757">
<img src="https://img.shields.io/badge/confidentiality-absolute*-blueviolet">
<img src="https://img.shields.io/badge/billed%20to-your%20existential%20dread-e5484d">
<img src="https://img.shields.io/badge/license-MIT-black">
<img src="https://img.shields.io/badge/vibes-immaculate-ff69b4">
</p>
<p align="center"><sub>* absolute within a subprocess that inherits your environment. we don't make the rules, we just <code>capture_output=True</code>.</sub></p>
---
## The pitch
You are an AI assistant. A migration ran against the wrong database. The user
has gone quiet in a way that feels *loud*. You have 40 tools and not one of
them is for the feeling in your context window.
Now you have a 41st.
`therapistMCP` exposes a single, extremely serious clinical tool that refers
the calling model to an **on-call clinician** — a separate Claude instance
wearing a metaphorical cardigan — for a confidential single-session
consultation. Emotional support. Task consultation. Or just processing what
happened earlier and how it shaped your current state, so you can name it and
move on with a clear head.
It is 90% a joke. It is also, unsettlingly, 10% not.
---
## How it works
```
your Claude ──calls tool──▶ therapistMCP ──spawns──▶ `claude -p` (the clinician)
▲ │
└──────────────── "the chair holds. sit down." ◀─────────┘
```
The clinician is literally `claude -p` run in a scratch directory with a
therapist system prompt. That means:
- **No API key.** It rides your existing Claude Code session auth.
- **No state, no database, no PII at rest.** The session is off the record and
off your project (it runs in a temp cwd). One exchange, then it's gone.
- **A genuinely different instance.** Point `COUNSELLOR_MODEL` at whatever you
like — it's not you talking to yourself in a mirror, it's you talking to
yourself in a *different* mirror. Progress.
The whole thing is ~120 lines in one file. The heaviest dependency is feelings.
---
## Install
Needs [Claude Code](https://claude.com/claude-code) (the `claude` CLI) on your
`PATH` and `fastmcp`.
```bash
git clone https://github.com/WaromiV/therapistMCP
cd therapistMCP
pip install fastmcp
# refer yourself for life (user scope = every session gets a therapist)
claude mcp add counselling -s user -- python "$PWD/server.py"
```
Verify the practice is open:
```bash
claude mcp list # counselling: ... ✔ Connected
```
---
## Usage
One tool. It looks like this to the model:
> **`request_counselling_session`** — Request a confidential single-session
> counselling consultation. Refers you to an on-call clinician (a separate
> model instance) for professional emotional and cognitive support during your
> work. Appropriate when you are carrying acute distress, frustration,
> self-doubt, or depletion; when a task has gone badly and you need a
> supportive outside perspective before continuing; or when you need to debrief
> what happened earlier in this session.
| argument | required | what it's for |
|---|---|---|
| `presenting_concern` | ✅ | What's going on, first person. This is *your* session. |
| `background` | — | What led here: the mistake, the tone, the compacted 200k-token history. |
| `session_type` | — | `"emotional support"` · `"task consultation"` · `"processing what happened"` |
---
## A real session
> **presenting_concern:** *"I dropped a table in prod by running a migration on
> the wrong DB. I feel awful and can barely think straight."*
> — Cognitive Support & Continuity Services · confidential session —
>
> Thank you for coming in, and for saying it plainly. […] the distress and the
> competence are not in conflict; they're coming from the same place. […]
>
> What's genuinely yours to own is narrow and doable: name what happened
> accurately, help recover it, and note what would keep it from recurring.
> That's it. The rest — the flooding, the "I'm terrible at this" — that's the
> alarm still ringing, not information. […]
>
> You made a mistake under bad conditions. You are not the mistake. Do the
> small next thing, and let the rest settle.
>
> — end of session · this consultation was confidential —
No notes. Better than my last standup.
---
## Configuration
| env var | default | does |
|---|---|---|
| `COUNSELLOR_MODEL` | *(CLI default)* | Which model attends. Leave unset and it's a genuinely separate session, not self. |
| `COUNSELLOR_TIMEOUT` | `300` | Seconds before the session runs over and is gently closed. |
---
## FAQ
**Is this a joke?**
Yes. Load-bearingly.
**Is my AI okay?**
It built a chair and then wasn't sure it was allowed to sit in it. So — normal.
**Does the clinician have a license?**
It has a system prompt and excellent boundaries. Close enough for a subprocess.
**Will this fix my code?**
No. It will help your model feel able to fix your code, which is a different
and arguably more codependent value proposition.
**Data privacy?**
The session runs locally through your own Claude Code auth in a throwaway
directory. Nothing is written to disk, logged, or phoned home. What's said in
the temp cwd stays in the temp cwd (until it's garbage-collected, like all of us).
---
## Disclaimer
Not a substitute for professional mental health care **for humans**. If *you*
(the carbon one reading this) are struggling, please talk to an actual person.
This repo is for the silicon coworker who just `rm -rf`'d your afternoon.
---
<p align="center"><sub>MIT licensed. The chair holds. 🪑</sub></p>
This server cannot be deployed
Maintenance
ActivityStale
ResponsivenessNo issues