2025年4月13日 星期日

透過「MCP」與Claude 桌面板實現T100數據存取

由 Claude 提出的 MCP ,提供了 Python 的 MCP SDK 工具,可作為橋接 T100 ERP 與現在大多數可支持 MCP 的 ai 模型,如 ChatGPT、Gemini 和 Claude。此方案在賦予 AI 直接查詢和理解 ERP 系統內龐大數據的能力,從而釋放數據潛能,提升決策效率,並開創全新的智能化應用場景。

為了解決上述挑戰,可利用 MCP 為橋樑,並藉助 Python + Genero 實現 AI 對傳統 ERP 系統的直接數據存取。

我們選擇使用 Python 的 UV 工具:在 windows 上可以透過 uv 建置 mcp 的步驟可以參考

https://dev.to/codemee/shi-yong-uv-guan-li-python-huan-jing-53hg

整體流程也可以參考

https://youtu.be/cdBRAVYZKFo?si=tL6Wj4ryU_MQDWyL

想像的系統架構如下:

+-----------------+      +----------+      +-----------------------+
|   使用者 (Human) |----->|   LLMs   |----->|      MCP Server       |
|(Natural Language)|      |(ChatGPT, |      |(Python UV Application)|
+-----------------+      | Gemini,  |      +-----------------------+
                           | Claude)  |             ^
                           +----------+             | (Web Service Call)
                                                  |
                                     +-----------------------+
                                     |   傳統 ERP 系統       |
                                     |(Web Service Interface)|
                                     +-----------------------+

實施步驟:

  1. 利用 uv 建置 python 專案 test_mcps,專案內使用  "mcp[cli]" mcp httpx 等套件

    此處也可以參考  https://dev.to/alexmercedcoder/building-a-basic-mcp-server-with-python-5ci7

    uv add "mcp[cli]" mcp httpx

  2. 設定 T9528.py 如下

    下方檔案內的 ERP_SERVER_IP 應換成 T100主機IP,web service 的部分則需要參考 T100 高階 web service開發方式設定

    import httpx
    from mcp.server.fastmcp import FastMCP

    # 初始化 FastMCP 服务器
    mcp = FastMCP("T9528")

    # 常量
    T100_API_BASE = "https://ERP_SERVER_IP/wtopprd/ws/r/top/asahost"

    async def make_nws_request(url: str) -> str:
        """向 T100 API 发起请求,并进行错误处理。"""

        async with httpx.AsyncClient() as client:
            try:
                response = await client.get(url, headers=headers, timeout=30.0)
                response.raise_for_status()
                return response.json()
            except Exception:
                return None
    @mcp.tool()
    async def get_tablename(table_id: str) -> str:
        """指定表格編號,或編號關鍵字,查詢T100系統的表格編號與名稱。

        Args:
            state: 表格編號 或關鍵字 (例如 gzza_t 或 gzxa)
        """
        url = f"{T100_API_BASE}/base/qry_tablename?table_id={table_id}"
        response = httpx.get(url)
        return response.json()
    if __name__ == "__main__":
        # 初始化并运行服务器
        mcp.run(transport='stdio')

透過上述步驟,就可以將 T100內的 high level web servic 作為 AI 查詢工具的一部分,接下來只需要回到 claude 桌面程式配置 T9528.py 就可完成啟用


啟用後,就可以回到 claude 看到桌面下方槌子的部分亮起來 (mcp 工具後續均以 "槌子" 或 "板手" 表示 "工具" ) 。每一個 mcp 程式可以包含不只一個工具。


工具生效後就可以執行詢問,我們首先上傳的是詢問表格名稱的,就針對性的問一下:


至此可以明確地看出 mcp 工具在 windows 桌面是能被使用的。


2023年8月17日 星期四

[歐洲2023遊] 8/01 科隆招待:教堂、豬腳、抓不住的德鐵

旅途中總會有長途跋涉的路程,為了『走過路過不要錯過』,想著安插些景點進來。


但不可以前後都安排德鐵,否則『真、刺、激』....
------------------------------------------------------------------------------

一早上整理完,匆忙的揮別這連空氣都是甜的城市。經歷了小小的迷惑後 (請參照『好樣的德鐵 』) ,跨越了比利時、德國邊界線,前進到『科隆』。

科隆,是一個以教堂文明的城市,橫跨『正』萊茵河 (法蘭克福在支流緬因河) 。

