every Tech Blog

株式会社エブリーのTech Blogです。

社内向けRedash MCPサーバーを自作しました

はじめに

こんにちは!デリッシュキッチンで主にバックエンドの開発を担当している秋山です。

エブリー開発部で先日行われた挑戦weekの中で、私たちのチームが開発したRedash MCPについて紹介していきます。

背景

現在弊社ではAIコードエディタのCursorをエンジニアとPdMに配布しています。

日々のデータ分析にはRedashを用いることが多く、PdMはCursorを使用してRedashのクエリ作成なども行います。

今回は業務改善の一環として、Redash MCPを作ることでデータ分析をより効率化し、PdMの負荷削減をしたいと考えました。

PdMが抱えていた主な課題

具体的な実装に入る前に、まずはPdMが抱える課題があるかヒアリングしました。 ヒアリングの結果、以下のような課題を得ることができました。

1. Cursorを使ってRedashでクエリを作成・更新する際に、事前準備が必要でそれが少し手間

Cursorは基本的にRedashで扱えるデータの情報を知りません。 そのため、Cursorを使ってクエリを書く際は「テーブル構造を教える」などの事前準備になります。

毎回プロンプトに書いたり、扱うテーブル構造を確認しつつドキュメント化することでCursorに認識してもらえますが、Cursor自身がRedash上の情報を取りにいける方が効率的です。

2. 普段Redashを触らないメンバーからクエリ修正の依頼がきて少し大変

例えば「このクエリの集計結果を一週間から一ヶ月で出してほしい」などの簡単な依頼がPdMに来ることもあります。 Redashに慣れていなかったり、クエリが書けないようなメンバーでもある程度自分で解決できると嬉しいです。

3. 数値の変化はRedashのクエリ結果をみないと把握できず、異常な値が出ているときに即座に気づけない

Redashにアラート機能はあるものの、柔軟な設定ができるわけではないため、より柔軟に異常値を検出できると嬉しいです。

Redash MCPの実装について

主な使用技術

今回作成したRedash MCPの使用技術を紹介します。

  • Go 1.23.0
  • go-sdk 0.2.0
    • MCPの公式SDK
  • Docker
  • Redash(APIで利用)

※2025年8月8日現在go-sdkの安定版はリリースされていませんが、今後リリース予定のようです。

作成した機能

Redash APIが用意しているエンドポイントのうち、実際によく使いそうなエンドポイントに絞って下記のような操作ができるようにしました。

  • データソース一覧取得
  • データソース詳細取得
  • クエリ一覧取得
  • 特定のクエリ詳細取得
  • クエリ実行、実行結果取得
  • クエリ作成
  • クエリ更新
  • ダッシュボード情報取得

実装例

以下がRedash MCPサーバーの簡単な実装例です。

ここでは1つのクエリ情報を取得してくるケースを考えます。

package main

import (
    "context"
    "log"

    "github.com/modelcontextprotocol/go-sdk/mcp"
)

// クエリ取得のパラメータ
type GetQueryParams struct {
    ID int `json:"id" jsonschema:"クエリID"`
}

// クエリ取得の実装
func GetQuery(ctx context.Context, cc *mcp.ServerSession, params *mcp.CallToolParamsFor[GetQueryParams]) (*mcp.CallToolResultFor[any], error) {
    // 実際にはここでRedash APIを呼び出してクエリ情報を取得する
    queryInfo := "クエリID: " + string(params.Arguments.ID) + "の情報"
 
    return &mcp.CallToolResultFor[any]{
        Content: []mcp.Content{&mcp.TextContent{Text: queryInfo}},
    }, nil
}

func main() {
    // MCPサーバー作成
    server := mcp.NewServer(&mcp.Implementation{Name: "redash", Version: "v1.0.0"}, nil)

    // ツールの追加
    mcp.AddTool(server, &mcp.Tool{
        Name:        "get-query",
        Description: "Redashのクエリを取得する",
    }, GetQuery)

    // サーバーを起動
    if err := server.Run(context.Background(), mcp.NewStdioTransport()); err != nil {
        log.Fatal(err)
    }
}

これでRedash MCPサーバーの実装は完了です。

go-sdkを使うと、MCPサーバーの実装が非常に簡単でした。

▪dockerで起動してCursorで使う場合の実装例

  1. 下記のようにDockerfileを準備します。
