Skip to main content
Glama
cphoskins
by cphoskins
README.md
# gamma-app-mcp

<!-- mcp-name: io.github.cphoskins/gamma-app-mcp -->

MCP server for [Gamma.app](https://gamma.app) — generate presentations, documents, webpages, and social posts via the [Gamma Public API v1.0](https://developers.gamma.app). Full parameter surface including templates, folders, headers/footers, and email sharing.

## Features

- **Generate from text** — presentations, documents, webpages, and social posts with the full v1.0 parameter surface
- **Generate from template** — swap content into an existing Gamma template, preserving layout (ideal for batch variants)
- **Poll generation status** — async job tracking with share URL, export URL, and credit usage
- **List workspace themes** — discover real theme IDs (no more hardcoded fallbacks)
- **List workspace folders** — paginated folder discovery for output organization
- **Describe options** — local enum introspection so LLMs can look up valid values without trial and error
- **Structured error surfacing** — Gamma API error codes and payloads flow through instead of being swallowed
- **Input validation** — char limits, enum checks, and format/dimension compatibility verified before network calls

## Installation

```bash
pip install gamma-app-mcp
```

Or install from source:

```bash
git clone https://github.com/cphoskins/gamma-app-mcp.git
cd gamma-app-mcp
pip install -e .
```

## Configuration

### Get your API key

1. Log in to [Gamma.app](https://gamma.app)
2. Go to **Account Settings > API Keys** (`https://gamma.app/settings/api-keys`)
3. Generate a key

> API key access requires a **Pro, Ultra, Teams, or Business** plan.

### Claude Code

```bash
claude mcp add gamma -s user \
  -e GAMMA_API_KEY=sk-gamma-your-key-here \
  -- gamma-app-mcp
```

### Claude Desktop / other stdio hosts

Add to your client config:

```json
{
  "mcpServers": {
    "gamma": {
      "command": "gamma-app-mcp",
      "env": {
        "GAMMA_API_KEY": "sk-gamma-your-key-here"
      }
    }
  }
}
```

### Environment variables

| Variable | Required | Description |
|---|---|---|
| `GAMMA_API_KEY` | Yes | Your Gamma API key (Account Settings > API Keys) |
| `GAMMA_BASE_URL` | No | Override the public API base URL (default: `https://public-api.gamma.app`) |

## Tools

| Tool | Purpose |
|---|---|
| `gamma_generate` | Create a presentation, document, webpage, or social post from text. Full control over format, themes, images, headers/footers, folders, sharing, and export. |
| `gamma_generate_from_template` | Create a variant from an existing Gamma template (`gammaId`), swapping content while preserving layout. |
| `gamma_get_status` | Poll a generation job by `generationId` until status is `completed` or `failed`. Returns `gammaUrl`, `exportUrl`, and credit usage. |
| `gamma_list_themes` | List themes in the authenticated workspace (standard + custom, 50+ themes). Cursor-paginated with `query`/`limit`/`after` — matching `gamma_list_folders`. Surfaces errors instead of falling back to hardcoded defaults. |
| `gamma_list_folders` | List workspace folders the authenticated user is a member of, with query filter and cursor pagination. |
| `gamma_describe_options` | Local lookup of accepted enum values for API parameters — no network call. |

## Example workflow

### 1. Simple presentation

```python
# Via MCP:
gamma_generate(
    input_text="Q3 2026 board update — ARR, burn, hiring plan, risks.",
    format="presentation",
    num_cards=12,
    text_options={"amount": "detailed", "tone": "professional", "audience": "board members"},
    image_options={"source": "aiGenerated", "style": "clean editorial"},
    card_options={"dimensions": "16x9"},
    export_as="pdf",
)
# -> {"generationId": "abc123...", "status": "submitted"}

gamma_get_status("abc123...")
# -> {"status": "completed", "gammaUrl": "https://gamma.app/docs/...", "exportUrl": "...", "credits": {...}}
```

### 2. Template-based batch variant

```python
# Discover theme and folder IDs
gamma_list_themes()
gamma_list_folders(query="Investor")

# Generate from an existing 1-page template
gamma_generate_from_template(
    prompt="Personalized intro deck for Acme Corp, a manufacturing client in Dallas.",
    gamma_id="gamma_tpl_abc123",
    theme_id="theme_xyz",
    folder_ids=["fld_investor_decks"],
    export_as="pptx",
)
```

### 3. Branded deck with header/footer

```python
gamma_generate(
    input_text="...",
    format="presentation",
    card_options={
        "dimensions": "16x9",
        "headerFooter": {
            "topLeft": {"type": "image", "source": "themeLogo", "size": "sm"},
            "bottomRight": {"type": "cardNumber"},
            "bottomCenter": {"type": "text", "value": "Confidential"},
            "hideFromFirstCard": True,
        },
    },
    sharing_options={
        "workspaceAccess": "edit",
        "externalAccess": "view",
        "emailOptions": {
            "recipients": ["team@example.com"],
            "access": "comment",
        },
    },
)
```

## Development

```bash
git clone https://github.com/cphoskins/gamma-app-mcp.git
cd gamma-app-mcp
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest
```

### Release

```bash
./release.sh 0.3.0
git add -A && git commit -m "Release v0.3.0"
git tag v0.3.0
git push origin main --tags
```

The `push --tags` triggers [.github/workflows/publish.yml](.github/workflows/publish.yml), which builds the sdist/wheel, publishes to PyPI via trusted publishing (OIDC, no stored tokens), and creates a GitHub release. See [PUBLISHING.md](PUBLISHING.md) for the one-time PyPI trusted publisher setup.

## API reference

See [GAMMA_API_REFERENCE.md](GAMMA_API_REFERENCE.md) for the full v1.0 endpoint and parameter inventory sourced from [developers.gamma.app](https://developers.gamma.app).

## License

MIT — see [LICENSE](LICENSE). Inspired by [CryptoJym/gamma-mcp-server](https://github.com/CryptoJym/gamma-mcp-server); ground-up Python rewrite with expanded coverage and corrected v1.0 endpoint paths.

TDQS

A4.3/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: parameter discovery, generation from text, generation from template, status polling, folder listing, and theme listing. No two tools overlap in functionality.

Naming Consistency4/5

All tools use snake_case with a 'gamma_' prefix. Most follow a verb_noun pattern, but 'gamma_generate' is just a verb (no noun object), and 'gamma_generate_from_template' uses a preposition. Minor inconsistency does not hinder understanding.

Tool Count5/5

6 tools is well within the typical 3-15 range. Each tool serves a necessary role in the Gamma generation workflow without redundancy or bloat.

Completeness4/5

Covers the core generation lifecycle: parameter exploration, creation (two variants), status polling, and resource listing. Missing listing of existing Gammas or deletion, but these are not essential for the stated generation purpose.

Maintenance

ActivityInactive
ResponsivenessUnresponsive