automd-mcp 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.js +27 -24
  2. package/package.json +41 -40
  3. package/LICENSE.md +0 -60
package/dist/index.js CHANGED
@@ -40524,7 +40524,7 @@ function errorResponse(err) {
40524
40524
  function registerTools(server2) {
40525
40525
  server2.registerTool("list_items", {
40526
40526
  title: "List Items",
40527
- description: "List all items (boards, checklists, and pages) with their task counts"
40527
+ description: "List all items (boards, checklists, pages, and knowledge bases) with their task counts. Returns array of {id, name, itemType, projectId, taskCount}."
40528
40528
  }, async () => {
40529
40529
  try {
40530
40530
  const items = await api.listFiles();
@@ -40535,8 +40535,8 @@ function registerTools(server2) {
40535
40535
  });
40536
40536
  server2.registerTool("get_item", {
40537
40537
  title: "Get Item",
40538
- description: "Get an item (board, checklist, or page) with its columns and tasks",
40539
- inputSchema: { itemId: external_exports.string().describe("The item ID") }
40538
+ description: "Get an item (board, checklist, page, or knowledge base) with its columns and tasks",
40539
+ inputSchema: { itemId: external_exports.string().describe("The item ID (obtain from list_items)") }
40540
40540
  }, async ({ itemId }) => {
40541
40541
  try {
40542
40542
  const item = await api.getFile(itemId);
@@ -40559,11 +40559,11 @@ function registerTools(server2) {
40559
40559
  });
40560
40560
  server2.registerTool("create_item", {
40561
40561
  title: "Create Item",
40562
- description: "Create a new board, checklist, or page. Boards use # (H1) for columns and ## (H2) for tasks. Checklists use ## (H2) with [ ]/[x] prefixes. Pages are free-form markdown for knowledge, specs, and documentation. All support YAML frontmatter, plain paragraphs (description), blockquotes (>) for acceptance criteria, and GFM checkboxes for subtasks.",
40562
+ description: "Create a new board, checklist, page, or knowledge base. Boards use # (H1) for columns and ## (H2) for tasks. Checklists use ## (H2) with [ ]/[x] prefixes. Pages are free-form markdown. Knowledge bases are structured collections of entries (## H2) without checkboxes or progress \u2014 ideal for decisions, patterns, and reference material. All support YAML frontmatter, descriptions, blockquotes (>) for acceptance criteria, and GFM checkboxes for subtasks.",
40563
40563
  inputSchema: {
40564
40564
  name: external_exports.string().describe("Name for the new item"),
40565
- itemType: external_exports.enum(["board", "checklist", "page"]).optional().describe("Type of item to create: board (kanban columns), checklist (task list with checkboxes), or page (free-form markdown for knowledge and documentation). Defaults to board"),
40566
- markdown: external_exports.string().optional().describe("Initial markdown content. Start with YAML frontmatter (board:, description:). Use # for columns, ## for tasks. Paragraphs = description, blockquotes (>) = acceptance criteria, checkboxes = subtasks"),
40565
+ itemType: external_exports.enum(["board", "checklist", "page", "knowledge"]).optional().describe("Type of item to create: board (kanban columns), checklist (task list with checkboxes), page (free-form markdown), or knowledge (structured entries without checkboxes/progress). Defaults to board"),
40566
+ markdown: external_exports.string().optional().describe("Initial markdown content. Omit for an empty item. For boards: use # for columns, ## for tasks. For checklists: ## with [ ] prefix. For pages/knowledge: free-form markdown. All types support YAML frontmatter (board:, description:, vocabulary:)."),
40567
40567
  projectId: external_exports.string().optional().describe("Project ID to add the item to (optional)")
40568
40568
  }
40569
40569
  }, async ({ name, itemType, markdown, projectId }) => {
@@ -40605,10 +40605,10 @@ function registerTools(server2) {
40605
40605
  });
40606
40606
  server2.registerTool("add_task", {
40607
40607
  title: "Add Task",
40608
- description: "Add a new task (H2 heading) to a column. Content supports inline metadata like @user #label priority:high due:2025-03-20 est:4h",
40608
+ description: "Add a new task (## H2 heading) to a column. Content supports inline metadata: @user #label priority:high|medium|low due:YYYY-MM-DD est:4h knowledge:true. Do not include built-by: manually \u2014 use the agentName parameter.",
40609
40609
  inputSchema: {
40610
40610
  itemId: external_exports.string().describe("The item ID"),
40611
- columnId: external_exports.string().describe("The column/heading ID to add the task to"),
40611
+ columnId: external_exports.string().describe("The column ID (found in get_item response columns[].id)"),
40612
40612
  content: external_exports.string().describe("Task content with optional inline metadata"),
40613
40613
  agentName: external_exports.string().regex(/^[\w-]+$/).optional().describe("Name of the agent making this change (tagged as built-by)")
40614
40614
  }
@@ -40623,10 +40623,10 @@ function registerTools(server2) {
40623
40623
  });
40624
40624
  server2.registerTool("update_task", {
40625
40625
  title: "Update Task",
40626
- description: "Update a task's content",
40626
+ description: "Update a task's title/content text only. For metadata use update_task_metadata, for completion use toggle_task, for position use move_task, for AC use update_acceptance_criteria, for learnings use update_learnings.",
40627
40627
  inputSchema: {
40628
40628
  itemId: external_exports.string().describe("The item ID"),
40629
- taskId: external_exports.string().describe("The task ID"),
40629
+ taskId: external_exports.string().describe("The task ID (found in get_item response columns[].tasks[].id)"),
40630
40630
  content: external_exports.string().optional().describe("New task content"),
40631
40631
  agentName: external_exports.string().regex(/^[\w-]+$/).optional().describe("Name of the agent making this change (tagged as built-by)")
40632
40632
  }
@@ -40647,7 +40647,7 @@ function registerTools(server2) {
40647
40647
  });
40648
40648
  server2.registerTool("toggle_task", {
40649
40649
  title: "Toggle Task",
40650
- description: "Toggle a task between checked and unchecked",
40650
+ description: "Toggle a task between checked [ ] and unchecked [x]. Only applies to tasks with checkbox prefixes. Sets completedAt on check, clears on uncheck.",
40651
40651
  inputSchema: {
40652
40652
  itemId: external_exports.string().describe("The item ID"),
40653
40653
  taskId: external_exports.string().describe("The task ID")
@@ -40667,7 +40667,7 @@ function registerTools(server2) {
40667
40667
  itemId: external_exports.string().describe("The item ID"),
40668
40668
  taskId: external_exports.string().describe("The task ID"),
40669
40669
  targetColumnId: external_exports.string().describe("Target column ID"),
40670
- targetIndex: external_exports.number().describe("Position in the target column (0-based)")
40670
+ targetIndex: external_exports.number().describe("Position in target column (0-based). Use 0 to place at top. To append, use the column task count from get_item.")
40671
40671
  }
40672
40672
  }, async ({ itemId, taskId, targetColumnId, targetIndex }) => {
40673
40673
  try {
@@ -40698,7 +40698,7 @@ function registerTools(server2) {
40698
40698
  });
40699
40699
  server2.registerTool("add_column", {
40700
40700
  title: "Add Column",
40701
- description: "Add a new column (H1 heading) to an item",
40701
+ description: 'Add a new column (# H1 heading) to a board or checklist. Columns group tasks into workflow stages like "To Do", "In Progress", "Done".',
40702
40702
  inputSchema: {
40703
40703
  itemId: external_exports.string().describe("The item ID"),
40704
40704
  title: external_exports.string().describe("Column title")
@@ -40834,7 +40834,9 @@ function registerTools(server2) {
40834
40834
  targetColumnId: external_exports.string().optional().describe("Target column (for move)"),
40835
40835
  targetIndex: external_exports.number().optional().describe("Target index (for move)"),
40836
40836
  displayContent: external_exports.string().optional().describe("Display content (for updateMetadata)"),
40837
- metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().describe("Metadata fields (for updateMetadata)")
40837
+ metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().describe("Metadata fields (for updateMetadata)"),
40838
+ acceptanceCriteria: external_exports.string().nullable().optional().describe("Acceptance criteria text (for updateAcceptanceCriteria). Pass null to remove."),
40839
+ learnings: external_exports.string().nullable().optional().describe("Learnings text (for updateLearnings). Pass null to remove.")
40838
40840
  })).describe("Array of task updates to apply")
40839
40841
  }
40840
40842
  }, async ({ itemId, agentName, updates }) => {
@@ -40913,7 +40915,7 @@ function registerTools(server2) {
40913
40915
  });
40914
40916
  server2.registerTool("search_context", {
40915
40917
  title: "Search Context",
40916
- description: 'Search for institutional knowledge across all items. Searches task descriptions, acceptance criteria, and learnings \u2014 not just titles. Use this to find relevant context before starting work on a task (e.g. "what do we know about auth?" or "what was learned about pricing?").',
40918
+ description: "Search for contextual detail (descriptions, acceptance criteria, learnings) across all items. Returns any task with rich content \u2014 broader than find_knowledge which only returns knowledge:true items. Use this for finding implementation details, past decisions, and context before starting work.",
40917
40919
  inputSchema: {
40918
40920
  query: external_exports.string().optional().describe("Text to search for across descriptions, AC, learnings, and task content"),
40919
40921
  label: external_exports.string().optional().describe("Filter by label (without #). Also matches #tags inside learnings text."),
@@ -40972,7 +40974,7 @@ function registerTools(server2) {
40972
40974
  });
40973
40975
  server2.registerTool("list_projects", {
40974
40976
  title: "List Projects",
40975
- description: "List all projects"
40977
+ description: "List all projects. Returns array of {id, name, color}. Use project id as projectId in create_item or get_project_items."
40976
40978
  }, async () => {
40977
40979
  try {
40978
40980
  const projects = await api.listProjects();
@@ -41095,7 +41097,7 @@ function registerTools(server2) {
41095
41097
  });
41096
41098
  server2.registerTool("find_knowledge", {
41097
41099
  title: "Find Knowledge",
41098
- description: "Search for knowledge items across all items. Returns tasks with knowledge:true OR tasks that have learnings. Use this to find institutional memory, past decisions, and patterns.",
41100
+ description: "Search specifically for curated knowledge items (knowledge:true) and tasks with captured learnings. Use for institutional decisions, patterns, and reference. For broader task history including descriptions, use search_context instead.",
41099
41101
  inputSchema: {
41100
41102
  query: external_exports.string().optional().describe("Text to search for in knowledge items"),
41101
41103
  label: external_exports.string().optional().describe("Filter by label (without #)")
@@ -41153,7 +41155,7 @@ function registerTools(server2) {
41153
41155
  description: "Gather all knowledge about a topic and return a structured summary. This collects and organizes existing knowledge items \u2014 it does NOT generate AI content. Returns a paste-ready context brief.",
41154
41156
  inputSchema: {
41155
41157
  topic: external_exports.string().describe('Topic to synthesize knowledge about (e.g. "authentication", "pricing", "deployment")'),
41156
- labels: external_exports.string().optional().describe('Comma-separated labels to filter by (e.g. "backend,security")')
41158
+ labels: external_exports.string().optional().describe('Comma-separated labels to filter by (e.g. "backend,security"). Unlike label on other tools which takes a single value, this accepts multiple comma-separated.')
41157
41159
  }
41158
41160
  }, async ({ topic, labels }) => {
41159
41161
  try {
@@ -41340,12 +41342,13 @@ function registerSystemPrompts(server2) {
41340
41342
 
41341
41343
  ## Core Concepts
41342
41344
 
41343
- AutoMD has three item types:
41345
+ AutoMD has four item types:
41344
41346
  - **Boards** \u2014 Kanban-style markdown files with columns (H1) and tasks (H2). Each has YAML frontmatter with metadata.
41345
41347
  - **Checklists** \u2014 Task lists using ## (H2) headings with [ ]/[x] checkbox prefixes. Great for simple to-do lists and tracking.
41346
- - **Pages** \u2014 Free-form markdown documents for knowledge, specs, documentation, and reference material.
41348
+ - **Pages** \u2014 Free-form markdown documents for specs, documentation, and reference material.
41349
+ - **Knowledge Bases** \u2014 Structured collections of knowledge entries (## H2) without checkboxes or progress tracking. Ideal for decisions, patterns, and institutional memory.
41347
41350
 
41348
- All three types support YAML frontmatter, descriptions, acceptance criteria, subtasks, and learnings.
41351
+ All four types support YAML frontmatter, descriptions, acceptance criteria, subtasks, and learnings.
41349
41352
 
41350
41353
  **Knowledge items** are tasks with \`knowledge:true\` \u2014 they store decisions, patterns, references, and institutional memory. They use the same task infrastructure but represent knowledge, not work to be done.
41351
41354
 
@@ -41389,7 +41392,7 @@ Description paragraph \u2014 background, context, the "why".
41389
41392
  - Use \`synthesize_topic\` to assemble context briefs about a topic
41390
41393
 
41391
41394
  ## Available Tools
41392
- - Item management: list_items, get_item, create_item (supports board/checklist/page types), delete_item, rename_item
41395
+ - Item management: list_items, get_item, create_item (supports board/checklist/page/knowledge types), delete_item, rename_item
41393
41396
  - Task management: add_task, update_task, toggle_task, move_task, delete_task
41394
41397
  - Metadata: update_task_metadata, update_acceptance_criteria, update_learnings
41395
41398
  - Knowledge: add_knowledge, update_knowledge, find_knowledge, synthesize_topic, import_memories
@@ -41433,7 +41436,7 @@ Please:
41433
41436
  3. Identify any dependencies between subtasks
41434
41437
  4. Suggest which subtasks could be parallelized
41435
41438
 
41436
- Provide the specific add_subtask tool calls to create each subtask.`
41439
+ Subtasks are GFM checkboxes (\`- [ ] text\`) inside the parent task's content. Use update_task to add them to the parent task's body, or use add_task to create standalone tasks.`
41437
41440
  }
41438
41441
  }]
41439
41442
  };
@@ -41741,7 +41744,7 @@ Analyze completed tasks and the board state to provide:
41741
41744
  3. **Action Items** \u2014 Concrete improvements for next iteration
41742
41745
  4. **Learnings to Capture** \u2014 Key decisions and patterns worth preserving as knowledge items
41743
41746
 
41744
- For each learning worth capturing, provide add_knowledge or add_learning tool calls so they're preserved for future reference.`
41747
+ For each learning worth capturing, provide add_knowledge tool calls for new knowledge items, or update_learnings tool calls to attach learnings to existing tasks.`
41745
41748
  }
41746
41749
  }]
41747
41750
  };
package/package.json CHANGED
@@ -1,40 +1,41 @@
1
- {
2
- "name": "automd-mcp",
3
- "version": "0.2.0",
4
- "description": "MCP server for AutoMD — manage boards, checklists, and pages stored as markdown",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "bin": {
8
- "automd-mcp": "./dist/index.js"
9
- },
10
- "files": [
11
- "dist"
12
- ],
13
- "keywords": [
14
- "mcp",
15
- "model-context-protocol",
16
- "kanban",
17
- "markdown",
18
- "automd",
19
- "task-management"
20
- ],
21
- "repository": {
22
- "type": "git",
23
- "url": "https://github.com/luka-zivkovic/automd"
24
- },
25
- "license": "SEE LICENSE IN LICENSE",
26
- "author": "Luka Zivkovic",
27
- "devDependencies": {
28
- "@modelcontextprotocol/sdk": "^1.26.0",
29
- "@types/mdast": "^4.0.4",
30
- "tsup": "^8.0.0",
31
- "tsx": "^4.19.0",
32
- "typescript": "^5.7.2",
33
- "zod": "^4.3.6"
34
- },
35
- "scripts": {
36
- "dev": "tsx watch src/index.ts",
37
- "start": "node dist/index.js",
38
- "build": "tsup"
39
- }
40
- }
1
+ {
2
+ "name": "automd-mcp",
3
+ "version": "0.2.1",
4
+ "description": "MCP server for AutoMD — manage boards, checklists, and pages stored as markdown",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "bin": {
8
+ "automd-mcp": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "dev": "tsx watch src/index.ts",
15
+ "start": "node dist/index.js",
16
+ "build": "tsup",
17
+ "prepublishOnly": "pnpm build"
18
+ },
19
+ "keywords": [
20
+ "mcp",
21
+ "model-context-protocol",
22
+ "kanban",
23
+ "markdown",
24
+ "automd",
25
+ "task-management"
26
+ ],
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/luka-zivkovic/automd"
30
+ },
31
+ "license": "SEE LICENSE IN LICENSE",
32
+ "author": "Luka Zivkovic",
33
+ "devDependencies": {
34
+ "@modelcontextprotocol/sdk": "^1.26.0",
35
+ "@types/mdast": "^4.0.4",
36
+ "tsup": "^8.0.0",
37
+ "tsx": "^4.19.0",
38
+ "typescript": "^5.7.2",
39
+ "zod": "^4.3.6"
40
+ }
41
+ }
package/LICENSE.md DELETED
@@ -1,60 +0,0 @@
1
- # License
2
-
3
- Portions of this software are licensed as follows:
4
-
5
- - Content of branches other than the main branch (i.e. "master") is not licensed.
6
- - Source code files that contain ".ee." in their filename or ".ee" in their dirname are NOT licensed under the Sustainable Use License. To use source code files that contain ".ee." in their filename or ".ee" in their dirname you must hold a valid AutoMD Enterprise License specifically allowing you access to such source code files, as defined in "LICENSE_EE.md".
7
- - All third party components incorporated into the AutoMD Software are licensed under the original license provided by the owner of the applicable component.
8
- - Content outside of the above mentioned files or restrictions is available under the "Sustainable Use License" as defined below.
9
-
10
- # Sustainable Use License
11
-
12
- Version 1.0
13
-
14
- ## Acceptance
15
-
16
- By using the software, you agree to all of the terms and conditions below.
17
-
18
- ## Copyright License
19
-
20
- The licensor grants you a non-exclusive, royalty-free, worldwide, non-sublicensable, non-transferable license to use, copy, distribute, make available, and prepare derivative works of the software, in each case subject to the limitations below.
21
-
22
- ## Limitations
23
-
24
- You may use or modify the software only for your own internal business purposes or for non-commercial or personal use. You may distribute the software or provide it to others only if you do so free of charge for non-commercial purposes. You may not provide the software to third parties as a hosted or managed service, where the service provides users with access to any substantial set of the features or functionality of the software. You may not move, change, disable, or circumvent the license key functionality in the software, and you may not remove or obscure any functionality in the software that is protected by the license key. You may not alter, remove, or obscure any licensing, copyright, or other notices of the licensor in the software. Any use of the licensor's trademarks is subject to applicable law.
25
-
26
- ## Patents
27
-
28
- The licensor grants you a license, under any patent claims the licensor can license, or becomes able to license, to make, have made, use, sell, offer for sale, import and have imported the software, in each case subject to the limitations and conditions in this license. This license does not cover any patent claims that you cause to be infringed by modifications or additions to the software. If you or your company make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
29
-
30
- ## Notices
31
-
32
- You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms. If you modify the software, you must include in any modified copies of the software a prominent notice stating that you have modified the software.
33
-
34
- ## No Other Rights
35
-
36
- These terms do not imply any licenses other than those expressly granted in these terms.
37
-
38
- ## Termination
39
-
40
- If you use the software in violation of these terms, such use is not licensed, and your license will automatically terminate. If the licensor provides you with a notice of your violation, and you cease all violation of this license no later than 30 days after you receive that notice, your license will be reinstated retroactively. However, if you violate these terms after such reinstatement, any additional violation of these terms will cause your license to terminate automatically and permanently.
41
-
42
- ## No Liability
43
-
44
- As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.
45
-
46
- ## Definitions
47
-
48
- The **licensor** is the entity offering these terms, AutoMD (automd.io).
49
-
50
- The **software** is the software the licensor makes available under these terms, including any portion of it.
51
-
52
- **You** refers to the individual or entity agreeing to these terms.
53
-
54
- **Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. Control means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
55
-
56
- **Your license** is the license granted to you for the software under these terms.
57
-
58
- **Use** means anything you do with the software requiring your license.
59
-
60
- **Trademark** means trademarks, service marks, and similar rights.