mcpField
D
dear-claude

dear-claude

ローカル
github.com/sns45AI・エージェント09 週間前に更新

dear-claude について

dear-claudeは、設定したプラットフォームで「Dear Claude」が検出されると、ローカルのClaude Codeを起動するMCPサーバーです。タスクの文脈を読み取り、結果を元のプラットフォームに返し、セッション保持や複数サービス間の連携にも対応します。

主な機能

  1. 01フレーズを契機とするローカル起動
  2. 02タスクやノートの文脈処理
  3. 03結果の元プラットフォームへの投稿
  4. 047日間のセッション保持
  5. 05複数プラットフォーム間の連携

活用シーン

  1. 01Linearのタスクをコード変更に変換
  2. 02GitHubのプルリクエストをレビュー
  3. 03ObsidianのノートからLinearのタスクを作成
  4. 04別ブランチで作業を並行実行

MCP 対応

Claude Codeの起動やタスク調整に使うMCPツールを提供します。WebhookまたはObsidianのファイルシステム監視を介して外部プラットフォームと接続します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"sns45-dear-claude": {
"command": "npx",
"args": [
"-y",
"dear-claude"
],
"env": {
"DEAR_CLAUDE_PORT": "<DEAR_CLAUDE_PORT>",
"DEAR_CLAUDE_HOST": "<DEAR_CLAUDE_HOST>",
"DEAR_CLAUDE_DATA_DIR": "<DEAR_CLAUDE_DATA_DIR>",
"DEAR_CLAUDE_API_TOKEN": "<DEAR_CLAUDE_API_TOKEN>",
"TAILSCALE_HOSTNAME": "<TAILSCALE_HOSTNAME>",
"GITHUB_CLIENT_ID": "<GITHUB_CLIENT_ID>",
"GITHUB_CLIENT_SECRET": "<GITHUB_CLIENT_SECRET>",
"GITHUB_WEBHOOK_SECRET": "<GITHUB_WEBHOOK_SECRET>",
"GITHUB_ACCESS_TOKEN": "<GITHUB_ACCESS_TOKEN>",
"GITHUB_APP_ID": "<GITHUB_APP_ID>",
"GITHUB_APP_PRIVATE_KEY_PATH": "<GITHUB_APP_PRIVATE_KEY_PATH>",
"LINEAR_CLIENT_ID": "<LINEAR_CLIENT_ID>",
"LINEAR_CLIENT_SECRET": "<LINEAR_CLIENT_SECRET>",
"LINEAR_WEBHOOK_SECRET": "<LINEAR_WEBHOOK_SECRET>",
"LINEAR_ACCESS_TOKEN": "<LINEAR_ACCESS_TOKEN>",
"JIRA_DOMAIN": "<JIRA_DOMAIN>",
"JIRA_USER_EMAIL": "<JIRA_USER_EMAIL>",
"JIRA_API_TOKEN": "<JIRA_API_TOKEN>",
"JIRA_WEBHOOK_SECRET": "<JIRA_WEBHOOK_SECRET>",
"GITLAB_ACCESS_TOKEN": "<GITLAB_ACCESS_TOKEN>",
"GITLAB_WEBHOOK_SECRET": "<GITLAB_WEBHOOK_SECRET>",
"NOTION_CLIENT_ID": "<NOTION_CLIENT_ID>",
"NOTION_CLIENT_SECRET": "<NOTION_CLIENT_SECRET>",
"NOTION_ACCESS_TOKEN": "<NOTION_ACCESS_TOKEN>",
"NOTION_WEBHOOK_SECRET": "<NOTION_WEBHOOK_SECRET>",
"OBSIDIAN_VAULT_PATH": "<OBSIDIAN_VAULT_PATH>",
"GIPHY_API_KEY": "<GIPHY_API_KEY>"
}
}
}
}
起動コマンドnpx -y dear-claude
設定が必要な環境変数
DEAR_CLAUDE_PORTHTTP server port for webhooks (default: 3334)
DEAR_CLAUDE_HOSTBind address for the HTTP server (default: 127.0.0.1, loopback only)
DEAR_CLAUDE_DATA_DIROverride the data directory (default: $XDG_DATA_HOME/dear-claude or ~/.local/share/dear-claude)
DEAR_CLAUDE_API_TOKENシークレットToken guarding the /api/* and /mcp control endpoints (auto-generated at <dataDir>/api-token if unset)
TAILSCALE_HOSTNAMEOverride Tailscale hostname for webhook URLs (auto-detected if not set)
GITHUB_CLIENT_IDGitHub OAuth App or GitHub App client ID
GITHUB_CLIENT_SECRETシークレットGitHub OAuth App or GitHub App client secret
GITHUB_WEBHOOK_SECRETシークレットGitHub webhook signature secret
GITHUB_ACCESS_TOKENシークレットGitHub personal access token (alternative to OAuth)
GITHUB_APP_IDGitHub App ID (for installation-based auth)
GITHUB_APP_PRIVATE_KEY_PATHシークレットPath to GitHub App private key PEM file
LINEAR_CLIENT_IDLinear OAuth application client ID
LINEAR_CLIENT_SECRETシークレットLinear OAuth application client secret
LINEAR_WEBHOOK_SECRETシークレットLinear webhook signing secret
LINEAR_ACCESS_TOKENシークレットLinear personal API key (alternative to OAuth)
JIRA_DOMAINJira Cloud domain (e.g. 'mycompany' for mycompany.atlassian.net)
JIRA_USER_EMAILJira account email for API authentication
JIRA_API_TOKENシークレットJira API token from id.atlassian.com
JIRA_WEBHOOK_SECRETシークレットShared secret for Jira webhook URL validation
GITLAB_ACCESS_TOKENシークレットGitLab personal or project access token
GITLAB_WEBHOOK_SECRETシークレットGitLab webhook secret token
NOTION_CLIENT_IDNotion OAuth integration client ID
NOTION_CLIENT_SECRETシークレットNotion OAuth integration client secret
NOTION_ACCESS_TOKENシークレットNotion internal integration token (alternative to OAuth)
NOTION_WEBHOOK_SECRETシークレットNotion webhook verification secret
OBSIDIAN_VAULT_PATHAbsolute path to Obsidian vault directory for file watching
GIPHY_API_KEYシークレットGiphy API key for embedding GIF reactions in responses

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmdear-claude1.2.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

Dear Claude - 「Dear Claude」と言うだけ

Dear Claude

外部プラットフォームからローカルの Claude Code インスタンスを起動する MCP サーバーです。
Linear、GitHub、Jira、GitLab、Notion、Obsidian で「Dear Claude」と言うと、Claude Code インスタンスが起動してタスクを処理します。

メモがアーキテクチャに。タスクがプルリクエストに。


これは何ですか?

Dear Claude は、プロジェクト管理ツールを監視して「Dear Claude」というフレーズを検出する MCP(Model Context Protocol)サーバーです。検出すると、ローカルの Claude Code インスタンスを起動し、次の処理を実行します。

  • イシュー/コメント/メモのコンテキストを読み取ります
  • 依頼されたタスクを実行します(コード作成、レビュー、タスクの作成など)
  • 結果を元のプラットフォームに投稿します
  • セッションを 7 日間保存するため、複数ターンの会話ができます

Anthropic API キーは不要です。 お使いの Claude Code サブスクリプションで動作します。100% ローカルでプライベートです。コードがマシンの外に出ることはありません。

対応プラットフォーム

プラットフォームイシュー/PR で起動コメントで起動コメントを返信絵文字リアクションサブタスクPR/MR レビュー
GitHubはいはいはいはい-はい
Linearはいはいはいはいはい-
Jiraはいはいはい-はい-
GitLabはいはいはいはい-はい
Notionはいはいはい---
Obsidianはい-はい---

プラットフォーム間のオーケストレーション

どのプラットフォームから起動したインスタンスも、設定済みのすべてのプラットフォームの API にアクセスできます。これにより、次のようなワークフローが可能になります。

  1. Obsidian で仕様を書き、「Dear Claude、これらのタスクを Linear に作成して」と指示します
  2. Linear で議論し、「Dear Claude、これを GitHub でコーディングして」と指示します
  3. GitHub でレビューし、「Dear Claude、マージコンフリクトを解消して」と指示します
  4. 並列コーディング → Claude がブランチごとに 1 つずつ、git worktree を使って複数のインスタンスを起動します

クイックスタート

1 行でインストール
claude mcp add dear-claude -- bunx dear-claude start --mcp

これだけです。Claude Code を起動すれば、Dear Claude を使えます。

前提条件
  • Claude Code CLI がインストールされていること(claude コマンドを使用できること)
  • Bun ランタイム(bunx 用)
  • Tailscale で Funnel が有効になっていること(外部プラットフォームからの Webhook 用)
手動セットアップ(別の方法)

手動で設定する場合は、~/.claude.json の mcpServers に追加します。

{
  "mcpServers": {
    "dear-claude": {
      "command": "bunx",
      "args": ["dear-claude", "start", "--mcp"],
      "env": {
        "DEAR_CLAUDE_PORT": "3334",
        "GITHUB_CLIENT_ID": "...",
        "GITHUB_CLIENT_SECRET": "...",
        "GITHUB_WEBHOOK_SECRET": "...",
        "LINEAR_CLIENT_ID": "...",
        "LINEAR_CLIENT_SECRET": "...",
        "LINEAR_WEBHOOK_SECRET": "..."
      }
    }
  }
}

次に Claude Code を起動します。

claude

MCP サーバーが自動的に起動し、Tailscale Funnel を設定して、公開 Webhook URL を表示します。


プラットフォームのセットアップ

Tailscale Funnel

Dear Claude は、Webhook を受信するための安定した公開 HTTPS URL に Tailscale Funnel を使用します。セットアップの大部分は自動で行われます。

  1. Tailscale をインストールします:

    # macOS
    brew install tailscale
    
    # Linux
    curl -fsSL https://tailscale.com/install.sh | sh
    
  2. 認証します:tailscale up

  3. 管理コンソールでFunnel を有効にします:https://login.tailscale.com/admin/acls

    • ACL ポリシーに "funnel" 機能を追加します
  4. サーバーの起動時に Funnel は自動設定されます。公開 URL は次のとおりです。

    https://<your-hostname>.ts.net/dc
    

ヒント:tailscale serve status --json を実行して設定を確認してください。ヘルスチェックにより、Funnel の設定は 10 秒ごとに自動修復されます。


GitHub
オプション A:GitHub App(推奨)
  1. GitHub Settings → Developer settings → GitHub Apps → New GitHub App に移動します
  2. 次のフィールドを設定します。
    • Homepage URL:https://<your-hostname>.ts.net/dc
    • Callback URL:https://<your-hostname>.ts.net/dc/oauth/callback/github
    • Webhook URL:https://<your-hostname>.ts.net/dc/webhook/github
    • Webhook secret:ランダムな文字列を生成します
  3. Permissions で次の項目を設定します。
    • リポジトリ:Issues(読み取りと書き込み)、Pull Requests(読み取りと書き込み)、Contents(読み取りと書き込み)
  4. Subscribe to events で次の項目を選択します。
    • Issue comments、Pull request review comments
  5. 認証情報をコピーし、環境変数を設定します。
    GITHUB_CLIENT_ID=Iv1.abc123...
    GITHUB_CLIENT_SECRET=abc123...
    GITHUB_WEBHOOK_SECRET=your-webhook-secret
    
  6. リポジトリにアプリをインストールします
  7. OAuth を完了します:https://<your-hostname>.ts.net/dc/setup/github にアクセスします
オプション B:Personal Access Token(より簡単、Webhook なし)
  1. GitHub Settings → Developer settings → Personal access tokens → Tokens (classic) に移動します
  2. スコープに repo、write:discussion を指定してトークンを作成します
  3. 次のように設定します:GITHUB_ACCESS_TOKEN=ghp_...

Note:PAT だけでは、Webhook によってトリガーされるインスタンスは起動されません。代わりに spawn_instance MCP ツールまたは /api/spawn エンドポイントを使用します。

環境変数説明
GITHUB_CLIENT_IDGitHub App のクライアント ID
GITHUB_CLIENT_SECRETGitHub App のクライアントシークレット
GITHUB_WEBHOOK_SECRETWebhook 署名の検証用シークレット
GITHUB_ACCESS_TOKENPersonal Access Token(OAuth の代替)

Linear
  1. Linear Settings → API → OAuth Applications → New Application に移動します
  2. コールバック URL を設定します:https://<your-hostname>.ts.net/dc/oauth/callback/linear
  3. Client ID と Client Secret をコピーします
  4. OAuth アプリで Webhooks の切り替えを有効にします
  5. Linear Settings → API → Webhooks → New Webhook に移動します。
    • URL:https://<your-hostname>.ts.net/dc/webhook/linear
    • Signing Secret をコピーします
    • イベントを有効にします:Comments(作成)、Issues(作成、更新)
  6. 環境変数を設定します。
    LINEAR_CLIENT_ID=your-client-id
    LINEAR_CLIENT_SECRET=your-client-secret
    LINEAR_WEBHOOK_SECRET=your-signing-secret
    
  7. OAuth を完了します:https://<your-hostname>.ts.net/dc/setup/linear にアクセスします

OAuth の完了後、認証済みの Linear アカウントからのイシュー/コメントのみが Claude をトリガーします。

代替手段:Linear Settings → Account → API から Personal API Key(LINEAR_ACCESS_TOKEN=lin_api_...)を使用します。

環境変数説明
LINEAR_CLIENT_IDOAuth クライアント ID
LINEAR_CLIENT_SECRETOAuth クライアントシークレット
LINEAR_WEBHOOK_SECRETWebhook 署名用シークレット
LINEAR_ACCESS_TOKENPersonal API key(OAuth の代替)

Jira Cloud
  1. https://id.atlassian.com/manage-profile/security/api-tokens で API token を作成します
  2. 環境変数を設定します。
    JIRA_DOMAIN=mycompany              # Your Jira subdomain (mycompany.atlassian.net)
    [email protected]    # Your Atlassian account email
    JIRA_API_TOKEN=ATATT3x...          # The API token you just created
    JIRA_WEBHOOK_SECRET=optional-secret # Optional shared secret
    
  3. Jira で Webhook を作成します。
    • Jira Admin → System → Webhooks → Create webhook に移動します
    • URL:https://<your-hostname>.ts.net/dc/webhook/jira
      • JIRA_WEBHOOK_SECRET を使用する場合は、?secret=YOUR_SECRET を末尾に追加します
    • イベントを選択します:issue_created、issue_updated、comment_created
  4. Webhook を保存します

Claude は Jira REST API v2 を介して、サブタスクの作成、イシューのステータス遷移、コメントの追加を行えます。

環境変数説明
JIRA_DOMAINJira のサブドメイン(例:mycompany.atlassian.net の場合は mycompany)
JIRA_USER_EMAILAtlassian のメールアドレス
JIRA_API_TOKENAtlassian の API token
JIRA_WEBHOOK_SECRETWebhook 検証用の任意の共有シークレット

GitLab
  1. GitLab → Settings → Access Tokens で個人アクセストークンを作成します。
    • スコープ:api、read_repository、write_repository
  2. 環境変数を設定します。
    GITLAB_ACCESS_TOKEN=glpat-...
    GITLAB_WEBHOOK_SECRET=your-secret
    
  3. プロジェクト(またはグループ)にWebhook を追加します。
    • Settings → Webhooks に移動します。
    • URL:https://<your-hostname>.ts.net/dc/webhook/gitlab
    • シークレットトークン:GITLAB_WEBHOOK_SECRET と同じ値
    • トリガーイベント:Comments、Issues events、Merge request events
  4. 保存します。

セルフホストの GitLab の場合は、GITLAB_URL=https://your-gitlab-instance.com も設定します。

環境変数説明
GITLAB_ACCESS_TOKEN個人アクセストークン
GITLAB_WEBHOOK_SECRETWebhook シークレットトークン
GITLAB_URLGitLab インスタンスの URL(デフォルト:https://gitlab.com)

Notion
オプション A:内部インテグレーション(より簡単)
  1. https://www.notion.so/my-integrations → New integration に移動します。
  2. 名前を付け、ワークスペースを選択します。
  3. Internal Integration Secret をコピーします。
  4. NOTION_ACCESS_TOKEN=ntn_... を設定します。
  5. インテグレーションとページ/データベースを共有します(ページの「...」をクリック → Connections → Add your integration)。
オプション B:OAuth(公開アプリ)
  1. https://www.notion.so/my-integrations で OAuth インテグレーションを作成します。
  2. コールバック URL を設定します:https://<your-hostname>.ts.net/dc/oauth/callback/notion
  3. 環境変数を設定します。
    NOTION_CLIENT_ID=your-client-id
    NOTION_CLIENT_SECRET=your-secret
    
  4. OAuth を完了します:https://<your-hostname>.ts.net/dc/setup/notion にアクセスします。
Webhook の設定

Notion にはまだネイティブの Webhook がありません。Notion から Claude を起動するには、次のいずれかを行います。

  • Webhook アクションを使用する Notion の自動化ルールを使います(利用可能な場合)。
  • または Zapier/Make などのサードパーティサービスを使用して、https://<your-hostname>.ts.net/dc/webhook/notion に POST します。
  • 署名検証を行う場合は、NOTION_WEBHOOK_SECRET を設定します。
環境変数説明
NOTION_ACCESS_TOKEN内部インテグレーショントークン
NOTION_CLIENT_IDOAuth クライアント ID
NOTION_CLIENT_SECRETOAuth クライアントシークレット
NOTION_WEBHOOK_SECRETWebhook 検証用シークレット

Obsidian

Obsidian インテグレーションはファイルシステムの監視を通じて動作するため、Webhook は不要です。Claude は「Dear Claude」を含むファイルを保管庫内で監視し、同じファイルに追記して応答します。

  1. 保管庫への絶対パスを環境変数に設定します。
    OBSIDIAN_VAULT_PATH=/Users/yourname/Documents/MyVault
    
  2. これで完了です。任意の .md ファイルに「Dear Claude, ...」と書いて保存します。

Claude の応答は、同じノートに追記されるコールアウトブロックとして表示されます。フロントマターには claude-status フィールド(processing → done / error)が設定されます。

仕組み:

  • 保管庫内の .md ファイルの変更を監視します。
  • .obsidian/、.trash/、およびドットファイルディレクトリ内のファイルは無視します。
  • キー入力のたびに起動しないよう、2 秒間のデバウンスを適用します。
  • Wiki リンク参照([[other-note]])に対応しています。Claude が参照先を解決して読み込みます。
  • 画像の埋め込みに対応しています。Claude が画像を確認して分析できます。
環境変数説明
OBSIDIAN_VAULT_PATHObsidian 保管庫への絶対パス
OBSIDIAN_WATCH_DEBOUNCE_MSデバウンス遅延(ミリ秒、デフォルト:2000)

使い方

起動形式

次の場所のいずれかに、スペースを含む**「Dear Claude」**(大文字と小文字は区別されません)と記述します。

  • GitHub の issue/PR コメント
  • Linear の issue の説明またはコメント
  • Jira の issue の説明またはコメント
  • GitLab の issue/MR の説明またはコメント
  • Notion ページのコメント
  • Obsidian の .md ファイル
例

GitHub PR コメント:

Dear Claude, please review this code for bugs and security issues.

Claude が GitHub で応答:

Claude インスタンスを開始しました(インスタンス:abc12345) リクエストを処理しています...

タスクが完了しました 2 件の問題が見つかりました:

  1. user.ts:45 に SQL インジェクションがあります
  2. api.ts:102 に入力検証がありません

修正を含む PR #15 を作成しました。

インスタンスのオーケストレーション

Claude インスタンスは、並列作業のためにほかのインスタンスを起動できます。

Dear Claude, code tasks 1-5 in parallel. Each task should be a separate branch.

Claude は次の処理を行います。

  1. タスクを解析します
  2. /api/spawn エンドポイント経由で子インスタンスを5つ起動します
  3. 各子インスタンスは、それぞれ独自の Git ワークツリー(同じリポジトリ、異なるブランチ)で作業します
  4. 各子インスタンスは、作業が完了すると PR を作成します
  5. 親インスタンスは子インスタンスのステータスをポーリングします

すべての環境変数

# Server
DEAR_CLAUDE_PORT=3334
TAILSCALE_HOSTNAME=              # Optional: auto-detected

# GitHub
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
GITHUB_WEBHOOK_SECRET=
GITHUB_ACCESS_TOKEN=

# Linear
LINEAR_CLIENT_ID=
LINEAR_CLIENT_SECRET=
LINEAR_WEBHOOK_SECRET=
LINEAR_ACCESS_TOKEN=

# Jira Cloud
JIRA_DOMAIN=mycompany
[email protected]
JIRA_API_TOKEN=
JIRA_WEBHOOK_SECRET=

# GitLab
GITLAB_ACCESS_TOKEN=
GITLAB_WEBHOOK_SECRET=
GITLAB_URL=                      # Default: https://gitlab.com

# Notion
NOTION_CLIENT_ID=
NOTION_CLIENT_SECRET=
NOTION_WEBHOOK_SECRET=
NOTION_ACCESS_TOKEN=

# Obsidian
OBSIDIAN_VAULT_PATH=
OBSIDIAN_WATCH_DEBOUNCE_MS=2000

# Optional
GIPHY_API_KEY=                   # For fun GIF reactions in responses

CLI コマンド

# Start the server (standalone mode)
bun run src/index.ts start

# Start as MCP server (stdio, for Claude Code)
bun run src/index.ts start --mcp

# Check server and platform status
bun run src/index.ts status

# List instances
bun run src/index.ts instances

# Setup instructions for a platform
bun run src/index.ts setup <platform>

MCP ツール

Claude Code 内で MCP サーバーとして実行すると、次のツールを利用できます。

ツール説明
list_platforms設定済みプラットフォームとそのステータスを一覧表示します
list_instancesすべての Claude インスタンスを一覧表示します(ステータスで絞り込み可能)
get_instance_status特定のインスタンスの詳細なステータスを取得します
get_instance_messagesインスタンスの会話履歴を取得します
kill_instance実行中のインスタンスを終了します
get_running_instances現在実行中のインスタンス ID を一覧表示します
spawn_instanceタスク用に新しい Claude インスタンスを起動します
get_project_instancesプロジェクトグループ内のすべてのインスタンスを一覧表示します

HTTP API

サーバーは localhost:3334 で REST エンドポイントも公開します。

エンドポイントメソッド説明
/healthGETヘルスチェックとプラットフォームのステータス
/webhook/:platformPOSTWebhook 受信エンドポイント
/api/instancesGETインスタンスを一覧表示します(?project_id= フィルター)
/api/instances/:idGETインスタンスの詳細と子インスタンスを取得します
/api/instances/:id/killPOST実行中のインスタンスを終了します
/api/spawnPOSTプログラムから新しいインスタンスを起動します
/api/platformsGET設定済みプラットフォームを一覧表示します
/setup/:platformGETOAuth フローを開始します
/oauth/callback/:platformGETOAuth コールバック
POST /api/spawn
{
  "prompt": "Implement the login page",
  "repo_url": "https://github.com/owner/repo",
  "branch": "feature/login",
  "base_branch": "main",
  "parent_instance_id": "optional-parent-id",
  "project_id": "optional-project-id"
}

アーキテクチャ

                  Webhooks / File Watcher
  ┌────────┐ ┌────────┐ ┌──────┐ ┌────────┐ ┌──────────┐ ┌────────┐
  │ GitHub │ │ Linear │ │ Jira │ │ GitLab │ │ Obsidian │ │ Notion │
  └───┬────┘ └───┬────┘ └──┬───┘ └───┬────┘ └────┬─────┘ └───┬────┘
      │          │         │         │            │            │
      └──────────┴────┬────┴─────────┴────────────┴────────────┘
                      │
                      ▼
           ┌─────────────────────┐
           │  Tailscale Funnel   │
           │ (Public HTTPS URL)  │
           └─────────┬───────────┘
                     │
                     ▼
           ┌─────────────────────┐
           │   dear-claude       │
           │   MCP Server        │
           │                     │
           │ • Trigger detection │
           │ • Instance manager  │
           │ • Platform adapters │
           │ • Spawn API         │
           │ • SQLite DB         │
           └─────────┬───────────┘
                     │
                     ▼
           ┌─────────────────────┐
           │  Claude Code        │
           │  Instances          │
           │ (Agent SDK)         │
           │                     │
           │ • Git worktrees     │
           │ • Cross-platform    │
           │   API access        │
           │ • Child spawning    │
           └─────────────────────┘

インスタンスのライフサイクル

PENDING → RUNNING → IDLE → (follow-up) → RUNNING → IDLE → ... → EXPIRED (7 days)
                  ↘ COMPLETED
                  ↘ FAILED
  • PENDING:トリガーが検出され、インスタンスがキューに追加されました
  • RUNNING:Claude Code が処理を実行中です
  • IDLE:後続の「Dear Claude」メンションを待機しています
  • COMPLETED:タスクが正常に完了しました
  • FAILED:エラーが発生しました
  • EXPIRED:7日間の TTL を超過し、インスタンスがクリーンアップされました

開発

# Install dependencies
bun install

# Run dev mode
bun run dev

# Type check
bunx tsc --noEmit

# Build
bun run build

# Run tests
bun test

トラブルシューティング

Tailscale
  • 「Tailscale not running」:Tailscale アプリ(macOS)を開くか、sudo systemctl start tailscaled && tailscale up(Linux)を実行してください。
  • 「Funnel not enabled」:https://login.tailscale.com/admin/acls にアクセスして、Funnel 機能を追加してください。
  • Funnel が消える:別の tailscale serve/tailscale funnel コマンドによって上書きされた可能性があります。ヘルスチェックが10秒以内に自動修復します。tailscale serve status --json で確認してください。
Webhook
  • トリガーされない:bun run src/index.ts status を実行して、サーバーが起動していることを確認してください。curl https://<your-hostname>.ts.net/dc/health でテストしてください。
  • 「Invalid signature」:プラットフォームの設定と環境変数の両方で、Webhook シークレットが一致していることを確認してください。
  • GitHub:アプリは issue_comment イベントを購読します。新しい PR をトリガーするにはコメントを投稿してください。PR の説明だけではトリガーされません。
OAuth
  • トークンの有効期限切れ:https://<your-hostname>.ts.net/dc/setup/<platform> に再度アクセスして、再認証してください。
  • 401 エラー:保存されている OAuth トークンが取り消されている可能性があります。data/dear-claude.db から古いトークンを削除し、再認証してください。
インスタンス
  • PENDING のまま止まる:Claude Code CLI(claude)がインストールされ、PATH からアクセスできることを確認してください。
  • 作業ディレクトリの問題:インスタンスは data/workspaces/ の下にワークスペースを作成します。書き込み権限があることを確認してください。

機能の証明

このリポジトリには、smithmark.yaml に smithmark の機能マニフェストがあり、tools.json に静的なツール一覧も含まれています。このマニフェストでは、この MCP サーバーの実行時にアクセスする外部対象の全容を、1 か所で宣言しています。

  • ネットワーク送信:通信するすべてのホスト(api.github.com、github.com、api.linear.app、linear.app、gitlab.com、*.atlassian.net、api.notion.com、api.giphy.com、api.anthropic.com)と、その理由。
  • ファイルシステム:読み取りまたは書き込みを行うパス(~/.dear-claude/**、data/**、~/.claude.json、デバッグログ)と、アクセスレベル。
  • 実行:起動するサブプロセス(claude、tailscale、which、open、sudo、pkill)。
  • 環境変数とシークレット:使用する、認証情報に該当するすべての環境変数。種類(アクセストークン、クライアントシークレット、Webhook シークレット、API キー、秘密鍵)をタグ付けしています。

GitHub でリリースするたびに、.github/workflows/smithmark-attest.yml が公開 npm tarball に対する鍵不要の Sigstore アテステーションを生成します。GitHub の OIDC トークンを短期間有効な Fulcio 署名証明書と交換し、その証明書でアテステーションに署名して、署名を公開 Rekor 透明性ログに記録します。署名鍵もシークレットも不要です。生成された smithmark-attestation.sigstore.json は GitHub リリースに添付されます。

公開済みバージョンを検証するには、次のようにします。

smithmark verify [email protected] \
  --certificate-identity "https://github.com/sns45/dear-claude/.github/workflows/smithmark-attest.yml@refs/tags/v1.1.0" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"

(v1.1.0 を実際のリリースタグに置き換えてください)

このマニフェストは、このサーバーの機能範囲を示す正式な記録です。smithmark の lint は、意図的にホストを考慮せず、助言を目的としています。マニフェストの内容にかかわらず、すべての fetch() 呼び出し箇所とすべての exec を「未宣言」として報告するため、上記の送信先がすべて宣言されている場合でも、このコードベース(および実際の MCP サーバーすべて)で検出結果が表示されます。--strict またはホストを考慮する後継機能がリリースされるまでは、lint の出力を差分の検出ではなく、調査の手掛かりとして扱ってください。

ライセンス

MIT

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。