* feat: kan mcp server initial attempt * fix: card was missing options and added default fallbacks * fix: label creating with better information for colors and presets
84 lines
3.0 KiB
TypeScript
84 lines
3.0 KiB
TypeScript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
import { z } from "zod";
|
|
import { kanRequest } from "../client.js";
|
|
|
|
export function registerChecklistTools(server: McpServer): void {
|
|
server.tool(
|
|
"create_checklist",
|
|
"Add a checklist to a card",
|
|
{
|
|
cardPublicId: z.string().describe("The card's public ID"),
|
|
name: z.string().describe("Checklist name"),
|
|
},
|
|
async ({ cardPublicId, name }) => {
|
|
const data = await kanRequest("POST", `/cards/${cardPublicId}/checklists`, { name });
|
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
},
|
|
);
|
|
|
|
server.tool(
|
|
"update_checklist",
|
|
"Rename a checklist",
|
|
{
|
|
checklistPublicId: z.string().describe("The checklist's public ID"),
|
|
name: z.string().describe("New checklist name"),
|
|
},
|
|
async ({ checklistPublicId, name }) => {
|
|
const data = await kanRequest("PUT", `/checklists/${checklistPublicId}`, { name });
|
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
},
|
|
);
|
|
|
|
server.tool(
|
|
"delete_checklist",
|
|
"Delete a checklist and all its items",
|
|
{ checklistPublicId: z.string().describe("The checklist's public ID") },
|
|
async ({ checklistPublicId }) => {
|
|
const data = await kanRequest("DELETE", `/checklists/${checklistPublicId}`);
|
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
},
|
|
);
|
|
|
|
server.tool(
|
|
"create_checklist_item",
|
|
"Add an item to a checklist",
|
|
{
|
|
checklistPublicId: z.string().describe("The checklist's public ID"),
|
|
title: z.string().describe("Item title"),
|
|
},
|
|
async ({ checklistPublicId, title }) => {
|
|
const data = await kanRequest("POST", `/checklists/${checklistPublicId}/items`, { title });
|
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
},
|
|
);
|
|
|
|
server.tool(
|
|
"update_checklist_item",
|
|
"Update a checklist item's title, completion status, or position",
|
|
{
|
|
checklistItemPublicId: z.string().describe("The checklist item's public ID"),
|
|
title: z.string().optional().describe("New item title"),
|
|
isCompleted: z.boolean().optional().describe("Mark item as completed or not"),
|
|
index: z.number().int().optional().describe("New position index"),
|
|
},
|
|
async ({ checklistItemPublicId, title, isCompleted, index }) => {
|
|
const data = await kanRequest("PATCH", `/checklists/items/${checklistItemPublicId}`, {
|
|
title,
|
|
isCompleted,
|
|
index,
|
|
});
|
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
},
|
|
);
|
|
|
|
server.tool(
|
|
"delete_checklist_item",
|
|
"Delete a checklist item",
|
|
{ checklistItemPublicId: z.string().describe("The checklist item's public ID") },
|
|
async ({ checklistItemPublicId }) => {
|
|
const data = await kanRequest("DELETE", `/checklists/items/${checklistItemPublicId}`);
|
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
},
|
|
);
|
|
}
|