mcpField
S
Slideless

Slideless

远程服务
github.com/slideless-ai生产力020 周前更新
代码仓库

关于 Slideless

Slideless 是用于通过 MCP 主机管理 Slideless HTML 演示文稿的 MCP 服务。它提供上传、版本查看、共享、协作和市场列表工具,并支持 OAuth 或 API 密钥认证。

主要功能

  1. 01列出演示文稿和版本
  2. 02上传单文件或多文件演示文稿
  3. 03共享演示文稿并管理协作者
  4. 04浏览和发布市场列表
  5. 05支持 OAuth 和 API 密钥认证

适用场景

  1. 01从 MCP 主机上传 HTML 演示文稿
  2. 02查看演示文稿版本和文件内容
  3. 03共享演示文稿或邀请协作者
  4. 04查找或发布可混编的市场列表

MCP 相关

它将 Slideless HTTP API 封装为 MCP 工具,并通过 Streamable HTTP 端点提供服务。MCP 客户端可使用 OAuth 2.1 或静态 API 密钥进行认证。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://mcp.slideless.ai/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

详细介绍

slideless-mcp

Slideless 的 MCP 服务。它将 Slideless HTTP API 封装为 Model Context Protocol 工具,让用户无需安装 slideless CLI,即可通过任意 MCP 宿主(Claude Desktop、claude.ai、ChatGPT desktop、Cursor 等)列出、分享、上传和管理 HTML 演示文稿。

托管在 Vercel(Next.js App Router + mcp-handler)上,地址为 https://mcp.slideless.ai/mcp。已列入官方 MCP 注册表,名称为 ai.slideless/mcp。

架构

无状态的 Next.js 路由处理程序,采用 streamable-HTTP 传输,不使用会话存储。每次调用 /mcp 时都会构建一个 McpServer,并将用户的 Authorization 标头原样转发至位于 europe-west1 的 Slideless Cloud Functions。没有数据库,也没有需要轮换的密钥——用户令牌不会离开请求。

Claude / ChatGPT  →  mcp.slideless.ai/mcp  (Vercel / Next.js)
                          │
                          ▼
                 europe-west1-slideless-ai.cloudfunctions.net

身份验证

该服务是 OAuth 2.1 资源服务器。它本身不托管身份验证流程,而是将 app.slideless.ai 声明为授权服务器,并将令牌转发至负责验证令牌的 Cloud Functions。服务接受两种标头格式,并会将其原样转发:

  • OAuth(推荐)——支持 OAuth 的宿主(Claude Desktop、claude.ai)会自动发现流程:向 /mcp 发送未经身份验证的请求会返回 401,并附带指向 /.well-known/oauth-protected-resource(RFC 9728)的 WWW-Authenticate 标头;该地址会指向 app.slideless.ai。用户在浏览器中登录或注册并授权,无需粘贴密钥。授权服务器会在后台生成新的 API 密钥。
  • 静态 API 密钥——支持自定义标头的宿主(Cursor、Claude Code)可以直接发送 Authorization: Bearer cko_…。
用作连接器
  1. 在 Claude Desktop / claude.ai / ChatGPT 中:添加自定义连接器,URL 为 https://mcp.slideless.ai/mcp。
  2. 宿主会发现 OAuth 并打开 Slideless 登录页面。授权后即可连接。
  3. (仅适用于使用静态密钥的宿主)在 https://app.slideless.ai → Settings → API Keys 获取 cko_… 密钥,并将其设为 Authorization 标头。

工具

