Control your AI coding agents from your phone when you're away from your desk
Project description
Tether Agent
Control your AI coding agents from your phone when you're away from your desk.
You start a coding agent, walk away for lunch, and come back to find it stuck waiting for input for an hour. Tether fixes that. Get notified when your agent needs you, respond from anywhere.
Features
- Local-first — Runs on your machine, your data stays yours
- Multi-agent — Supports Claude and Codex, more to come
- Web UI — Monitor sessions from your phone or desktop
- External Agent API — WebSocket and REST API for connecting any AI agent
- Messaging Platform Integrations — Telegram, Slack, and Discord bridges
- MCP Server — Model Context Protocol server for Claude Desktop and other MCP clients
- No API keys required — Uses Claude / Codex local OAuth by default
Installation
pip install tether-ai
Optional Platform Integrations
Install platform-specific dependencies as needed:
# Telegram bridge
pip install tether-ai[telegram]
# Slack bridge
pip install tether-ai[slack]
# Discord bridge
pip install tether-ai[discord]
# All bridges
pip install tether-ai[telegram,slack,discord]
# Development tools
pip install tether-ai[dev]
Quick Start
Run the Agent Server
# Start the server
tether start
Then open http://localhost:8787 in your browser.
Use with MCP (Claude Desktop)
Add Tether as an MCP server in your Claude Desktop config:
{
"mcpServers": {
"tether": {
"command": "tether-mcp",
"env": {
"TETHER_API_URL": "http://localhost:8787"
}
}
}
}
Configuration
Set environment variables to configure:
| Variable | Description | Default |
|---|---|---|
TETHER_AGENT_HOST |
Host to bind to | 0.0.0.0 |
TETHER_AGENT_PORT |
Port to listen on | 8787 |
TETHER_AGENT_TOKEN |
Auth token (optional; if set, API/UI/MCP require bearer auth) | — |
TETHER_AGENT_DEV_MODE |
Enable dev mode (no token required) | 0 |
TETHER_AGENT_ADAPTER |
AI adapter to use | claude_auto |
TETHER_AGENT_DATA_DIR |
Data storage directory | ./data |
AI Adapters
| Adapter | Description |
|---|---|
claude_auto |
Auto-detect (prefer OAuth, fallback to API key) |
claude_subprocess |
Claude via Agent SDK in subprocess (CLI OAuth) |
claude_api |
Claude via API key (set ANTHROPIC_API_KEY) |
codex_sdk_sidecar |
Codex via sidecar |
Messaging Platform Bridges
Configure bridges to get notifications on your preferred platform:
Telegram
export TELEGRAM_BOT_TOKEN="your_bot_token"
export TELEGRAM_FORUM_GROUP_ID="your_group_id"
Slack
export SLACK_BOT_TOKEN="xoxb-your-token"
export SLACK_CHANNEL_ID="C01234567"
Discord
export DISCORD_BOT_TOKEN="your_bot_token"
export DISCORD_CHANNEL_ID="1234567890"
External Agent API
Tether exposes a WebSocket and REST API for external agents to connect and interact with users through messaging platforms.
REST API Endpoints
Create a Session
POST /external/sessions
Content-Type: application/json
{
"agent_metadata": {
"name": "My Custom Agent",
"type": "custom",
"icon": "🤖",
"workspace": "my-workspace"
},
"session_name": "Code Review Task",
"platform": "telegram"
}
Response:
{
"session_id": "sess_abc123",
"platform": "telegram",
"thread_info": {
"thread_id": "123456",
"platform": "telegram"
}
}
Send Output
POST /external/sessions/{session_id}/output
Content-Type: application/json
{
"text": "Agent output text here",
"metadata": {}
}
Request Approval
POST /external/sessions/{session_id}/approval
Content-Type: application/json
{
"title": "Approve Changes?",
"description": "Ready to commit these changes",
"options": ["Approve", "Reject", "Review"]
}
Check for Input
GET /external/sessions/{session_id}/input?timeout=30
Response:
{
"type": "human_input",
"data": {
"text": "User's message",
"timestamp": "2025-01-01T12:00:00Z"
}
}
WebSocket API
Connect to /external/sessions/{session_id}/ws for bidirectional communication:
Agent → Tether events:
output: Send text output to userapproval_request: Request user approvalstatus: Update agent status (thinking, executing, done, error)
Tether → Agent events:
human_input: User sent a messageapproval_response: User responded to approval request
Example WebSocket message:
{
"type": "output",
"data": {
"text": "Processing your request...",
"metadata": {}
}
}
Development
Run Tests
pytest tests/
Database Migrations
# Create a new migration
alembic revision --autogenerate -m "description"
# Apply migrations
alembic upgrade head
Documentation
For full documentation, see github.com/larsderidder/tether.
License
Apache 2.0. See LICENSE for details.
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 tether_ai-0.2.3.tar.gz.
File metadata
- Download URL: tether_ai-0.2.3.tar.gz
- Upload date:
- Size: 329.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f8baf9818eea5d3695b69f78971d32f319bef3444c31a10238dbc40f05824b13
|
|
| MD5 |
13e345e5f0df1ae806f2d2bbbfa5cf10
|
|
| BLAKE2b-256 |
1e8378ae0703e51bcfa972ee15745901b0b201da0bf072c407f2ec6b95659b0e
|
Provenance
The following attestation bundles were made for tether_ai-0.2.3.tar.gz:
Publisher:
publish.yml on larsderidder/tether
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tether_ai-0.2.3.tar.gz -
Subject digest:
f8baf9818eea5d3695b69f78971d32f319bef3444c31a10238dbc40f05824b13 - Sigstore transparency entry: 949944345
- Sigstore integration time:
-
Permalink:
larsderidder/tether@5e63d3208d12027a008dbebbf64f20d8bf64e147 -
Branch / Tag:
refs/tags/v0.2.3 - Owner: https://github.com/larsderidder
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@5e63d3208d12027a008dbebbf64f20d8bf64e147 -
Trigger Event:
release
-
Statement type:
File details
Details for the file tether_ai-0.2.3-py3-none-any.whl.
File metadata
- Download URL: tether_ai-0.2.3-py3-none-any.whl
- Upload date:
- Size: 295.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7959c84168b950d42e2e112fd485a07d4d06eac7babb6ad6c4b8d1ec7a2009b1
|
|
| MD5 |
ae4106e26dc2e0ffd8ee188cae32568d
|
|
| BLAKE2b-256 |
7c92df236a83f68df66e66cdbb33523d0e75bd8f487a0f26f63cb792febc180b
|
Provenance
The following attestation bundles were made for tether_ai-0.2.3-py3-none-any.whl:
Publisher:
publish.yml on larsderidder/tether
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tether_ai-0.2.3-py3-none-any.whl -
Subject digest:
7959c84168b950d42e2e112fd485a07d4d06eac7babb6ad6c4b8d1ec7a2009b1 - Sigstore transparency entry: 949944379
- Sigstore integration time:
-
Permalink:
larsderidder/tether@5e63d3208d12027a008dbebbf64f20d8bf64e147 -
Branch / Tag:
refs/tags/v0.2.3 - Owner: https://github.com/larsderidder
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@5e63d3208d12027a008dbebbf64f20d8bf64e147 -
Trigger Event:
release
-
Statement type: