Local server and MCP

Local server, MCP services and permission scope.

1. Start and connect

MCP connects the chat to computer tools and external services. You need the local ZeroChat server. Choose one installation method:

PyPI (recommended)

Linux, macOS and Android (Termux):

pip install zerochat
zerochat

Windows (PowerShell or CMD): use the py launcher, which works even if Python's Scripts folder is not on PATH.

py -m pip install zerochat
py -m zerochat

Direct download

Linux, macOS and Android (Termux):

curl -fsSL https://albalday.github.io/zerochat/zerochat.py -o zerochat.py
python3 zerochat.py

Windows (PowerShell or CMD): curl.exe ships with Windows 10 and 11; in PowerShell type it with .exe to avoid the Invoke-WebRequest alias.

curl.exe -fsSL https://albalday.github.io/zerochat/zerochat.py -o zerochat.py
py zerochat.py

For subsequent launches, use zerochat (or py -m zerochat on Windows) or python3 zerochat.py (py zerochat.py on Windows), respectively. Both open GitHub Pages and store local data in ~/zerochat/.

  1. Keep the server running and open the link it provides.
  2. Go to Settings → MCP and check the connection and discovered tools.
  3. Enable the tools you need and review their permissions.

The link zerochat opens the browser with carries the daily token; the page stores it and reconnects by itself on later launches. If disconnected, check that the process is running and review the browser's local network access permissions. For a server on another port, on another computer (through an SSH tunnel) or behind a reverse proxy, use the Connection panel (the plug icon next to the settings wheel in the sidebar): turn off Local connection, enter its URL and press Connect. If the token is missing or has expired (it changes every day), the page asks for the user name and password of the account running zerochat; the password is not stored. Do not share the startup link.

Browser compatibility: ZeroChat does not support WebKit (Safari and every browser on iPhone/iPad). On macOS it should work with Firefox or a Chromium-based browser, although it has not been tested. More details. Tested environments: Linux, Windows (PowerShell) and Android (Termux). Playwright cannot currently be used on Termux, so browser_action and Playwright MCP are not available.

Usage modes, local data and updates →

2. Use computer tools

Tool results become part of the conversation and may be sent to the selected model.

3. Start an external MCP service

In Settings → MCP → Available MCP servers, configure each service and select Start. ZeroChat prepares its declared dependencies. To stop a service, select Stop.

Included servicePurpose and requirements
ejemploTemplate for custom services; no dependency downloads.
composioRemote apps through mcp-remote and OAuth; Node.js 18+ and npm.
playwrightBrowser automation; Node.js 18+, npm and Chromium. Its browser is set up in Settings › Browser, and its tools are only offered if Playwright MCP is chosen there.
memoryMemory and knowledge graphs; Node.js 18+ and npm.

Install Node.js on Windows

Open PowerShell and install the LTS release with winget, included with Windows 10 and 11:

winget install OpenJS.NodeJS.LTS

You can also download the LTS installer (.msi) from nodejs.org and keep the default options, which add Node.js and npm to the PATH.

  1. Close PowerShell and open a new window so the updated PATH is loaded.
  2. Check the installation with node --version and npm.cmd --version.
  3. Restart ZeroChat from that new window: the server only detects Node.js and npm if they were on the PATH when it started.

If npm --version fails with a script execution policy error, use npm.cmd. ZeroChat is not affected by that policy.

Startup and OAuth

The button shows Starting and stays disabled. If startup exceeds 15 seconds, ZeroChat checks the status and waits in 15-second intervals: up to 20 minutes while it installs dependencies (for example, Playwright and its browser) or awaits OAuth authorization, and up to ten more intervals while it starts. Installation and the OAuth wait are not treated as failures when the first timeout expires; once the service is active, the panel updates automatically. The button shows the attempt number.

If the service needs OAuth, its card shows an Authorization required notice with an Authorize in browser button. ZeroChat tries to open the authorization tab; if the browser blocks it, press the button. Because it opens from the web page itself, it also works on Android and Termux. If the wait expires, the service may still be starting; reload the page to check the outcome.

Services are not restarted automatically on the next ZeroChat startup. If any were active in the previous session, a dialog lists them when connecting: remove the ones you do not want with the X and press Start to launch the rest, or Do not start to leave them stopped. Services that are not started are saved as not started and are not offered again. If any fails, ZeroChat reports it and the error stays on its card in this panel.

Actions in this panel apply immediately: they do not need Save.

If installation fails

Read the card's error. Check node --version, npm --version, network access and free disk space, then try again. You do not need to reinstall ZeroChat. On Windows, see Install Node.js on Windows.

4. Review permissions

In Settings → Permissions, choose the global policy and review saved authorizations. In the MCP panel, choose Ask, Allow or Deny for each tool.

Decisions may apply to one call, the backend session or permanently. External tools are named <service>_<tool>: trusting composio authorizes its tools, not those of other services. Allowing one tool does not authorize the whole service.

