Skip to main content
Glama

delete_node

Remove a node from Dynalist documents. Choose to delete only the node while moving its children up, or delete the node along with all its descendants.

Instructions

Delete a node from a Dynalist document. By default, only the node is deleted and its children move up to the parent. Use include_children=true to delete the node AND all its descendants.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlNoDynalist URL with node deep link
file_idNoDocument ID (alternative to URL)
node_idYesNode ID to delete
include_childrenNoIf true, delete the node AND all its children/descendants. If false (default), only delete the node (children move up to parent).

Implementation Reference

  • Main handler function that parses input, resolves document ID, deletes the specified node or recursively all descendants if include_children=true using client.editDocument, and returns success message with count.
    async ({ url, file_id, node_id, include_children }) => {
      let documentId = file_id;
    
      if (url) {
        const parsed = parseDynalistUrl(url);
        documentId = parsed.documentId;
      }
    
      if (!documentId) {
        return {
          content: [{ type: "text", text: "Error: Either 'url' or 'file_id' must be provided" }],
          isError: true,
        };
      }
    
      let deletedCount = 1;
    
      if (include_children) {
        // Read document to find all descendants
        const doc = await client.readDocument(documentId);
        const nodeMap = buildNodeMap(doc.nodes);
    
        // Collect all descendant IDs recursively
        const nodesToDelete: string[] = [];
        function collectDescendants(id: string) {
          nodesToDelete.push(id);
          const node = nodeMap.get(id);
          if (node?.children) {
            for (const childId of node.children) {
              collectDescendants(childId);
            }
          }
        }
        collectDescendants(node_id);
    
        // Delete all nodes (children first, then parents - reverse order)
        const changes = nodesToDelete.reverse().map(id => ({ action: "delete" as const, node_id: id }));
        await client.editDocument(documentId, changes);
        deletedCount = nodesToDelete.length;
      } else {
        // Delete only the node itself
        await client.editDocument(documentId, [
          { action: "delete", node_id }
        ]);
      }
    
      return {
        content: [
          {
            type: "text",
            text: `Deleted ${deletedCount} node(s) successfully!\nDocument: ${documentId}${include_children ? " (including all children)" : " (children moved to parent)"}`,
          },
        ],
      };
  • Zod input schema defining parameters for the delete_node tool.
    {
      url: z.string().optional().describe("Dynalist URL with node deep link"),
      file_id: z.string().optional().describe("Document ID (alternative to URL)"),
      node_id: z.string().describe("Node ID to delete"),
      include_children: z.boolean().optional().default(false).describe("If true, delete the node AND all its children/descendants. If false (default), only delete the node (children move up to parent)."),
    },
  • Registration of the delete_node tool using server.tool with name, description, schema, and handler function.
    server.tool(
      "delete_node",
      "Delete a node from a Dynalist document. By default, only the node is deleted and its children move up to the parent. Use include_children=true to delete the node AND all its descendants.",
      {
        url: z.string().optional().describe("Dynalist URL with node deep link"),
        file_id: z.string().optional().describe("Document ID (alternative to URL)"),
        node_id: z.string().describe("Node ID to delete"),
        include_children: z.boolean().optional().default(false).describe("If true, delete the node AND all its children/descendants. If false (default), only delete the node (children move up to parent)."),
      },
      async ({ url, file_id, node_id, include_children }) => {
        let documentId = file_id;
    
        if (url) {
          const parsed = parseDynalistUrl(url);
          documentId = parsed.documentId;
        }
    
        if (!documentId) {
          return {
            content: [{ type: "text", text: "Error: Either 'url' or 'file_id' must be provided" }],
            isError: true,
          };
        }
    
        let deletedCount = 1;
    
        if (include_children) {
          // Read document to find all descendants
          const doc = await client.readDocument(documentId);
          const nodeMap = buildNodeMap(doc.nodes);
    
          // Collect all descendant IDs recursively
          const nodesToDelete: string[] = [];
          function collectDescendants(id: string) {
            nodesToDelete.push(id);
            const node = nodeMap.get(id);
            if (node?.children) {
              for (const childId of node.children) {
                collectDescendants(childId);
              }
            }
          }
          collectDescendants(node_id);
    
          // Delete all nodes (children first, then parents - reverse order)
          const changes = nodesToDelete.reverse().map(id => ({ action: "delete" as const, node_id: id }));
          await client.editDocument(documentId, changes);
          deletedCount = nodesToDelete.length;
        } else {
          // Delete only the node itself
          await client.editDocument(documentId, [
            { action: "delete", node_id }
          ]);
        }
    
        return {
          content: [
            {
              type: "text",
              text: `Deleted ${deletedCount} node(s) successfully!\nDocument: ${documentId}${include_children ? " (including all children)" : " (children moved to parent)"}`,
            },
          ],
        };
      }
    );

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cristip73/dynalist-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server