1.3 远程服务器:streamable-http
什么时候用 HTTP
服务器不在你机器上,而是别人托管好的服务。典型如 Notion、Slack、Sentry、Stripe 的官方端点。
优势很明显:不用装任何东西,通常走 OAuth 授权,权限跟着你已有的账号体系走。对团队来说,这意味着不用在每台开发机上配置同一套密钥——权限在云端账号里统一管。
前提只有一条,但很硬:上游服务必须已经运行。 DSH 不会替你把远程服务拉起来,它只负责连过去。
配置形状
远程服务器改用 transport: streamable-http、url 和 headers:
- insert:
- id: notion
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: notion
transport: streamable-http
url: https://mcp.notion.com/mcp
headers: {}
需要带令牌时写 headers:
headers:
Authorization: !!js "'Bearer ' + process.env.MY_TOKEN"
注意那个字符串拼接:Authorization 头的值必须是完整字符串,用 !!js 从环境拼出来,别把 token 明文写进 YAML。这一点和 stdio 的 config.env 写法不同,但“密钥不进 YAML”的纪律完全一致。
已核验的官方远程端点
| 服务 | 端点 | 说明 |
|---|---|---|
| Notion | https://mcp.notion.com/mcp |
官方 |
| Slack | https://mcp.slack.com/mcp |
官方 |
| Sentry | https://mcp.sentry.dev/mcp |
官方 |
| Stripe | https://mcp.stripe.com/mcp |
官方 |
| Asana | https://mcp.asana.com/sse |
官方 |
| Exa | https://mcp.exa.ai/mcp |
官方远程 |
这些端点无需本地安装,走 OAuth 或 API key。OAuth 类(Notion、Slack、Sentry)在首次连接时由 dsh 引导你在浏览器里授权;API key 类(Exa)则把 key 放进 headers 或对应的环境变量。
OAuth 与 API key 两种鉴权
远程端点分两类鉴权,配置姿势不同:
| 鉴权方式 | 例子 | 你在 YAML 里做什么 |
|---|---|---|
| OAuth | Notion、Slack、Sentry、Stripe | 只写 url,首次连接走浏览器授权 |
| API key / Bearer | Exa、自建服务 | 把 key 拼进 headers,用 !!js 读环境 |
OAuth 的好处是密钥完全不碰你的配置文件——授权后由服务商返回一个短期令牌,过期自动续。API key 则需要你自己在 headers 里接好,务必用 !!js 从环境读取,不要硬编码。
与 stdio 的对比
| 维度 | stdio | streamable-http |
|---|---|---|
| 服务器位置 | 本机 | 远程 |
| 安装 | 需要 | 不需要 |
| 启停 | DSH 管 | DSH 不管 |
| 凭据 | config.env |
headers / OAuth |
| 隔离性 | 进程级隔离 | 依赖服务商 |
| 网络依赖 | 无 | 必须有 |
| 离线可用 | 是 | 否 |
选型很简单:本地工具用 stdio,云端服务用 HTTP。 如果你部署了一个自建 MCP 服务在局域网或云上,它也走 HTTP——此时“上游必须已在运行”这条前提由你自己保证。
什么时候 HTTP 不合适
反过来也要知道边界:
| 场景 | 更该用 stdio |
|---|---|
| 处理本机文件、本机数据库 | 远程服务器够不着本机资源 |
| 对延迟极度敏感、数据不出本机 | 走网络多一跳且数据出网 |
| 没有稳定可访问的远端服务 | 自己没部署就别选 HTTP |
一句话:HTTP 适合“服务已经在外面”,stdio 适合“能力装在我机器上”。两者不是优劣关系,是位置决定的。
排错要点
HTTP 场景的失败模式和 stdio 不同:
| 现象 | 原因 |
|---|---|
| 一直连不上 | 上游未运行 / 网络不通 / 需要代理 |
| 401 / 403 | 令牌缺失或过期,检查 headers |
| 工具列出来但调用失败 | 账号权限不足(如 Notion 页面没共享给集成) |
| 时断时续 | 远程服务限流或网络抖动 |
第三项特别容易忽略:Notion 类的服务,授权之后还要把具体页面共享给集成,否则工具能列出来、一调用就报无权限。Slack 同理——频道要先把对应 App 邀请进去。
小结
- HTTP 用于远程托管服务器,无需本地安装,但上游必须已在运行。
- 三个字段:
url+headers+transport: streamable-http。 - OAuth 只写
url走浏览器授权;API key 用!!js拼进headers,不写明文。 - HTTP 失败多与网络、令牌、账号权限三者相关,逐个排除。
延伸阅读
- 官方接入说明:连接第三方记忆 MCP 服务
- 本书后续:1.4 持久化、密钥与验证排错
- 本章其余小节:1.2 第一份配置:stdio 传输
- 相关能力:DeepSeek Harness 网络代理与启动排错
