您现在的位置是:网站首页> AI人工智能

三大AI协议:MCP、ACP与A2A

摘要

三大AI协议:MCP、ACP与A2A


1.jpg


MCP

AI学习MCP收集咒语

AI模型调用MCP服务及实用MCP服务


AI学习MCP收集咒语

基础应用例子



Q:AI大模型Agent的MCP函数授权有接口规范吗?

A:..

Q:除用 Python编写MCP服务还有哪些语言编写比较方便出除JAVA

A:...

Q:用 Go写个MCP例子并给出调用例子

A:...

Q:加上鉴权

A:...

完整代码:Go MCP + 鉴权

main.go(直接复制运行)package main


import (

"encoding/json"

"fmt"

"log"

"net/http"

"strings"

)


// ======================

// 配置:你的 Token(生产环境从配置文件/环境变量读取)

// ======================

const (

ValidToken        = "mcp-agent-2025-go-demo" // 合法 Token

AuthServerURL     = "https://auth.example.com"

RequiredScope     = "tools:read write"

)


// ------------------------------

// MCP JSON-RPC 标准结构

// ------------------------------

type JsonRPCRequest struct {

JsonRPC string      `json:"jsonrpc"`

ID      interface{} `json:"id"`

Method  string      `json:"method"`

Params  any         `json:"params,omitempty"`

}


type JsonRPCResponse struct {

JsonRPC string      `json:"jsonrpc"`

ID      interface{} `json:"result,omitempty"`

Result  interface{} `json:"result,omitempty"`

Error   interface{} `json:"error,omitempty"`

}


// ------------------------------

// MCP 工具列表

// ------------------------------

var tools = []map[string]interface{}{

{

"name":        "get_weather",

"title":       "获取天气",

"description": "根据城市查询实时天气",

"inputSchema": map[string]interface{}{

"type": "object",

"properties": map[string]interface{}{

"city": map[string]interface{}{

"type":        "string",

"description": "城市名,例如:北京",

},

},

"required": []string{"city"},

},

"annotations": map[string]interface{}{

"scopes": []string{"tools:read"},

},

},

}


// ------------------------------

// 鉴权中间件(核心)

// ------------------------------

func authMiddleware(next http.HandlerFunc) http.HandlerFunc {

return func(w http.ResponseWriter, r *http.Request) {

authHeader := r.Header.Get("Authorization")


// 1. 无 Header

if authHeader == "" {

sendMCPAuthError(w)

return

}


// 2. 提取 Bearer Token

parts := strings.Split(authHeader, " ")

if len(parts) != 2 || strings.ToLower(parts[0]) != "bearer" {

sendMCPAuthError(w)

return

}


// 3. 校验 Token

if parts[1] != ValidToken {

sendMCPAuthError(w)

return

}


// 鉴权通过 → 进入业务

next(w, r)

}

}


// ------------------------------

// MCP 标准 401 鉴权拒绝响应

// ------------------------------

func sendMCPAuthError(w http.ResponseWriter) {

w.Header().Set("Content-Type", "application/json")

w.WriteHeader(401)

json.NewEncoder(w).Encode(map[string]interface{}{

"error": map[string]interface{}{

"code":    401,

"message": "Unauthorized: Invalid or missing token",

},

// MCP PRM 规范:告诉客户端去哪里获取 Token

"authorization_server": AuthServerURL,

"scopes":               strings.Split(RequiredScope, " "),

"token_types":          []string{"Bearer"},

})

}


// ------------------------------

// MCP 业务处理

// ------------------------------

func mcpHandler(w http.ResponseWriter, r *http.Request) {

w.Header().Set("Content-Type", "application/json")


var req JsonRPCRequest

if err := json.NewDecoder(r.Body).Decode(&req); err != nil {

json.NewEncoder(w).Encode(JsonRPCResponse{

JsonRPC: "2.0",

ID:      req.ID,

Error:   map[string]interface{}{"code": -32700, "message": "invalid request"},

})

return

}


switch req.Method {

case "initialize":

json.NewEncoder(w).Encode(JsonRPCResponse{

JsonRPC: "2.0",

ID:      req.ID,

Result: map[string]interface{}{

"protocolVersion": "1.0",

"capabilities":    map[string]bool{"tools": true},

},

})


case "tools/list":

json.NewEncoder(w).Encode(JsonRPCResponse{

JsonRPC: "2.0",

ID:      req.ID,

Result:  map[string]interface{}{"tools": tools},

})


case "tools/call":

params, ok := req.Params.(map[string]interface{})

if !ok {

json.NewEncoder(w).Encode(JsonRPCResponse{JsonRPC: "2.0", ID: req.ID, Error: "invalid params"})

return

}


name, _ := params["name"].(string)

args, _ := params["arguments"].(map[string]interface{})


if name == "get_weather" {

city, _ := args["city"].(string)

json.NewEncoder(w).Encode(JsonRPCResponse{

JsonRPC: "2.0",

ID:      req.ID,

Result: map[string]interface{}{

"content": []map[string]interface{}{

{"type": "text", "text": fmt.Sprintf("【%s】晴天,25℃,空气质量优", city)},

},

},

})

return

}


json.NewEncoder(w).Encode(JsonRPCResponse{JsonRPC: "2.0", ID: req.ID, Error: "tool not found"})


default:

json.NewEncoder(w).Encode(JsonRPCResponse{

JsonRPC: "2.0",

ID:      req.ID,

Error:   map[string]interface{}{"code": -32601, "message": "method not found"},

})

}

}


func main() {

http.HandleFunc("/mcp", authMiddleware(mcpHandler))

log.Println("✅ Go MCP 服务已启动(带鉴权): http://localhost:8080/mcp")

log.Println("🔑 Token:", ValidToken)

log.Fatal(http.ListenAndServe(":8080", nil))

}


调用示例(带鉴权)

1. 正常调用(带正确 Token)

bash

运行

curl http://localhost:8080/mcp \

-H "Content-Type: application/json" \

-H "Authorization: Bearer mcp-agent-2025-go-demo" \

-d '{

  "jsonrpc":"2.0",

  "id":1,

  "method":"tools/call",

  "params": {

    "name":"get_weather",

    "arguments":{"city":"北京"}

  }

}'

返回成功

json

{

  "jsonrpc": "2.0",

  "id": 1,

  "result": {

    "content": [{"type":"text","text":"【北京】晴天,25℃,空气质量优"}]

  }

}

2. 不带 Token → 401 拒绝(MCP 规范)

bash

运行

curl http://localhost:8080/mcp \

-H "Content-Type: application/json" \

-d '{

  "jsonrpc":"2.0",

  "id":1,

  "method":"tools/list"

}'

返回标准 MCP 鉴权拒绝

json

{

  "error": {

    "code": 401,

    "message": "Unauthorized: Invalid or missing token"

  },

  "authorization_server": "https://auth.example.com",

  "scopes": ["tools:read","write"],

  "token_types": ["Bearer"]

}

3. 错误 Token → 同样 401

bash

运行

curl http://localhost:8080/mcp \

-H "Authorization: Bearer wrong-token-123" \

-H "Content-Type: application/json" \

-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

这个鉴权版本符合哪些规范?

✅ MCP v1.0 安全规范

✅ OAuth 2.1 + Bearer Token

✅ PRM(Protected Resource Metadata)

✅ 401 状态码 + 标准错误格式

✅ 可直接对接 AI Agent / 大模型


Top