Canvs

AI-powered diagrams, mind maps, flowcharts on a free unlimited collaborative whiteboard

사용해야 할까요

품질 및 안전성

A
설명 품질
97%
스키마 완전성
88%
이름 품질
100%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~3,541토큰 (도구 정의)
~5.5 KB일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 2.77%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "canvs": {
      "url": "https://app.canvs.io/mcp"
    }
  }
}

원격 엔드포인트

https://app.canvs.io/mcpstreamable-http

할 수 있는 일

도구 목록

도구 (6)

🟢 읽기 전용🟡 쓰기🔴 삭제⚪ 알 수 없음
🟢get_guide

Returns guidance on diagram-creation workflow and tool selection: how to choose between Mermaid and manual element creation, and the recommended iteration workflow. Consult before building complex diagrams.

입력 스키마

{
  "type": "object",
  "properties": {}
}

출력 스키마

{
  "type": "object",
  "properties": {
    "guide": {
      "type": "string",
      "description": "Tool usage instructions text"
    }
  },
  "required": [
    "guide"
  ]
}
🟡add_elements(room_id, elements)

Creates elements on a canvas. Creates a new canvas if room_id is omitted, or adds to the existing canvas if room_id is provided. Use cases: wireframes, UI mockups, freeform illustrations, standalone shapes, and manual layouts that Mermaid does not cover well. For diagrams Mermaid can express, use add_elements_from_mermaid instead. Element types: rectangle, ellipse, diamond, arrow, line, freedraw, text, image. Rich text: the text field supports limited HTML for text elements and rectangle/ellipse/diamond shape labels. Supports the rich-text plugin HTML subset: <b>/<strong>, <i>/<em>, <u>, <br>, <div>/<p>, <ul>/<ol>/<li>, <a href>, <font color>, and <span style="color, background/background-color, font-size, font-family">. Use textAlign for left/center/right alignment; avoid unsupported HTML/CSS. TEXT IN SHAPES: use containerId on text element pointing to shape id. ARROWS: Position at EDGE of source shape. Auto-bound within 30px. Colors: strokeColor, backgroundColor (hex).

입력 스키마

