はじめに
こんにちは!shuです。 ![]()
今、LLMの活用が「ちょっと試してみようかな」から「本格的な業務適用フェーズへ移す」の段階へ移行しています!
だけど、分析結果を可視化したり、レポートを作る作業が毎回手作業で、ちょっぴり面倒だなぁと感じている方、いませんか?…この作業、自動化できたら嬉しいですよね?
この自動化の実現で試したのが、Anthropic社のClaude Files API です!
Claude Files APIとは?
Claude Files APIは、ファイルベースの処理をプログラマティックに実行できるAPIです。
従来のテキストベースのやり取りに加えて、ファイルを直接扱うことで、より実践的な業務自動化が可能になります。
ざっくり分解すると下記になります!
✅ファイルのアップロードと管理
✅大規模ドキュメントの解析
✅画像・PDFなどの多様な形式への対応
✅生成結果のダウンロードと保存
✨手作業で数時間かかっていたレポート作成が、数分で完了します✨
動作環境・使用する製品
-
Claude API: Anthropicのfiles APIとCode execution tool
-
日本発国産iPaaS:` HULFT Square
-
ログソース: HULFT、複数のHULFTの統合管理HULFT API Gateway
-
可視化: (今回は拡張子.htmlダッシュボードの生成)
それ以外に、.webp、.png、.pptx、.pdfなど拡張子のファイルの生成も検証できました。
それでは、この自動化フローの実装を見ていきましょう!
実装手順
1.事前準備
①HULFT10 API Gatewayトークンの発行
②Claude APIトークンの発行
2.HULFT Squareで一連の処理の構築
③コネクションの作成
④スクリプトの作成
⑤スクリプト実行してみる
3.結果確認
1.事前準備
①HULFT10 API Gatewayトークンの発行
Bearer 認証で使うため、HULFT10 API Gatewayのアクセストークン発行を行います。まずHULFT10 API Gateway にログインします。

※HULFT API Gatewayの導入と環境構築は下記の記事をご参考ください。
https://qiita.com/sugimon/items/f48fc75d0c81071116b3
➁Claude APIトークンの発行
Build on the Claude Developer Platform にアクセスする。
https://claude.com/platform/api
※API Keyは一度しか表示されないので要注意を!!
2.HULFT Squareで一連の処理の構築
③コネクションの作成
HULFT10 API Gatewayのコネクションを設定しておきます。
※ご参考:HULFT Squareのコネクション
①:任意の名前を入れます。※ここで「REST接続_HULFTAPIGW」を入れました。
➁:対象ワークスペースを選択します
③:「次へ」を押します。
④:URL:http://APIGAtewayを起動しているホスト名
⑤:接続テストを行います。
⑥:問題なければ「次へ」を押します。

Claude files APIのコネクションを設定しておきます。
①:任意の名前を入れます。※ここで「REST接続_ClaudeAPI」を入れました。
➁:対象ワークスペースを選択します
③:「次へ」を押します。
④:URL:http://api.anthropic.com
⑤:接続テストを行います。
⑥:問題なければ「次へ」を押します。

④スクリプトの設定
まずスクリプトを作成するためのプロジェクトを作ります!
※ご参考:HULFT Squareのプロジェクト
データ連携フローを作成するHULFT Squareのデザイナーを起動します。
※ご参考:HULFT Squareのデザイナー
①:【完了】を押します。
➁:プロファイルを事前に用意して選択します。
※ご参考:HULFT Squareのプロファイル
③:integrateを選択します。
④:デザイナーを起動します。

スクリプトを作っていきます。
※ご参考:HULFT Squareのスクリプト_チュートリアル
①HULFTログファイル取得のスクリプトを作ります。
【ツールパレット】➡【ネットワーク】➡【REST】➡【GET実行】
名前:HULTFlog_GET
接続先:先ほど作成したHULFT10 API Gatewayのコネクション名を選択します。
パス:/api/v1/hulft/${hulft1-host-id}/logs/sendings/list
※{hulft-host-id}は接続するHULFTのホストID。詳細と取得方法は下記をご参考。

エンコード:UTF-8
クエリパラメータ:以下のパラメータを追加します。
※ご参考:配信履歴の一覧取得クエリパラメータ
| 名前 | 値 | 備考 |
|---|---|---|
limit |
40000 |
検索件数の上限。省略すると“100”が設定される |
from-end-date |
20200301 |
検索範囲の配信開始日を指定 |
to-end-date |
20241230 |
検索範囲の配信終了日を指定 |
【JSONファイルを指定して出力スキーマを設定】をクリック、HULFT Squareのストレージに格納しているJSONファイルを指定します。
※ご参考:JSONスキーマの準備
JSONサンプルファイルは、事前にHULFTSquareストレージに保存します。
※ご参考:HULFT10 API Gateway 配信一覧取得 API レスポンスコード
{
"records": [
{
"file_id": "example_file_id", // ファイルID
"id": {}, // ID
"latest_transfer": "transfer_id", // 転送ID
"latest_process": "process_id", // 処理ID
"comment": "sample comment", // コメント
"status": { // 実行結果
"code": 0, // 完了コード
"detail": 0, // 詳細コード
"description": "description text", // 内容
"measure": "measure text" // 対処
},
"file": { // 配信ファイル
"name": "filename.txt" // ファイル名
},
"transferred": { // 転送済みファイル情報
"rows": 100, // 転送済みレコード件数
"size": 1024 // 転送済みデータサイズ(bytes)
},
"code_conversion": { // コード変換
"side": "sending" // コード変換側
},
"communication": { // 接続情報
"host": "example.com", // ホスト名
"ip_version": "ipv4" // IPバージョン
},
"rate": 1.5, // 転送レート
"block_length": 512, // 転送ブロック長
"block_count": 10, // 転送ブロック数
"datetime": { // 日時情報
"accept": "2023-01-01T00:00:00Z", // 受付日時
"start": "2023-01-01T00:01:00Z", // 開始日時
"end": "2023-01-01T00:02:00Z" // 終了日時
},
"compression": { // 圧縮情報
"type": "none", // 圧縮方式
"ratio": 1.0 // 圧縮率
},
"database_id": "db_id", // 連携DBID
"security": { // セキュリティ
"encryption_scheme": "none" // 暗号化種別
},
"message": { // メッセージ
"short": ["msg1", "msg2"], // メッセージ0~5
"long": ["long msg1", "long msg2"] // 拡張メッセージ0~1
},
"windows": { // Windows環境管理情報
"connection_type": "lan" // 接続形態
},
"job_id": "job123" // ジョブID
}
]
}
Mapperでの設定は下記!
※ご参考:HULFT SquareのMapper
| HULFTlog_GET (入力データ) | excel_write (出力データ) |
|---|---|
file_id |
FILEID |
comment |
コメント |
code |
転送状態 |
name |
ファイル名 |
host |
ホスト名 |
start |
配信日 |
➁Claudeへログファイルアップロードのスクリプトを作ります。
【JSONファイルを指定して出力スキーマを設定】をクリック、HULFT Squareのストレージに格納しているJSONファイルを指定します。

JSONサンプルファイルは、事前にHULFTSquareストレージに保存します。
※ご参考:Claude files API_ファイルアップロードレスポンスコード
{
"id": "file_011CNha8iCJcU1wXNR6q4V8w",
"type": "file",
"filename": "document.pdf",
"mime_type": "application/pdf",
"size_bytes": 1024000,
"created_at": "2025-01-01T00:00:00Z",
"downloadable": false
}
③ログファイルの解析・可視化処理のスクリプトを作ります。
リクエスト設定ヘッダの設定
| 名前 | 値 | 備考 |
|---|---|---|
x-api-key |
#Claud APIキー |
|
anthropic-version |
2023-06-01 |
モデルバージョン |
anthropic-beta |
code-execution-2025-08-25,files-api-2025-04-14 |
Files API とコード実行を一緒に使用するには、2 つのベータヘッダーが必要 |
content-type |
application/json |
リクエスト設定ヘッダの設定
| 名前 | bash_code_execution_result, text_editor_code_execution_result |
|---|
【リクエスト設定】
【JSONファイルを指定して出力スキーマを設定】をクリック、HULFT Squareのストレージに格納しているJSONファイルを指定します。
JSONサンプルファイルは、事前にHULFTSquareストレージに保存します。
※ご参考:コード実行で分析するリクエストコード

Jsonファイルのサンプルコードは下記です!
{
"model": "claude-sonnet-4-5",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "Analyze this CSV data"},
{"type": "container_upload", "file_id": "file_abc123"}
]
}
],
"tools": [
{
"type": "code_execution_20250825",
"name": "code_execution"
}
]
}
【レスポンス設定】
【JSONファイルを指定して出力スキーマを設定】をクリック、HULFT Squareのストレージに格納しているJSONファイルを指定します。
JSONサンプルファイルは、事前にHULFTSquareストレージに保存します。
※ご参考:コード実行で分析するレスポンスコード

Jsonファイルのサンプルコードは下記です!
※コード量が多くて非表示にしています!
📄 JSONコードを表示(クリックで展開)
{
"id": "msg_01K1V5WEJW1SmALEiUKs25Uf",
"container": {
"id": "container_011CTu5ygdBchEoaR2V3RK3x",
"expires_at": "2025-10-08T05:20:10.535226Z"
},
"content": [
{
"type": "text",
"text": "HULFTログのダッシュボードファイルを確認して出力いたします。"
},
{
"type": "server_tool_use",
"id": "srvtoolu_01TZAuE82K6vshCCDh8QaSLh",
"name": "bash_code_execution",
"input": {
"command": "\n# まず、既存のダッシュボードファイルが存在するか確認\nif [ -f /tmp/hulft_dashboard.html ]; then\n echo \"ダッシュボードファイルが見つかりました\"\n ls -lh /tmp/hulft_dashboard.html\nelse\n echo \"ダッシュボードファイルが見つかりません\"\nfi\n\n# dashboard_data.jsonも確認\nif [ -f /tmp/dashboard_data.json ]; then\n echo \"分析データファイルが見つかりました\"\n ls -lh /tmp/dashboard_data.json\nelse\n echo \"分析データファイルが見つかりません\"\nfi\n"
}
},
{
"type": "bash_code_execution_tool_result",
"tool_use_id": "srvtoolu_01TZAuE82K6vshCCDh8QaSLh",
"content": {
"type": "bash_code_execution_result",
"stdout": "ダッシュボードファイルが見つかりません\n分析データファイルが見つかりません\n",
"stderr": "",
"return_code": 0
}
},
{
"type": "text",
"text": "前回のファイルが見つからないようです。新しくアップロードされたHULFTログファイルから分析とダッシュボードを作成いたします。"
},
{
"type": "server_tool_use",
"id": "srvtoolu_014XDJwq4BzUahz14qduQZQu",
"name": "bash_code_execution",
"input": {
"command": "\n# アップロードされたファイルを確認\nls -lh $INPUT_DIR/\n"
}
},
{
"type": "bash_code_execution_tool_result",
"tool_use_id": "srvtoolu_014XDJwq4BzUahz14qduQZQu",
"content": {
"type": "bash_code_execution_result",
"stdout": "total 211K\n-rw-r--r-- 1 root root 211K Oct 8 04:18 HULFTログ_4年分.xlsx\n",
"stderr": "",
"return_code": 0
}
},
{
"type": "text",
"text": "それでは、HULFTログファイルを分析してダッシュボードを作成します。"
},
{
"type": "server_tool_use",
"id": "srvtoolu_015inTVm9DcoPY4ejBZPRRJR",
"name": "text_editor_code_execution",
"input": {
"command": "create",
"path": "/tmp/analyze_hulft_log.py",
"file_text": "import pandas as pd\nimport json\nimport os\nfrom datetime import datetime\n\n# HULFTログファイルを読み込む\ninput_file = os.path.join(os.environ['INPUT_DIR'], 'HULFTログ_4年分.xlsx')\ndf = pd.read_excel(input_file)\n\n# データの基本情報を確認\nprint(\"データの形状:\", df.shape)\nprint(\"\\nカラム名:\")\nprint(df.columns.tolist())\nprint(\"\\n最初の数行:\")\nprint(df.head())\nprint(\"\\nデータ型:\")\nprint(df.dtypes)\nprint(\"\\n基本統計:\")\nprint(df.describe())\n\n# 日付カラムを特定して変換\ndate_columns = []\nfor col in df.columns:\n if df[col].dtype == 'object':\n try:\n pd.to_datetime(df[col], errors='raise')\n date_columns.append(col)\n df[col] = pd.to_datetime(df[col])\n except:\n pass\n elif 'datetime' in str(df[col].dtype):\n date_columns.append(col)\n\nprint(\"\\n日付カラム:\", date_columns)\n\n# データの詳細を確認\nprint(\"\\nユニークな値の数:\")\nfor col in df.columns:\n print(f\"{col}: {df[col].nunique()}\")\n"
}
},
{
"type": "text_editor_code_execution_tool_result",
"tool_use_id": "srvtoolu_015inTVm9DcoPY4ejBZPRRJR",
"content": {
"type": "text_editor_code_execution_create_result",
"is_file_update": false
}
},
{
"type": "server_tool_use",
"id": "srvtoolu_01NepczEH1cf99h4RmJyyZrf",
"name": "bash_code_execution",
"input": {
"command": "cd /tmp && python analyze_hulft_log.py"
}
},
{
"type": "bash_code_execution_tool_result",
"tool_use_id": "srvtoolu_01NepczEH1cf99h4RmJyyZrf",
"content": {
"type": "bash_code_execution_result",
"stdout": "データの形状: (5628, 9)\n\nカラム名:\n['ファイルID', 'コメント', '転送状態', 'ファイル名', '転送サイズ', '転送形式', 'ホスト名', '転送速度', '配信日']\n\n最初の数行:\n ファイルID コメント ... 転送速度 配信日\n0 INVENTORY_STATUS_FORJUNE_SPEEDDISTRIBUTION 商品在庫状況 ... 2 MB/s 3/18/2020\n1 FILE05 NaN ... 2 MB/s 3/18/2020\n2 20240616_INVOICE_SPEEDDISTRIBUTION 請求書 ... 2 MB/s 3/18/2020\n3 20240616_PURCHASE_ORDER_SPEEDDISTRIBUTION 発注書 ... 2 MB/s 3/18/2020\n4 20240616_DELIVERYNOTE_SPEEDDISTRIBUTION NaN ... 2 MB/s 3/18/2020\n\n[5 rows x 9 columns]\n\nデータ型:\nファイルID object\nコメント object\n転送状態 object\nファイル名 object\n転送サイズ object\n転送形式 object\nホスト名 object\n転送速度 object\n配信日 object\ndtype: object\n\n基本統計:\n ファイルID コメント ... 転送速度 配信日\ncount 5628 3439 ... 5628 5628\nunique 24 5 ... 195 76\ntop INVENTORY_STATUS_FORJUNE_SPEEDDISTRIBUTION 請求書 ... 1MB/s 12/19/2021\nfreq 493 922 ... 1792 640\n\n[4 rows x 9 columns]\n\n日付カラム: []\n\nユニークな値の数:\nファイルID: 24\nコメント: 5\n転送状態: 4\nファイル名: 42\n転送サイズ: 5\n転送形式: 1\nホスト名: 8\n転送速度: 195\n配信日: 76\n",
"stderr": "日付変換に関する警告",
"return_code": 0
}
},
{
"type": "server_tool_use",
"id": "srvtoolu_01FvCYoC265JHEzBk9D7s2Jd",
"name": "text_editor_code_execution",
"input": {
"command": "create",
"path": "/tmp/create_dashboard.py",
"file_text": "import pandas as pd\nimport json\nimport os\nfrom datetime import datetime\nimport re\n\n# HULFTログファイルを読み込む\ninput_file = os.path.join(os.environ['INPUT_DIR'], 'HULFTログ_4年分.xlsx')\ndf = pd.read_excel(input_file)\n\n# 配信日を日付型に変換\ndf['配信日'] = pd.to_datetime(df['配信日'])\n\n# 年月を追加\ndf['年月'] = df['配信日'].dt.to_period('M').astype(str)\ndf['年'] = df['配信日'].dt.year\ndf['月'] = df['配信日'].dt.month\ndf['曜日'] = df['配信日'].dt.day_name()\n\n# 転送速度を数値に変換(MB/s単位)\ndef parse_speed(speed_str):\n if pd.isna(speed_str):\n return 0\n speed_str = str(speed_str).strip().upper()\n speed_str = speed_str.replace(' ', '')\n match = re.match(r'([\\d.]+)\\s*(MB|KB|GB)?', speed_str)\n if match:\n value = float(match.group(1))\n unit = match.group(2) if match.group(2) else 'MB'\n if unit == 'KB':\n value = value / 1024\n elif unit == 'GB':\n value = value * 1024\n return value\n return 0\n\ndf['転送速度_数値'] = df['転送速度'].apply(parse_speed)\n\n# 転送サイズを数値に変換(MB単位)\ndef parse_size(size_str):\n if pd.isna(size_str):\n return 0\n size_str = str(size_str).strip().upper()\n size_str = size_str.replace(' ', '')\n match = re.match(r'([\\d.]+)\\s*(MB|KB|GB)?', size_str)\n if match:\n value = float(match.group(1))\n unit = match.group(2) if match.group(2) else 'MB'\n if unit == 'KB':\n value = value / 1024\n elif unit == 'GB':\n value = value * 1024\n return value\n return 0\n\ndf['転送サイズ_数値'] = df['転送サイズ'].apply(parse_size)\n\n# 分析データを作成\nanalysis = {\n 'summary': {\n 'total_records': int(len(df)),\n 'date_range': {\n 'start': df['配信日'].min().strftime('%Y-%m-%d'),\n 'end': df['配信日'].max().strftime('%Y-%m-%d')\n },\n 'total_file_ids': int(df['ファイルID'].nunique()),\n 'total_hosts': int(df['ホスト名'].nunique()),\n 'total_transfer_size_mb': float(df['転送サイズ_数値'].sum()),\n 'avg_transfer_speed': float(df['転送速度_数値'].mean())\n },\n 'transfer_status': df['転送状態'].value_counts().to_dict(),\n 'monthly_trend': df.groupby('年月').agg({\n 'ファイルID': 'count',\n '転送サイズ_数値': 'sum',\n '転送速度_数値': 'mean'\n }).reset_index().to_dict('records'),\n 'yearly_summary': df.groupby('年').agg({\n 'ファイルID': 'count',\n '転送サイズ_数値': 'sum',\n '転送速度_数値': 'mean'\n }).reset_index().to_dict('records'),\n 'top_file_ids': df['ファイルID'].value_counts().head(10).to_dict(),\n 'host_distribution': df['ホスト名'].value_counts().to_dict(),\n 'transfer_format': df['転送形式'].value_counts().to_dict(),\n 'comment_distribution': df['コメント'].value_counts().dropna().to_dict(),\n 'file_size_distribution': df['転送サイズ'].value_counts().to_dict(),\n 'speed_stats': {\n 'min': float(df['転送速度_数値'].min()),\n 'max': float(df['転送速度_数値'].max()),\n 'mean': float(df['転送速度_数値'].mean()),\n 'median': float(df['転送速度_数値'].median())\n }\n}\n\n# JSONファイルとして保存\nwith open('/tmp/dashboard_data.json', 'w', encoding='utf-8') as f:\n json.dump(analysis, f, ensure_ascii=False, indent=2)\n\nprint(\"分析データを /tmp/dashboard_data.json に保存しました\")\n"
}
},
{
"type": "text_editor_code_execution_tool_result",
"tool_use_id": "srvtoolu_01FvCYoC265JHEzBk9D7s2Jd",
"content": {
"type": "text_editor_code_execution_create_result",
"is_file_update": false
}
}
],
"model": "claude-sonnet-4-5-20250929",
"role": "assistant",
"stop_reason": "end_turn",
"usage": {
"input_tokens": 114723,
"output_tokens": 8466
}
}マッピングの設定は下記!
”単一文字列”ロジックの設定
| 出力データ | 値 | 備考 |
|---|---|---|
model |
claude-sonnet-4-5 |
モデル |
max_tokens |
8192 |
最大TOKEN |
type |
number |
*mapperの仕様 |
type |
array |
*mapperの仕様 |
role |
user |
|
type |
text |
*mapperの仕様 |
type |
container_upload |
コンテンツブロックを使用してメッセージ内でファイルを参照 |
file_id |
${var_fileid} |
|
type |
object |
*mapperの仕様 |
type |
code_execution_20250825 |
ツールバージョン |
type |
code_execution |
ツール |
”複数行文字列”ロジックの設定
プロンプト:
HULFT10ログを分析し、日本語のタブ切り替え式ダッシュボードをHTMLで生成してください。
【要件】
- 転送処理の傾向・ボトルネックを可視化
- 異常検知と障害予防に役立つ洞察を提供
- トークン制限内で完結するコンパクトな設計
④可視化結果の取得のスクリプトを作ります。
⑤スクリプトを実行してみる
3.生成結果の確認
開くと下記のような動的なダッシュボードが出てきます!
最後に
ここまでお付き合いいただき、心から感謝します!![]()
今回の実装を通じて感じたのは、データ連携とAI/LLMの組み合わせが、レポート作成の自動化に非常に相性が良いということです。
従来は以下のような流れでした:
- ログを手動で収集
- Excelでグラフ作成
- PDFレポートに手作業でまとめる
それが今回、ファイル転送基盤とFiles APIを組み合わせることで、データ収集から可視化まで一気通貫で自動化できました。
このデータ連携 × AI/LLMのアプローチは、ログ分析以外にも様々な業務で応用できそうです。✨
HULFT Squareで試してみる
本記事で紹介した仕組みは、HULFT Squareを使えばすぐに試せます。データ収集の基盤が整っている方は、ぜひClaude Files APIとの連携を検討してみてください。
この記事が役に立ったら、「いいね!」やコメントをいただけると嬉しいです。
皆さんの業務自動化の取り組みもぜひ教えてください!







































