{"name":"io.github.egorthinks/perception","slug":"egorthinks-perception","title":null,"description":"Perception for AI agents: media QC asserts, image diff, OCR tiles, video/audio analysis, PDF, 3D.","url":"https://mcp.market/server/egorthinks-perception","rating":null,"grade":"C","score":65,"certified":false,"status":"active","category":"media","tags":["media"],"presence":{"score":0,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":null},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/egorthinks/perception-mcp","website":null,"version":"0.1.7","remotes":[],"packages":[{"registryType":"pypi","registryBaseUrl":"https://pypi.org","identifier":"perception-mcp","version":"0.1.7","transport":{"type":"stdio"}}],"tools":[{"name":"analyze_audio","description":"Full one-call audio report: loudness/quality, tempo, musical key and pitch. The audio is loaded once and every analysis runs on it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"analyze_loudness","description":"Measure loudness and technical quality of a recording — the \"will platforms accept this?\" check for podcasts, voice-overs and mixes.","write_action":false,"price_micros":0,"input_schema":null},{"name":"check_contrast","description":"Audit text contrast in a screenshot against WCAG 2.x: OCR finds the text, the exact W3C relative-luminance formulas score each line, and every line gets a pass/fail for AA and AAA.","write_action":false,"price_micros":0,"input_schema":null},{"name":"check_mesh","description":"QC a 3D mesh for printability and geometric hygiene: watertightness, winding consistency, degenerate/duplicate faces, volume, extents — with a printable yes/no and the reasons.","write_action":false,"price_micros":0,"input_schema":null},{"name":"check_video","description":"QC a video for the defects that make footage unusable: black stretches, frozen picture, dead audio, soft focus — with exact timestamps for each finding.","write_action":false,"price_micros":0,"input_schema":null},{"name":"compare_audio","description":"Compare two recordings: tuning difference in cents, tempo difference, harmonic (key) compatibility for DJ mixing, and loudness difference.","write_action":false,"price_micros":0,"input_schema":null},{"name":"compare_images","description":"Compare two images pixel-exactly and structurally — the \"did my change do what I intended and nothing else?\" tool for screenshots, renders, and any before/after check.","write_action":false,"price_micros":0,"input_schema":null},{"name":"compare_mesh","description":"Measure how far two 3D models diverge geometrically: ICP alignment, then two-sided sampled surface distances (chamfer mean + Hausdorff max), plus an overlay render (A grey, B translucent red).","write_action":false,"price_micros":0,"input_schema":null},{"name":"compare_videos","description":"Diff two cuts of a video at the SCENE level: which shots are identical, changed, added or removed — robust to timeline shifts that break naive frame-by-frame comparison.","write_action":false,"price_micros":0,"input_schema":null},{"name":"describe_audio","description":"Describe the structure of a recording in words: the timeline is split into sections by sound character, each labeled with loudness, brightness, rhythm density and texture, plus an overall guess whether it's music, speech or something else.","write_action":false,"price_micros":0,"input_schema":null},{"name":"describe_video","description":"Understand a whole video in ONE call: stream facts, shot structure, audio profile, spoken text, and a contact sheet with a timestamped frame from every scene.","write_action":false,"price_micros":0,"input_schema":null},{"name":"detect_key","description":"Detect the musical key (tonality) of a recording, e.g. \"A minor\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"detect_pitch","description":"Detect the fundamental pitch of a monophonic audio recording (single voice, string, whistle, tuning fork, etc.).","write_action":false,"price_micros":0,"input_schema":null},{"name":"detect_scenes","description":"Detect scene cuts in a video and return their timestamps — a shot-by-shot table of contents you can then sample with get_frames.","write_action":false,"price_micros":0,"input_schema":null},{"name":"detect_silence","description":"Map silent gaps in a recording with timecodes — useful for finding pauses to trim in podcasts, voice-overs or interviews, and for checking leading/trailing silence.","write_action":false,"price_micros":0,"input_schema":null},{"name":"estimate_tempo","description":"Estimate the tempo (BPM) of a piece of music.","write_action":false,"price_micros":0,"input_schema":null},{"name":"extract_text_boxes","description":"Read printed text from an image WITH exact pixel coordinates for every line — what plain vision can't give you: where the text is, not just what it says.","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_media","description":"Find recent media files on the USER'S machine when you have no path — the user attached a file in chat (attachments give you rendered pixels, not bytes; images carry no filename at all) or says \"the video I just downloaded\". Do not look for the user's files with your own file/code tools: those see only your cloud sandbox, never the user's disk — this tool is the one that runs on their machine. The","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_frames","description":"SEE a video: pull the exact frames you need as images, each stamped with its timecode.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_metadata","description":"Read file metadata without decoding the audio: duration, format, sample rate, channels, bitrate, file size, and embedded tags (title/artist/album/date/genre).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_youtube_transcript","description":"Fetch the transcript (captions/subtitles) of a YouTube or other yt-dlp-supported video as text with timestamps — WITHOUT downloading the audio. This is the fastest way to know what is said in a video.","write_action":false,"price_micros":0,"input_schema":null},{"name":"measure_image","description":"Measure an image with numbers a vision model cannot extract by looking: exact pixel colors at given points, pixel distances between points, image dimensions, and the dominant color palette.","write_action":false,"price_micros":0,"input_schema":null},{"name":"media_assert","description":"Verify a media file against declarative expectations and get a pass/fail report per check — a test harness for generated or processed media. Use this after producing/editing a file (\"did the export come out right?\") instead of reading raw analysis numbers, or before publishing (\"will platforms accept this?\").","write_action":false,"price_micros":0,"input_schema":null},{"name":"prepare_text_tiles","description":"Make hard-to-read text READABLE: small print, dense screenshots, photos of documents, handwriting. The page is cleaned gently (illumination flattening, deskew) and returned as a few big overlapping blocks, cut only at natural gaps between text lines — then read the blocks yourself.","write_action":false,"price_micros":0,"input_schema":null},{"name":"render_font_specimen","description":"SEE a font and verify what it supports: a rendered specimen sheet plus hard facts from the font tables — the only way to check a typeface before shipping it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"render_model","description":"SEE a 3D model: seven orthographic views (front / right / back / left / top / bottom / isometric) on one sheet, with the bounding-box extents in the caption.","write_action":false,"price_micros":0,"input_schema":null},{"name":"render_spectrogram","description":"Render a mel spectrogram of the audio as a PNG image, so the frequency content over time can be SEEN: melodies, drops, vocals, noise bursts, silence, filter sweeps.","write_action":false,"price_micros":0,"input_schema":null},{"name":"render_waveform","description":"Render the waveform plus an RMS loudness curve as a PNG image — a visual overview of dynamics: where it's loud, quiet, silent, or clipped.","write_action":false,"price_micros":0,"input_schema":null},{"name":"transcribe_audio","description":"Transcribe speech in an audio recording to text with timestamps, locally via Whisper (faster-whisper, CPU).","write_action":false,"price_micros":0,"input_schema":null},{"name":"video_dynamics","description":"Measure HOW a video moves: cut rhythm, motion energy and loudness on one timeline, plus hook metrics for the opening seconds — the raw ingredients of \"does it hold attention\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"video_heatmap","description":"See WHERE things happen in the frame: activity maps drawn over a real frame, with a 3x3 grid breakdown.","write_action":false,"price_micros":0,"input_schema":null},{"name":"view_media","description":"SEE a file — one call renders the whole image (or one PDF page), automatically downscaled and compressed to fit any client's tool-result size limit. Use this FIRST whenever the user refers to a picture or document you have not seen: view_media for the full view, then zoom_grid only for small details. Do NOT try to view a whole image through zoom_grid — it magnifies and will overflow the result lim","write_action":false,"price_micros":0,"input_schema":null},{"name":"zoom_grid","description":"Magnify a region of an image and overlay a coordinate grid — a microscope for details too small to see at full size: tiny text, 1-px borders, icon pixels, exact element positions. (To simply LOOK at a whole image, use view_media instead — magnifying a full image overflows the response budget.)","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":65,"grade":"C","scanned_at":"2026-09-25T17:26:11.513Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-25T17:26:11.407Z","components":{"code":{"score":25,"max":25,"notes":["50 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":3,"max":15,"notes":["repository not readable: repo not found"]},"identity":{"score":2,"max":10,"notes":["no repository or website to verify"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"perception-mcp","version":"0.1.7","found":true,"dependencyCount":53,"publishedAt":"2026-07-18T19:08:34.957756Z","repositoryUrl":"https://github.com/egorthinks/perception-mcp"}],"repo":{"found":false,"owner":"egorthinks","repo":"perception-mcp","error":"repo not found"},"icon":{"url":null,"source":"none"},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":null,"lastPushAt":null,"score":0}}}},"grade_history":[],"reviews":[]}