Skip to content

Tutorial: Installation

In this tutorial you'll install Panel Live Server so that the pls command is available in your terminal. By the end, pls --version will print the installed version.

What You'll Need

  • Python 3.12 or later
  • A package manager: uv, pip (built into Python), or pixi

Install Panel Live Server

# Install
uv tool install "panel-live-server[pydata]"

# Find the pls path
which pls
# typically: /home/<user>/.local/bin/pls
# Create and activate a virtual environment
python -m venv venv
source venv/bin/activate  # on Linux/macOS

# Install
pip install "panel-live-server[pydata]"

# Find the pls path
which pls
# typically: /path/to/venv/bin/pls
# Initialize and install
pixi init
pixi add python
pixi add --pypi "panel-live-server[pydata]"

# Find the pls path
pixi run which pls
# typically: /path/to/project/.pixi/envs/default/bin/pls

The [pydata] extra includes the full visualization stack used in these tutorials:

hvplot · plotly · altair · matplotlib · seaborn · holoviews · polars · duckdb · and more

Only need the core server?

Install without extras if you only want to serve your own code and manage packages yourself:

uv tool install panel-live-server
pip install panel-live-server
pixi add --pypi panel-live-server


Verify the installation

pls --version

You should see the installed version printed. If the command is not found, ensure your uv tools directory is on your PATH — run uv tool update-shell and restart your terminal.


Connect to your MCP client

Add to .vscode/mcp.json (create if it doesn't exist):

{
  "servers": {
    "panel-live-server": {
      "type": "stdio",
      "command": "/path/to/pls",
      "args": ["mcp"]
    }
  }
}

Use your absolute path

Replace "command": "/path/to/pls" with the path printed by which pls above — e.g. "command": "/home/user/.local/bin/pls"

Add to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "panel-live-server": {
      "command": "/path/to/pls",
      "args": ["mcp"]
    }
  }
}

Use your absolute path

Replace "command": "/path/to/pls" with the path printed by which pls above — e.g. "command": "/home/user/.local/bin/pls"

Open Cursor Settings → MCP and verify the green dot. Use Agent mode in chat.

Edit the config file for your OS:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "panel-live-server": {
      "command": "/path/to/pls",
      "args": ["mcp"]
    }
  }
}

Use your absolute path

Replace "command": "/path/to/pls" with the path printed by which pls above — e.g. "command": "/home/user/.local/bin/pls"

Restart Claude Desktop.

claude mcp add panel-live-server -- /path/to/pls mcp

Use your absolute path

Replace /path/to/pls with the path printed by which pls above — e.g. claude mcp add panel-live-server -- /home/user/.local/bin/pls mcp

claude.ai requires HTTP transport and a public URL. You can use any tunneling service (ngrok, Cloudflare, localhost.run, etc.) — this example uses Cloudflare.

Terminal 1 — start the MCP server:

/path/to/pls mcp --transport http --port 8001

Use your absolute path

Replace /path/to/pls with the path printed by which pls above — e.g. /home/user/.local/bin/pls mcp --transport http --port 8001

Terminal 2 — tunnel for the MCP server:

cloudflared tunnel --url http://localhost:8001

Terminal 3 — tunnel for the Panel server:

cloudflared tunnel --url http://localhost:5077

Stop Terminal 1, set the Panel tunnel URL, and restart:

export PANEL_LIVE_SERVER_EXTERNAL_URL=<url-from-terminal-3>
/path/to/pls mcp --transport http --port 8001

Then go to claude.ai → Settings → Connectors → Add custom connector and enter <url-from-terminal-2>/mcp as the URL.

Once connected, ask your AI: "Show me a scatter plot of this data using the show tool."


Without an AI assistant — use the REST API or the browser UI directly.

import requests

r = requests.post(
    "http://localhost:5077/api/snippet",
    json={
        "code": "import panel as pn\npn.widgets.IntSlider(name='x', start=0, end=100)",
        "name": "Slider",
        "method": "inline",
    }
)
print(r.json()["url"])  # http://localhost:5077/view?id=...
/path/to/pls serve
# Open http://localhost:5077/add in your browser

Add packages to the server environment

Because Panel Live Server runs in an isolated tool environment, it executes your Python snippets using the packages installed in that environment. To add a package:

uv tool install --with my-package "panel-live-server[pydata]"

You can chain multiple --with flags:

uv tool install --with prophet --with xgboost "panel-live-server[pydata]"

Upgrading

To upgrade to the latest version:

uv tool upgrade panel-live-server

pixi add --pypi my-package

For example, to add prophet:

pixi add --pypi prophet

Upgrading

To upgrade to the latest version:

pixi upgrade panel-live-server

No server restart is needed — the package is available immediately the next time the server starts.


What You've Learned

  • Install Panel Live Server as a uv tool with the [pydata] extras
  • Verify the installation with pls --version
  • Add extra packages to the server environment with --with

Next Steps