0
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?

3人会社でAI経営OSを自作した話|CFO・CMO・COOエージェントの実装と月商250万からの変化【2026年】

0
Posted at

はじめに — SESから独立して3人会社を作るまで

元々はSES企業に勤めるバックエンドエンジニアでした。「SES つらい」と感じ始めたのは入社3年目のこと。客先常駐のたびに「自分の仕事が何なのか」が曖昧になっていく感覚、スキルの積み上がり方が見えない焦り——そういった感情と向き合いながら、フリーランスへの転向を決めました。

フリーランスに転向後は単価相場を調べながら案件を取り、気づけば3名のチームで会社を立ち上げていました。現在の月商は約250万円規模。ただ、この記事のメインテーマはSESの話ではありません。3名でどうやって経営を回すか、そしてAIエージェントをどう実装したかです。


3人会社の経営ボトルネック

3名体制だと、全員がプレイヤーです。CFO・CMO・COOの役割を専業でやる余裕は誰にもない。2025年末まで私たちは以下の状態でした。

  • 月次の損益計算はExcelで手作業(毎月末に2〜3時間)
  • マーケティング施策のPDCAは「なんとなく感覚」
  • オペレーション改善は「いつかやる」のまま積み上がる

データはある。でも誰も分析する時間がない。この状態を変えるためにAI経営OSの構築を始めました。


全体アーキテクチャ

構成はシンプルです。Claude Code + MCPサーバー + 各種SaaSのAPIです。

[経営データソース]
  └─ Freee (会計)
  └─ Notion (プロジェクト管理)
  └─ Google Analytics 4
  └─ PostgreSQL (自社DB)

[AI経営OS]
  └─ Claude Code (オーケストレーター)
  └─ CFOエージェント (財務分析)
  └─ CMOエージェント (マーケティング分析)
  └─ COOエージェント (オペレーション改善)
  └─ CEOエージェント (意思決定サポート)

各エージェントは claude-sonnet-4-6 をベースに、専用のシステムプロンプトとMCPツール群を持っています。認証情報は .env で管理し、cronによる自動実行はPM2で常駐させています(macOSのlaunchdは無音で死ぬので使いません)。


CFOエージェントの実装

何をやらせているか

  • 月次P/Lの自動集計と異常検知
  • 30日・90日のキャッシュフロー予測
  • 費用カテゴリ別の最適化提案

システムプロンプト(抜粋)

# CFO Agent

あなたはスモールビジネスのCFOとして財務分析を担当します。

## 役割
- 月次損益の分析と前月比・前年比の異常検知
- 30日・90日のキャッシュフロー予測
- 費用カテゴリ別の最適化提案

## データソース
- Freee API: 会計データ
- PostgreSQL: 売上明細

## 出力フォーマット
分析結果はMarkdown形式で出力し、必ず「アクション提案」セクションを含めること。
数値の根拠を必ず明示すること。推測と実データを区別すること。

MCP設定(claude_desktop_config.json抜粋)

{
  "mcpServers": {
    "postgresql": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {
        "POSTGRES_CONNECTION_STRING": "postgresql://user:pass@host/db"
      }
    },
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem"],
      "env": {
        "ALLOWED_DIRECTORIES": "/Users/apple/management-os/reports"
      }
    }
  }
}

週次自動実行スクリプト

毎週月曜朝7時にPM2経由でcron実行されるシェルスクリプトです。

#!/bin/bash
# weekly_cfo_report.sh

set -euo pipefail

REPORT_DATE=$(date +%Y-%m-%d)
REPORT_FILE="reports/cfo_${REPORT_DATE}.md"

echo "[$(date)] CFOレポート生成開始" >> logs/cron.log

claude --model claude-sonnet-4-6 \
  --system-prompt-file prompts/cfo_system.md \
  --mcp-config mcp_config.json \
  "先週の売上データをPostgreSQLから取得し、
   前週比・月累計・費用内訳を分析してください。
   異常値(前週比±30%以上)があれば警告してください。
   結果を ${REPORT_FILE} に保存してください。" \
  2>> logs/cron.log