Allowed directories: one rule per line, with R: (read), W: (write) or RW: (both). Use * for one segment and ** for subdirectories. An empty list adds a read rule for the startup directory. Paths with ~ or variables are not resolved in the browser and always ask for confirmation: use absolute paths. Commands also have prefix rules and additional checks.

Always allow a command: authorizes only that program, without chaining, pipes or redirection to files. A leading cd <folder> && is accepted when a directory rule covers the folder, as is the command working directory. Authorizing a program trusts all of its options: git can run other commands through its configuration or aliases.

These rules are not an operating system sandbox. Authorized commands and services act with the local process's permissions. Stopping a call does not undo its changes.

5. Add your own service

Create a new folder under ~/zerochat/services/ with its own name and unique id. Use ejemplo as the template: service.json is required; add installer.json only for npm packages. The template's README.md documents the fields, including an optional help link.

You can ask the agent to create the definition using either prompt below. Replace the placeholders. The agent prepares files; you enter credentials and start the service.

Prompt for a local MCP (stdio)

I want to create the local MCP <mcp-name> for ZeroChat.
Locate the user's home directory and read README.md, service.json
and installer.json.example in zerochat/services/ejemplo using
absolute paths. Follow the README instructions.
Read the MCP's official documentation and create a sibling folder
with its own name and id; do not modify the bundled services.
If it needs an API key, put PASTE_API_KEY_HERE in service.json,
inside the env object under launch, using the required variable.
I will manually replace the placeholder with my key in service.json.
Do not ask for my key or create a launch.env or .env file.
Give me the absolute JSON path and the field to edit manually.
Do not install or start it; I will do that from Settings → MCP.

Prompt for a remote MCP (HTTP/SSE)

The managed mcp-remote process uses stdio with ZeroChat and HTTP/SSE with the provider. Use Composio as a bridge example, adapting its authentication to the new provider.

I want to create the remote MCP <mcp-name> for ZeroChat.
Its endpoint is <mcp-url>.
Locate the user's home directory and read README.md in
zerochat/services/ejemplo and the JSON files in
zerochat/services/composio using absolute paths. Follow the README
and use Composio as an example of a managed stdio mcp-remote bridge.
Create a sibling folder with its own name and id and bilingual text.
Read the MCP's and bridge's official documentation to adapt the
endpoint, transport and authentication. Verify Composio's specific
OAuth and protocol options before copying any of them.
Keep HOME and USERPROFILE isolated inside ${serviceDir}.
If an API key is required, put PASTE_API_KEY_HERE in service.json,
inside the env object under launch. I will enter my key manually
in service.json; do not create a launch.env or .env file.
Configure --header with the provider's required header and a
reference to that variable; mcp-remote will resolve the reference.
Do not ask for my key or put it in the arguments or URL.
Give me the absolute JSON path and the field to edit manually.
Do not install or start it; I will do that from Settings → MCP.

If the new folder does not appear in Settings → MCP, restart ZeroChat and reconnect. Your own folders survive updates. Bundled definitions (ejemplo, composio, playwright, memory) are restored at startup; create a copy with a new name and id instead of editing them. Do not copy dependencies or OAuth credentials.

6. Enter an API key

launch.env means the env object under launch in service.json; it is not a file. The agent leaves the placeholder and you manually enter the real key in that JSON.

  1. Stop the service if it is running. Open your folder's service.json.
  2. Replace PASTE_API_KEY_HERE inside launch.env with the real key, using the exact variable name required by the provider. Do not paste it into the chat.
  3. Save valid JSON. On Linux or Termux restrict access with chmod 600 /absolute/path/zerochat/services/my-service/service.json.
  4. Start the service from Settings → MCP.

The key is stored in plain text: do not share or commit this file. Deleting ~/zerochat/ also removes services and credentials; keep a private backup if needed.

Example for a local service

Inside launch, use the variable name specified by the MCP:

"env": {
  "SERVICE_API_KEY": "PASTE_API_KEY_HERE"
}

No export, .env file or extra credentials JSON is needed. Write the actual value in launch.env; environment variable references there remain literal text. ZeroChat expands service/interpreter paths and ${option:...} references.

Example for a remote service with a Bearer header

Adapt the bridge arguments and preserve the existing HOME and USERPROFILE isolation:

"args": [
  "${serviceDir}/node_modules/mcp-remote/dist/proxy.js",
  "https://mcp.example.com/mcp",
  "--header",
  "Authorization: Bearer ${REMOTE_API_KEY}"
],
"env": {
  "HOME": "${serviceDir}",
  "USERPROFILE": "${serviceDir}",
  "REMOTE_API_KEY": "PASTE_API_KEY_HERE"
}

mcp-remote resolves ${REMOTE_API_KEY} in the header. Use the provider's required header and format. remote.authentication is descriptive; it does not configure authentication. See the bridge header documentation.