1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MCPサーバーでHULFT10と繋いでみた

Last updated at Posted at 2025-10-31

はじめに

こんにちは、フジマロです:grinning:
これからのAI活用に欠かせない MCP という言葉を、耳にしたことはあるでしょうか?
近年、業務の自動化やAIを活用した効率化の流れが一段と加速しています。特に、ChatGPTなどの対話型AIを業務に取り入れる動きが盛んになる中で、MCPという技術が注目されています。

そこで今回はMCPとはどのようなものか知って頂き、実際にMCPを作成して外部サービスを呼び出すところまでご紹介します。

MCPとは

MCP(Model Context Protocol) はAIと外部のデータやツールをつなぐための標準的な通信ルール(プロトコル)です。
MCPが登場したことで、これまで統一化されていなかった「AIサービス」と「ツールやデータ」を共通の方法で接続できるようになりました。

イメージが付きやすいように動画にしてみましたのでよろしければ参照ください。

また、前回の記事でもご紹介したのでよろしければそちらもご覧ください

今回やること

今回は、Claude DesktopからMCP serverを経由してHULFT10のログ情報を取得してClaude Desktopに回答を生成させるのに必要な一連の処理を作成します。

{164C4F07-2E73-4217-BD05-B44869FC983F}.png

実装は下記の順番で行います。

1.使用するもの
2.環境構築
3.MCP サーバーのスケルトンを作成
4.HULFT10 の MCP サーバーを実装
5.Claude(MCP ホスト)に組み込み
6.Claude の再起動で設定反映
7.MCP サーバーの実演

1.使用するもの

〇MCP
・Windows Server-2022
・Claude Desktop for Windows
・Windows PowerShell 5.1.19041.5737
・Visual Studio Code version 1.99.3
・Node.js v22.19.0

〇データソース
・HULFT10
・HULFT10 API Gateway

・MCP ホストは、Claude Desktop for Windowsを利用します。
・MCP サーバーを稼働させる環境は Node.js 環境を選んでいます。(※TypeScript 言語を使用します。)
・動作確認にはブラウザからMCP Inspector を使用します。

2.環境構築

Claude Desktop for Windows インストール

MCP ホストに Web 版ではなくアプリ版の Claude desktop for Windows を利用するため、以下公式手順を参考に Windows PC へインストールします。

Claude Desktop for Windows インストール

Node.js インストール

JavaScript の実行環境が必要なため、以下手順を参考に Windows PC へ Node.js をインストールします。

初期環境構築: Node.js on Windows

Visual Studio Code インストール

Windows 環境でソースコードや設定ファイルの編集をするためのエディターとして Visual Studio Code (VS Code) のインストールをお薦めします。インストール手順については、今回は範囲外とさせて頂きます。

HULFT10

HULFT10は公式サイトがらインストールしてください
HULFT10インストール

HULFT10 API Gateway

HULFT10 API Gatewayのインストール方法は下記をご参考ください
HULFT10 API Gatewayのインストール

3.MCPサーバーのスケルトンを作成

プロジェクトの新規作成

「Windows PowerShell」を起動します。
Window PowerShell でコマンドラインベースで操作を行います。
{CF21C305-2F8D-40E0-8EBF-5620343087B4}.png

「ドキュメント」フォルダ配下に、MCP サーバー開発用のプロジェクトフォルダ「mcp\hulft-mcp」を作成して遷移します。

PS C:\Users\...> cd ~\Documents
PS C:\Users\...\Documents> mkdir -p mcp\hulft-mcp
PS C:\Users\...\Documents> cd mcp\hulft-mcp

プロジェクトの情報管理を担う「package.json」ファイルを生成します。

PS C:\Users\Administrator\Documents\mcp\hulft-mcp>npm init -y

MCP サーバーの実装に必要な依存パッケージを「package.json」ファイルに定義します。

PS C:\Users\Administrator\Documents\mcp\hulft-mcp> npm install @modelcontextprotocol/sdk zod
PS C:\Users\Administrator\Documents\mcp\hulft-mcp> npm install -D typescript @types/node

TypeScript から JavaScript へのトランスパイルに必要な、コンパイルオプションを管理する「tsconfig.json」ファイルを生成します。

PS C:\Users\Administrator\Documents\mcp\hulft-mcp> npx tsc --init

このように実行していきます
{66EA7B47-3F89-4424-8034-2715EF20C886}.png