一出車站就可以看到雄偉的科隆大教堂.....


等等,可能是早上太緊張了。我應該先帶各位參觀下洗手間。
出發之前,就有聽說德國的廁所要收錢。但現在急得很,誰會想得起來啊。

啊,我居然看到它了! 就在科隆中央車站的廁所...搞毛啊,收的錢足夠養這個設備嗎?每次進去一歐元。要是我連續.... 那不虧大了?
這問題有解。
不知道是緊張還是著急,抖著刷開門後它掉出來一張『優待券』.....
左邊是科隆車站的,右邊是某購物中心的....

下面寫著『超值代金券可在德國超過500個參與的火車站兌換』。
好傢伙,我到海德堡還可以省 5毛 !

好吧,收了錢果然非常乾淨。據說女生那邊還有免治馬桶。
---------------------------------------------------------

科隆大教堂也是採歌德式的建築,外觀高大、內飾高大。自帶威嚴感。周遭的彩繪玻璃窗都有一群群的旅遊團在聽導遊講故事。(抱歉,請自行 google 『科隆主座教堂』)



科隆主座教堂中有些知名的收藏:三王聖龕、管風琴。每個都有很多遊客圍觀。當討論的聲音讓駐站牧師不滿意的時候,就會響起廣播:請來訪的人注意降低音量。

聽得懂德文?不懂。只是廣播最後會有帶火氣的『噓~~~~~~~~~~~~~』這個國際共通語言。

左:科隆主座教堂的雙尖塔    右:背面看得主座堂,像一堆小山簇擁著雙尖塔

=====================================================

來科隆,不可錯過車站附近的 fruh am Dom 老店。
其實除了主座教堂外,這家是我想來試試看『水煮豬腳』的地方。

我們對德國人的謬誤:每天都吃豬腳?
其實沒有,相信這一趟回去,柚子和橘子對『德國人』會有自己的一套看法。

fruh am Dom (連結) 的自釀啤酒相當有名:據說酒廠不能離銷售點太遠,遠的就不算科隆啤酒、一定用 200ml 的酒杯.... 規矩還挺多

豬腳的部分:科隆 (以北) 水煮豬腳較為出名,法蘭克福 (以南) 則以烤為主要特色。上次吃過了烤的,怎麼可以不來嚐嚐煮的。


科隆的啤酒它淡淡的泡沫在杯緣久久不散,或許真是剛釀的,完全不苦,酒精度也不高。但還是會上頭。只是退的也快。

這個豬腳就是把『軟、爛』兩個字發揮到極致。刀子不需要來回切畫,壓下去就四散攤開。但想著這樣沒彈性,不,吃起來卻還滿 Q 彈的。下方左側是酸菜、右側是薯泥,屬於德式豬腳的標配。

相較於萬巒,我就覺得這邊清爽多了。

啤酒再來一杯,waiter就會在杯墊上畫上一筆,註記這桌又加了一杯....

也有見到匆匆忙忙的上班族,趁著午休跑進來就喝了一杯,就出門去了。怎?來加油的?


當然,也不能滿桌的肉。來個生菜沙拉比較符合我們的想像。但這邊生菜沙拉也是相當費工,搭配了水煮蛋、小黃瓜,滿滿的一大盤。這樣搭配豬腳的罪惡感應該降低了不少。

=========================================================

吃飽喝足後,本擬到萊茵河畔曬個太陽。突如其來的大雨打斷了這個計劃。只好回頭往車站走。沒想到這場雨來的真是時候。

接下來就要進入『德鐵大暴走』的遊戲關卡,只是慵懶的我們還沒感受到.....










2023年8月16日 星期三

[歐洲2023遊] 7/30-31 應該要是個甜蜜的城市-布魯塞爾

『要不要順路在比利時停一下?』『啊?好啊?』

『你要不要再考慮一下?』

作為一個從來都只是『聽』說的國度,當確認要踩上它的時候,真的很拉扯。真去嗎?我自問自答了不下十幾次。

是的,它果然不負眾望,給我們的旅程中留下最『深刻』的回憶。

========================================================


通過聖潘克拉斯車站的安檢線,我們等同已經踏入歐盟境內。歐洲之星,這一趟『最貴的車票』是第一個上陣的。果然貴有貴的道理 (不信你看DB....)

