Discord Claude Bot 自作で解決?メモツールが続かない人に調べた結果

NotionもObsidianも全滅した私が、DiscordにClaudeを呼んだら1時間で解決した話

メモツール、何度試しても続かないんですよね。

Notion?フォルダ構造を見た瞬間に「???」となって、目的のメモにたどり着けない。Obsidian?リンクを繋ぐのが楽しくて本来の目的を忘れる。NotebookLM?資料を放り込んだまま開かなくなる。

気づいたら手元に残るのはiPhoneの純正メモと、一人で運用してるDiscordサーバーだけでした。

で、ふと思ったんですよね。「Discordにいてくれたら最強じゃない?」 と。

試したら1時間かかりませんでした。

やってわかったこと:

  • Node.js + Claude APIで動くDiscord Botは思ったより難しくない
  • メモツールが合わない理由、構造的に説明がついた
  • ローカル運用なら費用はClaude APIの従量課金だけ
  • ADHDには「整理しなくていい環境」が正義
  • 動いてから育てる設計にすると、自分仕様に近づけていける

なぜメモツールが全滅するのか、やっとわかった

DiscordのBotを作りながら考えてたんですが、Notionが合わない理由って「整理が苦手」じゃないんですよね。

「保存するときの脳の状態」と「探すときの脳の状態」が違いすぎる問題です。

Notionとかは「保存時に分類を決める」設計になってる。でも私の脳は保存した瞬間にコンテキストを手放すので、あとで開くと「なぜここに入れたか」がわからない。他人が作ったフォルダ構造と同じ難易度になります。

一人Discordが勝つ理由はシンプルで、「分類しなくていい」から。時系列で流れてるだけで、探すときはキーワード検索。脳の引き出し方と完全に一致してる。

そこにClaudeがいれば、「吐き出す→返事もらう→検索できる」が全部一か所で完結します。


費用感

構成月額目安
ローカル運用(Claude API従量課金のみ)数百円〜
Claude Proに課金している場合APIは別途従量課金

ホスティング代はゼロです。Macを起動してる間だけBotが生きてる運用なので、外出中はオフでも困らない人向けの構成です。常時起動したい場合はRailwayなどのホスティングサービス(月750円〜)が必要になります。


実際の作り方

DiscordにClaude Botを呼ぶ基本構成

全体の流れはこうです。

① Discord Developer PortalでBotを作る アカウントがあれば5分で終わります。アプリを作成してBotタブからトークンを発行するだけ。

② サーバーに招待する OAuth2のURL GeneratorでBotの権限を設定して、生成されたURLからサーバーに招待します。必要な権限は「チャンネルを表示」「メッセージを送る」「メッセージ履歴を読む」の3つだけです。

③ Node.jsでコードを書く discord.js@anthropic-ai/sdkを入れて、メンションされたらClaude APIに投げて返す、という処理を書きます。コード量は50行以下です。

④ システムプロンプトで自分用にカスタマイズする ここが一番大事。自分の状況・仕事・認知特性を渡しておくと、毎回説明しなくていい状態になります。


コードはこれだけ

import Anthropic from '@anthropic-ai/sdk';
import { Client, GatewayIntentBits, Events } from 'discord.js';
import dotenv from 'dotenv';
dotenv.config();

const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent,
  ]
});

client.once(Events.ClientReady, () => {
  console.log(`起動した`);
});

client.on(Events.MessageCreate, async (message) => {
  if (message.author.bot) return;
  if (!message.mentions.has(client.user)) return;

  const content = message.content.replace(/<@!?\d+>/g, '').trim();
  if (!content) return;

  await message.channel.sendTyping();

  try {
    const res = await anthropic.messages.create({
      model: 'claude-sonnet-4-20250514',
      max_tokens: 1024,
      system: [
        {
          type: 'text',
          text: `ここに自分の情報を書く`,
          cache_control: { type: 'ephemeral' }
        }
      ],
      messages: [{ role: 'user', content }],
    });
    await message.reply(res.content[0].text);
  } catch (e) {
    await message.reply('エラーが出た。');
  }
});

client.login(process.env.DISCORD_TOKEN);

npm install discord.js @anthropic-ai/sdk dotenvしてnode index.jsで起動するだけです。


一番効いたのはシステムプロンプト

Claudeに自分の情報を渡しておくと、毎回「私はエンジニアで子どもが4人いて…」から説明しなくていい状態になります。

仕事の内容・進行中のプロジェクト・認知特性・口調の好み、これを最初に渡しておくだけで「専属アシスタント」感がかなり出ます。

Discordのチャンネルを用途で分けておけば、#育児では育児の話、#開発では技術の壁打ち、という使い分けもできます。一人Discordの運用スタイルとそのまま合わさる形です。