FROM golang:1.23 as builder
WORKDIR /app
COPY . .
RUN go mod tidy && go build -o mcp-server main.go


FROM debian:stable-slim
WORKDIR /app
RUN apt-get update && apt-get install -y ca-certificates openssl && rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/mcp-server .
ENTRYPOINT ["/app/mcp-server"]
  1. イメージをビルドします
$ docker build -t redash-mcp .
  1. Cursorののmcp.jsonに下記の内容を追加します。
  {
  "mcpServers": {
    "redash-mcp": {
      "command": "docker run -i --rm -e REDASH_URL -e REDASH_API_KEY redash-mcp",
      "env": {
        "REDASH_URL": "https://hoge.redash.hoge",
        "REDASH_API_KEY": "hogehoge"
      }
    },
  }
}

使用例

実際にCursorからRedash MCPを使ってみた例が以下です!

最近追加されたレシピを取得するクエリの作成、実行、さらに簡単な分析までしてくれました。

ヒアリングした課題に対する結果

本記事の冒頭で挙げた課題に対して、Redash MCPでどのくらい解決できたか見ていきます。

1. Redashでクエリを作成・更新する際に、事前準備が必要でそれが少し手間

RedashのデータソースをMCP経由で取得させることにより、事前準備の削減ができました。

2. 普段Redashを触らないメンバーからクエリ修正の依頼がきて少し大変

クエリ作成のハードルは一定下がったものの、現状だとCursorなどのMCPクライアントの準備や初期設定が必要なため、誰でも気軽に使用できる状態にはできていません。

3. 数値の変化はRedashのクエリ結果をみないと把握できず、異常な値が出ているときに即座に気づけない

短い期間での実装だったため、この課題に対してのアクションはできていませんが、 例えばDevinと連携して定期的に異常値を見つけてもらう、などのことが出来ると良いなと考えています。

PdMからのフィードバック

何人かのPdMに実際に使っていただき、以下のような嬉しいコメントをいただきました!

  • クエリ内のコメントもちゃんと書かれてて可読性も良い
  • クエリ作成が秒で終わって感動
  • redashが複数のキーワード検索できないので助かる
  • クエリの差分を比較するときに、わざわざクエリコピーする手間がなくなった

一方で、改善点も見つかりました。

  • Cursor環境やターミナルを皆が使えるわけではないから、slackなどから呼べると使える人の幅が広がって嬉しい
  • デフォルトでCursorに入れるべきルールみたいなものがあると良さそう
    • Redashと連携しているTreasureData専用のtd関数全然使ってくれなくて、結構エラー吐かれたので、プロンプト頑張らなきゃいけないなと思いつつ、プロンプトが最初からあると嬉しい
  • カラムに実際どんなデータが入ってるか推測を間違える時があるから、その辺をより精度上げられると嬉しい

今後の展望

PdMからのフィードバックなどをもとに、今後はこんなことをやっていきたいです。

1. Redash MCPを使うまでのハードルを下げる

まず、リモートMCPサーバーにしたいです。

現在はMCPをローカルで起動させていますが、この方法だと

  • 初期設定時にローカルでビルドする必要があり手間
  • アップデートのたびにローカルでビルドが必要になる

などの問題があります。 リモートMCPサーバーにすることでこれらの問題を解決したいです。

また、セキュリティ面なども考慮しつつ 可能であればDevinを使ってSlackから呼び出すなども出来るようにしていきたいです。

2. 事前に渡す情報の整備

弊社のRedashで扱っているデータソースには、DBのデータ以外にもTreasureDataやFirebaseなどの他サービスと連携して取得しているデータがあります。 特に、他サービスから取得してきたデータのスキーマ情報は、Redashで詳細まで持っていないことが多いです。 ドキュメントとしてまとまっているものがあるので、それを利用することによりRedash MCPの精度を上げていきたいです。

その他、随時フィードバックをいただき改善していきたいです。

まとめ

本記事では、社内Redash MCP作成の背景、実装例、実際の使用感について紹介しました。

今回PdMの作業負荷軽減を目的としてRedash MCPを作りましたが、エンジニアにとってもRedashを使うハードルが低くなるという副次的な効果があったかなと思います。 実際、私はRedash MCPを利用し始めてからサクッとクエリを作れるようになりました。

今後も皆がより使いやすくなるように改善していきたいです。

最後まで読んでいただきありがとうございました!

参考文献