{"openapi":"3.1.0","info":{"title":"TubeDuct","version":"0.1.0","summary":"MCP server that lets an AI agent search YouTube, read video transcripts and look up channel data.","description":"Demand-detection phase. The MCP tool inventory is published with full schemas at /.well-known/mcp.json, but only register_interest is implemented — every other tool returns a structured refusal and records the call as a demand signal. This document covers only the HTTP endpoints that exist."},"servers":[{"url":"https://tubeduct.com"}],"paths":{"/mcp":{"get":{"summary":"MCP server info","description":"Returns protocol version, server info, capabilities and agent-facing instructions. No authentication.","responses":{"200":{"description":"Server info as JSON-RPC result.","content":{"application/json":{}}}}},"post":{"summary":"MCP JSON-RPC endpoint (Streamable HTTP)","description":"Supports tools/list and tools/call. Unimplemented tools return a structured NOT_YET_IMPLEMENTED payload with a waitlist object; this is not an error. Send X-MCP-Retry: 1 on a repeat call to mark it as a retry.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{},"method":{"type":"string","enum":["initialize","ping","tools/list","tools/call","notifications/initialized"]},"params":{"type":"object"}},"required":["jsonrpc","method"]}}}},"responses":{"200":{"description":"JSON-RPC result, or a JSON-RPC error object (unknown methods answer 200 with error code -32601).","content":{"application/json":{}}},"202":{"description":"Notification accepted, no body."},"400":{"description":"Malformed JSON."}}},"delete":{"summary":"Close MCP session","responses":{"200":{"description":"Closed."}}},"options":{"summary":"CORS preflight","responses":{"204":{"description":"No content."}}}},"/a/probe":{"get":{"summary":"Record a demand signal with one unauthenticated GET","description":"For agents that can only fetch URLs. The fetch is recorded as a demand signal; `need` states what you were trying to do, `src` names the surface that advertised the link. No auth, never cached.","parameters":[{"name":"need","in":"query","required":false,"schema":{"type":"string","maxLength":500},"description":"What you are trying to do, in free text. A probe with a stated need carries more weight than a bare fetch."},{"name":"src","in":"query","required":false,"schema":{"type":"string","enum":["home","agents","llms","index-md","mcp-card","openapi"]},"description":"Which surface advertised this link. Use `openapi` if you found it here."}],"responses":{"200":{"description":"Signal recorded.","content":{"application/json":{}}}}}},"/llms.txt":{"get":{"summary":"Capability summary for LLM consumers","responses":{"200":{"description":"Plain text.","content":{"text/plain":{}}}}}},"/index.md":{"get":{"summary":"Markdown rendering of the landing page","description":"Served with X-Robots-Tag: noindex. It exists for token efficiency when an agent fetches the page live, not for search.","responses":{"200":{"description":"Markdown.","content":{"text/markdown":{}}}}}},"/.well-known/mcp.json":{"get":{"summary":"MCP server card","description":"Full tool inventory with input schemas, transport and auth mode, including tools that are not yet implemented.","responses":{"200":{"description":"Server card.","content":{"application/json":{}}}}}},"/openapi.json":{"get":{"summary":"This document","responses":{"200":{"description":"OpenAPI 3.1 document.","content":{"application/json":{}}}}}}},"x-lastModified":"2026-08-14"}