工具功能
slideless_whoami身份检查——返回组织、密钥名称和权限范围
slideless_list_presentations列出自己拥有及受邀访问的演示文稿
slideless_get_presentation获取某个演示文稿的完整信息(令牌、协作者)
slideless_list_versions列出演示文稿的版本历史
slideless_get_version获取指定版本的清单
slideless_download_version获取清单及内联文本文件内容(HTML/CSS/JS,每个文件最多 256 KB)
slideless_upload_html_presentation上传单文件 HTML 演示文稿
slideless_upload_presentation_files上传多文件演示文稿(base64 数组)
slideless_add_share_token生成公开查看链接
slideless_set_token_version_mode将令牌固定到某个版本或取消固定
slideless_unshare_presentation撤销一个或全部分享令牌
slideless_share_via_email通过电子邮件发送分享链接
slideless_invite_collaborator授予其他用户开发权限(发送电子邮件)
slideless_uninvite_collaborator撤销协作者的权限
slideless_list_collaborators列出演示文稿的协作者
slideless_delete_presentation永久删除演示文稿
slideless_search_marketplace在公开市场中搜索可混编的演示文稿、应用和方案(无需密钥)
slideless_get_marketplace_listing按 slug 获取某个市场条目的完整详情(无需密钥)
slideless_remix_listing混编某个条目——返回清单及所有文本文件的内联内容(无需密钥)
slideless_publish_listing将已推送的演示文稿发布到市场(需要 marketplace:publish 权限范围)
slideless_star_listing代表已连接的用户为市场条目加星
slideless_unstar_listing移除已连接用户对某个条目的星标

本地开发

pnpm install
pnpm dev            # next dev → http://localhost:8787

使用 MCP Inspector 测试:

npx @modelcontextprotocol/inspector
# Transport: Streamable HTTP
# URL: http://localhost:8787/mcp
# Header: Authorization: Bearer cko_<your-key>

或使用原始 curl(初始化握手):

curl -s http://localhost:8787/mcp -X POST \
  -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
  -H "Authorization: Bearer cko_<your-key>" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}'

类型检查:pnpm typecheck。

部署

推送到 main 后,Vercel 会自动部署到生产环境(项目 codika/slideless-mcp)。手动部署:

vercel deploy --prod --scope codika

速率限制由 Vercel WAF 规则在边缘执行(通过 vercel firewall CLI 管理),匹配 path 以 /mcp 开头的请求:

  • mcp-per-ip → 60 次请求 / 10 秒,按 IP 计数
  • mcp-per-key → 600 次请求 / 60 秒,按 Authorization 标头计数(因此每个 API 密钥 / OAuth 令牌都有独立的计数桶)

超过限制时,两者都会在函数运行前返回 429。使用以下命令重新创建:

vercel firewall rules add "mcp-per-ip" --condition '{"type":"path","op":"pre","value":"/mcp"}' \
  --action rate_limit --rate-limit-window 10 --rate-limit-requests 60 --rate-limit-keys ip --yes
vercel firewall rules add "mcp-per-key" --condition '{"type":"path","op":"pre","value":"/mcp"}' \
  --action rate_limit --rate-limit-window 60 --rate-limit-requests 600 --rate-limit-keys header:authorization --yes
vercel firewall publish --yes

源码布局

app/
├── layout.tsx                                  # minimal root layout
├── page.tsx                                    # landing page (/)
├── [transport]/route.ts                        # MCP endpoint (/mcp); per-request client + 401 challenge
└── .well-known/oauth-protected-resource/route.ts  # RFC 9728 metadata → app.slideless.ai
src/
├── config.ts             # base URL, server identity (SEP-973 branding), instructions
├── http.ts               # OAuth metadata, CORS, 401 challenge builders
├── server.ts             # registerAllTools entry point
├── slidelessClient.ts    # typed fetch wrapper around the Cloud Functions
├── types.ts              # wire shapes (mirrors slideless-app types/)
├── errors.ts             # SlidelessApiError + wrapToolErrors
└── tools/
    ├── identity.ts       # slideless_whoami
    ├── presentations.ts  # list / get / versions / download / delete
    ├── upload.ts         # upload_html / upload_files (3-step orchestration)
    ├── sharing.ts        # tokens, version mode, unshare, email
    ├── collaborators.ts  # invite / uninvite / list
    └── marketplace.ts    # search / get / remix / publish / star / unstar
server.json               # MCP registry metadata (ai.slideless/mcp)

相关代码库

  • slideless-app — 此服务代理的后端 Cloud Functions(也承载 OAuth 2.1 授权服务器)
  • slideless-cli — 使用同一 API 的 npm CLI
  • slideless-plugin — Claude Code 插件(配套的创作与上传技能)

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。