freeplane-mcp
freeplane-mcp
AI 에이전트(예: Claude Desktop, Cursor, opencode)가 freeplane_plugin_grpc gRPC 플러그인을 통해 실행 중인 Freeplane 마인드 맵을 읽고 수정할 수 있게 해주는 MCP 서버입니다.
일회성 “Markdown → image” 방식의 MCP 서버와 달리, 변경 사항은 현재 열려 있는 Freeplane 맵에 실시간으로 적용됩니다.
아키텍처
MCP client (Claude / Cursor / opencode)
│
│ stdio or Streamable HTTP (MCP SDK)
▼
freeplane-mcp (Python, FastMCP)
│
│ gRPC (grpcio)
▼
Freeplane + org.freeplane.plugin.grpc
(port 50051)Related MCP server: mindmapio-mcp
요구 사항
Python 3.10+
gRPC 플러그인이 설치된 상태로 실행 중인 Freeplane
기본 Freeplane gRPC 포트:
50051
설치
cd ~/spaces/freeplane-mcp
python -m venv .venv
.venv/bin/pip install -e .실행
stdio
Claude Desktop, Cursor, opencode 등에서 사용하는 기본 전송 방식:
.venv/bin/freeplane-mcpStreamable HTTP
.venv/bin/freeplane-mcp --transport http --port 8000설정
환경 변수 | CLI 옵션 | 기본값 |
|
|
|
|
|
|
| — |
|
|
|
|
|
|
|
|
|
|
MCP 도구
export_map
현재 맵을 정규 JSON으로 내보냅니다.
지원되는 필드는 다음과 같습니다:
text, id, children, note, detail, link, tags, icons, attributes, background_color, folded, relationships.
import_map
정규 JSON에서 마인드 맵을 가져옵니다.
지원되는 insert_mode 값:
root— 맵 루트 아래에 삽입합니다. 기본값node—insert_node_id아래에 삽입합니다selected— 현재 선택된 노드 아래에 삽입합니다
테스트
현재 맵 내보내기:
.venv/bin/python -c "
import sys; sys.path.insert(0, '.')
from freeplane_mcp.freeplane_grpc import FreeplaneGrpcClient
c = FreeplaneGrpcClient()
print(c.export_map())
"맵을 가져온 후 다시 내보내기:
.venv/bin/python -c "
import sys; sys.path.insert(0, '.')
from freeplane_mcp.freeplane_grpc import FreeplaneGrpcClient
c = FreeplaneGrpcClient()
c.import_map('{\"text\": \"Hello from MCP\", \"children\": [{\"text\": \"child 1\"}]}')
print(c.export_map())
"MCP 클라이언트 설정
stdio 구성 예시:
{
"mcpServers": {
"freeplane": {
"command": "/home/bebebeka/spaces/freeplane-mcp/.venv/bin/freeplane-mcp"
}
}
}HTTP 구성:
{
"mcpServers": {
"freeplane": {
"url": "http://127.0.0.1:8000/mcp"
}
}
}JSON 형식 정보
정규 JSON 형식은 플러그인의 JsonHelper.java에 정의되어 있습니다.
_fp_import_root_node를 지원합니다:
{"_fp_import_root_node": "root", "mindmap": {...}}맵 루트 아래에 삽입됩니다.
{"_fp_import_root_node": "ID_...", "mindmap": {...}}특정 노드 아래에 삽입됩니다.
래퍼 없이 삽입하면 맵은 현재 선택된 노드 아래에 삽입됩니다.
이전 형식도 지원됩니다:
{"node text": {"child node": "note"}}라이선스
MIT
Available Tools
2 toolsexport_mapA
Export the current Freeplane mind map to canonical JSON.
Returns the whole map as a JSON string. Each node has at least "text" and "id"; optional fields include "children", "note", "detail", "link", "tags", "icons", "attributes", "background_color", "folded" and "relationships".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does well by disclosing that the return value is a complete JSON string representation of the map and listing node fields. It implicitly signals a read-only operation through the word 'export' but does not explicitly state that nothing is modified, which is a minor omission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a single purpose-defining first sentence followed by concise details about output shape and optional fields. No redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a zero-parameter export tool: it states the action, the object, the output format, and the node shape. An output schema exists to further document return values. It could briefly relate to import_map or confirm non-destructiveness, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is 100%, so there is no parameter documentation burden. The description appropriately notes the operation applies to the current map, which supplies the only relevant context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Export the current Freeplane mind map to canonical JSON." This clearly distinguishes it from the sibling import_map, and the following details about JSON structure leave no doubt about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool (whenever the current mind map needs to be exported as JSON), and the sibling tool name import_map makes the alternative obvious. However, it does not explicitly call out import_map or state conditions for choosing one over the other, so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_mapA
Import a mind map (canonical JSON) into the running Freeplane instance.
| Name | Required | Description | Default |
|---|---|---|---|
| map_json | Yes | Canonical JSON of the mind map root node (see export_map for the format). Accepts either a JSON string or, on clients that support structured arguments, the object itself. | |
| insert_mode | No | Where to attach the imported subtree. One of "root" (attach under the map root), "node" (attach under insert_node_id) or "selected" (attach under the currently selected node). Defaults to "root". | root |
| insert_node_id | No | Node ID required when insert_mode="node". |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral burden. It says 'Import', which implies mutation, but it does not disclose whether importing replaces, appends, or merges the current map; it also does not mention prerequisites, response shape, or potential side effects. The description adds only the 'running instance' context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with no filler. The verb, object, format, and destination are all front-loaded, making it instantly scannable by an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is overall simple enough to be called correctly from the description plus the comprehensive input schema and presence of an output schema. The main gap is the lack of behavioral context around import side effects, but this is not essential for basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% parameter coverage and already explains map_json, insert_mode, and insert_node_id in detail. The description adds little beyond repeating 'canonical JSON', so the schema is doing the heavy lifting. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Import'), resource ('mind map'), and target ('running Freeplane instance'). It also distinguishes itself from the sibling export_map by making the directionality explicit: this tool brings data in through canonical JSON, while export_map would presumably produce it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context that this tool is for injecting a canonical JSON mind map into a live Freeplane instance. It does not explicitly say when to use export_map instead or mention exclusions, but the import/export contrast is strongly inferable from the sibling name and the mention of the canonical JSON format.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.1.0- First observed
export_map - First observed
import_map
TDQS
Scored across 2 tools
export_map and import_map have clearly opposite purposes and there is no overlap. An agent can unambiguously determine which to call based on the direction of data transfer.
Both tool names follow the same verb_noun pattern: export_map and import_map. The naming is simple, predictable, and perfectly matches the server's purpose.
Two tools is a very minimal set, but each covers one half of the map exchange workflow. It feels slightly thin for a general MCP server, though the scope is focused.
The two tools provide a complete round-trip: export the map as JSON and import it back. For this server's apparent purpose of whole-map synchronization, there are no obvious gaps.
Maintenance
Related MCP Connectors
Create, edit, restructure, import and export Atlas Red mind maps from any MCP client. Free.
Turn outlines and hierarchical notes into interactive mind maps through a hosted remote MCP server.
Create, edit, and organize MindMeister mind maps from your AI assistant.
Create and edit roadmaps with JSON or markup; share edit and view links from AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to read and write XMind mind map files, allowing generation, editing, and analysis of mind maps directly in XMind.MIT
- AlicenseAqualityBmaintenanceEnables AI agents to build and interact with mind maps on mindmap.io. Agents can create, read, update, and delete maps and nodes, run prompts on nodes, and auto-expand topics into follow-up questions.13MIT
- AlicenseNot gradedqualityBmaintenanceEnables LLMs to read and edit XMind mind maps, including OCR for images embedded in nodes.MIT
- AlicenseNot gradedqualityAmaintenanceA local MCP server that combines a browser mind map UI with a Streamable HTTP MCP endpoint, letting AI agents create, edit, and manage mind maps in real time through tools like mindmap_apply_op.8 npmMIT