Yertle
FreeNot checkedManage diagrams and nodes in the Yertle diagramming application.
About
Manage diagrams and nodes in the Yertle diagramming application.
README
yertle-mcp is a small MCP server that exposes Yertle's APIs to an LLM. It runs over stdio, authenticates against the Flow REST API, and registers MCP tools and resources for:
- creating organizations and nodes
- listing and searching nodes
- reading node state from Flow
- pushing diagram state changes back to Flow
- creating and listing branches
The codebase is intentionally thin. Most files do one job:
server.pystarts the stdio MCP serverapp.pybuilds the sharedFastMCPinstance and lifecycleflow_client.pymanages auth, retries, and high-level API operationsclient/api.pycontains one-function-per-endpoint HTTP wrappersclient/push.pymerges and validates partial state before pushclient/transform.pyreshapes backend responses into LLM-friendly outputtools/andresources/register the MCP surface area
How It Works
At startup, server.py imports app.py, then imports tools and resources. Those imports matter because registration is decorator-driven.
During server lifespan:
Configreads environment variables.FlowClientcreates anhttpx.AsyncClient.- The client signs in with email/password and stores JWTs.
- MCP tools and resources use the shared client through helper accessors in
app.py.
For write operations, especially push_node_state, the server does not send the LLM's partial state directly to the backend. Instead it:
- fetches the current complete node state
- merges the incoming partial update onto that snapshot
- validates required fields
- auto-centers new visual properties when present
- applies defaults such as node transparency and connection edges
- pushes the merged full snapshot to Flow
That merge step is the main safety feature in this repository.
Environment
Required:
FLOW_USER_EMAILFLOW_USER_PASSWORD
Optional:
FLOW_API_URLdefaults tohttp://localhost:8000FLOW_DEFAULT_ORG_IDlets tools omitorg_id
Example:
export FLOW_API_URL=http://localhost:8000
export [email protected]
export FLOW_USER_PASSWORD=secret
export FLOW_DEFAULT_ORG_ID=<org-uuid>
Running
Run the MCP server with:
python3 server.py
The server is configured for stdio transport, which matches how MCP hosts usually launch it.
MCP Surface
Resources:
flow://orgsflow://orgs/{org_id}/nodesflow://orgs/{org_id}/nodes/{node_id}/completeflow://orgs/{org_id}/nodes/{node_id}/canvas
Tools:
create_organizationcreate_nodepush_node_statedelete_nodesearch_nodescreate_branchlist_branches
Push Semantics
push_node_state is designed around Flow's full-snapshot push API, but the MCP interface accepts partial updates.
The server preserves existing state unless the caller explicitly replaces it:
node,tags, anddirectoriesare replaced if includedvisual_propertiesare merged bychild_node_idconnectionsare merged byid
Two important rules are enforced by convention and validation:
- new or updated visual properties must include
child_node_id - connections must include
id,from_child_id, andto_child_id
For new connections, the intended temporary format is temp-<label>, and the backend returns the real IDs.
Layout Assumptions
The instruction block in app.py encodes layout policy for the LLM:
- diagrams should flow left to right
position_xincreases to the rightposition_yincreases downward- node size should usually be
200x100 - horizontal spacing should usually be
250 - vertical spacing should usually be
130 - diagrams should stay compact when possible
The server also warns the LLM not to resend visual properties for existing nodes unless the user explicitly wants a rearrangement.
File Map
.
├── app.py
├── config.py
├── flow_client.py
├── server.py
├── client/
│ ├── api.py
│ ├── push.py
│ └── transform.py
├── resources/
│ ├── nodes.py
│ └── orgs.py
└── tools/
├── node.py
└── org.py
Extending The Server
To add a new capability:
- add a low-level REST wrapper in
client/api.py - expose it through
FlowClientinflow_client.py - register a new MCP tool or resource in
tools/orresources/ - import that module through the package
__init__.pyso decorator registration happens
If the endpoint returns backend-native state that is hard for an LLM to use, add a transformation in client/transform.py rather than inflating the tool/resource layer.
Internal Design Notes
- The repo uses a shared global
serverinstance fromapp.py. server._flow_configandserver._flow_clientare attached during lifespan startup.- Errors are normalized in
FlowClient._handle_response()into readable runtime exceptions. - Auth retry is centralized in
FlowClient._with_retry(), so individual API wrappers stay simple.
For a deeper walkthrough of the request flow and module boundaries, see ARCHITECTURE.md.
Installing Yertle
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/model-context/yertle-mcpFAQ
Is Yertle MCP free?
Yes, Yertle MCP is free — one-click install via Unyly at no cost.
Does Yertle need an API key?
No, Yertle runs without API keys or environment variables.
Is Yertle hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Yertle in Claude Desktop, Claude Code or Cursor?
Open Yertle on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectCompare Yertle with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All development MCPs