詰まったポイント

「Used disallowed intents」エラー Developer PortalのBotタブ→Privileged Gateway Intents→「Message Content Intent」をオンにしないと出るエラーです。コードは合ってても詰まるので先にやっておく方がいいです。

package.jsonのtype設定 import構文を使うので"type": "module"が必要です。npm init -y直後のデフォルトだと動かないので追加してください。

Discord Claude Botの品質とコストを調整するポイント

動いてから育てる:コスト設計と品質の話

最低限動くBotができたら、次のステップは「Claude.aiと同じクオリティに近づける」と「APIコストを抑える」の両立です。

使い込んでいくと、Claude.ai(ブラウザ版)とAPIで回答品質に差があることに気づきます。理由はシンプルで、Claude.aiは内部でさまざまな設定が最適化されているのに対し、APIはデフォルトがほぼ空の状態だからです。差を埋める方法は主に3つあります。

Prompt Cachingでコストを下げる

システムプロンプトが長いほど、毎回のAPI呼び出しで消費するトークンも増えます。Prompt Cachingを使うと、同じシステムプロンプトのトークンコストを最大90%削減できます。設定方法はシンプルで、システムプロンプトの渡し方を以下のように変えるだけです。

// 変更前
system: 'ここに自分の情報を書く',

// 変更後(Prompt Cachingあり)
system: [
  {
    type: 'text',
    text: 'ここに自分の情報を書く',
    cache_control: { type: 'ephemeral' }
  }
],

システムプロンプトが1024トークン以上あれば自動でキャッシュが効きます。詳しい自分情報を書いている人ほど恩恵が大きいです。

Extended Thinkingで品質を上げる

記事の校正や構成の見直しなど、「じっくり考えてほしい」タスクにはExtended Thinkingが有効です。Claudeが回答前に内部で推論ステップを実行するモードで、Claude.aiが複雑な質問に対して自動で行っている処理をAPIでも再現できます。

const res = await anthropic.messages.create({
  model: 'claude-sonnet-4-20250514',
  max_tokens: 12000,
  thinking: {
    type: 'enabled',
    budget_tokens: 5000  // 思考に使えるトークン上限
  },
  system: [...],
  messages: [...],
});

// thinkingブロックを読み飛ばして本文だけ取得
const replyText = res.content.find(b => b.type === 'text')?.text ?? '';

thinking tokenは出力token扱いで課金されるため、日常会話には不要です。「この記事の構成どう思う?」「この文章、論理が通ってるか確認して」といった重めのタスクだけ有効にするのがコスパの良い使い方です。

TALKモードに会話履歴を持たせる

デフォルトの実装では、メンションのたびに会話がリセットされます。「さっき言ってたやつ」が通じない状態です。チャンネルごとに履歴を保持するように改良すると、文脈を引き継いだ会話ができるようになります。

const conversationHistory = new Map(); // channelId -> messages[]

// MessageCreate内
const channelId = message.channelId;
const history = conversationHistory.get(channelId) ?? [];

// 履歴ごとAPIに渡す
messages: [...history, { role: 'user', content: userContent }],

// 返答後に履歴を更新(直近20件だけ保持)
history.push({ role: 'user', content: userContent });
history.push({ role: 'assistant', content: replyText });
conversationHistory.set(channelId, history.slice(-20));

サーバーを再起動すると履歴はリセットされますが、システムプロンプトに自分の情報が入っていれば前提は毎回引き継がれます。「前の続きから」が必要なときだけ冒頭に一言添えれば済むので、永続化の複雑さと比べてコスパが良い構成です。


メモツールが合わない人への結論

NotionやObsidianが続かないのは意志の問題じゃないです。「保存コスト」と「検索コスト」の設計が自分の認知と合っていないだけです。

整理しなくていい場所に、話しかけたら返事してくれる相手がいる。それだけでかなり違います。

一人Discordをすでに使ってる人は、Botを招待するだけで環境が完成します。APIキーさえあれば1時間以内に動きます。


まとめ

Discordに常駐するClaude Botは詐欺でも誇張でもなく、本当に1時間で作れました。

技術的なハードルより、「自分の認知に合った環境を作る」という発想の方が大事だったなと思います。Notionに自分を合わせようとしてた時間、返してほしい。

最初は最小構成で動かして、使いながら育てる。Prompt CachingとExtended Thinkingは、ちゃんと使い込んでから足せばいいです。

まずはAPIキーとDiscordアカウントだけ用意して、あとはコードをコピーして動かしてみてください。


関連記事

AI副業を現実ラインで考えたい人へ

AI副業の現実的な始め方を整理中

派手な成功談ではなく、実際に使えるAIツール・作業フロー・案件化の考え方を、 実務目線で検証しています。

AI副業カテゴリを見る