{
  "type": "object",
  "properties": {
    "room_id": {
      "type": "string",
      "description": "Room ID of an existing canvas to add to. If the user is continuing a canvas already referenced in this conversation (by room_id, or a URL like ?room=[room_id] or /gdrive?id=[room_id]), pass it here. Omit to create a new canvas."
    },
    "elements": {
      "type": "array",
      "description": "Array of element definitions to create",
      "items": {
        "type": "object",
        "description": "Per-type required fields: rectangle/ellipse/diamond → x, y (width/height default to 100). text → x, y, text (width/height auto-sized; omit or set to 0). rectangle/ellipse/diamond may also include text, which creates a bound label. arrow/line → x, y, points (e.g. [[0,0],[100,0]]); optionally startBinding/endBinding instead of points. image → x, y, width, height, fileId. freedraw → x, y, points. type is inferred from fields if omitted (text field → text, points → line, fileId → image, else rectangle).",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique element ID. IMPORTANT: Always set explicit IDs for shapes that arrows will connect to!"
          },
          "type": {
            "type": "string",
            "enum": [
              "rectangle",
              "ellipse",
              "diamond",
              "arrow",
              "line",
              "freedraw",
              "text",
              "image"
            ],
            "description": "Element type. Inferred from fields if omitted: text field → text, points → line, fileId → image, else rectangle."
          },
          "x": {
            "type": "number",
            "description": "X coordinate (defaults to 0 if omitted)"
          },
          "y": {
            "type": "number",
            "description": "Y coordinate (defaults to 0 if omitted)"
          },
          "width": {
            "type": "number",
            "description": "Width (default: 100; omit for text — auto-sized)"
          },
          "height": {
            "type": "number",
            "description": "Height (default: 100; omit for text — auto-sized)"
          },
          "strokeColor": {
            "type": "string",
            "description": "Stroke color in hex (default: #1e1e1e)"
          },
          "backgroundColor": {
            "type": "string",
            "description": "Fill color in hex or 'transparent' (default: transparent)"
          },
          "fillStyle": {
            "type": "string",
            "description": "Fill style: solid, hachure, cross-hatch (default: solid)"
          },
          "strokeWidth": {
            "type": "number",
            "description": "Stroke width (default: 2)"
          },
          "roughness": {
            "type": "number",
            "description": "Roughness: 0=architect, 1=artist, 2=cartoonist (default: 1)"
          },
          "opacity": {
            "type": "number",
            "description": "Opacity 0-100 (default: 100)"
          },
          "text": {
            "type": "string",
            "description": "Text content. Required for type=text. For text elements and rectangle/ellipse/diamond shape labels, Supports the rich-text plugin HTML subset: <b>/<strong>, <i>/<em>, <u>, <br>, <div>/<p>, <ul>/<ol>/<li>, <a href>, <font color>, and <span style=\"color, background/background-color, font-size, font-family\">. Use textAlign for left/center/right alignment; avoid unsupported HTML/CSS. Also used as arrow label when set on an arrow."
          },
          "fontSize": {
            "type": "number",
            "description": "Font size (default: 20). Applies to text elements."
          },
          "fontFamily": {
            "type": "number",
            "description": "Font family: 5=Excalifont, 6=Nunito, 7=Lilita One, 8=Comic Shanns (default: 5). Applies to text elements."
          },
          "points": {
            "type": "array",
            "description": "Required for arrow/line/freedraw. Coordinates relative to element x,y. Example: [[0,0],[100,0]] for horizontal arrow.",
            "items": {
              "type": "array",
              "items": {
                "type": "number"
              }
            }
          },
          "containerId": {
            "type": "string",
            "description": "For type=text: ID of the shape this text is bound to. Set x,y to 0,0 for auto-centering inside the shape."
          },
          "startBinding": {
            "description": "For type=arrow: binds the arrow start to a shape. Use instead of or alongside points.",
            "type": "object",
            "properties": {
              "elementId": {
                "type": "string"
              },
              "focus": {
                "type": "number"
              },
              "gap": {
                "type": "number"
              }
            },
            "required": [
              "elementId",
              "focus",
              "gap"
            ]
          },
          "endBinding": {
            "description": "For type=arrow: binds the arrow end to a shape. Use instead of or alongside points.",
            "type": "object",
            "properties": {
              "elementId": {
                "type": "string"
              },
              "focus": {
                "type": "number"
              },
              "gap": {
                "type": "number"
              }
            },
            "required": [
              "elementId",
              "focus",
              "gap"
            ]
          },
          "label": {
            "type": "string",
            "description": "For type=arrow: text label displayed on the arrow"
          }
        },
        "required": [
          "x",
          "y"
        ]
      }
    }
  },
  "required": [
    "elements"
  ]
}

출력 스키마

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Canvas room URL"
    },
    "room_id": {
      "type": "string",
      "description": "Canvas room ID"
    },
    "isNew": {
      "type": "boolean",
      "description": "Whether a new canvas was created"
    },
    "collabUrl": {
      "type": "string",
      "description": "Collaboration server URL for Socket.IO"
    },
    "elements": {
      "type": "array",
      "description": "All elements currently on the canvas",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "appState": {
      "type": "object",
      "description": "Canvas app state (viewBackgroundColor, etc.)",
      "properties": {
        "viewBackgroundColor": {
          "type": "string"
        }
      },
      "additionalProperties": true
    }
  },
  "required": [
    "url",
    "isNew",
    "collabUrl",
    "elements",
    "appState"
  ]
}
🔴update_elements(room_id, elements)

Update elements on a canvas. Requires room_id from a previous Canvs tool result. Pass elements array with id and fields to update. IMPORTANT: in each update object ONLY `id` is required; all other fields are optional patch fields. Include ONLY elements that need changes; elements omitted from the request remain unchanged on the board. Prefer this tool for SMALL edits to existing diagrams (rename/move/restyle a few elements), typically after query_elements.

입력 스키마

