Skip to main content
Glama
codeExploreHub

MCP Model Provider Example

README.md
# MCP 模型提供商示例

这是一个完整的 MCP (Model Context Protocol) 示例项目,展示了如何搭建一个支持本地 Ollama 模型和远程 API 模型的 MCP 服务器,以及如何使用 LangChain 构建大模型应用来发现和调用 MCP 工具。

## 功能特性

- **支持本地模型**:通过 Ollama 部署的本地模型,无需 API 密钥
- **支持远程模型**:通过 API 密钥访问远程模型(如 OpenAI)
- **动态工具发现**:大模型可以自动发现 MCP 提供的工具
- **工具调用**:大模型可以根据需要调用 MCP 工具并获取结果
- **加法计算工具**:内置了一个计算两个数之和的工具
- **模型调用工具**:可以调用不同类型的语言模型

## 项目结构

```
e:\agents_pro\mcp\
├── package.json          # 项目配置和依赖
├── index.js              # MCP 服务器主文件
├── tools/                # 工具定义目录
│   ├── model_invoke.json # 模型调用工具定义
│   └── add_numbers.json  # 加法计算工具定义
├── example.js            # JavaScript 示例
├── langchain-app.py      # Python LangChain 应用示例
└── README.md             # 项目文档
```

## 安装步骤

### 1. 安装 Node.js 依赖

```bash
npm install
```

### 2. 安装 Python 依赖(用于 LangChain 应用)

```bash
pip install -r requirements.txt
```

### 3. 安装 Ollama(用于本地模型)

请访问 [Ollama 官网](https://ollama.com/) 下载并安装 Ollama,然后运行以下命令拉取模型:

```bash
ollama pull llama2
ollama pull qwen3:4b
```

## 配置说明

### 1. MCP 服务器配置

- **端口**:默认运行在 3000 端口
- **工具定义**:在 `tools/` 目录下定义工具
- **模型配置**:
  - 本地模型:通过 Ollama 部署,默认地址为 `http://localhost:11434`
  - 远程模型:需要在代码中设置 API 密钥

### 2. LangChain 应用配置

- **模型选择**:默认使用本地 Ollama 模型 `qwen3:4b`
- **远程模型**:需要在 `langchain-app.py` 中设置 API 密钥

## 使用方法

### 1. 启动 MCP 服务器

```bash
npm start
```

服务器启动后,会在控制台输出以下信息:

```
MCP server running on port 3000
Tools available at: http://localhost:3000/mcp/tools
Invoke endpoint at: http://localhost:3000/mcp/invoke
```

### 2. 运行 JavaScript 示例

```bash
node example.js
```

### 3. 运行 Python LangChain 应用

```bash
python langchain-app.py
```

## API 端点

### 1. 列出可用工具

**请求**:
```
GET /mcp/tools
```

**响应**:
```json
{
  "tools": [
    {
      "name": "model_invoke",
      "description": "Invoke a language model with a prompt",
      "parameters": {
        "type": "object",
        "properties": {
          "prompt": {
            "type": "string",
            "description": "The prompt to send to the model"
          },
          "model_type": {
            "type": "string",
            "enum": ["local", "remote"],
            "description": "Model type: local (Ollama) or remote (API)"
          },
          "model_name": {
            "type": "string",
            "description": "Model name to use"
          },
          "api_key": {
            "type": "string",
            "description": "API key for remote model (required if model_type is remote)"
          }
        },
        "required": ["prompt", "model_type", "model_name"]
      }
    },
    {
      "name": "add_numbers",
      "description": "Calculate the sum of two numbers",
      "parameters": {
        "type": "object",
        "properties": {
          "num1": {
            "type": "number",
            "description": "The first number"
          },
          "num2": {
            "type": "number",
            "description": "The second number"
          }
        },
        "required": ["num1", "num2"]
      }
    }
  ]
}
```

### 2. 调用工具

**请求**:
```
POST /mcp/invoke
Content-Type: application/json

{
  "tool": "model_invoke",
  "params": {
    "prompt": "你好,告诉我一个简短的笑话",
    "model_type": "local",
    "model_name": "llama2"
  }
}
```

**响应**:
```json
{
  "success": true,
  "data": {
    "response": "为什么人工智能不会感冒?因为它们没有病毒,只有bug!"
  }
}
```

## 示例场景

### 1. 大模型自动发现并使用加法工具

**用户查询**:"计算 123 加上 456 等于多少"

**大模型流程**:
1. 分析用户请求,发现需要进行加法计算
2. 自动发现 MCP 提供的 `add_numbers` 工具
3. 调用工具,传递参数 `{"num1": 123, "num2": 456}`
4. 接收工具执行结果 `{"sum": 579}`
5. 基于结果生成最终回答:"123 加上 456 等于 579"

### 2. 大模型使用模型调用工具

**用户查询**:"使用本地模型写一首关于春天的诗"

**大模型流程**:
1. 分析用户请求,发现需要使用模型生成内容
2. 自动发现 MCP 提供的 `model_invoke` 工具
3. 调用工具,传递参数 `{"prompt": "写一首关于春天的诗", "model_type": "local", "model_name": "qwen3:4b"}`
4. 接收工具执行结果(模型生成的诗)
5. 基于结果生成最终回答

## 注意事项

1. **本地模型**:使用本地 Ollama 模型时,需要确保 Ollama 服务正在运行
2. **远程模型**:使用远程模型时,需要在代码中设置有效的 API 密钥
3. **工具定义**:添加新工具时,需要在 `tools/` 目录下创建工具定义文件,并在 `index.js` 中添加相应的处理函数
4. **端口冲突**:如果端口 3000 被占用,可以修改 `index.js` 中的端口配置

## 扩展建议

1. **添加更多工具**:可以根据需要添加更多工具,如天气查询、新闻获取等
2. **支持更多模型**:可以扩展 `model_invoke` 工具,支持更多类型的模型提供商
3. **添加认证**:可以为 MCP 服务器添加认证机制,确保只有授权的应用可以访问
4. **添加日志**:可以添加详细的日志记录,便于调试和监控

## 故障排除

### 1. 端口被占用

如果启动服务器时出现端口被占用的错误,可以使用以下命令查看并终止占用端口的进程:

```bash
# 查看占用端口 3000 的进程
netstat -ano | findstr :3000

# 终止进程(PID 为上一步输出的进程 ID)
taskkill /PID <PID> /F
```

### 2. 本地模型不可用

如果本地模型不可用,请检查:
- Ollama 服务是否正在运行
- 模型是否已经拉取(使用 `ollama list` 查看)
- 模型名称是否正确

### 3. 远程模型调用失败

如果远程模型调用失败,请检查:
- API 密钥是否正确
- 网络连接是否正常
- 模型名称是否正确

## 总结

本项目展示了如何搭建一个完整的 MCP 服务器,以及如何使用 LangChain 构建大模型应用来发现和调用 MCP 工具。通过这个项目,您可以了解:

1. MCP 的基本概念和工作原理
2. 如何定义和实现 MCP 工具
3. 如何使用 LangChain 构建大模型应用
4. 大模型如何自动发现和调用工具
5. 如何支持本地和远程模型

这个项目可以作为一个基础框架,根据实际需求进行扩展和定制。