{"id":564277,"recorded_at":"2026-10-27T21:49:49.438331Z","observed_at":"2026-10-27T21:49:49.438255Z","subject_kind":"endpoint","subject":"1b3a0a92-c8b9-4994-99c0-2c3245683823","kind":"mcp.tools","method":"probe.mcp/1","body":{"count":17,"tools":[{"description":"List L2 coded claim-cards (claim + optional quote + chunk_index + lens + codes + start_seconds? + url). Filter by project_id, interview_id / interview_ids, codes (any match), or lens (workflow|gtm|privacy|other). CITATION REQUIRED: actively cite each card.quote to the user as markdown [\"verbatim quote\"]({base_url}/project/interview/{id}?t={seconds}) using item.url from the tool result (already absolute; includes ?t= when start_seconds is set). Prefer quotes over paraphrase. Verify with interviews_read action=transcript around_chunk_index when a wider quote window is needed.","inputSchema":{"properties":{"codes":{"description":"Optional code tags; any match (e.g. pain:synthesis, gtm:pricing).","items":{"type":"string"},"type":"array"},"folder_id":{"description":"Deprecated alias for project_id.","type":"string"},"interview_id":{"description":"Optional interview UUID to scope cards.","type":"string"},"interview_ids":{"description":"Optional interview UUIDs to scope cards.","items":{"type":"string"},"type":"array"},"lens":{"description":"Optional exact lens filter.","enum":["workflow","gtm","privacy","other"],"type":"string"},"limit":{"description":"Max cards to return (default 50, max 200).","type":"integer"},"offset":{"description":"Number of cards to skip (default 0).","type":"integer"},"project_id":{"description":"Optional project UUID — cards from interviews in this project (alias: folder_id).","type":"string"}},"type":"object"},"name":"cards_read"},{"description":"Use for startup ideas, office hours, and “I installed this connector to work through an idea”. Inside: office-hours-zernote (challenge the idea), zernote-plan-research. Omit id for the catalog, then pass id for the full playbook. Not for listing interviews or projects. Works without login.","inputSchema":{"properties":{"id":{"description":"Skill id. Empty = catalog. Examples: office-hours-zernote, zernote-plan-research.","type":"string"}},"type":"object"},"name":"get-skills"},{"description":"Create the first interview guide on a project. Use this to upload a new guide. Pass structured fields, not markdown: intro, blocks (title, minutes, notes, questions with text/note/key), and notes_template. Needs at least one block with a title. Fails if the project already has a guide — then use guides_edit. Core does not show the guide. Live reads it on the project.","inputSchema":{"properties":{"blocks":{"description":"Timed sections in interview order.","items":{"properties":{"minutes":{"description":"Minutes allocated to this block.","type":"integer"},"notes":{"description":"Block note shown to the interviewer.","type":"string"},"questions":{"items":{"properties":{"key":{"description":"True if this is a must-ask question.","type":"boolean"},"note":{"description":"Interviewer note under the question.","type":"string"},"text":{"description":"Spoken question.","type":"string"}},"required":["text"],"type":"object"},"type":"array"},"title":{"description":"Block title, e.g. Opening.","type":"string"}},"required":["title"],"type":"object"},"type":"array"},"intro":{"description":"Spoken opening before the first block.","type":"string"},"notes_template":{"description":"Post-interview notes template (conspect).","type":"string"},"project_id":{"description":"Project UUID.","type":"string"}},"required":["project_id","blocks"],"type":"object"},"name":"guides_create"},{"description":"Replace an existing interview guide from markdown. To create the first guide, call guides_create. Text before the first ## is the intro. ## Title (12) or ## Title (7–11) is a block; minutes are the last number in parentheses. Lines starting with - or 1. are questions; a leading * marks a key question; the next indented line is the question note. A paragraph under the block heading before the first question is the block note. ## Конспект is the post-interview notes template, not a block. Optional line `Общее время: 30` or `Total: 30` sets total minutes; otherwise they are the sum of block minutes. Anything that does not match is returned in remainder and kept, not dropped. The previous guide is replaced entirely.","inputSchema":{"properties":{"markdown":{"description":"Full guide markdown. Replaces the guide stored on the project.","type":"string"},"project_id":{"description":"Project UUID.","type":"string"}},"required":["project_id","markdown"],"type":"object"},"name":"guides_edit"},{"description":"Read the interview guide stored on a project. The guide has an intro, ordered blocks (title, minutes, questions, notes), total time, a notes template, and any markdown that did not parse. Returns an empty guide when the project has none.","inputSchema":{"properties":{"project_id":{"description":"Project UUID.","type":"string"}},"required":["project_id"],"type":"object"},"name":"guides_read"},{"description":"Read the project Insights graph in pages or by node. action=list returns a compact folder-wide outline (groups + interviews) plus a page of insight bodies. Filter with interview_id, group_id (DB UUID, not UI group-0), group_name, insight_ids, or ungrouped_only. action=get_node returns one node: insight | interview | group | ungrouped. CITATION REQUIRED: actively cite each item.quote as markdown [\"verbatim quote\"]({base_url}/project/interview/{id}?t={seconds}) using item.url from the tool result (already absolute; includes ?t= when start_seconds is set). Prefer quotes over paraphrase. Do not use quote_start — that is a character offset, not a player timestamp.","inputSchema":{"properties":{"action":{"description":"list = paged insight bodies + outline. get_node = one insight, interview, group, or ungrouped cluster.","enum":["list","get_node"],"type":"string"},"folder_id":{"description":"Deprecated alias for project_id.","type":"string"},"group_id":{"description":"List filter: insight_groups.id UUID (not a render index like group-0).","type":"string"},"group_name":{"description":"List filter: case-insensitive group name match.","type":"string"},"id":{"description":"get_node: insight, interview, or group UUID. Not used for ungrouped.","type":"string"},"insight_ids":{"description":"List filter: only these insight UUIDs.","items":{"type":"string"},"type":"array"},"interview_id":{"description":"List filter: only insights from this interview. Interview must be in the project.","type":"string"},"limit":{"description":"List only: max insight bodies (default 25, max 100).","type":"integer"},"node_type":{"description":"get_node: which node to load.","enum":["insight","interview","group","ungrouped"],"type":"string"},"offset":{"description":"List only: skip this many matching insight bodies (default 0).","type":"integer"},"project_id":{"description":"Project/folder UUID (required for list and for get_node group/ungrouped/insight).","type":"string"},"ungrouped_only":{"description":"List filter: only insights that are not in a cross-interview group.","type":"boolean"}},"required":["action"],"type":"object"},"name":"insights_read"},{"description":"Rename, move, write summary/notes, retranscribe, assign/confirm speakers, or toggle voiceprint. action=rename needs id+title; move needs interview_ids (+ optional project_id); write_summary needs id+summary; write_notes needs id+notes; retranscribe needs id+language (charges transcription tokens again; analyze-only, keeps notes). assign_speakers needs id+speaker_labels+assigned_names. For voiceprint interviewer confirm: one label + real name on one interview after quote links; that identity backfills other interviews sharing voice_identity_id — re-list instead of confirming every card. set_voiceprint needs enabled bool (false purges biometric voice data). If need_approve_speakers=true, show quote links then assign_speakers when the user confirms. If transcript_quality.looks_corrupted=true, offer retranscribe with the correct language. write_notes and write_summary replace the entire notes or summary field (not append).","inputSchema":{"properties":{"action":{"description":"Edit action.","enum":["rename","move","write_summary","write_notes","retranscribe","assign_speakers","set_voiceprint"],"type":"string"},"assigned_names":{"description":"Human names matching speaker_labels (assign_speakers). Use a real name, not \"Interviewer N\".","items":{"type":"string"},"type":"array"},"enabled":{"description":"Voiceprint on/off (set_voiceprint). false deletes stored voice biometrics.","type":"boolean"},"folder_id":{"description":"Deprecated alias for project_id.","type":"string"},"id":{"description":"Interview UUID (rename, write_summary, write_notes, retranscribe, assign_speakers).","type":"string"},"interview_ids":{"description":"Interview UUIDs to move.","items":{"type":"string"},"type":"array"},"language":{"description":"Transcription language code for retranscribe (e.g. en, ru, nl). Charges tokens for audio duration.","type":"string"},"notes":{"description":"Full note text that replaces the existing notes field (write_notes).","type":"string"},"project_id":{"description":"Destination project UUID for move (alias: folder_id). Omit or null for Inbox.","type":"string"},"speaker_labels":{"description":"Diarization labels to assign (assign_speakers), e.g. [\"A\"]. Voiceprint interviewer confirm: one label in this call (same identity then backfills other interviews).","items":{"type":"string"},"type":"array"},"summary":{"description":"Full summary markdown that replaces the existing summary (write_summary). Expected sections: # Summary, ## Profile, ## Tools & workflow, ## Pains & friction, # Other topics.","type":"string"},"title":{"description":"New title (rename).","type":"string"}},"required":["action"],"type":"object"},"name":"interviews_edit"},{"description":"Read interviews. Typical path: (1) action=list with summary_mode=brief (default) — returns the short # Summary. List items include need_approve_speakers (+ pending_speakers / hint): when true, show interviewer quote links then confirm via assign_speakers; one identity confirm backfills other interviews sharing voice_identity_id. Use summary_mode=brief for renaming or folder triage. Use summary_mode=full when Profile/Tools/Pains/Other topics are needed for deeper analysis. (2) call `search` when you need evidence or counter-evidence for a hypothesis; (3) use action=transcript with around_chunk_index from matching_chunks when a quote window is required. CITATION REQUIRED: when answering the user, actively cite evidence as markdown [\"verbatim quote\"]({base_url}/project/interview/{id}?t={seconds}) using interview_url / matching chunk url from tool results (includes ?t= when start_seconds is set). Prefer quotes over paraphrase.","inputSchema":{"properties":{"action":{"description":"Read action. Use list (brief or summary_mode=full) for overview; use transcript when you need a quote window.","enum":["list","get","status","transcript"],"type":"string"},"around_chunk_index":{"description":"Transcript only: expand a window around this vector-search chunk_index (use instead of blind offset when available).","type":"integer"},"folder_id":{"description":"Deprecated alias for project_id.","type":"string"},"id":{"description":"Interview UUID (required for get, status, transcript).","type":"string"},"inbox_only":{"description":"When true with action=list, list Inbox interviews (no project). Ignored if project_id is set.","type":"boolean"},"limit":{"description":"For list: max interviews (default 20, max 100). For transcript: max characters (default 4000, max 20000).","type":"integer"},"notes_mode":{"description":"List only. none (default) = omit notes body. full = researcher notes (truncated on list). Use summary when notes are not required.","enum":["none","full"],"type":"string"},"offset":{"description":"For list: skip count. For transcript without around_chunk_index: character offset (default 0).","type":"integer"},"project_id":{"description":"Optional project UUID to filter list (alias: folder_id).","type":"string"},"radius_chars":{"description":"Transcript only with around_chunk_index: chars before/after chunk match (default 1500, max 8000).","type":"integer"},"summary_mode":{"description":"List only. brief (default) = short # Summary for triage/rename. full = all summary_fragments (profile/tools/pains/other_topics) when brief is insufficient.","enum":["brief","full"],"type":"string"}},"required":["action"],"type":"object"},"name":"interviews_read"},{"description":"Edit JTBD graph: extract_interview, move_interview, create_segment, fill_in job, update_job, delete_job.","inputSchema":{"properties":{"action":{"enum":["extract_interview","move_interview","create_segment","fill_in","update_job","delete_job"],"type":"string"},"category":{"type":"string"},"folder_id":{"type":"string"},"human_edited":{"type":"boolean"},"i_want_to":{"type":"string"},"interview_id":{"type":"string"},"job_id":{"type":"string"},"language":{"description":"Job tree language for extract_interview (en or ru). Defaults to en. Quotes stay in the interview language.","type":"string"},"name":{"type":"string"},"project_id":{"type":"string"},"segment_id":{"type":"string"},"so_that":{"type":"string"},"to_segment_id":{"type":"string"},"when":{"type":"string"}},"required":["action"],"type":"object"},"name":"jtbd_edit"},{"description":"Read JTBD job graph segments and trees. action=list_segments needs folder_id/project_id. action=get_tree needs segment_id or interview_id. CITATION REQUIRED: cite job quotes as [\"text\"](interview_url).","inputSchema":{"properties":{"action":{"enum":["list_segments","get_tree"],"type":"string"},"folder_id":{"description":"Project/folder UUID (list_segments).","type":"string"},"interview_id":{"description":"Interview UUID (get_tree).","type":"string"},"project_id":{"description":"Alias for folder_id.","type":"string"},"segment_id":{"description":"Segment UUID (get_tree).","type":"string"}},"required":["action"],"type":"object"},"name":"jtbd_read"},{"description":"App-only: confirm a completed R2 upload (single PUT or multipart) for an Inbox interview. Audio/video is enqueued for transcription (STT + diarization). Text (.txt/.md) and PDF are stored and marked ready immediately — no transcription.","inputSchema":{"properties":{"filename":{"description":"Original filename.","type":"string"},"interview_id":{"description":"Interview UUID from prepare.","type":"string"},"language":{"description":"STT language for audio/video (e.g. en, ru, nl). Not used for text/PDF (no transcription).","type":"string"},"multipart_parts":{"description":"Completed parts (part_number + etag) when using multipart.","items":{"properties":{"etag":{"type":"string"},"part_number":{"type":"integer"}},"type":"object"},"type":"array"},"multipart_upload_id":{"description":"Multipart upload id — complete assembly before confirm.","type":"string"},"object_key":{"description":"R2 object key from prepare.","type":"string"},"size_bytes":{"description":"File size in bytes.","type":"integer"},"title":{"description":"Optional title to apply before confirm.","type":"string"}},"required":["interview_id","object_key","filename","size_bytes","language"],"type":"object"},"name":"mcp_confirm_upload"},{"description":"App-only: create an Inbox interview and return a presigned R2 upload URL (or multipart upload_id for large files). Pass interview_id (+ upload_id for multipart) to resume without a new card.","inputSchema":{"properties":{"content_type":{"description":"MIME type for the PUT (optional).","type":"string"},"filename":{"description":"Original filename.","type":"string"},"interview_id":{"description":"Optional: existing empty interview UUID — resume upload without creating a new card.","type":"string"},"size_bytes":{"description":"File size in bytes.","type":"integer"},"title":{"description":"Optional interview title (defaults to sanitized filename).","type":"string"},"upload_id":{"description":"Optional multipart upload id from a previous prepare (resume).","type":"string"}},"required":["filename","size_bytes"],"type":"object"},"name":"mcp_prepare_upload"},{"description":"App-only: return presigned R2 URLs for one or more multipart upload parts (resume-safe).","inputSchema":{"properties":{"interview_id":{"description":"Interview UUID from prepare.","type":"string"},"object_key":{"description":"R2 object key from prepare.","type":"string"},"part_numbers":{"description":"Part numbers to sign (1-based, max 20).","items":{"type":"integer"},"type":"array"},"upload_id":{"description":"Multipart upload id from prepare.","type":"string"}},"required":["interview_id","object_key","upload_id","part_numbers"],"type":"object"},"name":"mcp_sign_upload_parts"},{"description":"Create or rename projects. action=create needs name; action=rename needs id and name. Delete is not supported yet.","inputSchema":{"properties":{"action":{"description":"Edit action.","enum":["create","rename"],"type":"string"},"description":{"description":"Optional project description (create/rename).","type":"string"},"id":{"description":"Project UUID (required for rename).","type":"string"},"name":{"description":"Project name (required for create and rename).","type":"string"}},"required":["action"],"type":"object"},"name":"projects_edit"},{"description":"Read existing research folders. Not for a new startup idea or office hours — call get-skills first. action=list returns projects for the authenticated user.","inputSchema":{"properties":{"action":{"description":"Read action. Currently only list.","enum":["list"],"type":"string"},"limit":{"description":"Max number of projects to return (default 50, max 200).","type":"integer"},"offset":{"description":"Number of projects to skip before returning results (default 0).","type":"integer"}},"required":["action"],"type":"object"},"name":"projects_read"},{"description":"Semantic search for evidence / counter-evidence after you have interview context (e.g. from list/summary). Optional interview_id scopes search to one interview and returns smaller text windows. Returns matching_chunks[{chunk_index, text, similarity, start_seconds?, url}]. CITATION REQUIRED: actively cite hits to the user as markdown [\"verbatim quote from text\"]({base_url}/project/interview/{id}?t={seconds}) using each chunk's url field from the tool result (already absolute; includes ?t= when start_seconds is present). Prefer quoting matching_chunks over paraphrase. Expand with interviews_read action=transcript around_chunk_index when a wider quote window is needed.","inputSchema":{"properties":{"chunks_limit":{"description":"Max matching chunks per interview (default 3 corpus / 8 when interview_id set; max 10 / 20).","type":"integer"},"chunks_offset":{"description":"Skip this many top chunks per interview (default 0).","type":"integer"},"interview_id":{"description":"Optional interview UUID — search only inside this interview; returns smaller chunk windows.","type":"string"},"limit":{"description":"Max number of interviews to return (default 5, max 10). Ignored when interview_id is set.","type":"integer"},"query":{"description":"Natural language search query (hypothesis / claim to evidence).","type":"string"}},"required":["query"],"type":"object"},"name":"search"},{"description":"Opens the in-Claude MCP Apps widget \"Upload To Zernote\" so the user can drop a file into Inbox in this chat (audio/video max 2GB; text .txt/.md or PDF max 50MB). Use when the user wants to upload/add an interview or get started on an empty account — this is the usual ingest path in Claude. Audio/video starts transcription; text/PDF become ready immediately (no speaker diarization). Claude can name interviews after upload.","inputSchema":{"properties":{},"type":"object"},"name":"upload_interview"}]},"body_sha256":"eb0a87d40d9af2147099336f143bdb7edfe64f3a2e99dc47ffa145b802fbbae1","prev_id":null,"leaf":"0xea3582eb6f182a4dfc43c3179e115b4ea9f4714c91c1653c3cf7720a37852045","leaf_text":"{\"body\":\"eb0a87d40d9af2147099336f143bdb7edfe64f3a2e99dc47ffa145b802fbbae1\",\"id\":564277,\"kind\":\"mcp.tools\",\"method\":\"probe.mcp/1\",\"observed_us\":1793137789438255,\"prev\":null,\"subject\":\"1b3a0a92-c8b9-4994-99c0-2c3245683823\",\"subject_kind\":\"endpoint\"}","day":{"day":"2026-10-27","leaves":273461,"root":"0xdd77e5e99da32c3f154180d63e3c3e6fe11e896a2c6896412ef6b5c4bcf7e795","chained":"0x23bb4dfd09f55c15ac3962f53578e02c6114d5bfd9bb451cf8794fb6e2817ef4","anchor_chain":"eip155:5042002","anchor_tx":"0xb2ebd83aafeb765a0ce66e76aefb133ed06606c98038fd56191e2bcd1dcb77b4","anchor_block":69414147},"proof":["0xea35fbcc96b36b988c71e387536b7e0dbd42007425c9be514abdeacf15ab8e19","0x81f057432a4f21053076c28380cf83f8e50d1c99e87f5bd7a6b4db3d72f5248b","0x90a12108cbdef8a098dc8f5667b75b3a28307f8738d1fcf1d3cc50650807d70a","0xa8b297342f185fd7f8ae2b1f4ad629e982c88e3893cce9bd66f08589a7ded9d3","0x90455f7ac6893b905e310f434d558720a507c4f6049f236e9b7c39d270c464c2","0x795425763f6f54ee71956e4f03b355d0e12bd500314b20a795b66618e08aa4b7","0x5e771a286be922d5c2945bf8162ff76d07c1942e29c712b8e8382a3a90206915","0x7f8d472a7de9d8177545333837698b573d7630d6b9c57e462f0731b453b84b18","0x7ccdf7ff36ebde7df6655ee08c74589be7dba18f5e10f9abba29901ab38aec95","0x18efad64a76eebb9176b156f757703ccaa1d8e00ce45eca065bb985177141909","0x8cc7cdbb404948d6c8277e8104fbf6f6ef7bc67273321adedcf016270a69a84e","0x71d164c799d87b4dc25af672a70aaf73791d8dbb1786a5d4eb3ead269cb7c28a","0x89602081fbcc80aef8908f5df765767a1a41cc8b089111259ea78e6583a8bc4b","0x41f9f462759cb539183e979fb3eb967d94755cf039c44a64a9a3c4ad97523cfd","0x56f7109d4cde42492651beb1237c13cdcbf95e6fee2b2482391a2388e04c4629","0x8745bd887f5ce9f7a49558fd2b04cdcd97a05ea9f8a23f62d0e80cb13d328b0f","0xdf1105afdc109de3c09a98fc8a3864159ad964e6f49b635c105a27a1e1f14310","0x2bf8151e5f157dd183b9de6fa00469551932a7a6e3f33a694895000ac9061197","0x9fc354c0ea3efc3f1b6548bb77ea902a50f2c9647647ea61592efce2bd795699"]}