はじめに
Claude CodeやGitHub Copilotの登場により、LLMを活用した開発体験は大きく変わりました。しかし、新しいSaaS製品を使い始めるたびに、同じ課題に直面します: LLMの学習データカットオフの影響で、使用しているツールの最新機能や正確な使用方法をLLMが知らないという問題です。
開発中にClaude Codeで「このツールでこれはできるのか?」と質問しても、LLMの学習データが古ければ、正確な情報は得られません。その結果、何度もブラウザで公式ヘルプを開く、という非効率な作業フローが発生してしまいます。
本記事では、Zendesk Help Center APIを使ってSaaSのヘルプを取得し、社内MCPサーバーとして構築することで、Claude Code/Copilotに常に最新の製品情報を提供する方法を紹介します。これにより、開発中にあたかも最新版のLLMとやり取りしているような体験が実現できます。
解決したい課題
- 社内のチームがSaaSツール(mablなど)を使用している
- LLMの学習データには古い情報しか含まれていない: Claude Codeで「mablで仕様書からmabl上で動作するテストを作成することはできますか?」と聞いても、最新機能は返ってこない
-
さらに厄介な問題1: SaaSのヘルプサイトのほとんどが、ロボットやエージェント(LLMのモデル作成時)に対して
404 Access Errorを返す仕様になっている。結果として、LLMが直接ヘルプページにアクセスして情報補強することもできない -
さらに厄介な問題2: ブラウザで公式ヘルプを開き、URLをLLMに渡しても、LLMは
404 Access Errorを返すため、ヘルプの内容を参照できない - その結果: 開発フローが度々中断され、生産性が低下
解決策: Zendesk Help Center API + MCPサーバー
以下の流れで実装します:
- Zendesk Help Center APIで記事を取得(認証不要・無料)
- SQLiteに保存し、日本語対応の全文検索を実現
- MCPサーバーとして構築
- Claude Code/Copilotに登録
これにより、開発中にチャット形式で最新ヘルプを参照できるようになります。
なぜこのアプローチか?
- Zendesk API は公開情報のため、認証不要・無料
- SQLite + FTS5(Full-Text Search)で日本語対応の検索実現
- MCP(Model Context Protocol)でClaude Code/Copilotと統合可能
- 公開APIの利用で、スクレイピング回避
実装の全体像
Zendesk Help Center API
↓ (記事・セクション・カテゴリ取得)
fetch_zendesk.py
↓
zendesk.db (SQLite + FTS5)
zendesk_cache.json
data/hc/ja/articles/*.md
↓
mcp_server.py (MCPサーバー)
↓
Claude Code / GitHub Copilot
セットアップ手順
1. リポジトリのクローン
git clone https://github.com/mfunaki/mabl-help-japanese
cd mabl-help-japanese
2. Python環境の準備(pyenv推奨)
# pyenvのインストール
curl https://pyenv.run | bash
# .bashrc / .zshrc に pyenv を追加
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
# Python 3.13 (適切なバージョン)をインストール
pyenv install 3.13.0
pyenv local 3.13.0
# 確認
python --version # Python 3.13.0
3. 依存パッケージのインストール
pip install -r requirements.txt
requirements.txt の内容:
requests>=2.32
mcp[cli]>=1.0
markdownify>=0.13
uvicorn>=0.30
4. Zendesk Help CenterからデータをFetch
python fetch_zendesk.py
実行すると、以下が生成されます:
-
zendesk.db: SQLiteデータベース(FTS5で全文検索対応) -
zendesk_cache.json: Zendesk APIレスポンスキャッシュ -
data/hc/ja/articles/*.md: 個別記事ファイル
5. MCPサーバーを起動(Docker Compose)
docker compose up -d --build
MCPサーバーが http://0.0.0.0:3500/mcp で起動します。
Claude Code / GitHub Copilot への設定
MCPサーバーへの接続設定はプロジェクトリポジトリ内に置くことでプロジェクトメンバー全員に共有できます。リポジトリにコミットしておけば、メンバーがクローン後すぐに同じMCPサーバーを利用できます。
注意: 設定ファイル内の
localhost:3500は、MCPサーバーを起動しているホスト名やポート番号に置換してください(例:192.168.1.10:8080、社内DNSホスト名など)。
Claude Code の場合:プロジェクトルートの .mcp.json
{
"mcpServers": {
"mabl-help-ja": {
"url": "http://localhost:3500/mcp"
}
}
}
Claude Codeを再起動すれば、以下の4つのMCPツールが利用可能になります:
| ツール | 説明 |
|---|---|
search_articles(query) |
日本語キーワードで全文検索 |
get_article(article_id) |
IDで記事全文取得 |
list_sections() |
カテゴリ・セクション一覧表示 |
list_articles_in_section(section_id) |
セクション内の記事一覧取得 |
その後は、Claude Codeで自然に質問すれば、MCP経由で自動的に最新ヘルプから情報を引っ張ってきます:
「mablで仕様書からテストを自動生成することはできますか?」
Claude Codeが自動的に
search_articlesを呼び出し、最新ヘルプから回答。
GitHub Copilot の場合:プロジェクトルートの .vscode/mcp.json
{
"servers": {
"mabl-help-ja": {
"type": "http",
"url": "http://localhost:3500/mcp"
}
}
}
VS Codeを再起動後、Copilot Chatで @mabl-help-ja を指定して質問できます。
他のZendesk Guide サービスへの応用
このプロジェクトはmabl向けですが、Zendesk Guideを使ったあらゆるSaaSに適用可能です。
fetch_zendesk.py の先頭を編集するだけ:
BASE_URL = "https://help.your-saas.com" # Your help center URL
LOCALE = "en" # Language code (ja, en, etc.)
あとは同じ手順で、そのSaaSのヘルプをMCPサーバー化できます。
コアコンポーネント解説
fetch_zendesk.py: 記事取得とキャッシング
スラッグの除去について
Zendeskの記事URLには、SEO向けにタイトルを含むスラッグが付加されています:
https://help.mabl.com/hc/ja/articles/19078180504724-ブラウザテストとは
↑ 数値ID ↑ スラッグ(ハイフン以降)
スラッグはURLが変わっても記事を特定できるよう付加されているもので、実際のキーは数値IDのみです。このスクリプトでは、Zendesk APIのレスポンスから article["id"](純粋な整数)を直接使用し、スラッグを含まないファイルパスで保存します:
def article_path(article_id: int) -> str:
return os.path.join(DATA_DIR, "hc", LOCALE, "articles", f"{article_id}.md")
# → data/hc/ja/articles/19078180504724.md
記事本文中のリンクから未取得記事を追加取得する際も、正規表現で数値IDのみを抽出しています:
pattern = r'href="https://help\.mabl\.com/hc/[^/]+/articles/(\d+)'
この設計により、URLのスラッグが変更されても(記事タイトルの変更時などに発生しうる)、ローカルキャッシュは無効になりません。
# Zendesk APIからデータを取得
# キャッシュが存在すれば、キャッシュから読み込み(APIを呼ばない)
# 記事本文の内部リンクを辿り、漏れなく取得
# 出力:
# - zendesk.db(SQLite)
# - zendesk_cache.json(生キャッシュ)
# - data/hc/ja/articles/*.md(記事ファイル)
mcp_server.py: MCPサーバー実装
@mcp.tool()
def search_articles(query: str) -> str:
"""日本語キーワードで全文検索"""
# FTS5を使用してテーブル検索
@mcp.tool()
def get_article(article_id: str) -> str:
"""ID指定で記事全文を取得"""
@mcp.tool()
def list_sections() -> str:
"""カテゴリ・セクション一覧を表示"""
@mcp.tool()
def list_articles_in_section(section_id: str) -> str:
"""セクション内の記事一覧を取得"""
開発生産性への効果
実際に導入すると、以下のような改善が期待できます:
導入前
開発中にツールについて質問
↓
LLM:「…だと思います」(古い情報)
↓
ブラウザで公式ヘルプを確認
↓
エディタに戻る ← 時間ロス
導入後
開発中にツールについて質問
↓
LLM: MCPで最新ヘルプを検索
↓
正確な回答がそのまま得られる ← スムーズ
定量的な効果
- コンテキスト切り替え削減: ブラウザ↔エディタの往復がなくなる
- 質問の精度向上: LLMが常に最新情報で回答
- チーム全体の効率化: 共有MCPで全員が恩恵
注意点と法的・技術的考慮事項
法的側面
- 記事の著作権は各サービス提供者に帰属
- 第三者への再配布・公開は禁止
- 対象サービスの利用規約を事前確認推奨
技術的側面
- Zendesk Help Center APIは認証不要で無料
- 記事数が多い場合、初回取得に時間がかかる場合あり
-
fetch_zendesk.py実行時にzendesk_cache.jsonが上書きされるため、重要な変更があればバックアップ -
data/ディレクトリは生成物なので、.gitignoreに含める
まとめ
Zendesk Help Center APIとMCPサーバーを組み合わせることで:
- Claude Code/Copilotに最新のSaaSヘルプを提供
- 開発フロー中断なく、一貫性のある開発体験を実現
- チーム全体で共有可能な社内知識ベース構築
- 他のZendesk Guide サービスにも横展開可能
ヘルプをMCPサーバー化して、開発生産性を一段階上げてみてください!