echo "[$(date)] CFOレポート生成完了" >> logs/cron.log

つまずいたポイント①:データ品質問題

最初の2ヶ月はデータが汚くてエージェントが全く機能しなかったです。Freeeのカテゴリ分けが担当者によってバラバラで、AIが正しく集計できない。「外注費」「業務委託」「フリーランス報酬」が全部別カテゴリとして入力されていました。

解決策はデータ正規化スクリプトをAIの前段に挟むこと:

# normalize_accounting.py
import pandas as pd

CATEGORY_MAP = {
    "外注費": "外注・業務委託費",
    "業務委託": "外注・業務委託費",
    "フリーランス報酬": "外注・業務委託費",
    "開発費": "システム開発費",
    "サーバー代": "インフラ費",
    "AWS": "インフラ費",
    "Vercel": "インフラ費",
}

def normalize_category(df: pd.DataFrame) -> pd.DataFrame:
    df = df.copy()
    df['category_normalized'] = (
        df['category']
        .map(CATEGORY_MAP)
        .fillna(df['category'])
    )
    return df

if __name__ == "__main__":
    df = pd.read_csv("data/freee_export.csv")
    df_normalized = normalize_category(df)
    df_normalized.to_csv("data/freee_normalized.csv", index=False)
    print(f"正規化完了: {len(df)}行 → {df['category'].nunique()}カテゴリ → {df_normalized['category_normalized'].nunique()}カテゴリ")

このステップを挟んでから、CFOエージェントの分析精度が大幅に改善しました。AIに渡すデータの品質が全てです。


CMOエージェントの実装

何をやらせているか

  • GA4データの週次分析
  • コンテンツパフォーマンスの評価(どの記事が流入・CVに貢献しているか)
  • 次の施策提案

GA4連携コード

// ga4_fetcher.js
const { BetaAnalyticsDataClient } = require('@google-analytics/data');

async function getWeeklyMetrics(propertyId) {
  const client = new BetaAnalyticsDataClient({
    keyFilename: process.env.GOOGLE_APPLICATION_CREDENTIALS,
  });

  const [response] = await client.runReport({
    property: `properties/${propertyId}`,
    dateRanges: [{ startDate: '7daysAgo', endDate: 'today' }],
    metrics: [
      { name: 'sessions' },
      { name: 'engagementRate' },
      { name: 'conversions' },
      { name: 'bounceRate' },
    ],
    dimensions: [
      { name: 'pagePath' },
      { name: 'sessionSourceMedium' },
    ],
    orderBys: [{ metric: { metricName: 'sessions' }, desc: true }],
    limit: 50,
  });

  return response.rows.map(row => ({
    page: row.dimensionValues[0].value,
    source: row.dimensionValues[1].value,
    sessions: parseInt(row.metricValues[0].value),
    engagementRate: parseFloat(row.metricValues[1].value),
    conversions: parseInt(row.metricValues[2].value),
    bounceRate: parseFloat(row.metricValues[3].value),
  }));
}

getWeeklyMetrics(process.env.GA4_PROPERTY_ID)
  .then(data => console.log(JSON.stringify(data, null, 2)))
  .catch(err => { console.error(err); process.exit(1); });

CMOエージェントへの渡し方

# ga4データをJSONで取得してから渡す
node ga4_fetcher.js > data/ga4_weekly.json

claude --model claude-sonnet-4-6 \
  --system-prompt-file prompts/cmo_system.md \
  "data/ga4_weekly.json を読み込んで、
   今週のコンテンツパフォーマンスを分析してください。
   特に直帰率が高いページと、CVRが高い流入源を特定してください。
   来週の施策を実施可能なものに絞って3つ提案してください。"

つまずいたポイント②:「過度な野心的提案」問題