『有序的』上了歐洲之星 (相對於DB) ,發現開始滴滴答答的下雨了。布魯塞爾之行注定在綿綿的細雨中進行。

布魯塞爾Midi站

『傍晚』六點,我們抵達布魯塞爾,轉搭 2 站由輕軌擔綱的地鐵後抵達住宿點附近。由於是綿綿小雨,就想著詩情畫意點,我們冒雨步行前往。

左:布魯塞爾證交所     中:老城區的巷弄     右:饒有風趣的閣樓設計

由於這兩天,我們將入住的是 airbnb 的公寓,也是一開始疏忽了,以為房東回的訊息上面的字串就是入住密碼 (對,我天真的以為密碼是 whatsapp ),來到指定地點才發現門窗緊閉。點開後閱讀,啥,要用 what's app 完成身分認證後才會給公寓的地址、和進入的方法?

突然間有種天旋地轉的感受,雨又變大了 !


我們趕緊在其他公寓的雨遮下,用三支電話分別、不斷的聯繫房東、airbnb、安裝what'sapp。與仍舊下個不停。

也還好天黑晚些到來,想起附近應該有麥當勞,趕緊後撤到 500米外的麥當勞躲雨和聯繫。
柚子和橘子也慌了,但是表現卻是異常的自主和成熟。天氣降溫到16、17度,雨水也從頭髮上滴滴流下。

後撤到麥當勞後,我獨自在前往約定地點詢問鄰居、持續連繫、持續依照要求安裝what's app。對,不是說房東的問題,是我操作的疏失讓旅行陷入了窘境.....


對的,房東應該只是一班的租房仲介,這又是一個『星期天晚上』。
說實在也感謝突然回神接了我們電話的小姐姐,看著我自己的軌跡圖,在這500米的路上走了近十次後,總算聯繫上了 (再不接我就要去住五星級酒店了 !!,還沒享受到呢)

房東在確認身分後,從 what's app 傳給我們正確的公寓地址、進入方法,總算在 20:30 進入了屬於我們的公寓。

感謝接納我們的麥當勞、感謝在路邊看著我們衝來衝去的路人、感謝臨時幫忙的值班房東....

正當我們準備進入公寓的時候,發現又不對了,最後這四個數字幹嘛用的?鑰匙呢?
低聲和柚子討論怎辦的時候.....

『阿,恁台灣來ㄟ吼 ?』

挖靠,這麼親切的問候?

感謝萍水相逢的退休大伯,不計較我剛開錯了房間門,跑出來教我怎麼用密碼盒拿鑰匙。

『沒關係啦,襖蓋就會開了』仍舊是親切的雙聲道回復

阿貝多謝~

=========================================

還沒天黑呢,窗外仍滴滴答答的,看在房間這麼舒適又設備齊全,總算是能好好休息了。



============================================

結束一夜的驚魂,總算第二天能在布魯塞爾好好的逛逛。這地方很明顯的被切分成老、新兩個城區。如果可以的話,我下次還是住新城區吧,至少晚上能看到很多人....


這個城市最著名的景點就是尿尿系列 (超小的尿尿小童、常被偷窺的尿尿女童)


以及布魯塞爾大廣場和老購物街

左:大廣場的市政廳   中:某處歷史遺跡   右:大型古老購物街

起了個早,看到的遊客並不多,景勘完了,才來到重頭戲:『吃』.....


布魯塞爾街上滿坑滿谷這三種店:巧克力店、鬆餅店、薯條店

都別小看,不是超香、就是超甜蜜、不然就是爽脆可口,以上三選二

例如薯條:剛炸好的 (3.5 Euro中份不加醬)  只用豪邁的海鹽調味 (覺得師傅飛出去到地板的比留在包裝上的多) 超涮嘴。

例如鬆餅:烤的鬆軟酥脆的鬆餅,給你插進五支又長又細的純黑巧克力棒,咬下去有喀嚓聲和融化的巧克力混和在嘴裡.... (2.6 Euro)


不行,回台灣就要體檢了,還是要克制一下。

---------------------------------------------------------------

除了路邊小吃外,還有著名的『淡菜鍋』。



周一的海鮮街很多店都沒開,休息。
對,大家都擠到店裡吃,就我們搞外帶。


看到肥美的淡菜了嗎?
好好的吃它一頓壓壓驚,明天早上就要搭乘德鐵 (!)  往德國去了。