workflowy_update_node
Modify existing WorkFlowy nodes by updating their name, note content, layout format, or completion status to keep outlines current and organized.
Instructions
Update an existing WorkFlowy node
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| _completed | No | ||
| layout_mode | No | ||
| name | No | ||
| node_id | Yes | ||
| note | No |
Implementation Reference
- src/workflowy_mcp/server.py:124-163 (handler)Handler function executing the workflowy_update_node tool logic, decorated with @mcp.tool for registration.@mcp.tool(name="workflowy_update_node", description="Update an existing WorkFlowy node") async def update_node( node_id: str, name: str | None = None, note: str | None = None, layout_mode: Literal["bullets", "todo", "h1", "h2", "h3"] | None = None, _completed: bool | None = None, ) -> WorkFlowyNode: """Update an existing WorkFlowy node. Args: node_id: The ID of the node to update name: New text content for the node (optional) note: New note/description (optional) layout_mode: New layout mode for the node (bullets, todo, h1, h2, h3) (optional) _completed: New completion status (not used - use complete_node/uncomplete_node) Returns: The updated WorkFlowy node """ client = get_client() request = NodeUpdateRequest( # type: ignore[call-arg] name=name, note=note, layoutMode=layout_mode, ) if _rate_limiter: await _rate_limiter.acquire() try: node = await client.update_node(node_id, request) if _rate_limiter: _rate_limiter.on_success() return node except Exception as e: if _rate_limiter and hasattr(e, "__class__") and e.__class__.__name__ == "RateLimitError": _rate_limiter.on_rate_limit(getattr(e, "retry_after", None)) raise
- Pydantic input schema model used in the update_node handler.class NodeUpdateRequest(BaseModel): """Request payload for updating an existing node.""" name: str | None = Field(None, description="New text content") note: str | None = Field(None, description="New note content") layoutMode: Literal["bullets", "todo", "h1", "h2", "h3"] | None = Field( None, description="New display mode (bullets, todo, h1, h2, h3)" ) def has_updates(self) -> bool: """Check if at least one field is provided for update.""" return any(getattr(self, field) is not None for field in self.model_fields)
- WorkFlowyClient method that makes the HTTP API call to update the node.async def update_node(self, node_id: str, request: NodeUpdateRequest) -> WorkFlowyNode: """Update an existing node.""" try: response = await self.client.post( f"/nodes/{node_id}", json=request.model_dump(exclude_none=True) ) data = await self._handle_response(response) # API returns the full node object return WorkFlowyNode(**data) except httpx.TimeoutException as err: raise TimeoutError("update_node") from err except httpx.NetworkError as e: raise NetworkError(f"Network error: {str(e)}") from e
- Pydantic output model returned by the workflowy_update_node tool.class WorkFlowyNode(BaseModel): """Represents a single node in the WorkFlowy outline hierarchy.""" # API fields (what the API actually returns) id: str = Field(..., description="Unique identifier for the node") name: str | None = Field( None, validation_alias=AliasChoices("name", "nm"), description="Text content of the node" ) note: str | None = Field(