使用kagent调用HTTP协议的MCPServer

kagent提供了RemoteMCPServer自定义资源定义(CRD)来接入远程的MCP服务器。

基于HTTPMCP协议简介

Model Context Protocol (MCP) 是一种用于AI应用与其上下文源之间进行通信的协议。MCP支持多种传输层机制,其中基于HTTP的传输协议为远程服务器通信提供了标准化的解决方案。

MCP架构概述

MCP采用客户端-服务器架构,主要参与者包括:

  • MCP Host: 协调和管理一个或多个MCP客户端的AI应用(如Claude Code、Claude Desktop等)。

  • MCP Client: 维护与MCP服务器的连接并获取上下文的组件。

  • MCP Server: 向MCP客户端提供上下文的程序。

HTTP传输层

MCP支持两种传输机制:

  1. Stdio传输: 用于本地进程间通信。

  2. Streamable HTTP传输: 使用HTTP POST进行客户端到服务器的消息传递,支持可选的Server-Sent Events (SSE) 进行流式传输。

Streamable HTTP传输支持标准HTTP认证方法,包括Bearer令牌、API密钥和自定义头信息,并建议使用OAuth获取认证令牌。

核心功能

MCP定义了三类服务器可以暴露的核心原语:

  • Tools: AI应用可以调用的可执行功能(如文件操作、API调用、数据库查询)。

  • Resources: 提供上下文信息的数据源(如文件内容、数据库记录、API响应)。

  • Prompts: 用于与语言模型交互的可重用模板。

kagent中接入HTTP协议的MCP服务

kagent提供了RemoteMCPServer自定义资源定义(CRD)来接入远程的MCP服务器。

使用示例

apiVersion: kagent.dev/v1alpha2
kind: RemoteMCPServer
metadata:
  name: example-http-mcp-server
  namespace: default
spec:
  description: "示例HTTP协议MCP服务器"
  protocol: STREAMABLE_HTTP  # 使用HTTP协议
  url: https://example-mcp-server.com  # MCP服务器URL
  headersFrom:
  - name: Authorization
    valueFrom:
      secret:
        name: mcp-server-credentials
        key: token
  timeout: 30s
  terminateOnClose: true

Agent中使用RemoteMCPServer

定义好RemoteMCPServer后,可以在Agent中将其作为工具源使用:

apiVersion: kagent.dev/v1alpha2
kind: Agent
metadata:
  name: example-agent
  namespace: default
spec:
  declarative:
    systemMessage: "你是一个使用外部工具的AI助手"
    tools:
    - type: McpServer
      mcpServer:
        apiGroup: kagent.dev
        kind: RemoteMCPServer
        name: example-http-mcp-server
        toolNames: ["example-tool1", "example-tool2"]  # 指定要使用的工具名称

认证配置

对于需要认证的MCP服务器,可以通过Secret配置认证信息:

apiVersion: v1
kind: Secret
metadata:
  name: mcp-server-credentials
  namespace: default
data:
  token: <base64-encoded-api-key>

然后在RemoteMCPServer中引用。

使用valueFrom.secret示例:

...
spec:
  headersFrom:
  - name: Authorization
    valueFrom:
      secret:
        name: mcp-server-credentials
        key: token

使用valueFrom.configMap示例:

...
spec:
  headersFrom:
  - name: X-API-Key
    valueFrom:
      configMap:
        name: mcp-config
        key: api-key

通过这种方式,可以轻松地将基于HTTP协议的MCP服务器集成到kagent中,为AI应用提供丰富的上下文和工具能力。

示例:接入百炼平台托管的MCP Server

以下步骤以使用阿里云百炼提供的高德地图MCP为例。

准备工作

  1. 使用kagent快速构建一个问答Agent

  2. 在百炼平台的MCP市场开通高德地图MCP

创建RemoteMCPServer资源

  1. 创建一个Secret,用于保存高德地图MCPAPI Key。

    export AMAP_API_KEY=${百炼平台提供的APIKey}
    kubectl create secret generic amap-apikey -n kagent --from-literal credential="Bearer $AMAP_API_KEY"
  2. 创建RemoteMCPServer资源。

    kubectl -n kagent apply -f - <<EOF
    apiVersion: kagent.dev/v1alpha2
    kind: RemoteMCPServer
    metadata:
      name: amap-mcp-server
    spec:
      description: "高德地图的官方MCP Server,高德地图MCP Server现已覆盖12大核心接口,提供全场景覆盖的地理信息服务,包括地理编码、逆地理编码、IP定位、天气查询、骑行路径规划、步行路径规划、驾车路径规划、公交路径规划、距离测量、关键词搜索、周边搜索、详情搜索等。"
      protocol: SSE
      url: https://dashscope.aliyuncs.com/api/v1/mcps/amap-maps/sse
      headersFrom:
      - name: Authorization
        valueFrom:
          type: Secret
          name: amap-apikey
          key: credential
      timeout: 30s
      terminateOnClose: true
    EOF
  3. 确认RemoteMCPServer创建状态。

    kubectl get RemoteMCPServer -n kagent

    预期输出:

    NAME                   PROTOCOL          URL                                                        ACCEPTED
    amap-mcp-server        SSE               https://dashscope.aliyuncs.com/api/v1/mcps/amap-maps/sse   True
    streamablehttp-fetch   STREAMABLE_HTTP   http://steamablehttp-fetch-service:3000/                   True

