VisualizeBetter
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": true
} |
| resources | {
"subscribe": false,
"listChanged": true
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| push_nodeA | 발견한 노드를 그래프에 그린다 (분석 중 발견 즉시 호출). 같은 id 로 다시 부르면 갱신된다 (properties 는 merge). |
| push_edgeA | 두 노드의 관계를 그린다. 같은 (source,target,relation,key) 재호출 = 갱신. 아직 push 하지 않은 노드를 가리켜도 된다 — 플레이스홀더 노드가 자동 생성되고, 나중에 같은 id 로 push_node 하면 해소된다. |
| push_batchA | 여러 노드/엣지를 한 번에 그린다. 배치 안에서 서로 참조해도 된다. nodes 를 먼저 적용한 뒤 edges 를 적용한다. 호출당 nodes+edges 합계 1,000개 상한 — 대량 유입은 import_from_file 을 쓴다. |
| update_nodeC | 노드를 부분 갱신한다. |
| update_edgeC | 엣지를 부분 갱신한다. patch/reason 규약은 update_node 와 같다. [23-C] RN7 ZZ(1): |
| delete_nodeA | 노드를 삭제한다. 연결된 엣지가 있는데 cascade=False 면 삭제를 거부하고 { ok: false, error: "has_edges", edge_count } 를 돌려준다 — 끊어진 엣지는 허용되지 않는다. |
| delete_edgeD | 엣지를 삭제한다. |
| clear_layerA | 특정 AI/세션이 그린 노드/엣지를 삭제한다. 삭제되는 노드에 걸린 엣지는 다른 layer 것이라도 함께 사라진다. findings 는 남는다. 실행 직전 자동 스냅샷이 저장되므로 응답의 snapshot_id 로 되돌릴 수 있다. |
| clear_allA | 그래프의 노드/엣지를 전부 삭제한다 (스냅샷과 findings 는 유지). 실행 직전 자동 스냅샷이 저장되므로 응답의 snapshot_id 로 되돌릴 수 있다. |
| undoA | [M2e] 마지막 그래프 변경(push/update/delete/clear/cite/import)을 되돌린다. 되돌린 결과는 [8-C] 이벤트로 브로드캐스트되어 열린 뷰가 즉시 갱신된다. 되돌릴 것이 없으면 { ok: false, error: "nothing_to_undo" }. (필터/스타일/포커스/스냅샷 같은 뷰 상태는 대상이 아니다.) |
| redoA | [M2e] 방금 undo 한 변경을 다시 적용한다. 새로운 그래프 변경이 일어나면 redo 스택은 비워진다. 다시 적용할 것이 없으면 { ok: false, error: "nothing_to_redo" }. |
| record_findingA | AI 가 분석 중 발견한 결정적 통찰(gold)을 못박는다. 수천 개 구조 노드 사이에 묻히지 않도록 별도로 강조·조회된다. |
| update_findingA | 기존 finding 을 부분 갱신한다 (같은 발견의 갱신은 record 대신 이것). |
| list_findingsA | 이전 세션의 gold 목록 — 인수인계 시 가장 먼저 호출한다. 최신 발견이 먼저 온다 (created_at desc). body 는 무거워질 수 있어 목록에서 빠지며, 상세는 get_finding 으로 가져온다. |
| get_findingA | 단일 finding 의 전체 내용 (body·evidence 포함) 과 앵커 노드 요약. 앵커가 아직 존재하지 않는 노드를 가리키면 { id, missing: true } 로 온다. |
| delete_findingC | finding 을 삭제한다. |
| citeB | 노드에 근거 링크를 붙인다 (예: IDA 어드레스, 문서 URL). 한 노드에 여러 citation 이 누적된다. source_url 은 파일 경로/주소도 허용 — 반드시 http 일 필요 없다. |
| get_graph_summaryA | 그래프 전경 — 규모·type 분포·layer·최고 허브. 인수인계 시 먼저 부른다. 수천 노드를 훑기 전에 "무엇이 얼마나 있나"를 한눈에 준다 (MVP 3대 도구). |
| get_nodeA | 노드 하나를 통째로 조회한다 (properties·태그 포함). properties 의 예약키(_citations/_superseded/_provenance)는 그대로 노출된다 — 읽기 전용이라 위조 위험이 없고, 근거·이력을 보여주는 게 목적이다. |
| list_nodesB | 노드 목록 — filter 로 좁히고, 결정적 정렬 + 페이지네이션. |
| list_edgesB | 엣지 목록 — filter 로 좁히고 결정적 정렬 + 페이지네이션. |
| get_neighborsD | id 로부터 depth 홉 이웃 서브그래프 ([5-B]). |
| find_pathsA | source→target 실제 경로 열거 (무방향, 최단 우선). path_to 의 후속. 필터 DSL 의 path_to 는 "도달 가능?"(bool)만 답한다 — 실제 경로는 여기서 준다. |
| searchA | 노드 부분 일치 검색 — query 를 in_fields 각 필드에서 substring 매치 ([5-B]). 대소문자 무시 substring 매치(정규식 아님 — ReDoS 없음, [11]). in_fields 는 filter DSL 이 아니라 단순 필드명 목록이고, 검색 대상은 화이트리스트로 제한된다: {id, label, type, layer, created_by, parent_id, tags} 와 'properties.' (비예약 키만). 예약('_' 접두) 속성이나 미지 필드는 명확한 에러로 거부한다 — bare 필드명이 시스템 소유 키([23-B])를 읽는 구멍이 되지 않게 한다. 결과는 id 오름차순(결정적)으로 정렬해 limit(상한 1000)까지 준다. total 은 limit 이전 전체 매치 수라, 더 있으면 AI 가 안다. READ 무변형(dirty·이벤트 없음). |
| render_in_chatA | 이 노드의 이웃 서브그래프를 chat 안 인터랙티브 카드로 렌더한다 ([9-D]). Claude Desktop 등 MCP Apps 지원 클라이언트가 대화창 안 sandboxed iframe 으로 컴팩트 detail 뷰(이웃 노드/엣지)를 보여준다 — 전체 라이브 뷰는 브라우저 별창. 카드는 서버가 만든 자기완결 스냅샷이라 serve 에 연결하지 않고 비밀도 없다([11]). |
| get_active_filterA | 사람이 지금 적용한 필터 ([5-C]) — 식과 매칭 노드 수. 없으면 둘 다 null. AI 가 "사람이 무엇에 집중하고 있나"를 아는 통로다 (공유 뷰). |
| get_visible_nodesC | 사람 화면에서 지금 보이는(필터 통과) 노드 id ([5-C]). 필터가 없으면 전부 보이므로 전체 노드를 준다. 결정적 정렬 + 페이지네이션. |
| get_focused_nodeA | 사람이 지금 선택(focus)한 노드 ([5-C]) — id 와 얼마나 됐는지(since_ms). 선택이 없으면 null. AI 가 작업 사이에 "사람이 지금 뭘 보나"를 아는 통로다. |
| get_selection_historyB | 최근 클릭 히스토리 ([5-C]) — 최신순 [{id, ts}, ...]. |
| get_view_stateA | 사람 화면의 뷰 상태 ([5-C], [9-C]) — mode/zoom/camera. 미설정이면 null. 여러 브라우저가 붙어 있으면 가장 최근 활동 클라이언트의 상태다. |
| poll_eventsA | 사용자 상태 변화(focus/filter)를 커서 이후분만 폴링한다 ([5-C]). MCP 는 단발 요청/응답이라 서버가 AI 에게 push 하지 못한다 — AI 는 작업 사이에 이걸 호출해 사람의 변화를 따라잡는다 ([5-C] 폴링 패턴). |
| suggest_filterA | 사람에게 필터를 제안한다 ([5-D]) — 적용이 아니라 배너로 뜬다. AI 가 "이걸 보면 좋겠다"를 제시하고, 적용 여부는 사람이 정한다. |
| focus_onA | 사람 화면을 이 노드로 이동한다 ([5-D]) — overview → detail 전환. |
| set_layoutC | 상세(cytoscape) 뷰의 레이아웃을 바꾼다 ([5-D], [7-B] 탭 enum 동일). |
| apply_styleA | 방금 push 한 것 등을 임시로 강조한다 ([5-D]) — 그래프는 안 바꾼다. |
| clear_styleB | AI 스타일을 지운다 ([5-D]). style_id 생략하면 전부 지운다. |
| add_annotationC | 화면 (x, y) 에 텍스트 메모를 띄운다 ([5-D]). text 는 AI 가 쓴 것이라 프론트에서 이스케이프되어 렌더된다([11]). |
| save_snapshotB | 이 세션의 그래프를 스냅샷으로 저장한다 (다음 세션이 이어받을 지점). |
| list_snapshotsA | 저장된 스냅샷 목록 (최신 먼저). 인수인계 시 가장 먼저 호출한다. kind 는 "manual"(사용자/AI 가 저장) 또는 "auto"(자동 스냅샷)다. |
| load_snapshotA | 스냅샷을 불러와 현재 그래프를 통째로 교체한다. 교체 직전 현재 상태가 auto 스냅샷으로 저장되므로, 실수로 불러왔더라도 되돌아갈 지점이 남는다. |
| export_graphA | 그래프를 데이터 포맷 파일로 내보낸다 ([5-E]). 파일은 서버 데이터 디렉토리 안에 생성되고(호출자 경로 지정 불가 — path traversal 차단 [11]) 그 경로를 반환한다. JSON 은 import 로 라운드트립된다. |
| import_graphA | 인라인 JSON 데이터를 임포트한다 ([5-E]). payload 1MB 상한. merge=True 는 identity((id) / (source,target,relation,key))로 멱등 병합, merge=False 는 전체 그래프 교체. 임포트 데이터는 WRITE 검증 경로를 통과하므로 예약('_') 키를 위조할 수 없다([11]/[23-B]) — 서버관리 필드는 무시된다. |
| import_from_fileA | 서버 데이터 디렉토리 안의 파일에서 대량 임포트한다 ([5-E], 100K+). 서버가 파일을 직접 읽어 in-process 처리한다(push_batch 의 MCP 상한 미적용). path 는 데이터 디렉토리 내로 제한된다 — 절대경로/.. traversal/루트 밖 거부([11]). merge 의미론은 import_graph 와 같다. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 43 tools
Most tools have clearly distinct purposes (push vs update vs delete vs list vs get), but some overlap exists: clear_layer/clear_all/delete_node/delete_edge all delete things, and get_graph_summary/list_nodes/search all provide graph overviews. The descriptions help disambiguate, but the boundaries between clear_layer and delete_node could confuse an agent.
The naming is predominantly verb_noun (push_node, list_edges, delete_finding, load_snapshot) with consistent snake_case. Minor deviations: undo/redo are bare verbs, and focus_on/suggest_filter use prepositions, but the overall pattern is predictable and readable.
43 tools is on the heavy side for a graph visualization server. The scope is broad (graph CRUD, findings, snapshots, view state, events, import/export), so each tool has a role, but the count exceeds the typical well-scoped range and will increase agent selection overhead.
The surface covers the full graph lifecycle (create/read/update/delete for nodes, edges, findings), plus snapshots, import/export, and view-state awareness. Minor gaps: no explicit tool for listing layers or managing citations beyond adding them, and no bulk delete for edges, but agents can work around these.