SpringAI與MCP

MCP是什么?

MCP 服務 = 代理服務(Proxy) + 標準化接口 + 自動化適配

MCP 的目的,就是讓 AI 應用不再“為每個工具定制對接 ”,而是像使用 USB-C 一樣,“插上即用”任何外部工具。

沒mcp之前不同的工具入參和出參千奇百怪,需要程序員針對不同工具接口,輸入不同形式的入參,出參也要進行特殊的解析處理。有了mcp服務,AI應用就能遵循統一標準入參,統一標準回參。

更加通俗說明:MCP服務作用,它好比一個可插拔多功能的螺絲刀,想用那個刀頭如十字的,一字的,六角的,梅花的,而各種不同的刀頭就代表著不同的工具或服務。當需要使用某個特定的工具時,只需要將對應的“刀頭”插入MCP這個“螺絲刀柄”中,就可以開始工作了,這種設計使得切換不同的工具變得非常簡單和快捷,不需要為每種工具準備一個單獨的螺絲刀,而且,這個多功能螺絲刀還很智能,它知道每個刀頭的用途和使用方法(就像MCP了解每個服務的接口和參數一樣),所以你不需要成為工具專家,也能輕松完成任務。

對應到 AI 應用調用工具:

MCP 服務會通過標準接口(/tools)告訴 AI:

“我支持這些工具:

? ? ? ? read_file(path: string):讀文件,需要傳一個路徑
send_email(to: string, subject: string, body: string):發郵件,需要收件人、主題、內容

這個描述是用 JSON Schema 寫的,AI 能“看懂”。

