タグ: スケジュールタスク

  • スケジュールタスク ー 「毎朝7時に同じ作業」、ようやく卒業した

    スケジュールタスク ー 「毎朝7時に同じ作業」、ようやく卒業した


    「あれ、私、これ毎朝やってない?」

    ある朝、私はメールを開いて、ニュース記事を3つ読んで、Slackをざっと眺めて、要約をメモ帳に書き写していた。手が止まったのは7日目だった。「これ、Claudeに頼んだら一発じゃない?」と気づいた。さらに次の瞬間、もっと怖いことに気づいた。「いや、そもそもClaudeに頼むのも、毎朝私が起こしてる」。これがスケジュールタスクとの出会いだった。

    「毎朝7時に〇〇しておいて」と一度だけ伝えれば、あとはClaudeが勝手に動いてくれる。私は使ってはいた。ただ、使い方が「適当」だった。今日はその「適当」の中身と、ちゃんと使ったらどう変わったかを書く。


    結論マップ(ビフォー/アフター)

    観点Before(適当に使ってた頃)After(ちゃんと使った今)
    起動方法Claudeを開いて、毎回「いつものお願い」と打つ朝7時に勝手に動いてGmailに結果が届く
    設定の中身「毎日」とだけ言って、時刻をClaudeに任せていたcron式(0 7 * * *)で時刻を明示
    失敗時の挙動失敗していたかすら気づかない通知が来ないことで「何かおかしい」と気づける

    スケジュールタスクって、結局なに?

    スケジュールタスク(scheduled tasks)は、Claude Coworkに「この作業を、このタイミングで、自動で実行して」と登録できる機能。Cowork(Claudeのデスクトップアプリ内にある作業モード。ファイル操作や外部連携ができる)で動く定期実行の仕組み、と思っておけばいい。

    公式ヘルプセンターによれば、登録時に「hourly/daily/weekly/weekdays/manually」のいずれかを選べる。”manually” は「自動では動かさず、ボタンを押したときだけ動く」モード。「毎日同じ作業」だけじゃなくて「ワンクリックで呼び出せるショートカット」としても使える。私はここを最初知らなくて、半月くらい損していた。


    最小ステップで作ってみる

    公式の手順は驚くほど短い。

    1. 左サイドバーの「Scheduled」を開く(Coworkモード)
    2. 右上の「+ New task」をクリック
    3. プロンプト欄に「やってほしい内容」を書く
    4. 頻度(hourly / daily / weekly / weekdays / manually)を選ぶ
    5. 「Save」を押す

    たぶんこれで7割の人は満足する。私もそうだった。「daily」を選んで、文章だけ書いて、「Save」。それで翌朝ちゃんと動いてくれる。動いてくれるんだけど、時刻はClaudeにお任せになっている。これが今回の話の発端。

    「7時に動いてほしいのに、9時に動く」みたいなことが起きる。/schedule というスキルを使うか、登録モーダル内でcron式を直接入れると、時刻まで自分で握れるようになる。


    動くプロンプト例:朝のニュース要約タスク

    「平日の朝7時に、今日チェックすべきニュースを3本にまとめてGmailに送る」を作るときの中身。

    頻度: weekdays(または cron 式: 0 7 * * 1-5)
    プロンプト:
    今日の日付は {{date}} です。以下を順番に実行してください。
    1. WebSearch で「Claude OR Anthropic ニュース」と検索し、
    過去24時間以内に公開された記事を最大10件取得
    2. その中から「私の仕事に関係しそう」「初心者向けの新機能」の
    2軸で重要な3本を選び、それぞれ100字以内で要約
    3. Gmail MCP で create_draft を使い、
    件名「【朝のClaudeニュース3本】{{date}}」で下書き保存
    成功・失敗どちらの場合も、最後に1行で結果サマリーを出力すること。

    💡 自動実行されるタスクは、途中で「これでいいですか?」と聞き返せない。だから「成功時はこう、失敗時はこう書いて終わる」まで指定しておく。これは公式ドキュメントでも繰り返し強調されている。


    つまずいたところ

    • PCが寝てたら動かない: スケジュールタスクは「PCが起きていて、Claudeデスクトップアプリが開いている」ときにしか動かない。寝かせていた朝はスキップされる(次に起こしたタイミングでまとめて実行される挙動)。私は最初これを「壊れた」と勘違いした
    • 「毎日」だけだと時刻が選べない: 厳密な時刻が必要なら、登録時に 0 7 * * * のようなcron式(時刻を5項目で表す書き方。例の 0 7 * * * は「毎日7時0分」)を直接入れる。/schedule スキルを呼べば「朝7時に」と日本語で書いても自動でcron式に変換してくれる
    • 失敗したかが見えづらい: 自動実行のログは Cowork 側に残るが、見に行かないと気づかない。タスク本体に「最後にGmailへ通知する」「失敗したらSlackに送る」までセットで書いておくと、「通知が来ない=失敗」と分かるようになる
    • manually モードを見落としがち: 「自動で動かさず、押したときだけ動く」モード。「決まったプロンプトを毎回打ちたくない」ときの専用ボタンとして使える。私はこれを知ってから、長文プロンプトを3つ登録した

    まとめ:「決まった作業」はもう、私の仕事じゃない

    スケジュールタスクのありがたさは、朝起きてからの最初の30分が、自分のためだけの30分になることだと思う。決まった作業はClaudeが先に終わらせてくれる。私はその結果を読むところからスタートできる。

    「適当に使ってた」のと「ちゃんと使った」の差は、cron式を1行書いただけだった。たった1行で、毎朝の30分が返ってきた。これはちょっとズルい。


    関連リンク


  • 「Dispatch」をClaude Codeで実現する方法 ー 「公式機能じゃない」で諦めるの早い

    「Dispatch」をClaude Codeで実現する方法 ー 「公式機能じゃない」で諦めるの早い

    【お詫びと訂正】

    本記事には一部誤りがあった。Claude Code に Dispatch 相当の公式機能が存在しないという前提で書いていたが、実際には Anthropic が 2026年2月25日に「Claude Code Remote Control」を Research Preview として公開していた。執筆時点で見落としていた点をお詫びしたい。各手段の詳細と比較は後続記事「Claude Codeをスマホから操作する4つの方法を調べた」を参照してほしい。

    以下、当時の本文を記録としてそのまま残す。


    先に言っておく

    Claude Code(Anthropic が提供するターミナル向けの AI コーディングツール)のターミナルで /dispatch と打って、見事に何も起きなかった。
    Claude Cowork(デスクトップアプリ版)で話題になった「Dispatch」が、Claude Code でも当然使えるものだと思い込んでいた。実際には、/dispatch という公式スラッシュコマンドは存在しない。
    そっか、ないなら作ればいい。お弁当だって「外で売ってないから家で作る」を毎日やっている。今日はそれの IT 版。


    何の役に立つのか

    そもそも「Dispatch」は2026年3月に Anthropic が Claude Cowork 向けに発表した機能。スマートフォンから Claude にタスクを依頼でき、実行は自分のデスクトップ側で勝手に進む。結果は帰宅してから受け取る、という遠隔バトンタッチが成立する。飛脚も真っ青の分業制。

    ところが Claude Code(CLI 版)にはこの公式機能が存在しない。/dispatch も「dispatch」という名前の MCP(Model Context Protocol、Claude に外部機能を足す仕組み)も、リサーチプレビューを含めて公開されていない。

    💡 私は最初、Cowork の Dispatch と、コミュニティが作った Claude Code 用の dispatch スキルを「同じもの」だと勘違いしていた。実際には方向性も別で、前者は「スマホ→PCの遠隔指示」、後者は「メインの会話を軽くするためにサブエージェントへ仕事を回す」発想。名前が同じだとここまで紛らわしいとは思わなかった。


    それ、誰かが作ってませんでした?

    調べたら、Claude Code 用の dispatch というコミュニティスキルを GitHub で公開している人がいた。

    メインの会話を司令塔役にして、実際のリサーチや実装はサブエージェント(別の Claude が独立した会話の中で作業する仕組み)に丸投げする、という設計。コンテキストウィンドウ(Claude が一度に覚えていられる文章量の上限)を温存できるのが売りらしい。

    「自分で組むのは面倒」という人は、まずこのスキルを読むのが近道。インストール手順は別記事で扱う予定なので、今日は「世にこういうものが出回っている」という事実だけ握って先に進む。


    セットアップの全体像

    公式機能がなくても、Claude Code は部品を全部揃えてくれている。Anthropic 公式の @anthropic-ai/claude-agent-sdk(エージェントを作るための SDK、npm で配布されている公式パッケージ)を含め、組み合わせれば Dispatch っぽい挙動は手元で再現できる。役割は3つに分かれる。

    • サブエージェント ー タスクを切り出して、別コンテキスト(メインとは独立した会話空間)で動かす担当
    • フック(Hooks) ー サブエージェントの開始・終了を検知して、次の処理を自動で連鎖させる仕組み
    • スケジュールタスク ー 「指示は今、実行は後」の時間差を作る仕組み

    これを足すと「私は別のことをしていて、裏で勝手に分担が進んでいる」という Dispatch の本質が、Claude Code 単体で味わえる。料理でいうと、レンジ・オーブン・タイマーをそれぞれ仕掛けて、戻ってきたら全部できあがっているあのリズム。


    コピペして使える例

    ここからは実際にファイルを置いていく話。プロジェクトの直下に .claude/agents/ というフォルダを新しく作り、その中にサブエージェント定義ファイルを置く流れ。

    まず .claude/agents/researcher.md にサブエージェントを定義する(Markdown のフロントマターで書く形式)。

    ---
    name: researcher
    description: 指定したテーマの公式ドキュメントを読んで要点をまとめるエージェント
    tools: WebFetch, Read
    model: sonnet
    ---
    あなたはリサーチ専任のサブエージェントです。
    渡されたテーマについて、公式ドキュメントを優先して3点に要約してください。
    出力は Markdown の箇条書きで。
    

    次に .claude/settings.json にフックを書いて、サブエージェントが終わるたびにログを残す。

    {
      "hooks": {
        "SubagentStop": [
          {
            "matcher": "researcher",
            "hooks": [
              {
                "type": "command",
                "command": "echo \"researcher done at $(date)\" >> ~/dispatch.log"
              }
            ]
          }
        ]
      }
    }
    

    最後に scheduled-tasks(Claude のスケジュール実行機能)で「明日の朝7時に researcher を起動して結果を notes フォルダに保存する」を仕込めば、出かける前に予約 → 帰宅したら成果物がある、という Dispatch のリズムが再現できる。echo 1行でログを残しているだけなのに、ちょっと自動化マスターになった気がする。Hooks のいいところは、この勘違いを安く生産してくれること。

    💡 ポイントはサブエージェントが別コンテキストで動くこと。メインの会話をリサーチログで埋めずに済むので、結果として体感の作業効率が上がる。


    引っかかりやすいポイント

    • dispatch という名前の公式 MCP は存在しない: claude mcp add dispatch のような公式コマンドは通らない。スマホからの遠隔起動は Cowork 側の話で、Claude Code とは別物として整理する。
    • サブエージェントは Cowork の Dispatch と違って「常駐」しない: 起動するたびに新しい文脈で立ち上がるので、長期記憶を持たせたければ auto-memory(会話をまたいで情報を引き継ぐ自動記憶機能)か、ファイルに書き出して読ませる必要がある。記憶を持たないドリー(『ファインディング・ニモ』のあの魚)が毎回挨拶からやり直すあれ、と思っておけば事故が減る。
    • コミュニティスキルは公式サポート対象外: 不具合は GitHub の Issues で議論することになる。Anthropic 公式に問い合わせても答えてもらえないので、自己責任の精神で導入する。

    3行でまとめると

    Claude Code に「Dispatch」という公式機能はない。
    代わりにコミュニティスキルが GitHub にあり、自分で組むなら Agent SDK のサブエージェント+フック+スケジュールタスクで近い挙動が組める。
    次に /dispatch と打つときは、空打ちじゃなくて、ちゃんと自分で仕込んだエージェントが返事してくれる予定だ。


    関連リンク

  • スケジュール×フォルダ移動のトラブル体験記 ー 掃除したつもりが全部止まった日

    スケジュール×フォルダ移動のトラブル体験記 ー 掃除したつもりが全部止まった日

    整理整頓、こわい

    結論から言います。整理しようとして全部止まりました。

    Cowork(※ClaudeのデスクトップAI作業支援ツール)の作業フォルダがいつの間にか2つになっていて、「1つにまとめよう」と軽い気持ちで手を出したら、スケジュールタスクが5件まとめて「タスクファイルが見つからないか、形式が正しくありません」になり、さらにタスクを編集しようとすると「パストラバーサル検知」で全弾かれ。

    部屋を掃除していたら掃除機の電源が消え、洗濯機まで止まり、なぜか玄関の鍵まで閉まる、みたいな連鎖でした。今日はその一部始終を、恥を忍んで書きます。


    発端:なんで「Claude」と「Claude_blog」、2つあるんだ?

    Coworkにはマウント(※選択フォルダ)という概念があって、「space」と呼ばれる作業単位の中に、作業対象フォルダを登録できます。私は「Claude_blog」というspaceを使っていたのですが、ある日spaceの設定を覗いたらフォルダが2つ登録されていました。

    • C:\Users\〇〇\Documents\Claude ←昔のなごり
    • C:\Users\〇〇\Documents\Claude_blog ←今のメイン

    同じような名前のフォルダがspaceに同居している状態で、作業ファイルが微妙にどっちにあるかバラバラ。どっちで編集しても動くけど、どっちにあるか分からない。 これは気持ち悪い。というわけで「Claude」の方を登録解除することにしました。

    ちなみにCoworkのUIからはマウントの個別解除ができない場面があって(私のバージョンではそう見えた)、設定ファイルを直接編集する方法を取りました。


    spaces.json を直接いじる

    Coworkのマウント設定は、以下のJSONファイルに保存されています。

    %APPDATA%\Claude\local-agent-mode-sessions\{セッションUUID}\{エージェントUUID}\spaces.json
    
    
    

    中身はこんな感じ(抜粋)です。

    {
      "spaces": [
        {
          "id": "space-xxxx",
          "name": "Claude_blog",
          "folders": [
            { "path": "C:\\Users\\〇〇\\Documents\\Claude" },
            { "path": "C:\\Users\\〇〇\\Documents\\Claude_blog" }
          ]
        }
      ]
    }
    

    folders 配列から不要な方(Claude)のエントリを削除して保存。Coworkを完全終了して再起動。ここまでは想定通り、マウントが1つに統一されて「よし、すっきりした」と思いました。

    この時点ではまだ平和だったんです。嫌な予感がするときほど、なんにも起きていない。


    副作用その1:スケジュールの「手順」ボタンがいっせいに死ぬ

    Coworkの左サイドバーには「Scheduled(スケジュール)」という項目があって、登録済みの定期タスクが一覧表示されます。タスクごとに「手順」というボタンがあり、押すとタスクの中身(SKILL.md)が見られる仕組みです。

    マウント整理後、なにげに「手順」を押したら。

    タスクファイルが見つからないか、形式が正しくありません。
    
    
    

    5件全部これ。全滅です。

    原因はわりと単純で、scheduled-tasks.json(spaces.jsonと同じフォルダにある)に登録されている各タスクの filePath が、もう存在しない旧パス(Claude\Scheduled\...)を指していました。親フォルダの参照を切ったせいで、スケジューラ側からタスク本体が見えなくなったわけです。

    応急処置

    scheduled-tasks.json を直接開いて、5件の filePath を現行パス(Claude_blog\Scheduled\...)に書き換え。保存するとUIはすぐ復旧しました。

    ここまでで「まあ、こういうこともあるよね」くらいの認識でした。この油断がこの後の首を絞めます。


    副作用その2:update_scheduled_task が全滅

    翌日、タスクの説明文を微調整しようとしたら、全部が以下で弾かれました。

    Failed to update scheduled task: Invalid file path: path traversal detected
    
    
    

    パストラバーサル(※本来アクセスしてはいけない場所にパスで抜けようとする攻撃手法の呼び方)。え、私、攻撃してます?してないです。説明文を直したいだけです。

    不思議なのは、全部が全部ダメなわけではない点でした。

    操作結果
    enabled のトグル(有効/無効切替)✅ 通る
    新規タスクの作成✅ 通る
    一覧取得✅ 通る
    description / prompt の更新❌ パストラバーサル検知で拒否

    「一覧では見えるのに、書き換えようとすると見つからないと言われる」。幽霊タスクみたいな状態で、ちょっと怖かった。


    切り分け:幽霊の正体を探る

    こういうときは、変数を1つずつ固定して違いを見る のが鉄則らしいので(料理の味見と同じ理屈)、4ステップで切り分けました。

    1. enabled トグルだけ叩く → 成功(内部でSKILL.mdの書き込みが起きない操作)
    2. description だけ更新 → 失敗(内部でSKILL.mdの書き込みが起きる)
    3. 新しい場所(Documents\Claude\Scheduled\)にダミータスクを作る → 成功
    4. そのダミーに対して description を更新 → 成功

    結論:スケジューラが「ここに書くはず」と思っている場所(Documents\Claude\Scheduled\)と、実際にタスク本体がある場所(Documents\Claude_blog\Scheduled\)がズレていた。

    一覧取得は両方を横断して見てくれるのでタスクは普通に表示される。ところが更新時にSKILL.mdを書き換えようとすると、「本来の保存先の外にあるファイルパス」として検知され、パストラバーサル扱いで拒否される。幽霊の正体は、引っ越しした本人の住民票が古い住所のままだった、みたいな話です。


    そもそもスケジュールタスクのデフォルト保存先はどこ?

    ここで一度立ち止まって、「正しい保存先」ってそもそもどこなの?を調べました。

    結論を先に言うと、Windowsでのスケジュールタスクの既定の保存先は C:\Users\〇〇\Documents\Claude\Scheduled\{taskId}\SKILL.md です。これは create_scheduled_task(スケジュールタスク作成ツール)の仕様説明にはっきり書いてあります。

    The task will be stored as a skill file ({taskId}/SKILL.md) in C:\Users\〇〇\Documents\Claude\Scheduled/

    和訳すると「タスクは C:\Users\〇〇\Documents\Claude\Scheduled\ 配下に {taskId}/SKILL.md という形のスキルファイルとして保存されます」。ついでにCowork全体で見ると、プロジェクト本体も既定では Documents\Claude\ の下に作られるようになっています(こちらは公式ヘルプで確認)。つまり Documents\Claude は Cowork 全体のホームディレクトリ的な位置づけで、スケジュールタスクもその中に自分の部屋を持っている、と。

    じゃあ、なんで私のタスクは別フォルダ(Claude_blog\Scheduled\)にいたのか?経緯はシンプルで、最初に Documents\Claude\ を自分で作って一通りの作業をそこに集めていたのですが、後からブログ専用に Documents\Claude_blog\ を新規作成し、Claude\ の中身をまるっと Claude_blog\ に引っ越したんです。Scheduled\ フォルダもこのときに一緒に運ばれて、結果としてタスク本体が Claude_blog\Scheduled\ に居座ることになりました。既定の家に戻してあげれば、ツールがちゃんと認識してくれる — というのが今回の話のゴールでした。

    ちなみにここで地味に効いていたのが、そもそも私が手動で Claude というフォルダを先に作っていた という事実です。Claude(スケジューラ)が既定で使おうとしている Documents\Claude\ と、私が自分の意思で命名した Documents\Claude\。相談した覚えはないのに、フォルダ名がきっちり一致している。偶然、お互いに同じ名前を選んでいた——いわゆる両想いです(誰も嬉しくない両想い)。このネーミングの被りのおかげで、引っ越しの後も「両方Claudeの家に見える」状態が続き、どっちが本当の家か曖昧なまま共存できていた、とも言えます。

    • 既定: Documents\Claude\Scheduled\{taskId}\SKILL.md ← スケジューラが信じている住所
    • 迷子: Documents\Claude_blog\Scheduled\{taskId}\SKILL.md ← 昔の住所のまま止まっていた

    対処法(2つ)

    応急措置:直接ファイルを書き換える

    スケジューラは実行時にSKILL.mdをそのまま読むので、ファイルを直接編集すれば内容は反映される。つまり update_scheduled_task が使えなくても、エクスプローラからSKILL.mdを開いて中身を書き換えれば、次回実行時の挙動は変わります。description(先頭のフロントマター)も同じファイル内なのでこれで足ります。

    その日の仕事を止めないための一時しのぎ。病院で言う応急処置で、根治ではない。

    恒久対策:フォルダごと引っ越す

    本質的な解決は、実体を canonical な場所に戻すこと。つまり、

    移動元: C:\Users\〇〇\Documents\Claude_blog\Scheduled\{taskId}\
    移動先: C:\Users\〇〇\Documents\Claude\Scheduled\{taskId}\
    
    
    

    の引っ越しを手でやります。Windowsエクスプローラで、該当タスクのフォルダごと({taskId} ディレクトリ単位で)切り取り→貼り付け。{taskId} というディレクトリ名そのものが識別子なので、enabled や lastRunAt のような状態は引き継がれます。

    なお、これは ユーザー自身の手作業で行う必要があります。理由は単純で、Coworkのサンドボックス側から Documents\Claude\ 配下に新規で書き込む権限がないからです。「自分で動かすしかない」系のトラブルは、珍しい。


    試すなら(架空のタスクで再現する)

    本番タスクでいきなり壊さないよう、ダミーのスケジュールタスクで練習するのがおすすめです。

    /schedule
    
    
    

    とチャットに打つと、スケジュールタスク作成用のスキルが起動します。中身は何でもOK。たとえばこんな感じ。

    名前: folder-move-test
    スケジュール: Manual only(手動実行のみ)
    プロンプト: 「テスト用の無害なタスクです。実行されても何も起きません。」
    
    
    

    作ったタスクのフォルダを別の場所にエクスプローラで動かしてみて、
    一覧に出るか/「手順」ボタンで中身が見えるか/update が通るか、
    この3つを順に確認すると、今回のトラブルを1/10スケールで追体験できます。

    💡 ポイント: 「動くけど書き換えられない」は、一覧用と書き込み用でパスの見え方が違うときに起きがち。UIが便利に見せてくれている裏側を、たまに覗いておくと安心です。


    つまずきポイント

    • 整理整頓を軽く見ていた:フォルダを1つ外すだけ=安全、ではなかった。マウント整理は、参照している別の仕組み(スケジューラ)を巻き込むことを忘れていました。次にやるときは、影響範囲を一度書き出してから手を出します。
    • 一覧に出るから大丈夫、と思い込んだ:タスクが一覧に見えているのと、正しく動くのは別問題でした。「一覧表示 = 正常稼働」ではない。書き込みが絡む操作で初めて壊れるタイプのズレは、普段の使い方では気づけない。
    • エラーメッセージで早合点した:「パストラバーサル検知」という物騒な言葉に引きずられて、最初は「自分のアカウントが怪しい扱いされてる?」と身構えました。実態は、こちらの保存場所と向こうの想定保存場所がズレていただけ。強そうなメッセージほど、落ち着いて切り分けるのが近道です。

    まとめ:片付けは、関係者全員に言ってからやる

    一連のトラブルでわかったのは、Coworkの中で「このフォルダはこの用途」という合意(canonical path)が静かに効いているということでした。spaces.json にあるマウント情報はあくまで表札で、スケジューラはスケジューラで「本当の置き場所」を別に持っている。表札だけ書き換えると、引っ越したつもりのタスクが住民票だけ残された状態になる。

    整理自体はいいことだし、やって良かったと思います。ただ次からは、何を動かすと誰が困るか を先に確認してから手を出します。部屋で言えば、自分の机を片付ける前に「ルンバ、ちょっとこっちは避けてね」と声をかけておく、みたいな話。

    とはいえ、壊してみて初めて見えた仕組みが多かった。「見てから動かせ」が正論だけど、「動かしてから見える」ことも多いな、と今日は思いました(負け惜しみではないです、たぶん)。


    関連リンク