2026年5月14日木曜日

Hermes Agentのコンテナ・イメージにSQLclを組み込みMCPサーバー経由でOracle Databaseに問い合わせる

Hermes Agentのコンテナ・イメージにSQLclを組み込み、SQLclのMCPサーバーを呼び出せるようにします。Streamable HTTPを話すリモートMCPサーバーとは異なり、コンテナ・イメージにSQLclとJavaを組み込む手間がありますが、反対にOracle DatabaseとはSQL*Netで接続するためデータベース側の準備が不要になります。

MCPサーバーの接続先となるOracle Databaseには、サンプル・スキーマSH(Sales History)がインストール済みとします。

作業は前回の記事と同様にMacbook Proで行います。

作業ディレクトリhermes-agent-sqlclを作成し、作成したディレクトリに移動します。

mkdir hermes-agent-sqlcl
cd hermes-agent-sqlcl

% mkdir hermes-agent-sqlcl

% cd hermes-agent-sqlcl

hermes-agent-sqlcl % 


Nous Research社が作成しているHermes Agentのコンテナ・イメージに、SQLclを組み込んだコンテナ・イメージを作成します。

コンテナ・イメージの作成に以下のDockerfileを使用します。

作業ディレクトリにDockerfileを作成し、コンテナ・イメージをビルドします。今回はApple SiliconのMacbookで作業をしているので、platformにlinux/arm64を指定しています。
docker buildx build \
--platform linux/arm64 \
--no-cache \
-t hermes-agent-sqlcl:arm64 \
--load .

hermes-agent-sqlcl % docker buildx build \

> --platform linux/arm64 \

> --no-cache \

> -t hermes-agent-sqlcl:arm64 \

> --load .

[+] Building 29.5s (13/13) FINISHED                                                                          docker:colima

 => [internal] load build definition from Dockerfile                                                                  0.0s

 => => transferring dockerfile: 1.19kB                                                                                0.0s

 => resolve image config for docker-image://docker.io/docker/dockerfile:1                                             1.2s

 => CACHED docker-image://docker.io/docker/dockerfile:1@sha256:2780b5c3bab67f1f76c781860de469442999ed1a0d7992a5efdf2  0.0s

 => => resolve docker.io/docker/dockerfile:1@sha256:2780b5c3bab67f1f76c781860de469442999ed1a0d7992a5efdf2cffc0e3d769  0.0s

 => [internal] load metadata for docker.io/nousresearch/hermes-agent:latest                                           1.0s

 => [internal] load metadata for docker.io/library/debian:bookworm-slim                                               1.0s

 => [internal] load .dockerignore                                                                                     0.0s

 => => transferring context: 2B                                                                                       0.0s

 => CACHED [sqlcl-builder 1/3] FROM docker.io/library/debian:bookworm-slim@sha256:67b30a61dc87758f0caf819646104f29ec  0.0s

 => => resolve docker.io/library/debian:bookworm-slim@sha256:67b30a61dc87758f0caf819646104f29ecbda97d920aaf5edc83412  0.0s

 => CACHED [stage-1 1/3] FROM docker.io/nousresearch/hermes-agent:latest@sha256:cdcda342ff2b3919eaa7b3dbd7c5178b7b76  0.0s

 => => resolve docker.io/nousresearch/hermes-agent:latest@sha256:cdcda342ff2b3919eaa7b3dbd7c5178b7b7676db62ddac273af  0.0s

 => [sqlcl-builder 2/3] RUN apt-get update  && apt-get install -y --no-install-recommends       curl       unzip      6.2s

 => [stage-1 2/3] RUN apt-get update  && apt-get install -y --no-install-recommends       openjdk-21-jre-headless  &  7.2s

 => [sqlcl-builder 3/3] RUN curl -fsSL "https://download.oracle.com/otn_software/java/sqldeveloper/sqlcl-latest.zip  16.4s

 => [stage-1 3/3] COPY --from=sqlcl-builder --chmod=755 /opt/sqlcl /opt/sqlcl                                         0.1s 

 => exporting to image                                                                                                4.4s 

 => => exporting layers                                                                                               3.4s 

 => => exporting manifest sha256:64475b6128c1a73482e6fafaa521948a598adeb68e4480f8ec58f146d608b2f2                     0.0s 

 => => exporting config sha256:b93153409b3871b9e5041a43b03b34b4376d9bb39d9bebfbdc5832883de4e5c9                       0.0s 

 => => exporting attestation manifest sha256:a557e7c7714538a127f27e850df20d2f7575e7902a111d6bfb44aedc7ba5237e         0.0s 

 => => exporting manifest list sha256:c77a0e8fe3a253b1a42d6f4bc97f16bf021cc1511c4a62a6e412db5ed9f288b9                0.0s 

 => => naming to docker.io/library/hermes-agent-sqlcl:arm64                                                           0.0s 

 => => unpacking to docker.io/library/hermes-agent-sqlcl:arm64                                                        1.0s 