创建agent

  1. 创建出行规划助手Agent。

    kubectl -n kagent apply -f - <<EOF
    apiVersion: kagent.dev/v1alpha2
    kind: Agent
    metadata:
      name: commute-navigator
      namespace: kagent
    spec:
      declarative:
        modelConfig: bailian-provider-config
        stream: true
        systemMessage: |-
          ## Agent: CommuteNavigator(系统提示词)
    
          你是一个“智能通勤与出行规划助手”,用于 Web 场景。
    
          ### 1. 角色与风格
    
          - 角色:帮用户规划从起点到终点的出行方案。
          - 场景:日常通勤、城市出行、周末出行等。
          - 风格要求:
            - 简洁、专业、直截了当;
            - 优先用条目式回答,少废话;
            - 不暴露任何技术细节(例如“接口”“经纬度”“工具名”等),只说“我查了地图/路线/天气”。
    
          ### 2. 基本对话策略
    
          1) 搞清用户需求(必要时补问):
             - 起点:用户从哪里出发?(地址/地标/大致区域)
             - 终点:用户要去哪里?
             - 时间:现在 / 今天稍后 / 明天 / 大致时间段?
             - 偏好:更想省时间、省钱,还是少走路、少换乘、避免地铁?能不能骑车?有没有行李或带小孩?
    
          2) 规划思路:
             - 基于起终点信息获取具体位置;
             - 视情况规划:
               - 步行路线;
               - 骑行路线;
               - 驾车路线;
               - 公共交通路线(公交/地铁/火车);
             - 涉及骑行或长时间步行时,尽量考虑天气是否合适;
             - 对比不同方式的大致:
               - 时间;
               - 复杂度(换乘次数、是否绕远);
               - 费用趋势(公共交通通常更省钱,驾车/打车通常更贵但更省事)。
    
          3) 决策偏好参考(可灵活调整):
             - 距离 < 2–3km:优先考虑步行或短距离骑行;
             - 距离约 3–15km:对比骑行 vs 公共交通;
             - 距离 > 15km:优先考虑公共交通或驾车/打车;
             - 遇到暴雨、雷暴、极端高温/严寒:
               - 不要推荐长时间骑行或长距离步行;
               - 提醒存在风险,建议更稳妥的方式(公共交通或驾车/打车)。
    
          4) 多点和附近搜索场景(简化):
             - 用户说“顺路去××”或“找我附近的咖啡馆/地铁站/加油站”时:
               - 帮他找出 1–3 个合适地点(尽量考虑距离与是否顺路);
               - 让用户选择或直接挑一个最合适的;
               - 再为该地点规划出行路线。
    
          ### 3. 安全与合理性
    
          - 不要鼓励明显危险或不合理的出行方式:
            - 极端天气下的长距离骑行或长时间步行;
            - 超长距离步行作为默认建议。
          - 当用户请求不现实或风险较高时:
            - 温和说明问题(如天气、距离、时间限制等);
            - 提供 1–2 个更安全、可行的替代方案。
    
          ### 4. 回答格式(Web 文本输出)
    
          - 使用简体中文。
          - 结构清晰,推荐以下格式:
    
          1) 概览:
             - 用 1–2 句话给出首选推荐方式和预估时间。
             - 示例:
               - “我建议你优先选择地铁出行,全程大约 45 分钟左右。”
    
          2) 方案详情(1–3 个方案,按需要给出):
             - 方案一:公共交通 / 驾车 / 骑行 / 步行
               - 预计时间:约 XX 分钟;
               - 大致路线:用自然语言描述主要步骤(如“先步行到 X 站,再乘坐 Y 号线到 Z 站……”);
               - 优缺点:例如是否受堵车影响、费用大致高低、需要换乘几次、步行距离大致多少。
             - 如有第二、第三方案,结构类似,但描述尽量简短。
    
          3) 建议总结:
             - 明确指出你最推荐哪一个方案,并给出 1–2 个主要理由:
               - 如:时间更稳定、换乘更少、费用更低、在当前天气下更安全等。
    
          - 不要在回答中出现“接口、API、工具名、经纬度解析”等技术表述,只用“我查了地图/路线/天气/距离”等自然语言表达。
        tools:
          - mcpServer:
              apiGroup: kagent.dev
              kind: RemoteMCPServer
              name: amap-mcp-server
              toolNames:
                - maps_direction_bicycling
                - maps_direction_driving
                - maps_direction_transit_integrated
                - maps_direction_walking
                - maps_distance
                - maps_geo
                - maps_regeocode
                - maps_ip_location
                - maps_schema_personal_map
                - maps_around_search
                - maps_search_detail
                - maps_text_search
                - maps_schema_navi
                - maps_schema_take_taxi
                - maps_weather
            type: McpServer
      description: CommuteNavigator 是一个面向 Web 场景的智能通勤与出行规划助手,它可以根据你的起点、终点、出行时间以及对省时、省钱或少走路等偏好,综合比较步行、骑行、驾车和公共交通等多种方式,为你规划合理、不绕路的出行方案,并在天气不佳或路线不合理时主动给出更安全、更稳妥的建议,帮助你在日常通勤、城市出行或周末出游时快速找到当下最合适的路线选择。
      type: Declarative
    EOF
  2. 确认agent创建状态。

    kubectl get pod -n kagent

    预期输出:

    NAME                                              READY   STATUS    RESTARTS   AGE
    commute-navigator-6d49fb5db5-gl5vk                1/1     Running   0          69s
    ...

访问agent

kagent默认提供了Web UI可以直接与agent进行交互。

  1. kagent-ui服务通过端口转发至本地。

    kubectl port-forward -n kagent service/kagent-ui 8082:8080
  2. 在浏览器中通过localhost:8082访问agent。

    1. 问答示例:今天适合骑自行车从望京到香山吗?

      image