Skip to main content
Glama
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>