{"tools":[{"description":"Search the private-data passage index. Returns ranked passages (snippet, asset_id, modality, kind, deep-link locator) — the snippet IS the text, so most questions need no download. Respects the caller's visibility scope. Billed as one search.\n\nThe query has TWO grammars, and which one applies depends on whether the query contains * or ~:\n\n(1) No * and no ~ — full grammar: AND / OR / NOT, +must, -exclude, parentheses, \"exact phrases\", and field:value (e.g. kind:transcript, lang:en, title:budget).\n\n(2) Contains * or ~ — term grammar over the text fields only: prefix (term*), fuzzy (term~ or term~2, max edit distance 2), \"exact phrases\", and +must / -exclude per term. IMPORTANT: in this grammar AND / OR / NOT are ordinary words, not operators, and field:value is not a clause. Do not mix them — use the structured filters below instead, which work in both.\n\nA query with no special syntax at all that returns nothing is silently retried with typo tolerance; a query you wrote deliberately is run exactly as written.","inputSchema":{"properties":{"after":{"description":"Only passages with created_at >= this unix-second timestamp.","type":"integer"},"before":{"description":"Only passages with created_at <= this unix-second timestamp.","type":"integer"},"facets":{"description":"Include approximate modality/kind counts over the matches.","type":"boolean"},"highlight":{"description":"Wrap matched query terms in each snippet with **…**.","type":"boolean"},"kind":{"description":"Optional passage-kind filter (e.g. transcript, caption, ocr, metadata, user_text).","type":"string"},"lang":{"description":"Optional language-code filter, e.g. en.","type":"string"},"limit":{"maximum":100,"minimum":1,"type":"integer"},"modality":{"description":"Optional media-type filter.","enum":["audio","image","video","document","text"],"type":"string"},"mode":{"description":"Ranking mode (default hybrid when semantic search is enabled, else keyword).","enum":["keyword","semantic","hybrid"],"type":"string"},"offset":{"description":"Pagination offset.","minimum":0,"type":"integer"},"query":{"description":"The query. Max 2048 characters. See the two grammars in this tool's description: booleans and field:value only apply when the query contains no * or ~.","type":"string"},"request_id":{"description":"Optional caller-generated idempotency key. Reuse it only when retrying the same search so billing is counted once.","type":"string"},"sort":{"description":"Ordering (default relevance).","enum":["relevance","recent"],"type":"string"},"source":{"description":"Optional data-source filter (e.g. upload, gdrive).","type":"string"}},"required":["query"],"type":"object"},"name":"search"},{"description":"Get an asset's metadata and its full list of passages (with timecodes/pages). Passage text is returned here — no download needed for text. For media bytes, use request_download.\n\nFREE: this tool is not billed. Reading passages is always cheaper than buying bytes, so try this before request_download.\n\nWorks on your own assets and on any asset another tenant has published to the marketplace, listed or unlisted. A private asset returns not-found, identical to an asset that does not exist. An owner may withdraw an asset's BYTES from sale while leaving its text readable: those still answer here, and request_download refuses them.","inputSchema":{"properties":{"asset_id":{"type":"string"}},"required":["asset_id"],"type":"object"},"name":"get_asset"},{"description":"Walk the calling tenant's own catalogue, newest first. Use search to *find* something; use this to enumerate everything. Returns {assets, next}: pass the fields of `next` back as after_uploaded_at/after_asset_id for the following page; `next` is null on the last one.\n\nFREE: this tool is not billed. YOUR OWN tenant only — it never enumerates another tenant's marketplace listings. Reach those through search, or by asset id with get_asset.","inputSchema":{"properties":{"after_asset_id":{"description":"Cursor: from the previous response's next.after_asset_id.","type":"string"},"after_uploaded_at":{"description":"Cursor: from the previous response's next.after_uploaded_at.","type":"integer"},"limit":{"maximum":100,"minimum":1,"type":"integer"},"modality":{"description":"Only assets of this media type.","enum":["audio","image","video","document","text"],"type":"string"},"status":{"description":"Only assets in this state, e.g. indexed (searchable), pending (still processing), review (held for content review), rejected.","type":"string"}},"type":"object"},"name":"list_assets"},{"description":"Mint a one-time, short-lived download URL for an asset's media. Omit the range for the WHOLE file (charged for the full size), or pass start_ms/end_ms (from a hit's timecodes) to be charged only for that chunk. The returned url is absolute — GET it once to receive the bytes.\n\nCOSTS CREDITS, prepaid, 1 credit = 1 cent. The response tells you `estimated_credits` — an upper bound, exact for a whole file and generous for a range — and your `available_credits`, BEFORE you spend anything, so check them rather than discovering the price by paying it. Price scales with bytes AND modality: a gigabyte of text costs 50x a gigabyte of video. Always prefer a range over a whole file, and prefer get_asset over either when text will answer the question.\n\nCharged PER DOWNLOAD. There is no licence and no perpetual access — fetching the same asset again mints a new link and costs again, because an owner may delete their asset at any time. Retrying one minted link is free; it is single-use and delivers once.\n\nToo little credit comes back as a tool error with code `insufficient_credits`, naming what was required and what you have. It does not close the connection and it does not consume the link: top up and GET the same url again.","inputSchema":{"properties":{"asset_id":{"type":"string"},"end_ms":{"description":"Segment end (audio/video only).","type":"integer"},"search_id":{"description":"Optional search_id returned by search, for Search Analytics attribution.","type":"string"},"start_ms":{"description":"Segment start (audio/video only).","type":"integer"}},"required":["asset_id"],"type":"object"},"name":"request_download"}]}