Spawn Claude Code instances from 6 platforms when 'Dear Claude' is mentioned.
io.github.sns45/dear-claude — Model Context Protocol (MCP) Server
This MCP server triggers local Claude Code instances when the phrase “Dear Claude” is mentioned. It is designed to “spawn” Claude Code from six platforms—Linear, GitHub, Jira, GitLab, Notion, and Obsidian—so the incoming mention can be handled by a local instance.
🛠️ Key Features
MCP server behavior: triggers when “Dear Claude” is mentioned
Launches local Claude Code instances
Integrates with 6 platforms: Linear, GitHub, Jira, GitLab, Notion, Obsidian
Advertised tool count: 8
🚀 Use Cases
Start local Claude Code workflows from platform notes or messages
React to “Dear Claude” mentions in issue/project/workflow tools (e.g., Linear, Jira)
⚡ Developer Benefits
Consistent trigger phrase across multiple platforms (“Dear Claude”)
Uses MCP with 8 tools to support instance spawning behavior
⚠️ Limitations
Functionality depends on the mention containing the exact trigger phrase “Dear Claude”
Scope is limited to spawning Claude Code instances from the listed six platforms
Declared in the repository manifest (tools.json). Not verified against a live endpoint.
MCP server that triggers local Claude Code instances from external platforms.
Say "Dear Claude" in Linear, GitHub, Jira, GitLab, Notion, or Obsidian — and a Claude Code instance spins up to handle it.
Your notes become architecture. Your tasks become pull requests.
What is this?
Dear Claude is an MCP (Model Context Protocol) server that watches your project management tools for the phrase "Dear Claude". When detected, it spawns a local Claude Code instance that:
Reads the issue/comment/note context
Executes the requested task (code, review, create tasks, etc.)
Posts results back to the originating platform
Persists sessions for 7 days so you can have multi-turn conversations
No Anthropic API keys needed. Works with your existing Claude Code subscription. 100% local and private — your code never leaves your machine.
Supported Platforms
Platform
Trigger on issue/PR
Trigger on comment
Comment back
Emoji reactions
Sub-tasks
PR/MR review
GitHub
Yes
Yes
Yes
Yes
-
Yes
Linear
Yes
Yes
Yes
Yes
Yes
-
Jira
Yes
Yes
Yes
-
Yes
-
GitLab
Yes
Yes
Yes
Yes
-
Yes
Notion
Yes
Yes
Yes
-
-
-
Obsidian
Yes
-
Yes
-
-
-
Cross-Platform Orchestration
Instances from any platform get API access to all configured platforms. This enables workflows like:
Write a spec in Obsidian → "Dear Claude, create these tasks in Linear"
Discuss on Linear → "Dear Claude, code this on GitHub"
Review on GitHub → "Dear Claude, resolve the merge conflicts"
Parallel coding → Claude spawns multiple instances, one per branch, using git worktrees
Quick Start
Install in one line
bash
claude mcp add dear-claude -- bunx dear-claude start --mcp
That's it. Start Claude Code and Dear Claude is ready.
Prerequisites
Claude Code CLI installed (claude command available)
JIRA_DOMAIN=mycompany # Your Jira subdomain (mycompany.atlassian.net)
JIRA_USER_EMAIL=you@example.com # Your Atlassian account email
JIRA_API_TOKEN=ATATT3x... # The API token you just created
JIRA_WEBHOOK_SECRET=optional-secret # Optional shared secret
Create a webhook in Jira:
Go to Jira Admin → System → Webhooks → Create webhook
Notion doesn't have native webhooks yet. To trigger Claude from Notion:
Use Notion's automation rules with a webhook action (if available)
Or use a third-party service like Zapier/Make to POST to https://<your-hostname>.ts.net/dc/webhook/notion
Set NOTION_WEBHOOK_SECRET if you want signature verification
Environment Variable
Description
NOTION_ACCESS_TOKEN
Internal integration token
NOTION_CLIENT_ID
OAuth client ID
NOTION_CLIENT_SECRET
OAuth client secret
NOTION_WEBHOOK_SECRET
Webhook verification secret
Obsidian
Obsidian integration works via filesystem watching — no webhooks needed. Claude watches your vault for files containing "Dear Claude" and responds by appending to the same file.
# 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 Tools
When running as an MCP server inside Claude Code, these tools are available:
Tool
Description
list_platforms
List configured platforms and their status
list_instances
List all Claude instances (filter by status)
get_instance_status
Get detailed status of a specific instance
get_instance_messages
Get conversation history for an instance
kill_instance
Terminate a running instance
get_running_instances
List currently running instance IDs
spawn_instance
Spawn a new Claude instance for a task
get_project_instances
List all instances in a project group
HTTP API
The server also exposes REST endpoints on localhost:3334:
Endpoint
Method
Description
/health
GET
Health check + platform status
/webhook/:platform
POST
Webhook receiver
/api/instances
GET
List instances (?project_id= filter)
/api/instances/:id
GET
Get instance details + children
/api/instances/:id/kill
POST
Kill a running instance
/api/spawn
POST
Spawn a new instance programmatically
/api/platforms
GET
List configured platforms
/setup/:platform
GET
Start OAuth flow
/oauth/callback/:platform
GET
OAuth callback
POST /api/spawn
json
{"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"}
Funnel disappears: Another tailscale serve/tailscale funnel command may have overwritten it. The health check auto-repairs within 10 seconds. Verify with tailscale serve status --json.
Webhooks
Not triggering: Check bun run src/index.ts status to verify the server is up. Test with curl https://<your-hostname>.ts.net/dc/health.
"Invalid signature": Verify the webhook secret matches in both the platform config and your env vars.
GitHub: The app subscribes to issue_comment events. To trigger on a new PR, post a comment — PR descriptions alone won't trigger.
OAuth
Token expired: Re-visit https://<your-hostname>.ts.net/dc/setup/<platform> to re-authenticate.
401 errors: The stored OAuth token may have been revoked. Delete the stale token from data/dear-claude.db and re-authenticate.
Instances
Stuck in PENDING: Check that Claude Code CLI (claude) is installed and accessible in your PATH.
Working directory issues: Instances create workspaces under data/workspaces/. Ensure write permissions.
Capability attestation
This repo ships a smithmark capability manifest at smithmark.yaml, alongside a static tool listing at tools.json. The manifest declares, in one place, the full external surface this MCP server touches when it runs:
Network egress: every host it talks to (api.github.com, github.com, api.linear.app, linear.app, gitlab.com, *.atlassian.net, api.notion.com, api.giphy.com, api.anthropic.com) and why.
Filesystem: the paths it reads or writes (~/.dear-claude/**, data/**, ~/.claude.json, the debug log) and the access level.
Exec: subprocesses it spawns (claude, tailscale, which, open, sudo, pkill).
Env vars and secrets: every credential-shaped environment variable it consumes, tagged by kind (access token, client secret, webhook secret, API key, private key).
On every GitHub release, .github/workflows/smithmark-attest.yml produces a keyless Sigstore attestation over the published npm tarball: GitHub's OIDC token is exchanged for a short-lived Fulcio signing certificate, the attestation is signed with it, and the signature is recorded in the public Rekor transparency log. There are no signing keys and no secrets involved. The resulting smithmark-attestation.sigstore.json is attached to the GitHub release.
The manifest is the authoritative record of this server's capability surface. smithmark's lint is deliberately host-unaware and advisory: it flags every fetch() call site and every exec as "undeclared" regardless of what's in the manifest, so it will show findings on this codebase (and on any real MCP server) even though the egress above is fully declared. Treat lint output as a discovery aid, not a drift signal, until --strict or a host-aware successor ships.