Skip to content

stfl/org-mcp

 
 

Repository files navigation

org-mcp

https://github.com/laurynas-biveinis/org-mcp/actions/workflows/elisp-test.yml/badge.svg https://github.com/laurynas-biveinis/org-mcp/actions/workflows/super-linter.yml/badge.svg https://melpa.org/packages/org-mcp-badge.svg https://stable.melpa.org/packages/org-mcp-badge.svg

Overview

org-mcp is an Emacs package that implements a Model Context Protocol (MCP) server for Org-mode. It enables AI assistants and other MCP clients to interact with your Org files through a structured API.

Installation

From MELPA or MELPA Stable:

M-x package-install RET org-mcp RET

Doom Emacs

To install this fork in Doom Emacs, add to packages.el:

(package! org-mcp :recipe (:host github :repo "stfl/org-mcp"))

Then configure in config.el:

(use-package org-mcp
  :after org
  :custom
  (org-mcp-allowed-files (mapcar (lambda (f) (expand-file-name f org-directory)) org-agenda-files))
  (org-mcp-stored-queries-file (expand-file-name "org-mcp-stored-queries.el" doom-user-dir))
  ;; Optional: maximum minutes gap for continuous clocking (default 30)
  ;; (org-mcp-clock-continuous-threshold 15)
  :config (if mcp-server-lib--running
              (message "org-mcp: MCP server already running, skipping start")
            (mcp-server-lib-start)))

Usage

**WARNING:** some of the tools in this package give LLMs WRITE access to your Org files, and, once in a thousand invocations, LLMs will try to delete everything, because they are like that. Backups and automatic versioning on every change are strongly advised.

Configuring allowed files

Once you read and internalized the warning above, set the allowed Org file set, using absolute paths:

