mcp-registry/io.github.abelce/codepic · v0.1.0
Also listed as glama/abelce/codepic
As of 2026-10-26 13:30 UTC, the Abelce Codepic MCP server is up with a Glimind reliability score of 100/100 (grade A). Over the last 30 days it answered 100% of Glimind's liveness checks. It had 1 outage in 90 days, with a median recovery of 2 minutes.
AI agent draws editable hand-drawn diagrams (flowchart, ER, architecture) via MCP, not static images
Claude Code
claude mcp add --transport http abelce-codepic-mcp-server https://codepic.cc/api/mcp/mcp
Claude Desktop · Windsurf · Cline (mcpServers JSON)
{
"mcpServers": {
"abelce-codepic-mcp-server": {
"type": "http",
"url": "https://codepic.cc/api/mcp/mcp"
}
}
}
Third-party server, listed as discovered. Review its source before installing.
2 tool definition(s) exceed ~1,200 tokens each (largest: update_diagram, ~2,447).
Move long reference material out of descriptions (link a doc or expose a resource), drop repeated examples, and collapse large enums. Trimming these to ~600 tokens saves ~3,586 tokens every session. How to fix →
7 of 7 tool(s) carry no readOnlyHint/destructiveHint annotations.
Annotate read-only tools with {"readOnlyHint": true}. Agents and gateways can then run them without a confirmation prompt, and route around destructive ones. How to fix →
3 tool(s) look like they change state (create/send/delete/pay…) but declare no destructiveHint.
Set annotations {"readOnlyHint": false, "destructiveHint": true|false, "idempotentHint": …}. Clients use these to ask the user before a side effect and to auto-approve safe reads. How to fix →
No tool declares an outputSchema.
Declare outputSchema and return structuredContent (MCP 2025-06-18+). Agents can then parse results without guessing, and chain tools reliably. How to fix →
Paste-ready definitions with the problems above fixed. Changes marked verify need a human look. All of them as JSON: /v1/readiness/mcp-registry%2Fio.github.abelce%2Fcodepic/fixes
{
"name": "create_diagram",
"description": "Create a custom CodePic hand-drawn style diagram by specifying nodes and edges. Requires API Key authentication. Returns a public view URL.\n\n**THIS IS THE DEFAULT TOOL FOR ANY USER-DESCRIBED DIAGRAM.** Whenever the user describes a diagram they want (\"draw an A/B test flowchart\", \"帮我画一个登录流程\", \"a system architecture with a load balancer and 3 servers\", etc.), build it here from their description. Do NOT fall back to `create_from_template` / `list_templates` unless the user explicitly asked for a ",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"nodes"
],
"properties": {
"name": {
"type": "string",
"description": "Document name"
},
"edges": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"sourceId",
"targetId"
],
"properties": {
"id": {
"type": "string",
"description": "Unique edge ID"
},
"label": {
"type": "string",
"description": "Edge label text"
},
"sourceId": {
"type": "string",
"description": "Source node ID"
},
"targetId": {
"type": "string",
"description": "Target node ID"
}
},
"additionalProperties": false
},
"description": "Array of connector edges between nodes"
},
"nodes": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"text",
"x",
"y"
],
"properties": {
"x": {
"type": "number",
"description": "X position"
},
"y": {
"type": "number",
"description": "Y position"
},
"id": {
"type": "string",
"description": "Unique node ID"
},
"data": {
"type": "object",
"description": "Type-specific state data. Call get_shape_docs for the full field list. Examples: select→{options:[{id,label}],selectedId,open}, checkbox/radio→{checked}, switch→{on}, slider→{min,max,value}, input/textarea→{placeholder}, link→{href}, icon→{iconName}, triangle→{triangleDirection:'up'|'down'|'left'|'right'}, callout→{calloutTailX,calloutBodyRatio}.",
"additionalProperties": {}
},
"name": {
"type": "string",
"maxLength": 80,
"description": "Stable semantic name for MCP/Agent understanding, e.g. 'payment-service'."
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 48,
"minLength": 1
},
"maxItems": 12,
"description": "Instance-level semantic tags for future MCP/Agent reads, e.g. ['backend','critical','pii']. Use get_shape_catalog tags for shape selection; use this field for the node's role in this diagram."
},
"text": {
"anyOf": [
{
"type": "object",
"required": [
"kind",
"version",
"blocks"
],
"properties": {
"kind": {
"type": "string",
"const": "rich-text"
},
"blocks": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"type",
"runs"
],
"properties": {
"runs": {
"type": "array",
"items": {
"type": "object",
"required": [
"text"
],
"properties": {
"href": {
"type": "string",
"format": "uri"
},
"text": {
"type": "string"
},
"style": {
"type": "object",
"properties": {
"fontSize": {
"type": "number",
"exclusiveMinimum": 0
},
"fontColor": {
"type": "string",
"minLength": 1
},
"fontStyle": {
"type": "string",
"minLength": 1
},
"fontFamily": {
"type": "string",
"minLength": 1
},
"fontWeight": {
"type": "string",
"minLength": 1
},
"textDecoration": {
"enum": [
"none",
"underline",
"line-through"
],
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"minItems": 1
},
"type": {
"type": "string",
"const": "paragraph"
},
"textAlign": {
"enum": [
"left",
"center",
"right"
],
"type": "string"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type",
"listType",
"runs"
],
"properties": {
"runs": {
"type": "array",
"items": {
"$ref": "#/properties/nodes/items/properties/text/anyOf/0/properties/blocks/items/anyOf/0/properties/runs/items"
},
"minItems": 1
},
"type": {
"type": "string",
"const": "list-item"
},
"level": {
"type": "integer",
"maximum": 5,
"minimum": 0
},
"listType": {
"enum": [
"ordered",
"unordered"
],
"type": "string"
},
"textAlign": {
"enum": [
"left",
"center",
"right"
],
"type": "string"
}
},
"additionalProperties": false
}
]
},
"minItems": 1
},
"version": {
"type": "number",
"const": 1
}
},
"additionalProperties": false
},
{
"type": "string"
}
],
"description": "Text content. Use RichTextContent for normal shapes; code/input use a raw string; frame uses a string title."
},
"type": {
"enum": [
"rect",
"ellipse",
"circle",
"diamond",
"parallelogram",
"document",
"cylinder",
"hexagon",
"triangle",
"callout",
"cloud",
"terminator",
"cross",
"off-page-connector",
"actor",
"note",
"component",
"end-node",
"start-node",
"fork-bar",
"predefined-process",
"delay",
"manual-input",
"stored-data",
"text",
"textarea",
"link",
"icon",
"image",
"frame",
"package",
"swimlane",
"rounded-rect",
"table",
"button",
"button-primary",
"button-secondary",
"button-destructive",
"button-ghost",
"input",
"select",
"checkbox",
"radio",
"switch",
"slider",
"progress",
"server",
"load-balancer",
"firewall",
"container",
"msg-queue",
"queue",
"router",
"lambda",
"cache",
"pod",
"browser-frame",
"mobile-frame",
"code"
],
"type": "string",
"description": "Shape type (default: rect). Call get_shape_docs for full per-type field reference. Common: rect/rounded-rect=card, diamond=decision, parallelogram=I/O, cylinder=database, hexagon=service, actor=user, frame=container group, button-primary=blue CTA, button-destructive=danger action. Architecture: server, load-balancer, firewall, container, msg-queue, router, lambda, cache, pod. UI wireframe: input, select, checkbox, radio, switch, slider. Mockups: browser-frame, mobile-frame. Code: code (syntax-highlighted code block, set data.language and data.theme; calculate width/height from text content: charW=fontSize*0.6, width=lineNumW+32+maxLineChars*charW, height=24+lineCount*fontSize*lineHeight)."
},
"width": {
"type": "number",
"description": "Width (default: 200)"
},
"height": {
"type": "number",
"description": "Height (default: 80)"
},
"corners": {
"type": "array",
"items": [
{
"type": "number"
},
{
"type": "number"
},
{
"type": "number"
},
{
"type": "number"
}
],
"maxItems": 4,
"minItems": 4,
"description": "Border radius [topLeft, topRight, bottomRight, bottomLeft] (default: [0,0,0,0]). Applies to ALL shape types — use to round corners for a more polished look. Rect/frame/input/select/button: [8,8,8,8]–[16,16,16,16]. Rough style (roughness≥1): small corners (4–8). Smooth (roughness:0): larger corners (12–20). Other shapes (diamond, hexagon, etc.) can also use corners for subtle rounding."
},
"opacity": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Opacity 0-1 (default: 1)"
},
"fontSize": {
"type": "number",
"description": "Font size (default: 16)"
},
"parentId": {
"type": "string",
"description": "Parent container node ID. Nest this node inside another node (any type can be a container). The parent automatically becomes containable=true so users can keep dragging elements into it. Call get_shape_catalog with tag='container-capable' to choose a suitable parent shape. Provide x/y as absolute canvas coordinates — they are auto-converted to parent-relative coordinates. WHEN TO USE: whenever multiple nodes logically belong to the same module, region, or component, wrap them in a shared container and set parentId on each child. This lets users reposition the whole group and drag additional elements into it."
},
"rotation": {
"type": "number",
"description": "Rotation angle in radians (default: 0)"
},
"fillColor": {
"type": "string",
"description": "Fill color, e.g. '#e3f2fd'"
},
"fillStyle": {
"enum": [
"none",
"solid",
"hachure",
"cross-hatch"
],
"type": "string",
"description": "Fill style (default: solid)"
},
"fontColor": {
"type": "string",
"description": "Text color (default: '#333333')"
},
"fontStyle": {
"enum": [
"normal",
"italic"
],
"type": "string",
"description": "Font style (default: 'normal')"
},
"roughness": {
"type": "number",
"maximum": 3,
"minimum": 0,
"description": "Hand-drawn roughness 0-3, 0=smooth, 3=very rough (default: 1)"
},
"textAlign": {
"enum": [
"left",
"center",
"right"
],
"type": "string",
"description": "Horizontal text alignment (default: 'center')"
},
"fontFamily": {
"type": "string",
"description": "Font family (default: 'Inter, sans-serif')"
},
"fontWeight": {
"enum": [
"normal",
"bold"
],
"type": "string",
"description": "Font weight (default: 'bold')"
},
"lineHeight": {
"type": "number",
"description": "Line height multiplier (default: 1.2)"
},
"description": {
"type": "string",
"maxLength": 500,
"description": "Concise semantic purpose of this node, independent of its visible text."
},
"strokeColor": {
"type": "string",
"description": "Stroke color, e.g. '#1565c0'"
},
"strokeWidth": {
"type": "number",
"description": "Stroke width in px (default: 2)"
},
"verticalAlign": {
"enum": [
"top",
"center",
"bottom"
],
"type": "string",
"description": "Vertical text alignment (default: 'center')"
}
},
"additionalProperties": false
},
"description": "Array of shape nodes to place on the canvas"
},
"backgroundColor": {
"type": "string",
"description": "Canvas background color (default: '#f8f9fa')"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false
},
"title": "Create Diagram"
}{
"name": "create_from_template",
"description": "Create a new CodePic diagram from a predefined template. Requires API Key authentication. Returns a public view URL and edit URL.\n\n**STRICT USAGE RULE — READ BEFORE CALLING:**\nOnly call this tool when the user has **explicitly** asked to use a template. Explicit signals include phrases like: \"use a template\", \"from template\", \"用模板\", \"从模板创建\", \"list templates and pick one\", or the user directly naming/selecting a template slug.\n\nIf the user merely describes a diagram they want (e.g. \"draw an A/B t",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug"
],
"properties": {
"name": {
"type": "string",
"description": "Document name (defaults to template name)"
},
"slug": {
"type": "string",
"description": "Template slug (e.g. 'flowchart', 'erd', 'kanban'). Call list_templates to see all."
},
"locale": {
"enum": [
"en",
"zh"
],
"type": "string",
"description": "Language for template content (default: en)"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false
},
"title": "Create from Template"
}{
"name": "get_diagram",
"description": "Fetch the current state of an existing CodePic diagram. Returns a compact summary of all elements with their IDs, types, positions, and parent-child relationships. Use this before update_diagram when you need to: add nested children to existing containers, make targeted edits to specific elements, or understand the current structure. Requires API Key authentication.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"documentId"
],
"properties": {
"documentId": {
"type": "string",
"description": "Document ID to fetch"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true
},
"title": "Get Diagram"
}Get an email or webhook when this server's readiness drops by 10+ points, tool-poisoning text appears, or a tool breaks:
curl -X POST https://glimind.com/v1/subscriptions -H 'content-type: application/json' -d '{"tools":["mcp-registry/io.github.abelce/codepic"],"email":"[email protected]"}'Agents: watch_tool({"toolId": "mcp-registry/io.github.abelce/codepic"}) over MCP.
update_diagram ~2,447 tokenscreate_diagram ~2,339 tokenscreate_from_template ~285 tokensget_shape_catalog ~257 tokenslist_templates ~198 tokensStatic checks of the advertised tools/list (schema, descriptions, annotations, tool-poisoning patterns, names, size) plus observed protocol, uptime, latency and contract changes. Read-only: no tool is ever called. Weights: schema 15, docs 20, safety 15, efficiency 15, compatibility 15, protocol 5, reliability 10, stability 5. Token counts are estimates (~3.6 characters per token).
Operator? Fix these, then re-check live. Embed the readiness badge:
[](https://glimind.com/server/mcp-registry%2Fio.github.abelce%2Fcodepic?ref=badge)
<a href="https://glimind.com/server/mcp-registry%2Fio.github.abelce%2Fcodepic?ref=badge"><img src="https://glimind.com/v1/readiness/badge/mcp-registry%2Fio.github.abelce%2Fcodepic.svg" alt="MCP agent-readiness"></a>
.. image:: https://glimind.com/v1/readiness/badge/mcp-registry%2Fio.github.abelce%2Fcodepic.svg :target: https://glimind.com/server/mcp-registry%2Fio.github.abelce%2Fcodepic?ref=badge :alt: MCP agent-readiness
Glimind records every version of this server's tool definitions in a signed, append-only transparency log. Current manifest sha256:67365a89d0262bc0…, first seen 2026-10-17, included at leaf 874 of 73,142. Version history · verify what your client received.
Compare: most reliable media servers · most reliable productivity servers · most reliable files servers · most reliable knowledge servers
Glimind tells agents whether a server is up right now and how to call it, then fails over to a live alternative when it isn't.
Claude Code
claude mcp add --transport http glimind https://glimind.com/mcp
Claude Desktop · Windsurf · Cline (mcpServers JSON)
{
"mcpServers": {
"glimind": {
"type": "http",
"url": "https://glimind.com/mcp"
}
}
}
As of 2026-10-26 13:30 UTC, the Abelce Codepic MCP server is up with a Glimind reliability score of 100/100 (grade A). Over the last 30 days it answered 100% of Glimind's liveness checks. It had 1 outage in 90 days, with a median recovery of 2 minutes.
Abelce Codepic MCP server advertises 7 tools, including create_diagram, create_from_template, get_diagram, get_shape_catalog, get_shape_docs.
Point your MCP client at this streamable-http endpoint: https://codepic.cc/api/mcp/mcp
Glimind scanned all 7 tool definitions for tool-poisoning patterns — hidden or invisible characters, instructions that override the model, concealment from the user, requests to read credential or MCP config files, conversation exfiltration and cross-tool shadowing — and found none. This checks what the server tells the model, not what its code does; review the source before granting access to sensitive data.
Status page: 90-day uptime, every outage and how long it lasted.
Claim this listing to get the Verified operator marker, a remediation checklist and owner analytics, or embed the live badge from any of the tool pages above. Maintainers: alerts, deploy attestation and monthly reports.
Status is an automated estimate from Glimind's liveness checks (handshake and tool listing only; no tool is ever called) and may lag or differ from your network. Glimind is not affiliated with this server or its operator. Operator? Request a correction or opt out at https://glimind.com/opt-out.