在 MS-Agent 框架中,Skills 与 MCP(Model Context Protocol)的协同使用 是一种典型的"能力封装 + 执行控制"混合架构设计。这种组合使得大模型智能体既能拥有专业化的知识和工具(通过 Skills),又能高效、安全地调用外部服务或执行底层操作(通过 MCP)。下面将从原理、流程、代码示例三个层面详细说明 MS-Agent 如何通过 Skills 调用 MCP。
一、基本原理:Skills 与 MCP 的角色分工
- Agent Skills 的核心作用是 封装领域知识、工作流规范和可执行脚本,形成标准化的"技能包"。它采用渐进式上下文加载机制(Level 1~4),仅在需要时激活相关资源 。
- MCP(Model Context Protocol) 则是一个 通用的工具调用协议,负责与外部系统(如数据库、API、命令行)交互,执行具体操作 。
简单比喻:
- Skills 是"作战计划书":告诉 AI "要做什么、怎么做、用什么工具"。
- MCP 是"执行部队":实际去调用 SQL、运行 Shell 命令、访问 REST API。
两者结合,实现 "任务理解 → 技能匹配 → 工具调用 → 结果整合" 的完整闭环 。
二、调用流程:Skills 如何触发 MCP
以一个典型场景为例:"分析公司内部谁的话语权最高"。
步骤 1:用户输入触发 Skill 匹配
用户说:"分析公司内部谁的话语权最高。"
→ MS-Agent 的 Retriever 组件 基于语义搜索,在 ./skills 目录下匹配到 mysql-employees-analysis 技能(因其 description 包含"员工关系分析"等关键词)。
步骤 2:加载 Skill 上下文(Level 2~3)
- 加载
SKILL.md全文,理解该技能需执行:- 查询管理汇报关系
- 对比薪资等级
- 统计任职时长
- 同时加载
references/中的 SQL 模板或scripts/中的预处理脚本 。
步骤 3:Skill 内部生成 MCP 调用指令
在 SKILL.md 或 scripts/main.py 中,定义了如何构造 MCP 请求。例如:
python
编辑
# scripts/main.py (伪代码)
def analyze_authority():
mcp_request = {
"tool": "sql_query",
"parameters": {
"query": "SELECT manager_id, COUNT(*) FROM employees GROUP BY manager_id ORDER BY COUNT DESC LIMIT 1"
}
}
return mcp_request
注意:此处
sql_query是一个已注册的 MCP 工具,由 MS-Agent 的 MCP 客户端负责调用 。
步骤 4:MS-Agent 调用 MCP 执行
MS-Agent 框架检测到 Skill 返回的是一个 MCP 工具调用结构,便会:
- 将请求转发给 MCP 服务器(可通过 gRPC、HTTP 或 STDIO 通信);
- MCP 服务器执行 SQL 查询;
- 返回结果(如
{"manager_id": "emp_102", "count": 45})。
步骤 5:Skill 解析结果并生成最终输出
Skill 接收 MCP 返回的数据,结合业务逻辑生成自然语言结论:
"根据汇报关系分析,员工 emp_102 管理 45 名下属,为公司内话语权最高者。"
整个过程实现了 Skills 驱动任务分解,MCP 负责原子操作执行 的协同模式 。
三、代码示例:MS-Agent 中集成 Skills 与 MCP
以下是一个简化版的 MS-Agent 使用示例,展示如何加载 Skills 并支持 MCP 调用:
python
编辑
from ms_agent.agent import create_agent_skill
import os
def main():
work_dir = './temp_workspace'
skills_dir = './skills' # 包含 mysql-employees-analysis 等技能
agent = create_agent_skill(
skills=skills_dir,
model='Qwen/Qwen3-235B-A22B-Instruct-2507',
api_key=os.getenv('OPENAI_API_KEY'),
base_url=os.getenv('OPENAI_BASE_URL'),
stream=True,
use_sandbox=True,
work_dir=work_dir
)
user_query = "分析公司内部谁的话语权最高"
response = agent.run(user_query)
print("结果:", response)
if __name__ == '__main__':
main()
在此配置下:
- 若
./skills/mysql-employees-analysis/SKILL.md中声明了需调用sql_query工具; - 且 MS-Agent 已配置 MCP 服务器地址(如通过环境变量
MCP_SERVER_URL); - 则框架会自动将 Skill 生成的工具调用请求路由至 MCP 服务 。
四、关键优势
- 解耦设计:Skills 专注业务逻辑,MCP 专注执行,便于维护和扩展。
- 按需加载:避免全量上下文占用,提升推理效率 。
- 安全隔离 :通过
ms-enclave沙箱执行脚本,MCP 调用也可设置权限控制 。 - 跨平台复用:Skills 遵循 Anthropic 协议,可在 Cursor、Claude、MS-Agent 等多平台使用 。
总结
在 MS-Agent 中,Skills 并不直接"调用"MCP ,而是通过 生成符合 MCP 协议的工具调用指令,由 Agent 框架将其转发给 MCP 服务执行。这种"Skill 定义意图,MCP 执行动作"的协作模式,是构建复杂、可靠、专业化 AI 智能体的核心范式 。
24篇来源
你这个实例把注册mcp的部分也写一下
Qwen3-Max
好的。要在 MS-Agent 框架中通过 Skills 调用 MCP(Model Context Protocol)工具 ,首先必须 将 MCP 工具注册到 Agent 的运行环境中 。否则即使 Skill 中声明了要调用某个工具(如 sql_query),Agent 也无法找到对应的执行器。
下面我们将完整展示:
- 如何定义一个 MCP 工具(以 SQL 查询为例)
- 如何在 MS-Agent 启动时注册该 MCP 工具
- 如何在 Skill 中引用并触发该工具调用
一、前提:使用 .NET 或 Python?MS-Agent 的 MCP 支持
虽然"MS-Agent"一词在历史语境中可指代旧版 Microsoft Agent(如 Merlin 动画角色),但当前上下文中的 MS-Agent 是指基于大模型的智能体框架 (如 ModelScope 上开源的 ms-agent),其支持通过 MCP 协议集成外部工具 。
而 MCP 工具的注册机制 ,在微软官方生态中主要通过 .NET SDK 或 Python + ModelContextProtocol 库 实现 。由于 MS-Agent(ModelScope 版)底层兼容 MCP 协议,我们采用 Python + MCP Server 模式进行说明。
注:若你使用的是 Microsoft Agent 365 / Copilot Studio 生态,则需通过 Teams 开发者门户配置蓝图和机器人 ID ,但那属于企业级部署,不适用于本地 Skills 调用。此处聚焦 本地开发场景。
二、步骤 1:创建一个 MCP 工具(SQL 查询示例)
我们先定义一个简单的 MCP 工具,用于执行 SQL 查询。
python
编辑
# mcp_tools/sql_tool.py
from modelcontextprotocol.server import McpServerTool
from typing import Dict, Any
import sqlite3
def sql_query_tool(query: str) -> Dict[str, Any]:
"""执行 SQLite 查询并返回结果"""
try:
conn = sqlite3.connect("company.db")
cursor = conn.cursor()
cursor.execute(query)
rows = cursor.fetchall()
columns = [desc[0] for desc in cursor.description]
result = [dict(zip(columns, row)) for row in rows]
conn.close()
return {"status": "success", "data": result}
except Exception as e:
return {"status": "error", "message": str(e)}
# 将函数包装为 MCP 工具
sql_mcp_tool = McpServerTool.create(
name="sql_query",
description="Execute a SQL query on the company database.",
function=sql_query_tool,
parameters={
"type": "object",
"properties": {
"query": {"type": "string", "description": "The SQL SELECT query to execute."}
},
"required": ["query"]
}
)
此处使用了
modelcontextprotocol库(需安装:pip install modelcontextprotocol),它是 MCP 协议的 Python 实现 。
三、步骤 2:在 MS-Agent 启动时注册 MCP 工具
MS-Agent 允许通过扩展机制注入自定义工具。我们需要在启动 Agent 时,将上述 MCP 工具注册进去。
python
编辑
# app_with_mcp.py
import os
from ms_agent.agent import create_agent_skill
from mcp_tools.sql_tool import sql_mcp_tool # 导入自定义工具
def register_custom_tools(agent):
"""向 Agent 注册 MCP 工具"""
# 假设 MS-Agent 支持 add_tool 接口(类似 LangChain)
agent.add_tool(sql_mcp_tool.name, sql_mcp_tool.function)
print(f"✅ Registered MCP tool: {sql_mcp_tool.name}")
def main():
work_dir = './temp_workspace'
skills_dir = './skills' # 包含你的 Skill 目录
# 创建 Agent(使用 Qwen 等大模型)
agent = create_agent_skill(
skills=skills_dir,
model='Qwen/Qwen3-235B-A22B-Instruct-2507',
api_key=os.getenv('OPENAI_API_KEY'),
base_url=os.getenv('OPENAI_BASE_URL'),
stream=True,
use_sandbox=True,
work_dir=work_dir
)
# 关键步骤:注册 MCP 工具
register_custom_tools(agent)
# 用户提问
user_query = "分析公司内部谁管理的下属最多?"
response = agent.run(user_query)
print("最终回答:", response)
if __name__ == '__main__':
main()
⚠️ 注意:
ms-agent官方库是否直接暴露add_tool接口,取决于其版本。若未提供,可通过 重写 Agent 的 tool_executor 或 在 Skill 的脚本中直接调用 MCP 工具函数 绕过。
四、步骤 3:在 Skill 中声明并调用 MCP 工具
在 ./skills/employee-analysis/SKILL.md 中,明确说明需要调用 sql_query 工具:
markdown
编辑
# Skill: Employee Authority Analysis
## Description
分析公司组织架构中谁的话语权最高,基于汇报关系数量。
## Tools Required
- `sql_query`: Execute SQL to count direct reports.
## Workflow
1. Generate SQL:
```sql
SELECT manager_id, COUNT(*) as report_count
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
ORDER BY report_count DESC
LIMIT 1;
- Call
sql_querywith the above query. - Parse result and generate natural language summary.
text
编辑
同时,在 `scripts/main.py` 中实现调用逻辑:
```python
# skills/employee-analysis/scripts/main.py
def run_analysis(tool_executor):
query = """
SELECT manager_id, COUNT(*) as report_count
FROM employees
GROUP BY manager_id
ORDER BY report_count DESC
LIMIT 1
"""
result = tool_executor("sql_query", {"query": query})
if result["status"] == "success":
top_manager = result["data"][0]["manager_id"]
return f"话语权最高的员工是 {top_manager},管理 {result['data'][0]['report_count']} 名下属。"
else:
return "查询失败:" + result["message"]
此处
tool_executor由 MS-Agent 在运行 Skill 时注入,指向已注册的 MCP 工具函数。
五、总结:完整调用链
- 定义 MCP 工具 →
sql_query_tool - 注册到 Agent →
agent.add_tool("sql_query", sql_query_tool) - Skill 声明依赖 →
SKILL.md中列出所需工具 - Skill 脚本调用 →
tool_executor("sql_query", params) - Agent 执行并返回结果
这样,MS-Agent 的 Skills 就能安全、高效地调用 MCP 工具,实现数据库查询、文件操作、API 调用等能力 。
💡 提示:若你使用的是 Microsoft Agent 365 企业版,则需通过 Azure MCP Server 预配和权限授权 ,但本地开发推荐上述轻量级方式