返回 MCP 目录
public公开dns本地运行

SMCP Proxy (OIDC)

SMCP Proxy是一个为Model Context Protocol (MCP)服务设计的反向代理,提供OIDC认证的安全层,支持企业级认证和授权,简化与大型语言模型(LLM)的标准化交互。

article

README

🚀 SMCP 代理指南

SMCP 代理是一个支持多种模型服务协议的中间件,允许用户通过统一接口访问不同后端服务,为用户提供便捷的服务调用体验。

🚀 快速开始

SMCP 代理是一个支持多种模型服务协议的中间件,允许用户通过统一接口访问不同后端服务。以下是基本使用示例:

示例配置 (proxy-server.yml)

global:
  port: 8080
  host: "localhost"
  log_level: "info"
  enable_metrics: true

backends:
  mcp-sequential:
    url: "http://localhost:3001/api"
    strip_path: "/v1/sequentialthinking"

  mcp-memory:
    command: "docker"
    args:
      - run
      - --rm
      - -i
      - mcr.microsoft.com/hugginginception/transformers Glenn Glock/llama2-70b-instruct

✨ 主要特性

  • 高可用性:支持负载均衡和故障转移。
  • 可扩展性:便于添加新的后端服务。
  • 高性能:通过中间件优化请求处理。

📦 安装指南

从源码安装

  1. 克隆仓库:
git clone git@github.com:yourusername/smc-proxy.git
cd smc-proxy
  1. 下载依赖并构建:
go mod tidy
go build -o bin/smc cmd/sm/main.go
  1. 安装到系统目录(可选):
sudo cp bin/smc /usr/local/bin/

从二进制文件安装

下载预编译的二进制文件,根据你的操作系统选择对应的版本。

💻 使用示例

基础用法

场景一:统一接口访问多后端

curl http://localhost:8080/api/prompt \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-3.5-turbo", "messages":[{"role":"user","content":"你好!"}]}'

场景二:集成到现有系统

package main

import (
    "net/http"
)

func main() {
    http.ListenAndServe(":8081", smc.NewRouter())
}

高级用法

这里可以根据实际的高级使用场景进行补充说明,如果没有则可忽略。

📚 详细文档

配置参考

全局配置

| 参数名 | 类型 | 默认值 | 描述 | | ---- | ---- | ---- | ---- | | port | int | 8080 | 代理服务器监听端口 | | host | string | "localhost" | 监听地址 | | log_level | string | "info" | 日志级别:debug, info, warning, error | | enable_metrics | bool | false | 是否启用 metrics |

后端配置

支持两种类型的后端:

  1. HTTP 类型
backend_name:
  transport: "http"
  url: "http://example.com/mcp"
  1. Stdio 类型
backend_name:
  transport: "stdio"
  command: "docker"
  args:
    - run
    - --rm
    - -i
    - your/image:tag

模型服务协议

基本请求格式

POST /api/prompt HTTP/1.1
Content-Type: application/json

{
  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "role": "user",
      "content": "你好!"
    }
  ]
}

返回格式

HTTP/1.1 200 OK
Content-Type: application/json

{
  "id": "chatcmpl-XXXXX",
  "choices": [
    {
      "message": {
        "role": "assistant",
        "content": "你好!很高兴见到你。"
      }
    }
  ]
}

🔧 技术细节

项目结构

smc-proxy/
├── cmd/
│   └── sm/                # 主程序入口
│       ├── main.go        # 入口文件
│       └── config.go      # 配置加载逻辑
├── internal/
│   ├── middleware/       # 中间件实现
│   │   ├── log.go        # 日志记录中间件
│   │   └── recovery.go   # 错误恢复中间件
├── go.mod                # 依赖管理文件
└── go.sum                # 依赖校验文件

中间件

日志记录

在每个请求开始时记录日志:

func LogMiddleware(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        log.Printf("Started %s %s", r.Method, r.URL.Path)
        next(w, r)
    }
}

错误恢复

处理panic并返回自定义错误:

func RecoveryMiddleware(next http.HandlerFunc) http.HandlerFunc {
    panicChan := make(chan interface{}, 1)
    go func() {
        defer func() { recover }()
        next(nil, nil)
    }()
    select {
    case <-panicChan:
        // 处理panic信息
    }
}

📄 许可证

本项目遵循MIT License协议。

⚠️ 重要提示

  • 性能调优:使用Golang的sync.Pool优化内存使用,避免在中间件中执行阻塞操作。
  • 日志管理:根据环境设置不同的日志级别,定期清理旧日志文件。
  • 安全措施:启用HTTPS以确保数据传输安全,配置CORS策略控制跨域访问。

💡 使用建议

在安装和使用过程中,严格按照文档步骤进行操作,遇到问题可查看相关配置和日志信息进行排查。

help

运行方式说明

cloud

托管运行

托管运行通常表示这个 MCP Server 由服务方环境承载,用户一般按页面提供的连接方式或授权流程接入,不需要在本地长期启动一个 MCP 进程

  1. 打开服务方连接页
  2. 完成授权或复制端点
  3. 在 MCP 客户端中连接
terminal

本地运行 / 其它方式

本地运行通常需要用户在自己的电脑或服务器上安装依赖,把 server_config 复制到 MCP 客户端,并按 env_schema 补齐环境变量、密钥或其它配置

  1. 复制 server_config
  2. 安装所需依赖
  3. 补齐环境变量后重启客户端