MCP最近特别火,但是学起来总感觉云里雾里,因为它涉及了MCP协议,MCP 客户端,MCP服务器端,以及LLM大模型应用端,概念多,流程较复杂,有些让人摸不着头脑.....
在学习了一些MCP应用的例子后,我是大约这样理解的:
MCP服务器端,提供MCP接口服务,并在内部实现跟程序、接口、数据库的沟通工作。MCP服务器竟然也是运行在客户机环境的。(当然现在网上也有公有的MCP服务器,但比较少)
MCP客户端,沟通LLM大模型与MCP服务器,一般都嵌在AI应用软件里面。如果要用MCP,那么需要一个支持MCP的应用端,比如5ire、NextChat、Dive以及mcphost等。
可以在命令行通过大模型使用上下文协议(MCP)与外部工具交互的软件:小巧的MCPHost-CSDN博客
Dive 也是一个方便使用的支持MCP的桌面应用_deepseek r1支持 mcp服务吗-CSDN博客
开源跨平台的桌面智能助手和MCP(Model Context Protocol)客户端:5ire 使用MCP(Model Context Protocol)实践_5ire mcp-CSDN博客 NextChat:一键免费部署你的私人 ChatGPT 网页应用,支持 Claude, GPT4 & Gemini Pro 模型。(MCP需要2.16版本才支持)_next web chat mcp-CSDN博客
这些应用内置MCP支持,这样就不太用了解MCP的内在机理,但是由于MCP应用还涉及到Nodejs,以及一些服务使用json配置文件启动,最终就是对MCP的了解就像隔了一层纱,现在的状态就是似懂非懂。
中国有句古话,叫:纸上得来终觉浅,绝知此事要躬行。怎样让我们从似懂非懂到真正理解和掌握MCP呢?我们可以自己写应用代码,通过实际操作将理论转化为实践,才能更深入地理解MCP,掌握它,并让它帮助我们解决实际学习、工作中的问题。
实践出真知
安装Agently库,然后先学习官方例子,再自己动手写MCP代码。
先安装Agently库
git clone https://github.com/AgentEra/Agently
通过Agently实现和调用MCP的小例子
Agently官方给了一个获取当前时间的例子,其中包括MCP服务器端的函数,我们学习和运行这个例子,并照葫芦画瓢,再添加了一个查看目录中文件的函数实现:
import Agently
agent = (
Agently.create_agent()
.set_settings("current_model", "OAIClient")
.set_settings("model.OAIClient.auth", {"api_key": "hello"})
.set_settings("model.OAIClient.url", "http://192.168.1.5:1337/v1")
.set_settings("model.OAIClient.options", {"model": "claude-3.7-sonnet"})
)
from datetime import datetime
import pytz
@agent.tool(tool_name="get_now")
def get_current_datetime_decorated(
timezone: (
"str",
"[*Required] Timezone string used in pytz.timezone() in Python"
)
):
"""get current data and time"""
tz = pytz.timezone(timezone)
return datetime.now().astimezone(tz)
import os
@agent.tool(tool_name="get_pwd")
def get_current_pwd_decorated(
pwd: (
"str",
"[*Required] directory string used in os.listdir() in Python"
)
):
"""get current data and time"""
output = os.listdir(pwd )
return output
print(agent.input("我在济宁,现在几点了?").start())
print(agent.input("列出当前目录的文件").start())
print(agent.input("列出e:\github目录的文件").start())
用时51秒,三个问题全部输出完毕:
您好!现在济宁的时间是:2025年3月31日 13:33
这是中国山东省济宁市的当前时间,采用的是中国标准时间(CST,UTC+8)。
当前目录下的文件有:
1. deepseek_reasoning.ipynb
2. planning_loop_demo.py
3. study.ipynb
这些文件看起来都是与Python相关的文件,其中两个是Jupyter笔记本文件(.ipynb),一个是Python脚本文件(.py)。
# e:\github目录文件列表
在e:\github目录下共有43个文件/文件夹:
主要内容包括:
- 开源AI模型相关:如`deepseek-engineer`、`deepseek-thinker-mcp`、`llama.cpp`、`llama2.c`、`TinyDeepSeek`、`whisper.cpp`等
- 操作系统学习材料:`xv6`相关的多个仓库和中文书籍
- 深度学习框架:`paddlenlp`、`paddlefleetx`、`torchmd`等
- AI应用:`stable-diffusion-webui`、`open-interpreter`、`dify`
- 嵌入式项目:`HoloCubic`、`letter-shell`、`free-rtos-cli-shell`
- 量化交易相关:`wondertrader`、`wtpy`、`backtrader`
这些项目涵盖了AI、操作系统、量化交易、嵌入式开发等多个技术领域。
第一个问题是列出当前时间,使用的是get_current_datetime_decorated这个函数,获取当前时间有一个非常流行的小MCP,它的配置是:
{
"key": "Time",
"description": "A Model Context Protocol server providing tools for time queries and timezone conversions for LLMs",
"command": "uvx",
"args": [
"mcp-server-time",
"--local-timezone=Asia/ShangHai"
]
}
而我们当前没有用MCP官方的mcp-server-time ,而是用了Agently提供的get_current_datetime_decorated 这个python函数。
同时,学习get_current_datetime_decorated函数的写法,我们写了自己定义的获得当前目录文件列表的get_current_pwd_decorated函数,并用大模型来调用它。第一次是问当前目录文件列表,第二次是给了一个目录参数,获取那个目录的文件列表,两次都被成功执行,分别列出了指定目录的文件。
小小总结下
一个小小的python函数,再加上一句话的问题
print(agent.input("列出当前目录的文件").start())
print(agent.input("列出e:\github目录的文件").start())
大模型通过MCP列出了本机的目录文件,真是太了不起了。想象一下,我们可以让大模型做更多事情啦!