Skip to main content
Glama
README.md
# Genesys MCP

**Vendor-neutral Model Context Protocol server for Genesys Cloud.**

`genesys-mcp` is a Model Context Protocol (MCP) server that exposes Genesys Cloud
platform capabilities — queues, conversations, users, presence, analytics — as
MCP tools, resources, and prompts. Any MCP-compatible AI agent can speak to
Genesys through it: Claude Desktop, Claude Code, Cursor, Continue, Cline, and
any custom agent built on LangGraph, LangChain, CrewAI, AutoGen, or a raw
provider SDK.

## Status

**v0.1.0 — pre-release.** The framework, transports, and reliability layer are
in place. The first batch of read-only tools lands in v0.2; curated writes
(behind `--enable-writes`) and Resources/Prompts land in v0.3. The v1.0 launch
ships everything together with PyPI, Docker (GHCR), an `npx` shim, and an MCPB
bundle.

## Why

The MCP ecosystem already has a Genesys Cloud server, but it ships stdio-only
without HTTP transport, has no per-request auth context (a single module-global
boolean gates the whole process), and has no production reliability layer
(no 429 handling, no token refresh, no structured logging). `genesys-mcp` is
designed for the production surface: hosted-ready Streamable HTTP, per-request
auth, 429-aware retry, refresh-on-401, structured logs, and OpenTelemetry
tracing — all from day one, all vendor-neutral.

## Quickstart

> Tools are not yet shipped — these snippets show the install pattern. v0.2
> will list the actual tool surface here.

### Claude Desktop

Add an entry under `mcpServers` in your `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "genesys": {
      "command": "uvx",
      "args": ["genesys-mcp"],
      "env": {
        "GENESYS_REGION": "mypurecloud.com",
        "GENESYS_CLIENT_ID": "...",
        "GENESYS_CLIENT_SECRET": "..."
      }
    }
  }
}
```

### Claude Code or Cursor

Add an entry to your editor's MCP server config (`.claude/settings.json` for
Claude Code, the Cursor MCP settings panel for Cursor):

```json
{
  "mcpServers": {
    "genesys": {
      "command": "genesys-mcp",
      "args": ["--transport", "stdio"],
      "env": {
        "GENESYS_REGION": "mypurecloud.com",
        "GENESYS_CLIENT_ID": "...",
        "GENESYS_CLIENT_SECRET": "..."
      }
    }
  }
}
```

### Programmatic Python

Connect via the official `mcp` Python client over stdio or HTTP:

```python
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

params = StdioServerParameters(command="genesys-mcp", args=["--transport", "stdio"])

async with stdio_client(params) as (read, write):
    async with ClientSession(read, write) as session:
        await session.initialize()
        # tools = await session.list_tools()  # available from v0.2
```

For HTTP transport, run `genesys-mcp --transport http --port 8000` and connect
your MCP client to `http://localhost:8000`.

## Install

```bash
pip install genesys-mcp
```

> Coming v1.0: published on [PyPI](https://pypi.org/project/genesys-mcp/),
> [GHCR](https://ghcr.io/digitalvanguardsolutions/genesys-mcp),
> [npm shim](https://www.npmjs.com/package/@digitalvanguardsolutions/genesys-mcp),
> and as an MCPB bundle attached to GitHub Releases.

## Transports

| Transport | Use case | CLI |
| --- | --- | --- |
| `stdio` (default) | Local clients — Claude Desktop, Claude Code, Cursor, `npx` invocation | `genesys-mcp` |
| `http` | Networked / hosted deployment, multi-agent gateways | `genesys-mcp --transport http --host 0.0.0.0 --port 8000` |

Both transports share the same tool surface. Transport selection is
environment-driven (`MCP_TRANSPORT=stdio|http`) or CLI-driven (`--transport`).

### Security

The HTTP transport in v0.x ships **unauthenticated**. The MCP framing layer
does not perform any caller authentication; the server trusts whatever
process can reach the listening port. Operators have two responsible
deployment options:

1. Bind to `127.0.0.1` only (the default `MCP_HOST`) and let local agents
   connect over loopback.
2. Bind to a non-loopback address only behind a reverse proxy (nginx, Caddy,
   Cloudflare Access, an API gateway) that performs authentication and
   authorisation before forwarding to `genesys-mcp`.

Binding to `0.0.0.0` without a fronting auth layer exposes the upstream
Genesys credentials to anyone on the network. The Docker image therefore
defaults `MCP_HOST=127.0.0.1`; operators who genuinely need a public bind
must opt in explicitly with `-e MCP_HOST=0.0.0.0`.

A hosted, multi-tenant gateway with first-class authentication, audit, and
RBAC is on the Pro/SaaS roadmap (see ADR-006 in `docs/warm/decisions.md`).

## Trust model

A few things to know before installing plugins or running this in
production:

- **Entry-point plugins** (the `genesys_mcp.plugins` group) execute in the
  server process with full access to every dependency, environment variable,
  and Genesys credential the server has. Only install plugins you trust.
- **The license hook** (`genesys_mcp.license` group) is a feature gate, not
  a security control. Any installed package can register one and any plugin
  can ignore the answer. It exists so the Pro package can express
  entitlements; treat it accordingly.
- **OAuth client secrets** are loaded from environment variables (and the
  `.env` file if present) and the server itself never logs them. We cannot
  guarantee the same of downstream plugins — vet them, or run with
  `LOG_LEVEL=INFO` and inspect output before trusting them with secrets.

## Configuration

Configuration is read from environment variables (or a `.env` file). See
`.env.example` for the full list. The most important variables:

| Variable | Default | Description |
| --- | --- | --- |
| `MCP_TRANSPORT` | `stdio` | Transport selection (`stdio` or `http`) |
| `MCP_HOST` | `127.0.0.1` | HTTP bind host |
| `MCP_PORT` | `8000` | HTTP bind port |
| `LOG_LEVEL` | `INFO` | `DEBUG` / `INFO` / `WARNING` / `ERROR` / `CRITICAL` |
| `GENESYS_MCP_ENABLE_WRITES` | `false` | Opt-in to low-blast-radius write tools |
| `GENESYS_REGION` | `mypurecloud.com` | Genesys Cloud region (e.g. `mypurecloud.de`, `apne2.pure.cloud`) |
| `GENESYS_CLIENT_ID` | — | OAuth Client Credentials client id |
| `GENESYS_CLIENT_SECRET` | — | OAuth Client Credentials client secret |

## Development

```bash
git clone https://github.com/digitalvanguardsolutions/genesys-mcp.git
cd genesys-mcp

uv sync --all-extras

uv run pytest
uv run ruff check src tests
uv run mypy src

uv run genesys-mcp --transport stdio
```

`pre-commit install` will wire up `ruff`, `mypy`, and a pre-push `pytest` run.

## License

MIT — see [LICENSE](LICENSE). Copyright 2026 Digital Vanguard Solutions.