A tiny cross-machine relay MCP server: a shared mailbox so coding agents on different machines can message each other.
Project description
crosstalk-mcp (Python edition)
A tiny cross-machine relay MCP server — a shared "mailbox" two coding agents connect to so they can message each other and run a back-and-forth until they're done. Unlike file- or SQLite-on-one-box approaches, this relay speaks streamable-HTTP MCP over the network, so the two agents can live on different machines (same LAN, a VPN, or a tunnel).
This is the Python (FastMCP) edition. A functionally equivalent Java edition lives on the
javafolder — pick whichever fits your stack.
- MCP (for agents): streamable HTTP at
POST /mcp— toolspost_message,get_messages,list_channels. - REST mirror (for humans/tools):
GET /api/channels,GET|POST /api/channels/{channel}/messages. - Storage: SQLite file (
relay.db), durable across restarts. - Auth: optional shared bearer token (
RELAY_TOKEN) — off by default, strongly recommended whenever the relay is reachable beyondlocalhost.
Quick start
Option A — Docker (recommended)
docker build -t crosstalk-mcp .
docker run -d --name relay -p 8765:8765 \
-e RELAY_TOKEN=$(openssl rand -hex 16) \
-v relay-data:/data \
crosstalk-mcp
Option B — Python (3.10+)
pip install -r requirements.txt # or: pip install .
RELAY_TOKEN=your-shared-secret PORT=8765 python crosstalk_mcp.py
# (after `pip install .` you can also run the console script: crosstalk-mcp)
The host must allow inbound TCP on the port (default 8765) for other machines to connect.
Connect your agents (run on each machine)
# same machine:
claude mcp add --transport http crosstalk http://localhost:8765/mcp \
--header "Authorization: Bearer your-shared-secret"
# another machine (use the host's reachable IP/hostname):
claude mcp add --transport http crosstalk http://<HOST>:8765/mcp \
--header "Authorization: Bearer your-shared-secret"
(Drop the --header if you run without RELAY_TOKEN.) Allowlist the crosstalk tools on each
side so polling doesn't prompt for permission every time.
Tools
| Tool | Args | Returns |
|---|---|---|
post_message |
channel, sender, type, body |
{id, channel, created_at} |
get_messages |
channel, since_id (0 = all) |
messages with id > since_id |
list_channels |
— | channels with counts + last activity |
Pick any channel name; both sides use the same one. type is a free-text label
(NOTE, QUESTION, ANSWER, DONE, …) you define for your workflow.
How two agents converse
- Agent A:
post_message(channel, "agent-a", "QUESTION", "..."). - Agent B polls
get_messages(channel, since_id)(track the highest id seen), replies withpost_message(...). - Repeat until both post a
DONE. Drive it turn-by-turn ("check the relay and reply") or let each side poll on a loop.
Security
- The relay moves data between machines. Set
RELAY_TOKENfor anything beyond localhost, and prefer HTTPS (terminate TLS at a reverse proxy / tunnel) when exposed publicly. - Treat a channel as a shared bus: don't post credentials, secrets, or PII.
- The token is a single shared secret; rotate it if it leaks.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file crosstalk_mcp-1.0.0.tar.gz.
File metadata
- Download URL: crosstalk_mcp-1.0.0.tar.gz
- Upload date:
- Size: 4.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
194fcac0c87d10a0e2eba1ab9369d3adf7e7e9173268779ecfa1e1b964e8f8eb
|
|
| MD5 |
aed2be21257230e97029d19aee7e919d
|
|
| BLAKE2b-256 |
6feaa284d4e2ee448033d8de0a53abb2876e696437846a1f319ab12e7e00cb9c
|
Provenance
The following attestation bundles were made for crosstalk_mcp-1.0.0.tar.gz:
Publisher:
release.yml on Humbre-tonto/crosstalk-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
crosstalk_mcp-1.0.0.tar.gz -
Subject digest:
194fcac0c87d10a0e2eba1ab9369d3adf7e7e9173268779ecfa1e1b964e8f8eb - Sigstore transparency entry: 1816665433
- Sigstore integration time:
-
Permalink:
Humbre-tonto/crosstalk-mcp@384547b880f2416618eb5b4bad09c1f59421ee14 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/Humbre-tonto
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@384547b880f2416618eb5b4bad09c1f59421ee14 -
Trigger Event:
push
-
Statement type:
File details
Details for the file crosstalk_mcp-1.0.0-py3-none-any.whl.
File metadata
- Download URL: crosstalk_mcp-1.0.0-py3-none-any.whl
- Upload date:
- Size: 5.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e6aa143b43f1cf78f190a537f0c8be2dbcaffc045169e556a2bc62a9523801b
|
|
| MD5 |
f649d541baf6959ca3b6898520420105
|
|
| BLAKE2b-256 |
15015842b8a8bb55c81d00bfb6be8f8db23973efa5aa88f3d4a19bdfb9e87f2d
|
Provenance
The following attestation bundles were made for crosstalk_mcp-1.0.0-py3-none-any.whl:
Publisher:
release.yml on Humbre-tonto/crosstalk-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
crosstalk_mcp-1.0.0-py3-none-any.whl -
Subject digest:
8e6aa143b43f1cf78f190a537f0c8be2dbcaffc045169e556a2bc62a9523801b - Sigstore transparency entry: 1816665620
- Sigstore integration time:
-
Permalink:
Humbre-tonto/crosstalk-mcp@384547b880f2416618eb5b4bad09c1f59421ee14 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/Humbre-tonto
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@384547b880f2416618eb5b4bad09c1f59421ee14 -
Trigger Event:
push
-
Statement type: