npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@agiletortoise/drafts-mcp-server

v1.0.5

Published

Model Context Protocol server for Drafts app on macOS via AppleScript.

Readme

Drafts MCP Server

A Model Context Protocol (MCP) server that enables AI assistants to interact with the Drafts app on macOS through AppleScript.

For additional discussion of uses, see the Drafts forum

Features

  • 📝 Draft Management: Create, read, update, and search drafts
  • 🏷️ Tags: Add and manage tags on drafts
  • 📂 Workspaces: List and query drafts from specific workspaces
  • Actions: Run Drafts actions programmatically
  • 🔍 Search: Full-text search across all drafts
  • 🚩 Flags & Archive: Flag, archive, or trash drafts

Requirements

  • macOS (AppleScript is macOS-only)
  • Drafts app v50.0.3 or greater installed
  • Node.js 18 or higher

Installation

Quick Start (After Publishing to npm)

You will need to have Node installed on your Mac so make the npx command available. If you do not already have Node installed, you can do so with Homebrew using:

brew install node

Once published, use with npx - no installation needed:

npx @agiletortoise/drafts-mcp-server

Global Installation

npm install -g @agiletortoise/drafts-mcp-server

Local Development/Testing

Before publishing, test locally:

# Clone or extract the package
cd drafts-mcp-server

# Install dependencies
npm install

# Build
npm run build

# Test with MCP Inspector
npm run inspector

# Or run directly
node dist/index.js

Configuration for Claude Desktop

The easiest way to use this MCP with the Claude Desktop app by installing the MCPB version. To do so:

  • Download the drafts-mcp-server.mcpb from the project to your Mac.
  • Open Claude Desktop
  • Navigate to Settings > Extensions
  • Drag and drop the drafts-mcp-server.mcpb file from the Finder into this window to install.
  • Follow the prompts to complete installation.

We are likely to submit this project to the Claude extension directory soon to make it available directly in the app.

Advanced Claude Desktop Configuration

If you prefer to install locally, or run via npm, these instructions are for you...

You will need to have Node installed on your Mac so make the npx command available. If you do not already have Node installed, you can do so with Homebrew using:

brew install node

Add the below to the Claude Desktop confguration file (~/Library/Application Support/Claude/claude_desktop_config.json), and relaunch Claude.

{
  "mcpServers": {
    "drafts": {
      "command": "npx",
      "args": ["@agiletortoise/drafts-mcp-server"]
    }
  }
}

For local development/testing (before publishing), use:

{
  "mcpServers": {
    "drafts": {
      "command": "node",
      "args": ["/absolute/path/to/drafts-mcp-server/dist/index.js"]
    }
  }
}

Or if globally installed:

{
  "mcpServers": {
    "drafts": {
      "command": "drafts-mcp-server"
    }
  }
}

Configuration for Cursor

After publishing to npm, add to your Cursor MCP settings (.cursor/mcp.json in your project or global settings):

{
  "mcpServers": {
    "drafts": {
      "command": "npx",
      "args": ["@agiletortoise/drafts-mcp-server"]
    }
  }
}

For local development/testing, use:

{
  "mcpServers": {
    "drafts": {
      "command": "node",
      "args": ["/absolute/path/to/drafts-mcp-server/dist/index.js"]
    }
  }
}

Configuration for Claude Code

Claude Code (the CLI tool) can be configured using the /mcp command or by editing the settings file directly.

Using the CLI:

claude mcp add drafts -- npx @agiletortoise/drafts-mcp-server

For local development/testing, use:

claude mcp add drafts -- node /absolute/path/to/drafts-mcp-server/dist/index.js

After adding, restart Claude Code or start a new session for the MCP server to be available.

Permissions

The first time the server runs, macOS will ask for permissions:

  1. System Preferences > Security & Privacy > Privacy > Automation
  2. Allow the MCP host (e.g., Claude Desktop, Claude Code, Cursor) to control Drafts

Available Tools

Workspace Management

drafts_list_workspaces

List all workspaces in Drafts.

// No parameters required

Draft Operations

drafts_get_drafts

Get drafts with flexible filtering by content, folder, tag, flagged status, and dates.

{
  query?: string;                // Optional: Query string to filter drafts
  folder?: inbox, archive, trash // Optional: Limit to one folder
  tag: string                    // Optional: Limit by assigned tag
}

drafts_create_draft

Create a new draft with content and optional tags.

{
  content: string;        // Required: Draft content
  tags?: string[];        // Optional: Array of tag names
  flagged?: boolean;      // Optional: Flag the draft
}

drafts_get_draft

Retrieve a specific draft by UUID.

{
  uuid: string;           // Required: UUID of the draft
}

drafts_update_draft

Update the content of an existing draft.

{
  uuid: string;           // Required: UUID of the draft
  content: string;        // Required: New content
}

drafts_search

Search for drafts across all workspaces.

{
  query: string;          // Required: Search query
}

Tags

drafts_add_tags

Add tags to an existing draft.

{
  uuid: string;           // Required: UUID of the draft
  tags: string[];         // Required: Array of tag names to add
}

Actions

drafts_list_actions

List all available Drafts actions.

// No parameters required

drafts_run_action

Run a Drafts action on a specific draft.

{
  draftUuid: string;      // Required: UUID of the draft
  actionName: string;     // Required: Name of the action to run
}

Draft Status

drafts_flag

Flag or unflag a draft.

{
  uuid: string;           // Required: UUID of the draft
  flagged: boolean;       // Required: true to flag, false to unflag
}

drafts_archive

Archive a draft.

{
  uuid: string;           // Required: UUID of the draft to archive
}

drafts_trash

Move a draft to trash.

{
  uuid: string;           // Required: UUID of the draft to trash
}

Example Usage

Here are some example prompts you can use with Claude or other AI assistants:

Basic Operations

"Show me all my workspaces in Drafts"

"Get all drafts from my 'Work' workspace"

"Create a new draft with the content 'Meeting notes for Q1 planning'"

"Search for drafts containing 'budget'"

Advanced Operations

"Create a draft with content 'Todo: Review PR #123' and tag it with 'work' and 'urgent'"

"Find the draft about the marketing campaign and run the 'Send to Email' action on it"

"Flag all drafts in my Inbox workspace that contain 'follow up'"

"Archive all drafts tagged 'completed'"

Workflow Integration

"Get all drafts from my 'Daily Notes' workspace from the last week, 
 then create a summary draft tagged 'weekly-review'"

"Search for all drafts tagged 'meeting-notes', extract action items, 
 and create a new draft with all the action items combined"

Development

Setup

# Clone the repository
git clone https://github.com/agiletortoise/drafts-mcp-server.git
cd drafts-mcp-server

# Install dependencies
npm install

# Build
npm run build

# Test with MCP Inspector
npm run inspector

Project Structure

drafts-mcp-server/
├── src/
│   ├── index.ts           # Main MCP server implementation
│   ├── drafts.ts          # Drafts-specific operations
│   └── applescript.ts     # AppleScript execution utilities
├── dist/                  # Compiled JavaScript (generated)
├── package.json
├── tsconfig.json
└── README.md

Testing

Use the MCP Inspector to test the server:

npm run inspector

This opens a web interface where you can test each tool interactively.

Troubleshooting

"Drafts got an error: Can't get workspace..."

Make sure you've spelled the workspace name exactly as it appears in Drafts. Workspace names are case-sensitive.

Permission Errors

  1. Check System Preferences > Security & Privacy > Privacy > Automation
  2. Ensure your MCP client (Claude Desktop, Cursor, etc.) has permission to control Drafts
  3. You may need to restart the client after granting permissions

Script Execution Errors

  1. Ensure Drafts is installed and has been launched at least once
  2. Try running a simple AppleScript manually to verify permissions:
    osascript -e 'tell application "Drafts" to get name of first workspace'

No Workspaces/Drafts Returned

This might indicate that AppleScript dictionary access isn't working. Check that:

  • You're using the latest version of Drafts
  • Your AppleScript dictionary is properly exposed in Drafts

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

MIT License - see the LICENSE file for details.

Related Projects

Support