MCP, made portable.
让 AI 代理和开发者无需编写样板代码,即可调用任何 MCP 服务器。
一、概述
1.1 mcporter
mcporter 是一个 TypeScript 运行时、CLI 和代码生成工具包,专为 Model Context Protocol (MCP) 设计。它让 AI 代理和开发人员无需编写样板代码即可调用任何 MCP 服务器。
| 属性 | 说明 |
|---|---|
| 🏠 官网 | https://mcporter.sh/ |
| 🐙 GitHub | https://github.com/openclaw/mcporter |
| 📦 包管理器 | npm / pnpm / Bun / Homebrew |
| 🎯 Node.js 要求 | Node.js 24+ |
| 🖥️ 平台 | macOS (arm64 / x86_64), Linux, Windows (WSL) |
1.2 "Porter"
🚂 Porter(行李员) 在火车站之间搬运行李。mcporter 对 MCP 服务器做同样的事情:它在你的代理(或终端)和另一端的 MCP 服务器之间搬运工具调用、Schema、OAuth 令牌和 stdio 句柄。你无需提前了解服务器的具体形状,运行时保持连接温热,重复调用成本极低。
1.3 mcporter 能做的
| 分类 | 功能 |
|---|---|
| 发现与连接 | 🔍 自动发现 Cursor / Claude / Codex / Windsurf / OpenCode / VS Code 中的 MCP 服务器 |
| 🔌 支持 stdio / HTTP / SSE 三种传输协议 | |
| 🔑 内置 OAuth 认证与令牌刷新 | |
| 调用与交互 | 🛠️ 调用 MCP 工具(多种参数语法) |
| 📄 读取 MCP 资源 | |
| 🎨 多种输出格式(text / markdown / json / raw) | |
| 代码生成 | 🏗️ 生成独立 CLI(可打包为单文件) |
| 📝 生成 TypeScript 类型定义和客户端 | |
| 运行时与桥接 | ⚡ Keep-Alive 守护进程(保持状态连接) |
| 🌉 MCP 桥接(将多个服务器暴露为单个 MCP 服务器) |
1.4 适配 Agent
mcporter 遵循 Anthropic 推荐的 "code-execution-with-MCP" 模式:
跳过庞大的工具 Schema 提示词,生成一个小的类型化表面,让代理或人类像调用普通函数一样调用 MCP 服务器。
推荐工作流:
#mermaid-svg-bfSQa0OfJa3ivls3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bfSQa0OfJa3ivls3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bfSQa0OfJa3ivls3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bfSQa0OfJa3ivls3 .error-icon{fill:#552222;}#mermaid-svg-bfSQa0OfJa3ivls3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bfSQa0OfJa3ivls3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bfSQa0OfJa3ivls3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bfSQa0OfJa3ivls3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bfSQa0OfJa3ivls3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bfSQa0OfJa3ivls3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bfSQa0OfJa3ivls3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bfSQa0OfJa3ivls3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bfSQa0OfJa3ivls3 .marker.cross{stroke:#333333;}#mermaid-svg-bfSQa0OfJa3ivls3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bfSQa0OfJa3ivls3 p{margin:0;}#mermaid-svg-bfSQa0OfJa3ivls3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bfSQa0OfJa3ivls3 .cluster-label text{fill:#333;}#mermaid-svg-bfSQa0OfJa3ivls3 .cluster-label span{color:#333;}#mermaid-svg-bfSQa0OfJa3ivls3 .cluster-label span p{background-color:transparent;}#mermaid-svg-bfSQa0OfJa3ivls3 .label text,#mermaid-svg-bfSQa0OfJa3ivls3 span{fill:#333;color:#333;}#mermaid-svg-bfSQa0OfJa3ivls3 .node rect,#mermaid-svg-bfSQa0OfJa3ivls3 .node circle,#mermaid-svg-bfSQa0OfJa3ivls3 .node ellipse,#mermaid-svg-bfSQa0OfJa3ivls3 .node polygon,#mermaid-svg-bfSQa0OfJa3ivls3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bfSQa0OfJa3ivls3 .rough-node .label text,#mermaid-svg-bfSQa0OfJa3ivls3 .node .label text,#mermaid-svg-bfSQa0OfJa3ivls3 .image-shape .label,#mermaid-svg-bfSQa0OfJa3ivls3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-bfSQa0OfJa3ivls3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-bfSQa0OfJa3ivls3 .rough-node .label,#mermaid-svg-bfSQa0OfJa3ivls3 .node .label,#mermaid-svg-bfSQa0OfJa3ivls3 .image-shape .label,#mermaid-svg-bfSQa0OfJa3ivls3 .icon-shape .label{text-align:center;}#mermaid-svg-bfSQa0OfJa3ivls3 .node.clickable{cursor:pointer;}#mermaid-svg-bfSQa0OfJa3ivls3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-bfSQa0OfJa3ivls3 .arrowheadPath{fill:#333333;}#mermaid-svg-bfSQa0OfJa3ivls3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bfSQa0OfJa3ivls3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bfSQa0OfJa3ivls3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bfSQa0OfJa3ivls3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bfSQa0OfJa3ivls3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bfSQa0OfJa3ivls3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-bfSQa0OfJa3ivls3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bfSQa0OfJa3ivls3 .cluster text{fill:#333;}#mermaid-svg-bfSQa0OfJa3ivls3 .cluster span{color:#333;}#mermaid-svg-bfSQa0OfJa3ivls3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bfSQa0OfJa3ivls3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bfSQa0OfJa3ivls3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-bfSQa0OfJa3ivls3 .icon-shape,#mermaid-svg-bfSQa0OfJa3ivls3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bfSQa0OfJa3ivls3 .icon-shape p,#mermaid-svg-bfSQa0OfJa3ivls3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-bfSQa0OfJa3ivls3 .icon-shape .label rect,#mermaid-svg-bfSQa0OfJa3ivls3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bfSQa0OfJa3ivls3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-bfSQa0OfJa3ivls3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-bfSQa0OfJa3ivls3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 配置 MCP 服务器
mcporter list 查看工具签名
mcporter emit-ts 生成类型
编写小型 per-server Agent 技能
mcporter call 调用工具
需要分享?
mcporter generate-cli
二、安装
2.1 🚀 无需安装即可试用(推荐首次使用)
bash
# 查看版本
npx mcporter --version
# 列出所有已发现的 MCP 服务器
npx mcporter list
💡
npx会将包保留在 npm 缓存中,后续运行即时执行。这是推荐的第一步。
2.2 📦 npm / pnpm / Bun 安装
全局安装(推荐日常 CLI 使用):
bash
npm install -g mcporter
项目内安装(推荐在 TypeScript 项目中使用运行时 API):
bash
pnpm add mcporter # 或: npm install mcporter / bun add mcporter
📌 要求 : Node.js 24+。Bun 下也可运行。
包同时暴露可导入的运行时(
createRuntime、callOnce、createServerProxy)和mcporterCLI 二进制文件。
2.3 🍺 Homebrew(macOS)
bash
brew install steipete/tap/mcporter
如果之前从旧 tap 安装过,先运行
brew update再重新安装,确保 Homebrew 能识别新的 formula 路径。
2.4 💾 独立二进制文件(macOS)
每个发布版本提供针对 macOS arm64 和 x86_64 的 Bun 编译独立二进制文件:
| 架构 | 文件名 |
|---|---|
| Apple Silicon (M1/M2/M3/M4) | mcporter_<version>_darwin_arm64.tar.gz |
| Intel Mac | mcporter_<version>_darwin_x86_64.tar.gz |
安装步骤:
- 从 GitHub Releases 下载对应架构的 tar.gz
- 用
checksums.txt验证文件完整性 - 解压到
$PATH中的目录(如~/.local/bin/)
🔒 官方 macOS 二进制使用 OpenClaw Foundation Developer ID 团队
FWJYW4S8P8进行代码签名和 Apple 公证,包含硬化运行时和时间戳。provenance.json记录了签名标签、提交哈希、构建器版本等元数据。
2.5 ✅ 验证安装
bash
mcporter --version
mcporter list
第一次运行会打印 mcporter 从各个配置中发现的 MCP 服务器。如果没有任何输出,说明还没有配置服务器,继续往下看 👇。
2.6 🔄 更新
| 安装方式 | 更新命令 |
|---|---|
| npm | npm install -g mcporter@latest |
| pnpm | pnpm up -g mcporter@latest |
| Homebrew | brew upgrade steipete/tap/mcporter |
| 独立二进制 | 下载新版本替换旧文件 |
2.7 🗑️ 卸载
bash
# npm
npm uninstall -g mcporter
# Homebrew
brew uninstall steipete/tap/mcporter
# 独立二进制:删除 $PATH 中的文件
🧹 mcporter 将 OAuth 令牌和缓存 Schema 存储在
~/.mcporter/(或$XDG_CACHE_HOME/mcporter/)。如需完全清除,手动删除该目录。
三、快速入门:5 分钟上手
本教程使用公开的 Context7 MCP 服务器,无需现有 MCP 配置即可跟随操作。
3.1 添加 Context7 服务器
bash
npx mcporter config add context7 https://mcp.context7.com/mcp --scope home
--scope home将配置保存到用户目录(~/.mcporter/mcporter.json),不影响项目配置。
3.2 列出所有已发现的 MCP 服务器
bash
npx mcporter list
输出每行一个服务器,包含认证状态 🔐、传输类型 📡 和工具数量 🔢。常用标志:
| 标志 | 说明 |
|---|---|
--json |
机器可读 JSON 输出 |
--quiet |
静默健康检查 |
--verbose |
查看每个服务器的注册来源 |
3.3 查看单个服务器的工具签名
bash
npx mcporter list context7
输出类似 TypeScript 头文件:带 /** ... */ 文档注释的 function name(...) 签名。可选参数被精简以保持屏幕可读性。
进阶标志:
| 标志 | 说明 |
|---|---|
--brief / --signatures |
仅显示紧凑签名 |
--all-parameters |
显示所有可选参数 |
--schema |
格式化打印 JSON Schema |
--json |
机器可读 Schema |
--status |
仅状态摘要 |
3.4 调用工具
bash
# 冒号分隔标志(shell 友好)
npx mcporter call context7.resolve-library-id query:'React hooks docs' libraryName:react
# 函数调用风格(可直接从 mcporter list 输出复制)
npx mcporter call 'context7.resolve-library-id(query: "React hooks docs", libraryName: "react")'
3.5 选择输出格式
bash
# 纯文本(默认)
npx mcporter call context7.resolve-library-id query:react --output text
# Markdown
npx mcporter call context7.resolve-library-id query:react --output markdown
# JSON(适合管道处理)
npx mcporter call context7.resolve-library-id query:react --output json
# 原始输出
npx mcporter call context7.resolve-library-id query:react --output raw
💡
--json在 stdout 生成稳定 JSON 信封;人类可读的进度、提示和警告始终输出到 stderr,确保管道解析不受影响。
3.6 读取 MCP 资源
bash
# 列出资源
npx mcporter resource my-resource-server
# 读取特定资源
npx mcporter resource my-resource-server file:///path/to/spec.md
3.7 生成独立 CLI
当你想分享一个工具给不需要学习 mcporter call 的人:
bash
npx mcporter generate-cli context7 --runtime node --bundler rolldown --bundle dist/context7.js
# 使用生成的 CLI
node dist/context7.js resolve-library-id --query 'React hooks docs' --library-name react
3.8 生成类型化客户端
bash
# 仅类型定义
npx mcporter emit-ts context7 --mode types --out types/context7-tools.d.ts
# 完整客户端(含工厂函数)
npx mcporter emit-ts context7 --mode client --out src/context7-client.ts