titian
Integrates with Cloudflare Tunnel to publish the Titian gateway on a public HTTPS hostname, managing the local cloudflared process and validating network configuration.
Integrates with Tailscale Funnel to expose the Titian gateway through a Tailscale HTTPS hostname, configuring public access and network settings.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
Titian
Connect your local workspaces to remote MCP clients through one authenticated gateway. Titian runs Desktop Commander on your Mac and gives each project its own URL, OAuth credentials and folder configuration.
For example, connect a mobile app and a backend as two separate MCP connections, or give one connection access to both folders. Clients can read project metadata to identify the configured project and roots. One project uses the same installation as many.
Titian means a narrow footbridge in Indonesian.
Desktop Commander can read files and run commands with your account's permissions. Project folders are not an OS sandbox. Read SECURITY.md before exposing the gateway.
Documentation
Guide | What it covers |
Presets, task templates, custom rules, owner approval and migration. | |
Installation, service lifecycle, runtime updates and validation. | |
Connection failures, blocked operations and approval errors. | |
Gateway, authentication, policy enforcement and execution. | |
Host-execution risks and the limits of permission controls. |
Related MCP server: Desktop Commander MCP
Before you start
You need:
macOS, Python 3.10+, Node.js 22+, npm and Git. The service manager uses macOS launchd; Linux is currently covered for protocol tests, not service management.
An MCP client that supports remote Streamable HTTP and OAuth dynamic registration.
A public HTTPS hostname forwarding to this Mac. You can publish it with Tailscale Funnel, Cloudflare Tunnel, or another HTTPS reverse proxy. See Network providers for setup and switching instructions.
An existing project folder. Titian configures access to it; it does not create or clone your application.
Keep the Mac awake and online while connecting remotely.
1. Choose your HTTPS origin
Find your machine's Tailscale DNS hostname:
tailscale status --json | python3 -c 'import json,sys; print("https://" + json.load(sys.stdin)["Self"]["DNSName"].rstrip("."))'The result looks like https://my-mac.my-tailnet.ts.net. Copy your actual result; do not use this example hostname.
Your origin is the HTTPS scheme and hostname, without /mcp or a project path. With another reverse proxy, use the HTTPS origin you control. Configure it to preserve request paths and forward to 127.0.0.1:8300.
2. Install and prepare Titian
git clone https://github.com/imansprn/titian.git
cd titian
npm ciReplace the hostname below with the origin from step 1:
./bin/titian init --origin https://my-mac.my-tailnet.ts.net
./bin/titian runtime installinit creates private local settings in .titian/. runtime install builds the pinned Desktop Commander runtime. Neither command exposes the Mac publicly.
3. Start the gateway and add your first project
Run init again with --start-gateway to install and start the macOS gateway service. Repeating init preserves your state:
./bin/titian init --origin https://my-mac.my-tailnet.ts.net --start-gatewayReplace /absolute/path/to/project with an existing directory:
./bin/titian add "My app" /absolute/path/to/project --slug my-appThis starts the project's local bridge and OAuth proxy with read-only permissions by default. The command prints its connection URL and PIN file path. The URL will have this shape:
https://my-mac.my-tailnet.ts.net/projects/my-app/mcpFor the Tailscale setup, publish the gateway:
tailscale funnel --bg 8300
titian network configure tailscale --hostname my-mac.my-tailnet.ts.netFollow any Funnel authorization instructions it prints. The hostname must resolve to this Mac inside the tailnet and be enabled for Funnel for public access.
For Cloudflare Tunnel, first create a remotely managed Tunnel and configure its public hostname and DNS record to forward to http://127.0.0.1:8300. Then configure Titian with the Tunnel ID and a local token file:
titian network configure cloudflare \
--hostname mcp.example.com \
--tunnel-id YOUR-TUNNEL-UUID \
--token-file /path/to/tunnel-token
titian network doctorTitian manages the local cloudflared process. DNS and the Tunnel route are configured in Cloudflare first. See Cloudflare networking for prerequisites and migration details.
Titian publishes one canonical hostname in project URLs and OAuth metadata. Use the URL printed by titian list in MCP clients, then reconnect after changing providers or hostnames so the client refreshes OAuth discovery.
4. Connect your MCP client
Use these settings in a client that supports remote MCP with OAuth:
Setting | Value |
Server URL | The full |
Authentication | OAuth, with dynamic client registration |
Client ID / secret | Not supplied manually; the client registers itself |
Consent | Enter this project's PIN in the authorization page |
Read the PIN locally, from the Titian repository root:
cat .titian/instances/my-app/.oauth-consent-pinThe PIN is not a bearer token or client secret. Enter it only in the consent page for the connection you initiated. After approval, the client receives and refreshes its own tokens. Menu names differ between clients; use their remote MCP connection settings.
5. Check that it worked
./bin/titian list
./bin/titian doctorExample output (your paths and hostname differ):
my-app — My app (active)
https://my-mac.my-tailnet.ts.net/projects/my-app/mcp
/absolute/path/to/project
my-app: auth=OK, bridge=OK, oauth-routing=OK, mcp=OKdoctor checks local services and MCP routing. For a separate public endpoint check, run ./bin/titian doctor --public.
In your connected client, ask it to call titian_project_info. It should return the project name and roots you configured. Tool and resource availability depends on the client's MCP support.
Use titian from any directory
The walkthrough uses ./bin/titian, which does not require PATH changes. To use the shorter command, run these from the Titian root:
mkdir -p "$HOME/.local/bin"
ln -s "$(pwd)/bin/titian" "$HOME/.local/bin/titian"
export PATH="$HOME/.local/bin:$PATH"
titian listAdd the export PATH line to your shell configuration, such as ~/.zshrc, to keep it across terminals. If the symlink already exists, inspect its target before replacing it.
Multiple projects and metadata
Each add creates a separate URL and credentials. To give one project two roots and descriptive labels:
titian add "Web and mobile" /path/to/backend /path/to/mobile \
--slug example --capabilities mobile backend git test buildAfter authentication, clients can read the MCP resource titian://project/metadata or call the read-only tool titian_project_info:
{
"project": "example",
"roots": ["/path/to/backend", "/path/to/mobile"],
"capabilities": ["mobile", "backend", "git", "test", "build"]
}Capabilities are labels you configure, not permissions, detected frameworks, or guarantees that a build command exists. They default to []. Local paths are returned through the authenticated MCP connection, not public OAuth discovery metadata.
Permissions and owner approvals
New workspaces default to readonly. Presets control operations, not command-name prefixes:
Preset | Use it for | Key behavior |
| Browsing and searching selected files. | No file changes or shell execution, including |
| Creating and editing selected files. | Moves/renames ask; shell execution, URL retrieval and rich rendering remain denied. |
| Explicit operation rules. | Each operation is |
| Explicitly trusted host workflows. | Reviewed operations run without routine Titian approval; authentication, file scope and backend restrictions still apply. |
No preset is an OS sandbox. editor allows overwriting existing files; it is not a create-only preset. DOCX/PDF generation additionally requires document.render and is not included in editor.
Task templates are separate from permission levels. documents selects editor; developer and data-analysis select custom rules and ask before starting a process or sending interactive input. The developer template also asks before system inspection. Templates do not guess whether npm test or another command is harmless. See the complete preset matrix.
titian update example --permissions editor
titian update example --template developer
titian update example --permissions custom --allow files.read --ask process.start
titian permissions exampletitian permissions shows configured and verified effective policy separately. An offline or older runtime is reported as unverified, not protected. Changing source code alone does not activate a new runtime.
When a tool returns approval_required, review it on the Mac in an interactive owner terminal:
titian approvals example list
titian approvals example show REQUEST_ID
titian approvals example approve REQUEST_ID
# Or: titian approvals example reject REQUEST_IDTitian executes an allow request, queues an ask request without executing it, and rejects a deny request without an approve-once shortcut. There is no MCP tool for approving requests or changing the policy; those decisions belong in the local owner interface.
Approving does not execute the operation. After local approval, the same authenticated client explicitly calls the MCP tool titian_resume with these arguments (replace the placeholder with the returned request ID):
{ "requestId": "REQUEST_ID" }The request expires five minutes after it was created, even if approved later. Approval is single-use and bound to the stored request and client; it never enables that command globally. A backend blockedCommands rejection remains a rejection. This release uses a local CLI, not a browser approval dialog or MCP elicitation. See blocked commands and approval errors.
For an existing installation, migrate explicitly before changing policy. Full operation definitions and limitations: permissions.
titian update example --capabilities mobile backend git test build
titian update example /path/to/new-root
titian restart example
titian disable example
titian enable example
titian remove exampleRemoving a project archives its OAuth state and stops its services. It never deletes the project's source folders. See operations for updates, recovery and runtime maintenance.
Troubleshooting
Symptom | What to check |
| Use |
Gateway is not running | Run |
Local | Check your HTTPS hostname, |
OAuth approval fails | Use the PIN for that project's slug and retry the connection from the client. |
Runtime is missing | Run |
Service logs are in .titian/logs/. Keep the repository at its installed path while services run; see migration before moving it.
Architecture and development
MCP client → HTTPS → gateway :8300
├── project A → OAuth proxy → MCP bridge → Desktop Commander
└── project B → OAuth proxy → MCP bridge → Desktop CommanderSource is in src/, the CLI in bin/, and machine state in ignored .titian/. There is one root dependency graph and one project management flow.
npm ci
npm test
npm run test:manager
npm run test:dependencies
npm auditCI checks Linux Node 22/24/26 and macOS Node 24, including runtime construction. Live integration tests are opt-in: operations. More detail: architecture, migration, troubleshooting, and security.
License
MIT. Dependencies retain their own licenses.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
Use your Mac, Windows or Linux computer from ChatGPT, Claude or Codex: files, commands, documents.
Connect AI assistants to your approved computer for files, commands, browser and desktop tasks.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
EXZA Remote — AI Computer Commander Your computer. Your control. Securely connect your own macOS, Windows or Linux computer to compatible AI clients, including ChatGPT and Claude. EXZA Remote provides 59 MCP tools for authorized file management, terminal operations, system monitoring, desktop automation and email workflows. GETTING STARTED 1. Create an EXZA Remote account. 2. Install the official computer connection client. 3. Pair your device using a temporary six-digit PIN. 4. Approve the connection on your computer. 5. Connect your preferred MCP client using EXZA OAuth. MCP ENDPOINT https://remote.exza.de/mcp TRANSPORT Streamable HTTP with OAuth 2.0 KEY FEATURES • 59 MCP tool interfaces • Secure computer and file access • Terminal commands and background jobs • File search, reading and editing • System monitoring and desktop automation • macOS, Windows and Linux support • Owner-controlled permissions and approvals COMPLETE INSTALLATION & DOCUMENTATION Detailed setup instructions, terminal installation commands, all 59 tools, troubleshooting and security information: https://github.com/exzade/EXZA-Remote/blob/main/docs/GLAMA_OVERVIEW.md Official website: https://remote.exza.de EXZA Remote is an independent, OAuth-protected service. Computer access requires individual account authorization and device-owner approval.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to remotely search, update, manage files, and run terminal commands on a desktop environment via Streamable HTTP with OAuth 2.0, supporting ChatGPT and web agent integrations.943,514 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to search, update, manage files, and run terminal commands on a computer, with remote access via Streamable HTTP and OAuth 2.0 for integration with ChatGPT and web agents.943,514 npm1MIT
- FlicenseNot gradedqualityCmaintenanceEnables ChatGPT, Claude, and Cursor to securely manage a VPS through filesystem operations, system monitoring, and long-horizon command execution, protected by OAuth 2.1 with PKCE.-
- AlicenseNot gradedqualityCmaintenanceEnables authorized remote MCP clients to securely reach local Mac or Windows tools over OAuth, including shell commands, file read/write, background jobs, screenshots, UI control, and clipboard access. It can also expose configured Desktop MCP servers and optional Claude Code task delegation.MIT