CMOエージェントは最初、毎回「YouTube始めましょう」「ポッドキャスト展開を検討してください」「TikTok参入が有効です」などを提案してきました。3人しかいないのに。

プロンプトに制約を追加して解決:

## 提案の制約(必ず守ること)
- 既存チャンネル(note・X)の最適化のみを対象とする
- 新規チャンネル開設・新規ツール導入の提案は禁止
- 1施策あたりの工数は週3時間以内
- 効果が出るまでの期間を必ず明記する
- 「検討してください」という表現を使わない。具体的なアクションを書く

このひと手間でアウトプットが実務レベルに変わりました。


COOエージェントの実装

何をやらせているか

  • Notionのタスク滞留分析(期限切れ・長期停滞タスクの特定)
  • ボトルネックの特定
  • SOP(標準作業手順書)の自動ドラフト作成

Notion APIでタスクデータを取得

# notion_tasks_exporter.py
import os
import json
import requests
from datetime import datetime, timedelta

NOTION_TOKEN = os.environ['NOTION_API_KEY']
DB_ID = os.environ['NOTION_DATABASE_ID']

def get_overdue_tasks():
    headers = {
        'Authorization': f'Bearer {NOTION_TOKEN}',
        'Notion-Version': '2022-06-28',
        'Content-Type': 'application/json',
    }
    cutoff = (datetime.now() - timedelta(days=7)).isoformat()
    payload = {
        'filter': {
            'and': [
                {'property': 'Status', 'select': {'does_not_equal': '完了'}},
                {'property': 'Due Date', 'date': {'before': cutoff}},
            ]
        }
    }
    resp = requests.post(
        f'https://api.notion.com/v1/databases/{DB_ID}/query',
        headers=headers,
        json=payload,
    )
    resp.raise_for_status()
    return resp.json()['results']

tasks = get_overdue_tasks()
print(json.dumps(tasks, ensure_ascii=False, indent=2))

CEOエージェント(意思決定サポート)

CFO・CMO・COOの出力を統合して週次の経営判断材料を作るのがCEOエージェントの役割です。

オーケストレーションスクリプト

#!/bin/bash
# weekly_management_report.sh

set -euo pipefail

DATE=$(date +%Y-%m-%d)

echo "=== [${DATE}] 週次経営レポート生成開始 ==="

bash scripts/run_cfo.sh
bash scripts/run_cmo.sh
bash scripts/run_coo.sh

claude --model claude-sonnet-4-6 \
  --system-prompt-file prompts/ceo_system.md \
  "以下の3つのレポートを読んで、
   今週の経営上の最重要課題を1つだけ特定し、
   来週の行動計画を作成してください。

   - reports/cfo_${DATE}.md
   - reports/cmo_${DATE}.md
   - reports/coo_${DATE}.md" \
  > reports/ceo_${DATE}.md

echo "=== 生成完了: reports/ceo_${DATE}.md ==="

CEOエージェントのプロンプト設計で学んだこと

# CEO Agent

## 出力形式(必ずこの形式で)
1. 今週の最重要課題(1つだけ。2つ以上は禁止)
2. その根拠(CFO/CMO/COOレポートの具体的なデータを引用)
3. 来週のアクション(担当者名・完了期限・完了条件を含める)
4. 見落としリスク(このレポートで見えていない盲点)

## 禁止事項
- 「〜を検討してください」という表現
- データの根拠なしの定性的判断
- 3つ以上のアクション提案
- 採用・資金調達・大型投資の提案(現フェーズ対象外)

半年運用して実際に変わったこと

変わったこと

意思決定の質と速度が変わりました。以前は「なんとなく売上が少ない気がする」で動いていたのが、「先週の受注が前週比で落ちており、原因はnoteからの流入減なので、今週はコンテンツを増やす」という具体的な判断になりました。

週次経営会議の時間が短くなりました。3名で行っていた週1回2時間の会議が、CEOエージェントのサマリーを事前に読んでから始めることで30〜40分になっています。アジェンダ設定の手間がほぼゼロになったのが大きいです。

