Skip to main content
Glama
gschaer

Zendesk Help Center MCP Server

by gschaer
README.md
# Zendesk Help Center MCP Server

A read-only MCP (Model Context Protocol) server for querying public Zendesk Help Center APIs. Lets AI agents browse, search, and fetch documentation from any public Zendesk Help Center.

## Features

- Browse Help Center structure (categories, sections, articles)
- Fetch article content as clean markdown
- Search articles by keyword
- Browse community posts and comments
- Locale-aware (filter by language)
- HTTP response caching (7-day TTL via hishel)
- Works with any public Zendesk Help Center (no auth required)

## Installation

Requires Python 3.10+.

```bash
git clone <repo-url>
cd zendesk
uv sync
```

Or with pip:

```bash
pip install -e .
```

## Configuration

### Claude Code

Add a `.mcp.json` file to your project root (or any project that needs Zendesk HC access):

```json
{
  "mcpServers": {
    "zendesk-hc": {
      "command": "uv",
      "args": ["--directory", "/path/to/zendesk-hc-mcp", "run", "zendesk-hc-mcp"]
    }
  }
}
```

Replace `/path/to/zendesk-hc-mcp` with the **absolute path** to where you cloned this repo. Do not use `~` — tilde expansion does not work in MCP config.

### Claude Desktop

Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):

```json
{
  "mcpServers": {
    "zendesk-hc": {
      "command": "uv",
      "args": ["--directory", "/path/to/zendesk-hc-mcp", "run", "zendesk-hc-mcp"]
    }
  }
}
```

Note: `uv` must be on `PATH` for the MCP host process to find it.

## Available Tools

All tools take `subdomain` as the first parameter (e.g., `"support.zendesk.com"`). All tools accept `force_refresh=True` to bypass the cache. Most tools accept an optional `locale` parameter (e.g., `"en-us"`, `"ru"`) to filter by language.

### Structure Browsing

| Tool | Description |
|---|---|
| `list_categories(subdomain, locale?)` | Entry point: shows locales, categories, and section counts |
| `list_sections(subdomain, category_id?, locale?)` | Sections, optionally filtered by category |

### Content Retrieval

| Tool | Description |
|---|---|
| `get_article(subdomain, article_id)` | Single article with full markdown body |
| `get_articles(subdomain, article_ids)` | Batch fetch multiple articles concurrently |
| `get_section_articles(subdomain, section_id, locale?, include_body?, max_articles?)` | TOC by default; set `include_body=True` for full text |
| `search_articles(subdomain, query, locale?, limit?)` | Keyword search with snippets (no bodies) |

### Community

| Tool | Description |
|---|---|
| `list_community_topics(subdomain)` | Forum topics |
| `list_community_posts(subdomain, topic_id?, limit?)` | Posts with body previews and comment counts |
| `get_community_post(subdomain, post_id)` | Full post with comments |

## Usage Examples

**Discover a Help Center's structure:**
```
list_categories("support.zendesk.com")
```

**Browse sections in a category:**
```
list_sections("support.zendesk.com", category_id=360001006608)
```

**Fetch all articles in a section (TOC only):**
```
get_section_articles("support.zendesk.com", section_id=360000031847)
```

**Fetch articles with full content:**
```
get_section_articles("support.zendesk.com", section_id=360000031847, include_body=True, max_articles=5)
```

**Search for articles:**
```
search_articles("support.zendesk.com", query="API")
```

## Cache

Responses are cached for 7 days in `.cache/` (project-local) using hishel (SQLite-backed HTTP cache).

- Use `force_refresh=True` on any tool to bypass the cache
- Delete the `.cache/` directory to clear all cached data
- The `.cache/` directory is gitignored

Override the default TTL (in seconds) with the `ZENDESK_HC_CACHE_TTL` environment variable in your `.mcp.json`:

```json
{
  "mcpServers": {
    "zendesk-hc": {
      "command": "uv",
      "args": ["--directory", "/path/to/zendesk-hc-mcp", "run", "zendesk-hc-mcp"],
      "env": {
        "ZENDESK_HC_CACHE_TTL": "86400"
      }
    }
  }
}
```

## Development

```bash
# Install dev dependencies
uv sync

# Run tests
uv run pytest -v

# Run the server (stdio mode)
uv run zendesk-hc-mcp
```

## Contributing

Contributions are welcome! To get started:

1. Fork the repository
2. Create a feature branch (`git checkout -b feature/my-feature`)
3. Install dev dependencies: `uv sync`
4. Make your changes following TDD (write tests first)
5. Run the test suite: `uv run pytest -v`
6. Ensure coverage stays above 90%: `uv run pytest --cov=zendesk_hc_mcp --cov-report=term-missing`
7. Submit a pull request

See [CLAUDE.md](CLAUDE.md) for architecture details and development conventions.

## Disclaimer

This project is not affiliated with, endorsed by, or sponsored by Zendesk, Inc. "Zendesk" is a registered trademark of Zendesk, Inc. This tool accesses the publicly available Zendesk Help Center API and is intended for lawful, read-only use.

## License

[MIT](LICENSE)

TDQS

A4.2/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a distinct resource and action: categories, sections, articles, search, and community topics/posts. While get_article and get_section_articles both return article content, their inputs and purposes are clearly separated.

Naming Consistency5/5

All tools use a consistent lowercase snake_case verb_noun pattern, such as list_categories, get_article, and search_articles. The naming clearly reflects what each tool does with no mixed conventions.

Tool Count5/5

Nine tools is a well-scoped size for a Help Center browsing server. Each tool serves a distinct purpose in the content hierarchy without redundancy or bloat.

Completeness4/5

The server covers the core read-only Help Center workflows: exploring structure, retrieving articles, searching, and browsing community content. Minor gaps include not having dedicated get_category or get_section detail tools, but these are not blocking for typical browsing use cases.

Maintenance

ActivityInactive
ResponsivenessNo issues