最近写代码、查资料,基本都靠一个桌面端AI助手搭把手。用着用着就有了新念想:能不能让它帮我盯着服务器?我随口问了句看看C盘还剩多少空间,它客客气气回我一句,我没有这个能力。行吧,复制粘贴大法继续。来回几次我烦了,这活儿不该这么蠢,决定动手解决。
查资料的时候,mcp这个词反复往外蹦。MCP是什么意思,一开始我真不知道,扒了半天资料才搞清楚,全称Model Context Protocol,模型上下文协议,Anthropic在2024年11月放出来的开放标准。用我自己的话说:它是一套约定,让智能体能够用统一的姿势调用外部工具。
MCP协议到底解决什么问题
在这之前,各家软件接工具是各玩各的。这家一套插件格式,那家另一套,你给A写的工具,搬到B那里就废了。像极了早年间手机充电线,诺基亚圆孔,苹果30针,谁也通不了谁。
MCP协议干的事,就是把插座标准统一掉。角色拆成三块:跑智能体的软件算客户端,提供工具的一方写MCP服务器,两边按协议消息来往。我只要照协议写一个MCP服务器,把工具登记进去,所有支持这套协议的客户端拿来就能用。
对个人开发者来说这个思路太友好了,工具写一遍,到处能接,不用给每个软件单独伺候一遍。
动手写一个最小的MCP服务器
我的环境,Windows 11,Python 3.12。先装官方SDK:
· pip install "mcp[cli]"
然后写了三十来行代码。用官方的FastMCP类起个实例,登记两个最简单的工具:一个查磁盘剩余空间,里面就是调shutil.disk_usage;一个查公网IP归属地,请求了个公开接口。每个函数拿装饰器注册,函数下面的说明文字会原样喂给模型,成为它理解这个工具是干嘛的依据。
这个细节我是后来才咂摸出味道的:说明文字写得清不清楚,直接决定模型用不用你的工具、怎么传参。写得含糊,它要么不理你,要么瞎传参数。
最后一行mcp.run(),默认走stdio通道,服务器就算完了。没有端口,没有路由,比我想的简单太多。
接进客户端跑起来
下一步是在客户端登记这个MCP服务器。配置就是一小段JSON,关键字段两个:command填Python解释器的完整路径,args放脚本的具体位置,写到文件名为止。保存,重启客户端,设置页里果然冒出来我那两个工具。
我试着问它:C盘还剩多少空间?
这回它没跟我道歉,直接发起了一次工具调用,拿到数告诉我C盘剩86G,还顺嘴提醒占用率过七成了。那一下体验挺奇妙,屏幕对面的模型自己决定调哪个工具、传什么参数,我写的代码在后台被它指挥着跑。
踩的三个坑
过程当然不是一路绿灯,坑都记下了。
1)command字段填python不生效。我的Python是独立装的,不在系统PATH里,客户端找不到。换成解释器完整路径才通,JSON里的反斜杠还得转义,我干脆全写成正斜杠。
2)调试用的print差点把我送走。stdio通道是拿来做协议通信的,我在代码里顺手print了几行日志,通道被污染,客户端直接报invalid JSON,连接反复断。老实把日志改走stderr才消停。
3)Windows控制台的中文乱码。报错一半是问号,排查全靠猜。给环境变量加个PYTHONUTF8设成1,世界清净了。
三个坑吃掉我小半个晚上,都不难,就是没人提前打招呼。
跑通之后的一点想法
半天折腾下来,说几句实在的。
门槛比想象中低,会写Python函数就能写MCP服务器,协议细节SDK全包圆了,真正要上心的是工具说明文字写清楚。
这可能是智能体生态里少有的公共标准。模型能力各家卷各家的,但工具接入这一层,大家愿意坐下来用一个协议,对开发者是实打实的方便。
我下一步打算也定了,把服务器的告警查询和日志检索包成工具接进去。以后半夜服务器闹脾气,我躺着问一句,让AI自己翻日志,不用再爬起来开电脑。
你手头要是也有想甩出去的重复劳动,照这个路子走一遍,半天足够折腾出自己的第一个MCP服务器。