change document link
@ -6,6 +6,8 @@ import { InlineLinkPreviewElementTransform } from '@nolebase/vitepress-plugin-in
|
||||
import { ThumbnailHashImages } from '@nolebase/vitepress-plugin-thumbnail-hash/vite';
|
||||
import { BiDirectionalLinks } from '@nolebase/markdown-it-bi-directional-links';
|
||||
|
||||
import { withMermaid } from "vitepress-plugin-mermaid";
|
||||
|
||||
export const customIcons = {
|
||||
share: {
|
||||
svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z"/></svg>'
|
||||
@ -14,7 +16,7 @@ export const customIcons = {
|
||||
|
||||
export const baseUrl = '/openmcp';
|
||||
|
||||
export default defineConfig({
|
||||
export default withMermaid({
|
||||
title: "OpenMCP",
|
||||
description: "为开发者和科研人员准备的MCP开发环境和SDK",
|
||||
base: baseUrl,
|
||||
@ -51,7 +53,6 @@ export default defineConfig({
|
||||
md.use(lightbox);
|
||||
md.use(InlineLinkPreviewElementTransform);
|
||||
md.use(BiDirectionalLinks({
|
||||
baseDir: baseUrl,
|
||||
debug: true
|
||||
}));
|
||||
}
|
||||
@ -72,16 +73,25 @@ export default defineConfig({
|
||||
props: {
|
||||
title: '简介',
|
||||
description: '关于 mcp 和 openmcp,阁下需要知道的 ...',
|
||||
icon: 'zhuanti',
|
||||
icon: 'openmcp',
|
||||
link: '/plugin-tutorial/'
|
||||
}
|
||||
},
|
||||
{
|
||||
component: 'KNavItem',
|
||||
props: {
|
||||
title: '快速开始',
|
||||
description: '通过一个例子快速了解 OpenMCP 的基本概念',
|
||||
icon: 'quick-fill',
|
||||
link: '/plugin-tutorial/quick-start/'
|
||||
}
|
||||
},
|
||||
{
|
||||
component: 'KNavItem',
|
||||
props: {
|
||||
title: 'OpenMCP 使用手册',
|
||||
description: 'OpenMCP Client 的基本使用',
|
||||
icon: 'shujuzhongxin',
|
||||
icon: 'shiyongshouce',
|
||||
link: '/plugin-tutorial/usage/connect-mcp'
|
||||
}
|
||||
},
|
||||
@ -91,7 +101,7 @@ export default defineConfig({
|
||||
title: 'MCP 服务器开发案例',
|
||||
description: '使用不同语言开发的不同模式的 MCP 服务器',
|
||||
icon: 'yibangonggongyusuan',
|
||||
link: '/plugin-tutorial/examples/'
|
||||
link: '/plugin-tutorial/examples/mcp-examples'
|
||||
}
|
||||
},
|
||||
{
|
||||
@ -155,10 +165,18 @@ export default defineConfig({
|
||||
text: '简介',
|
||||
items: [
|
||||
{ text: 'OpenMCP 概述', link: '/plugin-tutorial/index' },
|
||||
{ text: '获取 OpenMCP', link: '/plugin-tutorial/acquire-openmcp' },
|
||||
{ text: '什么是 MCP?', link: '/plugin-tutorial/what-is-mcp' },
|
||||
{ text: 'MCP 基础概念', link: '/plugin-tutorial/concept' }
|
||||
]
|
||||
},
|
||||
{
|
||||
text: '快速开始',
|
||||
items: [
|
||||
{ text: '快速开始', link: '/plugin-tutorial/quick-start' },
|
||||
{ text: '安装 OpenMCP', link: '/plugin-tutorial/quick-start/acquire-openmcp' },
|
||||
{ text: '你的第一个 MCP', link: '/plugin-tutorial/quick-start/first-mcp' },
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "OpenMCP 使用手册",
|
||||
items: [
|
||||
@ -173,7 +191,7 @@ export default defineConfig({
|
||||
{
|
||||
text: "MCP 服务器开发案例",
|
||||
items: [
|
||||
{ text: '大纲', link: '/plugin-tutorial/examples' },
|
||||
{ text: 'MCP 服务器开发案例', link: '/plugin-tutorial/examples/mcp-examples' },
|
||||
{ text: '例子 1. python 实现天气信息 mcp 服务器 (STDIO)', link: '/plugin-tutorial/examples/python-simple-stdio' },
|
||||
{ text: '例子 2. go 实现 neo4j 的只读 mcp 服务器 (SSE)', link: '/plugin-tutorial/examples/go-neo4j-sse' },
|
||||
{ text: '例子 3. java 实现文档数据库的只读 mcp (HTTP)', link: '/plugin-tutorial/examples/java-es-http' },
|
||||
|
@ -1,8 +1,8 @@
|
||||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 4933953 */
|
||||
src: url('iconfont.woff2?t=1748343115691') format('woff2'),
|
||||
url('iconfont.woff?t=1748343115691') format('woff'),
|
||||
url('iconfont.ttf?t=1748343115691') format('truetype');
|
||||
src: url('iconfont.woff2?t=1748520733313') format('woff2'),
|
||||
url('iconfont.woff?t=1748520733313') format('woff'),
|
||||
url('iconfont.ttf?t=1748520733313') format('truetype');
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
@ -13,6 +13,22 @@
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-yunfuwuqi:before {
|
||||
content: "\e631";
|
||||
}
|
||||
|
||||
.icon-shiyongshouce:before {
|
||||
content: "\e600";
|
||||
}
|
||||
|
||||
.icon-openmcp:before {
|
||||
content: "\e666";
|
||||
}
|
||||
|
||||
.icon-quick-fill:before {
|
||||
content: "\e863";
|
||||
}
|
||||
|
||||
.icon-heike:before {
|
||||
content: "\e6c5";
|
||||
}
|
||||
|
1474
package-lock.json
generated
@ -16,6 +16,8 @@
|
||||
"@nolebase/vitepress-plugin-inline-link-preview": "^2.17.1",
|
||||
"@nolebase/vitepress-plugin-page-properties": "^2.17.1",
|
||||
"@nolebase/vitepress-plugin-thumbnail-hash": "^2.17.1",
|
||||
"vitepress-plugin-lightbox": "^1.0.2"
|
||||
"mermaid": "^11.6.0",
|
||||
"vitepress-plugin-lightbox": "^1.0.2",
|
||||
"vitepress-plugin-mermaid": "^2.0.17"
|
||||
}
|
||||
}
|
||||
|
@ -2,15 +2,13 @@
|
||||
|
||||
## 前言
|
||||
|
||||
在[之前的文章](https://zhuanlan.zhihu.com/p/28859732955)中,我们简单介绍了 MCP 的定义和它的基本组织结构。作为开发者,我们最需要关注的其实是如何根据我们自己的业务和场景定制化地开发我们需要的 MCP 服务器,这样直接接入任何一个 MCP 客户端后,我们都可以给大模型以我们定制出的交互能力。
|
||||
|
||||
|
||||
在 [[what-is-mcp|之前的文章]] 中,我们简单介绍了 MCP 的定义和它的基本组织结构。作为开发者,我们最需要关注的其实是如何根据我们自己的业务和场景定制化地开发我们需要的 MCP 服务器,这样直接接入任何一个 MCP 客户端后,我们都可以给大模型以我们定制出的交互能力。
|
||||
|
||||
在正式开始教大家如何开发自己的 MCP 服务器之前,我想,或许有必要讲清楚几个基本概念。
|
||||
|
||||
|
||||
|
||||
## MCP Server 中的基本概念
|
||||
|
||||
### Resources, Prompts 和 Tools
|
||||
## Resources, Prompts 和 Tools
|
||||
|
||||
在 [MCP 客户端协议](https://modelcontextprotocol.io/clients) 中,讲到了 MCP 协议中三个非常重要的能力类别:
|
||||
|
||||
@ -24,7 +22,7 @@ MCP 客户端(比如 Claude Desktop,5ire 等)已经实现好了上述的
|
||||
|
||||
不过需要说明的一点是,目前几乎所有大模型采用了 openai 协议作为我们访问大模型的接入点。什么叫 openai 协议呢?
|
||||
|
||||
### openai 协议
|
||||
## openai 协议
|
||||
|
||||
当我们使用 python 或者 typescript 开发 app 时,往往会安装一个名为 openai 的库,里面填入你需要使用的模型厂商、模型的基础 url、使用的模型类别来直接访问大模型。而各个大模型提供商也必须支持这个库,这套协议。
|
||||
|
||||
@ -116,7 +114,7 @@ print(response.choices[0].message.content)
|
||||
) -> ChatCompletion:
|
||||
```
|
||||
|
||||
### tool_calls 字段
|
||||
## tool_calls 字段
|
||||
|
||||
在上面的 openai 协议中,有一个名为 tools 的参数。 tools 就是要求大模型厂商必须支持 function calling 这个特性,也就是我们提供一部分工具的描述(和 MCP 协议完全兼容的),在 tools 不为空的情况下,chat 函数返回的值中会包含一个特殊的字段 `tool_calls`,我们可以运行下面的我写好的让大模型调用可以查询天气的代码:
|
||||
|
||||
@ -193,7 +191,7 @@ ChatCompletionMessage(
|
||||
|
||||
|
||||
|
||||
## 快速开始
|
||||
## 开始你的第一个 mcp 服务器
|
||||
|
||||
接下里就要让我们大显身手了!MCP 官方提供了几个封装好的 mcp sdk 来让我们快速开发一个 MCP 服务器。我看了一下,目前使用最爽,最简单的是 python 的 sdk,所以我就用 python 来简单演示一下了。
|
||||
|
||||
@ -204,7 +202,16 @@ ChatCompletionMessage(
|
||||
首先让我们打开一个项目,安装基本的库:
|
||||
|
||||
```bash
|
||||
pip install mcp "mcp[cli]" uv
|
||||
pip install uv
|
||||
```
|
||||
|
||||
然后进入一个目录后初始化 uv 项目并安装对应的依赖:
|
||||
|
||||
```bash
|
||||
mkdir -p ~/code/mcp-server
|
||||
cd ~/code/mcp-server
|
||||
uv init --no-workspace
|
||||
uv add mcp "mcp[cli]"
|
||||
```
|
||||
|
||||
创建 `server.py`
|
||||
@ -277,11 +284,3 @@ Tools 端将会是我们后面调试的核心。在之前的章节我们讲过
|
||||
这篇文章,我们简单了解了 MCP 内部的一些基本概念,我认为这些概念对于诸位开发一个 MCP 服务器是大有裨益的,所以我认为有必要先讲一讲。
|
||||
|
||||
下面的文章中,我将带领大家探索 MCP 的奇境,一个属于 AI Agent 的时代快要到来了。
|
||||
|
||||
|
||||
|
||||
## 挖坑
|
||||
|
||||
从上面的例子中,大家也能看出其实现在调试 MCP Server 的工具还不算齐全,所以我打算最近快速开发一款 vscode 插件,集合 Inspector 的所有功能和基础的大模型测试为一体。如果你开发了基本的网络和磁盘访问的 MCP Server,这个调试工具也可以当成一个 Manus 客户端进行把玩。
|
||||
|
||||
请大家期待吧!
|
||||
|
@ -1,7 +1,7 @@
|
||||
---
|
||||
next:
|
||||
text: 获取 OpenMCP
|
||||
link: '/plugin-tutorial/acquire-openmcp'
|
||||
text: 什么是 MCP?
|
||||
link: '/plugin-tutorial/what-is-mcp'
|
||||
---
|
||||
|
||||
# OpenMCP 概述
|
||||
|
165
plugin-tutorial/quick-start/first-mcp.md
Normal file
@ -0,0 +1,165 @@
|
||||
|
||||
# 你的第一个 MCP
|
||||
|
||||
实现 MCP 的编程语言很多,常见的几户所有编程语言都有官方和民间的支持,以 编程语言 + MCP 就能搜到对应的库,在 [[mcp-examples|MCP 服务器开发案例]] 中,我们也提供了不同编程语言的不同例子。
|
||||
|
||||
在所有编程语言中,Python 的 MCP 的开发无疑是最为简单,最容易让新手上手的,所以第一个 MCP我们先用 python 来实现。其他的编程语言实现效果也大同小异。
|
||||
|
||||
## 安装 uv
|
||||
|
||||
Python 写 mcp 服务器强烈推荐使用 uv 作为包管理器,关于 uv,你只需要知道它是一个高性能包管理器,拥有 pip 和 conda 的所有优点。没有的朋友请先通过 pip 安装 uv:
|
||||
|
||||
```bash
|
||||
pip install uv
|
||||
```
|
||||
|
||||
:::warning 使用 anaconda 或者 miniconda 的朋友注意了!
|
||||
请不要在非 base 环境下安装 uv,请在 base 环境下安装 uv,uv 本身会做好环境隔离的工作,请不要担心 uv 会污染你的 base 环境。你不安装在 base 下或者使用全局默认的 pip 安装,我们根本不知道你安装的 uv 在哪里!base 环境下使用 pip 安装的脚本会安装在 `~/anaconda/bin/uv` 中,也请确保 `~/anaconda/bin/` 在你的 `$PATH` 中。
|
||||
:::
|
||||
|
||||
|
||||
查看 uv 的版本:
|
||||
|
||||
```bash
|
||||
uv version
|
||||
```
|
||||
|
||||
我的输出是:
|
||||
```
|
||||
uv 0.6.9 (3d9460278 2025-03-20)
|
||||
```
|
||||
|
||||
实操时,请保证版本不要低于我的。
|
||||
|
||||
## 创建一个最简单的 mcp 服务器
|
||||
|
||||
我们进入工程目录,准备创建一个最简单的 mcp 服务器。
|
||||
|
||||
```bash
|
||||
mkdir -p ~/codes/my-first-mcp
|
||||
cd ~/codes/my-first-mcp
|
||||
uv init --no-workspace
|
||||
```
|
||||
|
||||
此时,你的项目里面应该有这三个文件:
|
||||
|
||||
```
|
||||
README.md main.py pyproject.toml
|
||||
```
|
||||
|
||||
然后,我们在当前文件夹打开 vscode 或者 trae,我们创建一个最简单的 mcp 服务器,它的功能是:
|
||||
- 提供一个名为 add 的工具,用于对两个数字进行加法
|
||||
- 提供一个名为 greeting 的资源,用于返回一个 greeting 消息
|
||||
|
||||
先安装 mcp 相关的库:
|
||||
|
||||
```bash
|
||||
uv add mcp "mcp[cli]"
|
||||
```
|
||||
|
||||
修改 `main.py` 内容如下:
|
||||
|
||||
```python
|
||||
from mcp.server.fastmcp import FastMCP
|
||||
mcp = FastMCP('锦恢的 MCP Server', version="11.45.14")
|
||||
|
||||
@mcp.tool(
|
||||
name='add',
|
||||
description='对两个数字进行实数域的加法'
|
||||
)
|
||||
def add(a: int, b: int) -> int:
|
||||
return a + b
|
||||
|
||||
@mcp.resource(
|
||||
uri="greeting://{name}",
|
||||
name='greeting',
|
||||
description='用于演示的一个资源协议'
|
||||
)
|
||||
def get_greeting(name: str) -> str:
|
||||
return f"Hello, {name}!"
|
||||
|
||||
@mcp.prompt(
|
||||
name='translate',
|
||||
description='进行翻译的prompt'
|
||||
)
|
||||
def translate(message: str) -> str:
|
||||
return f'请将下面的话语翻译成中文:\n\n{message}'
|
||||
```
|
||||
|
||||
## 使用 OpenMCP 一键连接
|
||||
|
||||
如上,我们申明了三个函数,用作 mcp 的 tool,resource 和 prompt。在 OpenMCP 中启动它们非常简单,点击右上角的 OpenMCP 图标即可连接:
|
||||
|
||||

|
||||
|
||||
初次使用 OpenMCP,会出现引导界面,还希望阁下可以耐心看完。
|
||||
|
||||

|
||||
|
||||
如果登录完成后,如图显示连接成功,则代表当前已经成功启动并连接 mcp 服务器。
|
||||
|
||||

|
||||
|
||||
恭喜您,万事开头难,您已经完成了最难的 mcp 连接!
|
||||
|
||||
|
||||
## 附录:关于 uv 启动 mcp 你必须知道的
|
||||
|
||||
OpenMCP 已经帮你做好了很多事情,但是使用 uv 启动 mcp 服务器其实是不只一种方法的,了解更加底层的原理有助于您以不变应万变。因为 OpenMCP 对于 python 项目默认运行 `uv run mcp run main.py` 来启动 mcp 服务器,但是 GitHub 上的部分项目无法这么启动。
|
||||
|
||||
先了解一下正常的如下的代码应该如何通过命令行启动 mcp 吧!
|
||||
|
||||
|
||||
```python
|
||||
from mcp.server.fastmcp import FastMCP
|
||||
mcp = FastMCP('锦恢的 MCP Server', version="11.45.14")
|
||||
|
||||
@mcp.tool(
|
||||
name='add',
|
||||
description='对两个数字进行实数域的加法'
|
||||
)
|
||||
def add(a: int, b: int) -> int:
|
||||
return a + b
|
||||
|
||||
@mcp.resource(
|
||||
uri="greeting://{name}",
|
||||
name='greeting',
|
||||
description='用于演示的一个资源协议'
|
||||
)
|
||||
def get_greeting(name: str) -> str:
|
||||
return f"Hello, {name}!"
|
||||
|
||||
@mcp.prompt(
|
||||
name='translate',
|
||||
description='进行翻译的prompt'
|
||||
)
|
||||
def translate(message: str) -> str:
|
||||
return f'请将下面的话语翻译成中文:\n\n{message}'
|
||||
```
|
||||
|
||||
### 方法一:使用 mcp-cli
|
||||
|
||||
mcp 本身提供了脚手架,可以直接启动一段被申明的 python 代码,作为一个 mcp 服务器。使用如下代码运行它:
|
||||
|
||||
```bash
|
||||
uv run mcp run main.py
|
||||
```
|
||||
|
||||
### 方法二:在代码中显式启动
|
||||
|
||||
你也可以在代码中显式启动 mcp 服务器,在 `main.py` 的结尾添加:
|
||||
|
||||
```python
|
||||
if __name__ == '__main__':
|
||||
mcp.run()
|
||||
```
|
||||
|
||||
然后运行如下代码即可启动 mcp 服务器:
|
||||
|
||||
```bash
|
||||
uv run main.py
|
||||
```
|
||||
|
||||
:::warning
|
||||
请不要运行 python main.py,因为 uv run 会使用当前虚拟环境的库,这些库在外部 python 看来是不可见的。也不要在没有使用 `mcp.run()` 启动代码的情况下就直接使用 mcp run main.py,我们之前的代码只是申明了函数,并没有实际上执行任何功能。
|
||||
:::
|
BIN
plugin-tutorial/quick-start/images/connect-simple.png
Normal file
After Width: | Height: | Size: 511 KiB |
BIN
plugin-tutorial/quick-start/images/connect-success.png
Normal file
After Width: | Height: | Size: 394 KiB |
Before Width: | Height: | Size: 228 KiB After Width: | Height: | Size: 228 KiB |
BIN
plugin-tutorial/quick-start/images/guide.png
Normal file
After Width: | Height: | Size: 428 KiB |
BIN
plugin-tutorial/quick-start/images/inspector.png
Normal file
After Width: | Height: | Size: 389 KiB |
BIN
plugin-tutorial/quick-start/images/openmcp.png
Normal file
After Width: | Height: | Size: 624 KiB |
Before Width: | Height: | Size: 213 KiB After Width: | Height: | Size: 213 KiB |
Before Width: | Height: | Size: 467 KiB After Width: | Height: | Size: 467 KiB |
0
plugin-tutorial/quick-start/index.md
Normal file
@ -6,90 +6,8 @@
|
||||
MCP 客户端是指能够通过 MCP 协议进行通信的大模型对话客户端,通常是一个运行在本地的应用程序(因为网页没有文件IO的权限)。它的产品形式目前几乎都是聊天机器人的形式,类似于你在网页使用的 chat.deepseek.com 或者 chat.openai.com
|
||||
:::
|
||||
|
||||
[[https://kirigaya.cn/openmcp/plugin-tutorial/acquire-openmcp.html]]
|
||||
首先,打开你的 VLE,在 [[../quick-start/acquire-openmcp|获取 OpenMCP]] 中完成 OpenMCP 的安装后,我们先用 python 创建一个最简单的 mcp 服务器,来测试 mcp 客户端的连接。
|
||||
|
||||
首先,打开你的 VLE,在 [获取 OpenMCP](https://kirigaya.cn/openmcp/plugin-tutorial/acquire-openmcp.html) 中完成 OpenMCP 的安装后,我们先用 python 创建一个最简单的 mcp 服务器,来测试 mcp 客户端的连接。
|
||||
|
||||
|
||||
## 安装 uv
|
||||
|
||||
Python 写 mcp 服务器强烈推荐使用 uv 作为包管理器,关于 uv,你只需要知道它是一个高性能包管理器,拥有 pip 和 conda 的所有优点。没有的朋友请先通过 pip 安装 uv:
|
||||
|
||||
```bash
|
||||
pip install uv
|
||||
```
|
||||
|
||||
:::warning 使用 anaconda 或者 miniconda 的朋友注意了!
|
||||
请不要在非 base 环境下安装 uv,请在 base 环境下安装 uv,uv 本身会做好环境隔离的工作,请不要担心 uv 会污染你的 base 环境。你不安装在 base 下或者使用全局默认的 pip 安装,我们根本不知道你安装的 uv 在哪里!base 环境下使用 pip 安装的脚本会安装在 `~/anaconda/bin/uv` 中,也请确保 `~/anaconda/bin/` 在你的 `$PATH` 中。
|
||||
:::
|
||||
|
||||
|
||||
查看 uv 的版本:
|
||||
|
||||
```bash
|
||||
uv version
|
||||
```
|
||||
|
||||
我的输出是:
|
||||
```
|
||||
uv 0.6.9 (3d9460278 2025-03-20)
|
||||
```
|
||||
|
||||
实操时,请保证版本不要低于我的。
|
||||
|
||||
## 创建一个最简单的 mcp 服务器
|
||||
|
||||
我们进入工程目录,准备创建一个最简单的 mcp 服务器。
|
||||
|
||||
```bash
|
||||
mkdir -p ~/codes/python && cd ~/codes/python
|
||||
uv init --no-workspace
|
||||
```
|
||||
|
||||
此时,你的项目里面应该有这三个文件:
|
||||
|
||||
```
|
||||
README.md main.py pyproject.toml
|
||||
```
|
||||
|
||||
然后,我们在当前文件夹打开 vscode 或者 trae,我们创建一个最简单的 mcp 服务器,它的功能是:
|
||||
- 提供一个名为 add 的工具,用于对两个数字进行加法
|
||||
- 提供一个名为 greeting 的资源,用于返回一个 greeting 消息
|
||||
|
||||
先安装 mcp 相关的库:
|
||||
|
||||
```bash
|
||||
uv add mcp "mcp[cli]"
|
||||
```
|
||||
|
||||
修改 `main.py` 内容如下:
|
||||
|
||||
```python
|
||||
from mcp.server.fastmcp import FastMCP
|
||||
mcp = FastMCP('锦恢的 MCP Server', version="11.45.14")
|
||||
|
||||
@mcp.tool(
|
||||
name='add',
|
||||
description='对两个数字进行实数域的加法'
|
||||
)
|
||||
def add(a: int, b: int) -> int:
|
||||
return a + b
|
||||
|
||||
@mcp.resource(
|
||||
uri="greeting://{name}",
|
||||
name='greeting',
|
||||
description='用于演示的一个资源协议'
|
||||
)
|
||||
def get_greeting(name: str) -> str:
|
||||
return f"Hello, {name}!"
|
||||
|
||||
@mcp.prompt(
|
||||
name='translate',
|
||||
description='进行翻译的prompt'
|
||||
)
|
||||
def translate(message: str) -> str:
|
||||
return f'请将下面的话语翻译成中文:\n\n{message}'
|
||||
```
|
||||
|
||||
## 使用 OpenMCP 一键连接
|
||||
|
||||
|
183
plugin-tutorial/what-is-mcp.md
Normal file
@ -0,0 +1,183 @@
|
||||
# MCP 简介
|
||||
|
||||

|
||||
|
||||
## 什么是 MCP?
|
||||
|
||||
MCP (Model Context Protocol)是一种开放协议,用于标准化应用程序如何向大型语言模型(LLMs)提供上下文。可以将 MCP 想象为 AI 应用的 typec 接口。正如 typec 提供了一种标准化的方式将您的设备连接到各种外设和配件,MCP 也提供了一种标准化的方式,将 AI 模型连接到不同的数据源和工具。
|
||||
|
||||
MCP 协议由 Anthropic 在 2024 年 11 月底推出:
|
||||
|
||||
- 官方文档:[Introduction](https://modelcontextprotocol.io/introduction)
|
||||
- GitHub 仓库:[github.com/modelcontextprotocol](https://github.com/modelcontextprotocol)
|
||||
|
||||
|
||||
## 为什么需要 MCP?
|
||||
|
||||
我们都知道,从最初的 chatgpt,到后来的 cursor,copilot chatroom,再到现在耳熟能详的 agent,实际上,从用户交互的角度去观察,你会发现目前的大模型产品经历了如下的变化:
|
||||
|
||||
``` mermaid
|
||||
graph LR
|
||||
|
||||
a(chatbot\n > deepseek, chatgpt) --> b(composer\n > cursor, copilot) --> c(agent\n > AutoGPT, Manus, Open Manus)
|
||||
```
|
||||
|
||||
- chatbot
|
||||
- 只会聊天的程序。
|
||||
- 工作流程:你输入问题,它给你这个问题的解决方案,但是具体执行还需要你自己去。
|
||||
- 代表工作:deepseek,chatgpt
|
||||
- composer
|
||||
- 稍微会帮你干活的实习生,仅限于写代码。
|
||||
- 工作流程:你输入问题,它会给你帮你生成解决问题的代码,并且自动填入代码编辑器的编译区,你只需要审核确认即可。
|
||||
- 代表工作:cursor,copilot
|
||||
- agent
|
||||
- 私人秘书。
|
||||
- 工作流程:你输入问题,它生成这个问题的解决方案,并在征询了你的同意后全自动执行。
|
||||
- 代表工作:AutoGPT,Manus,Open Manus
|
||||
|
||||
|
||||
|
||||
为了实现 agent,也就需要让 LLM 可以自如灵活地操作所有软件甚至物理世界的机器人,于是需要定义统一的上下文协议与之上统一工作流。MCP(model context protocol) 就是解决这套方案的应运而生的基础协议。一个感性认识如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
|
||||
user(用户)
|
||||
ai(AI软件)
|
||||
llm(大模型)
|
||||
computer(本地环境)
|
||||
|
||||
user --帮我整理两会报告中有\n关AI的咨询到word文件--> agent
|
||||
|
||||
subgraph agent
|
||||
|
||||
ai <--MCP--> llm
|
||||
computer <--MCP--> ai
|
||||
|
||||
end
|
||||
|
||||
agent --> word(D:/会议总结/两会报告AI专题.docx)
|
||||
|
||||
```
|
||||
|
||||
|
||||
:::info
|
||||
|
||||
Anthropic 对于 MCP 的必要性给出的解释:MCP 帮助您在 LLMs 之上构建 agent 和复杂的工作流程。LLMs 经常需要与数据和工具集成,而 MCP 提供了以下支持:
|
||||
|
||||
- 一系列不断增长的预构建集成,您的 LLM 可以直接接入这些集成。
|
||||
- 在 LLM 提供商和供应商之间灵活切换。
|
||||
- 在基础设施内保护数据的最佳实践。
|
||||
|
||||
:::
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 总体架构
|
||||
|
||||
MCP 的核心采用客户端-服务器架构,其中 host 可以连接到多个服务器:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
|
||||
host[Host MCP 客户端\n 浏览器, 代码编辑器, 其他工具]
|
||||
|
||||
server_a[MCP 服务器 A]
|
||||
server_b[MCP 服务器 B]
|
||||
server_c[MCP 服务器 C]
|
||||
|
||||
db_a[(本地\n数据源 A)]
|
||||
db_b[(本地\n数据源 B)]
|
||||
|
||||
remote[(远程服务 C)]
|
||||
|
||||
subgraph 你的电脑
|
||||
direction LR
|
||||
host <--MCP 协议--> server_a
|
||||
host <--MCP 协议--> server_b
|
||||
host <--MCP 协议--> server_c
|
||||
server_a <--> db_a
|
||||
server_b <--> db_b
|
||||
end
|
||||
|
||||
|
||||
subgraph 互联网
|
||||
server_c <--Web APIs--> remote
|
||||
end
|
||||
```
|
||||
|
||||
|
||||
|
||||
- MCP 主机(MCP Hosts) :MCP 主机是指希望通过 MCP 访问数据的程序,例如 Claude Desktop、集成开发环境(IDEs)或其他 AI 工具。
|
||||
- MCP 客户端(MCP Clients):MCP 客户端是与服务器保持 1:1 连接的协议客户端,负责与 MCP 服务器通信。
|
||||
- MCP 服务器(MCP Servers):MCP 服务器是轻量级程序,每个服务器通过标准化的 Model Context Protocol 暴露特定的功能。
|
||||
- 本地数据源(Local Data Sources):本地数据源是指 MCP 服务器可以安全访问的计算机文件、数据库和服务。
|
||||
- 远程服务(Remote Services):远程服务是指 MCP 服务器可以通过互联网连接的外部系统(例如通过 API 访问的服务)。
|
||||
|
||||
|
||||
|
||||
## MCP 的工作流程
|
||||
|
||||
从工作流程上,MCP 和 LSP 非常非常像,事实上,目前的 MCP 和 LSP 一样,也是基于 [JSON-RPC 2.0](https://link.zhihu.com/?target=https%3A//www.jsonrpc.org/specification) 进行数据传输的(基于Stdio 或者 基于SSE)。如果开发过 LSP 的朋友对于 MCP 应该会感到非常的理所当然。我将用若干个简单明了的泳道图尽可能让大家看懂这玩意儿是如何执行的。
|
||||
|
||||
### 初始化
|
||||
|
||||
假设我们的软件已经支持了 MCP 客户端,那么当我们的软件启动时,它会经历如下的步骤:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph MCP 客户端
|
||||
A1[初始化]
|
||||
A2[获取 MCP 服务端提供的工具集合 \n1. 创建文件 -> createFile\n2. 删除文件 -> deleteFile\n3. 使用搜索引擎 -> useBrowser\n 4. ...]
|
||||
end
|
||||
|
||||
subgraph MCP 服务端
|
||||
B1[初始化]
|
||||
end
|
||||
|
||||
A1 --startMCPServer--> B1
|
||||
B1 --ListToolsRequestSchema--> A2
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 工作流程
|
||||
|
||||
假设,你是一位 C语言工程师,你现在想要让 agent 自动完成一个项目的编译,那么执行流程如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph MCP 客户端
|
||||
A1[用户询问 请帮我删除 build\n下的所有编译的中间结果] --> A2[将用户询问, 资源, MCP服务端的工具集合发送给大模型]
|
||||
|
||||
A3[大模型返回操作流\n1. deleteFile build/a.o\n2. deleteFile build/b.o]
|
||||
A4[整理操作结果给大模型]
|
||||
A5[最终响应展示给用户]
|
||||
end
|
||||
|
||||
subgraph MCP 服务端
|
||||
B1[解析大模型操作流] --征询用户同意--> B2[执行操作流]
|
||||
end
|
||||
|
||||
subgraph 大模型
|
||||
C1[大模型基于上下文生成操作方案]
|
||||
|
||||
C2[大模型基于所有信息生\n成自然语言响应]
|
||||
end
|
||||
|
||||
A3 --> B1
|
||||
B2 --> A4
|
||||
A2 --> C1
|
||||
C1 --> A3
|
||||
A4 --> C2
|
||||
C2 --> A5
|
||||
```
|
||||
|
||||
|
||||
## 开源生态
|
||||
|
||||
和 LSP 一样,LSP 在开源社区有非常多的客户端和服务端框架,MCP 也是一样的,目前 Anthropic 开源了一套 MCP 的服务端框架:https://github.com/modelcontextprotocol/servers,想要探索大模型效用的朋友可以尽情去使用这个框架。
|
||||
|
||||
除此之外,pulsemcp 上也有很多开源社区开发的 MCP 客户端和服务端:https://www.pulsemcp.com/clients
|
@ -31,9 +31,9 @@ for parent, _, files in os.walk('./scripts/tmp'):
|
||||
if file.endswith('.css'):
|
||||
content = open(filepath, 'r', encoding='utf-8').read().replace('font-size: 16px;', '')
|
||||
open(filepath, 'w', encoding='utf-8').write(content)
|
||||
shutil.move(filepath, os.path.join('./.vitepress/theme', file))
|
||||
shutil.move(filepath, os.path.join('./.vitepress/theme/css', file))
|
||||
elif file.endswith('.woff2'):
|
||||
shutil.move(filepath, os.path.join('./.vitepress/theme', file))
|
||||
shutil.move(filepath, os.path.join('./.vitepress/theme/css', file))
|
||||
|
||||
# 删除压缩包和解压区域
|
||||
os.remove('./scripts/tmp.zip')
|
||||
|