Pommier / Guides

Remote access

Your Mac.
A little further within reach.

How the remote connection works, what it exposes, and the controls that let you manage it.

Technical guide · Pommier 0.5.1 · Updated October 8, 2026

Your Mac still does the work.

Remote Access lets a compatible cloud AI client reach Pommier while it runs on your Mac. The Apple app operations still happen on that Mac. Requested results travel back to the client.

Pommier runs its own Tailscale node, with a separate identity and hostname. It stays joined to its chosen tailnet—your Tailscale network—even when the Mac’s regular Tailscale app disconnects or switches networks. Pommier does not reconfigure that system app.

  1. Cloud clientHTTPS + access token

    Calls the registered public MCP address.

  2. Tailscale FunnelPublic transport

    Routes the connection to Pommier’s dedicated node.

  3. Pommier on your MacOAuth validation

    Checks the request, then runs the Apple tool under your Mac’s grants.

Results return along the connection to the AI client. This diagram describes tool requests; browser authorization is a separate, tailnet-only step.

A reachable URL is only one part of access.

Funnel makes the endpoint reachable from the internet. Pommier requires OAuth for MCP requests. The public address alone is not a credential.

Before you connect.

  • An awake, online Mac running Pommier. Sleep, quitting the app or losing connectivity interrupts access.
  • A working local setup. Complete the Apple app permissions and verify the tools you intend to use.
  • A Tailscale tailnet with MagicDNS, HTTPS and Funnel permission for Pommier’s dedicated node. Tailnet policy changes may require an administrator.
  • A compatible cloud client with Streamable HTTP MCP, OAuth support, a known callback URI, and support for pre-registered client credentials. Plan and workspace policies can also affect availability.
  • A browser connected to the same tailnet for client administration and new authorization. The cloud client’s tool requests do not need to originate inside that tailnet.

The built-in identity service is based on tsidp, which is experimental. Client compatibility and setup requirements should be checked for the client you use.

Set it up in Pommier.

Open Remote Access… from the menu bar, or Set Up Remote Access… from the Pommier window.

  1. Give the node a home

    Choose a Node name, select Sign In to a Tailnet…, then Continue Sign-in… when offered. Join the tailnet you want Pommier to use and approve the node if required. The window shows the connected identity and public MCP address.

  2. Add the generated policy entries

    Use Copy Policy Entries and Open Tailnet Policy…. Merge Pommier’s entries into the existing policy, preserving other entries. They grant the node owner access to administration and the exact MCP resource, and allow Funnel for this node.

  3. Register your cloud client

    From a browser on the tailnet, open Open OAuth Clients…. Register the client’s exact callback URI. Enter the issued client ID and secret in the cloud client’s connection settings. Add the client ID and a recognizable connection name to Pommier, then choose Save Clients. Treat the secret as a credential; do not put it in a prompt or public page.

  4. Start OAuth

    Choose Check & Start OAuth. Discovery and token endpoints become publicly reachable, while authorization and administration remain tailnet-only.

  5. Enable Remote Access

    Pommier checks discovery and invalid-token rejection, starts its protected listener, and verifies that anonymous access returns HTTP 401 before publishing /mcp. Copy the displayed public MCP address into the cloud client.

  6. Authorize and try a read

    Complete the client’s authorization flow in a browser connected to the node’s tailnet. Try a simple read, then inspect Request History for its result and remote source. Successful setup checks do not by themselves prove the client’s full connection works.

What is checked on every request.

Pommier introspects the access token through its identity service. A request needs an active, unexpired token with:

  • The configured OAuth issuer.
  • The exact public MCP resource in its audience.
  • The dedicated node owner’s numeric user identity.
  • A client ID on Pommier’s allowed list.
  • The required openid scope.

ID tokens are rejected. Validation failures deny access, and successful validations are not cached. Removing a client ID blocks its next request; a request that already passed authorization may finish.

OAuth and listener details

Clients must be registered in advance: the bundled tsidp version does not allow dynamic client registration over Funnel. Authorization and token requests must include resource=<public MCP URL> and scope openid. That scope identifies the user; it does not narrow the set of Apple tools.

The protected listener binds to 127.0.0.1:8766. The embedded identity service performs introspection through a private Unix socket with account-restricted filesystem permissions. This control socket is not published through Funnel.

