本文将以“在 App 中集成 MCP 协议并自定义 AI 工具调用”为主题,介绍如何使用 MCP(Model Context Protocol)协议,将用户的自然语言请求自动解析为工具函数调用,并通过远程大模型(如 DeepSeek 或 ChatGPT)完成智能化响应。
什么是 MCP(Model Context Protocol)?
MCP 是一种让大语言模型具备“结构化调用外部工具能力”的协议。它允许你定义工具(函数)并将其结构化描述注入模型上下文中,当模型理解用户意图后即可自动生成调用参数,执行工具逻辑并返回结果。
步骤
- 在 iOS App 中集成 MCP SwiftSDK(Android Kotlin版本)
- 自定义工具,如天气查询
getWeather(city: String)
- 用户自然语言如“查一下北京天气” → 自动匹配工具并解析参数
- 最终调用远程模型(DeepSeek 或 ChatGPT)完成推理响应
工具调用流程简图
1 2 3 4 5 6
| 用户输入 -> MCP SDK 发送请求 -> MCP Server 构造 prompt -> 调用远程 LLM(如 DeepSeek) -> 模型生成 Tool 调用结构体 -> App 执行工具方法(如查询天气) -> 返回结果渲染给用户
|
工程结构 & 架构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| +-----------------------------+ | Swift App (MCP SDK) | | +------------------------+ | | | getWeatherTool() | | | +------------------------+ | | | | | MCP 协议 & Context | +-------------|---------------+ v +-----------------------------+ | MCP Server (Node.js) | | -> 提供工具 JSON Schema | | -> 构造上下文 Prompt | | -> 调用 DeepSeek 或 ChatGPT | +-------------|---------------+ v +-----------------------------+ | 远程大模型服务 | | (ChatGPT / DeepSeek / etc)| +-----------------------------+
|
在服务端创建 MCP servers
可直接使用官网服务项目:https://github.com/modelcontextprotocol/servers。
快速启动方式(Node.js 环境):
1 2 3 4 5
| git clone https://github.com/modelcontextprotocol/server cd server cp .env.example .env npm install npm run dev
|
然后编辑 config.ts 配置你的模型服务商(如 DeepSeek、OpenAI或本地olloma部署):
1 2 3 4 5 6 7
| export const config = { completion: { provider: 'openai', apiKey: '你的 API KEY', apiBaseUrl: 'https://api.deepseek.com/v1' } }
|
Swift 中定义工具
使用 Swift SDK 定义一个工具,如 getWeather
:
1 2 3 4 5 6 7 8 9 10 11 12 13
| struct GetWeatherTool: Tool { static var name: String = "getWeather" static var description: String = "获取某个城市的天气"
struct Input: Codable { let city: String }
func call(input: Input) async throws -> String { return "\(input.city) 今天多云,气温 25°C。" } }
|
App调用MCP SDK发送请求
1 2 3 4 5 6 7 8 9 10 11
| let context = Context() context.addTool(GetWeatherTool())
let connection = try await SSEConnection(url: URL(string: "https://yourdomain.com/mcp")!) let client = try await Client(connection: connection)
let request = Request(messages: [.user("查一下杭州的天气")])
for try await output in try await client.generate(request: request, context: context) { print(output.content) }
|
模型如何自动识别工具和参数?
MCP 会将工具结构描述转换为 JSON Schema,注入上下文,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13
| { "name": "getWeather", "description": "获取某个城市的天气", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "要查询天气的城市" } } } }
|
这里可能大家有疑问,比如用户说:“请帮我查一下北京的天气”,模型怎么知道去调用 GetWeatherTool
类呢?
首先我们在 GetWeatherTool
中的定义一定要尽可能明确,比如:
1 2
| static var name: String = "getWeather" static var description: String = "获取某个城市的天气"
|
大语言模型通过语义理解,分析:
- 动作是:查天气 → 匹配到工具 getWeather
- 城市是:“北京” → 匹配到 city 参数
就能推断出:
1 2 3 4 5 6
| { "tool_name": "getWeather", "parameters": { "city": "北京" } }
|
App 适用场景
- 构建具备“智能操作能力”的 AI 助理
- 模型驱动的业务自动化(如搜索、下单等业务场景)
- 工具响应可插拔、可扩展
- 模型自动“理解 + 调用 + 返回”全链路闭环