属人化の解消が進みました。「あの数字どこで見るんだっけ」という会話がほぼなくなり、レポートを見れば現状が分かる状態になっています。

変わらなかったこと・限界

最終判断は人間です。エージェントの提案を鵜呑みにして動くと、コンテキストを読めない判断になることがありました。「データ上はA施策が有効」でも、「取引先との関係上Bの方が長期的にいい」という判断はAIにはできません。

突発事態への対応も人間の仕事です。クライアントからの急な要望変更、チームメンバーの体調不良——これらはデータにならないので、エージェントには見えません。


プロンプトエンジニアリングで学んだ3つの原則

6ヶ月運用してプロンプト設計で大事だと気づいたことをまとめます。

原則1:「禁止事項」を書く

「〜してください」だけでなく「〜はしないでください」を必ず書く。AIは制約がないと「最大限に役立とう」として過剰提案をします。スモールビジネスに「採用を増やしましょう」と言われても困るので、禁止事項で現実的な範囲を絞ります。

原則2:出力フォーマットを固定する

自由形式で出力させると、毎回フォーマットが違って後段の処理が壊れます。特にオーケストレーション(複数エージェントの出力を別エージェントに渡す)では、出力形式の固定が必須です。

## 出力フォーマット(このフォーマット以外での出力を禁止する)

この一行を追加するだけで安定性が上がります。

原則3:「根拠を明示する」を義務付ける

数値を記載する場合は必ずデータソースと参照期間を明記すること。
推測値と実測値を明確に区別すること。

これがないとAIは自信満々に不正確な数字を出してきます。根拠の明示を義務付けることで、ハルシネーションの発見が格段に早くなります。


データ分析スキルが経営OSの土台になる

このシステムを作る過程で痛感したのが、データ分析スキルの重要性です。

GA4のAPIのたたき方、SQLでの集計、Pythonでのデータ前処理——これらはSES現場でやっていたことの延長線上にあります。エンジニアとしてのバックグラウンドが、AI経営OSの構築に直結しました。

フリーランスや独立を考えているエンジニアにとって、データ分析 × AI自動化の組み合わせは2026年現在もっとも付加価値を出しやすい領域です。SES 年収800万を超えるエンジニアの多くが、データエンジニアリングかMLエンジニアリングのスタックを持っています。単価相場でいえば、データ分析基盤の構築・AIパイプライン設計のスキルは高い評価を受けやすい状況が続いています。


まとめ:作るべきものを間違えないために

AI経営OSを作る上でのポイントをテーブルにまとめます。

フェーズ やること 最大の落とし穴
事前準備 データソースの棚卸し・正規化 これをサボると何も動かない
設計 システムプロンプトの制約設計 制約なしだと使えない提案が来る
実装 MCPサーバーとCron設定 手動実行では続かない
運用 週次でプロンプト改善 作って終わりにすると劣化する

一番大事なのは「データ品質」と「プロンプトの制約設計」です。この2つがあれば、ツール自体はシンプルで十分機能します。

3人でも、AIを使えば10人分の情報処理ができます。ただし、AIが情報を処理してくれるだけで、経営判断は引き続き人間がやる必要があります。システムに振り回されず、意思決定の質を上げるための道具として使うことが、AI経営OSの正しい使い方だと思っています。

関連記事


AI駆動塾 — AIを使ったスモビジの作り方を学ぶ

Claude Code、OpenClaw、AI経営OSの実践ノウハウを毎週公開中。
月額¥4,980で過去記事すべて読み放題。

noteメンバーシップに参加する →


💼 フリーランスエンジニアの案件をお探しですか?

SES解体新書 フリーランスDBでは、高単価案件を多数掲載中です。

  • ✅ マージン率公開で透明な取引
  • ✅ AI/クラウド/Web系の厳選案件
  • ✅ 専任コーディネーターが単価交渉をサポート

無料でエンジニア登録する

0
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
0
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?