ビルド環境の整備

TypeScript から JavaScript へソースコードをトランスパイルできるように設定ファイルを整えため VS Code を起動します。

PS C:\Users\Administrator\Documents\mcp\hulft-mcp> code .

プロジェクトフォルダをルートに VS Code が起動しました。
{EEB9EA71-8F7B-4D77-8236-89DA9F5045D5}.png

まず始めに「package.json」ファイルを VS Code で開き、ビルド用のコマンドを追記します。以下のファイルイメージで、各行の左端に記載されている「+」は、ファイルに追加する行を表現しているため、「+」自体は実際に追記しません。

       :
      "main": "index.js",
      "scripts": {
+       "build": "tsc",
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "repository": {
       :

設定ファイルの編集における主な考慮事項は以下の通りです。
「build」タスクでは、tsc コマンドが「tsconfig.json」ファイルに従って TypeScript から JavaScript へソースコードをトランスパイルします。

編集すると以下のようになります
{84B2AAF8-DF06-4A6F-A697-AE35669E2002}.png

次に「tsconfig.json」ファイルを VS Code で開き、以下の内容に書き換えます。

{
  "compilerOptions": {
    "target": "ES2023",
    "module": "Node16",
    "moduleResolution": "Node16",
    "outDir": "./build",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

設定ファイルの編集における主な考慮事項は以下の通りです。
「target」「module」「moduleResolution」には現時点で選べる最新の値を指定します。
「outDir」には、tsc コマンドでビルドしたソースコードを出力するフォルダを指定します。
「rootDir」には、tsc コマンドでビルドするソースコードが存在するフォルダを指定します。

初期状態の index.ts を作成

Windows PowerShell に戻り、MCP サーバーが起動できるようにソースコードの実装と管理をする「src」フォルダを作成します。

PS C:\Users\Administrator\Documents\mcp\hulft-mcp> mkdir src

VS Code に戻り、MCP サーバーを起動するスケルトン状態の「src\index.ts」を、以下のソースコードをコピペして新規に作成します。

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

// MCP server instance
const server = new McpServer({
  name: "hulft",
  version: "1.0.0",
  capabilities: {
    resources: {},
    tools: {},
  },
});

// Entry point to run MCP server
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("stdio上で動作するHULFT MCPサーバ");
}

main().catch((error) => {
  console.error("main()で致命的なエラーが発生しました:", error);
  process.exit(1);
});

ビルドしてトランスパイル

src\index.ts」の作成が完了したら、スケルトンのできあがりを動作確認するために、ビルドして TypeScript から JavaScript のソースコードを生成します。

PS C:\Users\Administrator\Documents\mcp\hulft-mcp> npm run build


> hulft-mcp@1.0.0 build
> tsc

ビルドが完了すると「build\index.js」ができあがりました。
プロジェクト全体としては以下のコマンドで構成を確認出来ます。

PS C:\Users\Administrator\Documents\mcp\hulft-mcp> tree /f

node_modele」フォルダ配下の記載は省略していますが、下記のように確認出来ます。
image.png

これまでの手順で作成したプロジェクトファイルを GitHub のリポジトリで管理する際は、以下にご留意ください。

package-lock.json」「package.json」「tsconfig.json」のファイルを構成管理します。
src」フォルダ、およびその配下のソースコードを構成管理します。
node_module」フォルダは構成管理の対象外とし、必要な依存パッケージは「npm install」コマンドで npm レジストリから随時ダウンロードします。
build」フォルダは構成管理の対象外とし、必要な際にビルドして JavaScript のソースコードを生成します。

MCP Inspector で動作確認

MCP サーバーのスケルトンができあがったことを確認するために、MCP Inspector を起動してブラウザでアクセスします。

下記のコマンドを実行すると自動でブラウザが立ち上がります

PS C:\Users\Administrator\Documents\mcp\hulft-mcp> npx @modelcontextprotocol/inspector node build/index.js

※自動でブラウザが起動しなかった場合はコマンド実行後しログにアクセス先の URLが表示されます
(例:以下のhttp://localhost:6274・・・・がアクセス先の URL です)
image.png

ブラウザで MCP Inspector へアクセスしたら画面左中央部の「Connect」ボタンをクリックして MCP サーバーに接続します。

image.png

現時点の MCP サーバーはツールが一つもないので、画面中央には「The connected server does not support any MCP capabilities 」のメッセージが表示されるだけになりますが、スケルトンは無事にできあがりました。

image.png

4.HULFT10のMCPサーバーを実装

スケルトンにツールを実装

MCP サーバーのスケルトンに4つのツールを構造化して実装するので、Windows PowerShell で「src」フォルダ配下にサブフォルダを作成します。

PS C:\Users\Administrator\Documents\mcp\hulft-mcp> mkdir src\interfaces
PS C:\Users\Administrator\Documents\mcp\hulft-mcp> mkdir src\services

ここからファイルの中を実装していきます。
HULFT10と接続するのに必要な設定ファイルは3つです
 ➀ 「src\interfaces\hulftapi.ts
 ➁ 「src\services\hulft.ts
 ➂ 「src\index.ts

順番に設定していきます。

➀「hulftapi.ts」 ファイルを編集
VS Code をアクティブにして、新規に「src\interfaces\hulftapi.ts」ファイルを作成してインターフェースを定義します。

// src/interfaces/hulftapi.ts
// HULFT API関連の型定義およびインターフェース

export interface HulftSendingLog {
  id: string;
  status: string;
  startTime: string;
  endTime?: string;
  // ここに必要なプロパティを追加
}

export interface HulftReceivingLog {
  id: string;
  status: string;
  startTime: string;
  endTime?: string;
  // 必要に応じて追加
}

export interface HulftSendingManagement {
  id: string;
  name: string;
  description?: string;
  // 管理情報の主要項目
}

export interface HulftReceivingManagement {
  id: string;
  name: string;
  description?: string;
  // 管理情報の主要項目
}

export interface HulftJobLog {
  jobId: string;
  status: string;
  startTime: string;
  endTime?: string;
  // ジョブ履歴の詳細は必要に応じて拡充
}

export interface HulftHealthResponse {
  status: string;
  uptime?: number;
  message?: string;
}

// APIレスポンスの型(HULFT APIがリスト形式で返すタイプ)
export interface HulftApiListResponse<T> {
  data: T[];
  // ページングやメタ情報があればここに
}

➁「hulft.ts」 ファイルを編集
続いて新規に「src\services\hulft.ts」ファイルを作成し、ツールから呼び出される関数を実装します。

const HULFT_CONTROL_URL = process.env.HULFT_CONTROL_URL;
const HULFT_HOST_ID = process.env.HULFT_HOST_ID;
const ACCESS_TOKEN = process.env.ACCESS_TOKEN;

async function callHulftApi(path: string): Promise<string | null> {
  const url = `${HULFT_CONTROL_URL}/api/v1/hulft/${HULFT_HOST_ID}/${path}`;
  try {
    const response = await fetch(url, {
      method: "GET",
      headers: {
        "Authorization": `Bearer ${ACCESS_TOKEN}`,
      },
    });
    if (!response.ok) {
      console.error(`Error response from HULFT API: ${response.status} ${response.statusText}`);
      return null;
    }
    // APIによってはJSONかテキストか異なる可能性があるため、まずテキストで受ける
    return await response.text();
  } catch (error) {
    console.error("Failed to call HULFT API:", error);
    return null;
  }
}

// 配信履歴の一覧取得
export async function getSendingsList(): Promise<string | null> {
  return await callHulftApi("logs/sendings/list");
}

// 集信履歴の一覧取得
export async function getReceivingsList(): Promise<string | null> {
  return await callHulftApi("logs/receivings/list");
}

// 配信管理情報の一覧取得
export async function getSendingsManagements(): Promise<string | null> {
  return await callHulftApi("managements/sendings/list");
}

// 集信管理情報の一覧取得
export async function getReceivingsManagements(): Promise<string | null> {
  return await callHulftApi("managements/receivings/list");
}

// ジョブ履歴の一覧取得
export async function getJobsList(): Promise<string | null> {
  return await callHulftApi("logs/jobs/list");
}

// HULFT接続確認
export async function checkHealth(): Promise<string> {
  const result = await callHulftApi("health");
  return result ?? "接続確認に失敗しました";
}

➂「index.ts」 ファイルを編集

動作を確認するために、既に存在している MCP サーバーの「src\index.ts」に設定値を入れます

ここではテストのため、下記に実際の値を設定してください。
"http://hulft-ControlURL"
"hulft-host-id"
"AccessToken"

※設定しなかった場合は、Claudeの環境変数の値が認識されるので、後のテストツール(MCP Inspector)ではレスポンスに「null」が返ってきますが、Claudeに実装後には正常に返答が返ってきます

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

// MCP server instance
const server = new McpServer({
  name: "hulft",
  version: "1.0.0",
  capabilities: {
    resources: {},
    tools: {},
  },
});

// Environment variables or default values for HULFT API access
const HULFT_CONTROL_URL = process.env.HULFT_CONTROL_URL || "http://hulft-ControlURL";
const HULFT_HOST_ID = process.env.HULFT_HOST_ID || "hulft-host-id";
const ACCESS_TOKEN = process.env.ACCESS_TOKEN || "AccessToken";

// Helper function to call HULFT APIs
async function callHulftApi<T>(path: string): Promise<T | null> {
  const url = `${HULFT_CONTROL_URL}/api/v1/hulft/${HULFT_HOST_ID}/${path}`;
  try {
    const response = await fetch(url, {
      method: "GET",
      headers: {
        "Authorization": `Bearer ${ACCESS_TOKEN}`,
      },
    });
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    return (await response.json()) as T;
  } catch (error) {
    console.error("Error calling HULFT API:", error);
    return null;
  }
}

// Define MCP tools for each API endpoint

server.tool(
  "get-sendings-logs",
  "配信履歴の一覧取得",
  {},
  async () => {
    const data = await callHulftApi<any>("logs/sendings/list");
    return {
      content: [
        {
          type: "text",
          text: JSON.stringify(data, null, 2) || "配信履歴がありません",
        },
      ],
    };
  }
);

server.tool(
  "get-receivings-logs",
  "集信履歴の一覧取得",
  {},
  async () => {
    const data = await callHulftApi<any>("logs/receivings/list");
    return {
      content: [
        {
          type: "text",
          text: JSON.stringify(data, null, 2) || "集信履歴がありません",
        },
      ],
    };
  }
);

server.tool(
  "get-sendings-managements",
  "配信管理情報の一覧取得",
  {},
  async () => {
    const data = await callHulftApi<any>("managements/sendings/list");
    return {
      content: [
        {
          type: "text",
          text: JSON.stringify(data, null, 2) || "配信管理情報がありません",
        },
      ],
    };
  }
);

server.tool(
  "get-receivings-managements",
  "集信管理情報の一覧取得",
  {},
  async () => {
    const data = await callHulftApi<any>("managements/receivings/list");
    return {
      content: [
        {
          type: "text",
          text: JSON.stringify(data, null, 2) || "集信管理情報がありません",
        },
      ],
    };
  }
);

server.tool(
  "get-jobs-logs",
  "ジョブ履歴の一覧取得",
  {},
  async () => {
    const data = await callHulftApi<any>("logs/jobs/list");
    return {
      content: [
        {
          type: "text",
          text: JSON.stringify(data, null, 2) || "ジョブ履歴がありません",
        },
      ],
    };
  }
);

server.tool(
  "check-health",
  "HULFT接続確認",
  {},
  async () => {
    const data = await callHulftApi<any>("health");
    return {
      content: [
        {
          type: "text",
          text: data ? "OK" : "接続確認に失敗しました",
        },
      ],
    };
  }
);

// Entry point to run MCP server
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("stdio上で動作するHULFT MCPサーバ");
}

main().catch((error) => {
  console.error("main()で致命的なエラーが発生しました:", error);
  process.exit(1);
});

HULFT10の使用するAPI

公式API仕様もご確認ください

・配信履歴の一覧取得
http://{hulft-ControlURL}/api/v1/hulft/{hulft-host-id}/logs/sendings/list

・集信履歴の一覧取得
http://{hulft-ControlURL}/api/v1/hulft/{hulft-host-id}/logs/receivings/list

・配信管理情報の一覧取得
http://{hulft-ControlURL}/api/v1/hulft/{hulft-host-id}/managements/sendings/list

・集信管理情報の一覧取得
http://{hulft-ControlURL}/api/v1/hulft/{hulft-host-id}/managements/receivings/list

・ジョブ履歴の一覧取得
http://{hulft-ControlURL}/api/v1/hulft/{hulft-host-id}/logs/jobs/list

・HULFT接続確認
http://{hulft-ControlURL}/api/v1/hulft/{hulft-host-id}/health**

ビルドしてトランスパイル

ソースコードが揃ったので、実装したツールのできあがりを動作確認するために、ビルドして TypeScript から JavaScript のソースコードを生成します。

PS C:\Users\Administrator\Documents\mcp\hulft-mcp> npm run build


> hulft-mcp@1.0.0 build
> tsc

MCP Inspector で動作確認

MCP サーバーに実装したツールを動作確認するため、MCP Inspector を起動し、ログに表示される URL へブラウザでアクセスします。

PS C:\Users\Administrator\Documents\mcp\hulft-mcp> npx @modelcontextprotocol/inspector node build/index.js

ブラウザで MCP Inspector へアクセスしたら画面左中央部の「Connect」ボタンをクリックして MCP サーバーに接続します。

image.png

MCP サーバーにツールが搭載されているので、画面中央部に Tools 関連の情報が表示されており、「List Tools」ボタンをクリックすると接続した MCP サーバーが持っているツール一覧が表示されます。

image.png

表示されているツール一覧からツールをテストします。
まずは「get-sendings-logs」ツールを選んで「Run Tool」ボタンをクリックしテストを実施します。

image.png

レスポンスに「null」が返ってきますが「src\index.ts」に正しい値を設定しているとレスポンスが正常に返ってきます
{D08AA6F4-8063-46EA-8724-E3BF164AB1A4}.png

5.Claude(MCPホスト)に組み込み

連携先 MCP サーバーの設定

Windows のスタートメニューから「Anthropic > Claude」を選択して起動します。

image.png

Claude が起動したら画面左上のハンバーガーメニューから「ファイル > 設定…」を選択します。

image.png

image.png

設定を編集」を押下するとローカルファイルが表示されます。
Claude の設定ファイル「claude_desktop_config.json」をダブルクリックしてエディターで開きます。
image.png

claude_desktop_config.json」に下記を記載します。

{
  "mcpServers": {
    "HULFT10": {
      "command": "node",
      "args": ["C:\\Users\\{ユーザー名}\\Documents\\mcp\\hulft-mcp\\build\\index.js"],
      "env": {
        "HULFT_CONTROL_URL": "http://your-hulft-control-url",
        "ACCESS_TOKEN": "your-access-token",
        "HULFT_HOST_IDS": "[\"host1\"]"
      }
    }
  }
}

node コマンドが MCP サーバーとして起動する「index.js」の Path を指定します。
Path にある「{ユーザー名}」は PC で利用しているユーザー名に置き換えます。
Path でフォルダの区切りを示す「\」は二重の「\」で書く必要があります。
env は環境変数を表します。下記を正しい値に変えてください
 "http://your-hulft-control-url"
 "your-access-token"
 host1

設定値について

HULFT10 公式API仕様もご確認ください

6.Claudeの再起動で設定反映

変更した設定ファイルの適用に、ウィンドウの「×」ボタンで終了させるだけではなく、Claude のプロセスを完全に終了させる必要があるため、Windows タスクバーの画面右側のアイコン表示領域から Claude アイコンを探し、右クリックで表示されるメニューから「終了」を選択してプロセスを完全に終了させます。

image.png

Windows のスタートメニューから「Anthropic > Claude」を選択して起動します。

Claude が起動したら画面中央のテキストボックス内の左下にある「検索とツール」アイコンをクリックします。表示されたメニューに、「HULFT10」の項目と右横に数字が表示されていたら、オリジナルの MCP サーバーは正常に設定できました。

image.png

ONになってい機能を確認することも出来ます
{F6C8D994-58A8-459D-852C-15C9E8304443}.png

7.MCPサーバーの実演

ここまで出来ましたら作成は完了です。
実際に動かしてみます。
下記のプロンプトを入れて試してみましたのでよろしければ動画をご覧ください
「HULFT10の直近のエラーが発生した日時を教えてください」

最後に

ここまで読んで頂きありがとうございます

個人的には今まで単語として知っていたMCPも実際に作成するとかなり理解が深まりました

今回はHULFT10 API Gatewayを使用したことで、HULFTを管理することが可能なAPIとして公開することが出来るのでMCPとの「データソース」として使ってみました。

この記事の内容がみなさんの参考になれば「いいね」をおして頂けると嬉しいです。

ここまで読んでいただきありがとうございました。それでは、また!:raised_hand:

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?