@putervision/vision-memory-mcp
Persistent visual cache for LLM-driven software development. Caches screenshots using perceptual hashing, vector search, and AX trees to prevent token overhead and visual hallucination loops.
npm · fingerprint 477ea28416b84b8751a8d701 · repository · RSS
15tools
2recorded versions
45dtracked
unchanged 12d
What changed
Changed between 4 September 2026 and 5 October 2026 (first seen 2026-10-05 14:13 UTC)
15 descriptions rewritten.
--- pinned/analyze_screenshot +++ observed/analyze_screenshot { "annotations": { "destructiveHint": false, - "description": "Ingest screenshot(s) via base64 or file path, check the visual state cache, and return state details. On cache miss, generates perceptual hashes (dHash/aHash), CLIP embeddings, and persists a new visual state entry. Use this tool AFTER capturing a screenshot and BEFORE invoking vision LLMs to avoid redundant token spend. For batch ingestion, pass an `items` array instead of a single screenshot/file_path.", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Ingest screenshot(s) via base64 or file path, check the visual state cache, and return state details. On cache miss, generates perceptual hashes (dHash/aHash), CLIP embeddings, and persists a new visual state entry. Use this tool AFTER capturing a screenshot and BEFORE invoking vision LLMs to avoid redundant token spend. Use analyze_screenshot instead of recall_memory when ingesting, indexing, and caching a visual capture rather than performing read-only search over historical states. For batch ingestion, pass an `items` array instead of a single screenshot/file_path.\n\nReturns visual state ID, layout description, perceptual hashes, cache hit status (is_known), and grounded interactive elements.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { "accessibility_tree": { "description": "Optional JSON string representing the simplified AX tree", + "export_detections": { + "description": "Standardized perception bridge: export 3D observation detections for world-model-mcp", + "type": "boolean" + }, "file_path": { "description": "Absolute path to a local image file (single mode). Use instead of screenshot to avoid base64 overhead", "type": "string" - "additionalProperties": false, "properties": { "accessibility_tree": { "type": "string" + "export_detections": { + "type": "boolean" + }, "file_path": { "type": "string" }, - "maxItems": 20, - "minItems": 1, "type": "array" }, "response_format": { - "name": "analyze_screenshot", - "title": "Analyze & Cache Screenshot" + "name": "analyze_screenshot" }
--- pinned/compare_states +++ observed/compare_states { "annotations": { "destructiveHint": false, - "description": "Compare two visual states structurally (dHash, CLIP vector, JSON diff, layout delta) or two video trajectories (keyframe similarity, divergence point). Provide state_a_id/state_b_id for state comparison, or video_a_id/video_b_id for video trajectory comparison.", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Compare two visual states structurally (dHash, CLIP vector, JSON diff, layout delta) or two video trajectories (keyframe similarity, divergence point). Provide state_a_id/state_b_id for state comparison, or video_a_id/video_b_id for video trajectory comparison. Use compare_states instead of manage_snapshot when computing direct visual/structural deltas between two states rather than saving or restoring checkpoints.\n\nReturns Hamming hash distance, cosine vector similarity, structural layout diff, and layout change flag.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { "response_format": { "enum": [ - "name": "compare_states", - "title": "Compare Visual States or Video Trajectories" + "name": "compare_states" }
--- pinned/create_evidence_pack +++ observed/create_evidence_pack { "annotations": { "destructiveHint": false, - "description": "Package keyframe IDs, dHash/CLIP fingerprints, OCR snippets, and linked state-memory node IDs into an immutable, cryptographically hashable evidence pack for compliance and audit trails.", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Package keyframe IDs, dHash/CLIP fingerprints, OCR snippets, and linked state-memory node IDs into an immutable, cryptographically hashable evidence pack for compliance and audit trails. Use create_evidence_pack instead of export_trajectories when generating tamper-proof cryptographic audit proofs for compliance rather than dumping training trajectories.\n\nReturns cryptographic evidence pack with SHA-256 payload hash, keyframe fingerprints, and state-memory links.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { "keyframe_state_ids": { "description": "Array of keyframe visual state IDs", - "additionalProperties": false, "description": "State memory node IDs linked to this visual evidence pack", "properties": { "blocker_ids": { - "name": "create_evidence_pack", - "title": "Create Evidence Pack" + "name": "create_evidence_pack" }
--- pinned/export_trajectories +++ observed/export_trajectories { "annotations": { "destructiveHint": false, - "description": "Export visual state transition trajectories. Formats: \"json\" (raw state steps), \"llava\" / \"qwen2_vl\" (VLM fine-tuning datasets), \"joint\" (interleaved workflow events correlated by session/trace ID for state-memory-mcp).", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Export visual state transition trajectories (formats: json, llava, qwen2_vl, joint). Formats: \"json\" (raw state steps), \"llava\" / \"qwen2_vl\" (VLM fine-tuning datasets), \"joint\" (interleaved workflow events correlated by session/trace ID for state-memory-mcp). Use export_trajectories instead of create_evidence_pack when exporting training data or cross-server event logs rather than cryptographic compliance packs.\n\nReturns exported trajectory array, formatted VLM training records, or joint event stream.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { "format": { "description": "Export format (default: json)", - "name": "export_trajectories", - "title": "Export Visual Trajectories" + "name": "export_trajectories" }
--- pinned/forget_state +++ observed/forget_state { "annotations": { "destructiveHint": true, - "description": "Purge a specific visual state, its vector embeddings, and perceptual hashes from storage for privacy or memory reset.", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Purge a specific visual state, its vector embeddings, and perceptual hashes from storage for privacy or memory reset. Use forget_state instead of undo_visual_mutation when permanently purging specific sensitive or obsolete states by ID rather than reverting the most recent action.\n\nReturns purge confirmation and deleted state ID.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { "state_id": { "description": "ID of visual state to purge", - "name": "forget_state", - "title": "Forget Visual State" + "name": "forget_state" }
--- pinned/get_navigation_paths +++ observed/get_navigation_paths { "annotations": { "destructiveHint": false, - "description": "Trace historical pathways from current state to a target state or state matching description via BFS over the transition graph.", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Trace historical pathways from current state to a target state or state matching description via BFS over the transition graph. Use get_navigation_paths instead of predict_next_action when planning multi-step navigation routes across known states rather than choosing the immediate next interaction.\n\nReturns shortest path state sequence, intermediate actions, and cumulative transition confidence.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { "from_state_id": { "description": "ID of starting state (defaults to most recently accessed state)", - "maximum": 10, - "minimum": 1, - "type": "integer" + "type": "number" }, "response_format": { "enum": [ - "name": "get_navigation_paths", - "title": "Find UI Navigation Path" + "name": "get_navigation_paths" }
--- pinned/get_session_context +++ observed/get_session_context { "annotations": { "destructiveHint": false, - "description": "Fetch aggregated visual context: recent states, frequently accessed states, active transitions, and memory stats. Call this at session start to orient before performing UI actions.", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Fetch aggregated visual context: recent states, frequently accessed states, active transitions, and memory stats. Call this at session start to orient before performing UI actions. Use get_session_context instead of recall_memory when initializing session awareness rather than searching for specific visual targets.\n\nReturns recent states list, frequent states, active transitions, cache hit telemetry, and database sizing.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { + "format": { + "description": "Response format override (compact, full, compact_slice)", + "type": "string" + }, + "include_centroids": { + "description": "Whether to export embedding centroids out-of-band", + "type": "boolean" + }, "include_frequent": { "description": "Count of frequent states", - "maximum": 20, - "minimum": 1, - "type": "integer" + "type": "number" }, "include_recent": { "description": "Count of recent states", - "maximum": 20, - "minimum": 1, - "type": "integer" + "type": "number" }, "response_format": { "enum": [ - "full" + "full", + "compact_slice" ], "type": "string" } - "name": "get_session_context", - "title": "Get Session Context" + "name": "get_session_context" }
--- pinned/manage_snapshot +++ observed/manage_snapshot { "annotations": { - "destructiveHint": false, + "destructiveHint": true, "idempotentHint": false, "readOnlyHint": false }, - "description": "Manage visual memory snapshots. Actions: \"save\" creates a named checkpoint of current states; \"diff\" compares two snapshots for visual drift/regression; \"export\" serializes a snapshot to a portable JSON archive; \"restore\" imports a snapshot from an exported archive.", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Manage visual memory snapshots (actions: save, diff, export, restore). \"save\" creates a named checkpoint of current states; \"diff\" compares two snapshots for visual drift/regression; \"export\" serializes a snapshot to a portable JSON archive; \"restore\" imports a snapshot from an exported archive. Use manage_snapshot instead of undo_visual_mutation when creating or restoring named point-in-time visual checkpoints rather than rolling back the immediate previous mutation.\n\nReturns snapshot metadata, comparison diff, export archive, or restore confirmation.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { "action": { "description": "Snapshot operation to perform", - "name": "manage_snapshot", - "title": "Manage Visual Snapshots" + "name": "manage_snapshot" }
--- pinned/manage_video +++ observed/manage_video { "annotations": { "destructiveHint": false, - "description": "Manage WebM, MP4, and GIF video recordings in visual memory. Actions: \"ingest\" extracts keyframes, deduplicates, and builds sequence transitions; \"search\" queries stored video recordings by keyword/category/tags; \"timeline\" retrieves the chronological keyframe timeline for a specific video_id.", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Manage WebM, MP4, and GIF video recordings in visual memory (actions: ingest, search, timeline). \"ingest\" extracts keyframes, deduplicates, and builds sequence transitions; \"search\" queries stored video recordings by keyword/category/tags; \"timeline\" retrieves the chronological keyframe timeline for a specific video_id. Use manage_video instead of analyze_screenshot when processing full video recordings and extracting temporal keyframes rather than single screenshots.\n\nReturns ingested video metadata, keyframe indices, search matches, or timeline sequence.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { "action": { "description": "Action to perform: 'ingest', 'search', or 'timeline'", - "name": "manage_video", - "title": "Manage Video Memory" + "name": "manage_video" }
--- pinned/manage_visual_spec +++ observed/manage_visual_spec { "annotations": { "destructiveHint": false, - "description": "Manage Visual Spec baseline contracts (Visual SDD). Actions: \"set\" registers a screenshot or design mockup as baseline, \"verify\" tests a live UI screenshot against a baseline, \"list\" returns all registered visual specs.", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Manage Visual Spec baseline contracts for visual SDD (actions: set, verify, list). \"set\" registers a screenshot or design mockup as baseline; \"verify\" tests a live UI screenshot against a baseline; \"list\" returns all registered visual specs. Use manage_visual_spec instead of compare_states when verifying UI against approved design contracts rather than ad-hoc state comparisons.\n\nReturns baseline registration confirmation, visual verification score, or registered spec list.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { "action": { "description": "Action to perform: 'set', 'verify', or 'list'", - "name": "manage_visual_spec", - "title": "Manage Visual Specs" + "name": "manage_visual_spec" }
--- pinned/predict_next_action +++ observed/predict_next_action { "annotations": { "destructiveHint": false, - "description": "Predict the best next UI action from the current visual state based on transition success rates, goal alignment, and grounded AX tree element targeting.", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Predict the best next UI action from the current visual state based on transition success rates, goal alignment, and grounded AX tree element targeting. Use predict_next_action instead of get_navigation_paths when selecting the immediate next optimal UI interaction rather than computing full path routes.\n\nReturns recommended action, target element selector, coordinates, and confidence score.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { "current_state_id": { "description": "ID of current active visual state", + "detect_traps": { + "description": "Whether to analyze state for modal backdrops, loops, and visual traps (default: true)", + "type": "boolean" + }, "goal_description": { "description": "Optional natural language goal description", "type": "string" - "name": "predict_next_action", - "title": "Predict Next UI Action" + "name": "predict_next_action" }
--- pinned/recall_memory +++ observed/recall_memory { "annotations": { "destructiveHint": false, - "description": "Search visual state memory by screenshot image, text query, or accessibility tree. Read-only — never creates or modifies states. Use analyze_screenshot to ingest new states.", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Search visual state memory by screenshot image, text query, or accessibility tree. Read-only — never creates or modifies states. Use recall_memory instead of analyze_screenshot when searching historical states by visual similarity or semantic text query without persisting new database records.\n\nReturns matching visual state records, similarity scores, layout descriptions, and grounded elements.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { "accessibility_tree": { "description": "AX tree JSON for filtering", - "maximum": 20, - "minimum": 1, - "type": "integer" + "type": "number" }, "query": { "description": "Text query string for semantic vector search", - "name": "recall_memory", - "title": "Search Visual Memory" + "name": "recall_memory" }
--- pinned/record_outcome +++ observed/record_outcome { "annotations": { "destructiveHint": false, - "description": "Log an action transition between two visual states and update transition statistics. Call this after every click/type/scroll/navigate action. When action_type is \"blocker\", generates a structured visual blocker payload for state-memory-mcp instead of recording a transition (from_state_id becomes the visual_state_id of the blocker).", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Log an action transition between two visual states or log a visual blocker (action_type: click, type, navigate, scroll, custom, blocker). Call this after every UI interaction to update transition statistics and success rates. When action_type is \"blocker\", generates a structured visual blocker payload for state-memory-mcp instead of recording a transition (from_state_id becomes the visual_state_id of the blocker). Use record_outcome instead of predict_next_action when persisting actual interaction results rather than predicting recommended next steps.\n\nReturns transition record, updated edge weights, or state-memory blocker payload.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { "action": { "description": "Action description (or blocker description when action_type is \"blocker\")", - "name": "record_outcome", - "title": "Record Action Outcome" + "name": "record_outcome" }
--- pinned/undo_visual_mutation +++ observed/undo_visual_mutation { "annotations": { "destructiveHint": true, - "description": "Revert the most recent visual state ingestion or transition edge addition on the current git branch.", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Revert the most recent visual state ingestion or transition edge addition on the current git branch (types: state, transition, any). Use undo_visual_mutation instead of manage_snapshot when rolling back the immediate previous mutation rather than restoring an entire snapshot.\n\nReturns reverted mutation type, deleted state/edge ID, and rollback status.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { "type": { "description": "Type of mutation to revert (default: any — reverts the most recent of either)", - "name": "undo_visual_mutation", - "title": "Undo Visual Mutation" + "name": "undo_visual_mutation" }
--- pinned/wait_for_visual_state +++ observed/wait_for_visual_state { "annotations": { "destructiveHint": false, - "description": "Poll for a target visual state ID until it exists in memory or timeout occurs. Use this to avoid agent spin-loops when waiting for asynchronous screenshots.", - "execution": { - "taskSupport": "forbidden" - }, + "description": "Poll for a target visual state ID until it exists in memory or timeout occurs. Use this to avoid agent spin-loops when waiting for asynchronous screenshots. Use wait_for_visual_state instead of get_session_context when synchronizing with an asynchronous capture rather than inspecting existing memory state.\n\nReturns target visual state record or timeout error.", "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { "poll_interval_ms": { "description": "Polling interval in ms (default: 500)", - "name": "wait_for_visual_state", - "title": "Wait For Visual State" + "name": "wait_for_visual_state" }
Current tools
Show all 15 tool fingerprints
analyze_screenshot
compare_states
create_evidence_pack
export_trajectories
forget_state
get_navigation_paths
get_session_context
manage_snapshot
manage_video
manage_visual_spec
predict_next_action
recall_memory
record_outcome
undo_visual_mutation
wait_for_visual_state
Watch this server yourself
If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.
npx -y mcp-pin@0.2.3 -- <your @putervision/vision-memory-mcp command>
Or subscribe to this page's RSS feed to be told when it changes.
Badge
The badge states one fact about time and nothing else. It never claims a server is safe.
[](https://mcp-pin.gautamkhosla.com/servers/f7fefa173e09cf25.html)