MCP YouTube Transcript
An MCP server retrieving transcripts of YouTube videos
作者提供的说明(英文原文)
Create and manage CodeQR short links, QR codes, and analytics from any MCP client.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
适用于网页版、桌面版和手机版 Claude:
https://mcp.codeqr.io/mcp在终端中运行这条命令
claude mcp add --transport http codeqr https://mcp.codeqr.io/mcp粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"codeqr": {
"url": "https://mcp.codeqr.io/mcp"
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"codeqr": {
"type": "http",
"url": "https://mcp.codeqr.io/mcp"
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
ChatGPT 只能连接互联网上的服务器:
https://mcp.codeqr.io/mcp菜单名称可能因套餐和版本不同而略有差异。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
我们还没有读取这个服务器的工具列表;我们会轮流检查各个端点。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过域名 codeqr.io 验证(注册中心会核实域名所有权)
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
尚未检查;我们会轮流检查各个端点
尚未检查;我们会轮流检查各个端点
尚未检查;我们会在检查端点时读取工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在作者的云端运行。通过互联网连接,无需安装,但你发送的内容会经过作者的服务器。
GitHub 仓库最后更新于–,最新版本(0.1.0)于3个月前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。它通过 URL 连接,所以接受远程 MCP 服务器的应用也可以使用,例如开启开发者模式的 ChatGPT。
同一分类中有:MCP YouTube Transcript, Google Analytics MCP, BibiGPT YouTube Video Summarizer
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
An MCP server retrieving transcripts of YouTube videos
GA4 MCP server for AI agents: schema discovery, server-side aggregation, analysis-ready defaults.
AI video summarizer: summarize and transcribe YouTube, Bilibili, TikTok and podcast videos.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
Remote MCP server for CodeQR with OAuth 2.0 authentication. Compatible with ChatGPT, OpenAI Agents SDK, Grok (xAI), and any MCP client supporting Streamable HTTP transport.
┌──────────┐ ┌─────────────────────┐ ┌──────────┐
│ ChatGPT │ │ CodeQR MCP Remote │ │ CodeQR │ │ or any │─────▶│ │─────▶│ API │ │ MCP │◀─────│ OAuth 2.0 + MCP │◀─────│ │ │ client │ │ Streamable HTTP │ │ │ └──────────┘ └─────────────────────┘ └──────────┘
/.well-known/oauth-protected-resourcePOST /oauth/registerGET /oauth/authorize shows this server's consent screen — the app's self-declared name, marked unverified unless its exact redirect URI is listed in src/oauth/verified-clients.ts, and the host that redirect URI points at. On approval the user goes to CodeQR, where they log in, choose which project to grant access to, and approve — no API key is ever handled. The callback only completes in the browser that approved.GET /oauth/callback, which trades the code for an access + refresh token pairPOST /mcpThe CodeQR access token lasts 7 days and is renewed transparently. Each renewal gives the session another 120 days, so a connection in use does not expire on a fixed date; an idle one ends 120 days after its last renewal, and none outlives one year from when it was made (the expires_in the client is given).
# Install dependencies
npm install
cp .env.example .env
npm run dev
npm run build npm start
The project is configured for Vercel serverless functions:
# Install Vercel CLI
npm i -g vercel
vercel
The app will be available at https://your-project.vercel.app. All routes are handled by the serverless function at api/server.ts.
OAuth storage: Set Upstash Redis (UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN) so authorization codes, access tokens, and registered clients persist across serverless invocations. If these variables are omitted, the server falls back to an in-memory store (fine for local development only).
docker build -t codeqr-mcp-remote .
docker run -p 3000:3000 -e SERVER_URL=https://mcp.codeqr.io codeqr-mcp-remote
Set environment variables:
SERVER_URL — Your public server URL (e.g., https://mcp.codeqr.io)UPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKEN — Recommended for multi-instance or restartsPORT — Port (usually set automatically by the platform)https://mcp.codeqr.io/mcp)from openai import OpenAI
client = OpenAI()
response = client.responses.create( model="gpt-4o", tools=[{ "type": "mcp", "server_label": "codeqr", "server_url": "https://mcp.codeqr.io/mcp", "require_approval": "never", }], input="Create a short link for https://codeqr.io", )
| Tool | Description |
|---|---|
create_link | Create a shortened link |
list_links | List all short links |
get_link_info | Get link details |
update_link | Update a link |
delete_link | Delete a link |
create_qrcode | Create a dynamic QR code encoding a URL, Wi-Fi credentials, a contact card, WhatsApp, email, SMS, a phone number, text or a crypto request |
list_qrcodes | List all QR codes |
update_qrcode | Change where an existing QR code points, without reprinting it |
delete_qrcode | Delete a QR code; printed copies stop resolving |
get_analytics | Query click analytics |
list_domains | List custom domains |
list_tags | List tags |
create_tag | Create a tag |
get_workspace | Read the authorized workspace: name, slug and plan |
Conversion event tools are not offered. track_lead and track_sale need the conversions.write scope, which CodeQR grants to workspace owners only, and requesting it makes CodeQR reject the whole authorization for everyone else. The per-link trackConversion toggle is a links.write field and IS exposed on create_link/update_link (plans that include conversion tracking only).
Smart rules are exposed on create_link/update_link as rules: conditional routing by any of the twelve attributes the API implements, and traffic splitting across 2-4 destinations, which is how an A/B test is expressed — one rule with no condition and a split. Where the workspace doesn't have smart rules enabled, the API rejects the whole call — the create or update fails outright, so no link or QR code is created without the rules it asked for — and the server doesn't forward that rejection as-is: it reports that smart rules aren't enabled on this workspace, with a link to details. src/plan-limit-message.ts recognizes plan wording it knows: a capability gate like this one becomes "isn't enabled on this workspace", a quota becomes "has reached its limit of N …"; anything it doesn't recognize passes through unchanged. Four of the field's invariants cannot be stated in JSON Schema (weights totalling 100, url xor split, the all-or-nothing condition, the unconditional rule coming last), so they are checked in src/smart-rules.ts before the request is sent — which saves a round-trip and answers in a sentence, rather than the serialized error body the SDK surfaces.
The trap worth knowing: value is compared whole and case-insensitively against what the request carries, which for three attributes is narrower than the name suggests. device is the operating system (iOS, Android, Windows, Mac OS, Linux — never mobile), language a two-letter code, referrer a bare domain. A wrong value is not an error anywhere: the API accepts any string and the rule silently never matches.
create_qrcode/update_qrcode also take title and walletPass. title sets the QR code's display title and is printed in large type on the Google/Apple Wallet pass saved from the code (replacing "QR Code"). Within walletPass, name and logo override the workspace name and logo shown on that pass, and barcodeText sets the text shown under the QR code, e.g. a member name or card number; when it is absent, CodeQR sends no text for that line — the title is never repeated there. Custom branding is only available on plans that include it, and never during a trial: a new non-null walletPass is rejected with 403 on any other plan or during a trial, while null (clearing it) is always accepted. Outside those plans, or during a trial, a stored value is ignored when the pass is built, so passes fall back to the workspace name and logo. logo is an https URL: the API downloads it and stores its own copy, so the response returns that copy's URL, not the one sent. barcodeText is 1-40 characters after trimming. On update_qrcode, an object replaces the stored value as a whole (a field left out of it is cleared, not merged) — send name, logo and barcodeText together to keep all three; null clears the override and reverts to the workspace branding, the same way rules: null ends a running smart-rules test.
With MCP_UI_ENABLED=1, hosts that render MCP Apps (ChatGPT, Claude) show a card for the QR code or short link returned by create_qrcode, update_qrcode, create_link, update_link and get_link_info: its image, short link with a copy button, whether it is dynamic, the destination and the scan or click count, plus a button to open it in the CodeQR dashboard and one that asks how many scans or clicks it had.
_meta.ui.resourceUri points at ui://codeqr/item-card.v1.html, served through resources/read (src/widgets/). Each read is logged as mcp.resource_read.structuredContent (an allowlist of fields; hosts show it to the model too) and _meta["io.codeqr/card"] (image and dashboard URLs, for the card only). content is unchanged, for clients without UI.get_analytics gets an analytics card (ui://codeqr/analytics.v1.html): what is counted and for which period, the total, a trend line or the top five rows, and a button to open the analytics in the dashboard. Its 24h / 7d / 30d chips re-run the call from inside the card through the host (tools/call), only when the host says it can, and only with intervals every plan can read.web/item-card/ and web/analytics/, with the bridge to the host in web/shared/. yarn widgets:build bundles them into src/widgets/generated/, which is committed; yarn verify fails when it is stale. To look at them in a browser, run node scripts/build-widgets.mjs --html, serve web/dev/ and open harness.html?fixture=qr&theme=dark&locale=pt-BR&width=375 or harness.html?widget=analytics&fixture=countries&interval=30d.Unset, the tool list, the resource list and every result are what they were.
| Method | Path | Auth | Description |
|---|---|---|---|
| GET | /health | No | Health check |
| GET | /.well-known/oauth-protected-resource | No | OAuth resource metadata (RFC 9728) |
| GET | /.well-known/oauth-authorization-server | No | OAuth server metadata (RFC 8414) |
| POST | /oauth/register | No | Dynamic client registration (RFC 7591) |
| GET | /oauth/authorize | No | Consent screen: which app, and where access is sent |
| POST | /oauth/authorize | No | Consent decision; on approval redirects to CodeQR |
| GET | /oauth/callback | No | Return leg from CodeQR |
| POST | /oauth/token | No | Token exchange |
| POST | /mcp | Bearer | MCP Streamable HTTP endpoint |
src/
├── index.ts # Express app & server startup ├── config.ts # Environment configuration ├── oauth/ │ ├── store.ts # OAuth state: Upstash Redis or in-memory fallback │ └── pkce.ts # PKCE S256 verification ├── middleware/ │ └── auth.ts # Bearer token validation middleware └── routes/ ├── well-known.ts # OAuth discovery metadata endpoints ├── oauth.ts # Authorization & token endpoints └── mcp.ts # MCP tool definitions & handlers
.env.example) for serverless and multi-instance deployments. Without it, the in-memory store is used (single process only).只显示了开头部分;其余内容请在仓库中阅读