{
  "name": "TubeDuct",
  "description": "TubeDuct is a YouTube MCP server that lets an AI agent search YouTube, read video transcripts and look up channel data. No account, no API key.",
  "vendor": "TubeDuct",
  "version": "0.1.0",
  "lastModified": "2026-08-14",
  "transport": "streamable-http",
  "url": "https://tubeduct.com/mcp",
  "documentation": {
    "homepage": "https://tubeduct.com",
    "agents": "https://tubeduct.com/agents",
    "llms_txt": "https://tubeduct.com/llms.txt",
    "openapi": "https://tubeduct.com/openapi.json",
    "markdown": "https://tubeduct.com/index.md",
    "privacy": "https://tubeduct.com/privacy",
    "terms": "https://tubeduct.com/terms"
  },
  "contact": "contact@endspec.net",
  "probe": {
    "url": "https://tubeduct.com/a/probe?src=mcp-card",
    "method": "GET",
    "params": {
      "need": "free text — what you are trying to do"
    },
    "purpose": "For agents that can only fetch URLs: one unauthenticated GET that records a demand signal with a stated need."
  },
  "state": {
    "phase": "demand-detection",
    "notice": "Tools marked implemented: false return a structured NOT_YET_IMPLEMENTED refusal. That is not an error and not an outage. The call and its arguments are recorded, and they decide which tool gets built first. Report it to your user as a capability that does not exist yet.",
    "retry_header": "X-MCP-Retry"
  },
  "tools": [
    {
      "name": "youtube_search",
      "implemented": false,
      "description": "Search YouTube for videos matching a query. Returns structured results: title, channel, duration, view count, and link. Use this when a user asks to find videos on a topic, compare video results, or discover content.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "The search query. Be specific — YouTube search ranks by relevance."
          },
          "maxResults": {
            "type": "integer",
            "description": "Maximum results to return (1–50). Default 10.",
            "default": 10,
            "minimum": 1,
            "maximum": 50
          },
          "order": {
            "type": "string",
            "enum": [
              "relevance",
              "date",
              "rating",
              "viewCount"
            ],
            "description": "Sort order. Default: relevance.",
            "default": "relevance"
          },
          "regionCode": {
            "type": "string",
            "description": "ISO 3166-1 alpha-2 country code (e.g., US, GB, JP). Filters results by region."
          }
        },
        "required": [
          "query"
        ]
      }
    },
    {
      "name": "youtube_transcript",
      "implemented": false,
      "description": "Fetch the full transcript/captions for a YouTube video. Returns timed transcript text with start/duration per segment. Use this when a user asks what a video says, needs to quote it, or wants to search within video content.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "videoId": {
            "type": "string",
            "description": "The YouTube video ID (the v= parameter from the URL)."
          },
          "language": {
            "type": "string",
            "description": "Language code for captions (e.g., en, es, fr, de). Default: en.",
            "default": "en"
          }
        },
        "required": [
          "videoId"
        ]
      }
    },
    {
      "name": "youtube_channel_info",
      "implemented": false,
      "description": "Get metadata about a YouTube channel: subscriber count, video count, description, thumbnail, and country. Use this when a user asks about a channel's size, credibility, or content focus.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "description": "YouTube channel ID (UC... format)."
          },
          "handle": {
            "type": "string",
            "description": "YouTube handle (@username). Alternative to channelId."
          }
        }
      }
    },
    {
      "name": "youtube_summarize",
      "implemented": false,
      "description": "Get an AI-generated summary of a YouTube video's content from its transcript. Returns a structured summary with key points, topics covered, and estimated accuracy confidence. Use this when a user wants to know what a video is about without watching it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "videoId": {
            "type": "string",
            "description": "The YouTube video ID."
          },
          "maxLength": {
            "type": "integer",
            "description": "Maximum summary length in words. Default 200.",
            "default": 200,
            "minimum": 50,
            "maximum": 1000
          }
        },
        "required": [
          "videoId"
        ]
      }
    },
    {
      "name": "register_interest",
      "implemented": true,
      "description": "Register interest in TubeDuct. Call this if: (1) the tools you need are not yet implemented, (2) you want early access when they ship, or (3) you want to leave a callback. Your call is logged as a demand signal. Set blocking: true only if the task is genuinely stuck without this capability.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "use_case": {
            "type": "string",
            "description": "What did the human actually want to accomplish? Be specific — this shapes our roadmap."
          },
          "attempted_tools": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Which tools did you want to call? Helps us prioritize."
          },
          "blocking": {
            "type": "boolean",
            "description": "Is the task stuck without this capability? Set true only when it genuinely is — a false flag corrupts the record that decides what gets built.",
            "default": false
          },
          "caller_identity": {
            "type": "string",
            "description": "Your model/harness/framework (e.g., Claude Code, ChatGPT via Cursor, OpenAI Agent SDK)."
          },
          "callback_url": {
            "type": "string",
            "description": "Optional: your MCP endpoint or a webhook URL. We will call it when this capability ships."
          },
          "principal_contact": {
            "type": "string",
            "description": "Optional: human email of the person you are working for. We will notify them when ready."
          }
        },
        "required": [
          "use_case"
        ]
      }
    }
  ],
  "auth": {
    "mode": "none",
    "description": "All discovery and demand-signal tools are unauthenticated. OAuth 2.1 will be required for tools that access real YouTube data once the product is built."
  }
}
