Your AI assistant, acting like a friend who actually remembers what you said you'd do.
nudge is an open-source Model Context Protocol (MCP) server that connects Claude β or any MCP-compatible AI β to your todo app. Instead of a cold productivity dashboard, you get a friend checking in naturally.
"hey, you've had 'call the accountant' on your list for 4 days π"
"nothing due today, you're all clear"
"added 'dentist appointment' for Friday"
No server to run. No first-person AI narration. Just a nudge.
npx nudge-mcp-initWalks you through picking your todo app, entering credentials, and wiring up Claude Desktop automatically. Done in under a minute.
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"nudge": {
"command": "npx",
"args": ["nudge-mcp"]
}
}
}Restart Claude Desktop. That's it β Claude now has access to your tasks and will bring them up naturally.
Claude Desktop launches nudge as a subprocess. Nothing runs in the background when you're not using Claude.
npm install -g nudge-mcp
nudge-mcpnpx nudge-mcp| App | Config type | Notes |
|---|---|---|
| Local JSON file | local |
Default β zero config needed |
| Markdown checklist | local |
Any - [ ] task format |
| Todoist | todoist |
Full read + write via REST API |
| Notion | notion |
Read + write via database |
| Linear | linear |
Issues assigned to you, full read + write |
| GitHub Issues | github |
Issues assigned to you, full read + write |
| Apple Reminders | reminders |
macOS only β no API key, reads directly |
| Anything else | local |
Sync/export to a JSON or .md file |
Want to add an adapter? See CONTRIBUTING.md.
Create ~/.nudge/config.json β or skip it entirely to use the zero-config local default.
Tasks live at ~/.nudge/todos.json:
[
{ "id": "1", "title": "Call the accountant", "done": false, "due": "2026-03-03", "priority": "high" },
{ "id": "2", "title": "Buy birthday gift", "done": true },
{ "id": "3", "title": "Dentist appointment", "done": false, "tags": ["health"] }
]{
"adapter": { "type": "local", "filePath": "~/Documents/tasks.md", "format": "markdown" }
}- [ ] Call the accountant
- [x] Buy birthday gift
- [ ] Dentist appointment{
"adapter": { "type": "todoist", "apiKey": "your_token_here" }
}Or set the env var: TODOIST_API_KEY=your_token npx nudge-mcp
Get your token: Todoist β Settings β Integrations β Developer
{
"adapter": {
"type": "notion",
"apiKey": "secret_xxx",
"databaseId": "your_database_id"
}
}Your database needs: Name (title), Done (checkbox), and optionally Due (date), Priority (select: Low / Medium / High), Tags (multi-select).
Setup: create an internal integration at notion.so/my-integrations, then share your database with it.
{
"adapter": {
"type": "reminders",
"list": "To Do"
}
}No API key needed β reads directly from the Reminders app via AppleScript. macOS only.
list is optional. If omitted, nudge reads all lists. If you have a lot of reminders or multiple iCloud accounts, specifying a list is faster and more reliable.
Troubleshooting:
- First run β macOS will prompt for Automation permission. Click Allow when asked, or go to System Settings β Privacy & Security β Automation and enable Reminders for your terminal.
- iCloud sync issues β if you get a "Can't get" error, open Reminders.app and wait for it to fully sync before trying again.
- Timeouts with large lists β add
"list": "To Do"(or whichever list you use most) to your config to limit the scope. - List name must match exactly β including capitalisation. Run
osascript -e 'tell application "Reminders" to get name of every list'in Terminal to see your exact list names.
nudge exposes these tools to any connected AI:
| Tool | What it does |
|---|---|
check_tasks |
"Did I ever call the dentist?" β fuzzy matched |
get_pending_today |
What's still open and due today |
list_todos |
Full list, with filters (overdue, tag, priority, done) |
get_stats |
Honest summary β done, pending, overdue |
search_todos |
Find tasks by keyword |
create_todo |
"Remind me to call Dave on Friday" β adds it |
mark_complete |
"Done with the report" β ticks it off |
mark_incomplete |
"Actually I didn't finish that" β reopens it |
nudge also ships a suggested system prompt (as an MCP prompt resource named nudge-persona) that gives the AI the right tone: warm, honest, not preachy. Claude Desktop can pick this up automatically.
Apple Shortcuts β build a shortcut that exports tasks as JSON to ~/.nudge/todos.json on a schedule.
Zapier / Make β add a step that writes task updates to the file whenever something changes in your app.
Obsidian / Logseq β point filePath at your daily note and use format: "markdown".
Any CLI app β add a cron: 0 * * * * myapp export --format json > ~/.nudge/todos.json
Each adapter is a single file in src/adapters/. Implement two required methods and you're done:
import { Todo, NewTodo, TodoAdapter } from "../types.js";
export class MyAppAdapter implements TodoAdapter {
name = "myapp";
async listTodos(): Promise<Todo[]> {
// fetch from your app's API
return [];
}
async getTodo(id: string): Promise<Todo | null> {
return null;
}
// Optional β enables create_todo tool
async createTodo(input: NewTodo): Promise<Todo> { ... }
// Optional β enables mark complete/incomplete
async markComplete(id: string): Promise<void> { ... }
async markIncomplete(id: string): Promise<void> { ... }
}Then register it in src/index.ts in buildAdapter(). See CONTRIBUTING.md for the full guide.
-
nudge initβ interactive setup wizard - Apple Reminders adapter (macOS, via AppleScript)
- Linear adapter
- GitHub Issues adapter
-
mark_complete/mark_incompletetools - Asana / Microsoft To Do adapter
- Webhook listener for real-time push (tasks trigger the AI)
- Scheduled nudge mode (daily check-in without opening Claude)
PRs and issues are welcome β especially new adapters. See CONTRIBUTING.md.
MIT Β© Dave Leal