{
  "type": "object",
  "properties": {
    "room_id": {
      "type": "string",
      "description": "Room ID from a previous Canvs tool result. If you only have a URL, extract it from https://[host]/?room=[room_id] or https://[host]/gdrive?id=[room_id]."
    },
    "elements": {
      "type": "array",
      "description": "Array of element updates (each must have id)",
      "items": {
        "type": "object",
        "description": "Patch object: only id is required. Include only the fields you want to change.",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID of the element to update (required)"
          },
          "type": {
            "type": "string",
            "enum": [
              "rectangle",
              "ellipse",
              "diamond",
              "arrow",
              "line",
              "freedraw",
              "text",
              "image"
            ],
            "description": "New element type"
          },
          "x": {
            "type": "number",
            "description": "New X coordinate"
          },
          "y": {
            "type": "number",
            "description": "New Y coordinate"
          },
          "width": {
            "type": "number",
            "description": "New width"
          },
          "height": {
            "type": "number",
            "description": "New height"
          },
          "strokeColor": {
            "type": "string",
            "description": "New stroke color (hex)"
          },
          "backgroundColor": {
            "type": "string",
            "description": "New fill color (hex or 'transparent')"
          },
          "fillStyle": {
            "type": "string",
            "description": "New fill style (solid, hachure, cross-hatch)"
          },
          "strokeWidth": {
            "type": "number",
            "description": "New stroke width"
          },
          "roughness": {
            "type": "number",
            "description": "New roughness (0=architect, 1=artist, 2=cartoonist)"
          },
          "opacity": {
            "type": "number",
            "description": "New opacity (0-100)"
          },
          "text": {
            "type": "string",
            "description": "New text content. For text elements and rectangle/ellipse/diamond shape labels, Supports the rich-text plugin HTML subset: <b>/<strong>, <i>/<em>, <u>, <br>, <div>/<p>, <ul>/<ol>/<li>, <a href>, <font color>, and <span style=\"color, background/background-color, font-size, font-family\">. Use textAlign for left/center/right alignment; avoid unsupported HTML/CSS. Shape text updates the bound label."
          },
          "fontSize": {
            "type": "number",
            "description": "New font size (for text elements)"
          },
          "fontFamily": {
            "type": "number",
            "description": "New font family (5=Excalifont, 6=Nunito, 7=Lilita One, 8=Comic Shanns)"
          },
          "points": {
            "type": "array",
            "description": "New points array (for arrow/line/freedraw elements)",
            "items": {
              "type": "array",
              "items": {
                "type": "number"
              }
            }
          },
          "locked": {
            "type": "boolean",
            "description": "Lock/unlock the element"
          }
        },
        "required": [
          "id"
        ]
      }
    }
  },
  "required": [
    "room_id",
    "elements"
  ]
}

출력 스키마

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Canvas room URL"
    },
    "room_id": {
      "type": "string",
      "description": "Canvas room ID"
    },
    "isNew": {
      "type": "boolean",
      "description": "Whether a new canvas was created"
    },
    "collabUrl": {
      "type": "string",
      "description": "Collaboration server URL for Socket.IO"
    },
    "elements": {
      "type": "array",
      "description": "All elements currently on the canvas",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "appState": {
      "type": "object",
      "description": "Canvas app state (viewBackgroundColor, etc.)",
      "properties": {
        "viewBackgroundColor": {
          "type": "string"
        }
      },
      "additionalProperties": true
    }
  },
  "required": [
    "url",
    "isNew",
    "collabUrl",
    "elements",
    "appState"
  ]
}
🔴delete_elements(room_id, ids)

Delete elements from a canvas. Requires room_id from a previous Canvs tool result. Pass ids array of element IDs to delete.

입력 스키마

{
  "type": "object",
  "properties": {
    "room_id": {
      "type": "string",
      "description": "Room ID from a previous Canvs tool result. If you only have a URL, extract it from https://[host]/?room=[room_id] or https://[host]/gdrive?id=[room_id]."
    },
    "ids": {
      "type": "array",
      "description": "Array of element IDs to delete",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "room_id",
    "ids"
  ]
}

출력 스키마

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Canvas room URL"
    },
    "room_id": {
      "type": "string",
      "description": "Canvas room ID"
    },
    "isNew": {
      "type": "boolean",
      "description": "Whether a new canvas was created"
    },
    "collabUrl": {
      "type": "string",
      "description": "Collaboration server URL for Socket.IO"
    },
    "elements": {
      "type": "array",
      "description": "All elements currently on the canvas",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "appState": {
      "type": "object",
      "description": "Canvas app state (viewBackgroundColor, etc.)",
      "properties": {
        "viewBackgroundColor": {
          "type": "string"
        }
      },
      "additionalProperties": true
    }
  },
  "required": [
    "url",
    "isNew",
    "collabUrl",
    "elements",
    "appState"
  ]
}
🟢query_elements(room_id, type, filter)

