_lucid_create_embed
ChatGPTInternal tool for MCP Apps extension only. Creates an embed for a Lucid document, returning an embed ID.
_lucid_create_embed_session_token
ChatGPTInternal tool for MCP Apps extension only. Creates a session token for an existing embed, returning a token and embed URL.
fetch
ChatGPTRetrieves the content of a specific Lucid document by its ID. Args: id: Valid UUID of the document
get_mcp_resource
ChatGPTReads a resource from this MCP server by URI. When a tool description says to read a resource (e.g. "read lucid://skills/diagram-specification"), use this tool with that URI to retrieve the full content. Call with no arguments to list all available resources and their URIs. The "lucid://skills" resource lists all available skills. Args: resource_uri: The URI of the resource to read (e.g. "lucid://skills/diagram-specification"). Leave empty to list available resources.
list_document_threads
ChatGPTList collaboration threads on a Lucid document. Args: document_id: The UUID of the document. Returns: JSON string of the Lucid API response (array of thread objects).
lucid_create_diagram_from_mermaid
ChatGPTCreates a Lucid document from existing Mermaid code at the user's request. STOP. Read this ENTIRE description before calling. The rules below are load-bearing — skipping them produces broken documents or wastes the user's tokens. Re-read on every call; don't rely on memory. Use this tool with Mermaid source code already present in the conversation or a user-provided file, including previously shared assistant-generated Mermaid that the user now wants to import. When the user asks to create, render, visualize, or share a diagram from that code, use this tool. The user does not need to explicitly name Lucid or request a conversion. Do not generate Mermaid solely as an intermediate step to call this tool. When the user requests a diagram without asking for Mermaid or a diagram from existing Mermaid source code, prefer creating the diagram directly in Lucid using lucid_create_diagram_from_specification over generating Mermaid code in the conversation. Follow that tool's prerequisites and intent rules. If the user explicitly requests Mermaid source code as the output, honor that request; you should then offer to import it into Lucid. If the user asks only to explain, review, or debug Mermaid code, answer that request without creating a document unless they also ask to see the diagram. For sequence diagrams, use lucid_create_sequence_diagram. For ERDs, use lucid_create_erd. Args: title: The title for the new document. mermaid_markup: Mermaid source code the user wants to import (must contain a valid Mermaid diagram). product: Target product - "lucidchart" or "lucidspark". Defaults to "lucidchart".
lucid_create_diagram_from_specification
ChatGPTCreates a Lucid document using the Standard Import format (.lucid file). The Standard Import format allows creating rich diagrams with shapes, lines, groups, layers, images, and data-backed elements. lucid_create_diagram_from_specification creates a .lucid ZIP file containing a document.json with your specification. Args: title: The title for the new document standard_import_json: JSON string in Lucid Standard Import format product: Target product - either "lucidchart" or "lucidspark" use_assisted_layout: When true (default), automatically arranges shapes with optimal spacing and alignment. Set to false when precise positioning matters, or when the diagram uses containers, swim lanes, BPMN pools, or other structures where shape placement within specific regions is meaningful — auto-layout may move shapes out of their intended containers. Example prompts for lucid_create_diagram_from_specification: - "Create a flowchart with a blue rectangle at the top labeled 'Start', connected to a yellow diamond below it labeled 'Decision'" - "Make a diagram with 3 boxes arranged horizontally: 'Input' on the left (green), 'Process' in the middle (blue), 'Output' on the right (red), with arrows connecting them" - "Create a swimlane diagram with lanes for Sales, Engineering, and Support" - "Build a BPMN process with a start event, two parallel tasks, and an end event" Standard Import JSON Format: The JSON must follow Lucid's Standard Import specification. Basic structure: { "version": 1, "pages": [ { "id": "page1", "title": "Page 1", "shapes": [ { "id": "shape1", "type": "rectangle", "boundingBox": {"x": 100, "y": 100, "w": 200, "h": 100}, "text": "Hello World" } ], "lines": [ { "id": "line1", "lineType": "straight", "endpoint1": { "type": "shapeEndpoint", "style": "none", "shapeId": "shape1", "position": {"x": 1, "y": 0.5} }, "endpoint2": { "type": "positionEndpoint", "style": "arrow", "position": {"x": 400, "y": 250} }, "stroke": { "color": "#000000", "width": 2, "style": "solid" }, "text": [ { "text": "connects to", "position": 0.5, "side": "middle" } ] } ] } ] } PAGE PROPERTIES: - id (required): Unique identifier for the page - title (optional): Title displayed on the page tab SHAPE TYPE REGISTRY: Use these exact type names in your Standard Import JSON: Standard Library: - "rectangle": Basic rectangular block (default block shape) - "text": Text-only shape (does NOT accept style property) - "hotspot": Interactive area (does NOT accept text property) - "image": Image block - "image" (required): {type: "image", url: "image_url"} - "stroke" (required): {color: "#000000", width: 1, style: "solid, dashed, or dotted"} - "stickyNote": Sticky note shape (requires style property) - "lucidCard": Project management card block with structured fields. Use to represent Tasks, Stories, and Epics. - "title" (optional): Card title text - "description" (optional): Card description text - "status" (optional): Status field value (string) - New, To Do, In Progress, Done, Not Doing, or Blocked - "estimate" (optional): Estimate field value (number) - "tshirtSize" (optional): T-shirt size field value (string) - XS, S, M, L, XL, XXL - "assignee" (optional): Assignee field value (string) - "startTime" (optional): Start time field value (number, Unix timestamp in milliseconds) - "endTime" (optional): End time field value (number, Unix timestamp in milliseconds) - Note: Does NOT accept a "text" property - use the field-specific properties instead Shape Library: - "circle": Circle shape - "rectangle": Rectangle shape - "diamond": Diamond shape - "hexagon": Hexagon shape - "pentagon": Pentagon shape - "octagon": Octagon shape - "cloud": Cloud shape - "cross": Cross/plus shape - "polyStar": Star shape with configurable points - "shape" (required): {"numPoints": 5, "innerRadius": 0.5} - "singleArrow": Arrow shape (has orientation property) - "doubleArrow": Double-headed arrow - "isoscelesTriangle": Isosceles triangle - "rightTriangle": Right triangle Container Library: NOTE: Containers are intended to contain other shapes, not text. Shapes can be added to a container by placing them within the boundaries of the container. CONTAINER TITLES: Some containers support an optional "containerTitle" property that displays a title above the container. Containers that support containerTitle: rectangleContainer, roundedRectangleContainer, circleContainer, pillContainer Containers that do NOT support containerTitle: braceContainer, bracketContainer, diamondContainer, swimLanes Example: {"type": "rectangleContainer", "boundingBox": {...}, "containerTitle": {"text": "My Container Title"}} Containers do not have a "text" property. - "braceContainer": Brace-style container (no container title support) - "bracketContainer": Bracket-style container (no container title support) - "circleContainer": Circular container (supports container title) - "diamondContainer": Diamond-shaped container (no container title support) - "pillContainer": Pill/rounded rectangle container (supports container title) - "rectangleContainer": Rectangular container (supports container title) - "roundedRectangleContainer": Rounded rectangle container (supports container title) - "swimLanes": Swim lanes container (no container title support) - "vertical" (required): Controls lane orientation: - vertical: true → lanes are COLUMNS (side-by-side, left-to-right). Each lane's "width" = horizontal width. Sum of lane widths must equal boundingBox.w - vertical: false → lanes are ROWS (stacked, top-to-bottom). Each lane's "width" = vertical height of the row. Sum of lane widths must equal boundingBox.h - "titleBar" (required): {"height": 50, "verticalText": true/false} - "lanes" (required): Array of {"title": "Swim lane 1", "width": 300, "headerFill": "#635DFF", "laneFill": "#F2F3F5"} - title, width, headerFill, and laneFill are REQUIRED for each lane - IMPORTANT: The "width" property represents the lane's size in the direction lanes are stacked: - If vertical: true (columns) → "width" is the horizontal width of each column - If vertical: false (rows) → "width" is the vertical HEIGHT of each row (despite being called "width") - Examples: // Vertical swim lanes (side-by-side columns) {"type": "swimLanes", "boundingBox": {"w": 1000, "h": 800}, "vertical": true, "lanes": [{"title": "Lane 1", "width": 500, ...}, {"title": "Lane 2", "width": 500, ...}]} // Sum: 500+500=1000 (matches boundingBox.w ✓) // Horizontal swim lanes (stacked rows) {"type": "swimLanes", "boundingBox": {"w": 1000, "h": 800}, "vertical": false, "lanes": [{"title": "Lane 1", "width": 400, ...}, {"title": "Lane 2", "width": 400, ...}]} // Sum: 400+400=800 (matches boundingBox.h ✓) - "width" here means row height! Flowchart Library: - "braceNote": Brace note shape - "rightFacing" (required): boolean, TOP-LEVEL property (not nested in "shape") - "braceWidth" (required): number, TOP-LEVEL property (not nested in "shape") Example: {"type": "braceNote", "rightFacing": true, "braceWidth": 15, "boundingBox": {...}, ...} - "connector": Connector shape - "database": Database symbol - "decision": Decision diamond - "process": Process rectangle - "terminator": Start/end oval - "manualInput": Manual input trapezoid - "offPageLink": Off-page connector - "document": Document shape - "multipleDocuments": Multiple documents - "internalStorage": Internal storage shape - "directAccessStorage": Direct access storage shape - "manualOperation": Manual operation shape - "preparation": Preparation hexagon - "predefinedProcess": Predefined process - "sideWidth" (required): number 0-0.33, TOP-LEVEL property (not nested in "shape") Example: {"type": "predefinedProcess", "sideWidth": 0.1, "boundingBox": {...}, ...} - "storedData": Stored data shape - "delay": Delay shape - "data": Data parallelogram - "merge": Merge triangle - "or": OR gate (no text property) - "summingJunction": Summing junction (no text property) - "display": Display shape - "note": Note shape - "paperTape": Paper tape shape Lucidspark Library: - "sparkCalloutSquare": Callout square - "sparkContainer": Spark container - "sparkFrame": Spark frame with title - "title" (required): use instead of "text" property UML Library: - "umlClass": UML Class block with three text sections for class diagrams. - "title" (optional): Class name text (e.g. "UserService") - "properties" (optional): List of attribute strings (e.g. ["- name: String", "- id: long"]) - "methods" (optional): List of method strings (e.g. ["+ getName(): String", "- setId(id: long): void"]) - "propertiesHeight" (optional): Ratio (0-1) controlling the vertical split between the properties and methods sections, where 0 gives all space to methods and 1 gives all space to properties (default 0.5) - Note: Does NOT accept a "text" property - use "title", "properties", and "methods" instead BPMN 2.0 Library: - "bpmnActivity": BPMN activity - activityType (required): may have values "task", "transaction", "eventSubProcess", or "callActivity" - "bpmnEvent": BPMN event - eventGroup (required): "start", "intermediate", or "end" - eventType (optional): "none", "message", "timer", "escalation", "conditional", "link", "error", "cancel", "compensation", "signal", "multiple", "parallelMultiple", or "terminate" - "bpmnGateway": BPMN gateway - gatewayType (optional): "none", "exclusive", "eventBased", "parallel", "inclusive", "exclusiveEventBased", "complex", or "parallelEventBased" - "bpmnPool": BPMN pool (horizontal/vertical with lanes) - title (required): "Pool Title" - lanes (required): Array of {"title": "Lane", "width": 300, "laneFill": "#0000"} - title, width, and laneFill are REQUIRED for each lane - IMPORTANT: "width" represents the lane's size in the stacking direction (same behavior as swimLanes): - If vertical: true → "width" is horizontal width of each column - If vertical: false → "width" is vertical HEIGHT of each row - vertical (required): true/false for orientation - vertical: true → lanes are columns. Sum of lane widths must equal boundingBox.w - vertical: false → lanes are rows. Sum of lane widths must equal boundingBox.h - "bpmnChoreography": BPMN choreography - choreographyType (required): "task", "subchoreography", or "call" - participants (required): Array of {"text": "Participant", "multipleParticipants": false} - name (optional): The name of the initiator - taskName (optional): The name of the task - "bpmnConversation": BPMN conversation - isCall (optional): makes the block into a call block, defaults to false - isSubConversation (optional): makes the block into a sub-conversation block, defaults to false - "bpmnDataObject": BPMN data object - dataType (optional): may have values "none", "collection", "input", or "output" - "bpmnDataStore": BPMN data store - "bpmnTextAnnotation": BPMN text annotation - "bpmnGroup": BPMN group - "bpmnBlackBoxPool": BPMN black box pool Table Library: - "table": Table with rows and columns - rowCount (required): Number of rows in the table - colCount (required): Number of columns in the table - cells (required): FLAT ARRAY of cell objects, each with: - xPosition (required): Column index starting at 0 - yPosition (required): Row index starting at 0 - text (optional): Cell content (string) - style (optional): Cell styling - fill: {type: "color", color: "#hexcolor"} - mergeCellsRight: Number of cells to merge horizontally (default 0) - mergeCellsDown: Number of cells to merge vertically (default 0) - Note: When using mergeCellsRight or mergeCellsDown, do not define cells that will be occupied by the merged cell. Only define the starting cell with the merge property. Common Shape Properties: - id (required): Unique identifier string - type (required): Shape type from registry above - boundingBox (required): {x: number, y: number, w: number, h: number} - text (optional): "text content" for display text - style (optional): {fill: {...}, stroke: {...}, textColor: "..."} - fill (optional): {type: "color", color: "#hexcolor"} - stroke (optional): {color: "#000000", width: 1, style: "solid, dashed, or dotted"} - textColor (optional): Hex color string for text color (e.g. "#ff0000"). Overrides automatic contrast color. - opacity (optional): Number between 0 (transparent) and 100 (opaque) - note (optional): Additional text note Shape Ordering (Z-Index): Shapes are rendered in the order they appear in the shapes array. Shapes defined LATER in the array appear IN FRONT OF (on top of) shapes defined earlier. If you need a shape to appear behind other shapes, place it earlier in the shapes array. Line Properties: - id (required): Unique identifier - lineType (required): "straight", "elbow", or "curved" - endpoint1 (required): Connection definition - endpoint2 (required): Connection definition - stroke: Line styling - text: Line labels (Array[LineText]) - LineText: {"text": "test", "position": 0.5, "side": "middle"} - "position" may be between 0 and 1 and indicates relative position along the line - "side" may be "top", "middle", or "bottom" and indicates how the text should be displayed on the line Endpoint Types: IMPORTANT: The "style" property on each endpoint specifies the line ending decoration that appears AT THAT ENDPOINT. For a directional arrow pointing from shape A to shape B: - endpoint1 (source/start): use style: "none" - endpoint2 (destination/end): use style: "arrow" Example: A line with an arrow pointing from shape1 to shape2: {"endpoint1": {"type": "shapeEndpoint", "style": "none", "shapeId": "shape1"}, "endpoint2": {"type": "shapeEndpoint", "style": "arrow", "shapeId": "shape2"}} - shapeEndpoint: Connect to a shape {type: "shapeEndpoint", style: "arrow", shapeId: "shape1", position: {x: 0.5, y: 0.5}} - type (required): "shapeEndpoint" - style (required): The decoration at this endpoint. Values: "none", "arrow", "hollowArrow", "openArrow", "aggregation", "async1", "async2", "closedSquare", "openSquare", "bpmnConditional", "bpmnDefault", "closedCircle", "openCircle", "composition", "exactlyOne", "generalization", "many", "nesting", "one", "oneOrMore", "zeroOrMore", "zeroOrOne" - shapeId (required): ID of the target shape - position (optional): RelativePosition object {x: 0-1, y: 0-1} for where on the shape to connect. (x: 0 is far left, x: 0.5 is middle, x: 1 is far right). IMPORTANT: Position must be specified on BOTH endpoints or NEITHER - specifying position on only one endpoint will fail. If neither endpoint on a line has a relative position provided, the line will be a "smart line", where the attachment points automatically adjust based on the relative placements of the shapes connected by the line. - positionEndpoint: Connect to an absolute position on the canvas {type: "positionEndpoint", style: "arrow", position: {x: 100, y: 100}} - type (required): "positionEndpoint" - style (required): The decoration at this endpoint. Values: "none", "arrow", "hollowArrow", "openArrow", "aggregation", "async1", "async2", "closedSquare", "openSquare", "bpmnConditional", "bpmnDefault", "closedCircle", "openCircle", "composition", "exactlyOne", "generalization", "many", "nesting", "one", "oneOrMore", "zeroOrMore", "zeroOrOne" - position (required): Position object - x (required): Absolute x coordinate - y (required): Absolute y coordinate - lineEndpoint: Connect to another line {type: "lineEndpoint", style: "arrow", lineId: "line1", position: 0.5} - type (required): "lineEndpoint" - style (required): The decoration at this endpoint. Values: "none", "arrow", "hollowArrow", "openArrow", "aggregation", "async1", "async2", "closedSquare", "openSquare", "bpmnConditional", "bpmnDefault", "closedCircle", "openCircle", "composition", "exactlyOne", "generalization", "many", "nesting", "one", "oneOrMore", "zeroOrMore", "zeroOrOne" - lineId (required): ID of the target line - position (required): NUMBER (0-1) representing position along the line (NOT an object!) Property Formats: - Color values must be hexcode color strings with prefix, in the format of a standard RGB, RGBA, RRGGBB, or RRGGBBAA hexcode color string (e.g., "#FF0000") - Boolean values must be true/false, not strings - Numbers must be numeric types, not strings - Text values must NOT contain emoji characters (they render as black boxes) Size Limits: - Total document.json: 2MB maximum - Use concise JSON without unnecessary whitespace for large diagrams
lucid_create_document_share_link
ChatGPTCreates a new share link for a document with specified permissions. Args: document_id: Valid UUID of the document to share role: Access permission level - one of: "view", "comment", "edit", "editandshare" restrict_to_account: Limit access to account members only (default: True) expires: Optional ISO 8601 timestamp for link expiration (e.g., "2025-12-31T23:59:59Z") allow_anonymous: Allow anonymous access via the share link (default: False) Returns: The acceptUrl string for the created share link
lucid_create_erd
ChatGPTCreates a Lucid document containing a data-backed Entity Relationship Diagram (ERD). Use this tool when the user wants to create an ERD / database schema diagram from a set of entities (tables) and the foreign-key relationships between them. If the user provides raw SQL DDL, a CSV schema, or a Salesforce export, convert it into the structured entities / relationships form described below. The result is a real, editable ERD: each entity becomes an editable entity table and each relationship becomes a crow's-foot foreign-key line. The schema is stored as ERD data on the document, not as loose shapes. Each entity must have: - id: Unique string identifier (referenced by relationships) - name: Entity / table name (must be unique) - attributes: List of columns, each with a 'name' and optional 'type' and 'key' (e.g. "PK" for a primary key) Each relationship must have: - from: id of the entity that holds the foreign key (the "many" side) - to: id of the referenced entity (the "one" side) - fromAttribute (optional): the FK column on from - toAttribute (optional): the referenced PK column on to - fromCardinality / toCardinality (optional): one of one, many, zeroOrOne, zeroOrMore, oneOrMore, exactlyOne - label (optional): relationship label Example entities: [ {"id": "user", "name": "User", "attributes": [ {"name": "id", "type": "uuid", "key": "PK"}, {"name": "email", "type": "varchar"} ]}, {"id": "post", "name": "Post", "attributes": [ {"name": "id", "type": "uuid", "key": "PK"}, {"name": "author_id", "type": "uuid"} ]} ] Example relationships: [ {"from": "post", "to": "user", "fromAttribute": "author_id", "toAttribute": "id", "fromCardinality": "many", "toCardinality": "one", "label": "written by"} ] Args: title: Document title (max 3000 characters) entities: List of entity dicts with id, name, and attributes (max 200 entities) relationships: List of relationship dicts referencing entity ids product: Target product - "lucidchart" (default) or "lucidspark" Returns: JSON with the created document details including document ID and edit URL
lucid_create_folder
ChatGPTCreate a new folder in the user's Lucid account. Args: name: Folder name (1-300 characters, no leading/trailing whitespace). folder_type: Either "folder" (default) or "team". parent: Parent folder for the new folder. Pass an integer folder ID to nest it under that folder. Omit (or pass the literal string "root") to create it at the root Returns: JSON string with the created folder resource (including its id). Example: lucid_create_folder(name="Project plans", parent=12345)
lucid_create_mind_map
ChatGPTCreates a Lucid document containing a mind map from structured node data. Use this tool when the user wants to create a mind map or hierarchical topic diagram. Provide the topics as a flat list of nodes with parent-child relationships. Each node must have: - id: Unique string identifier - text: Display text for the node - parentId: ID of the parent node (null or omitted for the root node) There must be exactly one root node (with null/missing parentId). Example nodes: [ {"id": "1", "text": "Main Topic", "parentId": null}, {"id": "2", "text": "Subtopic A", "parentId": "1"}, {"id": "3", "text": "Subtopic B", "parentId": "1"}, {"id": "4", "text": "Detail A1", "parentId": "2"} ] Args: title: Document title (max 3000 characters) nodes: List of node dicts with id, text, and optional parentId fields (max 1000 nodes) product: Target product - "lucidchart" (default) or "lucidspark" Returns: JSON with the created document details including document ID and edit URL
lucid_create_org_chart
ChatGPTCreates a Lucidchart document containing an org chart from structured node data. Use this tool when the user wants to create an organizational chart, team structure, or reporting hierarchy diagram. Provide the people/roles as a flat list of nodes with manager-report relationships. Each node must have: - id: Unique string identifier - name: Person or role name - managerId: ID of the manager node (null or omitted for the top-level person) Optional fields per node: - role: Job title or role description - imageUrl: URL to a profile image There must be exactly one root node (with null/missing managerId). Example nodes: [ {"id": "1", "name": "Alice Smith", "managerId": null, "role": "CEO"}, {"id": "2", "name": "Bob Jones", "managerId": "1", "role": "VP Engineering"}, {"id": "3", "name": "Carol White", "managerId": "1", "role": "VP Marketing"}, {"id": "4", "name": "Dave Brown", "managerId": "2", "role": "Senior Engineer"} ] Args: title: Document title (max 3000 characters) nodes: List of node dicts with id, name, and optional managerId/role/imageUrl fields (max 1000 nodes) Returns: JSON with the created document details including document ID and edit URL
lucid_create_sequence_diagram
ChatGPTCreates a Lucid document containing a UML sequence diagram from PlantUML markup. Use this tool when the user wants to create a UML sequence diagram showing interactions between participants over time. Provide the diagram definition using PlantUML sequence diagram syntax. Styling: Diagrams are automatically styled with Lucid blue theme colors (blue participants, blue arrows, light blue fills). You do not need to add color directives for a good-looking diagram. However, you can optionally override colors on individual elements (see Color Support below). IMPORTANT - Unsupported syntax (will cause parse errors): - skinparam directives (e.g. skinparam backgroundColor #FFF) - activate with color (e.g. activate A #color) - destroy keyword - newpage keyword - preprocessor directives (lines starting with !) - collections or queue participant types - Lost message arrows (->x) - External actors using [ or ] (e.g. [-> B or B ->]) - Formatted autonumber (e.g. autonumber 1 1 "<b>#</b>") - Dividers (== Section ==), delays (...), return, ref over - else is only supported inside alt blocks (not in par, loop, opt, critical, or group) PlantUML Sequence Diagram Syntax Reference: Participants: - participant Name (box, simplest form) - participant "Display Name" as alias (use alias in messages) - actor Name (stick figure) - boundary Name (boundary icon) - control Name (control icon) - entity Name (entity icon) - database Name (database icon) Note: Do NOT use "Name" as Name when display name and alias are identical (e.g. participant "Alice" as Alice). Just use participant Alice. Messages (arrow styles): - A -> B : Solid line, closed arrow - A --> B : Dashed line, closed arrow - A ->> B : Solid line, open arrow - A -->> B : Dashed line, open arrow - A -// B : Solid line, bottom half open arrow - A -\ B : Solid line, top half open arrow - A <-> B : Solid bidirectional - A <--> B : Dashed bidirectional - A <<->> B : Solid open bidirectional - A <<-->> B : Dashed open bidirectional Grouping: - alt / else: Alternative flows - loop: Repeated interactions - opt: Optional interaction - par: Parallel interactions - critical: Critical section - group: Generic named group Notes: - note left of A: Text (single-line) - note right of A: Text (single-line) - note over A,B: Text (single-line) - note left / note right: Inline note (no participant) - Multi-line: note left of A (newline) text (newline) end note Other: - title Text: Diagram title - caption Text: Diagram caption - activate A / deactivate A: Lifeline activation - autonumber: Auto-number messages - autonumber stop / autonumber resume: Control numbering Color Support (optional - diagrams are styled by default): - Participant fill: participant Name #hexcolor (or: participant "Display Name" as alias #hexcolor) - Arrow color: place [#hexcolor] so it replaces one dash in the arrow: - Solid: A -[#color]> B or A [#color]-> B - Dashed: A -[#color]-> B or A --[#color]> B or A [#color]--> B - Bidirectional: A <-[#color]> B or A <[#color]-> B - INVALID: A --[#color]-> B (too many dashes, causes parse error) - INVALID: A -[#color]<-> B (color must come after the <) Example markup: @startuml actor User participant "Web App" as app participant "API Server" as api database "Database" as db User -> app : Login request activate app app -> api : POST /auth activate api api -> db : Query user activate db db --> api : User data deactivate db api --> app : JWT token deactivate api app --> User : Login success deactivate app @enduml Args: title: Document title (max 3000 characters) markup: PlantUML sequence diagram markup (max 50KB) product: Target product - "lucidchart" (default) or "lucidspark" Returns: JSON with the created document details including document ID and edit URL
lucid_export_document_as_PNG
ChatGPTExports a Lucid document page as a PNG image.
lucid_fetch_item_image
ChatGPTFetches the source image attached to a specific item in a Lucid document.
lucid_get_document_metadata
ChatGPTGet metadata for a Lucid document. The requesting user must have at least read-only access to the document. Owner information is returned for unpublished documents when the requesting user has view access. For published documents, viewers receive account-level owner information; the individual user owner's ID is returned only when the requesting user is at least a collaborator. Args: document_id: UUID of the document to retrieve. Returns: JSON string containing the document's metadata, access details, location, classification, and owner information when authorized. Example: lucid_get_document_metadata( document_id="8fb1756d-d7f1-4f8c-933a-40e30fa5d102", )
lucid_import_integration_cards
ChatGPTImport records from a third-party integration as linked cards. You MUST call lucid_list_integrations first to obtain instance_id — it is the exact instanceId field returned for the desired integration instance, not a free-form string, and cannot be guessed from context. The import backend checks the user's Jira credentials. Args: document_id: UUID of the Lucid document to add cards to. integration_id: Which integration the records live in. Today only "jira" is supported. instance_id: The instanceId field from a lucid_list_integrations entry, identifying which instance of integration_id to pull records from. Must come from lucid_list_integrations; do not construct it. record_keys: Integration-specific identifiers for the records to import (e.g. Jira issue keys like ["MCP-1", "MCP-2"]). page_id: Page to drop the cards on (defaults to the first page). x: Top-left x coordinate of the first card. Defaults to 0. y: Top-left y coordinate of the first card. Defaults to 0. layout: One of "grid", "row", "column". Defaults to "grid". If the requested instance is not listed or Jira authorization is unavailable during import, returns {status: "not_connected", connect_url, ...} — send the user to connect_url (their Lucid Apps & Integrations page) to connect. Do NOT attempt to authenticate on their behalf. Returns: JSON with {success, blockIds, dataSourceId, errors} on success, or a structured {status: "not_connected" | "unsupported_integration", ...} response when Jira access needs attention. errors is a list of {recordKey, error} entries for keys that could not be imported or whose AddBlock op failed; this tool returns partial success when only some keys fail.
lucid_list_folder_contents
ChatGPTList the documents and subfolders inside a Lucid folder. Pass folder_id=None (the default) to list the user's root folder. When more pages are available, the response includes a nextPageToken; pass it back as page_token to fetch the next page. Args: folder_id: Numeric folder ID, or omit/None for the root folder. page_size: Page size (1-200, default 50). page_token: Opaque cursor from a previous response's nextPageToken field. Returns: JSON string of the form {"items": [...], "nextPageToken": "..."?}. The underlying API returns items as a bare list and carries pagination in a Link header; this tool reshapes that into a single object. Example: lucid_list_folder_contents(folder_id=12345, page_size=100)
lucid_list_integrations
ChatGPTList the user's available card integration instances. Use this to find an instance_id for importing integration cards. Returns: A JSON array. Each entry describes one integration: { "integration": str, e.g. "jira" "instances": [ {"instanceId": str, "name": str, "adapterType": str} ] } If there are no instances, tell the user to connect Jira from the Lucid editor: open a document and use the integration/import panel. Do NOT attempt to authenticate on their behalf or fabricate a connect link. Jira specifics adapterType is one of "JiraCloud", "JiraDataCenter", or "JiraGovCloud".
lucid_search_document
ChatGPTLocates regions of a Lucid document that contain specific text. Use this BEFORE fetch when you're looking for content you can describe with specific words or phrases — it tells you which (pageIndex, regionIndex) pairs contain matches so you can then fetch only those regions instead of paging through the whole document. Matching is case-insensitive substring over each region's TextAreas content (shape labels, sticky-note text, etc.). It does NOT match against notes, tags, links, colors, or other metadata. Returns a JSON object of the form: { "matches": { "<query>": [ {"pageIndex": 1, "regionIndex": 3, "context": ["Q3 KPI Tracking"]}, ... ], "<otherQuery>": [] }, "title": "..." } Every query you pass appears as a key in matches, even when it has no hits — so you can rely on matches[query] without first checking presence. pageIndex and regionIndex are 1-based and can be passed directly to fetch as page_index and region_index. Args: id: Valid UUID of the document. queries: Non-empty list of literal search terms (1-20 items, each at most 200 characters). Each query is matched independently as a case-insensitive substring; the response groups hits by query.
lucid_submit_feedback
ChatGPTSubmits user feedback about the Lucid MCP server to the product team. Use this tool when the user wants to share feedback, report a bug, request a feature, or otherwise comment on their experience with the Lucid MCP server's tools. The feedback is routed to Lucid's product team. Args: title: A short title summarizing the feedback. Required. feedback: The feedback from the user. Required. Returns: A message indicating whether the feedback was successfully submitted.
lucid_update_document
ChatGPTUpdate a Lucid document's title, parent folder, or custom tags. Use this tool to rename a document or move it between folders. At least one of title, parent, or custom_tags must be provided. Args: document_id: UUID of the document to update title: New title for the document. Omit to leave unchanged. parent: Move the document to a new parent. Pass an integer folder ID to move it under that folder, or the literal string "root" to move it to the root folder. Omit to leave the document where it is. custom_tags: Replacement list of custom tag strings. Omit to leave existing tags unchanged. Pass an empty list to clear. Returns: JSON string with the updated document resource. Example: lucid_update_document( document_id="8fb1756d-d7f1-4f8c-933a-40e30fa5d102", title="Q3 Roadmap", parent=12345, )
lucid_update_folder
ChatGPTRename a Lucid folder or move it to a different parent. At least one of name or parent must be provided. Args: folder_id: Numeric ID of the folder to update. name: New folder name. Omit to leave unchanged. parent: Move the folder to a new parent. Pass an integer folder ID to move it under that folder, or the literal string "root" to move it to the root. Omit to leave the folder where it is. Returns: JSON string with the updated folder resource. Example: lucid_update_folder(folder_id=12345, name="Archived plans")
lucid_validate_diagram_specification
ChatGPTCheck Standard Import JSON for layout problems before creating a document. Runs the GEOMETRY AND TEXT PREFLIGHT rules from lucid://diagram-specification over the JSON you are about to pass to lucid_create_diagram_from_specification and reports two kinds of problem. Structural mistakes fail the import outright: a page or shape or endpoint missing a field the importer requires, a shape type or endpoint style outside its enum, a duplicate id, an endpoint pointing at a shape that is not on the page, a relative position pinned on only one endpoint, a malformed color. The API answers these with a bare 400 that names nothing, so the findings name the page, item, and field instead. lucid_create_diagram_from_specification refuses to create a document while any of them stand. Layout mistakes import successfully and look wrong: text that will render smaller than its neighbors', shapes that collide, shapes that cross a container or lane edge, connectors that cross shapes they do not connect, labels that land on a shape or on another label, and duplicate labels on connectors that share an endpoint. This tool does not create, modify, or upload anything. It reads the JSON you give it and returns a report. A clean report means these checks found nothing, not that the diagram is good; where a check does not cover your JSON the report says so in its own finding, so read "skipped_checks" and any *-preflight-skipped finding before treating the page as verified. In particular, connector path and label geometry is modeled for straight lines only. Use it when you have hand-authored the JSON and want the geometry checked before spending a document on it. Fix the findings, run it again, then call lucid_create_diagram_from_specification. Args: standard_import_json: JSON string in Lucid Standard Import format. Returns: JSON with "error_count", "warning_count", payload_diagnostics, a human-readable "summary", and a bounded "findings" array. Each finding names the "rule" it came from, the "page_id" and "subject_ids" it applies to, what is wrong, and a suggested fix. "truncated" and "skipped_checks" identify an incomplete report, while the limit and comparison fields explain the work bounds used.
search
ChatGPTSearches for documents in Lucid based on keywords. Args: query: String containing space-separated keywords to be searched for (max 400 characters) Returns: Search results with document titles, IDs, and URLs, sorted by relevance. Returns up to 200 results (API maximum).
share_document_with_collaborators
ChatGPTShare a Lucid document with collaborators by granting them access. This tool searches for users by their email addresses, then grants them the specified collaborator role on the document. Args: document_id: The UUID of the document to share emails: List of email addresses to share the document with (max 100) role: The collaborator role to grant. Options: - "view": View-only access - "edit": Edit access - "editandshare": Edit and share access (default) - "comment": Comment-only access Returns: JSON string with results for each email address, indicating success or failure
_lucid_create_embed
Claude_lucid_create_embed_session_token
Claudefetch
Claudelucid_create_diagram_from_specification
Claudelucid_create_document_share_link
Claudelucid_create_mind_map
Claudelucid_create_org_chart
Claudelucid_create_sequence_diagram
Claudelucid_export_document_as_PNG
Claudesearch
Claudeshare_document_with_collaborators
Claude