> ## Documentation Index
> Fetch the complete documentation index at: https://pomeroy.app/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Stdio

> The default way in: the Claude Desktop extension and the byte pipe inside Pomeroy's app bundle. No port, no credential, and nothing to revoke.

Stdio is how most assistants reach Pomeroy, and it is the one Pomeroy's
Connections pane calls **Direct**. It is always on and has no setting, because
there is nothing about it to configure: the filesystem has already decided who
may speak to it.

## The command

Most assistants take a command to run. This is that command, and it takes no
arguments:

```
/Applications/Pomeroy.app/Contents/MacOS/pomeroy-mcp
```

Because it lives inside the app bundle, Pomeroy can update itself without any
assistant's configuration changing. Move Pomeroy out of `/Applications` and the
path moves with it, and Pomeroy's own panel always shows the right one for your
Mac.

The commonest shape an assistant wants it in:

```json theme={null}
{
  "mcpServers": {
    "pomeroy": {
      "command": "/Applications/Pomeroy.app/Contents/MacOS/pomeroy-mcp"
    }
  }
}
```

Your assistant's own page has the exact spelling it takes. The key is `servers`
in VS Code, `context_servers` in Zed, and a TOML table in Codex.
[Find yours](/docs/assistants/overview).

## The Claude Desktop extension

Claude Desktop gets a `.mcpb` bundle instead, which Pomeroy opens for you;
Claude Desktop then shows its own install prompt. Nothing is written to Claude's
configuration file.

Inside the bundle is a small Node script that does not speak MCP. It connects to
Pomeroy's socket, launches the app if it is not running, and copies bytes.

That is why it never needs updating. Pomeroy can add tools, change every answer,
and the extension carries on copying bytes.

## What is actually happening

Both stdio doors are byte pipes onto one Unix domain socket in your home folder:

```
~/Library/Application Support/Pomeroy/mcp.sock
```

The socket is mode `0600`, so it is readable and writable only by processes
running as you, on this Mac. Nothing else guards it, which is why there is no
key to manage and nothing to leak.

<Note>
  A stdio session loads no AppKit, no Sparkle and no analytics library. It is a
  pipe and nothing else. Neither bridge parses JSON-RPC, and neither knows what
  a tool is.
</Note>

[The architecture in full](/docs/privacy/how-pomeroy-works).

## Why there is no prompt

An assistant that comes through stdio is never asked to identify itself, and
Pomeroy never asks you to approve it. It can only reach Pomeroy through a file
your own macOS account owns, so anything that got there was already running on
your Mac as you, so a prompt would be asking you to approve yourself.

Setting an assistant up *is* the consent: it was you choosing that assistant.

## When stdio is not enough

Stdio needs the assistant to be able to start a program inside your user
session. Three cases cannot:

* An assistant running in a container or a virtual machine
* A CI runner, or a script on another schedule
* A client that takes a URL and nothing else

Those want [the local HTTP endpoint](/docs/configuration/http-endpoint), which is off
until you switch it on.

## If it does not connect

<AccordionGroup>
  <Accordion title="The assistant says the server failed to start" icon="triangle-exclamation">
    It could not run the command. Check the path matches where Pomeroy actually
    lives, and copy it from Pomeroy's own panel rather than typing it.
  </Accordion>

  <Accordion title="The tools are missing after setup" icon="circle-question">
    Most assistants read their server list at launch. Quit it fully and open it
    again; Claude Code, Gemini CLI and goose want a new session instead.
    [More](/docs/getting-started/troubleshooting#an-assistant-cannot-see-the-tools)
  </Accordion>

  <Accordion title="Pomeroy is not running" icon="circle-play">
    It does not need to be. The pipe launches it. If it will not start at all,
    open it from Applications and see what it says.
  </Accordion>
</AccordionGroup>