(setq org-mcp-allowed-files '("/path/to/foo.org" "/path/to/bar.org"))

Registering with an MCP Client

After mcp-server-lib has been properly installed (including M-x mcp-server-lib-install), register org-mcp with your MCP client:

claude mcp add -s user -t stdio org-mcp -- ~/.emacs.d/emacs-mcp-stdio.sh --server-id=org-mcp --init-function=org-mcp-enable --stop-function=org-mcp-disable

Before using the MCP server, you must start it in Emacs with M-x mcp-server-lib-start. Stop it with M-x mcp-server-lib-stop when done.

Available MCP Resources

Note: File paths in URIs use minimal encoding (only # characters are encoded). Avoid using % characters in Org file names.

org://{uri}

  • Description: Access Org files or headlines with structured JSON (auto-detects URI type)
  • URI Pattern: org://{uri} where uri can be:
    • Absolute file path (e.g., /home/user/org/projects.org)
    • File path with headline path (e.g., /home/user/org/projects.org#Project%20Alpha)
    • UUID (e.g., 550e8400-e29b-41d4-a716-446655440000)
  • Configuration: Files must be explicitly allowed via org-mcp-allowed-files using absolute paths
  • Returns: Structured JSON with file or headline data including metadata

Example response for a headline:

{
  "title": "Project Alpha",
  "todo": "TODO",
  "priority": "A",
  "tags": ["work", "urgent"],
  "scheduled": "<2026-03-26 Thu>",
  "deadline": "<2026-04-01 Mon>",
  "level": 1,
  "content": "Body text here...",
  "uri": "org://550e8400-e29b-41d4-a716-446655440000",
  "children": [
    {"title": "Subtask", "todo": "NEXT", "level": 2, "uri": "org://..."}
  ]
}

Available MCP Tools

Note: All write tools will create Org IDs for any touched nodes that did not have them originally. The IDs will be returned in the tool response.

org-get-todo-config

  • Description: Get TODO keyword configuration for understanding task states
  • Parameters: None
  • Returns: JSON object with sequences and semantics

Example response:

{
  "sequences": [
    {
      "type": "sequence",
      "keywords": ["TODO", "NEXT", "|", "DONE", "CANCELLED"]
    }
  ],
  "semantics": [
    {"state": "TODO", "isFinal": false, "sequenceType": "sequence"},
    {"state": "NEXT", "isFinal": false, "sequenceType": "sequence"},
    {"state": "DONE", "isFinal": true, "sequenceType": "sequence"},
    {"state": "CANCELLED", "isFinal": true, "sequenceType": "sequence"}
  ]
}

org-get-tag-config

  • Description: Get tag configuration as literal Elisp variable values
  • Parameters: None
  • Returns: JSON object with literal Elisp strings for all tag-related variables

Example return value:

{
  "org-use-tag-inheritance": "t",
  "org-tags-exclude-from-inheritance": "(\"urgent\")",
  "org-tag-alist": "((\"work\" . 119) (\"urgent\" . 117) (:startgroup) (\"@office\" . 111) (\"@home\" . 104) (\"@errand\" . 101) (:endgroup) (:startgrouptag) (\"project\") (:grouptags) (\"proj_a\") (\"proj_b\") (:endgrouptag))",
  "org-tag-persistent-alist": "nil"
}

org-get-priority-config

  • Description: Get priority configuration for understanding the valid priority range
  • Parameters: None
  • Returns: JSON object with highest, lowest, and default priority characters

Example response:

{
  "highest": "A",
  "lowest": "C",
  "default": "B"
}

org-get-allowed-files

  • Description: Get the list of Org files accessible through the org-mcp server
  • Parameters: None
  • Returns: JSON object with files array containing absolute paths of allowed Org files

Use cases:

  • Discovery: “What Org files can I access through MCP?”
  • URI Construction: “I need to build an org:// URI - what’s the exact path?”
  • Access Troubleshooting: “Why is my file access failing?”
  • Configuration Verification: “Did my org-mcp-allowed-files setting work correctly?”

Example response:

{
  "files": [
    "/home/user/org/tasks.org",
    "/home/user/org/projects.org",
    "/home/user/notes/daily.org"
  ]
}

Empty configuration returns:

{
  "files": []
}

org-update-todo-state

  • Description: Update the TODO state of a specific headline
  • Parameters:
    • uri (string, required): URI of the headline (org:// format)
    • currentState (string, optional): Expected current TODO state - when provided, must match actual state or tool will error; omit to skip the state check
    • newState (string, required): New TODO state (must be valid in org-todo-keywords)
    • note (string, optional): Note to attach to this state transition; stored in LOGBOOK as part of the state change entry
  • Returns: Success status with previous and new states, and ID-based URI of the updated headline

Example:

# Request:
{
  "uri": "org:///home/user/org/projects.org#Project%20Alpha",
  "currentState": "TODO",
  "newState": "IN-PROGRESS"
}

# Success response:
{
  "success": true,
  "previousState": "TODO",
  "newState": "IN-PROGRESS",
  "uri": "org://554A22F6-E29F-4759-8AD2-E7CA225C6397"
}

# State mismatch error:
{
  "error": "State mismatch: expected TODO, found IN-PROGRESS"
}

org-rename-headline

  • Description: Rename the title of an existing headline while preserving its TODO state, tags, and properties
  • Parameters:
    • uri (string, required): URI of the headline (org:// format)
    • currentTitle (string, required): Current headline title (without TODO state or tags) - must match actual title
    • newTitle (string, required): New headline title (without TODO state or tags)
  • Returns: Success status with previous and new titles

Example:

# Request:
{
  "uri": "org:///home/user/org/projects.org#Original%20Task",
  "currentTitle": "Original Task",
  "newTitle": "Updated Task Name"
}

# Success response:
{
  "success": true,
  "previousTitle": "Original Task",
  "newTitle": "Updated Task Name",
  "uri": "org://550e8400-e29b-41d4-a716-446655440002"
}

# Title mismatch error:
{
  "error": "Title mismatch: expected 'Original Task', found 'Different Task'"
}

org-add-todo

  • Description: Add a new TODO item to an Org file
  • Parameters:
    • title (string, required): The headline text
    • todoState (string, required): TODO state from org-todo-keywords
    • tags (string or array, optional): Tags to add (e.g., “urgent” or [“work”, “urgent”])
    • body (string, optional): Body text content to add under the heading
    • parentUri (string, required): URI of parent item. Use org:///path/to/file.org# for top-level items in a file
    • afterUri (string, optional): URI of sibling to insert after. If not given, append as last child of parent
  • Returns: Object with success status, new item URI, file name, and title

Example:

# Request:
{
  "title": "Implement new feature",
  "todoState": "TODO",
  "tags": ["work", "urgent"],
  "body": "This feature needs to be completed by end of week.",
  "parentUri": "org:///home/user/org/projects.org#"
}

# Success response:
{
  "success": true,
  "uri": "org://550e8400-e29b-41d4-a716-446655440001",
  "file": "projects.org",
  "title": "Implement new feature"
}

org-edit-body

  • Description: Edit or append to the body content of an Org node. In replace mode (default), finds and replaces a unique substring. In append mode, inserts content after existing body but before child headlines
  • Parameters:
    • resourceUri (string, required): URI of the node to edit (org:// format)
    • oldBody (string, required in replace mode, ignored when append is true): Substring to search for within the node’s body (must be unique). Use empty string “” to add content to an empty node
    • newBody (string, required): Replacement or appended text
    • append (boolean, optional, default false): When true, append newBody to end of body instead of replacing
  • Returns: Success status with org:// URI of the updated node
  • Special behavior (replace mode): When oldBody is an empty string (“”), the tool will only work if the node has no body content, allowing you to add initial content to empty nodes

Example:

# Replace mode:
{
  "resourceUri": "org://abc-123",
  "oldBody": "This is a placeholder.",
  "newBody": "Implementation started - using Strategy pattern."
}

# Success response:
{
  "success": true,
  "uri": "org://abc-123"
}

# Append mode:
{
  "resourceUri": "org://abc-123",
  "newBody": "Additional notes from meeting.",
  "append": true
}

# Adding content to empty node (replace mode):
{
  "resourceUri": "org://new-task",
  "oldBody": "",
  "newBody": "Initial task description."
}

org-set-properties

  • Description: Set or delete properties on an Org headline’s PROPERTIES drawer
  • Parameters:
    • uri (string, required): URI of the headline (org:// format)
    • properties (object, required): JSON object of property name-value pairs. String values set the property; null or empty string deletes it. Special properties (TODO, TAGS, PRIORITY, SCHEDULED, DEADLINE, etc.) are forbidden — use dedicated tools instead
  • Returns: Success status with arrays of properties_set and properties_deleted, plus org:// URI

Example:

# Set and delete properties:
{
  "uri": "org://abc-123",
  "properties": {
    "EFFORT": "2:00",
    "CATEGORY": null
  }
}

# Success response:
{
  "success": true,
  "properties_set": ["EFFORT"],
  "properties_deleted": ["CATEGORY"],
  "uri": "org://abc-123"
}

org-update-scheduled

  • Description: Update the SCHEDULED timestamp on an Org headline
  • Parameters:
    • uri (string, required): URI of the headline (org:// format)
    • scheduled (string, optional): ISO date string (e.g. "2026-03-27" or "2026-03-27 09:00"). Omit or empty string to remove
  • Returns: Success status with previous_scheduled, new_scheduled, and ID-based URI

Example:

# Set scheduled:
{
  "uri": "org://abc-123",
  "scheduled": "2026-03-27"
}

# Remove scheduled:
{
  "uri": "org://abc-123",
  "scheduled": ""
}

org-update-deadline

  • Description: Update the DEADLINE timestamp on an Org headline
  • Parameters:
    • uri (string, required): URI of the headline (org:// format)
    • deadline (string, optional): ISO date string (e.g. "2026-03-27" or "2026-03-27 09:00"). Omit or empty string to remove
  • Returns: Success status with previous_deadline, new_deadline, and ID-based URI

Example:

# Set deadline:
{
  "uri": "org://abc-123",
  "deadline": "2026-04-15"
}

# Remove deadline:
{
  "uri": "org://abc-123",
  "deadline": ""
}

org-set-tags

  • Description: Set tags on an Org headline, replacing any existing tags
  • Parameters:
    • uri (string, required): URI of the headline (org:// format)
    • tags (string or array, optional): Single tag "work" or array ["work", "urgent"]. Omit or empty to clear all tags. Validated against org-tag-alist if configured; respects mutually exclusive tag groups
  • Returns: Success status with previous_tags and new_tags arrays, plus org:// URI

Example:

# Set tags:
{
  "uri": "org://abc-123",
  "tags": ["work", "urgent"]
}

# Clear all tags:
{
  "uri": "org://abc-123"
}

org-set-priority

  • Description: Set or remove priority on an Org headline
  • Parameters:
    • uri (string, required): URI of the headline (org:// format)
    • priority (string, optional): Single character in the configured range (default "A" to "C"). Use org-get-priority-config to check valid range. Omit or empty string to remove priority
  • Returns: Success status with previous_priority, new_priority, and ID-based URI

Example:

# Set priority:
{
  "uri": "org://abc-123",
  "priority": "A"
}

# Remove priority:
{
  "uri": "org://abc-123",
  "priority": ""
}

org-add-logbook-note

  • Description: Add a timestamped note to the LOGBOOK drawer of an Org headline. Creates the LOGBOOK drawer if it doesn’t exist. Note is inserted at the top of the LOGBOOK
  • Parameters:
    • uri (string, required): URI of the headline (org:// format)
    • note (string, required): Note text to add. Cannot be empty or whitespace-only. Multi-line notes are properly indented
  • Returns: Success status with org:// URI

Example:

# Add a note:
{
  "uri": "org://abc-123",
  "note": "Discussed with team - approved approach B."
}

# Success response:
{
  "success": true,
  "uri": "org://abc-123"
}

org-ql-query

  • Description: Search Org files using org-ql query expressions. Supports querying by TODO state, tags, priority, deadlines, properties, and more
  • Parameters:
    • query (string, required): org-ql query sexp as a string
    • files (array of strings, optional): Subset of allowed files to search. Defaults to all org-mcp-allowed-files
  • Returns: JSON object with matches array, total count, and files_searched count

Example:

# Request:
{
  "query": "(and (todo \"TODO\") (priority \"A\"))"
}

# Response:
{
  "matches": [
    {
      "title": "Urgent task",
      "level": 1,
      "file": "/home/user/org/tasks.org",
      "todo": "TODO",
      "priority": "C",
      "parent-priority": "A",
      "uri": "org://550e8400-e29b-41d4-a716-446655440000"
    }
  ],
  "total": 1,
  "files_searched": 3
}

org-ql-list-stored-queries

  • Description: List all stored org-ql queries that have been saved for reuse
  • Parameters: None
  • Returns: JSON object with queries array and total count
  • Configuration: Requires org-mcp-stored-queries-file to be set

Example response:

{
  "queries": [
    {
      "key": "active-todos",
      "query": "(todo \"TODO\")",
      "description": "All active TODO items"
    }
  ],
  "total": 1
}

org-ql-save-stored-query

  • Description: Save a named org-ql query for reuse across sessions. Creates or updates a stored query
  • Parameters:
    • key (string, required): Query identifier (alphanumeric, hyphens, and underscores only)
    • query (string, required): org-ql query sexp as a string
    • description (string, optional): Human-readable description
  • Returns: JSON object with success, action ("created" or "updated"), and key
  • Configuration: Requires org-mcp-stored-queries-file to be set

Example:

# Request:
{
  "key": "urgent-work",
  "query": "(and (todo \"TODO\") (priority \"A\"))",
  "description": "Urgent work tasks"
}

# Response:
{
  "success": true,
  "action": "created",
  "key": "urgent-work"
}

org-ql-delete-stored-query

  • Description: Delete a stored org-ql query by key
  • Parameters:
    • key (string, required): Query identifier to delete
  • Returns: JSON object with success and key
  • Configuration: Requires org-mcp-stored-queries-file to be set

org-ql-run-stored-query

  • Description: Run a previously saved org-ql query by key
  • Parameters:
    • key (string, required): Query identifier to run
    • files (array of strings, optional): Subset of allowed files to search. Defaults to all org-mcp-allowed-files
  • Returns: Same as org-ql-query
  • Configuration: Requires org-mcp-stored-queries-file to be set

query-inbox

  • Description: Query inbox items using the configured GTD workflow
  • Parameters: None
  • Returns: Same as org-ql-query, sorted by org-mcp-query-sort-fn when configured
  • Configuration: Requires org-mcp-query-inbox-fn to be set; tool is not registered when nil

query-next

  • Description: Query next action items using the configured GTD workflow
  • Parameters:
    • tag (string, optional): Tag string to filter results
  • Returns: Same as org-ql-query, sorted by org-mcp-query-sort-fn when configured
  • Configuration: Requires org-mcp-query-next-fn to be set; tool is not registered when nil

query-backlog

  • Description: Query backlog items (projects and standalone actions) using the configured GTD workflow
  • Parameters:
    • tag (string, optional): Tag string to filter results
  • Returns: Same as org-ql-query, sorted by org-mcp-query-sort-fn when configured
  • Configuration: Requires org-mcp-query-backlog-fn to be set; tool is not registered when nil

Configuring GTD Query Tools

The GTD query tools are opt-in. Set the query functions and an optional sort comparator:

(setq org-mcp-query-inbox-fn   #'my-inbox-query
      org-mcp-query-backlog-fn #'my-backlog-query
      org-mcp-query-next-fn    #'my-next-actions-query
      org-mcp-query-sort-fn    #'my-rank-comparator)

Each query function should return an org-ql sexp. org-mcp-query-backlog-fn and org-mcp-query-next-fn receive an optional tag-filter argument (an org-ql sexp or nil). org-mcp-query-sort-fn is passed to org-ql-select as :sort.

Configuring Extra Query Properties

org-mcp-ql-extra-properties lets you append computed values to every org-ql query result:

(setq org-mcp-ql-extra-properties
      '((parent-priority . my-parent-priority-fn)
        (rank . my-rank-fn)))

Each function is called at point with no arguments during result extraction. Non-nil return values are included in the JSON result under the given key.

Configuring Stored Queries

To enable stored queries, set the file path where queries will be persisted:

(setq org-mcp-stored-queries-file "~/org/org-mcp-stored-queries.el")

The file is auto-generated and should not be edited by hand. When org-mcp-stored-queries-file is nil (the default), stored query tools will return an error.

Workaround Tools Duplicating Resource Templates

Note: The following tools are temporary workarounds that duplicate the resource template functionality as tools. They exist because Claude Code currently doesn’t discover resource templates.

org-read

  • Description: Read Org file or headline with structured JSON output (auto-detects URI format)
  • Parameters:
    • uri (string, required): URI string. Formats:
      • /path/to/file.org - file path (returns file with children)
      • /path/to/file.org#Headline/Subhead - headline path
      • UUID (8-4-4-4-12 format) - ID-based lookup
  • Returns: Structured JSON with file or headline data including metadata
  • Configuration: File must be in org-mcp-allowed-files

Example response for a headline:

{
  "title": "Project Alpha",
  "todo": "TODO",
  "priority": "A",
  "tags": ["work"],
  "level": 1,
  "content": "Body text...",
  "uri": "org://550e8400-e29b-41d4-a716-446655440000",
  "children": [
    {"title": "Subtask", "todo": "NEXT", "level": 2, "uri": "org://..."}
  ]
}

org-read-outline

  • Description: Get hierarchical structure of an Org file as JSON outline
  • Parameters:
    • file (string, required): Absolute path to an Org file
  • Returns: JSON object with hierarchical outline structure
  • Configuration: File must be in org-mcp-allowed-files

org-read-headline

  • Description: Read Org headline or file as plain text (auto-detects URI format)
  • Parameters:
    • uri (string, required): URI string. Formats:
      • /path/to/file.org - returns entire file
      • /path/to/file.org#Headline/Subhead - headline path
      • UUID - ID-based lookup
  • Returns: Plain text content of the file or headline subtree
  • Configuration: File must be in org-mcp-allowed-files
  • Note: Use this when you need plain text instead of structured JSON

Clock Tracking Tools

org-get-clock-config

  • Description: Get clock-related configuration from the current Emacs Org-mode settings
  • Parameters: None
  • Returns: JSON object with clock settings

Example response:

{
  "org_clock_into_drawer": "\"LOGBOOK\"",
  "org_clock_rounding_minutes": 5,
  "org_clock_continuously": false,
  "org_mcp_clock_continuous_threshold": 30
}

Use this tool to understand clock settings before clocking in or out.

org-clock-get-active

  • Description: Get the currently active clock, if any. Searches all allowed files for an unclosed CLOCK entry. Also detects native Emacs clocks running in non-allowed files
  • Parameters: None
  • Returns: JSON object describing the active clock

Example responses:

# No active clock:
{"active": false}

# Active clock in an allowed file:
{
  "active": true,
  "file": "/home/user/org/tasks.org",
  "heading": "Implement feature X",
  "start": "[2026-03-23 Mon 14:30]"
}

# Active clock in a non-allowed file:
{
  "active": true,
  "in_allowed_file": false
}

org-clock-in

  • Description: Clock in to the specified heading. If another clock is active, it is automatically closed first. Supports continuous clocking and time rounding
  • Parameters:
    • uri (string, required): URI of the headline (org:// format)
    • start_time (string, optional): ISO 8601 start time (e.g. 2026-03-23T14:30:00). Defaults to current time (or previous clock end if continuous clocking applies)
    • resolve (string, optional): When "true", delete dangling (unclosed) CLOCK entries under the heading before clocking in
  • Returns: JSON object with clock-in details

Example:

# Request:
{
  "uri": "org://550e8400-e29b-41d4-a716-446655440000",
  "start_time": "2026-03-23T14:30:00"
}

# Success response:
{
  "success": true,
  "clocked_in": true,
  "start": "[2026-03-23 Mon 14:30]",
  "heading": "Implement feature X",
  "uri": "org://550e8400-e29b-41d4-a716-446655440000"
}

# With dangling clocks resolved:
{
  "success": true,
  "clocked_in": true,
  "start": "[2026-03-23 Mon 14:30]",
  "heading": "Implement feature X",
  "uri": "org://550e8400-e29b-41d4-a716-446655440000",
  "resolved": 1
}

org-clock-out

  • Description: Clock out the currently active clock. Supports optional URI validation and custom end time
  • Parameters:
    • uri (string, optional): URI to validate against the active clock. If provided, its file must match the active clock’s file
    • end_time (string, optional): ISO 8601 end time (e.g. 2026-03-23T16:45:00). Defaults to current time
  • Returns: JSON object with clock-out details

Example:

# Success response:
{
  "success": true,
  "clocked_out": true,
  "heading": "Implement feature X",
  "start": "[2026-03-23 Mon 14:30]",
  "end": "[2026-03-23 Mon 16:45]",
  "duration": "2:15",
  "uri": "org://550e8400-e29b-41d4-a716-446655440000"
}

org-clock-add

  • Description: Add a completed clock entry to a heading. Creates a LOGBOOK drawer if one doesn’t exist. New entries are inserted at the top of the LOGBOOK
  • Parameters:
    • uri (string, required): URI of the headline (org:// format)
    • start (string, required): ISO 8601 start time (e.g. 2026-03-23T14:30:00)
    • end (string, required): ISO 8601 end time (e.g. 2026-03-23T16:45:00). Must be after start
  • Returns: JSON object with the added clock entry details

Example:

# Request:
{
  "uri": "org://550e8400-e29b-41d4-a716-446655440000",
  "start": "2026-03-23T14:30:00",
  "end": "2026-03-23T16:45:00"
}

# Success response:
{
  "success": true,
  "added": true,
  "start": "[2026-03-23 Mon 14:30]",
  "end": "[2026-03-23 Mon 16:45]",
  "duration": "2:15",
  "uri": "org://550e8400-e29b-41d4-a716-446655440000"
}

org-clock-delete

  • Description: Delete a clock entry from a heading. Removes the LOGBOOK drawer if it becomes empty after deletion
  • Parameters:
    • uri (string, required): URI of the headline (org:// format)
    • start (string, required): ISO 8601 start time of the clock entry to delete (e.g. 2026-03-23T14:30:00)
  • Returns: JSON object with the deleted entry details

Example:

# Request:
{
  "uri": "org://550e8400-e29b-41d4-a716-446655440000",
  "start": "2026-03-23T14:30:00"
}

# Success response:
{
  "success": true,
  "deleted": true,
  "start": "[2026-03-23 Mon 14:30]",
  "end": "[2026-03-23 Mon 16:45]",
  "duration": "2:15",
  "uri": "org://550e8400-e29b-41d4-a716-446655440000"
}

org-clock-find-dangling

  • Description: Find all open (unclosed) clock entries in allowed Org files
  • Parameters: None
  • Returns: JSON object with array of open clock entries

Example response:

{
  "open_clocks": [
    {
      "file": "/home/user/org/tasks.org",
      "heading": "Implement feature X",
      "start": "[2026-03-23 Mon 14:30]"
    }
  ],
  "total": 1
}

Configuring Clock Tracking

org-mcp-clock-continuous-threshold

When org-clock-continuously is non-nil, a new clock-in within this many minutes of the last clock-out will start at the previous clock’s end time rather than the current time. Defaults to 30 minutes.

(setq org-mcp-clock-continuous-threshold 15)

License

This project is licensed under the GNU General Public License v3.0 (GPLv3) - see the LICENSE file for details.

About

Emacs Org-mode integration with Model Context Protocol (MCP) for AI-assisted task management

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Emacs Lisp 97.9%
  • Shell 1.6%
  • Other 0.5%