hermes-agent-sqlcl % 


SQLclが組み込まれたHermes Agentのイメージが作成できました。

コンテナを実行して、Hermes Agentのセットアップを行います。

docker run -it --rm -v ${PWD}:/opt/data hermes-agent-sqlcl:arm64 setup

Quick setupを選択します。

How would you like to set up Hermes?

  ↑↓ navigate  ENTER/SPACE select  ESC cancel


 → (●) Quick setup — provider, model & messaging (recommended)

   (○) Full setup — configure everything


今回の作業ではLLMのプロバイダとして、ローカルで動作しているLM Studioを使用します。

Select provider:

  ↑↓ navigate  ENTER/SPACE select  ESC cancel


   (●) Nous Portal (Nous Research subscription)

   (○) OpenRouter (100+ models, pay-per-use)

 → (○) LM Studio (local desktop app with built-in model server)

   (○) Anthropic (Claude models — API key or Claude Code)

   (○) OpenAI Codex

   (○) Qwen Cloud / DashScope Coding (Qwen + multi-provider)

   (○) Xiaomi MiMo (MiMo-V2.5 and V2 models — pro, omni, flash)

   (○) Tencent TokenHub (Hy3 Preview — direct API via tokenhub.tencentmaas.com)

   (○) NVIDIA NIM (Nemotron models — build.nvidia.com or local NIM)

   (○) GitHub Copilot (uses GITHUB_TOKEN or gh auth token)

   (○) GitHub Copilot ACP (spawns `copilot --acp --stdio`)

   (○) Hugging Face Inference Providers (20+ open models)

   (○) Google AI Studio (Gemini models — native Gemini API)

   (○) Google Gemini via OAuth + Code Assist (free tier supported; no API key needed)

   (○) DeepSeek (DeepSeek-V3, R1, coder — direct API)

   (○) xAI (Grok models — direct API)

   (○) Z.AI / GLM (Zhipu AI direct API)

   (○) Kimi Coding Plan (api.kimi.com) & Moonshot API

   (○) Kimi / Moonshot China (Moonshot CN direct API)

   (○) StepFun Step Plan (agent/coding models via Step Plan API)

   (○) MiniMax (global direct API)

   (○) MiniMax via OAuth browser login (Coding Plan, minimax.io)

   (○) MiniMax China (domestic direct API)

   (○) Ollama Cloud (cloud-hosted open models — ollama.com)

   (○) Arcee AI (Trinity models — direct API)

   (○) GMI Cloud (multi-model direct API)

   (○) Kilo Code (Kilo Gateway API)

   (○) OpenCode Zen (35+ curated models, pay-as-you-go)

   (○) OpenCode Go (open models, $10/month subscription)

   (○) AWS Bedrock (Claude, Nova, Llama, DeepSeek — IAM or API key)

   (○) Azure Foundry (OpenAI-style or Anthropic-style endpoint — your Azure AI deployment)

   (○) Vercel AI Gateway

   (○) Qwen OAuth (reuses local Qwen CLI login)

   (○) Alibaba Cloud Coding Plan — dedicated coding tier

   (○) custom (direct API)

   (○) Custom endpoint (enter URL manually)

   (○) Configure auxiliary models...

   (○) Leave unchanged


