1、什么是agent
大语言模型很强,但它的局限性很大,它只能是一颗很强的大脑,它既无法获取新的知识,也没有手脚做事。比如说我想知道github上有没有什么好玩的项目,有没有值得关注的开发者,它的训练的语料里没有这个开发者或者项目,就会找不到这些内容,为了解决这个问题,agent(智能体)就出现了。

Agent其实就是将LLM和一些程序结合起来。LLM为了让自己获得更多的信息或者做一些工作,通过一些程序来让自己获得更多的信息或者完成工作,这些程序就叫做Tool。

那么,现在再去问LLM在GitHub上有什么好玩的项目值得推荐,这个LLM就可以通过Tool去获得GitHub上的信息。它的工作流程就变成用户询问LLM,LLM在使用Tool去解决这个问题,然后返回相应的信息给LLM,最LLM将整理好的信息回答给用户。

通过这个流程,LLM就可以拥有手和脚去完成我们想要它帮我们完成的问题了。
2、什么是MCP
虽然,agent很强大,但是,Tool的构造成本很大,这样子就又引发了下面一个问题。假设,我有一个项目A通过Tool实现了查询GitHub好玩的项目,实现项目A的Tool使用的语言是Python,后来我想用项目B使用项目A的Tool,可是项目B使用的是Java,这个Tool就无法使用了,我就得用Java去再实现这个Tool,这样子重复造轮子很浪费时间。
这时候就出现了MCP(Model Context Protocol)模型上下文协议,直接把Tool做成了一个单独的服务,这样子我们就可以像使用API一样去调用这个Tool服务。MCP架构是由Anthropic提出来的,它定义了模型要如何获取上下文Prompts(提示词)、Resources(资源)、Tools(函数),这里的Resource可以是数据库或者是别的文档,MCP的出现可以大大增加了Tool的复用性。

3、MCP的架构
MCP既然是LLM调用工具去实现的,那么它的模型就像调用API一样,通过调用Client去完成Server。不过,MCP的工作流程和API的调用流程不一样,发送请求是通过MCP Protocol,这个MCP Protocol就是一串JSON格式的数据。
MCP的工作流程,就是通过User发送Query,Client根据这个Query和MCP Server还有Tools去形成一个新的Prompt发送给LLM,LLM通过这个新Prompt调用MCP Client,MCP Client再去MCP Server里调用对应的Tool。

4、实现和使用MCP
现在,我们来实现一个Server,这个Server的功能就是调用GitHub的API。使用uv建立一个新的项目。uv是一个管理python的工具,不使用也没有关系。
uv init github-mcp-server
# 进入项目
cd github-mcp-server
# 下载一些关键的依赖, PyGithub是一个库,mcp[cli]是我们要做的服务
uv add PyGithub "mcp[cli]"
# 并下载一些依赖
uv pip install PyGithub python-dotenv
# 并创建一个新文件.env,这个文件存放你GitHub的TOKEN
mkdir .env
打开.env写入你GitHub里的TOKEN。这个要去GitHub申请,先找到setting,然后点击Developer Settings,在Personal access tokens里配置自己的GitHub API。
GITHUB_TOKEN=你的TONKEN
我们打开main.py这个文件,修改里面的内容,并把这个文件的名字改成github_server.py,general_search函数一定要写详细你的docstring,这样子LLM才知道这个函数是干什么的。
from github import Github
from mcp.server.fastmcp import FastMCP
import os
from dotenv import load_dotenv
load_dotenv()
# Initialize GitHub client
g = Github(os.getenv('GITHUB_TOKEN'))
# Initialize FastMCP server
mcp = FastMCP('GitHub MCP Server')
@mcp.tool()
def general_search(keyword: str) -> dict:
"""
Search GitHub repositories with the given keyword.
Args:
keyword: Search term to look for on GitHub
Returns:
Dictionary containing the search results from GitHub API.
"""
result = g.search_repositories(query=keyword, sort="stars", order="desc")
return {
"total_count": result.totalCount,
"items": [{"name": repo.name, "url": repo.html_url, "description": repo.description} for repo in result]
}
if __name__ == '__main__':
# Use local
mcp.run(transport='stdio')
定义好了MCP Server之后,找一个Client和它连接,这里我使用的是Vs code插件里的Client,需要配置好模型的API,这里就不赘述了。找到Client然后打开MCP Server点击Installed找到Configure MCP Servers,写好MCP Server。这里由于我使用的是uv,所以command里写的就是uv,如果你使用的不是uv,那么你就写python,args里不是使用uv的话就只写路径和文件名即可,这样子就配置好了MCP Server,就可以看见这里是绿色的小点。
{
"mcpServers": {
"github_server": {
"command": "uv",
"args": [
"--directory",
"D:/blog/github-mcp-server",
"run",
"github_server.py"
]
}
}
}

这样,我们就可以直接使用自己写的MCP Server了。


最后,完整项目在这里。
参考资料
2、Anthropic: Introducing the Model Context Protocol long detailed title
3、EP154: What is MCP? long detailed title
944

被折叠的 条评论
为什么被折叠?