{"tool": "send_email","input": {"to": "zhangsan@company.com","subject": "會議紀要","body": "這是重點內容..."}
}

                AI 應用                          MCP 服務(本地/遠程)│                                   ││      第一次調用:發現能力         ││──────────────────────────────────?││     GET /mcp/v1/tools             ││                                   ││      返回:我支持哪些工具         ││?──────────────────────────────────││     [                             ││       {                           ││         "name": "read_file",      ││         "inputSchema": { ... }    ││       },                          ││       {                           ││         "name": "send_email",     ││         "inputSchema": { ... }    ││       }                           ││     ]                             ││                                   ││      第二次調用:執行操作         ││──────────────────────────────────?││     POST /mcp/v1/invoke           ││     {                             ││       "tool": "send_email",       ││       "input": {                  ││         "to": "zhangsan@...",     ││         "subject": "..."          ││       }                           ││     }                             ││                                   ││      返回執行結果                 ││?──────────────────────────────────││     { "result": "success" }       │

    SpringAI:

    @Tool:“這個方法是一個可被 AI應用 調用的工具’”
    @ToolInput:?可以描述參數用途

    // 2. 在 @Tool 方法中使用對象
    @Component
    public class WeatherTools {@Tool(description = "根據城市查詢天氣")public String getWeatherHistory(WeatherRequest request) {return weatherService.fetchHistory(request.getCity(), request.getDate(), request.isIncludeTempDetail());}
    }
    // 1. 定義請求對象
    public class WeatherRequest {@ToolInput(description = "城市名稱,例如:北京、上海")private String city;@ToolInput(description = "查詢日期,格式:yyyy-MM-dd")private String date;@ToolInput(description = "是否包含氣溫詳情,true 或 false")private boolean includeTempDetail;// 必須提供 getter 方法,Spring AI 需要通過它讀取字段public String getCity() { return city; }public String getDate() { return date; }public boolean isIncludeTempDetail() { return includeTempDetail; }// 可選:提供 setter 或構造函數public void setCity(String city) { this.city = city; }public void setDate(String date) { this.date = date; }public void setIncludeTempDetail(boolean includeTempDetail) { this.includeTempDetail = includeTempDetail; }
    }

    Spring AI工作流程:

    第一步:Spring啟動時,掃描所有被 @Component@Service 等注解標記的 Bean,查找帶有 @Tool 的方法

    第二步:提取元數據,生成?MCP 工具描述(Tool Schema)

    {"name": "getWeather","description": "根據城市查詢天氣","inputSchema": {"type": "object","properties": {"city": {"type": "string","description": "城市名稱"}},"required": ["city"]}
    }

    第三步:暴露標準 MCP 接口

    pring AI 會自動為你啟動一個 MCP Server,并提供兩個標準 HTTP 接口:

    1.?GET /mcp/v1/tools?—— 返回所有?@Tool?方法的描述
    [{"name": "getWeather","description": "根據城市查詢天氣","inputSchema": { ... }}
    ]
    2.?POST /mcp/v1/invoke?—— 接收 AI 的調用請求

    當 AI 應用想調用 getWeather 時,會發:

    {"tool": "getWeather","input": {"city": "北京"}
    }

    第四步:MCP Server 調用對應的方法 getWeather

    把返回結果包裝成標準格式返回給 AI

    { "result": "北京:晴,28°C" }

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/pingmian/94340.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94340.shtml
    英文地址,請注明出處:http://en.pswp.cn/pingmian/94340.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    Coze用戶退出登錄流程分析-后端源碼

    前言 本文將深入分析Coze Studio項目的用戶退出登錄功能后端實現,通過源碼解讀來理解整個退出登錄流程的架構設計和技術實現。退出登錄作為用戶認證系統的重要組成部分,主要負責清理用戶會話狀態,確保用戶賬戶安全。 退出登錄功能雖然相對簡單…

    【應急響應工具教程】Unix/Linux 輕量級工具集Busybox

    1、工具簡介BusyBox 是一個將常用 Unix/Linux 工具打包在單一可執行文件中的輕量級工具集,被稱為 “嵌入式 Linux 的瑞士軍刀”。 它將多個精簡版的命令行工具(如 ls、cat、cp、mv、grep 等)集成到一個二進制文件中,并通過不同的調…

    【React】案例:B站評論

    目錄 一、核心功能實現 二、id處理和時間處理 三、清空內容并重新聚焦 一、核心功能實現 1.獲取評論內容:表單受控綁定 2.點擊發布按鈕發布評論 二、id處理和時間處理 1.rpid要求一個唯一的隨機數id -uuid庫 npm install uuid 使用方法:import {v4 as…

    sqlite創建數據庫,創建表,插入數據,查詢數據的C++ demo

    sqlite的API可參考&#xff1a;SQLite – C/C | 菜鳥教程 sqlite的官網API可參考&#xff1a;Introduction #include <iostream> #include <sqlite3.h> #include <string>// 回調函數&#xff0c;用于查詢結果的輸出 static int callback(void* data, int …

    部分CSS筆試題講解

    1. box-sizing: border-box 的作用問題&#xff1a; 默認的 CSS 盒模型 (content-box) 中&#xff0c;元素的 width 和 height 屬性只指定了內容區域的尺寸。如果你給元素添加了 padding 或 border&#xff0c;這些值會被加在 width/height 之上&#xff0c;導致元素的實際占用…

    雅菲奧朗SRE知識墻分享(二):『SRE對智能運維的升級模型』

    SRE深度結合AI創新&#xff0c;雅菲奧朗專家劉峰老師總結了近期人工智能運維領域的突破&#xff0c;合計以下15個關鍵點:一、領域1&#xff1a;Dev&Ops 深度融合? 關鍵點1. 組織&#xff1a;Google “SREScale” 最新論文提出「單一故障域 單一 SRE 小組」原則&#xff0…

    前端 Promise 全面深入解析

    一、Promise基礎概念 1、什么是Promise? Promise是一個表示異步操作最終完成或失敗的對象。它允許你為異步操作的成功結果和失敗原因分別綁定相應的處理方法。 2、Promise的三種狀態 pending(等待中): 初始狀態,既不是成功,也不是失敗 fulfilled(已成功): 操作成功完…

    【LIN】2.LIN總線通信機制深度解析:主從架構、五種幀類型與動態調度策略

    參考文章&#xff1a; Lin總線通信在STM32作為主機代碼以及從機程序 基于STM32的LIN總線的實現 STM32F0-LIN總線通訊程序代碼 主從調試OK LIN協議通信DEMO及源碼剖析 前文已講解關于LIN幀代碼如何實現&#xff1a;【LIN】1.LIN通信實戰&#xff1a;幀收發全流程代碼實現 幀類型…

    Maven的概念與Maven項目的創建

    MavenMaven的概念依賴管理項目構建Maven安裝Maven項目的創建Maven的第一個項目Maven的第二個項目Maven的概念 Maven 是 Apache 基金會推出的跨平臺的項目管理工具&#xff0c;主要服務于基于Java平臺的項目構建、依賴管理和項目信息管理&#xff0c;目前是 Java 生態中最主流的…

    Mysql之binlog日志說明及利用binlog日志恢復數據操作記錄

    眾所周知,binlog日志對于mysql數據庫來說是十分重要的。在數據丟失的緊急情況下,我們往往會想到用binlog日志功能進行數據恢復(定時全備份+binlog日志恢復增量數據部分),化險為夷! 廢話不多說,下面是梳理的binlog日志操作解說: 一、初步了解binlog MySQL的二進制日志…

    windows安裝Elasticsearch,ik分詞器,kibana可視化工具

    安裝地址 elasticsearch安裝地址: Past Releases of Elastic Stack Software | Elastic 分詞器下載地址: https://github.com/infinilabs/analysis-ik?tabreadme-ov-file kibana下載地址: Past Releases of Elastic Stack Software | Elastic 注意&#xff1a;版本一定要統…

    GaussDB 數據庫架構師修煉(十八)SQL引擎-SQL執行流程

    1 SQL執行流程查詢解析&#xff1a;詞法分析、語法分析、 語義分析 查詢重寫&#xff1a;視圖和規則展開、基于規則的查詢優化 計劃生成&#xff1a;路徑搜索和枚舉、選出最優執行計劃 查詢執行&#xff1a;基于優化器生成的物理執行計劃對數據進行獲取和計算2 解析器和優化器S…

    能源管理系統中的物聯網數據采集:深度探索與操作指南

    一、引言物聯網&#xff08;Internet of Things, IoT&#xff09;作為數字化時代的核心基礎設施&#xff0c;通過將物理世界的設備、物體與網絡連接&#xff0c;實現數據的實時感知與交互。而數據采集作為物聯網系統的 “神經末梢”&#xff0c;是整個體系運行的基礎。本文將從…

    Java實現一個簡單的LRU緩存對象

    LRU&#xff08;Least Recently Used&#xff09;算法的核心思想是&#xff1a;最近使用的數據將被保留&#xff0c;最久未使用的數據將被淘汰。這種策略適用于內存有限、但又需要高頻訪問的數據場景&#xff0c;比如緩存系統、頁面置換算法等。mysql的緩沖池就是使用的LUR Inn…

    整體設計 之定稿 “凝聚式中心點”原型 --整除:智能合約和DBMS的在表層掛接 能/所 依據的深層套接 之2

    摘要三“式”三“心”三“物” 整數原型三段式表達 的 凝聚式中心點dot 、組織式核心元素位element和分析式內核基因座locus 三者分別以**“等號線&#xff08;Arc&#xff09;”**&#xff08;動態關聯&#xff09;、**“邊界線&#xff08;Transition&#xff09;”**&#…

    vue.根據url生成二維碼

    文章目錄概要QR碼步驟1. 引入庫2. 生成二維碼3. 將二維碼加入頁面中用javascript庫簡化二維碼生成1. 引入庫2. 使用庫生成二維碼二維碼美化和定制1. 調整大小2. 調整顏色3. 添加自定義形狀和圖案4. 添加logo性能優化與錯誤處理1. 減少不必要的計算2. 異步處理概要 生成 URL 二…

    WPF+MVVM入門學習

    最近在學WPF的MVVM&#xff0c;有兩種方式實現&#xff0c;一種是自己實現&#xff0c;一種是借助MVVM框架&#xff0c;接下來通過一個醫院自助打印報告機鍵盤輸入界面來演示自己實現、框架CommunityToolkit和Prism的區別。 項目源碼&#xff1a;https://gitee.com/cplmlm/Sel…

    [e3nn] docs | 不可約表示(Irreps)

    鏈接&#xff1a;https://docs.e3nn.org/en/latest/examples/examples.html docs&#xff1a;e3nn e3nn是一個用于構建歐幾里得(E(3))等變神經網絡的Python庫&#xff0c;這意味著它們能自動保持三維旋轉和反射的對稱性。 該庫使用不可約表示(Irreps)來描述數據變換方式&…

    深入淺出 ArrayList:從基礎用法到底層原理的全面解析(中)

    四、ArrayList 常用方法實戰 —— 從添加到遍歷的全場景覆蓋ArrayList 提供了數十個方法&#xff0c;但日常開發中常用的只有 10 個左右&#xff0c;我們按 “元素操作”“集合查詢”“遍歷方式” 三類來梳理&#xff0c;每個方法都附帶示例和注意事項。4.1 元素添加&#xff1…