LM StudioにAPIキーは不要なので、デフォルトを選択します。

No LM Studio API key configured.

LM_API_KEY (Enter for no-auth default 'dummy-lm-api-key'): 


Hermes Agentはコンテナで実行されています。LM Studioはホスト上、つまりコンテナの外で動作しているため、コンテナ内からホストを指すhost.docker.internalがホスト名になります。そのため、Base URLに以下を設定します。LM Studioのローカル・サーバーに割り当てたポート番号は1234でない場合は、ポート番号の部分を変更します。

http://host.docker.internal:1234/v1

Base URL [http://127.0.0.1:1234/v1]: http://host.docker.internal:1234/v1


LM Studioにダウンロードされているモデルが一覧されます。今回はmlx-community/gpt-oss-120bを選択します。

  Found 24 model(s) from LM Studio

Select default model:                                                              google/gemma-4-31b

     baai_robobrain2.0-7b@q6_k

     baai_robobrain2.0-7b@q6_k_l

     baai_robobrain2.0-7b@bf16                                    

->   mlx-community/gpt-oss-120b                                    

     gemma-3n-e4b-it-mlx@bf16        

     unsloth/gpt-oss-120b                

     openai/gpt-oss-20b                  

     openai/gpt-oss-120b                 

     qwen/qwen3-30b-a3b-2507             

     gemma-3n-e4b-it-mlx@8bit            

     llm-jp-3-8x13b-instruct3            

     qwen/qwen2.5-vl-7b                  

     qwen3-30b-a3b-mlx@4bit              

     qwen3-30b-a3b-mlx@8bit              

     gemma-3-27b-it-qat                  

     gemma-3-27b-it                      

     phi-4-mini-instruct@4bit            

     phi-4@8bit                          

     phi-4@4bit                          

     gemma-2-27b-it                      

     phi-4-mini-instruct@8bit            

     unsloth-phi-4                       

     lmstudio-community/phi-4            

     Enter custom model name            

     Skip (keep current)                                                      


Hermes Agentはコンテナで実行していますが、ユーザー・インターフェース自体もコンテナで実行しています。そのため、terminal backendの選択はlocalになります。

Keep current (local)のまま、次へ進みます。

Select terminal backend:

  ↑↓ navigate  ENTER/SPACE select  ESC cancel


   (○) Local - run directly on this machine (default)

   (○) Docker - isolated container with configurable resources

   (○) Modal - serverless cloud sandbox

   (○) SSH - run on a remote machine

   (○) Daytona - persistent cloud development environment

   (○) Vercel Sandbox - cloud microVM with snapshot filesystem persistence

   (○) Singularity/Apptainer - HPC-friendly container

 → (●) Keep current (local)


messaging platformへの接続を求められます。今回はTelegramやDiscord(Slackなども含む)といったチャット・ツールからの利用は考えていないので、スキップします。

Connect a messaging platform? (Telegram, Discord, etc.)

  ↑↓ navigate  ENTER/SPACE select  ESC cancel


   (●) Set up messaging now (recommended)

 → (○) Skip — set up later with 'hermes setup gateway'


色々と構成が実行され、最終的に構成が完了します。設定ファイルconfig.yamlを直接編集して設定を追加するため、setupはここで終了します。

🚀 Ready to go!


   hermes              Start chatting

   hermes gateway      Start messaging gateway

   hermes doctor       Check for issues



Launch hermes chat now? [Y/n]: n

hermes-agent-sqlcl % 


記事「Claude CodeおよびOpenAI CodexでAgent Skillsを参照しMCPサーバー経由でOracle Databaseに問い合わせる」にて作成しているAgent Skillsを、作業ディレクトリにダウンロードします。

git clone https://github.com/ujnak/sh-sales-analysis.git

hermes-agent-sqlcl % git clone https://github.com/ujnak/sh-sales-analysis.git


Cloning into 'sh-sales-analysis'...

remote: Enumerating objects: 28, done.

remote: Counting objects: 100% (28/28), done.

remote: Compressing objects: 100% (21/21), done.

remote: Total 28 (delta 3), reused 27 (delta 2), pack-reused 0 (from 0)

Receiving objects: 100% (28/28), 10.77 KiB | 10.77 MiB/s, done.

Resolving deltas: 100% (3/3), done.

ynakakoshi@Ns-Macbook hermes-agent-sqlcl % 


このDockerコンテナで動作するHermes Agentが、Agent Skillsを参照するように設定します。

デフォルトではconfig.yamlのskillsは、以下のように記載されていました。

skills:

  external_dirs: []

  template_vars: true

  inline_shell: false

  inline_shell_timeout: 10

  guard_agent_created: false

  creation_nudge_interval: 15


external_dirsとして、/opt/data/sh-sales-analysis/.apm/skillsを追加します。ホスト上の作業ディレクトリは、コンテナから見ると/opt/data以下にマップされています。

skills:

  external_dirs: 

    - /opt/data/sh-sales-analysis/.apm/skills

  template_vars: true

  inline_shell: false

  inline_shell_timeout: 10

  guard_agent_created: false 

  creation_nudge_interval: 15


SOUL.mdとしてsh-sales-analysis/.apm/instructions/sh-schema.instructions.mdを参照するようにします。デフォルトのSOUL.mdはコメントのみでしたが、一応バックアップを取ります。Hermes Agentが動作しているコンテナからは、作業ディレクトリが/opt/dataとして見えることに注意が必要です。

mv SOUL.md SOUL.md.bak
ln -s ./sh-sales-analysis/.apm/instructions/sh-schema.instructions.md SOUL.md

hermes-agent-sqlcl % mv SOUL.md SOUL.md.bak

ln -s ./sh-sales-analysis/.apm/instructions/sh-schema.instructions.md SOUL.md

hermes-agent-sqlcl % 


SQLclのMCPサーバーを設定します。config.yamlに以下の設定を追加します。デフォルトではmcp_serversの設定は含まれていなかったので、ファイルの末尾に追加しました。

SQLclのMCPサーバーをHermes Agentに設定する場合、sampling.enabledをfalseに設定する必要があります。
mcp_servers:
  sqlcl-mcp:
    command: "/opt/sqlcl/bin/sql"
    args: [ "-home", "/opt/data/sqlcl-home", "-R", "4", "-mcp" ]
    sampling:
      enabled: false
    enabled: true
    env:
      TNS_ADMIN: "/opt/data/sqlcl-home"
    tools:
      include: [ list-connections, connect, disconnect, run-sqlcl, run-sql, schema-information ]
      resources: false
      prompts: true
config.yamlの末尾に記述されているコメント文の前に、mcp_serversの設定を挿入しています。

mcp_servers:

  sqlcl-mcp:

    command: "/opt/sqlcl/bin/sql"

    args: [ "-home", "/opt/data/sqlcl-home", "-R", "4", "-mcp" ]

    sampling:

      enabled: false

    enabled: true

    env:

      TNS_ADMIN: "/opt/data/sqlcl-home"

    tools:

      include: [ list-connections, connect, disconnect, run-sqlcl, run-sql, schema-information ]

      resources: false

      prompts: true


# ── Fallback Model ────────────────────────────────────────────────────

# Automatic provider failover when primary is unavailable.

# Uncomment and configure to enable. Triggers on rate limits (429),

# overload (529), service errors (503), or connection failures.

#


SQLclの接続の保存先および環境変数TNS_ADMINの指定先となるディレクトリsqlcl-homeを作成します。

mkdir sqlcl-home

hermes-agent-sqlcl % mkdir sqlcl-home

hermes-agent-sqlcl % 


以上でAgent SkillsとMCPサーバーの設定は完了です。

Hermes Agentを再度起動します。今度はsetupではなくchatコマンドを実行します。引数を与えなければ、chatが起動します。

docker run -it --rm -v ${PWD}:/opt/data hermes-agent-sqlcl:arm64

Hermes Agentが起動します。先ほど設定したMCPサーバーsqlcl-mcpが正常に認識されていることを確認します。


MCPサーバーは正常に起動していますが、データベースへの接続が保存されていません。

実行中のコンテナに接続し、SQLclを呼び出してデータベースへの接続を保存します。

実行中のコンテナ名を確認します。

docker ps --filter "ancestor=hermes-agent-sqlcl:arm64" --format "{{.Names}}"

% docker ps --filter "ancestor=hermes-agent-sqlcl:arm64" --format "{{.Names}}"

festive_matsumoto

% 


確認できたコンテナに接続します。

docker exec -it [上記のコンテナ名] bash

% docker exec -it festive_matsumoto bash

root@507df03e5c90:/opt/hermes# 


Hermes Agentはユーザーhermesで実行されています。

ユーザーhermesに切り替え、SQLclを起動します。TNS_ADMINおよびSQLclのhomeともに、/opt/data/sqlcl-homeを指定します。

su - hermes
export TNS_ADMIN=/opt/data/sqlcl-home
/opt/sqlcl/bin/sql -home /opt/data/sqlcl-home /nolog

$ export TNS_ADMIN=/opt/data/sqlcl-home 

$ /opt/sqlcl/bin/sql -home /opt/data/sqlcl-home /nolog


SQLcl: Release 26.1 Production on Thu May 14 05:53:53 2026


Copyright (c) 1982, 2026, Oracle.  All rights reserved.


SQL> 


データベースへの接続を保存します。

接続先として、ローカルのコンテナで動作しているOracle AI Database 26ai Freeを指定します。UC Local APEX Devを使用して作成した環境で、ランダムに生成された接続ユーザーのパスワードは、.envファイルに記載されています。

conn -save local-26ai-apexdev -savepwd apexdev@host.docker.internal/freepdb1

SQL> conn -save local-26ai-apexdev -savepwd apexdev@host.docker.internal/freepdb1

Password? (**********?) ****************

Name: local-26ai-apexdev

Connect String: host.docker.internal/freepdb1

User: apexdev

Password: ******

Connected.

SQL> 


以上でSQLclのMCPサーバーが参照できるデータベース接続も保存できました。

接続情報などはホストのファイルシステムに保存されています。そのため、コンテナを再作成しても、保存したデータベースの接続は参照できます。

SQLclを終了し、接続しているコンテナから離れます。

SQL> exit

Disconnected from Oracle AI Database 26ai Free Release 23.26.1.0.0 - Develop, Learn, and Run for Free

Version 23.26.1.0.0

$ exit

root@507df03e5c90:/opt/hermes# exit

exit

hermes-agent % 


起動中のHermes Agentに戻り、MCPサーバーsqlcl-mcpで利用可能な接続を確認します。

「MCPサーバーsqlcl-mcpで利用できる接続を一覧して」

────────────────────────────────────────

MCPサーバーsqlcl-mcpで利用できる接続を一覧して。

Initializing agent...

────────────────────────────────────────


  ┊ ⚡ preparing mcp_sqlcl_mcp_list_connections…

  ┊ ⚡ mcp_sqlcl   0.0s


╭─ ⚕ Hermes ──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮

    利用可能な Oracle データベース接続は以下の通りです。

    

    - local-26ai-apexdev  

    

    この接続名を使って mcp_sqlcl_mcp_connect でデータベースに接続できます。  

╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

 gpt-oss-120b │ 16.5K/64K │ [███░░░░░░░] 26% │ 24m │ ⏲ 46s 

───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────


先ほど保存した接続local-26ai-apexdevに接続し、スキーマSHの情報を確認します。

「local-26ai-apexdevに接続して、スキーマSHを説明して。」

────────────────────────────────────────

local-26ai-apexdevに接続して、スキーマSHを説明して。

────────────────────────────────────────


  ┊ ⚡ preparing mcp_sqlcl_mcp_connect…

  ┊ ⚡ mcp_sqlcl   0.9s

  ┊ ⚡ preparing mcp_sqlcl_mcp_schema_information…

  ┊ ⚡ mcp_sqlcl   1.0s


╭─ ⚕ Hermes ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮

    SH スキーマ概要(Oracle Database)

    

    カテゴリ: ファクトテーブル

    内容: SH.SALES、SH.COSTS

    主なポイント: 取引・コストの集計基点。SALES は売上金額・数量、COSTS は商品単位コストで粗利計算に使用

    ────────────────────────────────────────

    カテゴリ: ディメンションテーブル

    内容: SH.PRODUCTS、SH.CUSTOMERS、SH.TIMES、SH.CHANNELS、SH.PROMOTIONS

    主なポイント: 商品情報・顧客属性・日付・販売チャネル・プロモーションを保持

    ────────────────────────────────────────

    カテゴリ: 主要カラム(FACTOR)

    内容: PROD_ID, CUST_ID, TIME_ID, CHANNEL_ID, PROMO_ID, QUANTITY_SOLD, AMOUNT_SOLD

    主なポイント: すべての分析はこれらで結合・集計

    ────────────────────────────────────────

    カテゴリ: テーブル構造(抜粋)

    内容: <pre>SALES: PROD_ID, CUST_ID, TIME_ID, CHANNEL_ID, PROMO_ID, QUANTITY_SOLD, AMOUNT_SOLD</pre> <pre>COSTS: PROD_ID,

      TIME_ID, CHANNEL_ID, PROMO_ID, UNIT_COST, UNIT_PRICE</pre> <pre>PRODUCTS: PROD_ID, PROD_NAME, CATEGORY, SUBCATEGORY,

      LIST_PRICE …</pre> <pre>CUSTOMERS: CUST_ID, NAME, CITY, STATE, INCOME_LEVEL …</pre> <pre>TIMES: TIME_ID (DATE),

      CALENDAR_MONTH_DESC, FISCAL_…</pre> <pre>CHANNELS: CHANNEL_ID, CHANNEL_DESC (Direct Sales / Internet / Partners / Tele

      Sales)</pre> <pre>PROMOTIONS: PROMO_ID, PROMO_NAME, CATEGORY (999 = プロモーションなし)</pre>

    主なポイント: 各テーブルは PROD_ID・CUST_ID・TIME_ID などで SALES と結合

    ────────────────────────────────────────

    カテゴリ: インデックス/パーティション

    内容: 主キーインデックス (*_PK) と結合カラムに対するビットマップインデックス(例: SALES_PROD_BIX)

    主なポイント: クエリ高速化のために大量データがパーティション分割(COSTS, SALES など)

    ────────────────────────────────────────

    カテゴリ: マテリアライズドビュー

    内容: CAL_MONTH_SALES_MV、FWEEK_PSCAT_SALES_MV

    主なポイント: 月次・週次の集計を事前に保持し、分析性能向上

    ────────────────────────────────────────

    カテゴリ: ビュー

    内容: PROFITS(売上‑コスト)など

    主なポイント: ビジネスロジックの再利用に便利

    ────────────────────────────────────────

    カテゴリ: 特記事項

    内容: - PROMO_ID = 999 は「プロモーションなし」<br>- 時系列分析は SH.TIMES.CALENDAR_MONTH_DESC('YYYY‑MM' 形式)や

      EXTRACT(YEAR FROM s.TIME_ID) を使用

    主なポイント: プロモーション効果の有無や年月別集計で頻繁に利用

    

    使い方例(SQL)

    

    sql

    -- 月別売上合計(プロモーションなしを除外)

    SELECT t.CALENDAR_MONTH_DESC,

           SUM(s.AMOUNT_SOLD) AS 売上合計

    FROM   SH.SALES s

    JOIN   SH.TIMES t ON s.TIME_ID = t.TIME_ID

    WHERE  s.PROMO_ID <> 999            -- プロモーションありのみ対象外

    GROUP BY t.CALENDAR_MONTH_DESC

    ORDER BY t.CALENDAR_MONTH_DESC;

    

    -- 粗利(売上‑コスト) 上位10商品

    SELECT p.PROD_NAME,

           SUM(s.AMOUNT_SOLD)                                    AS 売上合計,

           SUM(s.QUANTITY_SOLD * c.UNIT_COST)                    AS コスト合計,

           SUM(s.AMOUNT_SOLD) - SUM(s.QUANTITY_SOLD * c.UNIT_COST) AS 粗利

    FROM   SH.SALES s

    JOIN   SH.PRODUCTS p ON s.PROD_ID = p.PROD_ID

    JOIN   SH.COSTS c

      ON   s.PROD_ID = c.PROD_ID

     AND   s.TIME_ID = c.TIME_ID

     AND   s.CHANNEL_ID = c.CHANNEL_ID

     AND   s.PROMO_ID = c.PROMO_ID

    GROUP BY p.PROD_NAME

    ORDER BY 粗利 DESC

    FETCH FIRST 10 ROWS ONLY;

    

    

    ポイントコメント

    

    - スキーマ修飾子必須:SH. を常に付けること(例: SELECT * FROM SH.SALES)。

    - 日付フィルタは CALENDAR_MONTH_DESC(文字列)か TIME_ID の DATE 型を利用。

    - プロモーション分析では PROMO_ID = 999 を除外、またはケース分けして「あり/なし」比較。

    - 粗利計算は SH.COSTS と4列キー(PROD_ID, TIME_ID, CHANNEL_ID, PROMO_ID)で結合する必要あり。

    - パフォーマンス:大量集計はマテリアライズドビューやビットマップインデックスを活用すると高速化できる。

╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

 gpt-oss-120b │ 22.9K/64K │ [████░░░░░░] 36% │ 28m │ ⏲ 1m 42s 

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────


販売分析を実施します。

「これらの情報を元に、販売分析を実施して。」

────────────────────────────────────────

これらの情報を元に、販売分析を実施して。

────────────────────────────────────────


  ┊ ⚡ preparing mcp_sqlcl_mcp_run_sql…

  ┊ ⚡ mcp_sqlcl   0.1s

  ┊ 🐍 preparing execute_code…

  ┊ 🐍 exec        0.0s [error]

  ┊ ⚡ preparing mcp_sqlcl_mcp_run_sql…

  ┊ ⚡ mcp_sqlcl   0.1s

  ┊ ⚡ preparing mcp_sqlcl_mcp_run_sql…

  ┊ ⚡ mcp_sqlcl   0.1s


╭─ ⚕ Hermes ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮

    販売分析サマリー(SH スキーマ)

    

    | 項目                   | 集計結果      |

    |------------------------|---------------|

    | 総売上金額             | 98,205,831.21 |

    | 総販売数量             | 918,843 個    |

    | ユニーク顧客数         | 7,059 名      |

    | 取引件数(レコード数) | 918,843       |

    

    1. 売上トップ 10 商品  

    | 順位 | 商品名                                  | 売上合計 (¥)  | 販売数量 |

    |------|-----------------------------------------|---------------|----------|

    | 1    | Lithium Electric Golf Caddy             | 15,011,642.52 | 9,591    |

    | 2    | Soccer Goal - Official                  | 8,314,815.40  | 6,160    |

    | 3    | Pitching Machine and Batting Cage Combo | 7,189,171.77  | 6,010    |

    | 4    | Match Used Autograph Racquet            | 6,691,996.81  | 10,903   |

    | 5    | Soccer Goal - Portable                  | 6,312,268.40  | 6,002    |

    | 6    | Right‑Handed Graphite Shaft Iron Set    | 5,635,963.08  | 5,766    |

    | 7    | Speed Trainer Bats and Training Program | 5,498,727.81  | 5,205    |

    | 8    | Limited Edition Racquet                 | 3,845,387.38  | 7,197    |

    | 9    | Team shirt                              | 3,721,699.61  | 76,854   |

    | 10   | English Willow Cricket Bat              | 3,543,725.89  | 16,796   |

    

    2. チャネル別売上・取引件数  

    | チャネル     | 売上合計 (¥)  | 取引件数 |

    |--------------|---------------|----------|

    | Direct Sales | 57,875,260.60 | 540,328  |

    | Partners     | 26,346,342.32 | 258,025  |

    | Internet     | 13,706,802.03 | 118,416  |

    | Tele Sales   | 277,426.26    | 2,074    |

    

    3. 主なインサイト

    

    - 売上の大半は Direct Sales(約 59%)が占め、次いで Partners(≈31%)。Internet と Tele Sales はそれぞれ約 14%・0.3%。

    - トップ商品は Golf Caddy 系列が圧倒的に高売上。スポーツ用品(サッカーゴール、ラケット等)が続くが、Team shirt の販売数量は突出(76k枚)で在庫回転が速い可能性。

    - ユニーク顧客数は 7,059 と比較的少ないが、取引件数は約 919k 件と 顧客あたり平均購入回数 ≈130 回。リピーターが多いことを示唆。

    - 総売上金額 ≈ 9.8 億円、平均単価は 約 107 円/個(98,205,831 ÷ 918,843)。

    

    4. 次の分析ステップ(提案)

    

    1. プロモーション効果測定  

       - PROMO_ID = 999 を除外し、プロモーション別売上を比較。  

       - PROMO_ID と CHANNEL_DESC のクロス集計で、どのチャネルがプロモーションに最も反応するか把握。

    

    2. 顧客セグメント別 LTV(ライフタイムバリュー)  

       - CUSTOMERS の所得レベル・都市情報と結びつけ、顧客属性別の平均売上・購入頻度を算出。

    

    3. 季節性分析  

       - TIMES.CALENDAR_MONTH_DESC で月次売上推移を可視化し、ピーク・オフシーズンを特定。  

       - 前年同月比(YoY)や前月比(MoM)をウィンドウ関数で算出。

    

    4. 粗利分析(SH.COSTS と結合)  

       - 商品別・チャネル別の粗利率を算出し、利益貢献度が高い組み合わせを抽出。

    

    5. 在庫最適化  

       - 高回転商品(例: Team shirt)と低回転・高単価商品を区別し、在庫補充戦略を再検討。

    

    

    

    ポイントコメント  

    - すべてのクエリはスキーマ修飾子 SH. を付与して実行済み。  

    - 金額は カンマ区切り、数量は整数で表示しています。  

    - 必要に応じて追加のフィルタ(期間、プロモーション有無、顧客属性)を組み込めば、さらに詳細な洞察が得られます。  

    

    ご要望があれば、上記のステップ別に具体的な SQL を作成・実行します。

╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

 gpt-oss-120b │ 24.8K/64K │ [████░░░░░░] 39% │ 34m │ ⏲ 4m 56s 

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────


Hermes Agentが回答する際に、SQLclのMCPサーバーを呼び出していることが確認できました。

今回の記事は以上になります。