Authentication is not read-only access.

Remote clients receive the same Apple tools as local clients, including writes and destructive operations allowed by your Mac permissions. There is no general per-tool filter or extra write confirmation. Email sending additionally requires Also allow remote clients in Mail’s Sending settings.

What is public, and what stays local.

SurfaceAccess boundary
Remote /mcpInternet-reachable through Funnel; each MCP request requires a valid OAuth access token.
OAuth discovery & token endpointsPublicly reachable for the OAuth flow. Token issuance still follows OAuth credential and grant checks.
Authorization & OAuth administrationTailnet-only. Use a browser connected to Pommier’s tailnet.
Public landing page & iconsAvailable without authentication. They do not expose Apple content.
Local MCP at port 8765Loopback-only and unauthenticated. Processes on the Mac can call it. It is never the endpoint to publish.
History, replay & app controlsRemain local and are not exposed by the remote MCP listener. Native control APIs use a per-launch credential.

Never forward port 8765 or put its local MCP address behind a tunnel. Use the separate Remote Access flow so the public connection gets Pommier’s authentication checks.

The remote MCP listener limits request bodies to 1 MiB, admits up to 8 concurrent requests and limits admission to 240 requests per minute. These controls do not replace permission or client review.

Sessions can survive a restart.

Registered cloud clients can refresh their sessions after Pommier or its node restarts. Pommier saves a file of refresh-token hashes, bound to the node owner and node identity. It does not save raw refresh tokens, access tokens or client secrets in that session file.

  • Refresh requires the client’s current secret. Refresh tokens are single-use.
  • A refresh token expires after 30 days without use. A session also ends 90 days after its original sign-in.
  • If session persistence fails, it is disabled and saved state is removed; clients must authorize again after the next restart.
  • Removing an allowed client or deleting its OAuth registration revokes its saved sessions.

Previously enabled remote services can resume after the local server becomes healthy. An explicit Disable Remote Access preference is preserved across launches.

Pause, remove a client, or sign out.

Save Clients
Apply changed client IDs and connection names while the listener stays running. A removed client is blocked on its next request and its saved sessions are revoked. Names help identify future history entries; they do not replace client IDs.
Disable Remote Access
Close public ingress and existing public connections, then drain the remote MCP listener. Private OAuth administration remains available. This saves an off preference across launches.
Stop All Services / Quit Pommier
Stop the local and remote services. Stop All Services preserves the saved remote preference, so Start All Services or Restart All Services can restore it.
Sign Out Cloud Sessions…
Sign out every connected cloud session. Clients must authorize again; this does not remove the node’s tailnet identity.
Sign Out of Tailnet…
After confirmation, stop remote access, log out the dedicated node when reachable, and remove its saved identity, OAuth keys and client registrations. If logout cannot reach Tailscale, remove the old device in the tailnet admin console. The system Tailscale app is untouched.

Stopping access does not undo an operation that already happened, and requests already authorized may have taken effect. Review Request History when the outcome is uncertain.

When a connection needs attention.

I can’t open authorization or the client admin page.

Connect the browser’s device to the same tailnet as Pommier’s dedicated node. Those routes deliberately remain private. Switching the Mac’s system tailnet does not move Pommier’s node.

The cloud client receives an authorization error.

Check the exact callback URI, issued client credentials, allowed client ID, requested resource URL and scope. Confirm you are authorizing as the node owner. Reauthorize if the session was signed out or expired.

The address is unreachable.

Check that the Mac is awake and online, Pommier is running, the dedicated node is connected, and Remote Access is enabled. Review the generated tailnet policy requirements. Other VPNs and exit nodes can affect the underlying connection.

The connection works, but an Apple tool fails.

OAuth access does not grant macOS permissions. Review the relevant Apple app’s checklist, account setup and sync state, then check Request History. A timeout may leave an operation running; do not retry a write automatically.

Does pommier.app become my remote MCP address?

No. The product website and your Mac’s MCP service are separate. Use the dedicated node’s public MCP URL displayed in Pommier, not the website’s domain.

The other half of access

Start with the Mac’s permissions.

Understand what each grant enables before connecting a client.

Read the permissions guide