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

# HeyMCP

> Your MCP server, where agents can reach it — and a timeline of everything they do to it.

Claude, ChatGPT and Grok can't reach your laptop. So the server you're building
can't be tested against the thing that will actually use it.

One command fixes that:

```bash theme={null}
heymcp share localhost:8000
```

```
●  myapp — https://amber-jetty.t.heymcp.dev/mcp
✓  handshake ok — 3 tools
→  inspector: https://app.heymcp.dev/s/x7k2

14:02:31  CALL  place_order              ✗  120ms
14:02:34  CALL  place_order              ✓   62ms
```

Your MCP server now has a stable public HTTPS URL that agent clients can
connect to, and every frame they exchange with it shows up in a live timeline
you can read.

## Why not just a tunnel?

A generic tunnel moves bytes. It has no idea what MCP is, so it can tell you
that five POST requests happened and nothing else.

HeyMCP speaks the protocol:

<CardGroup cols={3}>
  <Card title="A URL that stops moving" icon="link">
    Your account gets a permanent subdomain. Add the connector once and it
    keeps working tomorrow — no re-pasting a fresh URL into six clients every
    morning.
  </Card>

  <Card title="Broken before anyone connects" icon="stethoscope">
    HeyMCP performs the MCP handshake itself the moment your tunnel opens, then
    lints your tool schemas against what real clients actually accept. You find
    out before Claude quietly refuses to connect.
  </Card>

  <Card title="Every frame in plain English" icon="list">
    Not a request log. `Tried place_order · hmm, that broke` — a timeline of
    what the agent attempted, what your server said, and how long it took.
  </Card>
</CardGroup>

## The failures this is for

MCP client failures are mostly *silent*. A connector that never appears. A tool
that's never called. A schema rejected with no message anywhere.

Some real examples HeyMCP catches for you:

* Your MCP route answers with `text/plain`. Claude.ai fails **silently** — no
  error in the UI, no clue in your logs. [`transport/content-type`](/lint#transport-content-type)
* A date parameter has no `format`, so Claude sends `"7pm"` and your parser
  throws a 500. [`schema/no-format`](/lint#schema-no-format)
* Two tools differ only by capitalisation, so one of them can never be called.
  [`tools/name-collision`](/lint#tools-name-collision)

## Get going

<CardGroup cols={2}>
  <Card title="Quickstart" icon="rocket" href="/quickstart">
    Install, sign in, share a server, connect a client. About two minutes.
  </Card>

  <Card title="Connect a client" icon="plug" href="/clients/overview">
    Step-by-step for Claude Code, Claude.ai, ChatGPT, Grok, Cursor, VS Code and
    Gemini.
  </Card>

  <Card title="How it works" icon="diagram-project" href="/concepts/how-it-works">
    What connects to what, and why nothing is buffered.
  </Card>

  <Card title="Checks reference" icon="clipboard-check" href="/lint">
    Every rule the handshake probe runs, what it means, and how to fix it.
  </Card>
</CardGroup>