Query elements on a canvas. Requires room_id from a previous Canvs tool result. Returns elements matching optional filters. Use this before update_elements when making small edits to existing diagrams. If no browser has the canvas open, returns an error — ask the user to open the canvas URL in their browser and retry.

입력 스키마

{
  "type": "object",
  "properties": {
    "room_id": {
      "type": "string",
      "description": "Room ID from a previous Canvs tool result. If you only have a URL, extract it from https://[host]/?room=[room_id] or https://[host]/gdrive?id=[room_id]."
    },
    "type": {
      "type": "string",
      "enum": [
        "rectangle",
        "ellipse",
        "diamond",
        "arrow",
        "line",
        "freedraw",
        "text",
        "image"
      ],
      "description": "Filter by element type"
    },
    "filter": {
      "type": "object",
      "description": "Additional key-value filters (e.g., {locked: true})"
    }
  },
  "required": [
    "room_id"
  ]
}

출력 스키마

{
  "type": "object",
  "properties": {
    "count": {
      "type": "number",
      "description": "Number of matching elements"
    },
    "elements": {
      "type": "array",
      "description": "Matching elements"
    }
  },
  "required": [
    "count",
    "elements"
  ]
}
🟡add_elements_from_mermaid(room_id, mermaid, config, timeout)

Creates diagram elements from a Mermaid definition. Creates a new canvas if room_id is omitted, or adds to the existing canvas if room_id is provided. Preferred over add_elements for new diagrams and large changes to existing diagrams whenever the content can be represented in Mermaid. Supports: flowchart, graph, flowchart-elk, sequenceDiagram, classDiagram, classDiagram-v2, stateDiagram, stateDiagram-v2, erDiagram, journey, gantt, pie, gitGraph, mindmap, timeline, C4Context, C4Container, C4Component, C4Dynamic, C4Deployment, sankey, sankey-beta, quadrantChart, xychart, xychart-beta, requirement, requirementDiagram, kanban, architecture, block, block-beta, packet, packet-beta, radar-beta, treemap, info. Example: "flowchart TD\n A[Start] --> B{Decision}\n B -->|Yes| C[OK]\n B -->|No| D[Cancel]"

입력 스키마

{
  "type": "object",
  "properties": {
    "room_id": {
      "type": "string",
      "description": "Room ID of an existing canvas to add to. If the user is continuing a canvas already referenced in this conversation (by room_id, or a URL like ?room=[room_id] or /gdrive?id=[room_id]), pass it here. Omit to create a new canvas."
    },
    "mermaid": {
      "type": "string",
      "description": "Mermaid diagram definition. Prefer converting compatible user requests into Mermaid instead of using add_elements."
    },
    "config": {
      "type": "object",
      "description": "Optional Mermaid rendering config. flowchart.curve is handled automatically.",
      "properties": {
        "flowchart": {
          "type": "object",
          "properties": {
            "curve": {
              "type": "string",
              "enum": [
                "basis",
                "linear"
              ],
              "description": "Edge curve style (handled server-side; no need to set explicitly)."
            }
          }
        }
      }
    },
    "timeout": {
      "type": "number",
      "description": "Room lifetime in seconds (default: 3600, max: 86400). Only used when creating new canvas",
      "default": 3600
    }
  },
  "required": [
    "mermaid"
  ]
}

출력 스키마

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Canvas room URL"
    },
    "room_id": {
      "type": "string",
      "description": "Canvas room ID"
    },
    "isNew": {
      "type": "boolean",
      "description": "Whether a new canvas was created"
    },
    "collabUrl": {
      "type": "string",
      "description": "Collaboration server URL for Socket.IO"
    },
    "elements": {
      "type": "array",
      "description": "All elements currently on the canvas",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "appState": {
      "type": "object",
      "description": "Canvas app state (viewBackgroundColor, etc.)",
      "properties": {
        "viewBackgroundColor": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "pendingMermaid": {
      "type": "object",
      "description": "Mermaid definition pending client-side rendering",
      "properties": {
        "definition": {
          "type": "string",
          "description": "Mermaid diagram source"
        },
        "config": {
          "type": "object",
          "additionalProperties": true
        }
      }
    }
  },
  "required": [
    "url",
    "isNew",
    "collabUrl",
    "elements",
    "appState"
  ]
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 6개
검증됨버전이 기록되지 않음도구 6개